Commit 7bd7916d authored by Richard Fitzgerald's avatar Richard Fitzgerald Committed by Mark Brown

regulator: arizona-micsupp: Add support for Cirrus Logic Madera codecs

This adds a new driver identity "madera-micsupp" and probe function
so that this driver can be used to control the micsupp regulator on
Cirrus Logic Madera codecs.
Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 1f5f11e7
......@@ -143,11 +143,12 @@ config REGULATOR_ARIZONA_LDO1
and Wolfson Microelectronic Arizona codecs.
config REGULATOR_ARIZONA_MICSUPP
tristate "Wolfson Arizona class devices MICSUPP"
depends on MFD_ARIZONA
tristate "Cirrus Madera and Wolfson Arizona class devices MICSUPP"
depends on MFD_ARIZONA || MFD_MADERA
depends on SND_SOC
help
Support for the MICSUPP regulators found on Wolfson Arizona class
Support for the MICSUPP regulators found on Cirrus Logic Madera codecs
and Wolfson Microelectronic Arizona codecs
devices.
config REGULATOR_AS3711
......
......@@ -25,6 +25,10 @@
#include <linux/mfd/arizona/pdata.h>
#include <linux/mfd/arizona/registers.h>
#include <linux/mfd/madera/core.h>
#include <linux/mfd/madera/pdata.h>
#include <linux/mfd/madera/registers.h>
#include <linux/regulator/arizona-micsupp.h>
struct arizona_micsupp {
......@@ -200,6 +204,28 @@ static const struct regulator_init_data arizona_micsupp_ext_default = {
.num_consumer_supplies = 1,
};
static const struct regulator_desc madera_micsupp = {
.name = "MICVDD",
.supply_name = "CPVDD1",
.type = REGULATOR_VOLTAGE,
.n_voltages = 40,
.ops = &arizona_micsupp_ops,
.vsel_reg = MADERA_LDO2_CONTROL_1,
.vsel_mask = MADERA_LDO2_VSEL_MASK,
.enable_reg = MADERA_MIC_CHARGE_PUMP_1,
.enable_mask = MADERA_CPMIC_ENA,
.bypass_reg = MADERA_MIC_CHARGE_PUMP_1,
.bypass_mask = MADERA_CPMIC_BYPASS,
.linear_ranges = arizona_micsupp_ext_ranges,
.n_linear_ranges = ARRAY_SIZE(arizona_micsupp_ext_ranges),
.enable_time = 3000,
.owner = THIS_MODULE,
};
static int arizona_micsupp_of_get_pdata(struct arizona_micsupp_pdata *pdata,
struct regulator_config *config,
const struct regulator_desc *desc)
......@@ -316,6 +342,24 @@ static int arizona_micsupp_probe(struct platform_device *pdev)
&arizona->pdata.micvdd);
}
static int madera_micsupp_probe(struct platform_device *pdev)
{
struct madera *madera = dev_get_drvdata(pdev->dev.parent);
struct arizona_micsupp *micsupp;
micsupp = devm_kzalloc(&pdev->dev, sizeof(*micsupp), GFP_KERNEL);
if (!micsupp)
return -ENOMEM;
micsupp->regmap = madera->regmap;
micsupp->dapm = &madera->dapm;
micsupp->dev = madera->dev;
micsupp->init_data = arizona_micsupp_ext_default;
return arizona_micsupp_common_init(pdev, micsupp, &madera_micsupp,
&madera->pdata.micvdd);
}
static struct platform_driver arizona_micsupp_driver = {
.probe = arizona_micsupp_probe,
.driver = {
......@@ -323,10 +367,35 @@ static struct platform_driver arizona_micsupp_driver = {
},
};
module_platform_driver(arizona_micsupp_driver);
static struct platform_driver madera_micsupp_driver = {
.probe = madera_micsupp_probe,
.driver = {
.name = "madera-micsupp",
},
};
static struct platform_driver * const arizona_micsupp_drivers[] = {
&arizona_micsupp_driver,
&madera_micsupp_driver,
};
static int __init arizona_micsupp_init(void)
{
return platform_register_drivers(arizona_micsupp_drivers,
ARRAY_SIZE(arizona_micsupp_drivers));
}
module_init(arizona_micsupp_init);
static void __exit arizona_micsupp_exit(void)
{
platform_unregister_drivers(arizona_micsupp_drivers,
ARRAY_SIZE(arizona_micsupp_drivers));
}
module_exit(arizona_micsupp_exit);
/* Module information */
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
MODULE_DESCRIPTION("Arizona microphone supply driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:arizona-micsupp");
MODULE_ALIAS("platform:madera-micsupp");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment