Skip to content

Commit

Permalink
ALSA: make the CS4270 driver a new-style I2C driver
Browse files Browse the repository at this point in the history
Update the CS4270 ALSA device driver to use the new-style I2C interface.
Starting with the 2.6.27 PowerPC kernel, I2C devices that have entries in the
device trees can no longer be probed by old-style I2C drivers.  The device
tree for Freescale MPC8610 HPCD has included an entry for the CS4270 since
2.6.25, but that entry was previously ignored by the PowerPC I2C subsystem.
Since that's no longer the case, the best solution is to update the CS4270
driver to a new-style interface, rather than try to revert the behavior of
new PowerPC I2C subsystem.

Signed-off-by: Timur Tabi <timur@freescale.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Timur Tabi authored and tiwai committed Sep 29, 2008
1 parent 24e8fc4 commit ec2cd95
Showing 1 changed file with 15 additions and 56 deletions.
71 changes: 15 additions & 56 deletions sound/soc/codecs/cs4270.c
Expand Up @@ -490,49 +490,27 @@ static int cs4270_mute(struct snd_soc_dai *dai, int mute)

#endif

static int cs4270_i2c_probe(struct i2c_adapter *adap, int addr, int kind);

/*
* 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;
}
static int cs4270_i2c_probe(struct i2c_client *, const struct i2c_device_id *);

/* A list of non-DAPM controls that the CS4270 supports */
static const struct snd_kcontrol_new cs4270_snd_controls[] = {
SOC_DOUBLE_R("Master Playback Volume",
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 = {
.driver = {
.name = "CS4270 I2C",
.owner = THIS_MODULE,
},
.id = I2C_DRIVERID_CS4270,
.attach_adapter = cs4270_i2c_attach,
.detach_client = cs4270_i2c_detach,
.id_table = cs4270_id,
.probe = cs4270_i2c_probe,
};

/*
Expand Down Expand Up @@ -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,
* 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_codec *codec = socdev->codec;
struct i2c_client *i2c_client = NULL;
int i;
int ret = 0;

Expand All @@ -578,26 +556,13 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)

/* 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);
if (!codec->reg_cache) {
printk(KERN_ERR "cs4270: could not allocate register cache\n");
ret = -ENOMEM;
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 */

ret = i2c_smbus_read_byte_data(i2c_client, CS4270_CHIPID);
Expand All @@ -612,18 +577,10 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)
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);

/* 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->read = cs4270_read_reg_cache;
codec->write = cs4270_i2c_write;
Expand All @@ -648,6 +605,8 @@ static int cs4270_i2c_probe(struct i2c_adapter *adapter, int addr, int kind)
goto error;
}

i2c_set_clientdata(i2c_client, codec);

return 0;

error:
Expand Down

0 comments on commit ec2cd95

Please sign in to comment.