ASoC: cs35l41: Create shared function for boost configuration
authorLucas Tanure <tanureal@opensource.cirrus.com>
Fri, 17 Dec 2021 11:57:04 +0000 (11:57 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 31 Dec 2021 13:21:06 +0000 (13:21 +0000)
ASoC and HDA will use the same registers to configure
internal boost for the device

Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20211217115708.882525-7-tanureal@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/cs35l41.h
sound/soc/codecs/cs35l41-lib.c
sound/soc/codecs/cs35l41.c

index 39d150f..29a5274 100644 (file)
@@ -767,5 +767,7 @@ int cs35l41_register_errata_patch(struct device *dev, struct regmap *reg, unsign
 int cs35l41_set_channels(struct device *dev, struct regmap *reg,
                         unsigned int tx_num, unsigned int *tx_slot,
                         unsigned int rx_num, unsigned int *rx_slot);
+int cs35l41_boost_config(struct device *dev, struct regmap *regmap, int boost_ind, int boost_cap,
+                        int boost_ipk);
 
 #endif /* __CS35L41_H */
index afcec71..d026c5e 100644 (file)
@@ -966,6 +966,104 @@ int cs35l41_set_channels(struct device *dev, struct regmap *reg,
 }
 EXPORT_SYMBOL_GPL(cs35l41_set_channels);
 
+static const unsigned char cs35l41_bst_k1_table[4][5] = {
+       { 0x24, 0x32, 0x32, 0x4F, 0x57 },
+       { 0x24, 0x32, 0x32, 0x4F, 0x57 },
+       { 0x40, 0x32, 0x32, 0x4F, 0x57 },
+       { 0x40, 0x32, 0x32, 0x4F, 0x57 }
+};
+
+static const unsigned char cs35l41_bst_k2_table[4][5] = {
+       { 0x24, 0x49, 0x66, 0xA3, 0xEA },
+       { 0x24, 0x49, 0x66, 0xA3, 0xEA },
+       { 0x48, 0x49, 0x66, 0xA3, 0xEA },
+       { 0x48, 0x49, 0x66, 0xA3, 0xEA }
+};
+
+static const unsigned char cs35l41_bst_slope_table[4] = {
+       0x75, 0x6B, 0x3B, 0x28
+};
+
+
+int cs35l41_boost_config(struct device *dev, struct regmap *regmap, int boost_ind, int boost_cap,
+                        int boost_ipk)
+{
+       unsigned char bst_lbst_val, bst_cbst_range, bst_ipk_scaled;
+       int ret;
+
+       switch (boost_ind) {
+       case 1000:      /* 1.0 uH */
+               bst_lbst_val = 0;
+               break;
+       case 1200:      /* 1.2 uH */
+               bst_lbst_val = 1;
+               break;
+       case 1500:      /* 1.5 uH */
+               bst_lbst_val = 2;
+               break;
+       case 2200:      /* 2.2 uH */
+               bst_lbst_val = 3;
+               break;
+       default:
+               dev_err(dev, "Invalid boost inductor value: %d nH\n", boost_ind);
+               return -EINVAL;
+       }
+
+       switch (boost_cap) {
+       case 0 ... 19:
+               bst_cbst_range = 0;
+               break;
+       case 20 ... 50:
+               bst_cbst_range = 1;
+               break;
+       case 51 ... 100:
+               bst_cbst_range = 2;
+               break;
+       case 101 ... 200:
+               bst_cbst_range = 3;
+               break;
+       default:        /* 201 uF and greater */
+               bst_cbst_range = 4;
+       }
+
+       ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_COEFF,
+                                CS35L41_BST_K1_MASK | CS35L41_BST_K2_MASK,
+                                cs35l41_bst_k1_table[bst_lbst_val][bst_cbst_range]
+                                       << CS35L41_BST_K1_SHIFT |
+                                cs35l41_bst_k2_table[bst_lbst_val][bst_cbst_range]
+                                       << CS35L41_BST_K2_SHIFT);
+       if (ret) {
+               dev_err(dev, "Failed to write boost coefficients: %d\n", ret);
+               return ret;
+       }
+
+       ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_SLOPE_LBST,
+                                CS35L41_BST_SLOPE_MASK | CS35L41_BST_LBST_VAL_MASK,
+                                cs35l41_bst_slope_table[bst_lbst_val]
+                                       << CS35L41_BST_SLOPE_SHIFT |
+                                bst_lbst_val << CS35L41_BST_LBST_VAL_SHIFT);
+       if (ret) {
+               dev_err(dev, "Failed to write boost slope/inductor value: %d\n", ret);
+               return ret;
+       }
+
+       if (boost_ipk < 1600 || boost_ipk > 4500) {
+               dev_err(dev, "Invalid boost inductor peak current: %d mA\n", boost_ipk);
+               return -EINVAL;
+       }
+       bst_ipk_scaled = ((boost_ipk - 1600) / 50) + 0x10;
+
+       ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_PEAK_CUR, CS35L41_BST_IPK_MASK,
+                                bst_ipk_scaled << CS35L41_BST_IPK_SHIFT);
+       if (ret) {
+               dev_err(dev, "Failed to write boost inductor peak current: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cs35l41_boost_config);
+
 MODULE_DESCRIPTION("CS35L41 library");
 MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, <david.rhodes@cirrus.com>");
 MODULE_AUTHOR("Lucas Tanure, Cirrus Logic Inc, <tanureal@opensource.cirrus.com>");
index 88d6e77..d9e6e84 100644 (file)
@@ -150,24 +150,6 @@ static const struct cs35l41_fs_mon_config cs35l41_fs_mon[] = {
        { 6144000,      16,     24 },
 };
 
-static const unsigned char cs35l41_bst_k1_table[4][5] = {
-       { 0x24, 0x32, 0x32, 0x4F, 0x57 },
-       { 0x24, 0x32, 0x32, 0x4F, 0x57 },
-       { 0x40, 0x32, 0x32, 0x4F, 0x57 },
-       { 0x40, 0x32, 0x32, 0x4F, 0x57 }
-};
-
-static const unsigned char cs35l41_bst_k2_table[4][5] = {
-       { 0x24, 0x49, 0x66, 0xA3, 0xEA },
-       { 0x24, 0x49, 0x66, 0xA3, 0xEA },
-       { 0x48, 0x49, 0x66, 0xA3, 0xEA },
-       { 0x48, 0x49, 0x66, 0xA3, 0xEA }
-};
-
-static const unsigned char cs35l41_bst_slope_table[4] = {
-       0x75, 0x6B, 0x3B, 0x28
-};
-
 static int cs35l41_get_fs_mon_config_index(int freq)
 {
        int i;
@@ -992,88 +974,6 @@ static int cs35l41_dai_set_sysclk(struct snd_soc_dai *dai,
        return 0;
 }
 
-static int cs35l41_boost_config(struct cs35l41_private *cs35l41,
-                               int boost_ind, int boost_cap, int boost_ipk)
-{
-       unsigned char bst_lbst_val, bst_cbst_range, bst_ipk_scaled;
-       struct regmap *regmap = cs35l41->regmap;
-       struct device *dev = cs35l41->dev;
-       int ret;
-
-       switch (boost_ind) {
-       case 1000:      /* 1.0 uH */
-               bst_lbst_val = 0;
-               break;
-       case 1200:      /* 1.2 uH */
-               bst_lbst_val = 1;
-               break;
-       case 1500:      /* 1.5 uH */
-               bst_lbst_val = 2;
-               break;
-       case 2200:      /* 2.2 uH */
-               bst_lbst_val = 3;
-               break;
-       default:
-               dev_err(dev, "Invalid boost inductor value: %d nH\n", boost_ind);
-               return -EINVAL;
-       }
-
-       switch (boost_cap) {
-       case 0 ... 19:
-               bst_cbst_range = 0;
-               break;
-       case 20 ... 50:
-               bst_cbst_range = 1;
-               break;
-       case 51 ... 100:
-               bst_cbst_range = 2;
-               break;
-       case 101 ... 200:
-               bst_cbst_range = 3;
-               break;
-       default:        /* 201 uF and greater */
-               bst_cbst_range = 4;
-       }
-
-       ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_COEFF,
-                                CS35L41_BST_K1_MASK | CS35L41_BST_K2_MASK,
-                                cs35l41_bst_k1_table[bst_lbst_val][bst_cbst_range]
-                                       << CS35L41_BST_K1_SHIFT |
-                                cs35l41_bst_k2_table[bst_lbst_val][bst_cbst_range]
-                                       << CS35L41_BST_K2_SHIFT);
-       if (ret) {
-               dev_err(dev, "Failed to write boost coefficients: %d\n", ret);
-               return ret;
-       }
-
-       ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_SLOPE_LBST,
-                                CS35L41_BST_SLOPE_MASK | CS35L41_BST_LBST_VAL_MASK,
-                                cs35l41_bst_slope_table[bst_lbst_val]
-                                       << CS35L41_BST_SLOPE_SHIFT |
-                                bst_lbst_val << CS35L41_BST_LBST_VAL_SHIFT);
-       if (ret) {
-               dev_err(dev, "Failed to write boost slope/inductor value: %d\n", ret);
-               return ret;
-       }
-
-       if (boost_ipk < 1600 || boost_ipk > 4500) {
-               dev_err(dev, "Invalid boost inductor peak current: %d mA\n",
-                       boost_ipk);
-               return -EINVAL;
-       }
-       bst_ipk_scaled = ((boost_ipk - 1600) / 50) + 0x10;
-
-       ret = regmap_update_bits(regmap, CS35L41_BSTCVRT_PEAK_CUR,
-                                CS35L41_BST_IPK_MASK,
-                                bst_ipk_scaled << CS35L41_BST_IPK_SHIFT);
-       if (ret) {
-               dev_err(dev, "Failed to write boost inductor peak current: %d\n", ret);
-               return ret;
-       }
-
-       return 0;
-}
-
 static int cs35l41_set_pdata(struct cs35l41_private *cs35l41)
 {
        int ret;
@@ -1082,9 +982,8 @@ static int cs35l41_set_pdata(struct cs35l41_private *cs35l41)
        /* Required */
        if (cs35l41->pdata.bst_ipk &&
            cs35l41->pdata.bst_ind && cs35l41->pdata.bst_cap) {
-               ret = cs35l41_boost_config(cs35l41, cs35l41->pdata.bst_ind,
-                                          cs35l41->pdata.bst_cap,
-                                          cs35l41->pdata.bst_ipk);
+               ret = cs35l41_boost_config(cs35l41->dev, cs35l41->regmap, cs35l41->pdata.bst_ind,
+                                          cs35l41->pdata.bst_cap, cs35l41->pdata.bst_ipk);
                if (ret) {
                        dev_err(cs35l41->dev, "Error in Boost DT config: %d\n", ret);
                        return ret;