summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-03-30 21:40:31 +0300
committerMark Brown <broonie@kernel.org>2026-03-30 21:40:31 +0300
commit18cc8cc30b71feaec4d80724917f91782987a4a7 (patch)
treeb0a5c0bb153908370ec4c227644a3b5b8bd67933
parentb81f63108250818ed17fc7df9fdf9a7fb84f3f69 (diff)
parent7dcb79e5c03f2df84f780469a10e92c6a126314f (diff)
downloadlinux-18cc8cc30b71feaec4d80724917f91782987a4a7.tar.xz
ASoC: jz47xx: Convert to devm_clk_get_enabled()
Jihed Chaibi <jihed.chaibi.dev@gmail.com> says: The jz4725b, jz4760 and jz4770 Ingenic codec drivers all share the same clock management pattern: the clock is obtained with devm_clk_get() in the platform probe, then manually enabled in the component probe and disabled in the component remove. The clk_prepare_enable() call in the component probe is unchecked, meaning clock enable failures are silently ignored and can lead to register access on unpowered hardware. This series converts all three drivers to devm_clk_get_enabled(), which combines the get, prepare and enable steps and ties the clock lifetime to the device via devres. The now-redundant component remove callbacks and the struct clk pointers in the private structs are removed.
-rw-r--r--sound/soc/codecs/jz4725b.c18
-rw-r--r--sound/soc/codecs/jz4760.c20
-rw-r--r--sound/soc/codecs/jz4770.c20
3 files changed, 12 insertions, 46 deletions
diff --git a/sound/soc/codecs/jz4725b.c b/sound/soc/codecs/jz4725b.c
index 39cebaa167be..8a7d26a08c03 100644
--- a/sound/soc/codecs/jz4725b.c
+++ b/sound/soc/codecs/jz4725b.c
@@ -160,7 +160,6 @@ enum {
struct jz_icdc {
struct regmap *regmap;
void __iomem *base;
- struct clk *clk;
};
static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(jz4725b_adc_tlv, 0, 150, 0);
@@ -405,8 +404,6 @@ static int jz4725b_codec_dev_probe(struct snd_soc_component *component)
struct jz_icdc *icdc = snd_soc_component_get_drvdata(component);
struct regmap *map = icdc->regmap;
- clk_prepare_enable(icdc->clk);
-
/* Write CONFIGn (n=1 to 8) bits.
* The value 0x0f is specified in the datasheet as a requirement.
*/
@@ -418,16 +415,8 @@ static int jz4725b_codec_dev_probe(struct snd_soc_component *component)
return 0;
}
-static void jz4725b_codec_dev_remove(struct snd_soc_component *component)
-{
- struct jz_icdc *icdc = snd_soc_component_get_drvdata(component);
-
- clk_disable_unprepare(icdc->clk);
-}
-
static const struct snd_soc_component_driver jz4725b_codec = {
.probe = jz4725b_codec_dev_probe,
- .remove = jz4725b_codec_dev_remove,
.set_bias_level = jz4725b_codec_set_bias_level,
.controls = jz4725b_codec_controls,
.num_controls = ARRAY_SIZE(jz4725b_codec_controls),
@@ -618,6 +607,7 @@ static int jz4725b_codec_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct jz_icdc *icdc;
+ struct clk *clk;
int ret;
icdc = devm_kzalloc(dev, sizeof(*icdc), GFP_KERNEL);
@@ -633,9 +623,9 @@ static int jz4725b_codec_probe(struct platform_device *pdev)
if (IS_ERR(icdc->regmap))
return PTR_ERR(icdc->regmap);
- icdc->clk = devm_clk_get(&pdev->dev, "aic");
- if (IS_ERR(icdc->clk))
- return PTR_ERR(icdc->clk);
+ clk = devm_clk_get_enabled(dev, "aic");
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
platform_set_drvdata(pdev, icdc);
diff --git a/sound/soc/codecs/jz4760.c b/sound/soc/codecs/jz4760.c
index 344c251be397..6846ace06415 100644
--- a/sound/soc/codecs/jz4760.c
+++ b/sound/soc/codecs/jz4760.c
@@ -163,7 +163,6 @@ struct jz_codec {
struct device *dev;
struct regmap *regmap;
void __iomem *base;
- struct clk *clk;
};
static int jz4760_codec_set_bias_level(struct snd_soc_component *codec,
@@ -602,25 +601,13 @@ static void jz4760_codec_codec_init_regs(struct snd_soc_component *codec)
static int jz4760_codec_codec_probe(struct snd_soc_component *codec)
{
- struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
-
- clk_prepare_enable(jz_codec->clk);
-
jz4760_codec_codec_init_regs(codec);
return 0;
}
-static void jz4760_codec_codec_remove(struct snd_soc_component *codec)
-{
- struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
-
- clk_disable_unprepare(jz_codec->clk);
-}
-
static const struct snd_soc_component_driver jz4760_codec_soc_codec_dev = {
.probe = jz4760_codec_codec_probe,
- .remove = jz4760_codec_codec_remove,
.set_bias_level = jz4760_codec_set_bias_level,
.controls = jz4760_codec_snd_controls,
.num_controls = ARRAY_SIZE(jz4760_codec_snd_controls),
@@ -818,6 +805,7 @@ static int jz4760_codec_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct jz_codec *codec;
+ struct clk *clk;
int ret;
codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL);
@@ -835,9 +823,9 @@ static int jz4760_codec_probe(struct platform_device *pdev)
if (IS_ERR(codec->regmap))
return PTR_ERR(codec->regmap);
- codec->clk = devm_clk_get(dev, "aic");
- if (IS_ERR(codec->clk))
- return PTR_ERR(codec->clk);
+ clk = devm_clk_get_enabled(dev, "aic");
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
platform_set_drvdata(pdev, codec);
diff --git a/sound/soc/codecs/jz4770.c b/sound/soc/codecs/jz4770.c
index 6b86d47028d7..be1ecdcc737b 100644
--- a/sound/soc/codecs/jz4770.c
+++ b/sound/soc/codecs/jz4770.c
@@ -179,7 +179,6 @@ struct jz_codec {
struct device *dev;
struct regmap *regmap;
void __iomem *base;
- struct clk *clk;
};
static int jz4770_codec_set_bias_level(struct snd_soc_component *codec,
@@ -634,25 +633,13 @@ static void jz4770_codec_codec_init_regs(struct snd_soc_component *codec)
static int jz4770_codec_codec_probe(struct snd_soc_component *codec)
{
- struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
-
- clk_prepare_enable(jz_codec->clk);
-
jz4770_codec_codec_init_regs(codec);
return 0;
}
-static void jz4770_codec_codec_remove(struct snd_soc_component *codec)
-{
- struct jz_codec *jz_codec = snd_soc_component_get_drvdata(codec);
-
- clk_disable_unprepare(jz_codec->clk);
-}
-
static const struct snd_soc_component_driver jz4770_codec_soc_codec_dev = {
.probe = jz4770_codec_codec_probe,
- .remove = jz4770_codec_codec_remove,
.set_bias_level = jz4770_codec_set_bias_level,
.controls = jz4770_codec_snd_controls,
.num_controls = ARRAY_SIZE(jz4770_codec_snd_controls),
@@ -865,6 +852,7 @@ static int jz4770_codec_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct jz_codec *codec;
+ struct clk *clk;
int ret;
codec = devm_kzalloc(dev, sizeof(*codec), GFP_KERNEL);
@@ -882,9 +870,9 @@ static int jz4770_codec_probe(struct platform_device *pdev)
if (IS_ERR(codec->regmap))
return PTR_ERR(codec->regmap);
- codec->clk = devm_clk_get(dev, "aic");
- if (IS_ERR(codec->clk))
- return PTR_ERR(codec->clk);
+ clk = devm_clk_get_enabled(dev, "aic");
+ if (IS_ERR(clk))
+ return PTR_ERR(clk);
platform_set_drvdata(pdev, codec);