Commit 0d7b5c93 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/rl6231' and 'asoc/topic/rt5514' into asoc-next

RT5514 audio CODEC RT5514 audio CODEC
This device supports I2C only. This device supports both I2C and SPI.
Required properties: Required properties:
- compatible : "realtek,rt5514". - compatible : "realtek,rt5514".
- reg : The I2C address of the device. - reg : the I2C address of the device for I2C, the chip select
number for SPI.
Optional properties: Optional properties:
- clocks: The phandle of the master clock to the CODEC - clocks: The phandle of the master clock to the CODEC
- clock-names: Should be "mclk" - clock-names: Should be "mclk"
- interrupt-parent: The phandle for the interrupt controller.
- interrupts: The interrupt number to the cpu. The interrupt specifier format
depends on the interrupt controller.
- realtek,dmic-init-delay-ms - realtek,dmic-init-delay-ms
Set the DMIC initial delay (ms) to wait it ready. Set the DMIC initial delay (ms) to wait it ready for I2C.
Pins on the device (for linking into audio routes) for RT5514: Pins on the device (for linking into audio routes) for I2C:
* DMIC1L * DMIC1L
* DMIC1R * DMIC1R
......
...@@ -749,6 +749,10 @@ config SND_SOC_RT5514 ...@@ -749,6 +749,10 @@ config SND_SOC_RT5514
config SND_SOC_RT5514_SPI config SND_SOC_RT5514_SPI
tristate tristate
config SND_SOC_RT5514_SPI_BUILTIN
bool # force RT5514_SPI to be built-in to avoid link errors
default SND_SOC_RT5514=y && SND_SOC_RT5514_SPI=m
config SND_SOC_RT5616 config SND_SOC_RT5616
tristate "Realtek RT5616 CODEC" tristate "Realtek RT5616 CODEC"
depends on I2C depends on I2C
......
...@@ -360,6 +360,7 @@ obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o ...@@ -360,6 +360,7 @@ obj-$(CONFIG_SND_SOC_RT286) += snd-soc-rt286.o
obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o obj-$(CONFIG_SND_SOC_RT298) += snd-soc-rt298.o
obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o obj-$(CONFIG_SND_SOC_RT5514) += snd-soc-rt5514.o
obj-$(CONFIG_SND_SOC_RT5514_SPI) += snd-soc-rt5514-spi.o obj-$(CONFIG_SND_SOC_RT5514_SPI) += snd-soc-rt5514-spi.o
obj-$(CONFIG_SND_SOC_RT5514_SPI_BUILTIN) += snd-soc-rt5514-spi.o
obj-$(CONFIG_SND_SOC_RT5616) += snd-soc-rt5616.o obj-$(CONFIG_SND_SOC_RT5616) += snd-soc-rt5616.o
obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o obj-$(CONFIG_SND_SOC_RT5631) += snd-soc-rt5631.o
obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o
......
...@@ -71,7 +71,7 @@ EXPORT_SYMBOL_GPL(rl6231_get_pre_div); ...@@ -71,7 +71,7 @@ EXPORT_SYMBOL_GPL(rl6231_get_pre_div);
*/ */
int rl6231_calc_dmic_clk(int rate) int rl6231_calc_dmic_clk(int rate)
{ {
int div[] = {2, 3, 4, 6, 8, 12}; static const int div[] = {2, 3, 4, 6, 8, 12};
int i; int i;
if (rate < 1000000 * div[0]) { if (rate < 1000000 * div[0]) {
...@@ -189,7 +189,8 @@ EXPORT_SYMBOL_GPL(rl6231_pll_calc); ...@@ -189,7 +189,8 @@ EXPORT_SYMBOL_GPL(rl6231_pll_calc);
int rl6231_get_clk_info(int sclk, int rate) int rl6231_get_clk_info(int sclk, int rate)
{ {
int i, pd[] = {1, 2, 3, 4, 6, 8, 12, 16}; int i;
static const int pd[] = {1, 2, 3, 4, 6, 8, 12, 16};
if (sclk <= 0 || rate <= 0) if (sclk <= 0 || rate <= 0)
return -EINVAL; return -EINVAL;
......
...@@ -147,8 +147,13 @@ static void rt5514_spi_copy_work(struct work_struct *work) ...@@ -147,8 +147,13 @@ static void rt5514_spi_copy_work(struct work_struct *work)
static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp)
{ {
size_t period_bytes;
u8 buf[8]; u8 buf[8];
if (!rt5514_dsp->substream)
return;
period_bytes = snd_pcm_lib_period_bytes(rt5514_dsp->substream);
rt5514_dsp->get_size = 0; rt5514_dsp->get_size = 0;
/** /**
...@@ -176,6 +181,10 @@ static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp) ...@@ -176,6 +181,10 @@ static void rt5514_schedule_copy(struct rt5514_dsp *rt5514_dsp)
rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base; rt5514_dsp->buf_size = rt5514_dsp->buf_limit - rt5514_dsp->buf_base;
if (rt5514_dsp->buf_size % period_bytes)
rt5514_dsp->buf_size = (rt5514_dsp->buf_size / period_bytes) *
period_bytes;
if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit && if (rt5514_dsp->buf_base && rt5514_dsp->buf_limit &&
rt5514_dsp->buf_rp && rt5514_dsp->buf_size) rt5514_dsp->buf_rp && rt5514_dsp->buf_size)
schedule_delayed_work(&rt5514_dsp->copy_work, 0); schedule_delayed_work(&rt5514_dsp->copy_work, 0);
...@@ -447,9 +456,45 @@ static int rt5514_spi_probe(struct spi_device *spi) ...@@ -447,9 +456,45 @@ static int rt5514_spi_probe(struct spi_device *spi)
return ret; return ret;
} }
device_init_wakeup(&spi->dev, true);
return 0; return 0;
} }
static int __maybe_unused rt5514_suspend(struct device *dev)
{
int irq = to_spi_device(dev)->irq;
if (device_may_wakeup(dev))
enable_irq_wake(irq);
return 0;
}
static int __maybe_unused rt5514_resume(struct device *dev)
{
struct snd_soc_platform *platform = snd_soc_lookup_platform(dev);
struct rt5514_dsp *rt5514_dsp =
snd_soc_platform_get_drvdata(platform);
int irq = to_spi_device(dev)->irq;
u8 buf[8];
if (device_may_wakeup(dev))
disable_irq_wake(irq);
if (rt5514_dsp->substream) {
rt5514_spi_burst_read(RT5514_IRQ_CTRL, (u8 *)&buf, sizeof(buf));
if (buf[0] & RT5514_IRQ_STATUS_BIT)
rt5514_schedule_copy(rt5514_dsp);
}
return 0;
}
static const struct dev_pm_ops rt5514_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(rt5514_suspend, rt5514_resume)
};
static const struct of_device_id rt5514_of_match[] = { static const struct of_device_id rt5514_of_match[] = {
{ .compatible = "realtek,rt5514", }, { .compatible = "realtek,rt5514", },
{}, {},
...@@ -459,6 +504,7 @@ MODULE_DEVICE_TABLE(of, rt5514_of_match); ...@@ -459,6 +504,7 @@ MODULE_DEVICE_TABLE(of, rt5514_of_match);
static struct spi_driver rt5514_spi_driver = { static struct spi_driver rt5514_spi_driver = {
.driver = { .driver = {
.name = "rt5514", .name = "rt5514",
.pm = &rt5514_pm_ops,
.of_match_table = of_match_ptr(rt5514_of_match), .of_match_table = of_match_ptr(rt5514_of_match),
}, },
.probe = rt5514_spi_probe, .probe = rt5514_spi_probe,
......
...@@ -1143,7 +1143,7 @@ static const struct acpi_device_id rt5514_acpi_match[] = { ...@@ -1143,7 +1143,7 @@ static const struct acpi_device_id rt5514_acpi_match[] = {
MODULE_DEVICE_TABLE(acpi, rt5514_acpi_match); MODULE_DEVICE_TABLE(acpi, rt5514_acpi_match);
#endif #endif
static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev) static int rt5514_parse_dp(struct rt5514_priv *rt5514, struct device *dev)
{ {
device_property_read_u32(dev, "realtek,dmic-init-delay-ms", device_property_read_u32(dev, "realtek,dmic-init-delay-ms",
&rt5514->pdata.dmic_init_delay); &rt5514->pdata.dmic_init_delay);
...@@ -1183,8 +1183,8 @@ static int rt5514_i2c_probe(struct i2c_client *i2c, ...@@ -1183,8 +1183,8 @@ static int rt5514_i2c_probe(struct i2c_client *i2c,
if (pdata) if (pdata)
rt5514->pdata = *pdata; rt5514->pdata = *pdata;
else if (i2c->dev.of_node) else
rt5514_parse_dt(rt5514, &i2c->dev); rt5514_parse_dp(rt5514, &i2c->dev);
rt5514->i2c_regmap = devm_regmap_init_i2c(i2c, &rt5514_i2c_regmap); rt5514->i2c_regmap = devm_regmap_init_i2c(i2c, &rt5514_i2c_regmap);
if (IS_ERR(rt5514->i2c_regmap)) { if (IS_ERR(rt5514->i2c_regmap)) {
......
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