@@ -37,6 +37,11 @@ static const struct resource rk817_rtc_resources[] = {
3737 DEFINE_RES_IRQ (RK817_IRQ_RTC_ALARM ),
3838};
3939
40+ static const struct resource rk801_key_resources [] = {
41+ DEFINE_RES_IRQ (RK801_IRQ_PWRON_FALL ),
42+ DEFINE_RES_IRQ (RK801_IRQ_PWRON_RISE ),
43+ };
44+
4045static const struct resource rk805_key_resources [] = {
4146 DEFINE_RES_IRQ (RK805_IRQ_PWRON_RISE ),
4247 DEFINE_RES_IRQ (RK805_IRQ_PWRON_FALL ),
@@ -57,6 +62,14 @@ static const struct resource rk817_charger_resources[] = {
5762 DEFINE_RES_IRQ (RK817_IRQ_PLUG_OUT ),
5863};
5964
65+ static const struct mfd_cell rk801s [] = {
66+ { .name = "rk808-regulator" , },
67+ { .name = "rk805-pwrkey" ,
68+ .num_resources = ARRAY_SIZE (rk801_key_resources ),
69+ .resources = & rk801_key_resources [0 ],
70+ },
71+ };
72+
6073static const struct mfd_cell rk805s [] = {
6174 { .name = "rk808-clkout" , },
6275 { .name = "rk808-regulator" , },
@@ -139,6 +152,15 @@ static const struct mfd_cell rk818s[] = {
139152 },
140153};
141154
155+ static const struct rk808_reg_data rk801_pre_init_reg [] = {
156+ { RK801_SLEEP_CFG_REG , RK801_SLEEP_FUN_MSK , RK801_NONE_FUN },
157+ { RK801_SYS_CFG2_REG , RK801_RST_MSK , RK801_RST_RESTART_REG_RESETB },
158+ { RK801_INT_CONFIG_REG , RK801_INT_POL_MSK , RK801_INT_ACT_L },
159+ { RK801_POWER_FPWM_EN_REG , RK801_PLDO_HRDEC_EN , RK801_PLDO_HRDEC_EN },
160+ { RK801_BUCK_DEBUG5_REG , MASK_ALL , 0x54 },
161+ { RK801_CON_BACK1_REG , MASK_ALL , 0x18 },
162+ };
163+
142164static const struct rk808_reg_data rk805_pre_init_reg [] = {
143165 {RK805_BUCK1_CONFIG_REG , RK805_BUCK1_2_ILMAX_MASK ,
144166 RK805_BUCK1_2_ILMAX_4000MA },
@@ -284,6 +306,37 @@ static const struct rk808_reg_data rk818_pre_init_reg[] = {
284306 VB_LO_SEL_3500MV },
285307};
286308
309+ static const struct regmap_irq rk801_irqs [] = {
310+ [RK801_IRQ_PWRON_FALL ] = {
311+ .mask = RK801_IRQ_PWRON_FALL_MSK ,
312+ .reg_offset = 0 ,
313+ },
314+ [RK801_IRQ_PWRON_RISE ] = {
315+ .mask = RK801_IRQ_PWRON_RISE_MSK ,
316+ .reg_offset = 0 ,
317+ },
318+ [RK801_IRQ_PWRON ] = {
319+ .mask = RK801_IRQ_PWRON_MSK ,
320+ .reg_offset = 0 ,
321+ },
322+ [RK801_IRQ_PWRON_LP ] = {
323+ .mask = RK801_IRQ_PWRON_LP_MSK ,
324+ .reg_offset = 0 ,
325+ },
326+ [RK801_IRQ_HOTDIE ] = {
327+ .mask = RK801_IRQ_HOTDIE_MSK ,
328+ .reg_offset = 0 ,
329+ },
330+ [RK801_IRQ_VDC_RISE ] = {
331+ .mask = RK801_IRQ_VDC_RISE_MSK ,
332+ .reg_offset = 0 ,
333+ },
334+ [RK801_IRQ_VDC_FALL ] = {
335+ .mask = RK801_IRQ_VDC_FALL_MSK ,
336+ .reg_offset = 0 ,
337+ },
338+ };
339+
287340static const struct regmap_irq rk805_irqs [] = {
288341 [RK805_IRQ_PWRON_RISE ] = {
289342 .mask = RK805_IRQ_PWRON_RISE_MSK ,
@@ -532,6 +585,17 @@ static const struct regmap_irq rk817_irqs[RK817_IRQ_END] = {
532585 REGMAP_IRQ_REG_LINE (23 , 8 )
533586};
534587
588+ static const struct regmap_irq_chip rk801_irq_chip = {
589+ .name = "rk801" ,
590+ .irqs = rk801_irqs ,
591+ .num_irqs = ARRAY_SIZE (rk801_irqs ),
592+ .num_regs = 1 ,
593+ .status_base = RK801_INT_STS0_REG ,
594+ .mask_base = RK801_INT_MASK0_REG ,
595+ .ack_base = RK801_INT_STS0_REG ,
596+ .init_ack_masked = true,
597+ };
598+
535599static const struct regmap_irq_chip rk805_irq_chip = {
536600 .name = "rk805" ,
537601 .irqs = rk805_irqs ,
@@ -610,6 +674,10 @@ static int rk808_power_off(struct sys_off_data *data)
610674 unsigned int reg , bit ;
611675
612676 switch (rk808 -> variant ) {
677+ case RK801_ID :
678+ reg = RK801_SYS_CFG2_REG ;
679+ bit = DEV_OFF ;
680+ break ;
613681 case RK805_ID :
614682 reg = RK805_DEV_CTRL_REG ;
615683 bit = DEV_OFF ;
@@ -714,6 +782,13 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
714782 dev_set_drvdata (dev , rk808 );
715783
716784 switch (rk808 -> variant ) {
785+ case RK801_ID :
786+ rk808 -> regmap_irq_chip = & rk801_irq_chip ;
787+ pre_init_reg = rk801_pre_init_reg ;
788+ nr_pre_init_regs = ARRAY_SIZE (rk801_pre_init_reg );
789+ cells = rk801s ;
790+ nr_cells = ARRAY_SIZE (rk801s );
791+ break ;
717792 case RK805_ID :
718793 rk808 -> regmap_irq_chip = & rk805_irq_chip ;
719794 pre_init_reg = rk805_pre_init_reg ;
@@ -831,6 +906,12 @@ int rk8xx_suspend(struct device *dev)
831906 int ret = 0 ;
832907
833908 switch (rk808 -> variant ) {
909+ case RK801_ID :
910+ ret = regmap_update_bits (rk808 -> regmap ,
911+ RK801_SLEEP_CFG_REG ,
912+ RK801_SLEEP_FUN_MSK ,
913+ RK801_SLEEP_FUN );
914+ break ;
834915 case RK805_ID :
835916 ret = regmap_update_bits (rk808 -> regmap ,
836917 RK805_GPIO_IO_POL_REG ,
0 commit comments