phonepad:add suspend and resume voltage setting function
authorlw <lw@rock-chips.com>
Thu, 9 Aug 2012 08:27:14 +0000 (16:27 +0800)
committerlw <lw@rock-chips.com>
Thu, 9 Aug 2012 08:27:14 +0000 (16:27 +0800)
arch/arm/mach-rk30/board-rk30-phonepad.c
drivers/regulator/rk30-pwm-regulator.c
include/linux/regulator/rk29-pwm-regulator.h

index 8df5a38004ec1ee3263917a8fb74b6ec84059a49..e4b2da4abd33bff9c11da0107fd8469f2e530020 100755 (executable)
@@ -1550,6 +1550,7 @@ static struct pwm_platform_data pwm_regulator_info[1] = {
                .pwm_iomux_pwm = GPIO0D_PWM3,
                .pwm_iomux_gpio = GPIO0D_GPIO0D6,
                .pwm_voltage = 1100000,
+               .suspend_voltage = 1050000,
                .min_uV = 1000000,
                .max_uV = 1400000,
                .coefficient = 455,     //45.5%
index 7af504689ac509048ee5acf2541162dd3d38f62d..f046b4496c0ced2d37b2a95aed0702806c5ab2c1 100755 (executable)
@@ -74,6 +74,7 @@ const static int pwm_voltage_map[] = {
 };\r
 \r
 static struct clk *pwm_clk[2];\r
+static struct rk_pwm_dcdc *g_dcdc;\r
 \r
 static int pwm_set_rate(struct pwm_platform_data *pdata,int nHz,u32 rate)\r
 {\r
@@ -270,6 +271,12 @@ static int __devinit pwm_regulator_probe(struct platform_device *pdev)
        if(!pdata->min_uV)\r
                pdata->min_uV = 1000000;\r
        \r
+       if(pdata->suspend_voltage < pdata->min_uV)\r
+               pdata->suspend_voltage = pdata->min_uV;\r
+       \r
+       if(pdata->suspend_voltage > pdata->max_uV)      \r
+               pdata->suspend_voltage = pdata->max_uV;\r
+       \r
        dcdc = kzalloc(sizeof(struct rk_pwm_dcdc), GFP_KERNEL);\r
        if (dcdc == NULL) {
                dev_err(&pdev->dev, "Unable to allocate private data\n");
@@ -315,9 +322,9 @@ static int __devinit pwm_regulator_probe(struct platform_device *pdev)
                        clk_enable(pwm_clk[1]);\r
                }\r
 #endif\r
-\r
-\r
-       platform_set_drvdata(pdev, dcdc);\r
+       \r
+       g_dcdc  = dcdc;\r
+       platform_set_drvdata(pdev, dcdc);       \r
        printk(KERN_INFO "pwm_regulator.%d: driver initialized\n",id);\r
 \r
        return 0;\r
@@ -331,10 +338,73 @@ err:
 \r
 }\r
 \r
+static int  __sramdata g_PWM_REG_LRC = 0;\r
+static int  __sramdata g_PWM_REG_HRC = 0;\r
+void pwm_suspend_voltage(void)\r
+{\r
+       struct rk_pwm_dcdc *dcdc = g_dcdc;\r
+       int suspend_voltage = 0;\r
+       int pwm_id = 0;\r
+       \r
+       if(!dcdc)\r
+               return;\r
+       pwm_id = dcdc->pdata->pwm_id;\r
+       suspend_voltage = dcdc->pdata->suspend_voltage;\r
+       \r
+       g_PWM_REG_LRC = pwm_read_reg(pwm_id, PWM_REG_LRC);\r
+       g_PWM_REG_HRC = pwm_read_reg(pwm_id,PWM_REG_HRC);\r
+\r
+       switch(suspend_voltage)\r
+       {\r
+               case 1000000:\r
+               pwm_write_reg(pwm_id, PWM_REG_LRC, 0x25);\r
+               pwm_write_reg(pwm_id,PWM_REG_HRC,0x20); // 1 .00\r
+               break;\r
+               \r
+               case 1050000:\r
+               pwm_write_reg(pwm_id, PWM_REG_LRC, 0x25);\r
+               pwm_write_reg(pwm_id,PWM_REG_HRC,0x1c); // 1 .05\r
+               break;\r
+               \r
+               case 1100000:\r
+               pwm_write_reg(pwm_id, PWM_REG_LRC, 0x25);\r
+               pwm_write_reg(pwm_id,PWM_REG_HRC,0x18); // 1 .1\r
+               break;\r
+\r
+               case 1150000:\r
+               pwm_write_reg(pwm_id, PWM_REG_LRC, 0x25);\r
+               pwm_write_reg(pwm_id,PWM_REG_HRC,0x13); // 1 .15\r
+               break;\r
+\r
+               default:\r
+               pwm_write_reg(pwm_id, PWM_REG_LRC, 0x25);\r
+               pwm_write_reg(pwm_id,PWM_REG_HRC,0x20); // 1 .00\r
+               break;\r
+\r
+       }\r
+               \r
+}\r
+\r
+void pwm_resume_voltage(void)\r
+       {\r
+       struct rk_pwm_dcdc *dcdc = g_dcdc;      \r
+       int pwm_id = 0;\r
+       \r
+       if(!dcdc)\r
+               return;\r
+       pwm_id = dcdc->pdata->pwm_id;\r
+       pwm_write_reg(pwm_id, PWM_REG_LRC, g_PWM_REG_LRC);\r
+       pwm_write_reg(pwm_id,PWM_REG_HRC, g_PWM_REG_HRC);\r
+                       \r
+}\r
+\r
+\r
 static int pwm_regulator_suspend(struct platform_device *pdev, pm_message_t state)\r
 {\r
        struct pwm_platform_data *pdata = pdev->dev.platform_data;\r
-       pwm_set_rate(pdata,1000*1000,100);//pwm clk will change to 24M after suspend\r
+       //struct rk_pwm_dcdc *dcdc = platform_get_drvdata(pdev);\r
+       //unsigned selector = 0;\r
+       //pwm_regulator_set_voltage(dcdc->regulator, 1100000, 1100000, &selector);\r
        DBG("%s,pwm_id=%d\n",__func__,pdata->pwm_id);\r
        return 0;\r
 }\r
@@ -342,6 +412,9 @@ static int pwm_regulator_suspend(struct platform_device *pdev, pm_message_t stat
 static int pwm_regulator_resume(struct platform_device *pdev)\r
 {\r
        struct pwm_platform_data *pdata = pdev->dev.platform_data;\r
+       //struct rk_pwm_dcdc *dcdc = platform_get_drvdata(pdev);\r
+       //unsigned selector = 0;\r
+       //pwm_regulator_set_voltage(dcdc->regulator, 1150000, 1150000, &selector);\r
        DBG("%s,pwm_id=%d\n",__func__,pdata->pwm_id);\r
        return 0;\r
 }\r
index 70904dc447beacfae8a499dde33b7663d0a63424..e74b812f73d33e5dab311a1f9a1ff0d1d601b98e 100755 (executable)
@@ -57,6 +57,7 @@ struct pwm_platform_data {
        unsigned int    pwm_iomux_pwm;\r
        int     pwm_iomux_gpio;\r
        int     pwm_voltage;\r
+       int     suspend_voltage;\r
        int     coefficient;\r
        int     min_uV;\r
        int     max_uV;\r