Merge remote-tracking branches 'asoc/topic/davinci', 'asoc/topic/dmic', 'asoc/topic/drivers', 'asoc/topic/es8328' and 'asoc/topic/fsl' into asoc-next
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
@@ -1700,14 +1701,19 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
|
||||
|
||||
SND_SOC_DAPM_INPUT("Haptic Generator"),
|
||||
|
||||
SND_SOC_DAPM_PGA("DMIC1", RT5677_DMIC_CTRL1, RT5677_DMIC_1_EN_SFT, 0,
|
||||
NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC2", RT5677_DMIC_CTRL1, RT5677_DMIC_2_EN_SFT, 0,
|
||||
NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC3", RT5677_DMIC_CTRL1, RT5677_DMIC_3_EN_SFT, 0,
|
||||
NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC4", RT5677_DMIC_CTRL2, RT5677_DMIC_4_EN_SFT, 0,
|
||||
NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("DMIC4", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_SUPPLY("DMIC1 power", RT5677_DMIC_CTRL1,
|
||||
RT5677_DMIC_1_EN_SFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DMIC2 power", RT5677_DMIC_CTRL1,
|
||||
RT5677_DMIC_2_EN_SFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DMIC3 power", RT5677_DMIC_CTRL1,
|
||||
RT5677_DMIC_3_EN_SFT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("DMIC4 power", RT5677_DMIC_CTRL2,
|
||||
RT5677_DMIC_4_EN_SFT, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
|
||||
set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
|
||||
@@ -2130,6 +2136,13 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
||||
{ "DMIC L4", NULL, "DMIC CLK" },
|
||||
{ "DMIC R4", NULL, "DMIC CLK" },
|
||||
|
||||
{ "DMIC L1", NULL, "DMIC1 power" },
|
||||
{ "DMIC R1", NULL, "DMIC1 power" },
|
||||
{ "DMIC L3", NULL, "DMIC3 power" },
|
||||
{ "DMIC R3", NULL, "DMIC3 power" },
|
||||
{ "DMIC L4", NULL, "DMIC4 power" },
|
||||
{ "DMIC R4", NULL, "DMIC4 power" },
|
||||
|
||||
{ "BST1", NULL, "IN1P" },
|
||||
{ "BST1", NULL, "IN1N" },
|
||||
{ "BST2", NULL, "IN2P" },
|
||||
@@ -2793,6 +2806,16 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
||||
{ "PDM2R", NULL, "PDM2 R Mux" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt5677_dmic2_clk_1[] = {
|
||||
{ "DMIC L2", NULL, "DMIC1 power" },
|
||||
{ "DMIC R2", NULL, "DMIC1 power" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt5677_dmic2_clk_2[] = {
|
||||
{ "DMIC L2", NULL, "DMIC2 power" },
|
||||
{ "DMIC R2", NULL, "DMIC2 power" },
|
||||
};
|
||||
|
||||
static int rt5677_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
|
||||
{
|
||||
@@ -3138,12 +3161,148 @@ static int rt5677_set_bias_level(struct snd_soc_codec *codec,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
static inline struct rt5677_priv *gpio_to_rt5677(struct gpio_chip *chip)
|
||||
{
|
||||
return container_of(chip, struct rt5677_priv, gpio_chip);
|
||||
}
|
||||
|
||||
static void rt5677_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = gpio_to_rt5677(chip);
|
||||
|
||||
switch (offset) {
|
||||
case RT5677_GPIO1 ... RT5677_GPIO5:
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL2,
|
||||
0x1 << (offset * 3 + 1), !!value << (offset * 3 + 1));
|
||||
break;
|
||||
|
||||
case RT5677_GPIO6:
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL3,
|
||||
RT5677_GPIO6_OUT_MASK, !!value << RT5677_GPIO6_OUT_SFT);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int rt5677_gpio_direction_out(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = gpio_to_rt5677(chip);
|
||||
|
||||
switch (offset) {
|
||||
case RT5677_GPIO1 ... RT5677_GPIO5:
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL2,
|
||||
0x3 << (offset * 3 + 1),
|
||||
(0x2 | !!value) << (offset * 3 + 1));
|
||||
break;
|
||||
|
||||
case RT5677_GPIO6:
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL3,
|
||||
RT5677_GPIO6_DIR_MASK | RT5677_GPIO6_OUT_MASK,
|
||||
RT5677_GPIO6_DIR_OUT | !!value << RT5677_GPIO6_OUT_SFT);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt5677_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = gpio_to_rt5677(chip);
|
||||
int value, ret;
|
||||
|
||||
ret = regmap_read(rt5677->regmap, RT5677_GPIO_ST, &value);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return (value & (0x1 << offset)) >> offset;
|
||||
}
|
||||
|
||||
static int rt5677_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = gpio_to_rt5677(chip);
|
||||
|
||||
switch (offset) {
|
||||
case RT5677_GPIO1 ... RT5677_GPIO5:
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL2,
|
||||
0x1 << (offset * 3 + 2), 0x0);
|
||||
break;
|
||||
|
||||
case RT5677_GPIO6:
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL3,
|
||||
RT5677_GPIO6_DIR_MASK, RT5677_GPIO6_DIR_IN);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct gpio_chip rt5677_template_chip = {
|
||||
.label = "rt5677",
|
||||
.owner = THIS_MODULE,
|
||||
.direction_output = rt5677_gpio_direction_out,
|
||||
.set = rt5677_gpio_set,
|
||||
.direction_input = rt5677_gpio_direction_in,
|
||||
.get = rt5677_gpio_get,
|
||||
.can_sleep = 1,
|
||||
};
|
||||
|
||||
static void rt5677_init_gpio(struct i2c_client *i2c)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
|
||||
int ret;
|
||||
|
||||
rt5677->gpio_chip = rt5677_template_chip;
|
||||
rt5677->gpio_chip.ngpio = RT5677_GPIO_NUM;
|
||||
rt5677->gpio_chip.dev = &i2c->dev;
|
||||
rt5677->gpio_chip.base = -1;
|
||||
|
||||
ret = gpiochip_add(&rt5677->gpio_chip);
|
||||
if (ret != 0)
|
||||
dev_err(&i2c->dev, "Failed to add GPIOs: %d\n", ret);
|
||||
}
|
||||
|
||||
static void rt5677_free_gpio(struct i2c_client *i2c)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = i2c_get_clientdata(i2c);
|
||||
|
||||
gpiochip_remove(&rt5677->gpio_chip);
|
||||
}
|
||||
#else
|
||||
static void rt5677_init_gpio(struct i2c_client *i2c)
|
||||
{
|
||||
}
|
||||
|
||||
static void rt5677_free_gpio(struct i2c_client *i2c)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int rt5677_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
rt5677->codec = codec;
|
||||
|
||||
if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {
|
||||
snd_soc_dapm_add_routes(&codec->dapm,
|
||||
rt5677_dmic2_clk_2,
|
||||
ARRAY_SIZE(rt5677_dmic2_clk_2));
|
||||
} else { /*use dmic1 clock by default*/
|
||||
snd_soc_dapm_add_routes(&codec->dapm,
|
||||
rt5677_dmic2_clk_1,
|
||||
ARRAY_SIZE(rt5677_dmic2_clk_1));
|
||||
}
|
||||
|
||||
rt5677_set_bias_level(codec, SND_SOC_BIAS_OFF);
|
||||
|
||||
regmap_write(rt5677->regmap, RT5677_DIG_MISC, 0x0020);
|
||||
@@ -3381,6 +3540,17 @@ static int rt5677_i2c_probe(struct i2c_client *i2c,
|
||||
regmap_update_bits(rt5677->regmap, RT5677_IN1,
|
||||
RT5677_IN_DF2, RT5677_IN_DF2);
|
||||
|
||||
if (rt5677->pdata.dmic2_clk_pin == RT5677_DMIC_CLK2) {
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GEN_CTRL2,
|
||||
RT5677_GPIO5_FUNC_MASK,
|
||||
RT5677_GPIO5_FUNC_DMIC);
|
||||
regmap_update_bits(rt5677->regmap, RT5677_GPIO_CTRL2,
|
||||
RT5677_GPIO5_DIR_MASK,
|
||||
RT5677_GPIO5_DIR_OUT);
|
||||
}
|
||||
|
||||
rt5677_init_gpio(i2c);
|
||||
|
||||
return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5677,
|
||||
rt5677_dai, ARRAY_SIZE(rt5677_dai));
|
||||
}
|
||||
@@ -3388,6 +3558,7 @@ static int rt5677_i2c_probe(struct i2c_client *i2c,
|
||||
static int rt5677_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
snd_soc_unregister_codec(&i2c->dev);
|
||||
rt5677_free_gpio(i2c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user