[alsa-devel] [RFC 3/5] ASoC: Add GPIO based jack device

Dylan Reid dgreid at chromium.org
Tue May 26 08:20:50 CEST 2015


On Mon, May 25, 2015 at 5:11 AM, Mark Brown <broonie at kernel.org> wrote:
> On Fri, May 22, 2015 at 03:09:21PM -0700, Dylan Reid wrote:
>
>> Add a jack device that allows for separate headphone and mic detect
>> GPIOs.  This device will be used as an aux device and will registered
>> the jack with the card at init time.
>
> This looks basically fine, a couple of things below but they're
> nitpicks.

Thanks for taking a look Mark, and thanks for catching those things.
I'll send an updated version of just this patch on top of your
topic/gpio-jack branch tomorrow morning pacific time.

>
>> +- gpio-audio-jack,debounce-times     : Debounce time for each sw-det-gpio
>> +                                       entry.
>
> specified in...?

That is important info, added.

>
>> +config SND_SOC_GPIO_AUDIO_JACK
>> +        tristate "GPIO based audio jack detection"
>> +
>
> This should surely depend on GPIOLIB || COMPILE_TEST.

indeed, added.

>
>> +     gpio_names = devm_kzalloc(dev, sizeof(*gpio_names) * priv->gpio_count,
>> +                               GFP_KERNEL);
>
> We have devm_kcalloc() (not that it makes a huge difference but may as
> well be clear about the intent).

Good call, done.

>
>> +     if (!gpio_names)
>> +             return -ENOMEM;
>> +     gpio_report = devm_kzalloc(dev, sizeof(*gpio_report) * priv->gpio_count,
>> +                                GFP_KERNEL);
>
> Blank lines between blocks please.

Added.

>
>> +     snd_soc_card_jack_new(component->card, jack_name, report_mask,
>> +                           &priv->jack, NULL, 0);
>
> Ignoring the return value here (not likely to fail but...).

handled.

>
>> +static void gpio_audio_component_remove(struct snd_soc_component *component)
>> +{
>> +     struct gpio_audio_jack *priv = container_of(component->driver,
>> +                     struct gpio_audio_jack, component_drv);
>> +     int i;
>> +
>> +     for (i = 0; i < priv->gpio_count; i++) {
>> +             if (!IS_ERR(priv->gpios[i].desc))
>> +                     gpiod_put(priv->gpios[i].desc);
>> +     }
>
> I would have expected us to be acquiring and releasing the GPIOs in the
> platform device probe, not in the ASoC level probe - that way we handle
> deferred probe better.

That does work better, I moved all the gpio get/put to the device probe. Thanks.

>
>> +static int gpio_audio_jack_probe(struct platform_device *pdev)
>> +{
>> +     struct gpio_audio_jack *priv;
>> +
>> +     priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
>> +     if (!priv)
>> +             return -ENOMEM;
>> +
>> +     dev_set_drvdata(&pdev->dev, priv);
>> +
>> +     priv->component_drv.probe = gpio_audio_component_probe;
>> +     priv->component_drv.remove = gpio_audio_component_remove;
>> +
>> +     return devm_snd_soc_register_component(&pdev->dev, &priv->component_drv,
>> +                                            NULL, 0);
>
> Why do we allocate a component driver structure per device?

I'm not sure how that happened.  I'll fix it =)

>
>> +static const struct of_device_id gpio_audio_of_match[] = {
>> +     { .compatible = "gpio-audio-jack", },
>
> linux,gpio-audio-jack possibly.  Not entirely sure what the current best
> practice is on that.

Changed.


More information about the Alsa-devel mailing list