ASoC: Convert wm8580 to a new-style i2c driver
Subsystems (3)
PATCH 1/1 ASoC: Convert wm8580 to a new-style i2c driver
Convert the wm8580 codec driver to the new (standard) device driver binding model.
Signed-off-by Jean Delvare <[email protected]>
Cc Mark Brown <[email protected]>
---
Untested, no hardware.
sound/soc/codecs/wm8580.c | 108 ++++++++++++++++++++++----------------------- sound/soc/codecs/wm8580.h | 1 2 files changed, 54 insertions(+), 55 deletions(-)
sound/soc/codecs/wm8580.c +53 -55
@@ -900,85 +900,85 @@ static struct snd_soc_device *wm8580_soc* low = 0x1a * high = 0x1b */ -static unsigned short normal_i2c[] = {0 ,I2C_CLIENT_END }; -/* Magic definition of all other variables and things */ -I2C_CLIENT_INSMOD ; - -static struct i2c_driver wm8580_i2c_driver; -static struct i2c_client client_template; - -static int wm8580_codec_probe (struct i2c_adapter *adap,int addr,int kind) +static int wm8580_i2c_probe (struct i2c_client *i2c, +const struct i2c_device_id *id) {struct snd_soc_device *socdev = wm8580_socdev; -struct wm8580_setup_data *setup = socdev->codec_data;struct snd_soc_codec *codec = socdev->codec; -struct i2c_client *i2c;int ret; -if (addr != setup->i2c_address) -return -ENODEV ; - - client_template.adapter = adap; - client_template.addr = addr; - - i2c =kmemdup (&client_template,sizeof (client_template),GFP_KERNEL ); -if (i2c ==NULL ) { -kfree (codec); -return -ENOMEM ; - }i2c_set_clientdata (i2c, codec); codec->control_data = i2c; - ret =i2c_attach_client (i2c); -if (ret <0 ) { -dev_err (&i2c->dev,"failed to attach codec at addr %x\n" , addr); - goto err; - } - ret =wm8580_init (socdev); -if (ret <0 ) { +if (ret <0 )dev_err (&i2c->dev,"failed to initialise WM8580\n" ); - goto err; - } - -return ret; - -err: -kfree (codec); -kfree (i2c);return ret; } -static int wm8580_i2c_detach (struct i2c_client *client) +static int wm8580_i2c_remove (struct i2c_client *client) {struct snd_soc_codec *codec =i2c_get_clientdata (client); -i2c_detach_client (client);kfree (codec->reg_cache); -kfree (client);return 0 ; } -static int wm8580_i2c_attach (struct i2c_adapter *adap) -{ -return i2c_probe (adap, &addr_data, wm8580_codec_probe); -} +static const struct i2c_device_id wm8580_i2c_id[] = { + {"wm8580" ,0 }, + { } +}; +MODULE_DEVICE_TABLE (i2c, wm8580_i2c_id); -/* corgi i2c codec control layer */ static struct i2c_driver wm8580_i2c_driver = { .driver = { .name ="WM8580 I2C Codec" , .owner =THIS_MODULE , }, - .attach_adapter = wm8580_i2c_attach, - .detach_client = wm8580_i2c_detach, - .command =NULL , + .probe = wm8580_i2c_probe, + .remove = wm8580_i2c_remove, + .id_table = wm8580_i2c_id, }; -static struct i2c_client client_template = { - .name ="WM8580" , - .driver = &wm8580_i2c_driver, -}; +static int wm8580_add_i2c_device (struct platform_device *pdev, +const struct wm8580_setup_data *setup) +{ +struct i2c_board_info info; +struct i2c_adapter *adapter; +struct i2c_client *client; +int ret; + + ret =i2c_add_driver (&wm8580_i2c_driver); +if (ret !=0 ) { +dev_err (&pdev->dev,"can't add i2c driver\n" ); +return ret; + } + +memset (&info,0 ,sizeof (struct i2c_board_info )); + info.addr = setup->i2c_address; +strlcpy (info.type,"wm8580" ,I2C_NAME_SIZE ); + + adapter =i2c_get_adapter (setup->i2c_bus); +if (!adapter) { +dev_err (&pdev->dev,"can't get i2c adapter %d\n" , + setup->i2c_bus); + goto err_driver; + } + + client =i2c_new_device (adapter, &info); +i2c_put_adapter (adapter); +if (!client) { +dev_err (&pdev->dev,"can't add i2c device at 0x%x\n" , + (unsigned int )info.addr); + goto err_driver; + } + +return 0 ; + +err_driver: +i2c_del_driver (&wm8580_i2c_driver); +return -ENODEV ; +}#endif static int wm8580_probe (struct platform_device *pdev)
@@ -1011,11 +1011,8 @@ static int wm8580_probe(struct platform_#if defined(CONFIG_I2C ) || defined(CONFIG_I2C_MODULE )if (setup->i2c_address) { - normal_i2c[0 ] = setup->i2c_address; codec->hw_write = (hw_write_t )i2c_master_send; - ret =i2c_add_driver (&wm8580_i2c_driver); -if (ret !=0 ) -printk (KERN_ERR "can't add i2c driver" ); + ret =wm8580_add_i2c_device (pdev, setup); }#else /* Add other interfaces here */
@@ -1034,6 +1031,7 @@ static int wm8580_remove(struct platformsnd_soc_free_pcms (socdev);snd_soc_dapm_free (socdev);#if defined(CONFIG_I2C ) || defined(CONFIG_I2C_MODULE ) +i2c_unregister_device (codec->control_data);i2c_del_driver (&wm8580_i2c_driver);#endif kfree (codec->private_data);
sound/soc/codecs/wm8580.h +1 -0
@@ -29,6 +29,7 @@#define WM8580_CLKSRC_NONE 5struct wm8580_setup_data { +int i2c_bus;unsigned short i2c_address; };
Signature · 1 line
Jean Delvare
Quoted 5 lines · Jean Delvare
Convert the wm8580 codec driver to the new (standard) device driver binding model.
Signed-off-by Jean Delvare <[email protected]>Cc Mark Brown <[email protected]>
Acked-by Mark Brown <[email protected]>
At Wed, 15 Oct 2008 19:57:12 +0200,
Quoted 6 lines · Jean Delvare
Convert the wm8580 codec driver to the new (standard) device driver binding model.
Signed-off-by Jean Delvare <[email protected]>Cc Mark Brown <[email protected]>
Thanks, both patches are applied to topic/asoc-next branch now. This won't appear in linux-next yet until rc1 or rc2.
Takashi
Quoted 186 lines
---
Untested, no hardware.sound/soc/codecs/wm8580.c | 108 ++++++++++++++++++++++----------------------- sound/soc/codecs/wm8580.h | 1 2 files changed, 54 insertions(+), 55 deletions(-)sound/soc/codecs/wm8580.c +53
-55@@ -900,85 +900,85 @@ static struct snd_soc_device *wm8580_soc* low = 0x1a * high = 0x1b */ -static unsigned short normal_i2c[] = {0 ,I2C_CLIENT_END }; -/* Magic definition of all other variables and things */ -I2C_CLIENT_INSMOD ; - -static struct i2c_driver wm8580_i2c_driver; -static struct i2c_client client_template; - -static int wm8580_codec_probe (struct i2c_adapter *adap,int addr,int kind) +static int wm8580_i2c_probe (struct i2c_client *i2c, +const struct i2c_device_id *id) {struct snd_soc_device *socdev = wm8580_socdev; -struct wm8580_setup_data *setup = socdev->codec_data;struct snd_soc_codec *codec = socdev->codec; -struct i2c_client *i2c;int ret; -if (addr != setup->i2c_address) -return -ENODEV ; - - client_template.adapter = adap; - client_template.addr = addr; - - i2c =kmemdup (&client_template,sizeof (client_template),GFP_KERNEL ); -if (i2c ==NULL ) { -kfree (codec); -return -ENOMEM ; - }i2c_set_clientdata (i2c, codec); codec->control_data = i2c; - ret =i2c_attach_client (i2c); -if (ret <0 ) { -dev_err (&i2c->dev,"failed to attach codec at addr %x\n" , addr); - goto err; - } - ret =wm8580_init (socdev); -if (ret <0 ) { +if (ret <0 )dev_err (&i2c->dev,"failed to initialise WM8580\n" ); - goto err; - } - -return ret; - -err: -kfree (codec); -kfree (i2c);return ret; } -static int wm8580_i2c_detach (struct i2c_client *client) +static int wm8580_i2c_remove (struct i2c_client *client) {struct snd_soc_codec *codec =i2c_get_clientdata (client); -i2c_detach_client (client);kfree (codec->reg_cache); -kfree (client);return 0 ; } -static int wm8580_i2c_attach (struct i2c_adapter *adap) -{ -return i2c_probe (adap, &addr_data, wm8580_codec_probe); -} +static const struct i2c_device_id wm8580_i2c_id[] = { + {"wm8580" ,0 }, + { } +}; +MODULE_DEVICE_TABLE (i2c, wm8580_i2c_id); -/* corgi i2c codec control layer */ static struct i2c_driver wm8580_i2c_driver = { .driver = { .name ="WM8580 I2C Codec" , .owner =THIS_MODULE , }, - .attach_adapter = wm8580_i2c_attach, - .detach_client = wm8580_i2c_detach, - .command =NULL , + .probe = wm8580_i2c_probe, + .remove = wm8580_i2c_remove, + .id_table = wm8580_i2c_id, }; -static struct i2c_client client_template = { - .name ="WM8580" , - .driver = &wm8580_i2c_driver, -}; +static int wm8580_add_i2c_device (struct platform_device *pdev, +const struct wm8580_setup_data *setup) +{ +struct i2c_board_info info; +struct i2c_adapter *adapter; +struct i2c_client *client; +int ret; + + ret =i2c_add_driver (&wm8580_i2c_driver); +if (ret !=0 ) { +dev_err (&pdev->dev,"can't add i2c driver\n" ); +return ret; + } + +memset (&info,0 ,sizeof (struct i2c_board_info )); + info.addr = setup->i2c_address; +strlcpy (info.type,"wm8580" ,I2C_NAME_SIZE ); + + adapter =i2c_get_adapter (setup->i2c_bus); +if (!adapter) { +dev_err (&pdev->dev,"can't get i2c adapter %d\n" , + setup->i2c_bus); + goto err_driver; + } + + client =i2c_new_device (adapter, &info); +i2c_put_adapter (adapter); +if (!client) { +dev_err (&pdev->dev,"can't add i2c device at 0x%x\n" , + (unsigned int )info.addr); + goto err_driver; + } + +return 0 ; + +err_driver: +i2c_del_driver (&wm8580_i2c_driver); +return -ENODEV ; +}#endif static int wm8580_probe (struct platform_device *pdev)@@ -1011,11 +1011,8 @@ static int wm8580_probe(struct platform_#if defined(CONFIG_I2C ) || defined(CONFIG_I2C_MODULE )if (setup->i2c_address) { - normal_i2c[0 ] = setup->i2c_address; codec->hw_write = (hw_write_t )i2c_master_send; - ret =i2c_add_driver (&wm8580_i2c_driver); -if (ret !=0 ) -printk (KERN_ERR "can't add i2c driver" ); + ret =wm8580_add_i2c_device (pdev, setup); }#else /* Add other interfaces here */ @@ -1034,6 +1031,7 @@ static int wm8580_remove(struct platformsnd_soc_free_pcms (socdev);snd_soc_dapm_free (socdev);#if defined(CONFIG_I2C ) || defined(CONFIG_I2C_MODULE ) +i2c_unregister_device (codec->control_data);i2c_del_driver (&wm8580_i2c_driver);#endif kfree (codec->private_data);sound/soc/codecs/wm8580.h +1
-0@@ -29,6 +29,7 @@#define WM8580_CLKSRC_NONE 5struct wm8580_setup_data { +int i2c_bus;unsigned short i2c_address; };Signature · 6 lines
-- Jean Delvare _______________________________________________ Alsa-devel mailing list [email protected] http://mailman.alsa-project.org/mailman/listinfo/alsa-devel