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:
parent
c91220724d
commit
00d11ef213
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue