mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
ASoC: cs4271: Convert to GPIO descriptors
This converts the Cirrus CS4271 ASoC codec driver to use GPIO descriptors. It turns out that there are two in-kernel users of the platform data passing mechanism so these are switched over as well. One locally defined GPIO "gpio_disabled" is declared in the state struct but completely unused in the driver, so we delete it. Reviewed-by: Alexander Sverdlin <alexander.sverdlin@gmail.com> Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20231201-descriptors-sound-cirrus-v2-6-ee9f9d4655eb@linaro.org Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
194ef700d4
commit
42d1178d22
@ -88,7 +88,7 @@ static void __init edb93xx_register_i2c(void)
|
|||||||
* EDB93xx SPI peripheral handling
|
* EDB93xx SPI peripheral handling
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
static struct cs4271_platform_data edb93xx_cs4271_data = {
|
static struct cs4271_platform_data edb93xx_cs4271_data = {
|
||||||
.gpio_nreset = -EINVAL, /* filled in later */
|
/* Intentionally left blank */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
|
static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
|
||||||
@ -114,14 +114,38 @@ static struct ep93xx_spi_info edb93xx_spi_info __initdata = {
|
|||||||
/* Intentionally left blank */
|
/* Intentionally left blank */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table edb93xx_cs4272_edb9301_gpio_table = {
|
||||||
|
.dev_id = "spi0.0", /* CS0 on SPI0 */
|
||||||
|
.table = {
|
||||||
|
GPIO_LOOKUP("A", 1, "reset", GPIO_ACTIVE_LOW),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table edb93xx_cs4272_edb9302_gpio_table = {
|
||||||
|
.dev_id = "spi0.0", /* CS0 on SPI0 */
|
||||||
|
.table = {
|
||||||
|
GPIO_LOOKUP("H", 2, "reset", GPIO_ACTIVE_LOW),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table edb93xx_cs4272_edb9315_gpio_table = {
|
||||||
|
.dev_id = "spi0.0", /* CS0 on SPI0 */
|
||||||
|
.table = {
|
||||||
|
GPIO_LOOKUP("B", 6, "reset", GPIO_ACTIVE_LOW),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static void __init edb93xx_register_spi(void)
|
static void __init edb93xx_register_spi(void)
|
||||||
{
|
{
|
||||||
if (machine_is_edb9301() || machine_is_edb9302())
|
if (machine_is_edb9301() || machine_is_edb9302())
|
||||||
edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO1;
|
gpiod_add_lookup_table(&edb93xx_cs4272_edb9301_gpio_table);
|
||||||
else if (machine_is_edb9302a() || machine_is_edb9307a())
|
else if (machine_is_edb9302a() || machine_is_edb9307a())
|
||||||
edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_H(2);
|
gpiod_add_lookup_table(&edb93xx_cs4272_edb9302_gpio_table);
|
||||||
else if (machine_is_edb9315a())
|
else if (machine_is_edb9315a())
|
||||||
edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO14;
|
gpiod_add_lookup_table(&edb93xx_cs4272_edb9315_gpio_table);
|
||||||
|
|
||||||
gpiod_add_lookup_table(&edb93xx_spi_cs_gpio_table);
|
gpiod_add_lookup_table(&edb93xx_spi_cs_gpio_table);
|
||||||
ep93xx_register_spi(&edb93xx_spi_info, edb93xx_spi_board_info,
|
ep93xx_register_spi(&edb93xx_spi_info, edb93xx_spi_board_info,
|
||||||
|
@ -164,7 +164,7 @@ static struct i2c_board_info vision_i2c_info[] __initdata = {
|
|||||||
* SPI CS4271 Audio Codec
|
* SPI CS4271 Audio Codec
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
static struct cs4271_platform_data vision_cs4271_data = {
|
static struct cs4271_platform_data vision_cs4271_data = {
|
||||||
.gpio_nreset = EP93XX_GPIO_LINE_H(2),
|
/* Intentionally left blank */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@ -241,6 +241,15 @@ static struct spi_board_info vision_spi_board_info[] __initdata = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gpiod_lookup_table vision_spi_cs4271_gpio_table = {
|
||||||
|
.dev_id = "spi0.0", /* cs4271 @ CS0 */
|
||||||
|
.table = {
|
||||||
|
/* RESET */
|
||||||
|
GPIO_LOOKUP_IDX("H", 2, NULL, 0, GPIO_ACTIVE_LOW),
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table vision_spi_cs_gpio_table = {
|
static struct gpiod_lookup_table vision_spi_cs_gpio_table = {
|
||||||
.dev_id = "spi0",
|
.dev_id = "spi0",
|
||||||
.table = {
|
.table = {
|
||||||
@ -292,6 +301,7 @@ static void __init vision_init_machine(void)
|
|||||||
|
|
||||||
ep93xx_register_i2c(vision_i2c_info,
|
ep93xx_register_i2c(vision_i2c_info,
|
||||||
ARRAY_SIZE(vision_i2c_info));
|
ARRAY_SIZE(vision_i2c_info));
|
||||||
|
gpiod_add_lookup_table(&vision_spi_cs4271_gpio_table);
|
||||||
gpiod_add_lookup_table(&vision_spi_mmc_gpio_table);
|
gpiod_add_lookup_table(&vision_spi_mmc_gpio_table);
|
||||||
gpiod_add_lookup_table(&vision_spi_cs_gpio_table);
|
gpiod_add_lookup_table(&vision_spi_cs_gpio_table);
|
||||||
ep93xx_register_spi(&vision_spi_master, vision_spi_board_info,
|
ep93xx_register_spi(&vision_spi_master, vision_spi_board_info,
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#define __CS4271_H
|
#define __CS4271_H
|
||||||
|
|
||||||
struct cs4271_platform_data {
|
struct cs4271_platform_data {
|
||||||
int gpio_nreset; /* GPIO driving Reset pin, if any */
|
|
||||||
bool amutec_eq_bmutec; /* flag to enable AMUTEC=BMUTEC */
|
bool amutec_eq_bmutec; /* flag to enable AMUTEC=BMUTEC */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -13,9 +13,8 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio/consumer.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_gpio.h>
|
|
||||||
#include <linux/regulator/consumer.h>
|
#include <linux/regulator/consumer.h>
|
||||||
#include <sound/pcm.h>
|
#include <sound/pcm.h>
|
||||||
#include <sound/soc.h>
|
#include <sound/soc.h>
|
||||||
@ -160,9 +159,7 @@ struct cs4271_private {
|
|||||||
/* Current sample rate for de-emphasis control */
|
/* Current sample rate for de-emphasis control */
|
||||||
int rate;
|
int rate;
|
||||||
/* GPIO driving Reset pin, if any */
|
/* GPIO driving Reset pin, if any */
|
||||||
int gpio_nreset;
|
struct gpio_desc *reset;
|
||||||
/* GPIO that disable serial bus, if any */
|
|
||||||
int gpio_disable;
|
|
||||||
/* enable soft reset workaround */
|
/* enable soft reset workaround */
|
||||||
bool enable_soft_reset;
|
bool enable_soft_reset;
|
||||||
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
|
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
|
||||||
@ -487,12 +484,10 @@ static int cs4271_reset(struct snd_soc_component *component)
|
|||||||
{
|
{
|
||||||
struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component);
|
struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component);
|
||||||
|
|
||||||
if (gpio_is_valid(cs4271->gpio_nreset)) {
|
gpiod_direction_output(cs4271->reset, 1);
|
||||||
gpio_direction_output(cs4271->gpio_nreset, 0);
|
mdelay(1);
|
||||||
mdelay(1);
|
gpiod_set_value(cs4271->reset, 0);
|
||||||
gpio_set_value(cs4271->gpio_nreset, 1);
|
mdelay(1);
|
||||||
mdelay(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -612,9 +607,8 @@ static void cs4271_component_remove(struct snd_soc_component *component)
|
|||||||
{
|
{
|
||||||
struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component);
|
struct cs4271_private *cs4271 = snd_soc_component_get_drvdata(component);
|
||||||
|
|
||||||
if (gpio_is_valid(cs4271->gpio_nreset))
|
/* Set codec to the reset state */
|
||||||
/* Set codec to the reset state */
|
gpiod_set_value(cs4271->reset, 1);
|
||||||
gpio_set_value(cs4271->gpio_nreset, 0);
|
|
||||||
|
|
||||||
regcache_mark_dirty(cs4271->regmap);
|
regcache_mark_dirty(cs4271->regmap);
|
||||||
regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies);
|
regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies);
|
||||||
@ -639,7 +633,6 @@ static const struct snd_soc_component_driver soc_component_dev_cs4271 = {
|
|||||||
static int cs4271_common_probe(struct device *dev,
|
static int cs4271_common_probe(struct device *dev,
|
||||||
struct cs4271_private **c)
|
struct cs4271_private **c)
|
||||||
{
|
{
|
||||||
struct cs4271_platform_data *cs4271plat = dev->platform_data;
|
|
||||||
struct cs4271_private *cs4271;
|
struct cs4271_private *cs4271;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
@ -647,17 +640,11 @@ static int cs4271_common_probe(struct device *dev,
|
|||||||
if (!cs4271)
|
if (!cs4271)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
cs4271->gpio_nreset = of_get_named_gpio(dev->of_node, "reset-gpio", 0);
|
cs4271->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
|
||||||
|
if (IS_ERR(cs4271->reset))
|
||||||
if (cs4271plat)
|
return dev_err_probe(dev, PTR_ERR(cs4271->reset),
|
||||||
cs4271->gpio_nreset = cs4271plat->gpio_nreset;
|
"error retrieveing RESET GPIO\n");
|
||||||
|
gpiod_set_consumer_name(cs4271->reset, "CS4271 Reset");
|
||||||
if (gpio_is_valid(cs4271->gpio_nreset)) {
|
|
||||||
ret = devm_gpio_request(dev, cs4271->gpio_nreset,
|
|
||||||
"CS4271 Reset");
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(supply_names); i++)
|
for (i = 0; i < ARRAY_SIZE(supply_names); i++)
|
||||||
cs4271->supplies[i].supply = supply_names[i];
|
cs4271->supplies[i].supply = supply_names[i];
|
||||||
|
Loading…
Reference in New Issue
Block a user