pmic: rk8xx: support power key config from dts

Signed-off-by: Shunqing Chen <csq@rock-chips.com>
Change-Id: I4b2def4e5b171b2b46f26695e9cabec8a7b496e2
This commit is contained in:
Shunqing Chen 2020-11-25 08:26:44 +00:00 committed by Jianhong Chen
parent c91220724d
commit 00d11ef213
2 changed files with 52 additions and 1 deletions

View File

@ -333,7 +333,7 @@ static void rk8xx_plug_out_handler(int irq, void *data)
static int rk8xx_ofdata_to_platdata(struct udevice *dev) static int rk8xx_ofdata_to_platdata(struct udevice *dev)
{ {
struct rk8xx_priv *rk8xx = dev_get_priv(dev); struct rk8xx_priv *rk8xx = dev_get_priv(dev);
u32 interrupt, phandle; u32 interrupt, phandle, val;
int ret; int ret;
phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA); phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA);
@ -354,6 +354,22 @@ static int rk8xx_ofdata_to_platdata(struct udevice *dev)
return rk8xx->irq; return rk8xx->irq;
} }
val = dev_read_u32_default(dev, "long-press-off-time-sec", 0);
if (val <= 6)
rk8xx->lp_off_time = RK8XX_LP_TIME_6S;
else if (val <= 8)
rk8xx->lp_off_time = RK8XX_LP_TIME_8S;
else if (val <= 10)
rk8xx->lp_off_time = RK8XX_LP_TIME_10S;
else
rk8xx->lp_off_time = RK8XX_LP_TIME_12S;
val = dev_read_u32_default(dev, "long-press-restart", 0);
if (val)
rk8xx->lp_action = RK8XX_LP_RESTART;
else
rk8xx->lp_action = RK8XX_LP_OFF;
return 0; return 0;
} }
@ -424,6 +440,7 @@ static int rk8xx_probe(struct udevice *dev)
int ret = 0, i, show_variant; int ret = 0, i, show_variant;
uint8_t msb, lsb, id_msb, id_lsb; uint8_t msb, lsb, id_msb, id_lsb;
uint8_t on_source = 0, off_source = 0; uint8_t on_source = 0, off_source = 0;
uint8_t pwron_key = 0, lp_off_msk = 0, lp_act_msk = 0;
uint8_t power_en0, power_en1, power_en2, power_en3; uint8_t power_en0, power_en1, power_en2, power_en3;
uint8_t value; uint8_t value;
@ -449,15 +466,23 @@ static int rk8xx_probe(struct udevice *dev)
switch (priv->variant) { switch (priv->variant) {
case RK808_ID: case RK808_ID:
show_variant = 0x808; /* RK808 hardware ID is 0 */ show_variant = 0x808; /* RK808 hardware ID is 0 */
pwron_key = RK8XX_DEVCTRL_REG;
lp_off_msk = RK8XX_LP_OFF_MSK;
break; break;
case RK805_ID: case RK805_ID:
case RK816_ID: case RK816_ID:
on_source = RK8XX_ON_SOURCE; on_source = RK8XX_ON_SOURCE;
off_source = RK8XX_OFF_SOURCE; off_source = RK8XX_OFF_SOURCE;
pwron_key = RK8XX_DEVCTRL_REG;
lp_off_msk = RK8XX_LP_OFF_MSK;
lp_act_msk = RK8XX_LP_ACTION_MSK;
break; break;
case RK818_ID: case RK818_ID:
on_source = RK8XX_ON_SOURCE; on_source = RK8XX_ON_SOURCE;
off_source = RK8XX_OFF_SOURCE; off_source = RK8XX_OFF_SOURCE;
pwron_key = RK8XX_DEVCTRL_REG;
lp_off_msk = RK8XX_LP_OFF_MSK;
lp_act_msk = RK8XX_LP_ACTION_MSK;
/* set current if no fuel gauge */ /* set current if no fuel gauge */
if (!ofnode_valid(dev_read_subnode(dev, "battery"))) { if (!ofnode_valid(dev_read_subnode(dev, "battery"))) {
init_current = rk818_init_current; init_current = rk818_init_current;
@ -468,6 +493,9 @@ static int rk8xx_probe(struct udevice *dev)
case RK817_ID: case RK817_ID:
on_source = RK817_ON_SOURCE; on_source = RK817_ON_SOURCE;
off_source = RK817_OFF_SOURCE; off_source = RK817_OFF_SOURCE;
pwron_key = RK817_PWRON_KEY;
lp_off_msk = RK8XX_LP_OFF_MSK;
lp_act_msk = RK8XX_LP_ACTION_MSK;
init_data = rk817_init_reg; init_data = rk817_init_reg;
init_data_num = ARRAY_SIZE(rk817_init_reg); init_data_num = ARRAY_SIZE(rk817_init_reg);
power_en0 = pmic_reg_read(dev, RK817_POWER_EN0); power_en0 = pmic_reg_read(dev, RK817_POWER_EN0);
@ -517,6 +545,16 @@ static int rk8xx_probe(struct udevice *dev)
pmic_reg_read(dev, off_source)); pmic_reg_read(dev, off_source));
printf("\n"); printf("\n");
if (pwron_key) {
value = pmic_reg_read(dev, pwron_key);
value &= ~(lp_off_msk | lp_act_msk);
if (lp_off_msk)
value |= priv->lp_off_time;
if (lp_act_msk)
value |= priv->lp_action;
pmic_reg_write(dev, pwron_key, value);
}
ret = rk8xx_irq_chip_init(dev); ret = rk8xx_irq_chip_init(dev);
if (ret) { if (ret) {
printf("IRQ chip initial failed\n"); printf("IRQ chip initial failed\n");

View File

@ -216,6 +216,17 @@ enum {
#define RK817_OFF_SOURCE 0xf6 #define RK817_OFF_SOURCE 0xf6
#define RK817_NUM_OF_REGS 0xff #define RK817_NUM_OF_REGS 0xff
#define RK8XX_DEVCTRL_REG 0x4b
#define RK817_PWRON_KEY 0xf7
#define RK8XX_LP_ACTION_MSK BIT(6)
#define RK8XX_LP_OFF (0 << 6)
#define RK8XX_LP_RESTART (1 << 6)
#define RK8XX_LP_OFF_MSK BIT(4) | BIT(5)
#define RK8XX_LP_TIME_6S (0 << 4)
#define RK8XX_LP_TIME_8S (1 << 4)
#define RK8XX_LP_TIME_10S (2 << 4)
#define RK8XX_LP_TIME_12S (3 << 4)
/* IRQ definitions */ /* IRQ definitions */
#define RK8XX_IRQ_PWRON_FALL 0 #define RK8XX_IRQ_PWRON_FALL 0
#define RK8XX_IRQ_PWRON_RISE 1 #define RK8XX_IRQ_PWRON_RISE 1
@ -269,6 +280,8 @@ struct rk8xx_priv {
int variant; int variant;
int irq; int irq;
struct virq_chip *irq_chip; struct virq_chip *irq_chip;
int lp_off_time;
int lp_action;
}; };
int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt); int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt);