Commit aecd1fbe authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge tag 'asoc-fix-v5.10-rc4' of...

Merge tag 'asoc-fix-v5.10-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v5.11

A collection of driver specific fixes, mostly for x86 systems (or CODECs
used mostly on x86) and all for relatively minor issues, the biggest one
being fixing S24_LE format on Keem Bay systems.
parents d21b96c8 879ee8b6
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
+21 −1
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 },
@@ -539,7 +544,7 @@ static void rt1015_flush_work(struct work_struct *work)
	struct rt1015_priv *rt1015 = container_of(work, struct rt1015_priv,
						flush_work.work);
	struct snd_soc_component *component = rt1015->component;
	unsigned int val, i = 0, count = 20;
	unsigned int val, i = 0, count = 200;

	while (i < count) {
		usleep_range(1000, 1500);
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -700,6 +700,8 @@ static int kabylake_set_bias_level(struct snd_soc_card *card,
	switch (level) {
	case SND_SOC_BIAS_PREPARE:
		if (dapm->bias_level == SND_SOC_BIAS_ON) {
			if (!__clk_is_enabled(priv->mclk))
				return 0;
			dev_dbg(card->dev, "Disable mclk");
			clk_disable_unprepare(priv->mclk);
		} else {
Loading