Commit 66120005 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: ASoC: Fix another cs4270 error path
  ALSA: make the CS4270 driver a new-style I2C driver
parents 0d0f3ef2 9778e9a0
...@@ -490,34 +490,7 @@ static int cs4270_mute(struct snd_soc_dai *dai, int mute) ...@@ -490,34 +490,7 @@ static int cs4270_mute(struct snd_soc_dai *dai, int mute)
#endif #endif
static int cs4270_i2c_probe(struct i2c_adapter *adap, int addr, int kind); static int cs4270_i2c_probe(struct i2c_client *, const struct i2c_device_id *);
/*
* Notify the driver that a new I2C bus has been found.
*
* This function is called for each I2C bus in the system. The function
* then asks the I2C subsystem to probe that bus at the addresses on which
* our device (the CS4270) could exist. If a device is found at one of
* those addresses, then our probe function (cs4270_i2c_probe) is called.
*/
static int cs4270_i2c_attach(struct i2c_adapter *adapter)
{
return i2c_probe(adapter, &addr_data, cs4270_i2c_probe);
}
static int cs4270_i2c_detach(struct i2c_client *client)
{
struct snd_soc_codec *codec = i2c_get_clientdata(client);
i2c_detach_client(client);
codec->control_data = NULL;
kfree(codec->reg_cache);
codec->reg_cache = NULL;
kfree(client);
return 0;
}
/* A list of non-DAPM controls that the CS4270 supports */ /* A list of non-DAPM controls that the CS4270 supports */
static const struct snd_kcontrol_new cs4270_snd_controls[] = { static const struct snd_kcontrol_new cs4270_snd_controls[] = {
...@@ -525,14 +498,19 @@ static const struct snd_kcontrol_new cs4270_snd_controls[] = { ...@@ -525,14 +498,19 @@ static const struct snd_kcontrol_new cs4270_snd_controls[] = {
CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 1) CS4270_VOLA, CS4270_VOLB, 0, 0xFF, 1)
}; };
static const struct i2c_device_id cs4270_id[] = {
{"cs4270", 0},
{}
};
MODULE_DEVICE_TABLE(i2c, cs4270_id);
static struct i2c_driver cs4270_i2c_driver = { static struct i2c_driver cs4270_i2c_driver = {
.driver = { .driver = {
.name = "CS4270 I2C", .name = "CS4270 I2C",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.id = I2C_DRIVERID_CS4270, .id_table = cs4270_id,
.attach_adapter = cs4270_i2c_attach, .probe = cs4270_i2c_probe,
.detach_client = cs4270_i2c_detach,
}; };
/* /*
...@@ -561,11 +539,11 @@ static struct snd_soc_device *cs4270_socdev; ...@@ -561,11 +539,11 @@ static struct snd_soc_device *cs4270_socdev;
* Note: snd_soc_new_pcms() must be called before this function can be called, * Note: snd_soc_new_pcms() must be called before this function can be called,
* because of snd_ctl_add(). * because of snd_ctl_add().
*/ */
static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind) static int cs4270_i2c_probe(struct i2c_client *i2c_client,
const struct i2c_device_id *id)
{ {
struct snd_soc_device *socdev = cs4270_socdev; struct snd_soc_device *socdev = cs4270_socdev;
struct snd_soc_codec *codec = socdev->codec; struct snd_soc_codec *codec = socdev->codec;
struct i2c_client *i2c_client = NULL;
int i; int i;
int ret = 0; int ret = 0;
...@@ -578,12 +556,6 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind) ...@@ -578,12 +556,6 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)
/* Note: codec_dai->codec is NULL here */ /* Note: codec_dai->codec is NULL here */
i2c_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
if (!i2c_client) {
printk(KERN_ERR "cs4270: could not allocate I2C client\n");
return -ENOMEM;
}
codec->reg_cache = kzalloc(CS4270_NUMREGS, GFP_KERNEL); codec->reg_cache = kzalloc(CS4270_NUMREGS, GFP_KERNEL);
if (!codec->reg_cache) { if (!codec->reg_cache) {
printk(KERN_ERR "cs4270: could not allocate register cache\n"); printk(KERN_ERR "cs4270: could not allocate register cache\n");
...@@ -591,13 +563,6 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind) ...@@ -591,13 +563,6 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)
goto error; goto error;
} }
i2c_set_clientdata(i2c_client, codec);
strcpy(i2c_client->name, "CS4270");
i2c_client->driver = &cs4270_i2c_driver;
i2c_client->adapter = adapter;
i2c_client->addr = addr;
/* Verify that we have a CS4270 */ /* Verify that we have a CS4270 */
ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID); ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID);
...@@ -612,18 +577,10 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind) ...@@ -612,18 +577,10 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)
goto error; goto error;
} }
printk(KERN_INFO "cs4270: found device at I2C address %X\n", addr); printk(KERN_INFO "cs4270: found device at I2C address %X\n",
i2c_client->addr);
printk(KERN_INFO "cs4270: hardware revision %X\n", ret & 0xF); printk(KERN_INFO "cs4270: hardware revision %X\n", ret & 0xF);
/* Tell the I2C layer a new client has arrived */
ret = i2c_attach_client(i2c_client);
if (ret) {
printk(KERN_ERR "cs4270: could not attach codec, "
"I2C address %x, error code %i\n", addr, ret);
goto error;
}
codec->control_data = i2c_client; codec->control_data = i2c_client;
codec->read = cs4270_read_reg_cache; codec->read = cs4270_read_reg_cache;
codec->write = cs4270_i2c_write; codec->write = cs4270_i2c_write;
...@@ -648,20 +605,17 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind) ...@@ -648,20 +605,17 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)
goto error; goto error;
} }
i2c_set_clientdata(i2c_client, codec);
return 0; return 0;
error: error:
if (codec->control_data) { codec->control_data = NULL;
i2c_detach_client(i2c_client);
codec->control_data = NULL;
}
kfree(codec->reg_cache); kfree(codec->reg_cache);
codec->reg_cache = NULL; codec->reg_cache = NULL;
codec->reg_cache_size = 0; codec->reg_cache_size = 0;
kfree(i2c_client);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment