Commit f4c2e9bc authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/wm8804', 'asoc/topic/wm8904',...

Merge remote-tracking branches 'asoc/topic/wm8804', 'asoc/topic/wm8904', 'asoc/topic/wm8960', 'asoc/topic/wm8988' and 'asoc/topic/xtfpga' into asoc-next
Bindings for I2S controller built into xtfpga Xtensa bitstreams.
Required properties:
- compatible: shall be "cdns,xtfpga-i2s".
- reg: memory region (address and length) with device registers.
- interrupts: interrupt for the device.
- clocks: phandle to the clk used as master clock. I2S bus clock
is derived from it.
Examples:
i2s0: xtfpga-i2s@0d080000 {
#sound-dai-cells = <0>;
compatible = "cdns,xtfpga-i2s";
reg = <0x0d080000 0x40>;
interrupts = <2 1>;
clocks = <&cdce706 4>;
};
...@@ -3,7 +3,7 @@ WM8904 audio CODEC ...@@ -3,7 +3,7 @@ WM8904 audio CODEC
This device supports I2C only. This device supports I2C only.
Required properties: Required properties:
- compatible: "wlf,wm8904" - compatible: "wlf,wm8904" or "wlf,wm8912"
- reg: the I2C address of the device. - reg: the I2C address of the device.
- clock-names: "mclk" - clock-names: "mclk"
- clocks: reference to - clocks: reference to
......
...@@ -10669,6 +10669,7 @@ M: Max Filippov <jcmvbkbc@gmail.com> ...@@ -10669,6 +10669,7 @@ M: Max Filippov <jcmvbkbc@gmail.com>
L: linux-xtensa@linux-xtensa.org L: linux-xtensa@linux-xtensa.org
S: Maintained S: Maintained
F: drivers/spi/spi-xtensa-xtfpga.c F: drivers/spi/spi-xtensa-xtfpga.c
F: sound/soc/xtensa/xtfpga-i2s.c
YAM DRIVER FOR AX.25 YAM DRIVER FOR AX.25
M: Jean-Paul Roubelat <jpr@f6fbb.org> M: Jean-Paul Roubelat <jpr@f6fbb.org>
......
...@@ -55,6 +55,7 @@ source "sound/soc/spear/Kconfig" ...@@ -55,6 +55,7 @@ source "sound/soc/spear/Kconfig"
source "sound/soc/tegra/Kconfig" source "sound/soc/tegra/Kconfig"
source "sound/soc/txx9/Kconfig" source "sound/soc/txx9/Kconfig"
source "sound/soc/ux500/Kconfig" source "sound/soc/ux500/Kconfig"
source "sound/soc/xtensa/Kconfig"
# Supported codecs # Supported codecs
source "sound/soc/codecs/Kconfig" source "sound/soc/codecs/Kconfig"
......
...@@ -36,3 +36,4 @@ obj-$(CONFIG_SND_SOC) += spear/ ...@@ -36,3 +36,4 @@ obj-$(CONFIG_SND_SOC) += spear/
obj-$(CONFIG_SND_SOC) += tegra/ obj-$(CONFIG_SND_SOC) += tegra/
obj-$(CONFIG_SND_SOC) += txx9/ obj-$(CONFIG_SND_SOC) += txx9/
obj-$(CONFIG_SND_SOC) += ux500/ obj-$(CONFIG_SND_SOC) += ux500/
obj-$(CONFIG_SND_SOC) += xtensa/
...@@ -648,7 +648,7 @@ static struct snd_soc_dai_driver wm8804_dai = { ...@@ -648,7 +648,7 @@ static struct snd_soc_dai_driver wm8804_dai = {
.symmetric_rates = 1 .symmetric_rates = 1
}; };
static struct snd_soc_codec_driver soc_codec_dev_wm8804 = { static const struct snd_soc_codec_driver soc_codec_dev_wm8804 = {
.probe = wm8804_probe, .probe = wm8804_probe,
.remove = wm8804_remove, .remove = wm8804_remove,
.set_bias_level = wm8804_set_bias_level, .set_bias_level = wm8804_set_bias_level,
...@@ -664,7 +664,7 @@ static const struct of_device_id wm8804_of_match[] = { ...@@ -664,7 +664,7 @@ static const struct of_device_id wm8804_of_match[] = {
}; };
MODULE_DEVICE_TABLE(of, wm8804_of_match); MODULE_DEVICE_TABLE(of, wm8804_of_match);
static struct regmap_config wm8804_regmap_config = { static const struct regmap_config wm8804_regmap_config = {
.reg_bits = 8, .reg_bits = 8,
.val_bits = 8, .val_bits = 8,
......
...@@ -2105,6 +2105,24 @@ static const struct regmap_config wm8904_regmap = { ...@@ -2105,6 +2105,24 @@ static const struct regmap_config wm8904_regmap = {
.num_reg_defaults = ARRAY_SIZE(wm8904_reg_defaults), .num_reg_defaults = ARRAY_SIZE(wm8904_reg_defaults),
}; };
#ifdef CONFIG_OF
static enum wm8904_type wm8904_data = WM8904;
static enum wm8904_type wm8912_data = WM8912;
static const struct of_device_id wm8904_of_match[] = {
{
.compatible = "wlf,wm8904",
.data = &wm8904_data,
}, {
.compatible = "wlf,wm8912",
.data = &wm8912_data,
}, {
/* sentinel */
}
};
MODULE_DEVICE_TABLE(of, wm8904_of_match);
#endif
static int wm8904_i2c_probe(struct i2c_client *i2c, static int wm8904_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
...@@ -2132,7 +2150,17 @@ static int wm8904_i2c_probe(struct i2c_client *i2c, ...@@ -2132,7 +2150,17 @@ static int wm8904_i2c_probe(struct i2c_client *i2c,
return ret; return ret;
} }
wm8904->devtype = id->driver_data; if (i2c->dev.of_node) {
const struct of_device_id *match;
match = of_match_node(wm8904_of_match, i2c->dev.of_node);
if (match == NULL)
return -EINVAL;
wm8904->devtype = *((enum wm8904_type *)match->data);
} else {
wm8904->devtype = id->driver_data;
}
i2c_set_clientdata(i2c, wm8904); i2c_set_clientdata(i2c, wm8904);
wm8904->pdata = i2c->dev.platform_data; wm8904->pdata = i2c->dev.platform_data;
...@@ -2266,6 +2294,7 @@ static struct i2c_driver wm8904_i2c_driver = { ...@@ -2266,6 +2294,7 @@ static struct i2c_driver wm8904_i2c_driver = {
.driver = { .driver = {
.name = "wm8904", .name = "wm8904",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = of_match_ptr(wm8904_of_match),
}, },
.probe = wm8904_i2c_probe, .probe = wm8904_i2c_probe,
.remove = wm8904_i2c_remove, .remove = wm8904_i2c_remove,
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/clk.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <sound/core.h> #include <sound/core.h>
...@@ -117,6 +118,7 @@ static bool wm8960_volatile(struct device *dev, unsigned int reg) ...@@ -117,6 +118,7 @@ static bool wm8960_volatile(struct device *dev, unsigned int reg)
} }
struct wm8960_priv { struct wm8960_priv {
struct clk *mclk;
struct regmap *regmap; struct regmap *regmap;
int (*set_bias_level)(struct snd_soc_codec *, int (*set_bias_level)(struct snd_soc_codec *,
enum snd_soc_bias_level level); enum snd_soc_bias_level level);
...@@ -618,14 +620,38 @@ static int wm8960_set_bias_level_out3(struct snd_soc_codec *codec, ...@@ -618,14 +620,38 @@ static int wm8960_set_bias_level_out3(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
int ret;
switch (level) { switch (level) {
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
break; break;
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
/* Set VMID to 2x50k */ switch (codec->dapm.bias_level) {
snd_soc_update_bits(codec, WM8960_POWER1, 0x180, 0x80); case SND_SOC_BIAS_STANDBY:
if (!IS_ERR(wm8960->mclk)) {
ret = clk_prepare_enable(wm8960->mclk);
if (ret) {
dev_err(codec->dev,
"Failed to enable MCLK: %d\n",
ret);
return ret;
}
}
/* Set VMID to 2x50k */
snd_soc_update_bits(codec, WM8960_POWER1, 0x180, 0x80);
break;
case SND_SOC_BIAS_ON:
if (!IS_ERR(wm8960->mclk))
clk_disable_unprepare(wm8960->mclk);
break;
default:
break;
}
break; break;
case SND_SOC_BIAS_STANDBY: case SND_SOC_BIAS_STANDBY:
...@@ -674,7 +700,7 @@ static int wm8960_set_bias_level_capless(struct snd_soc_codec *codec, ...@@ -674,7 +700,7 @@ static int wm8960_set_bias_level_capless(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec); struct wm8960_priv *wm8960 = snd_soc_codec_get_drvdata(codec);
int reg; int reg, ret;
switch (level) { switch (level) {
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
...@@ -715,9 +741,22 @@ static int wm8960_set_bias_level_capless(struct snd_soc_codec *codec, ...@@ -715,9 +741,22 @@ static int wm8960_set_bias_level_capless(struct snd_soc_codec *codec,
WM8960_VREF, WM8960_VREF); WM8960_VREF, WM8960_VREF);
msleep(100); msleep(100);
if (!IS_ERR(wm8960->mclk)) {
ret = clk_prepare_enable(wm8960->mclk);
if (ret) {
dev_err(codec->dev,
"Failed to enable MCLK: %d\n",
ret);
return ret;
}
}
break; break;
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
if (!IS_ERR(wm8960->mclk))
clk_disable_unprepare(wm8960->mclk);
/* Enable anti-pop mode */ /* Enable anti-pop mode */
snd_soc_update_bits(codec, WM8960_APOP1, snd_soc_update_bits(codec, WM8960_APOP1,
WM8960_POBCTRL | WM8960_SOFT_ST | WM8960_POBCTRL | WM8960_SOFT_ST |
...@@ -1002,6 +1041,12 @@ static int wm8960_i2c_probe(struct i2c_client *i2c, ...@@ -1002,6 +1041,12 @@ static int wm8960_i2c_probe(struct i2c_client *i2c,
if (wm8960 == NULL) if (wm8960 == NULL)
return -ENOMEM; return -ENOMEM;
wm8960->mclk = devm_clk_get(&i2c->dev, "mclk");
if (IS_ERR(wm8960->mclk)) {
if (PTR_ERR(wm8960->mclk) == -EPROBE_DEFER)
return -EPROBE_DEFER;
}
wm8960->regmap = devm_regmap_init_i2c(i2c, &wm8960_regmap); wm8960->regmap = devm_regmap_init_i2c(i2c, &wm8960_regmap);
if (IS_ERR(wm8960->regmap)) if (IS_ERR(wm8960->regmap))
return PTR_ERR(wm8960->regmap); return PTR_ERR(wm8960->regmap);
......
...@@ -813,7 +813,7 @@ static int wm8988_probe(struct snd_soc_codec *codec) ...@@ -813,7 +813,7 @@ static int wm8988_probe(struct snd_soc_codec *codec)
return 0; return 0;
} }
static struct snd_soc_codec_driver soc_codec_dev_wm8988 = { static const struct snd_soc_codec_driver soc_codec_dev_wm8988 = {
.probe = wm8988_probe, .probe = wm8988_probe,
.set_bias_level = wm8988_set_bias_level, .set_bias_level = wm8988_set_bias_level,
.suspend_bias_off = true, .suspend_bias_off = true,
...@@ -826,7 +826,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8988 = { ...@@ -826,7 +826,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8988 = {
.num_dapm_routes = ARRAY_SIZE(wm8988_dapm_routes), .num_dapm_routes = ARRAY_SIZE(wm8988_dapm_routes),
}; };
static struct regmap_config wm8988_regmap = { static const struct regmap_config wm8988_regmap = {
.reg_bits = 7, .reg_bits = 7,
.val_bits = 9, .val_bits = 9,
......
...@@ -44,7 +44,7 @@ static const char *wm8995_supply_names[WM8995_NUM_SUPPLIES] = { ...@@ -44,7 +44,7 @@ static const char *wm8995_supply_names[WM8995_NUM_SUPPLIES] = {
"MICVDD" "MICVDD"
}; };
static struct reg_default wm8995_reg_defaults[] = { static const struct reg_default wm8995_reg_defaults[] = {
{ 0, 0x8995 }, { 0, 0x8995 },
{ 5, 0x0100 }, { 5, 0x0100 },
{ 16, 0x000b }, { 16, 0x000b },
...@@ -2186,7 +2186,7 @@ static struct snd_soc_dai_driver wm8995_dai[] = { ...@@ -2186,7 +2186,7 @@ static struct snd_soc_dai_driver wm8995_dai[] = {
} }
}; };
static struct snd_soc_codec_driver soc_codec_dev_wm8995 = { static const struct snd_soc_codec_driver soc_codec_dev_wm8995 = {
.probe = wm8995_probe, .probe = wm8995_probe,
.remove = wm8995_remove, .remove = wm8995_remove,
.set_bias_level = wm8995_set_bias_level, .set_bias_level = wm8995_set_bias_level,
...@@ -2200,7 +2200,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8995 = { ...@@ -2200,7 +2200,7 @@ static struct snd_soc_codec_driver soc_codec_dev_wm8995 = {
.num_dapm_routes = ARRAY_SIZE(wm8995_intercon), .num_dapm_routes = ARRAY_SIZE(wm8995_intercon),
}; };
static struct regmap_config wm8995_regmap = { static const struct regmap_config wm8995_regmap = {
.reg_bits = 16, .reg_bits = 16,
.val_bits = 16, .val_bits = 16,
......
config SND_SOC_XTFPGA_I2S
tristate "XTFPGA I2S master"
select REGMAP_MMIO
help
Say Y or M if you want to add support for codecs attached to the
I2S interface on XTFPGA daughter board. You will also need to select
the drivers for the rest of XTFPGA audio subsystem.
snd-soc-xtfpga-i2s-objs := xtfpga-i2s.o
obj-$(CONFIG_SND_SOC_XTFPGA_I2S) += snd-soc-xtfpga-i2s.o
This diff is collapsed.
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