ASoC: jack: Basic GPIO descriptor conversion
PATCH 1/2 ASoC: jack: Basic GPIO descriptor conversion
This patch does basic GPIO descriptor conversion to soc-jack. Even the GPIOs are still passed and requested using legacy GPIO numbers the driver internals are converted to use GPIO descriptor API.
Motivation for this is to prepare soc-jack so that it will allow registering jack GPIO pins using both GPIO descriptors and legacy GPIO numbers.
--- include/sound/soc.h | 1 + sound/soc/soc-jack.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-)
include/sound/soc.h +1 -0
@@ -607,6 +607,7 @@ struct snd_soc_jack_gpio {struct snd_soc_jack *jack;struct delayed_work work; +struct gpio_desc *desc;void *data;int (*jack_status_check)(void *data);
sound/soc/soc-jack.c +11 -8
@@ -14,6 +14,7 @@#include <sound/jack.h> #include <sound/soc.h> #include <linux/gpio.h> +#include <linux/gpio/consumer.h> #include <linux/interrupt.h> #include <linux/workqueue.h> #include <linux/delay.h>
@@ -240,7 +241,7 @@ static void snd_soc_jack_gpio_detect(struct snd_soc_jack_gpio *gpio)int enable;int report; - enable =gpio_get_value_cansleep (gpio->gpio); + enable =gpiod_get_value_cansleep (gpio->desc);if (gpio->invert) enable = !enable;
@@ -314,14 +315,16 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,if (ret) goto undo; - ret =gpio_direction_input (gpios[i].gpio); + gpios[i].desc =gpio_to_desc (gpios[i].gpio); + + ret =gpiod_direction_input (gpios[i].desc);if (ret) goto err;INIT_DELAYED_WORK (&gpios[i].work, gpio_work); gpios[i].jack = jack; - ret = request_any_context_irq(gpio_to_irq(gpios[i].gpio), + ret = request_any_context_irq(gpiod_to_irq(gpios[i].desc), gpio_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
@@ -331,7 +334,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, goto err;if (gpios[i].wake) { - ret =irq_set_irq_wake (gpio_to_irq (gpios[i].gpio),1 ); + ret =irq_set_irq_wake (gpiod_to_irq (gpios[i].desc),1 );if (ret !=0 ) dev_err(jack->codec->dev, "ASoC: " "Failed to mark GPIO %d as wake source: %d\n",
@@ -339,7 +342,7 @@ int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, }/* Expose GPIO value over sysfs for diagnostic purposes */ -gpio_export (gpios[i].gpio, false); +gpiod_export (gpios[i].desc, false);/* Update initial jack status */ schedule_delayed_work(&gpios[i].work,
@@ -372,10 +375,10 @@ void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,int i;for (i =0 ; i < count; i++) { -gpio_unexport (gpios[i].gpio); -free_irq (gpio_to_irq (gpios[i].gpio), &gpios[i]); +gpiod_unexport (gpios[i].desc); +free_irq (gpiod_to_irq (gpios[i].desc), &gpios[i]);cancel_delayed_work_sync (&gpios[i].work); -gpio_free (gpios[i].gpio); +gpiod_put (gpios[i].desc); gpios[i].jack =NULL ; } }
Signature · 1 line
2.0.0.rc2
PATCH 2/2 ASoC: jack: Add support for GPIO descriptor defined jack pins
Allow jack GPIO pins be defined also using GPIO descriptor-based interface in addition to legacy GPIO numbers. This is done by adding two new fields to struct snd_soc_jack_gpio: idx and gpiod_dev.
Legacy GPIO numbers are used only when GPIO consumer device gpiod_dev is NULL and otherwise idx is the descriptor index within the GPIO consumer device.
New function snd_soc_jack_add_gpiods() is added for typical cases where all GPIO descriptor jack pins belong to same GPIO consumer device. For other cases the caller must set the gpiod_dev in struct snd_soc_jack_gpio before calling snd_soc_jack_add_gpios().
--- include/sound/soc.h | 16 +++++++++++- sound/soc/soc-jack.c | 73 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 17 deletions(-)
include/sound/soc.h +15 -1
@@ -452,6 +452,9 @@ int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);#ifdef CONFIG_GPIOLIB int snd_soc_jack_add_gpios (struct snd_soc_jack *jack,int count,struct snd_soc_jack_gpio *gpios); +int snd_soc_jack_add_gpiods (struct device *gpiod_dev, +struct snd_soc_jack *jack, +int count,struct snd_soc_jack_gpio *gpios);void snd_soc_jack_free_gpios (struct snd_soc_jack *jack,int count,struct snd_soc_jack_gpio *gpios);#else
@@ -461,6 +464,13 @@ static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,return 0 ; } +int snd_soc_jack_add_gpiods (struct device *gpiod_dev, +struct snd_soc_jack *jack, +int count,struct snd_soc_jack_gpio *gpios) +{ +return 0 ; +} +static inline void snd_soc_jack_free_gpios (struct snd_soc_jack *jack,int count,struct snd_soc_jack_gpio *gpios) {
@@ -587,7 +597,9 @@ struct snd_soc_jack_zone {/** * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection * -* @gpio: gpio number +* @gpio: legacy gpio number +* @idx: gpio descriptor index within the GPIO consumer device +* @gpiod_dev GPIO consumer device * @name: gpio name * @report: value to report when jack detected * @invert: report presence in low state
@@ -599,6 +611,8 @@ struct snd_soc_jack_zone {*/ struct snd_soc_jack_gpio {unsigned int gpio; +unsigned int idx; +struct device *gpiod_dev;const char *name;int report;int invert;
sound/soc/soc-jack.c +57 -16
96 lines not on this page · raw message
Signature · 1 line
2.0.0.rc2
Re: [PATCH 2/2] ASoC: jack: Add support for GPIO descriptor defined jack pins
Quoted 3 lines · Jarkko Nikula
Allow jack GPIO pins be defined also using GPIO descriptor-based interface in addition to legacy GPIO numbers. This is done by adding two new fields to struct
snd_soc_jack_gpio: idx andgpiod_dev.
Applied, thanks. It's worth pointing out that the existing name field is used to supply the connection ID for the gpiod API so we don't *only* support index based lookups.
Quoted 3 lines · Jarkko Nikula
This patch does basic GPIO descriptor conversion to soc-jack. Even the GPIOs are still passed and requested using legacy GPIO numbers the driver internals are converted to use GPIO descriptor API.
Applied, thanks.