ASoC: rt1015: add delay to fix pop noise from speaker
authorJack Yu <jack.yu@realtek.com>
Thu, 5 Nov 2020 03:08:04 +0000 (11:08 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 5 Nov 2020 17:25:17 +0000 (17:25 +0000)
Add delay to fix pop noise from speaker.

Signed-off-by: Jack Yu <jack.yu@realtek.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20201105030804.31115-1-jack.yu@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/sound/rt1015.txt
include/sound/rt1015.h [new file with mode: 0644]
sound/soc/codecs/rt1015.c
sound/soc/codecs/rt1015.h

index fcfd02d8d32fbaa6890da5c0be4cdcdf7785ca95..e498966d436fbbb8f14e183cf341e5a165f08fc1 100644 (file)
@@ -8,10 +8,16 @@ Required properties:
 
 - reg : The I2C address of the device.
 
+Optional properties:
+
+- realtek,power-up-delay-ms
+  Set a delay time for flush work to be completed,
+  this value is adjustable depending on platform.
 
 Example:
 
 rt1015: codec@28 {
        compatible = "realtek,rt1015";
        reg = <0x28>;
+       realtek,power-up-delay-ms = <50>;
 };
diff --git a/include/sound/rt1015.h b/include/sound/rt1015.h
new file mode 100644 (file)
index 0000000..70a7538
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * linux/sound/rt1015.h -- Platform data for RT1015
+ *
+ * Copyright 2020 Realtek Microelectronics
+ */
+
+#ifndef __LINUX_SND_RT1015_H
+#define __LINUX_SND_RT1015_H
+
+struct rt1015_platform_data {
+       unsigned int power_up_delay_ms;
+};
+
+#endif
index 25fe2ddedd5454567c3601c3abd71e0cd8ebc88a..967193518349ac3b6fc7995a40bab10d5aac6374 100644 (file)
 #include <sound/soc-dapm.h>
 #include <sound/soc.h>
 #include <sound/tlv.h>
+#include <sound/rt1015.h>
 
 #include "rl6231.h"
 #include "rt1015.h"
 
+static const struct rt1015_platform_data i2s_default_platform_data = {
+       .power_up_delay_ms = 50,
+};
+
 static const struct reg_default rt1015_reg[] = {
        { 0x0000, 0x0000 },
        { 0x0004, 0xa000 },
@@ -650,6 +655,7 @@ static int rt1015_amp_drv_event(struct snd_soc_dapm_widget *w,
        case SND_SOC_DAPM_POST_PMU:
                if (rt1015->hw_config == RT1015_HW_28)
                        schedule_delayed_work(&rt1015->flush_work, msecs_to_jiffies(10));
+               msleep(rt1015->pdata.power_up_delay_ms);
                break;
        default:
                break;
@@ -1067,9 +1073,16 @@ static struct acpi_device_id rt1015_acpi_match[] = {
 MODULE_DEVICE_TABLE(acpi, rt1015_acpi_match);
 #endif
 
+static void rt1015_parse_dt(struct rt1015_priv *rt1015, struct device *dev)
+{
+       device_property_read_u32(dev, "realtek,power-up-delay-ms",
+               &rt1015->pdata.power_up_delay_ms);
+}
+
 static int rt1015_i2c_probe(struct i2c_client *i2c,
        const struct i2c_device_id *id)
 {
+       struct rt1015_platform_data *pdata = dev_get_platdata(&i2c->dev);
        struct rt1015_priv *rt1015;
        int ret;
        unsigned int val;
@@ -1081,6 +1094,13 @@ static int rt1015_i2c_probe(struct i2c_client *i2c,
 
        i2c_set_clientdata(i2c, rt1015);
 
+       rt1015->pdata = i2s_default_platform_data;
+
+       if (pdata)
+               rt1015->pdata = *pdata;
+       else
+               rt1015_parse_dt(rt1015, &i2c->dev);
+
        rt1015->regmap = devm_regmap_init_i2c(i2c, &rt1015_regmap);
        if (IS_ERR(rt1015->regmap)) {
                ret = PTR_ERR(rt1015->regmap);
index d3fdd30aca6d2d9a0a4b946a59c23e08c2b3d8ea..15cadb361ec3d0da3e0b5348b8ce5f892e55a77f 100644 (file)
@@ -12,6 +12,7 @@
 
 #ifndef __RT1015_H__
 #define __RT1015_H__
+#include <sound/rt1015.h>
 
 #define RT1015_DEVICE_ID_VAL                   0x1011
 #define RT1015_DEVICE_ID_VAL2                  0x1015
@@ -380,6 +381,7 @@ enum {
 
 struct rt1015_priv {
        struct snd_soc_component *component;
+       struct rt1015_platform_data pdata;
        struct regmap *regmap;
        int sysclk;
        int sysclk_src;