ASoC: rt1308-sdw: get BQ params property and apply them
authorShuming Fan <shumingf@realtek.com>
Wed, 9 Nov 2022 09:12:34 +0000 (17:12 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 10 Nov 2022 20:42:21 +0000 (20:42 +0000)
If the machine driver level sets the BQ params into the device property,
the codec driver will get the BQ params and apply them.

Signed-off-by: Shuming Fan <shumingf@realtek.com>
Reviewed-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
Link: https://lore.kernel.org/r/20221109091234.17180-1-shumingf@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt1308-sdw.c
sound/soc/codecs/rt1308-sdw.h

index f99aed353f10c8d226b94e6e01bb60fa7dbe3d7c..7f4248284f35e8fb550e870fecc0f26599f14d17 100644 (file)
@@ -197,6 +197,17 @@ static void rt1308_apply_calib_params(struct rt1308_sdw_priv *rt1308)
                efuse_c_btl_l, efuse_c_btl_r);
 }
 
+static void rt1308_apply_bq_params(struct rt1308_sdw_priv *rt1308)
+{
+       unsigned int i, reg, data;
+
+       for (i = 0; i < rt1308->bq_params_cnt; i += 3) {
+               reg = rt1308->bq_params[i] | (rt1308->bq_params[i + 1] << 8);
+               data = rt1308->bq_params[i + 2];
+               regmap_write(rt1308->regmap, reg, data);
+       }
+}
+
 static int rt1308_io_init(struct device *dev, struct sdw_slave *slave)
 {
        struct rt1308_sdw_priv *rt1308 = dev_get_drvdata(dev);
@@ -619,14 +630,42 @@ static const struct sdw_slave_ops rt1308_slave_ops = {
        .bus_config = rt1308_bus_config,
 };
 
+static int rt1308_sdw_parse_dt(struct rt1308_sdw_priv *rt1308, struct device *dev)
+{
+       int ret = 0;
+
+       device_property_read_u32(dev, "realtek,bq-params-cnt", &rt1308->bq_params_cnt);
+       if (rt1308->bq_params_cnt) {
+               rt1308->bq_params = devm_kzalloc(dev, rt1308->bq_params_cnt, GFP_KERNEL);
+               if (!rt1308->bq_params) {
+                       dev_err(dev, "Could not allocate bq_params memory\n");
+                       ret = -ENOMEM;
+               } else {
+                       ret = device_property_read_u8_array(dev, "realtek,bq-params", rt1308->bq_params, rt1308->bq_params_cnt);
+                       if (ret < 0)
+                               dev_err(dev, "Could not read list of realtek,bq-params\n");
+               }
+       }
+
+       dev_dbg(dev, "bq_params_cnt=%d\n", rt1308->bq_params_cnt);
+       return ret;
+}
+
 static int rt1308_sdw_component_probe(struct snd_soc_component *component)
 {
+       struct rt1308_sdw_priv *rt1308 = snd_soc_component_get_drvdata(component);
        int ret;
 
+       rt1308->component = component;
+       rt1308_sdw_parse_dt(rt1308, &rt1308->sdw_slave->dev);
+
        ret = pm_runtime_resume(component->dev);
        if (ret < 0 && ret != -EACCES)
                return ret;
 
+       /* apply BQ params */
+       rt1308_apply_bq_params(rt1308);
+
        return 0;
 }
 
index 62ce277993075eb63409e4548d6c9c48bc9b6f66..1eaaef9f351b296643772364c1bd739141487f1b 100644 (file)
@@ -166,6 +166,8 @@ struct rt1308_sdw_priv {
        int rx_mask;
        int slots;
        int hw_ver;
+       unsigned char *bq_params;
+       unsigned int bq_params_cnt;
 };
 
 struct sdw_stream_data {