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

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

parent f9d7c6eb
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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>;
};

include/sound/rt1015.h

0 → 100644
+15 −0
Original line number Diff line number Diff line
/* 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
+20 −0
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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;