Commit dbe638f7 authored by ChiYuan Huang's avatar ChiYuan Huang Committed by Mark Brown

ASoC: rt9120: Add the compatibility with rt9120s

Use device id reg to be compatible with rt9120 and rt9120s.
Signed-off-by: default avatarChiYuan Huang <cy_huang@richtek.com>
Link: https://lore.kernel.org/r/1636515921-31694-4-git-send-email-u0084500@gmail.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 8f1f1846
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/bits.h> #include <linux/bits.h>
#include <linux/bitfield.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gpio/consumer.h> #include <linux/gpio/consumer.h>
#include <linux/i2c.h> #include <linux/i2c.h>
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
#define RT9120_REG_ERRRPT 0x10 #define RT9120_REG_ERRRPT 0x10
#define RT9120_REG_MSVOL 0x20 #define RT9120_REG_MSVOL 0x20
#define RT9120_REG_SWRESET 0x40 #define RT9120_REG_SWRESET 0x40
#define RT9120_REG_INTERCFG 0x63
#define RT9120_REG_INTERNAL0 0x65 #define RT9120_REG_INTERNAL0 0x65
#define RT9120_REG_INTERNAL1 0x69 #define RT9120_REG_INTERNAL1 0x69
#define RT9120_REG_UVPOPT 0x6C #define RT9120_REG_UVPOPT 0x6C
...@@ -49,7 +51,8 @@ ...@@ -49,7 +51,8 @@
#define RT9120_DVDD_UVSEL_MASK GENMASK(5, 4) #define RT9120_DVDD_UVSEL_MASK GENMASK(5, 4)
#define RT9120_AUTOSYNC_MASK BIT(6) #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_RESET_WAITMS 20
#define RT9120_CHIPON_WAITMS 20 #define RT9120_CHIPON_WAITMS 20
#define RT9120_AMPON_WAITMS 50 #define RT9120_AMPON_WAITMS 50
...@@ -63,9 +66,16 @@ ...@@ -63,9 +66,16 @@
SNDRV_PCM_FMTBIT_S24_LE |\ SNDRV_PCM_FMTBIT_S24_LE |\
SNDRV_PCM_FMTBIT_S32_LE) SNDRV_PCM_FMTBIT_S32_LE)
enum {
CHIP_IDX_RT9120 = 0,
CHIP_IDX_RT9120S,
CHIP_IDX_MAX
};
struct rt9120_data { struct rt9120_data {
struct device *dev; struct device *dev;
struct regmap *regmap; struct regmap *regmap;
int chip_idx;
}; };
/* 11bit [min,max,step] = [-103.9375dB, 24dB, 0.0625dB] */ /* 11bit [min,max,step] = [-103.9375dB, 24dB, 0.0625dB] */
...@@ -151,7 +161,12 @@ static int rt9120_codec_probe(struct snd_soc_component *comp) ...@@ -151,7 +161,12 @@ static int rt9120_codec_probe(struct snd_soc_component *comp)
snd_soc_component_init_regmap(comp, data->regmap); snd_soc_component_init_regmap(comp, data->regmap);
/* Internal setting */ /* 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; return 0;
} }
...@@ -290,6 +305,7 @@ static const struct regmap_range rt9120_rd_yes_ranges[] = { ...@@ -290,6 +305,7 @@ static const struct regmap_range rt9120_rd_yes_ranges[] = {
regmap_reg_range(0x20, 0x27), regmap_reg_range(0x20, 0x27),
regmap_reg_range(0x30, 0x38), regmap_reg_range(0x30, 0x38),
regmap_reg_range(0x3A, 0x40), regmap_reg_range(0x3A, 0x40),
regmap_reg_range(0x63, 0x63),
regmap_reg_range(0x65, 0x65), regmap_reg_range(0x65, 0x65),
regmap_reg_range(0x69, 0x69), regmap_reg_range(0x69, 0x69),
regmap_reg_range(0x6C, 0x6C), regmap_reg_range(0x6C, 0x6C),
...@@ -309,6 +325,7 @@ static const struct regmap_range rt9120_wr_yes_ranges[] = { ...@@ -309,6 +325,7 @@ static const struct regmap_range rt9120_wr_yes_ranges[] = {
regmap_reg_range(0x30, 0x38), regmap_reg_range(0x30, 0x38),
regmap_reg_range(0x3A, 0x3D), regmap_reg_range(0x3A, 0x3D),
regmap_reg_range(0x40, 0x40), regmap_reg_range(0x40, 0x40),
regmap_reg_range(0x63, 0x63),
regmap_reg_range(0x65, 0x65), regmap_reg_range(0x65, 0x65),
regmap_reg_range(0x69, 0x69), regmap_reg_range(0x69, 0x69),
regmap_reg_range(0x6C, 0x6C), regmap_reg_range(0x6C, 0x6C),
...@@ -401,8 +418,16 @@ static int rt9120_check_vendor_info(struct rt9120_data *data) ...@@ -401,8 +418,16 @@ static int rt9120_check_vendor_info(struct rt9120_data *data)
if (ret) if (ret)
return ret; return ret;
if ((devid & RT9120_VID_MASK) != RT9120_VENDOR_ID) { devid = FIELD_GET(RT9120_VID_MASK, devid);
dev_err(data->dev, "DEVID not correct [0x%04x]\n", 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; return -ENODEV;
} }
......
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