Commit 218e18a3 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Mark Brown

ASoC: qi_lb60: Use GPIO descriptor API

The new GPIO descriptor API is now the preferred way for handling GPIOs. It also
allows us to separate the platform depended code from the platform independent
code (Which will make it possible to increase build test coverage of the
platform independent code).
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Acked-by: default avatarRalf Baechle <ralf@linux-mips.org>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 050f62e4
...@@ -425,6 +425,15 @@ static struct platform_device qi_lb60_audio_device = { ...@@ -425,6 +425,15 @@ static struct platform_device qi_lb60_audio_device = {
.id = -1, .id = -1,
}; };
static struct gpiod_lookup_table qi_lb60_audio_gpio_table = {
.dev_id = "qi-lb60-audio",
.table = {
GPIO_LOOKUP("Bank B", 29, "snd", 0),
GPIO_LOOKUP("Bank D", 4, "amp", 0),
{ },
},
};
static struct platform_device *jz_platform_devices[] __initdata = { static struct platform_device *jz_platform_devices[] __initdata = {
&jz4740_udc_device, &jz4740_udc_device,
&jz4740_udc_xceiv_device, &jz4740_udc_xceiv_device,
...@@ -461,6 +470,8 @@ static int __init qi_lb60_init_platform_devices(void) ...@@ -461,6 +470,8 @@ static int __init qi_lb60_init_platform_devices(void)
jz4740_adc_device.dev.platform_data = &qi_lb60_battery_pdata; jz4740_adc_device.dev.platform_data = &qi_lb60_battery_pdata;
jz4740_mmc_device.dev.platform_data = &qi_lb60_mmc_pdata; jz4740_mmc_device.dev.platform_data = &qi_lb60_mmc_pdata;
gpiod_add_lookup_table(&qi_lb60_audio_gpio_table);
jz4740_serial_device_register(); jz4740_serial_device_register();
spi_register_board_info(qi_lb60_spi_board_info, spi_register_board_info(qi_lb60_spi_board_info,
......
...@@ -19,18 +19,21 @@ ...@@ -19,18 +19,21 @@
#include <sound/core.h> #include <sound/core.h>
#include <sound/pcm.h> #include <sound/pcm.h>
#include <sound/soc.h> #include <sound/soc.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#define QI_LB60_SND_GPIO JZ_GPIO_PORTB(29) struct qi_lb60 {
#define QI_LB60_AMP_GPIO JZ_GPIO_PORTD(4) struct gpio_desc *snd_gpio;
struct gpio_desc *amp_gpio;
};
static int qi_lb60_spk_event(struct snd_soc_dapm_widget *widget, static int qi_lb60_spk_event(struct snd_soc_dapm_widget *widget,
struct snd_kcontrol *ctrl, int event) struct snd_kcontrol *ctrl, int event)
{ {
struct qi_lb60 *qi_lb60 = snd_soc_card_get_drvdata(widget->dapm->card);
int on = !SND_SOC_DAPM_EVENT_OFF(event); int on = !SND_SOC_DAPM_EVENT_OFF(event);
gpio_set_value(QI_LB60_SND_GPIO, on); gpiod_set_value_cansleep(qi_lb60->snd_gpio, on);
gpio_set_value(QI_LB60_AMP_GPIO, on); gpiod_set_value_cansleep(qi_lb60->amp_gpio, on);
return 0; return 0;
} }
...@@ -57,7 +60,7 @@ static struct snd_soc_dai_link qi_lb60_dai = { ...@@ -57,7 +60,7 @@ static struct snd_soc_dai_link qi_lb60_dai = {
SND_SOC_DAIFMT_CBM_CFM, SND_SOC_DAIFMT_CBM_CFM,
}; };
static struct snd_soc_card qi_lb60 = { static struct snd_soc_card qi_lb60_card = {
.name = "QI LB60", .name = "QI LB60",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.dai_link = &qi_lb60_dai, .dai_link = &qi_lb60_dai,
...@@ -70,35 +73,35 @@ static struct snd_soc_card qi_lb60 = { ...@@ -70,35 +73,35 @@ static struct snd_soc_card qi_lb60 = {
.fully_routed = true, .fully_routed = true,
}; };
static const struct gpio qi_lb60_gpios[] = {
{ QI_LB60_SND_GPIO, GPIOF_OUT_INIT_LOW, "SND" },
{ QI_LB60_AMP_GPIO, GPIOF_OUT_INIT_LOW, "AMP" },
};
static int qi_lb60_probe(struct platform_device *pdev) static int qi_lb60_probe(struct platform_device *pdev)
{ {
struct snd_soc_card *card = &qi_lb60; struct qi_lb60 *qi_lb60;
struct snd_soc_card *card = &qi_lb60_card;
int ret; int ret;
ret = gpio_request_array(qi_lb60_gpios, ARRAY_SIZE(qi_lb60_gpios)); qi_lb60 = devm_kzalloc(&pdev->dev, sizeof(*qi_lb60), GFP_KERNEL);
if (!qi_lb60)
return -ENOMEM;
qi_lb60->snd_gpio = devm_gpiod_get(&pdev->dev, "snd");
if (IS_ERR(qi_lb60->snd_gpio))
return PTR_ERR(qi_lb60->snd_gpio);
ret = gpiod_direction_output(qi_lb60->snd_gpio, 0);
if (ret)
return ret;
qi_lb60->amp_gpio = devm_gpiod_get(&pdev->dev, "amp");
if (IS_ERR(qi_lb60->amp_gpio))
return PTR_ERR(qi_lb60->amp_gpio);
ret = gpiod_direction_output(qi_lb60->amp_gpio, 0);
if (ret) if (ret)
return ret; return ret;
card->dev = &pdev->dev; card->dev = &pdev->dev;
ret = devm_snd_soc_register_card(&pdev->dev, card); snd_soc_card_set_drvdata(card, qi_lb60);
if (ret) {
dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
ret);
gpio_free_array(qi_lb60_gpios, ARRAY_SIZE(qi_lb60_gpios));
}
return ret;
}
static int qi_lb60_remove(struct platform_device *pdev) return devm_snd_soc_register_card(&pdev->dev, card);
{
gpio_free_array(qi_lb60_gpios, ARRAY_SIZE(qi_lb60_gpios));
return 0;
} }
static struct platform_driver qi_lb60_driver = { static struct platform_driver qi_lb60_driver = {
...@@ -107,7 +110,6 @@ static struct platform_driver qi_lb60_driver = { ...@@ -107,7 +110,6 @@ static struct platform_driver qi_lb60_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = qi_lb60_probe, .probe = qi_lb60_probe,
.remove = qi_lb60_remove,
}; };
module_platform_driver(qi_lb60_driver); module_platform_driver(qi_lb60_driver);
......
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