From 71fb032a4fb774ac256b0b1aa0c866c1ccc7941b Mon Sep 17 00:00:00 2001 From: Jianqun Xu Date: Thu, 9 Apr 2015 10:13:14 +0800 Subject: [PATCH] ARM64: dt: rk3368: add driver support for rk818 Support rk818 pmic, patch is from zhangqing@rock-chips.com. Signed-off-by: Zhangqing Signed-off-by: Jianqun Xu --- arch/arm64/boot/dts/rk3368-tb_8846.dts | 195 ++++++++++++++++++++++++- drivers/mfd/rk818.c | 61 ++++---- 2 files changed, 224 insertions(+), 32 deletions(-) diff --git a/arch/arm64/boot/dts/rk3368-tb_8846.dts b/arch/arm64/boot/dts/rk3368-tb_8846.dts index ba291581bb70..9e6b5c589a15 100755 --- a/arch/arm64/boot/dts/rk3368-tb_8846.dts +++ b/arch/arm64/boot/dts/rk3368-tb_8846.dts @@ -205,6 +205,9 @@ pmu-supply = <&ldo5_reg>; /*PMUIO_VDD*/ vop-supply = <&ldo5_reg>; /*LCDC_VDD*/ }; + test-power{ + status = "okay"; + }; }; @@ -405,7 +408,7 @@ regulator-max-microvolt = <1500000>; regulator-always-on; regulator-boot-on; - regulator-initial-mode = <0x1>; + regulator-initial-mode = <0x2>; regulator-initial-state = <3>; regulator-state-mem { regulator-state-mode = <0x2>; @@ -418,7 +421,7 @@ syr828: syr828@41 { compatible = "silergy,syr82x"; reg = <0x41>; - status = "okay"; + status = "disabled"; regulators { #address-cells = <1>; #size-cells = <0>; @@ -445,6 +448,11 @@ status = "okay"; }; + rk818: rk818@1c { + reg = <0x1c>; + status = "okay"; + }; + CW2015@62 { compatible = "cw201x"; reg = <0x62>; @@ -859,6 +867,189 @@ }; }; +/include/ "../../../arm/boot/dts/rk818.dtsi" +&rk818 { + gpios =<&gpio0 GPIO_A1 GPIO_ACTIVE_HIGH>,<&gpio0 GPIO_A0 GPIO_ACTIVE_LOW>; + rk818,system-power-controller; + +rk818,support_dc_chg = <1>;/*1:dc chg; 0:usb chg*/ + regulators { + + rk818_dcdc1_reg: regulator@0{ + regulator-name= "vdd_logic";/*vcc arm*/ + regulator-min-microvolt = <700000>;/*<725000>;*/ + regulator-max-microvolt = <1500000>; + regulator-initial-mode = <0x2>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-mode = <0x2>; + regulator-state-enabled; + regulator-state-uv =<1100000>; + }; + }; + + rk818_dcdc2_reg: regulator@1 { + regulator-name= "rk818_dcdc2";/*vcc gpu*/ + regulator-min-microvolt = <700000>; + regulator-max-microvolt = <1200000>; + regulator-initial-mode = <0x2>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-mode = <0x2>; + regulator-state-enabled; + regulator-state-uv = <1200000>; + }; + }; + + rk818_dcdc3_reg: regulator@2 { + regulator-name= "rk818_dcdc3"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + regulator-initial-mode = <0x2>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-mode = <0x2>; + regulator-state-enabled; + regulator-state-uv = <1200000>; + }; + }; + + rk818_dcdc4_reg: regulator@3 { + regulator-name= "vccio"; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-initial-mode = <0x2>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-mode = <0x2>; + regulator-state-enabled; + regulator-state-uv = <3000000>; + }; + }; + + rk818_ldo1_reg: regulator@4 { + regulator-name= "rk818_ldo1"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <3300000>; + }; + }; + + rk818_ldo2_reg: regulator@5 { + regulator-name= "rk818_ldo2"; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <3000000>; + }; + }; + + rk818_ldo3_reg: regulator@6 { + regulator-name= "rk818_ldo3"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <1000000>; + }; + }; + + rk818_ldo4_reg:regulator@7 { + regulator-name= "rk818_ldo4"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-disabled; + regulator-state-uv = <1800000>; + }; + }; + + rk818_ldo5_reg: regulator@8 { + regulator-name= "rk818_ldo5"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <1800000>; + }; + }; + + rk818_ldo6_reg: regulator@9 { + regulator-name= "rk818_ldo6"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-disabled; + regulator-state-uv = <1000000>; + }; + }; + + rk818_ldo7_reg: regulator@10 { + regulator-name= "rk818_ldo7"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <1800000>; + }; + }; + + rk818_ldo8_reg: regulator@11 { + regulator-name= "rk818_ldo8"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <1800000>; + }; + }; + + rk818_ldo9_reg: regulator@12 { + regulator-name= "vccio_sd"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-initial-state = <3>; + regulator-state-mem { + regulator-state-enabled; + regulator-state-uv = <3300000>; + }; + }; + + rk818_ldo10_reg: regulator@13 { + regulator-name= "rk818_ldo10"; + regulator-state-mem { + regulator-state-disabled; + }; + }; + }; + + battery { + ocv_table = <3350 3677 3693 3719 3752 + 3770 3775 3778 3785 3796 + 3812 3839 3881 3907 3933 + 3958 3978 4033 4087 4123 + 4174 >; + design_capacity = <2100>; + design_qmax = <2200>; + max_overcharge = <100>; + max_charge_currentma = <1500>; + max_charge_voltagemv = <4260>; + max_bat_voltagemv = <4200>; + }; +}; + + &ion_cma { reg = <0x00000000 0x28000000>; /* 640MB */ }; diff --git a/drivers/mfd/rk818.c b/drivers/mfd/rk818.c index 536e76803d2b..71e4575fd828 100755 --- a/drivers/mfd/rk818.c +++ b/drivers/mfd/rk818.c @@ -1088,52 +1088,53 @@ static int rk818_resume(struct i2c_client *i2c) static int rk818_pre_init(struct rk818 *rk818) { int ret,val; - printk("%s,line=%d\n", __func__,__LINE__); + printk("%s,line=%d\n", __func__,__LINE__); + ret = rk818_set_bits(rk818, 0xa1, (0xF<<0),(0x7)); ret = rk818_set_bits(rk818, 0xa1,(0x7<<4),(0x7<<4)); //close charger when usb low then 3.4V - ret = rk818_set_bits(rk818, 0x52,(0x1<<1),(0x1<<1)); //no action when vref - ret = rk818_set_bits(rk818, 0x52,(0x1<<0),(0x1<<0)); //enable HDMI 5V + ret = rk818_set_bits(rk818, 0x52,(0x1<<1),(0x1<<1)); //no action when vref + ret = rk818_set_bits(rk818, 0x52,(0x1<<0),(0x1<<0)); //enable HDMI 5V /*******enable switch and boost***********/ val = rk818_reg_read(rk818,RK818_DCDC_EN_REG); - val |= (0x3 << 5); //enable switch1/2 + val |= (0x3 << 5); //enable switch1/2 val |= (0x1 << 4); //enable boost - ret = rk818_reg_write(rk818,RK818_DCDC_EN_REG,val); - if (ret <0) { - printk(KERN_ERR "Unable to write RK818_DCDC_EN_REG reg\n"); - return ret; + ret = rk818_reg_write(rk818,RK818_DCDC_EN_REG,val); + if (ret <0) { + printk(KERN_ERR "Unable to write RK818_DCDC_EN_REG reg\n"); + return ret; } /****************************************/ - + /****************set vbat low **********/ val = rk818_reg_read(rk818,RK818_VB_MON_REG); - val &=(~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK)); - val |= (RK818_VBAT_LOW_3V5 | EN_VBAT_LOW_IRQ); - ret = rk818_reg_write(rk818,RK818_VB_MON_REG,val); - if (ret <0) { - printk(KERN_ERR "Unable to write RK818_VB_MON_REG reg\n"); - return ret; - } + val &=(~(VBAT_LOW_VOL_MASK | VBAT_LOW_ACT_MASK)); + val |= (RK818_VBAT_LOW_3V5 | EN_VBAT_LOW_IRQ); + ret = rk818_reg_write(rk818,RK818_VB_MON_REG,val); + if (ret <0) { + printk(KERN_ERR "Unable to write RK818_VB_MON_REG reg\n"); + return ret; + } /**************************************/ - + /**********mask int****************/ - val = rk818_reg_read(rk818,RK818_INT_STS_MSK_REG1); - val |= (0x1<<0); //mask vout_lo_int - ret = rk818_reg_write(rk818,RK818_INT_STS_MSK_REG1,val); - if (ret <0) { - printk(KERN_ERR "Unable to write RK818_INT_STS_MSK_REG1 reg\n"); - return ret; - } + val = rk818_reg_read(rk818,RK818_INT_STS_MSK_REG1); + val |= (0x1<<0); //mask vout_lo_int + ret = rk818_reg_write(rk818,RK818_INT_STS_MSK_REG1,val); + if (ret <0) { + printk(KERN_ERR "Unable to write RK818_INT_STS_MSK_REG1 reg\n"); + return ret; + } /**********************************/ /**********enable clkout2****************/ - ret = rk818_reg_write(rk818,RK818_CLK32OUT_REG,0x01); - if (ret <0) { - printk(KERN_ERR "Unable to write RK818_CLK32OUT_REG reg\n"); - return ret; - } + ret = rk818_reg_write(rk818,RK818_CLK32OUT_REG,0x01); + if (ret <0) { + printk(KERN_ERR "Unable to write RK818_CLK32OUT_REG reg\n"); + return ret; + } /**********************************/ ret = rk818_clear_bits(rk818, RK818_INT_STS_MSK_REG1,(0x3<<5)); //open rtc int when power on - ret = rk818_set_bits(rk818, RK818_RTC_INT_REG,(0x1<<3),(0x1<<3)); //open rtc int when power on + ret = rk818_set_bits(rk818, RK818_RTC_INT_REG,(0x1<<3),(0x1<<3)); //open rtc int when power on /*****disable otg and boost when in sleep mode****/ val = rk818_reg_read(rk818, RK818_SLEEP_SET_OFF_REG1); -- 2.34.1