rk3288;rk808:support two switch as ldo & enable rk808 irq to wakeup
author张晴 <zhangqing@rock-chips.com>
Mon, 31 Mar 2014 02:56:37 +0000 (10:56 +0800)
committer张晴 <zhangqing@rock-chips.com>
Mon, 31 Mar 2014 02:56:37 +0000 (10:56 +0800)
arch/arm/boot/dts/rk3288-tb.dts
arch/arm/boot/dts/rk808.dtsi [changed mode: 0755->0644]
drivers/mfd/rk808-irq.c
drivers/mfd/rk808.c
include/linux/mfd/rk808.h

index 382b899193cc2574e2fbfdba3546b1785df61077..a35f10ecbb35c1fad14389022f4a88e7989794b0 100755 (executable)
@@ -713,5 +713,17 @@ rockchip,power_type = <GPIO>;
                        regulator-always-on;
                        regulator-boot-on;
                };
+
+               rk808_ldo9_reg: regulator@12 {
+                       regulator-name= "rk_ldo9";
+                       regulator-always-on;
+                       regulator-boot-on;
+               };
+
+               rk808_ldo10_reg: regulator@13 {
+                       regulator-name= "rk_ldo10";
+                       regulator-always-on;
+                       regulator-boot-on;
+               };
        };
 };
old mode 100755 (executable)
new mode 100644 (file)
index 2983ac7..eecf535
                        regulator-initial-state = <3>;
                        regulator-state-mem {
                                regulator-state-enabled;
-                               regulator-state-uv = <1200000>;
+                               regulator-state-uv = <1000000>;
                        };      
                };
 
                                regulator-state-uv = <1800000>;
                        };      
                };
+               
+               rk808_ldo9_reg: regulator@12{
+                       reg = <12>;
+                       regulator-compatible = "rk_ldo9";
+                       regulator-initial-state = <3>;
+                       regulator-state-mem {
+                               regulator-state-enabled;
+                       };      
+               };
+               
+               rk808_ldo10_reg: regulator@13{
+                       reg = <13>;
+                       regulator-compatible = "rk_ldo10";
+                       regulator-initial-state = <3>;
+                       regulator-state-mem {
+                               regulator-state-enabled;
+                       };      
+               };
 
        };
 };
index dbae25e4dccf2ea9a73500937df82bb964e34a78..cfaf297b15ae740b91c6d59682edb861c8efa7d2 100755 (executable)
@@ -221,6 +221,7 @@ int rk808_irq_init(struct rk808 *rk808, int irq,struct rk808_board *pdata)
        ret = request_threaded_irq(rk808->chip_irq, NULL, rk808_irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "rk808", rk808);
 
        irq_set_irq_type(rk808->chip_irq, IRQ_TYPE_LEVEL_LOW);
+       enable_irq_wake(rk808->chip_irq);
 
        if (ret != 0)
                dev_err(rk808->dev, "Failed to request IRQ: %d\n", ret);
index 87691a6df99d27505c79e220227e2e9a8608fc7e..788feb5610f7e304fdf54d9e654ec64988c28c42 100755 (executable)
@@ -186,8 +186,13 @@ static int rk808_ldo_suspend_enable(struct regulator_dev *dev)
 {
        struct rk808 *rk808 = rdev_get_drvdata(dev);
        int ldo= rdev_get_id(dev) - RK808_LDO1;
-       
-       return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG2, 1 << ldo, 0);
+
+       if(ldo == 8)
+               return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG1, 1 << 5, 0);
+       else if(ldo ==9)
+               return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG1, 1 << 6, 0);
+       else
+               return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG2, 1 << ldo, 0);
        
 }
 static int rk808_ldo_suspend_disable(struct regulator_dev *dev)
@@ -195,6 +200,11 @@ static int rk808_ldo_suspend_disable(struct regulator_dev *dev)
        struct rk808 *rk808 = rdev_get_drvdata(dev);
        int ldo= rdev_get_id(dev) - RK808_LDO1;
        
+       if(ldo == 8)
+               return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG1, 1 << 5, 1 << 5);
+       else if(ldo ==9)
+               return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG1, 1 << 6, 1 << 6);
+       else
        return rk808_set_bits(rk808, RK808_SLEEP_SET_OFF_REG2, 1 << ldo, 1 << ldo);
 
 }
@@ -204,16 +214,24 @@ static int rk808_ldo_get_voltage(struct regulator_dev *dev)
        int ldo= rdev_get_id(dev) - RK808_LDO1;
        u16 reg = 0;
        int val;
-       reg = rk808_reg_read(rk808,rk808_LDO_SET_VOL_REG(ldo));
-       reg &= LDO_VOL_MASK;
-       if (ldo ==2){
-       val = 1000 * ldo3_voltage_map[reg];     
-       }
-       else if (ldo == 5 || ldo ==6){
-       val = 1000 * ldo6_voltage_map[reg];     
+
+       if  ((ldo ==8 ) || (ldo ==9)){
+               reg = rk808_reg_read(rk808,rk808_BUCK_SET_VOL_REG(3));
+               reg &= BUCK_VOL_MASK;
+               val = 1000 * buck4_voltage_map[reg];            
        }
        else{
-       val = 1000 * ldo_voltage_map[reg];      
+               reg = rk808_reg_read(rk808,rk808_LDO_SET_VOL_REG(ldo));
+               reg &= LDO_VOL_MASK;
+               if (ldo ==2){
+               val = 1000 * ldo3_voltage_map[reg];     
+               }
+               else if (ldo == 5 || ldo ==6){
+               val = 1000 * ldo6_voltage_map[reg];     
+               }
+               else{
+               val = 1000 * ldo_voltage_map[reg];      
+               }
        }
        return val;
 }
@@ -687,6 +705,22 @@ static struct regulator_desc regulators[] = {
                .type = REGULATOR_VOLTAGE,
                .owner = THIS_MODULE,
        },
+       {
+               .name = "RK_LDO9",
+               .id = 12,
+               .ops = &rk808_ldo_ops,
+               .n_voltages = ARRAY_SIZE(buck4_voltage_map),
+               .type = REGULATOR_VOLTAGE,
+               .owner = THIS_MODULE,
+       },
+       {
+               .name = "RK_LDO10",
+               .id = 13,
+               .ops = &rk808_ldo_ops,
+               .n_voltages = ARRAY_SIZE(buck4_voltage_map),
+               .type = REGULATOR_VOLTAGE,
+               .owner = THIS_MODULE,
+       },
        
 };
 
@@ -1004,6 +1038,8 @@ static struct of_regulator_match rk808_reg_matches[] = {
        { .name = "rk_ldo6", .driver_data = (void *)9 },
        { .name = "rk_ldo7", .driver_data = (void *)10 },
        { .name = "rk_ldo8", .driver_data = (void *)11 },
+       { .name = "rk_ldo9", .driver_data = (void *)12 },
+       { .name = "rk_ldo10", .driver_data = (void *)13 },
 };
 
 static struct rk808_board *rk808_parse_dt(struct rk808 *rk808)
index b79b7f5b22506aeb258a07a0146fe127b885982e..04bd5c4a82ce92e207387fd6b3c72c192b59b4b0 100755 (executable)
 
 #define RK808_NUM_IRQ  9
 
-#define rk808_NUM_REGULATORS 12
+#define rk808_NUM_REGULATORS 14
 
 #define RK808_VBAT_LOW_2V8  0x00
 #define RK808_VBAT_LOW_2V9  0x01