diff mbox series

ASoC: rt1015: add delay to fix pop noise from speaker

Message ID 20201103022500.23980-1-jack.yu@realtek.com (mailing list archive)
State Superseded
Headers show
Series ASoC: rt1015: add delay to fix pop noise from speaker | expand

Commit Message

Jack Yu Nov. 3, 2020, 2:25 a.m. UTC
From: Jack Yu <jack.yu@realtek.com>

Add delay to fix pop noise from speaker.

Signed-off-by: Jack Yu <jack.yu@realtek.com>
---
 .../devicetree/bindings/sound/rt1015.txt      |  6 ++++++
 include/sound/rt1015.h                        | 15 ++++++++++++++
 sound/soc/codecs/rt1015.c                     | 20 +++++++++++++++++++
 sound/soc/codecs/rt1015.h                     |  2 ++
 4 files changed, 43 insertions(+)
 create mode 100644 include/sound/rt1015.h

Comments

Pierre-Louis Bossart Nov. 3, 2020, 3:34 p.m. UTC | #1
That should have been a [PATCH v2] ?

On 11/2/20 8:25 PM, jack.yu@realtek.com wrote:
> From: Jack Yu <jack.yu@realtek.com>
> 
> Add delay to fix pop noise from speaker.
> 
> Signed-off-by: Jack Yu <jack.yu@realtek.com>
> ---
>   .../devicetree/bindings/sound/rt1015.txt      |  6 ++++++
>   include/sound/rt1015.h                        | 15 ++++++++++++++
>   sound/soc/codecs/rt1015.c                     | 20 +++++++++++++++++++
>   sound/soc/codecs/rt1015.h                     |  2 ++
>   4 files changed, 43 insertions(+)
>   create mode 100644 include/sound/rt1015.h
> 
> diff --git a/Documentation/devicetree/bindings/sound/rt1015.txt b/Documentation/devicetree/bindings/sound/rt1015.txt
> index fcfd02d8d32f..2c92c8cf3c7f 100644
> --- a/Documentation/devicetree/bindings/sound/rt1015.txt
> +++ b/Documentation/devicetree/bindings/sound/rt1015.txt
> @@ -8,10 +8,16 @@ Required properties:
>   
>   - reg : The I2C address of the device.
>   
> +Optional properties:
> +
> +- realtek,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,realtek,power-up-delay-ms = <50>;

is the repetition of 'realtek' intended? looks like a typo or copy/paste 
to me?

>   };
> diff --git a/include/sound/rt1015.h b/include/sound/rt1015.h
> new file mode 100644
> index 000000000000..70a7538d4c89
> --- /dev/null
> +++ b/include/sound/rt1015.h
> @@ -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
> diff --git a/sound/soc/codecs/rt1015.c b/sound/soc/codecs/rt1015.c
> index 25fe2ddedd54..967193518349 100644
> --- a/sound/soc/codecs/rt1015.c
> +++ b/sound/soc/codecs/rt1015.c
> @@ -27,10 +27,15 @@
>   #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);
> diff --git a/sound/soc/codecs/rt1015.h b/sound/soc/codecs/rt1015.h
> index d3fdd30aca6d..15cadb361ec3 100644
> --- a/sound/soc/codecs/rt1015.h
> +++ b/sound/soc/codecs/rt1015.h
> @@ -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;
>
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/sound/rt1015.txt b/Documentation/devicetree/bindings/sound/rt1015.txt
index fcfd02d8d32f..2c92c8cf3c7f 100644
--- a/Documentation/devicetree/bindings/sound/rt1015.txt
+++ b/Documentation/devicetree/bindings/sound/rt1015.txt
@@ -8,10 +8,16 @@  Required properties:
 
 - reg : The I2C address of the device.
 
+Optional properties:
+
+- realtek,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,realtek,power-up-delay-ms = <50>;
 };
diff --git a/include/sound/rt1015.h b/include/sound/rt1015.h
new file mode 100644
index 000000000000..70a7538d4c89
--- /dev/null
+++ b/include/sound/rt1015.h
@@ -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
diff --git a/sound/soc/codecs/rt1015.c b/sound/soc/codecs/rt1015.c
index 25fe2ddedd54..967193518349 100644
--- a/sound/soc/codecs/rt1015.c
+++ b/sound/soc/codecs/rt1015.c
@@ -27,10 +27,15 @@ 
 #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);
diff --git a/sound/soc/codecs/rt1015.h b/sound/soc/codecs/rt1015.h
index d3fdd30aca6d..15cadb361ec3 100644
--- a/sound/soc/codecs/rt1015.h
+++ b/sound/soc/codecs/rt1015.h
@@ -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;