mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
ASoC: cs42l51: add regulator management
Add cs42l51 audio codec power supply management through regulator framework. Signed-off-by: Olivier Moysan <olivier.moysan@st.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
26bde6ad6d
commit
f77b6ea70f
@ -35,12 +35,18 @@ static int cs42l51_i2c_probe(struct i2c_client *i2c,
|
||||
return cs42l51_probe(&i2c->dev, devm_regmap_init_i2c(i2c, &config));
|
||||
}
|
||||
|
||||
static int cs42l51_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
return cs42l51_remove(&i2c->dev);
|
||||
}
|
||||
|
||||
static struct i2c_driver cs42l51_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "cs42l51",
|
||||
.of_match_table = cs42l51_of_match,
|
||||
},
|
||||
.probe = cs42l51_i2c_probe,
|
||||
.remove = cs42l51_i2c_remove,
|
||||
.id_table = cs42l51_i2c_id,
|
||||
};
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
||||
#include "cs42l51.h"
|
||||
|
||||
@ -40,11 +41,19 @@ enum master_slave_mode {
|
||||
MODE_MASTER,
|
||||
};
|
||||
|
||||
static const char * const cs42l51_supply_names[] = {
|
||||
"VL",
|
||||
"VD",
|
||||
"VA",
|
||||
"VAHP",
|
||||
};
|
||||
|
||||
struct cs42l51_private {
|
||||
unsigned int mclk;
|
||||
struct clk *mclk_handle;
|
||||
unsigned int audio_mode; /* The mode (I2S or left-justified) */
|
||||
enum master_slave_mode func;
|
||||
struct regulator_bulk_data supplies[ARRAY_SIZE(cs42l51_supply_names)];
|
||||
};
|
||||
|
||||
#define CS42L51_FORMATS ( \
|
||||
@ -550,7 +559,7 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)
|
||||
{
|
||||
struct cs42l51_private *cs42l51;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
int ret, i;
|
||||
|
||||
if (IS_ERR(regmap))
|
||||
return PTR_ERR(regmap);
|
||||
@ -569,6 +578,23 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)
|
||||
cs42l51->mclk_handle = NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cs42l51->supplies); i++)
|
||||
cs42l51->supplies[i].supply = cs42l51_supply_names[i];
|
||||
|
||||
ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(cs42l51->supplies),
|
||||
cs42l51->supplies);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to request supplies: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regulator_bulk_enable(ARRAY_SIZE(cs42l51->supplies),
|
||||
cs42l51->supplies);
|
||||
if (ret != 0) {
|
||||
dev_err(dev, "Failed to enable supplies: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Verify that we have a CS42L51 */
|
||||
ret = regmap_read(regmap, CS42L51_CHIP_REV_ID, &val);
|
||||
if (ret < 0) {
|
||||
@ -587,11 +613,27 @@ int cs42l51_probe(struct device *dev, struct regmap *regmap)
|
||||
|
||||
ret = devm_snd_soc_register_component(dev,
|
||||
&soc_component_device_cs42l51, &cs42l51_dai, 1);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
|
||||
cs42l51->supplies);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cs42l51_probe);
|
||||
|
||||
int cs42l51_remove(struct device *dev)
|
||||
{
|
||||
struct cs42l51_private *cs42l51 = dev_get_drvdata(dev);
|
||||
|
||||
return regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
|
||||
cs42l51->supplies);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cs42l51_remove);
|
||||
|
||||
const struct of_device_id cs42l51_of_match[] = {
|
||||
{ .compatible = "cirrus,cs42l51", },
|
||||
{ }
|
||||
|
@ -22,6 +22,7 @@ struct device;
|
||||
|
||||
extern const struct regmap_config cs42l51_regmap;
|
||||
int cs42l51_probe(struct device *dev, struct regmap *regmap);
|
||||
int cs42l51_remove(struct device *dev);
|
||||
extern const struct of_device_id cs42l51_of_match[];
|
||||
|
||||
#define CS42L51_CHIP_ID 0x1B
|
||||
|
Loading…
Reference in New Issue
Block a user