diff options
| -rw-r--r-- | arch/arm/boot/dts/omap3-minnow-p0.dts | 8 | ||||
| -rw-r--r-- | arch/arm/boot/dts/omap3-minnow.dtsi | 23 | ||||
| -rw-r--r-- | arch/arm/configs/eng_minnow_defconfig | 1 | ||||
| -rw-r--r-- | drivers/misc/c55_ctrl.c | 16 | ||||
| -rw-r--r-- | drivers/regulator/tps65912-regulator.c | 17 | ||||
| -rw-r--r-- | include/linux/mfd/tps65912.h | 5 |
6 files changed, 53 insertions, 17 deletions
diff --git a/arch/arm/boot/dts/omap3-minnow-p0.dts b/arch/arm/boot/dts/omap3-minnow-p0.dts index c7ae081e8e7..59bcdb03346 100644 --- a/arch/arm/boot/dts/omap3-minnow-p0.dts +++ b/arch/arm/boot/dts/omap3-minnow-p0.dts @@ -16,6 +16,14 @@ 0x01 /* Minnow P0 portable */ >; + c55-ctrl@0 { + compatible = "ti,c55-ctrl"; + reg = <0 0>; + gpios = <&gpio3 12 1>, /* IRQ gpio_ap_int gpio-076 */ + <&gpio3 16 0>, /* gpio_reset gpio-80*/ + <&gpio3 17 2>; /* gpio_c55_int gpio-81*/ + c55-ctrl-supply = <&ldo9_reg>; + }; vib-gpio { compatible = "mot,vib-gpio"; diff --git a/arch/arm/boot/dts/omap3-minnow.dtsi b/arch/arm/boot/dts/omap3-minnow.dtsi index 569ceaf0da6..6256a5642a4 100644 --- a/arch/arm/boot/dts/omap3-minnow.dtsi +++ b/arch/arm/boot/dts/omap3-minnow.dtsi @@ -11,13 +11,6 @@ model = "Motorola OMAP3 Platform"; compatible = "mot,omap3-minnow", "ti,omap3"; - c55-ctrl@0 { - compatible = "ti,c55-ctrl"; - reg = <0 0>; - gpios = <&gpio3 12 1>, /* IRQ gpio_ap_int gpio-076 */ - <&gpio3 16 0>, /* gpio_reset gpio-80*/ - <&gpio3 17 2>; /* gpio_c55_int gpio-81*/ - }; Display@0 { compatible = "mot,minnow-panel-dsi-cm"; /* 0: MINNOW_PANEL_CM_220X176 @@ -170,9 +163,9 @@ 0x0e6 0x11c /* CAM_D0, MODE4 | INPUT_PULLUP */ 0x122 0x004 /* SIM_CLK, MODE4 | OUTPUT */ 0x124 0x104 /* SIM_PWRCTRL, MODE4 | INPUT */ - 0x144 0x000 /* UART2_TX, MODE0 | OUTPUT */ + 0x144 0x100 /* UART2_CTS, MODE0 | OUTPUT */ 0x146 0x000 /* UART2_RTS, MODE0 | OUTPUT */ - 0x148 0x100 /* UART2_CTS, MODE0 | INPUT */ + 0x148 0x000 /* UART2_TX, MODE0 | INPUT */ 0x14a 0x100 /* UART2_RX, MODE0 | INPUT */ 0x14c 0x000 /* UART1_TX, MODE0 | OUTPUT */ 0x14e 0x000 /* UART1_RTS, MODE0 | OUTPUT */ @@ -180,7 +173,7 @@ 0x152 0x100 /* UART1_RX, MODE0 | INPUT */ 0x154 0x100 /* MCBSP4_CLKX, MODE0| INPUT*/ 0x156 0x100 /* MCBSP4_DR, MODE0 | INPUT */ - 0x158 0x000 /* MCBSP4_DX, MODE0 | OUTPUT */ + 0x158 0x000 /* MCBSP4_DX, MODE0 | OUTPUT */ 0x15a 0x118 /* MCBSP4_FSX,MODE0 | INPUT_PULLUP*/ 0x168 0x104 /* MCBSP1_CLKX, MODE4 | INPUT */ 0x16c 0x004 /* UART3_RTS_SD, MODE4 | OUTPUT */ @@ -188,11 +181,11 @@ 0x190 0x118 /* I2C2_SDA, MODE0 | INPUT_PULLUP */ 0x192 0x118 /* I2C3_SCL, MODE0 | INPUT_PULLUP */ 0x194 0x118 /* I2C3_SDA, MODE0 | INPUT_PULLUP */ - 0x198 0x100 /* MCSPI1_CLK, MODE0 | INPUT */ - 0x19a 0x000 /* MCSPI1_SIMO, MODE0 | OUTPUT */ - 0x19c 0x100 /* MCSPI1_SOMI, MODE0 | INPUT */ - 0x19e 0x000 /* MCSPI1_CS0, MODE0 | OUTPUT */ - 0x1a0 0x000 /* MCSPI1_CS1, MODE0 | OUTPUT */ + 0x198 0x100 /* MCSPI1_CLK, MODE0 | INPUT */ + 0x19a 0x000 /* MCSPI1_SIMO, MODE0 | OUTPUT */ + 0x19c 0x100 /* MCSPI1_SOMI, MODE0 | INPUT */ + 0x19e 0x000 /* MCSPI1_CS0, MODE0 | OUTPUT */ + 0x1a0 0x000 /* MCSPI1_CS1, MODE0 | OUTPUT */ 0x1a6 0x100 /* MCSPI2_CLK, MODE0 | INPUT */ 0x1a8 0x000 /* MCSPI2_SIMO, MODE0 | OUTPUT */ 0x1aa 0x100 /* MCSPI2_SOMI, MODE0 | INPUT */ diff --git a/arch/arm/configs/eng_minnow_defconfig b/arch/arm/configs/eng_minnow_defconfig index 1e50ba81cac..96ee2200888 100644 --- a/arch/arm/configs/eng_minnow_defconfig +++ b/arch/arm/configs/eng_minnow_defconfig @@ -959,6 +959,7 @@ CONFIG_VIB_GPIO=y # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set # CONFIG_SRAM is not set +CONFIG_C55_CTRL=y # CONFIG_C2PORT is not set # diff --git a/drivers/misc/c55_ctrl.c b/drivers/misc/c55_ctrl.c index 04f29d3ff9a..3c116987e3d 100644 --- a/drivers/misc/c55_ctrl.c +++ b/drivers/misc/c55_ctrl.c @@ -17,6 +17,7 @@ #include <linux/irq.h> #include <linux/module.h> #include <linux/platform_device.h> +#include <linux/regulator/consumer.h> #include <linux/slab.h> #include <linux/wakelock.h> #include <linux/of.h> @@ -26,6 +27,7 @@ struct c55_ctrl_data { int int_gpio; struct wake_lock wake_lock; + struct regulator *reg; }; #define NUM_GPIOS 3 @@ -138,6 +140,17 @@ static int c55_ctrl_probe(struct platform_device *pdev) return ret; } + cdata->reg = regulator_get(&pdev->dev, "c55-ctrl"); + if (IS_ERR(cdata->reg)) { + return PTR_ERR(cdata->reg); + } + ret = regulator_enable(cdata->reg); + if (ret) { + dev_err(&pdev->dev, "%s: c55_ctrl regulator_enable failed.\n", __func__); + regulator_put(cdata->reg); + return ret; + } + wake_lock_init(&cdata->wake_lock, WAKE_LOCK_SUSPEND, "c55_ctrl"); platform_set_drvdata(pdev, cdata); @@ -146,6 +159,9 @@ static int c55_ctrl_probe(struct platform_device *pdev) static int c55_ctrl_remove(struct platform_device *pdev) { + struct c55_ctrl_data *cdata = platform_get_drvdata(pdev); + + regulator_put(cdata->reg); return 0; } diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c index 4a27de44d3c..4e19cc80cfa 100644 --- a/drivers/regulator/tps65912-regulator.c +++ b/drivers/regulator/tps65912-regulator.c @@ -274,7 +274,7 @@ static int tps65912_reg_enable(struct regulator_dev *dev) struct tps65912_reg *pmic = rdev_get_drvdata(dev); struct tps65912 *mfd = pmic->mfd; int id = rdev_get_id(dev); - int reg; + int reg, lsw; if (id < TPS65912_REG_DCDC1 || id > TPS65912_REG_LDO10) return -EINVAL; @@ -283,6 +283,13 @@ static int tps65912_reg_enable(struct regulator_dev *dev) if (reg < 0) return reg; + if (id == TPS65912_REG_LDO9) { + lsw = tps65912_reg_read(mfd, TPS65912_LOADSWITCH); + lsw &= ~LOADSWITCH_MASK; + lsw |= LOADSWITCH_ENABLE; + tps65912_reg_write(mfd, TPS65912_LOADSWITCH, lsw); + } + return tps65912_set_bits(mfd, reg, TPS65912_REG_ENABLED); } @@ -290,12 +297,18 @@ static int tps65912_reg_disable(struct regulator_dev *dev) { struct tps65912_reg *pmic = rdev_get_drvdata(dev); struct tps65912 *mfd = pmic->mfd; - int id = rdev_get_id(dev), reg; + int id = rdev_get_id(dev), reg, lsw; reg = pmic->get_ctrl_reg(id); if (reg < 0) return reg; + if (id == TPS65912_REG_LDO9) { + lsw = tps65912_reg_read(mfd, TPS65912_LOADSWITCH); + lsw &= ~LOADSWITCH_MASK; + lsw |= LOADSWITCH_DISABLE; + tps65912_reg_write(mfd, TPS65912_LOADSWITCH, lsw); + } return tps65912_clear_bits(mfd, reg, TPS65912_REG_ENABLED); } diff --git a/include/linux/mfd/tps65912.h b/include/linux/mfd/tps65912.h index 7b38617e041..6cf7245e770 100644 --- a/include/linux/mfd/tps65912.h +++ b/include/linux/mfd/tps65912.h @@ -264,6 +264,11 @@ #define DCDC_LIMIT_MAX_SEL_MASK 0x3F #define DCDC_LIMIT_MAX_SEL_SHIFT 0 +/* Register LOADSWITCH */ +#define LOADSWITCH_MASK 0x03 +#define LOADSWITCH_DISABLE 0 +#define LOADSWITCH_ENABLE 1 + /* Number of step-down converters available */ #define TPS65912_NUM_DCDC 4 |