Commit 22041ed1 authored by Linus Walleij's avatar Linus Walleij Committed by Mark Brown

ASoC: ti: Convert N810 ASoC to GPIO descriptors

The N810 uses GPIO descriptors pretty much exclusively, but not
for ASoC, so let's fix it. Register the pins in a descriptor table
in the machine since the ASoC device is not using device tree.

Use static locals for the GPIO descriptors because I'm not able
to experient with better state storage on any real hardware. Others
using the N810 can come afterwards and improve this.
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarJarkko Nikula <jarkko.nikula@bitmer.com>
Link: https://lore.kernel.org/r/20230926-descriptors-asoc-ti-v1-1-60cf4f8adbc5@linaro.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 5b12dd84
......@@ -498,6 +498,15 @@ struct menelaus_platform_data n8x0_menelaus_platform_data = {
.late_init = n8x0_menelaus_late_init,
};
static struct gpiod_lookup_table nokia810_asoc_gpio_table = {
.dev_id = "soc-audio",
.table = {
GPIO_LOOKUP("gpio-0-15", 10, "headset", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-80-111", 21, "speaker", GPIO_ACTIVE_HIGH),
{ }
},
};
static int __init n8x0_late_initcall(void)
{
if (!board_caps)
......@@ -505,6 +514,7 @@ static int __init n8x0_late_initcall(void)
n8x0_mmc_init();
n8x0_usb_init();
gpiod_add_lookup_table(&nokia810_asoc_gpio_table);
return 0;
}
......
......@@ -15,14 +15,14 @@
#include <sound/soc.h>
#include <asm/mach-types.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/module.h>
#include <linux/platform_data/asoc-ti-mcbsp.h>
#include "omap-mcbsp.h"
#define N810_HEADSET_AMP_GPIO 10
#define N810_SPEAKER_AMP_GPIO 101
static struct gpio_desc *n810_headset_amp;
static struct gpio_desc *n810_speaker_amp;
enum {
N810_JACK_DISABLED,
......@@ -187,9 +187,9 @@ static int n810_spk_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *k, int event)
{
if (SND_SOC_DAPM_EVENT_ON(event))
gpio_set_value(N810_SPEAKER_AMP_GPIO, 1);
gpiod_set_value(n810_speaker_amp, 1);
else
gpio_set_value(N810_SPEAKER_AMP_GPIO, 0);
gpiod_set_value(n810_speaker_amp, 0);
return 0;
}
......@@ -198,9 +198,9 @@ static int n810_jack_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *k, int event)
{
if (SND_SOC_DAPM_EVENT_ON(event))
gpio_set_value(N810_HEADSET_AMP_GPIO, 1);
gpiod_set_value(n810_headset_amp, 1);
else
gpio_set_value(N810_HEADSET_AMP_GPIO, 0);
gpiod_set_value(n810_headset_amp, 0);
return 0;
}
......@@ -327,14 +327,19 @@ static int __init n810_soc_init(void)
clk_set_parent(sys_clkout2_src, func96m_clk);
clk_set_rate(sys_clkout2, 12000000);
if (WARN_ON((gpio_request(N810_HEADSET_AMP_GPIO, "hs_amp") < 0) ||
(gpio_request(N810_SPEAKER_AMP_GPIO, "spk_amp") < 0))) {
err = -EINVAL;
n810_headset_amp = devm_gpiod_get(&n810_snd_device->dev,
"headphone", GPIOD_OUT_LOW);
if (IS_ERR(n810_headset_amp)) {
err = PTR_ERR(n810_headset_amp);
goto err4;
}
gpio_direction_output(N810_HEADSET_AMP_GPIO, 0);
gpio_direction_output(N810_SPEAKER_AMP_GPIO, 0);
n810_speaker_amp = devm_gpiod_get(&n810_snd_device->dev,
"speaker", GPIOD_OUT_LOW);
if (IS_ERR(n810_speaker_amp)) {
err = PTR_ERR(n810_speaker_amp);
goto err4;
}
return 0;
err4:
......@@ -351,8 +356,6 @@ static int __init n810_soc_init(void)
static void __exit n810_soc_exit(void)
{
gpio_free(N810_SPEAKER_AMP_GPIO);
gpio_free(N810_HEADSET_AMP_GPIO);
clk_put(sys_clkout2_src);
clk_put(sys_clkout2);
clk_put(func96m_clk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment