Commit 93bd813c authored by Jack Yu's avatar Jack Yu Committed by Mark Brown

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

Add delay to fix pop noise from speaker.
Signed-off-by: default avatarJack Yu <jack.yu@realtek.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20201105030804.31115-1-jack.yu@realtek.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent f9d7c6eb
...@@ -8,10 +8,16 @@ Required properties: ...@@ -8,10 +8,16 @@ Required properties:
- reg : The I2C address of the device. - 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: Example:
rt1015: codec@28 { rt1015: codec@28 {
compatible = "realtek,rt1015"; compatible = "realtek,rt1015";
reg = <0x28>; reg = <0x28>;
realtek,power-up-delay-ms = <50>;
}; };
/* 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
...@@ -27,10 +27,15 @@ ...@@ -27,10 +27,15 @@
#include <sound/soc-dapm.h> #include <sound/soc-dapm.h>
#include <sound/soc.h> #include <sound/soc.h>
#include <sound/tlv.h> #include <sound/tlv.h>
#include <sound/rt1015.h>
#include "rl6231.h" #include "rl6231.h"
#include "rt1015.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[] = { static const struct reg_default rt1015_reg[] = {
{ 0x0000, 0x0000 }, { 0x0000, 0x0000 },
{ 0x0004, 0xa000 }, { 0x0004, 0xa000 },
...@@ -650,6 +655,7 @@ static int rt1015_amp_drv_event(struct snd_soc_dapm_widget *w, ...@@ -650,6 +655,7 @@ static int rt1015_amp_drv_event(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_POST_PMU: case SND_SOC_DAPM_POST_PMU:
if (rt1015->hw_config == RT1015_HW_28) if (rt1015->hw_config == RT1015_HW_28)
schedule_delayed_work(&rt1015->flush_work, msecs_to_jiffies(10)); schedule_delayed_work(&rt1015->flush_work, msecs_to_jiffies(10));
msleep(rt1015->pdata.power_up_delay_ms);
break; break;
default: default:
break; break;
...@@ -1067,9 +1073,16 @@ static struct acpi_device_id rt1015_acpi_match[] = { ...@@ -1067,9 +1073,16 @@ static struct acpi_device_id rt1015_acpi_match[] = {
MODULE_DEVICE_TABLE(acpi, rt1015_acpi_match); MODULE_DEVICE_TABLE(acpi, rt1015_acpi_match);
#endif #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, static int rt1015_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
struct rt1015_platform_data *pdata = dev_get_platdata(&i2c->dev);
struct rt1015_priv *rt1015; struct rt1015_priv *rt1015;
int ret; int ret;
unsigned int val; unsigned int val;
...@@ -1081,6 +1094,13 @@ static int rt1015_i2c_probe(struct i2c_client *i2c, ...@@ -1081,6 +1094,13 @@ static int rt1015_i2c_probe(struct i2c_client *i2c,
i2c_set_clientdata(i2c, rt1015); 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); rt1015->regmap = devm_regmap_init_i2c(i2c, &rt1015_regmap);
if (IS_ERR(rt1015->regmap)) { if (IS_ERR(rt1015->regmap)) {
ret = PTR_ERR(rt1015->regmap); ret = PTR_ERR(rt1015->regmap);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#ifndef __RT1015_H__ #ifndef __RT1015_H__
#define __RT1015_H__ #define __RT1015_H__
#include <sound/rt1015.h>
#define RT1015_DEVICE_ID_VAL 0x1011 #define RT1015_DEVICE_ID_VAL 0x1011
#define RT1015_DEVICE_ID_VAL2 0x1015 #define RT1015_DEVICE_ID_VAL2 0x1015
...@@ -380,6 +381,7 @@ enum { ...@@ -380,6 +381,7 @@ enum {
struct rt1015_priv { struct rt1015_priv {
struct snd_soc_component *component; struct snd_soc_component *component;
struct rt1015_platform_data pdata;
struct regmap *regmap; struct regmap *regmap;
int sysclk; int sysclk;
int sysclk_src; int sysclk_src;
......
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