summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDanny Nold <dannynold@freescale.com>2011-11-03 13:05:36 -0500
committerDanny Nold <dannynold@freescale.com>2011-11-11 15:36:27 -0600
commit5a49ccf53b2c65193e7c7c4834441924091eb0d1 (patch)
treeaccec83dbbdac17ac7209e7dcdf9337223d91fcc /drivers
parente8374d1af73b8874cf9fd4992ae121349fde223e (diff)
ENGR00143921-1 - EPDC/MAX17135: Add controls for V3P3 regulator
- Added V3P3 regulator to max17135 - Added calls to enable/disable V3P3 regulator from EPDC driver - Improved Kconfig detail for max17135 MFD and HWMON entries Signed-off-by: Danny Nold <dannynold@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hwmon/Kconfig2
-rw-r--r--drivers/mfd/Kconfig2
-rw-r--r--drivers/regulator/max17135-regulator.c41
-rw-r--r--drivers/video/mxc/mxc_epdc_fb.c25
4 files changed, 68 insertions, 2 deletions
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
index 1b7f2f3f7947..15d23fccafe9 100644
--- a/drivers/hwmon/Kconfig
+++ b/drivers/hwmon/Kconfig
@@ -693,7 +693,7 @@ config SENSORS_MAX1619
will be called max1619.
config SENSORS_MAX17135
- tristate "Maxim MAX17135"
+ tristate "Maxim MAX17135 EPD temperature sensor"
depends on I2C
help
If you say yes here you get support for MAX17135 PMIC sensor.
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index b74dbcbcd791..ea812cb52ad7 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -678,7 +678,7 @@ config MFD_WL1273_CORE
audio codec.
config MFD_MAX17135
- tristate "MAX17135 PMIC core"
+ tristate "Maxim MAX17135 EPD PMIC core"
depends on I2C
help
This is the MAX17135 PMIC support. It includes
diff --git a/drivers/regulator/max17135-regulator.c b/drivers/regulator/max17135-regulator.c
index 97bf2aff8b3f..45d4501ef7a5 100644
--- a/drivers/regulator/max17135-regulator.c
+++ b/drivers/regulator/max17135-regulator.c
@@ -354,6 +354,33 @@ static int max17135_display_is_enabled(struct regulator_dev *reg)
return 1;
}
+static int max17135_v3p3_enable(struct regulator_dev *reg)
+{
+ struct max17135 *max17135 = rdev_get_drvdata(reg);
+
+ gpio_set_value(max17135->gpio_pmic_v3p3, 1);
+ return 0;
+}
+
+static int max17135_v3p3_disable(struct regulator_dev *reg)
+{
+ struct max17135 *max17135 = rdev_get_drvdata(reg);
+
+ gpio_set_value(max17135->gpio_pmic_v3p3, 0);
+ return 0;
+}
+
+static int max17135_v3p3_is_enabled(struct regulator_dev *reg)
+{
+ struct max17135 *max17135 = rdev_get_drvdata(reg);
+ int gpio = gpio_get_value(max17135->gpio_pmic_v3p3);
+
+ if (gpio == 0)
+ return 0;
+ else
+ return 1;
+}
+
/*
* Regulator operations
*/
@@ -394,6 +421,13 @@ static struct regulator_ops max17135_vneg_ops = {
static struct regulator_ops max17135_vpos_ops = {
};
+static struct regulator_ops max17135_v3p3_ops = {
+ .enable = max17135_v3p3_enable,
+ .disable = max17135_v3p3_disable,
+ .is_enabled = max17135_v3p3_is_enabled,
+};
+
+
/*
* Regulator descriptors
*/
@@ -454,6 +488,13 @@ static struct regulator_desc max17135_reg[MAX17135_NUM_REGULATORS] = {
.type = REGULATOR_VOLTAGE,
.owner = THIS_MODULE,
},
+{
+ .name = "V3P3",
+ .id = MAX17135_V3P3,
+ .ops = &max17135_v3p3_ops,
+ .type = REGULATOR_VOLTAGE,
+ .owner = THIS_MODULE,
+},
};
static void max17135_setup_timings(struct max17135 *max17135)
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
index 6e7ac35882d9..192264e8aca7 100644
--- a/drivers/video/mxc/mxc_epdc_fb.c
+++ b/drivers/video/mxc/mxc_epdc_fb.c
@@ -135,6 +135,7 @@ struct mxc_epdc_fb_data {
struct clk *epdc_clk_pix;
struct regulator *display_regulator;
struct regulator *vcom_regulator;
+ struct regulator *v3p3_regulator;
bool fw_default_load;
/* FB elements related to EPDC updates */
@@ -866,6 +867,17 @@ static void epdc_powerup(struct mxc_epdc_fb_data *fb_data)
fb_data->updates_active = true;
+ /* Enable the v3p3 regulator */
+ ret = regulator_enable(fb_data->v3p3_regulator);
+ if (IS_ERR((void *)ret)) {
+ dev_err(fb_data->dev, "Unable to enable V3P3 regulator."
+ "err = 0x%x\n", ret);
+ mutex_unlock(&fb_data->power_mutex);
+ return;
+ }
+
+ msleep(1);
+
/* Enable pins used by EPDC */
if (fb_data->pdata->enable_pins)
fb_data->pdata->enable_pins();
@@ -925,6 +937,9 @@ static void epdc_powerdown(struct mxc_epdc_fb_data *fb_data)
if (fb_data->pdata->disable_pins)
fb_data->pdata->disable_pins();
+ /* turn off the V3p3 */
+ regulator_disable(fb_data->v3p3_regulator);
+
fb_data->power_state = POWER_STATE_OFF;
fb_data->powering_down = false;
@@ -3959,6 +3974,15 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev)
ret = -ENODEV;
goto out_irq;
}
+ fb_data->v3p3_regulator = regulator_get(NULL, "V3P3");
+ if (IS_ERR(fb_data->v3p3_regulator)) {
+ regulator_put(fb_data->vcom_regulator);
+ regulator_put(fb_data->display_regulator);
+ dev_err(&pdev->dev, "Unable to get V3P3 regulator."
+ "err = 0x%x\n", (int)fb_data->vcom_regulator);
+ ret = -ENODEV;
+ goto out_irq;
+ }
if (device_create_file(info->dev, &fb_attrs[0]))
dev_err(&pdev->dev, "Unable to create file from fb_attrs\n");
@@ -4163,6 +4187,7 @@ static int mxc_epdc_fb_remove(struct platform_device *pdev)
regulator_put(fb_data->display_regulator);
regulator_put(fb_data->vcom_regulator);
+ regulator_put(fb_data->v3p3_regulator);
unregister_framebuffer(&fb_data->info);
free_irq(fb_data->epdc_irq, fb_data);