On Fri, Jun 20, 2014 at 02:41:13PM +0800, bardliao@realtek.com wrote:
From: Bard Liao bardliao@realtek.com
This patch adds Realtek ALC286 codec driver.
I've applied this but there are small number of remaining issues which should be fixed - please send followup patches for them.
+static int rt286_probe(struct snd_soc_codec *codec) +{
- struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
- int i, ret;
- ret = snd_soc_read(codec,
RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID));
- if (ret != RT286_VENDOR_ID) {
dev_err(codec->dev,
"Device with ID register %x is not rt286\n", ret);
return -ENODEV;
- }
Most of this probe function doesn't depend on ASoC at all and so should be done at the I2C level probe not here - that way errors are detected earlier and the device is initialised even if the sound card as a whole isn't ready yet.
- if (!rt286->pdata.cbj_en) {
snd_soc_write(codec, RT286_CBJ_CTRL2, 0x0000);
snd_soc_write(codec, RT286_MIC1_DET_CTRL, 0x0816);
snd_soc_write(codec, RT286_MISC_CTRL1, 0x0000);
snd_soc_update_bits(codec,
RT286_CBJ_CTRL1, 0xf000, 0xb000);
- } else {
snd_soc_update_bits(codec,
RT286_CBJ_CTRL1, 0xf000, 0x5000);
- }
- mdelay(10);
I notice that the resume doesn't have these delays in it - is that not a problem if the device lost power over suspend?
- rt286->i2c->irq = 0;
- if (rt286->i2c->irq) {
The assignment looks like some test code which was left in by mistake.
ret = request_threaded_irq(rt286->i2c->irq, NULL, rt286_irq,
IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "rt286", rt286);
if (ret != 0) {
This is only released in the I2C level remove() (the the fix should be to move the request to the I2C level probe()).