mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
ASoC: cs35l41: Create shared function for boost configuration
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>
This commit is contained in:
parent
3bc3e3da65
commit
e8e4fcc047
@ -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 */
|
||||
|
@ -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>");
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user