[alsa-devel] [PATCH] ASoC: Add GPIO support for jack reporting interface
Lopez Cruz, Misael
x0052729 at ti.com
Tue Mar 3 19:39:17 CET 2009
> > Add GPIO support to jack reporting framework in ASoC using gpiolib calls.
> > The gpio support exports two new functions: snd_soc_jack_add_gpios and
> > snd_soc_jack_free_gpios.
> I prefer GPIO stuff built in conditionally.
> The jack layer is used also for non-ASoC codes, and GPIO
> isn't always present.
Is it ok if I enclose all gpio functionality with #ifdef CONFIG_GPIOLIB?
> > +/* irq handler for gpio pin */
> > +static irqreturn_t gpio_handler(int irq, void *data) {
> > + struct snd_soc_jack_gpio *gpio = data;
> > +
> > + return IRQ_RETVAL(schedule_work(&gpio->work));
> Is this really correct?
Changed to:
static irqreturn_t gpio_handler(int irq, void *data)
{
struct snd_soc_jack_gpio *gpio = data;
schedule_work(&gpio->work);
return IRQ_HANDLED;
}
> > +int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
> > + struct snd_soc_jack_gpio *gpios)
> This error path doesn't look good. It seems leaking /
> keeping some resources.
Changed to:
int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
struct snd_soc_jack_gpio *gpios)
{
int i, ret;
for (i = 0; i < count; i++) {
if (!gpio_is_valid(gpios[i].gpio)) {
printk(KERN_ERR "Invalid gpio %d\n",
gpios[i].gpio);
return -EINVAL;
}
if (!gpios[i].name) {
printk(KERN_ERR "No name for gpio %d\n",
gpios[i].gpio);
return -EINVAL;
}
ret = gpio_request(gpios[i].gpio, gpios[i].name);
if (ret)
return ret;
ret = gpio_direction_input(gpios[i].gpio);
if (ret) {
gpio_free(gpios[i].gpio);
return ret;
}
ret = request_irq(gpio_to_irq(gpios[i].gpio),
gpio_handler,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
jack->card->dev->driver->name,
&gpios[i]);
if (ret) {
gpio_free(gpios[i].gpio);
return ret;
}
INIT_WORK(&gpios[i].work, gpio_work);
gpios[i].jack = jack;
}
return 0;
}
More information about the Alsa-devel
mailing list