At Wed, 15 Oct 2008 19:57:12 +0200, Jean Delvare wrote: > > Convert the wm8580 codec driver to the new (standard) device driver > binding model. > > Signed-off-by: Jean Delvare <khali@xxxxxxxxxxxx> > Cc: Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx> Thanks, both patches are applied to topic/asoc-next branch now. This won't appear in linux-next yet until rc1 or rc2. Takashi > --- > Untested, no hardware. > > sound/soc/codecs/wm8580.c | 108 ++++++++++++++++++++++----------------------- > sound/soc/codecs/wm8580.h | 1 > 2 files changed, 54 insertions(+), 55 deletions(-) > > --- linux-2.6.28-rc0.orig/sound/soc/codecs/wm8580.c 2008-10-15 15:14:34.000000000 +0200 > +++ linux-2.6.28-rc0/sound/soc/codecs/wm8580.c 2008-10-15 17:26:13.000000000 +0200 > @@ -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 platform > snd_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); > --- linux-2.6.28-rc0.orig/sound/soc/codecs/wm8580.h 2008-10-15 15:14:34.000000000 +0200 > +++ linux-2.6.28-rc0/sound/soc/codecs/wm8580.h 2008-10-15 17:51:18.000000000 +0200 > @@ -29,6 +29,7 @@ > #define WM8580_CLKSRC_NONE 5 > > struct wm8580_setup_data { > + int i2c_bus; > unsigned short i2c_address; > }; > > > > -- > Jean Delvare > _______________________________________________ > Alsa-devel mailing list > Alsa-devel@xxxxxxxxxxxxxxxx > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel