diff options
author | Danny Nold <dannynold@freescale.com> | 2011-11-03 13:05:36 -0500 |
---|---|---|
committer | Danny Nold <dannynold@freescale.com> | 2011-11-11 15:36:27 -0600 |
commit | 5a49ccf53b2c65193e7c7c4834441924091eb0d1 (patch) | |
tree | accec83dbbdac17ac7209e7dcdf9337223d91fcc /drivers | |
parent | e8374d1af73b8874cf9fd4992ae121349fde223e (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/Kconfig | 2 | ||||
-rw-r--r-- | drivers/mfd/Kconfig | 2 | ||||
-rw-r--r-- | drivers/regulator/max17135-regulator.c | 41 | ||||
-rw-r--r-- | drivers/video/mxc/mxc_epdc_fb.c | 25 |
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); |