@@ -37,6 +37,11 @@ static const struct resource rk805_key_resources[] = {
3737 DEFINE_RES_IRQ (RK805_IRQ_PWRON_FALL ),
3838};
3939
40+ static struct resource rk806_pwrkey_resources [] = {
41+ DEFINE_RES_IRQ (RK806_IRQ_PWRON_FALL ),
42+ DEFINE_RES_IRQ (RK806_IRQ_PWRON_RISE ),
43+ };
44+
4045static const struct resource rk817_pwrkey_resources [] = {
4146 DEFINE_RES_IRQ (RK817_IRQ_PWRON_RISE ),
4247 DEFINE_RES_IRQ (RK817_IRQ_PWRON_FALL ),
@@ -64,6 +69,17 @@ static const struct mfd_cell rk805s[] = {
6469 },
6570};
6671
72+ static const struct mfd_cell rk806s [] = {
73+ { .name = "rk805-pinctrl" , .id = PLATFORM_DEVID_AUTO , },
74+ { .name = "rk808-regulator" , .id = PLATFORM_DEVID_AUTO , },
75+ {
76+ .name = "rk805-pwrkey" ,
77+ .resources = rk806_pwrkey_resources ,
78+ .num_resources = ARRAY_SIZE (rk806_pwrkey_resources ),
79+ .id = PLATFORM_DEVID_AUTO ,
80+ },
81+ };
82+
6783static const struct mfd_cell rk808s [] = {
6884 { .name = "rk808-clkout" , .id = PLATFORM_DEVID_NONE , },
6985 { .name = "rk808-regulator" , .id = PLATFORM_DEVID_NONE , },
@@ -123,6 +139,12 @@ static const struct rk808_reg_data rk805_pre_init_reg[] = {
123139 {RK805_THERMAL_REG , TEMP_HOTDIE_MSK , TEMP115C },
124140};
125141
142+ static const struct rk808_reg_data rk806_pre_init_reg [] = {
143+ { RK806_GPIO_INT_CONFIG , RK806_INT_POL_MSK , RK806_INT_POL_L },
144+ { RK806_SYS_CFG3 , RK806_SLAVE_RESTART_FUN_MSK , RK806_SLAVE_RESTART_FUN_EN },
145+ { RK806_SYS_OPTION , RK806_SYS_ENB2_2M_MSK , RK806_SYS_ENB2_2M_EN },
146+ };
147+
126148static const struct rk808_reg_data rk808_pre_init_reg [] = {
127149 { RK808_BUCK3_CONFIG_REG , BUCK_ILMIN_MASK , BUCK_ILMIN_150MA },
128150 { RK808_BUCK4_CONFIG_REG , BUCK_ILMIN_MASK , BUCK_ILMIN_200MA },
@@ -273,6 +295,27 @@ static const struct regmap_irq rk805_irqs[] = {
273295 },
274296};
275297
298+ static const struct regmap_irq rk806_irqs [] = {
299+ /* INT_STS0 IRQs */
300+ REGMAP_IRQ_REG (RK806_IRQ_PWRON_FALL , 0 , RK806_INT_STS_PWRON_FALL ),
301+ REGMAP_IRQ_REG (RK806_IRQ_PWRON_RISE , 0 , RK806_INT_STS_PWRON_RISE ),
302+ REGMAP_IRQ_REG (RK806_IRQ_PWRON , 0 , RK806_INT_STS_PWRON ),
303+ REGMAP_IRQ_REG (RK806_IRQ_PWRON_LP , 0 , RK806_INT_STS_PWRON_LP ),
304+ REGMAP_IRQ_REG (RK806_IRQ_HOTDIE , 0 , RK806_INT_STS_HOTDIE ),
305+ REGMAP_IRQ_REG (RK806_IRQ_VDC_RISE , 0 , RK806_INT_STS_VDC_RISE ),
306+ REGMAP_IRQ_REG (RK806_IRQ_VDC_FALL , 0 , RK806_INT_STS_VDC_FALL ),
307+ REGMAP_IRQ_REG (RK806_IRQ_VB_LO , 0 , RK806_INT_STS_VB_LO ),
308+ /* INT_STS1 IRQs */
309+ REGMAP_IRQ_REG (RK806_IRQ_REV0 , 1 , RK806_INT_STS_REV0 ),
310+ REGMAP_IRQ_REG (RK806_IRQ_REV1 , 1 , RK806_INT_STS_REV1 ),
311+ REGMAP_IRQ_REG (RK806_IRQ_REV2 , 1 , RK806_INT_STS_REV2 ),
312+ REGMAP_IRQ_REG (RK806_IRQ_CRC_ERROR , 1 , RK806_INT_STS_CRC_ERROR ),
313+ REGMAP_IRQ_REG (RK806_IRQ_SLP3_GPIO , 1 , RK806_INT_STS_SLP3_GPIO ),
314+ REGMAP_IRQ_REG (RK806_IRQ_SLP2_GPIO , 1 , RK806_INT_STS_SLP2_GPIO ),
315+ REGMAP_IRQ_REG (RK806_IRQ_SLP1_GPIO , 1 , RK806_INT_STS_SLP1_GPIO ),
316+ REGMAP_IRQ_REG (RK806_IRQ_WDT , 1 , RK806_INT_STS_WDT ),
317+ };
318+
276319static const struct regmap_irq rk808_irqs [] = {
277320 /* INT_STS */
278321 [RK808_IRQ_VOUT_LO ] = {
@@ -423,6 +466,18 @@ static struct regmap_irq_chip rk805_irq_chip = {
423466 .init_ack_masked = true,
424467};
425468
469+ static struct regmap_irq_chip rk806_irq_chip = {
470+ .name = "rk806" ,
471+ .irqs = rk806_irqs ,
472+ .num_irqs = ARRAY_SIZE (rk806_irqs ),
473+ .num_regs = 2 ,
474+ .irq_reg_stride = 2 ,
475+ .mask_base = RK806_INT_MSK0 ,
476+ .status_base = RK806_INT_STS0 ,
477+ .ack_base = RK806_INT_STS0 ,
478+ .init_ack_masked = true,
479+ };
480+
426481static const struct regmap_irq_chip rk808_irq_chip = {
427482 .name = "rk808" ,
428483 .irqs = rk808_irqs ,
@@ -549,6 +604,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
549604 struct rk808 * rk808 ;
550605 const struct rk808_reg_data * pre_init_reg ;
551606 const struct mfd_cell * cells ;
607+ int dual_support = 0 ;
552608 int nr_pre_init_regs ;
553609 int nr_cells ;
554610 int ret ;
@@ -570,6 +626,14 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
570626 cells = rk805s ;
571627 nr_cells = ARRAY_SIZE (rk805s );
572628 break ;
629+ case RK806_ID :
630+ rk808 -> regmap_irq_chip = & rk806_irq_chip ;
631+ pre_init_reg = rk806_pre_init_reg ;
632+ nr_pre_init_regs = ARRAY_SIZE (rk806_pre_init_reg );
633+ cells = rk806s ;
634+ nr_cells = ARRAY_SIZE (rk806s );
635+ dual_support = IRQF_SHARED ;
636+ break ;
573637 case RK808_ID :
574638 rk808 -> regmap_irq_chip = & rk808_irq_chip ;
575639 pre_init_reg = rk808_pre_init_reg ;
@@ -601,7 +665,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
601665 return dev_err_probe (dev , - EINVAL , "No interrupt support, no core IRQ\n" );
602666
603667 ret = devm_regmap_add_irq_chip (dev , rk808 -> regmap , irq ,
604- IRQF_ONESHOT , -1 ,
668+ IRQF_ONESHOT | dual_support , -1 ,
605669 rk808 -> regmap_irq_chip , & rk808 -> irq_data );
606670 if (ret )
607671 return dev_err_probe (dev , ret , "Failed to add irq_chip\n" );
@@ -616,8 +680,7 @@ int rk8xx_probe(struct device *dev, int variant, unsigned int irq, struct regmap
616680 pre_init_reg [i ].addr );
617681 }
618682
619- ret = devm_mfd_add_devices (dev , PLATFORM_DEVID_NONE ,
620- cells , nr_cells , NULL , 0 ,
683+ ret = devm_mfd_add_devices (dev , 0 , cells , nr_cells , NULL , 0 ,
621684 regmap_irq_get_domain (rk808 -> irq_data ));
622685 if (ret )
623686 return dev_err_probe (dev , ret , "failed to add MFD devices\n" );
0 commit comments