Commit 45aae62d authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'regulator/topic/arizona' into regulator-next

parents fc221525 57a10a1f
...@@ -91,6 +91,7 @@ config REGULATOR_AAT2870 ...@@ -91,6 +91,7 @@ config REGULATOR_AAT2870
config REGULATOR_ARIZONA config REGULATOR_ARIZONA
tristate "Wolfson Arizona class devices" tristate "Wolfson Arizona class devices"
depends on MFD_ARIZONA depends on MFD_ARIZONA
depends on SND_SOC
help help
Support for the regulators found on Wolfson Arizona class Support for the regulators found on Wolfson Arizona class
devices. devices.
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/workqueue.h>
#include <sound/soc.h>
#include <linux/mfd/arizona/core.h> #include <linux/mfd/arizona/core.h>
#include <linux/mfd/arizona/pdata.h> #include <linux/mfd/arizona/pdata.h>
...@@ -34,6 +36,8 @@ struct arizona_micsupp { ...@@ -34,6 +36,8 @@ struct arizona_micsupp {
struct regulator_consumer_supply supply; struct regulator_consumer_supply supply;
struct regulator_init_data init_data; struct regulator_init_data init_data;
struct work_struct check_cp_work;
}; };
static int arizona_micsupp_list_voltage(struct regulator_dev *rdev, static int arizona_micsupp_list_voltage(struct regulator_dev *rdev,
...@@ -72,9 +76,73 @@ static int arizona_micsupp_map_voltage(struct regulator_dev *rdev, ...@@ -72,9 +76,73 @@ static int arizona_micsupp_map_voltage(struct regulator_dev *rdev,
return selector; return selector;
} }
static void arizona_micsupp_check_cp(struct work_struct *work)
{
struct arizona_micsupp *micsupp =
container_of(work, struct arizona_micsupp, check_cp_work);
struct snd_soc_dapm_context *dapm = micsupp->arizona->dapm;
struct arizona *arizona = micsupp->arizona;
struct regmap *regmap = arizona->regmap;
unsigned int reg;
int ret;
ret = regmap_read(regmap, ARIZONA_MIC_CHARGE_PUMP_1, &reg);
if (ret != 0) {
dev_err(arizona->dev, "Failed to read CP state: %d\n", ret);
return;
}
if (dapm) {
if ((reg & (ARIZONA_CPMIC_ENA | ARIZONA_CPMIC_BYPASS)) ==
ARIZONA_CPMIC_ENA)
snd_soc_dapm_force_enable_pin(dapm, "MICSUPP");
else
snd_soc_dapm_disable_pin(dapm, "MICSUPP");
snd_soc_dapm_sync(dapm);
}
}
static int arizona_micsupp_enable(struct regulator_dev *rdev)
{
struct arizona_micsupp *micsupp = rdev_get_drvdata(rdev);
int ret;
ret = regulator_enable_regmap(rdev);
if (ret == 0)
schedule_work(&micsupp->check_cp_work);
return ret;
}
static int arizona_micsupp_disable(struct regulator_dev *rdev)
{
struct arizona_micsupp *micsupp = rdev_get_drvdata(rdev);
int ret;
ret = regulator_disable_regmap(rdev);
if (ret == 0)
schedule_work(&micsupp->check_cp_work);
return ret;
}
static int arizona_micsupp_set_bypass(struct regulator_dev *rdev, bool ena)
{
struct arizona_micsupp *micsupp = rdev_get_drvdata(rdev);
int ret;
ret = regulator_set_bypass_regmap(rdev, ena);
if (ret == 0)
schedule_work(&micsupp->check_cp_work);
return ret;
}
static struct regulator_ops arizona_micsupp_ops = { static struct regulator_ops arizona_micsupp_ops = {
.enable = regulator_enable_regmap, .enable = arizona_micsupp_enable,
.disable = regulator_disable_regmap, .disable = arizona_micsupp_disable,
.is_enabled = regulator_is_enabled_regmap, .is_enabled = regulator_is_enabled_regmap,
.list_voltage = arizona_micsupp_list_voltage, .list_voltage = arizona_micsupp_list_voltage,
...@@ -84,7 +152,7 @@ static struct regulator_ops arizona_micsupp_ops = { ...@@ -84,7 +152,7 @@ static struct regulator_ops arizona_micsupp_ops = {
.set_voltage_sel = regulator_set_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap,
.get_bypass = regulator_get_bypass_regmap, .get_bypass = regulator_get_bypass_regmap,
.set_bypass = regulator_set_bypass_regmap, .set_bypass = arizona_micsupp_set_bypass,
}; };
static const struct regulator_desc arizona_micsupp = { static const struct regulator_desc arizona_micsupp = {
...@@ -109,7 +177,8 @@ static const struct regulator_desc arizona_micsupp = { ...@@ -109,7 +177,8 @@ static const struct regulator_desc arizona_micsupp = {
static const struct regulator_init_data arizona_micsupp_default = { static const struct regulator_init_data arizona_micsupp_default = {
.constraints = { .constraints = {
.valid_ops_mask = REGULATOR_CHANGE_STATUS | .valid_ops_mask = REGULATOR_CHANGE_STATUS |
REGULATOR_CHANGE_VOLTAGE, REGULATOR_CHANGE_VOLTAGE |
REGULATOR_CHANGE_BYPASS,
.min_uV = 1700000, .min_uV = 1700000,
.max_uV = 3300000, .max_uV = 3300000,
}, },
...@@ -131,6 +200,7 @@ static int arizona_micsupp_probe(struct platform_device *pdev) ...@@ -131,6 +200,7 @@ static int arizona_micsupp_probe(struct platform_device *pdev)
} }
micsupp->arizona = arizona; micsupp->arizona = arizona;
INIT_WORK(&micsupp->check_cp_work, arizona_micsupp_check_cp);
/* /*
* Since the chip usually supplies itself we provide some * Since the chip usually supplies itself we provide some
......
...@@ -1152,6 +1152,8 @@ SND_SOC_DAPM_OUTPUT("SPKOUTRN"), ...@@ -1152,6 +1152,8 @@ SND_SOC_DAPM_OUTPUT("SPKOUTRN"),
SND_SOC_DAPM_OUTPUT("SPKOUTRP"), SND_SOC_DAPM_OUTPUT("SPKOUTRP"),
SND_SOC_DAPM_OUTPUT("SPKDAT1L"), SND_SOC_DAPM_OUTPUT("SPKDAT1L"),
SND_SOC_DAPM_OUTPUT("SPKDAT1R"), SND_SOC_DAPM_OUTPUT("SPKDAT1R"),
SND_SOC_DAPM_OUTPUT("MICSUPP"),
}; };
#define ARIZONA_MIXER_INPUT_ROUTES(name) \ #define ARIZONA_MIXER_INPUT_ROUTES(name) \
...@@ -1364,6 +1366,8 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = { ...@@ -1364,6 +1366,8 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = {
{ "AEC Loopback", "SPKDAT1R", "OUT5R" }, { "AEC Loopback", "SPKDAT1R", "OUT5R" },
{ "SPKDAT1L", NULL, "OUT5L" }, { "SPKDAT1L", NULL, "OUT5L" },
{ "SPKDAT1R", NULL, "OUT5R" }, { "SPKDAT1R", NULL, "OUT5R" },
{ "MICSUPP", NULL, "SYSCLK" },
}; };
static int wm5102_set_fll(struct snd_soc_codec *codec, int fll_id, int source, static int wm5102_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
......
...@@ -624,6 +624,8 @@ SND_SOC_DAPM_OUTPUT("SPKDAT1L"), ...@@ -624,6 +624,8 @@ SND_SOC_DAPM_OUTPUT("SPKDAT1L"),
SND_SOC_DAPM_OUTPUT("SPKDAT1R"), SND_SOC_DAPM_OUTPUT("SPKDAT1R"),
SND_SOC_DAPM_OUTPUT("SPKDAT2L"), SND_SOC_DAPM_OUTPUT("SPKDAT2L"),
SND_SOC_DAPM_OUTPUT("SPKDAT2R"), SND_SOC_DAPM_OUTPUT("SPKDAT2R"),
SND_SOC_DAPM_OUTPUT("MICSUPP"),
}; };
#define ARIZONA_MIXER_INPUT_ROUTES(name) \ #define ARIZONA_MIXER_INPUT_ROUTES(name) \
...@@ -832,6 +834,8 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = { ...@@ -832,6 +834,8 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
{ "SPKDAT2L", NULL, "OUT6L" }, { "SPKDAT2L", NULL, "OUT6L" },
{ "SPKDAT2R", NULL, "OUT6R" }, { "SPKDAT2R", NULL, "OUT6R" },
{ "MICSUPP", NULL, "SYSCLK" },
}; };
static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source, static int wm5110_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
......
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