summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorBinyuan Lan <lby@rock-chips.com>2018-02-27 10:52:48 +0800
committerTao Huang <huangtao@rock-chips.com>2018-02-28 17:47:55 +0800
commitd23a54bc04475cbc0739431aea743db19bc78ec7 (patch)
treee22f62ffa2d2857782fa9f5c5b68bf9c8a3199e1 /sound
parentbd48cb28be4c9a4774d58742f47f1f48395126f5 (diff)
ASoC: rockchip: rk817-codec: add get_regmap and optimize the code
Change-Id: If6a810b3b9f2d192bf765ad28bcd6c9f4bfd5a9e Signed-off-by: Binyuan Lan <lby@rock-chips.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/rk817_codec.c123
1 files changed, 59 insertions, 64 deletions
diff --git a/sound/soc/codecs/rk817_codec.c b/sound/soc/codecs/rk817_codec.c
index 915019ad2a76..51514ca4819f 100644
--- a/sound/soc/codecs/rk817_codec.c
+++ b/sound/soc/codecs/rk817_codec.c
@@ -82,8 +82,6 @@ struct rk817_codec_priv {
long int capture_path;
};
-static struct rk817_codec_priv *rk817_priv;
-
static const struct reg_default rk817_reg_defaults[] = {
{ RK817_CODEC_DTOP_VUCTL, 0x003 },
{ RK817_CODEC_DTOP_VUCTIME, 0x00 },
@@ -218,14 +216,6 @@ static bool rk817_codec_register(struct device *dev, unsigned int reg)
}
}
-static int rk817_reset(struct snd_soc_codec *codec)
-{
- snd_soc_write(codec, RK817_CODEC_DTOP_LPT_SRST, 0x40);
- mdelay(10);
-
- return 0;
-}
-
static struct rk817_reg_val_typ playback_power_up_list[] = {
{RK817_CODEC_AREF_RTCFG1, 0x40},
{RK817_CODEC_DDAC_POPD_DACST, 0x02},
@@ -306,14 +296,11 @@ static struct rk817_reg_val_typ capture_power_down_list[] = {
#define RK817_CODEC_CAPTURE_POWER_DOWN_LIST_LEN \
ARRAY_SIZE(capture_power_down_list)
-static int rk817_codec_power_up(int type)
+static int rk817_codec_power_up(struct snd_soc_codec *codec, int type)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
- struct snd_soc_codec *codec;
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
int i;
- codec = rk817->codec;
-
DBG("%s : power up %s %s %s\n", __func__,
type & RK817_CODEC_PLAYBACK ? "playback" : "",
type & RK817_CODEC_CAPTURE ? "capture" : "",
@@ -356,14 +343,10 @@ static int rk817_codec_power_up(int type)
return 0;
}
-static int rk817_codec_power_down(int type)
+static int rk817_codec_power_down(struct snd_soc_codec *codec, int type)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
- struct snd_soc_codec *codec;
int i;
- codec = rk817->codec;
-
DBG("%s : power down %s %s %s\n", __func__,
type & RK817_CODEC_PLAYBACK ? "playback" : "",
type & RK817_CODEC_CAPTURE ? "capture" : "",
@@ -395,7 +378,15 @@ static int rk817_codec_power_down(int type)
}
if (type == RK817_CODEC_ALL) {
- rk817_reset(codec);
+ for (i = 0; i < RK817_CODEC_PLAYBACK_POWER_DOWN_LIST_LEN; i++) {
+ snd_soc_write(codec, playback_power_down_list[i].reg,
+ playback_power_down_list[i].value);
+ }
+ for (i = 0; i < RK817_CODEC_CAPTURE_POWER_DOWN_LIST_LEN; i++) {
+ snd_soc_write(codec, capture_power_down_list[i].reg,
+ capture_power_down_list[i].value);
+ }
+ snd_soc_write(codec, RK817_CODEC_DTOP_DIGEN_CLKE, 0x00);
snd_soc_write(codec, RK817_CODEC_APLL_CFG5, 0x01);
snd_soc_write(codec, RK817_CODEC_AREF_RTCFG1, 0x06);
}
@@ -431,7 +422,8 @@ static SOC_ENUM_SINGLE_DECL(rk817_modem_input_type,
static int rk817_playback_path_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
DBG("%s : playback_path %ld\n", __func__, rk817->playback_path);
@@ -443,12 +435,10 @@ static int rk817_playback_path_get(struct snd_kcontrol *kcontrol,
static int rk817_playback_path_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
- struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
long int pre_path;
- codec->component.regmap = rk817_priv->regmap;
-
if (rk817->playback_path == ucontrol->value.integer.value[0]) {
DBG("%s : playback_path is not changed!\n",
__func__);
@@ -465,14 +455,17 @@ static int rk817_playback_path_put(struct snd_kcontrol *kcontrol,
case OFF:
if (pre_path != OFF && (pre_path != HP_PATH &&
pre_path != HP_NO_MIC && pre_path != RING_HP &&
- pre_path != RING_HP_NO_MIC))
- rk817_codec_power_down(RK817_CODEC_PLAYBACK);
+ pre_path != RING_HP_NO_MIC)) {
+ rk817_codec_power_down(codec, RK817_CODEC_PLAYBACK);
+ if (rk817->capture_path == 0)
+ rk817_codec_power_down(codec, RK817_CODEC_ALL);
+ }
break;
case RCV:
case SPK_PATH:
case RING_SPK:
if (pre_path == OFF)
- rk817_codec_power_up(RK817_CODEC_PLAYBACK);
+ rk817_codec_power_up(codec, RK817_CODEC_PLAYBACK);
/* power on dac ibias/l/r */
snd_soc_write(codec, RK817_CODEC_ADAC_CFG1,
PWD_DACBIAS_ON | PWD_DACD_ON |
@@ -492,7 +485,7 @@ static int rk817_playback_path_put(struct snd_kcontrol *kcontrol,
case RING_HP:
case RING_HP_NO_MIC:
if (pre_path == OFF)
- rk817_codec_power_up(RK817_CODEC_PLAYBACK);
+ rk817_codec_power_up(codec, RK817_CODEC_PLAYBACK);
/* HP_CP_EN , CP 2.3V */
snd_soc_write(codec, RK817_CODEC_AHP_CP, 0x11);
/* power on HP two stage opamp ,HP amplitude 0db */
@@ -512,7 +505,7 @@ static int rk817_playback_path_put(struct snd_kcontrol *kcontrol,
case SPK_HP:
case RING_SPK_HP:
if (pre_path == OFF)
- rk817_codec_power_up(RK817_CODEC_PLAYBACK);
+ rk817_codec_power_up(codec, RK817_CODEC_PLAYBACK);
/* HP_CP_EN , CP 2.3V */
snd_soc_write(codec, RK817_CODEC_AHP_CP, 0x11);
/* power on HP two stage opamp ,HP amplitude 0db */
@@ -542,7 +535,8 @@ static int rk817_playback_path_put(struct snd_kcontrol *kcontrol,
static int rk817_capture_path_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
DBG("%s : capture_path %ld\n", __func__,
rk817->capture_path);
@@ -555,12 +549,10 @@ static int rk817_capture_path_get(struct snd_kcontrol *kcontrol,
static int rk817_capture_path_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
- struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
long int pre_path;
- codec->component.regmap = rk817_priv->regmap;
-
if (rk817->capture_path == ucontrol->value.integer.value[0]) {
DBG("%s : capture_path is not changed!\n",
__func__);
@@ -576,11 +568,11 @@ static int rk817_capture_path_put(struct snd_kcontrol *kcontrol,
switch (rk817->capture_path) {
case MIC_OFF:
if (pre_path != MIC_OFF)
- rk817_codec_power_down(RK817_CODEC_CAPTURE);
+ rk817_codec_power_down(codec, RK817_CODEC_CAPTURE);
break;
case MAIN_MIC:
if (pre_path == MIC_OFF)
- rk817_codec_power_up(RK817_CODEC_CAPTURE);
+ rk817_codec_power_up(codec, RK817_CODEC_CAPTURE);
if (!rk817->mic_in_differential) {
snd_soc_write(codec, RK817_CODEC_DADC_VOLR, 0xff);
@@ -592,7 +584,7 @@ static int rk817_capture_path_put(struct snd_kcontrol *kcontrol,
break;
case HANDS_FREE_MIC:
if (pre_path == MIC_OFF)
- rk817_codec_power_up(RK817_CODEC_CAPTURE);
+ rk817_codec_power_up(codec, RK817_CODEC_CAPTURE);
if (!rk817->mic_in_differential) {
snd_soc_write(codec, RK817_CODEC_DADC_VOLL, 0xff);
@@ -622,7 +614,8 @@ static struct snd_kcontrol_new rk817_snd_path_controls[] = {
static int rk817_set_dai_sysclk(struct snd_soc_dai *codec_dai,
int clk_id, unsigned int freq, int dir)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct snd_soc_codec *codec = codec_dai->codec;
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
rk817->stereo_sysclk = freq;
@@ -664,7 +657,7 @@ static int rk817_hw_params(struct snd_pcm_substream *substream,
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_codec *codec = rtd->codec;
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
unsigned int rate = params_rate(params);
DBG("%s : MCLK = %dHz, sample rate = %dHz\n",
@@ -751,7 +744,7 @@ static struct snd_soc_dai_driver rk817_dai[] = {
static int rk817_suspend(struct snd_soc_codec *codec)
{
- rk817_codec_power_down(RK817_CODEC_ALL);
+ rk817_codec_power_down(codec, RK817_CODEC_ALL);
return 0;
}
@@ -762,7 +755,7 @@ static int rk817_resume(struct snd_soc_codec *codec)
static int rk817_probe(struct snd_soc_codec *codec)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
DBG("%s\n", __func__);
@@ -771,13 +764,10 @@ static int rk817_probe(struct snd_soc_codec *codec)
__func__);
return -EINVAL;
}
- codec->component.regmap = rk817_priv->regmap;
rk817->codec = codec;
rk817->playback_path = OFF;
rk817->capture_path = MIC_OFF;
- rk817_reset(codec);
-
snd_soc_add_codec_controls(codec, rk817_snd_path_controls,
ARRAY_SIZE(rk817_snd_path_controls));
return 0;
@@ -786,26 +776,34 @@ static int rk817_probe(struct snd_soc_codec *codec)
/* power down chip */
static int rk817_remove(struct snd_soc_codec *codec)
{
- struct rk817_codec_priv *rk817 = rk817_priv;
+ struct rk817_codec_priv *rk817 = snd_soc_codec_get_drvdata(codec);
DBG("%s\n", __func__);
if (!rk817) {
- dev_err(codec->dev, "%s : rk817_priv is NULL\n", __func__);
+ dev_err(codec->dev, "%s : rk817 is NULL\n", __func__);
return 0;
}
- rk817_codec_power_down(RK817_CODEC_ALL);
+ rk817_codec_power_down(codec, RK817_CODEC_ALL);
mdelay(10);
return 0;
}
+static struct regmap *rk817_get_regmap(struct device *dev)
+{
+ struct rk817_codec_priv *rk817 = dev_get_drvdata(dev);
+
+ return rk817->regmap;
+}
+
static struct snd_soc_codec_driver soc_codec_dev_rk817 = {
- .probe = rk817_probe,
- .remove = rk817_remove,
- .suspend = rk817_suspend,
- .resume = rk817_resume,
+ .probe = rk817_probe,
+ .remove = rk817_remove,
+ .get_regmap = rk817_get_regmap,
+ .suspend = rk817_suspend,
+ .resume = rk817_resume,
};
static int rk817_codec_parse_dt_property(struct device *dev,
@@ -871,7 +869,7 @@ static const struct regmap_config rk817_codec_regmap_config = {
.reg_stride = 1,
.max_register = 0x4f,
.cache_type = REGCACHE_NONE,
- .volatile_reg = rk817_volatile_register,
+ .volatile_reg = rk817_volatile_register,
.writeable_reg = rk817_codec_register,
.readable_reg = rk817_codec_register,
.reg_defaults = rk817_reg_defaults,
@@ -897,7 +895,6 @@ static int rk817_platform_probe(struct platform_device *pdev)
if (!rk817_codec_data)
return -ENOMEM;
- rk817_priv = rk817_codec_data;
platform_set_drvdata(pdev, rk817_codec_data);
ret = rk817_codec_parse_dt_property(&pdev->dev, rk817_codec_data);
@@ -935,31 +932,29 @@ static int rk817_platform_probe(struct platform_device *pdev)
return 0;
err_:
- rk817_priv = NULL;
-
return ret;
}
static int rk817_platform_remove(struct platform_device *pdev)
{
- if (!IS_ERR(rk817_priv->mclk))
- clk_disable_unprepare(rk817_priv->mclk);
+ struct rk817_codec_priv *rk817 = dev_get_drvdata(&pdev->dev);
- snd_soc_unregister_codec(&pdev->dev);
+ if (!IS_ERR(rk817->mclk))
+ clk_disable_unprepare(rk817->mclk);
- rk817_priv = NULL;
+ snd_soc_unregister_codec(&pdev->dev);
return 0;
}
static void rk817_platform_shutdown(struct platform_device *pdev)
{
+ struct rk817_codec_priv *rk817 = dev_get_drvdata(&pdev->dev);
+
DBG("%s\n", __func__);
- rk817_codec_power_down(RK817_CODEC_ALL);
+ rk817_codec_power_down(rk817->codec, RK817_CODEC_ALL);
- if (rk817_priv)
- rk817_priv = NULL;
}
static const struct of_device_id rk817_codec_dt_ids[] = {