@@ -280,6 +280,43 @@ static const struct reg_field rk806_reg_fields[] = {
280
280
[INT_FUNCTION ] = REG_FIELD (0x7b , 2 , 2 ),
281
281
[INT_POL ] = REG_FIELD (0x7b , 1 , 1 ),
282
282
[INT_FC_EN ] = REG_FIELD (0x7b , 0 , 0 ),
283
+
284
+ [BUCK1_SEQ ] = REG_FIELD (0xB2 , 0 , 5 ),
285
+ [BUCK2_SEQ ] = REG_FIELD (0xB3 , 0 , 5 ),
286
+ [BUCK3_SEQ ] = REG_FIELD (0xB4 , 0 , 5 ),
287
+ [BUCK4_SEQ ] = REG_FIELD (0xB5 , 0 , 5 ),
288
+ [BUCK5_SEQ ] = REG_FIELD (0xB6 , 0 , 5 ),
289
+ [BUCK6_SEQ ] = REG_FIELD (0xB7 , 0 , 5 ),
290
+ [BUCK7_SEQ ] = REG_FIELD (0xB8 , 0 , 5 ),
291
+ [BUCK8_SEQ ] = REG_FIELD (0xB9 , 0 , 5 ),
292
+ [BUCK9_SEQ ] = REG_FIELD (0xBA , 0 , 5 ),
293
+ [BUCK10_SEQ ] = REG_FIELD (0xBB , 0 , 5 ),
294
+
295
+ [NLDO1_SEQ ] = REG_FIELD (0xBC , 0 , 5 ),
296
+ [NLDO2_SEQ ] = REG_FIELD (0xBD , 0 , 5 ),
297
+ [NLDO3_SEQ ] = REG_FIELD (0xBE , 0 , 5 ),
298
+ [NLDO4_SEQ ] = REG_FIELD (0xBF , 0 , 5 ),
299
+ [NLDO5_SEQ ] = REG_FIELD (0xC0 , 0 , 5 ),
300
+
301
+ [PLDO6_45_SEQ ] = REG_FIELD (0xB5 , 6 , 7 ),
302
+ [PLDO6_23_SEQ ] = REG_FIELD (0xB6 , 6 , 7 ),
303
+ [PLDO6_01_SEQ ] = REG_FIELD (0xB7 , 6 , 7 ),
304
+
305
+ [PLDO1_45_SEQ ] = REG_FIELD (0xB8 , 6 , 7 ),
306
+ [PLDO1_23_SEQ ] = REG_FIELD (0xB9 , 6 , 7 ),
307
+ [PLDO1_01_SEQ ] = REG_FIELD (0xBA , 6 , 7 ),
308
+
309
+ [PLDO2_45_SEQ ] = REG_FIELD (0xBB , 6 , 7 ),
310
+ [PLDO2_23_SEQ ] = REG_FIELD (0xBC , 6 , 7 ),
311
+ [PLDO2_01_SEQ ] = REG_FIELD (0xBD , 6 , 7 ),
312
+
313
+ [PLDO3_45_SEQ ] = REG_FIELD (0xBE , 6 , 7 ),
314
+ [PLDO3_23_SEQ ] = REG_FIELD (0xBF , 6 , 7 ),
315
+ [PLDO3_01_SEQ ] = REG_FIELD (0xC0 , 6 , 7 ),
316
+
317
+ [PLDO4_SEQ ] = REG_FIELD (0xC1 , 0 , 5 ),
318
+ [PLDO5_SEQ ] = REG_FIELD (0xC2 , 0 , 5 ),
319
+
283
320
[BUCK9_RATE2 ] = REG_FIELD (0xEA , 0 , 0 ),
284
321
[BUCK10_RATE2 ] = REG_FIELD (0xEA , 1 , 1 ),
285
322
[LDO_RATE ] = REG_FIELD (0xEA , 3 , 5 ),
@@ -512,6 +549,55 @@ int rk806_field_write(struct rk806 *rk806,
512
549
}
513
550
EXPORT_SYMBOL_GPL (rk806_field_write );
514
551
552
+ static void rk806_vb_requence_config (struct rk806 * rk806 )
553
+ {
554
+ struct rk806_platform_data * pdata = rk806 -> pdata ;
555
+ int i ;
556
+
557
+ if (!pdata -> support_vb_sequence || !pdata -> vb_shutdown_sequence )
558
+ return ;
559
+
560
+ for (i = RK806_ID_DCDC1 ; i <= RK806_ID_DCDC10 ; i ++ )
561
+ rk806_field_write (rk806 , BUCK1_SEQ + i , pdata -> vb_shutdown_sequence [i ]);
562
+
563
+ for (i = RK806_ID_NLDO1 ; i <= RK806_ID_NLDO5 ; i ++ )
564
+ rk806_field_write (rk806 ,
565
+ NLDO1_SEQ + (i - RK806_ID_NLDO1 ),
566
+ pdata -> vb_shutdown_sequence [i ]);
567
+
568
+ rk806_field_write (rk806 , PLDO1_01_SEQ , pdata -> vb_shutdown_sequence [RK806_ID_PLDO1 ]);
569
+ rk806_field_write (rk806 , PLDO2_01_SEQ , pdata -> vb_shutdown_sequence [RK806_ID_PLDO2 ]);
570
+ rk806_field_write (rk806 , PLDO3_01_SEQ , pdata -> vb_shutdown_sequence [RK806_ID_PLDO3 ]);
571
+ rk806_field_write (rk806 , PLDO4_SEQ , pdata -> vb_shutdown_sequence [RK806_ID_PLDO4 ]);
572
+ rk806_field_write (rk806 , PLDO5_SEQ , pdata -> vb_shutdown_sequence [RK806_ID_PLDO5 ]);
573
+ rk806_field_write (rk806 , PLDO6_01_SEQ , pdata -> vb_shutdown_sequence [RK806_ID_PLDO6 ]);
574
+ }
575
+
576
+ void rk806_shutdown_requence_config (struct rk806 * rk806 )
577
+ {
578
+ struct rk806_platform_data * pdata = rk806 -> pdata ;
579
+ int i ;
580
+
581
+ if (!pdata -> support_shutdown_sequence || !pdata -> shutdown_sequence )
582
+ return ;
583
+
584
+ for (i = RK806_ID_DCDC1 ; i <= RK806_ID_DCDC10 ; i ++ )
585
+ rk806_field_write (rk806 , BUCK1_SEQ + i , pdata -> shutdown_sequence [i ]);
586
+
587
+ for (i = RK806_ID_NLDO1 ; i <= RK806_ID_NLDO5 ; i ++ )
588
+ rk806_field_write (rk806 ,
589
+ NLDO1_SEQ + (i - RK806_ID_NLDO1 ),
590
+ pdata -> shutdown_sequence [i ]);
591
+
592
+ rk806_field_write (rk806 , PLDO1_01_SEQ , pdata -> shutdown_sequence [RK806_ID_PLDO1 ]);
593
+ rk806_field_write (rk806 , PLDO2_01_SEQ , pdata -> shutdown_sequence [RK806_ID_PLDO2 ]);
594
+ rk806_field_write (rk806 , PLDO3_01_SEQ , pdata -> shutdown_sequence [RK806_ID_PLDO3 ]);
595
+ rk806_field_write (rk806 , PLDO4_SEQ , pdata -> shutdown_sequence [RK806_ID_PLDO4 ]);
596
+ rk806_field_write (rk806 , PLDO5_SEQ , pdata -> shutdown_sequence [RK806_ID_PLDO5 ]);
597
+ rk806_field_write (rk806 , PLDO6_01_SEQ , pdata -> shutdown_sequence [RK806_ID_PLDO6 ]);
598
+ }
599
+ EXPORT_SYMBOL_GPL (rk806_shutdown_requence_config );
600
+
515
601
static void rk806_irq_init (struct rk806 * rk806 )
516
602
{
517
603
/* INT pin polarity active low */
@@ -576,6 +662,7 @@ static void rk806_vb_force_shutdown_init(struct rk806 *rk806)
576
662
{
577
663
struct rk806_platform_data * pdata = rk806 -> pdata ;
578
664
665
+ rk806_vb_requence_config (rk806 );
579
666
rk806_field_write (rk806 , VB_LO_ACT , VB_LO_ACT_SD );
580
667
rk806_field_write (rk806 , VB_LO_SEL ,
581
668
(pdata -> low_voltage_threshold - 2800 ) / 100 );
@@ -701,6 +788,38 @@ static int rk806_parse_dt(struct rk806 *rk806)
701
788
if (device_property_read_bool (dev , "vdc-wakeup-enable" ))
702
789
pdata -> vdc_wakeup_enable = 1 ;
703
790
791
+ pdata -> shutdown_sequence = devm_kzalloc (dev ,
792
+ RK806_ID_END * sizeof (int ),
793
+ GFP_KERNEL );
794
+ if (!pdata -> shutdown_sequence )
795
+ return - EINVAL ;
796
+
797
+ pdata -> support_shutdown_sequence = 1 ;
798
+ ret = device_property_read_u32_array (dev ,
799
+ "shutdown-sequence" ,
800
+ pdata -> shutdown_sequence ,
801
+ RK806_ID_END );
802
+ if (ret ) {
803
+ dev_info (dev , "shutdown-sequence missing!\n" );
804
+ pdata -> support_shutdown_sequence = 0 ;
805
+ }
806
+
807
+ pdata -> vb_shutdown_sequence = devm_kzalloc (dev ,
808
+ RK806_ID_END * sizeof (int ),
809
+ GFP_KERNEL );
810
+ if (!pdata -> vb_shutdown_sequence )
811
+ return - EINVAL ;
812
+
813
+ pdata -> support_vb_sequence = 1 ;
814
+ ret = device_property_read_u32_array (dev ,
815
+ "vb-shutdown-sequence" ,
816
+ pdata -> vb_shutdown_sequence ,
817
+ RK806_ID_END );
818
+ if (ret ) {
819
+ pdata -> support_vb_sequence = 0 ;
820
+ dev_info (dev , "vb-shutdown-sequence missing!\n" );
821
+ }
822
+
704
823
return 0 ;
705
824
}
706
825
0 commit comments