lkml.org 
[lkml]   [2021]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/11] ASoC: cs35l41: Create shared function for boost configuration
    Date
    ASoC and HDA will use the same registers to configure
    internal boost for the device

    Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com>
    ---
    include/sound/cs35l41.h | 2 +
    sound/soc/codecs/cs35l41-lib.c | 97 ++++++++++++++++++++++++++++++
    sound/soc/codecs/cs35l41.c | 105 +--------------------------------
    3 files changed, 101 insertions(+), 103 deletions(-)

    diff --git a/include/sound/cs35l41.h b/include/sound/cs35l41.h
    index 219f23f643a6..c80ede66f297 100644
    --- a/include/sound/cs35l41.h
    +++ b/include/sound/cs35l41.h
    @@ -769,5 +769,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 */
    diff --git a/sound/soc/codecs/cs35l41-lib.c b/sound/soc/codecs/cs35l41-lib.c
    index 5bb733bb02a0..b582e8214c86 100644
    --- a/sound/soc/codecs/cs35l41-lib.c
    +++ b/sound/soc/codecs/cs35l41-lib.c
    @@ -983,3 +983,100 @@ int cs35l41_set_channels(struct device *dev, struct regmap *reg,
    return 0;
    }

    +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;
    +}
    +
    diff --git a/sound/soc/codecs/cs35l41.c b/sound/soc/codecs/cs35l41.c
    index e61736daef62..99a70e9bb8e8 100644
    --- a/sound/soc/codecs/cs35l41.c
    +++ b/sound/soc/codecs/cs35l41.c
    @@ -145,24 +145,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;
    @@ -987,88 +969,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;
    @@ -1077,9 +977,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;
    --
    2.34.0
    \
     
     \ /
      Last update: 2021-11-23 17:33    [W:3.134 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site