mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 05:34:00 +08:00
Merge remote-tracking branches 'asoc/topic/rl6231' and 'asoc/topic/rt5514' into asoc-next
This commit is contained in:
commit
0d7b5c93e5
@ -1,22 +1,27 @@
|
|||||||
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"
|
||||||
|
|
||||||
- realtek,dmic-init-delay-ms
|
- interrupt-parent: The phandle for the interrupt controller.
|
||||||
Set the DMIC initial delay (ms) to wait it ready.
|
- interrupts: The interrupt number to the cpu. The interrupt specifier format
|
||||||
|
depends on the interrupt controller.
|
||||||
|
|
||||||
Pins on the device (for linking into audio routes) for RT5514:
|
- realtek,dmic-init-delay-ms
|
||||||
|
Set the DMIC initial delay (ms) to wait it ready for I2C.
|
||||||
|
|
||||||
|
Pins on the device (for linking into audio routes) for I2C:
|
||||||
|
|
||||||
* DMIC1L
|
* DMIC1L
|
||||||
* DMIC1R
|
* DMIC1R
|
||||||
|
@ -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
|
|||||||
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);
|
|||||||
*/
|
*/
|
||||||
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);
|
|||||||
|
|
||||||
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 @@ done:
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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);
|
|||||||
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[] = {
|
|||||||
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,
|
|||||||
|
|
||||||
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)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user