mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
ASoC: rt9120: Add the compatibility with rt9120s
Use device id reg to be compatible with rt9120 and rt9120s. Signed-off-by: ChiYuan Huang <cy_huang@richtek.com> Link: https://lore.kernel.org/r/1636515921-31694-4-git-send-email-u0084500@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
8f1f1846d7
commit
dbe638f71e
@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
@ -23,6 +24,7 @@
|
||||
#define RT9120_REG_ERRRPT 0x10
|
||||
#define RT9120_REG_MSVOL 0x20
|
||||
#define RT9120_REG_SWRESET 0x40
|
||||
#define RT9120_REG_INTERCFG 0x63
|
||||
#define RT9120_REG_INTERNAL0 0x65
|
||||
#define RT9120_REG_INTERNAL1 0x69
|
||||
#define RT9120_REG_UVPOPT 0x6C
|
||||
@ -49,7 +51,8 @@
|
||||
#define RT9120_DVDD_UVSEL_MASK GENMASK(5, 4)
|
||||
#define RT9120_AUTOSYNC_MASK BIT(6)
|
||||
|
||||
#define RT9120_VENDOR_ID 0x4200
|
||||
#define RT9120_VENDOR_ID 0x42
|
||||
#define RT9120S_VENDOR_ID 0x43
|
||||
#define RT9120_RESET_WAITMS 20
|
||||
#define RT9120_CHIPON_WAITMS 20
|
||||
#define RT9120_AMPON_WAITMS 50
|
||||
@ -63,9 +66,16 @@
|
||||
SNDRV_PCM_FMTBIT_S24_LE |\
|
||||
SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
enum {
|
||||
CHIP_IDX_RT9120 = 0,
|
||||
CHIP_IDX_RT9120S,
|
||||
CHIP_IDX_MAX
|
||||
};
|
||||
|
||||
struct rt9120_data {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
int chip_idx;
|
||||
};
|
||||
|
||||
/* 11bit [min,max,step] = [-103.9375dB, 24dB, 0.0625dB] */
|
||||
@ -151,7 +161,12 @@ static int rt9120_codec_probe(struct snd_soc_component *comp)
|
||||
snd_soc_component_init_regmap(comp, data->regmap);
|
||||
|
||||
/* Internal setting */
|
||||
snd_soc_component_write(comp, RT9120_REG_INTERNAL0, 0x04);
|
||||
if (data->chip_idx == CHIP_IDX_RT9120S) {
|
||||
snd_soc_component_write(comp, RT9120_REG_INTERCFG, 0xde);
|
||||
snd_soc_component_write(comp, RT9120_REG_INTERNAL0, 0x66);
|
||||
} else
|
||||
snd_soc_component_write(comp, RT9120_REG_INTERNAL0, 0x04);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -290,6 +305,7 @@ static const struct regmap_range rt9120_rd_yes_ranges[] = {
|
||||
regmap_reg_range(0x20, 0x27),
|
||||
regmap_reg_range(0x30, 0x38),
|
||||
regmap_reg_range(0x3A, 0x40),
|
||||
regmap_reg_range(0x63, 0x63),
|
||||
regmap_reg_range(0x65, 0x65),
|
||||
regmap_reg_range(0x69, 0x69),
|
||||
regmap_reg_range(0x6C, 0x6C),
|
||||
@ -309,6 +325,7 @@ static const struct regmap_range rt9120_wr_yes_ranges[] = {
|
||||
regmap_reg_range(0x30, 0x38),
|
||||
regmap_reg_range(0x3A, 0x3D),
|
||||
regmap_reg_range(0x40, 0x40),
|
||||
regmap_reg_range(0x63, 0x63),
|
||||
regmap_reg_range(0x65, 0x65),
|
||||
regmap_reg_range(0x69, 0x69),
|
||||
regmap_reg_range(0x6C, 0x6C),
|
||||
@ -401,8 +418,16 @@ static int rt9120_check_vendor_info(struct rt9120_data *data)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if ((devid & RT9120_VID_MASK) != RT9120_VENDOR_ID) {
|
||||
dev_err(data->dev, "DEVID not correct [0x%04x]\n", devid);
|
||||
devid = FIELD_GET(RT9120_VID_MASK, devid);
|
||||
switch (devid) {
|
||||
case RT9120_VENDOR_ID:
|
||||
data->chip_idx = CHIP_IDX_RT9120;
|
||||
break;
|
||||
case RT9120S_VENDOR_ID:
|
||||
data->chip_idx = CHIP_IDX_RT9120S;
|
||||
break;
|
||||
default:
|
||||
dev_err(data->dev, "DEVID not correct [0x%0x]\n", devid);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user