Hi Mark, Please, see the comments below. > >> +static int davinci_vc_client_dev_register(struct davinci_vc *davinci_vc, >> + const char *name, >> + struct platform_device **pdev) >> +{ >> + int ret; >> + >> + *pdev = platform_device_alloc(name, -1); >> + if (pdev == NULL) { >> + dev_err(davinci_vc->dev, "failed to allocate %s\n", name); >> + return -ENODEV; >> + } >> + >> + (*pdev)->dev.parent = davinci_vc->dev; >> + platform_set_drvdata(*pdev, davinci_vc); > > Newer drivers are tending to do this by looking at dev->parent in the > child device rather than using the Can you tell me what is driver that is using this new tend? Is this a wrong way to register the clients? > >> + ret = platform_device_add(*pdev); >> + if (ret != 0) { >> + dev_err(davinci_vc->dev, "failed to register %s: %d\n", name, >> + ret); >> + platform_device_put(*pdev); >> + *pdev = NULL; >> + return ret; >> + } >> + >> + return 0; >> +} >> + >> --- /dev/null >> +++ b/sound/soc/codecs/cq93vc.c >> @@ -0,0 +1,342 @@ >> +/* >> + * ALSA SoC CQ0093 Voice Codec Driver for DaVinci platforms >> + * >> + * Copyright (C) 2010 Texas Instruments, Inc >> + * >> + * Author: Miguel Aguilar <miguel.aguilar@xxxxxxxxxxxx> >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License as published by >> + * the Free Software Foundation; either version 2 of the License, or >> + * (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program; if not, write to the Free Software >> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >> + */ >> +#include <linux/module.h> >> +#include <linux/moduleparam.h> >> +#include <linux/init.h> >> +#include <linux/io.h> >> +#include <linux/delay.h> >> +#include <linux/pm.h> >> +#include <linux/i2c.h> > > Not needed. What headers are not needed? > >> +#include <linux/platform_device.h> >> +#include <linux/device.h> >> +#include <linux/clk.h> >> +#include <linux/mfd/davinci_voicecodec.h> >> + >> +#include <sound/core.h> >> +#include <sound/pcm.h> >> +#include <sound/pcm_params.h> >> +#include <sound/soc.h> >> +#include <sound/soc-dai.h> >> +#include <sound/soc-dapm.h> >> +#include <sound/initval.h> >> + >> +#include <mach/dm365.h> >> + >> +#include "cq93vc.h" >> + >> + >> +static int cq93vc_add_controls(struct snd_soc_codec *codec) >> +{ >> + int err, i; >> + >> + for (i = 0; i < ARRAY_SIZE(cq93vc_snd_controls); i++) { >> + err = snd_ctl_add(codec->card, >> + snd_soc_cnew(&cq93vc_snd_controls[i], >> + codec, NULL)); >> + if (err < 0) >> + return err; >> + } > > This is snd_soc_add_controls(). So I can call directly snd_soc_add_controls instead of using the function above? >> + >> +static int cq93vc_suspend(struct platform_device *pdev, pm_message_t state) >> +{ >> + struct snd_soc_device *socdev = platform_get_drvdata(pdev); >> + struct snd_soc_codec *codec = socdev->card->codec; >> + >> + cq93vc_set_bias_level(codec, SND_SOC_BIAS_OFF); >> + >> + return 0; >> +} >> + >> +static int cq93vc_resume(struct platform_device *pdev) >> +{ >> + struct snd_soc_device *socdev = platform_get_drvdata(pdev); >> + struct snd_soc_codec *codec = socdev->card->codec; >> + >> + cq93vc_set_bias_level(codec, codec->suspend_bias_level); >> + >> + return 0; >> +} > > These are actually mostly redundant with this hardware - the core will > bring the driver down to _STANDBY before suspending the driver and your > _STANDBY and _OFF states are equivalent. This means that both functions > should end up being noops. On the other hand they do no harm. > This means that I can get rid of the function suspend? >> +static int cq93vc_probe(struct platform_device *pdev) >> +{ >> + struct snd_soc_device *socdev = platform_get_drvdata(pdev); >> + struct device *dev = &pdev->dev; >> + struct snd_soc_codec *codec; >> + int ret; >> + >> + socdev->card->codec = cq93vc_codec; >> + codec = socdev->card->codec; >> + >> + /* Set the PGA Gain to 18 dB */ >> + cq93vc_write(codec, DAVINCI_VC_REG05, DAVINCI_VC_REG05_PGA_GAIN); >> + >> + /* Set the DAC digital attenuation to 0 dB */ >> + cq93vc_write(codec, DAVINCI_VC_REG09, DAVINCI_VC_REG09_DIG_ATTEN); > > The standard thing for things like this is to leave the defaults in the > driver as whatever the hardware default is then let either the machine > driver or (better) userspace override it. This avoids issues with > defaults being good for one system and not another. So, Should I remove the values that I seeting above, and let the hardware use its default values? > >> + >> +#ifdef CONFIG_PM >> +static int cq93vc_codec_suspend(struct platform_device *pdev, pm_message_t m) >> +{ >> + return snd_soc_suspend_device(&pdev->dev); >> +} >> + >> +static int cq93vc_codec_resume(struct platform_device *pdev) >> +{ >> + return snd_soc_resume_device(&pdev->dev); >> +} >> +#else >> +#define cq93vc_codec_suspend NULL >> +#define cq93vc_codec_resume NULL >> +#endif > > This has been removed in favour of relying on more generic kernel > mechanisms (hopefully).\ What was exactly removed here the NULL version of the functions or the functions itself. Thanks, Miguel Aguilar _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel