52
52
53
53
/*
54
54
* ADI slave devices include RTC, ADC, regulator, charger, thermal and so on.
55
- * The slave devices address offset is always 0x8000 and size is 4K.
55
+ * ADI supports 12/14bit address for r2p0, and additional 17bit for r3p0 or
56
+ * later versions. Since bit[1:0] are zero, so the spec describe them as
57
+ * 10/12/15bit address mode.
58
+ * The 10bit mode supports sigle slave, 12/15bit mode supports 3 slave, the
59
+ * high two bits is slave_id.
60
+ * The slave devices address offset is 0x8000 for 10/12bit address mode,
61
+ * and 0x20000 for 15bit mode.
56
62
*/
57
- #define ADI_SLAVE_ADDR_SIZE SZ_4K
58
- #define ADI_SLAVE_OFFSET 0x8000
63
+ #define ADI_10BIT_SLAVE_ADDR_SIZE SZ_4K
64
+ #define ADI_10BIT_SLAVE_OFFSET 0x8000
65
+ #define ADI_12BIT_SLAVE_ADDR_SIZE SZ_16K
66
+ #define ADI_12BIT_SLAVE_OFFSET 0x8000
67
+ #define ADI_15BIT_SLAVE_ADDR_SIZE SZ_128K
68
+ #define ADI_15BIT_SLAVE_OFFSET 0x20000
59
69
60
70
/* Timeout (ms) for the trylock of hardware spinlocks */
61
71
#define ADI_HWSPINLOCK_TIMEOUT 5000
67
77
68
78
#define ADI_FIFO_DRAIN_TIMEOUT 1000
69
79
#define ADI_READ_TIMEOUT 2000
70
- #define REG_ADDR_LOW_MASK GENMASK(11, 0)
80
+
81
+ /*
82
+ * Read back address from REG_ADI_RD_DATA bit[30:16] which maps to:
83
+ * REG_ADI_RD_CMD bit[14:0] for r2p0
84
+ * REG_ADI_RD_CMD bit[16:2] for r3p0
85
+ */
86
+ #define RDBACK_ADDR_MASK_R2 GENMASK(14, 0)
87
+ #define RDBACK_ADDR_MASK_R3 GENMASK(16, 2)
88
+ #define RDBACK_ADDR_SHIFT_R3 2
71
89
72
90
/* Registers definitions for PMIC watchdog controller */
73
- #define REG_WDG_LOAD_LOW 0x80
74
- #define REG_WDG_LOAD_HIGH 0x84
75
- #define REG_WDG_CTRL 0x88
76
- #define REG_WDG_LOCK 0xa0
91
+ #define REG_WDG_LOAD_LOW 0x0
92
+ #define REG_WDG_LOAD_HIGH 0x4
93
+ #define REG_WDG_CTRL 0x8
94
+ #define REG_WDG_LOCK 0x20
77
95
78
96
/* Bits definitions for register REG_WDG_CTRL */
79
97
#define BIT_WDG_RUN BIT(1)
80
98
#define BIT_WDG_NEW BIT(2)
81
99
#define BIT_WDG_RST BIT(3)
82
100
101
+ /* Bits definitions for register REG_MODULE_EN */
102
+ #define BIT_WDG_EN BIT(2)
103
+
83
104
/* Registers definitions for PMIC */
84
105
#define PMIC_RST_STATUS 0xee8
85
106
#define PMIC_MODULE_EN 0xc08
86
107
#define PMIC_CLK_EN 0xc18
87
- #define BIT_WDG_EN BIT(2)
108
+ #define PMIC_WDG_BASE 0x80
88
109
89
110
/* Definition of PMIC reset status register */
90
111
#define HWRST_STATUS_SECURITY 0x02
107
128
#define WDG_LOAD_MASK GENMASK(15, 0)
108
129
#define WDG_UNLOCK_KEY 0xe551
109
130
131
+ struct sprd_adi_wdg {
132
+ u32 base ;
133
+ u32 rst_sts ;
134
+ u32 wdg_en ;
135
+ u32 wdg_clk ;
136
+ };
137
+
138
+ struct sprd_adi_data {
139
+ u32 slave_offset ;
140
+ u32 slave_addr_size ;
141
+ int (* read_check )(u32 val , u32 reg );
142
+ int (* restart )(struct notifier_block * this ,
143
+ unsigned long mode , void * cmd );
144
+ void (* wdg_rst )(void * p );
145
+ };
146
+
110
147
struct sprd_adi {
111
148
struct spi_controller * ctlr ;
112
149
struct device * dev ;
@@ -115,11 +152,12 @@ struct sprd_adi {
115
152
unsigned long slave_vbase ;
116
153
unsigned long slave_pbase ;
117
154
struct notifier_block restart_handler ;
155
+ const struct sprd_adi_data * data ;
118
156
};
119
157
120
158
static int sprd_adi_check_addr (struct sprd_adi * sadi , u32 reg )
121
159
{
122
- if (reg >= ADI_SLAVE_ADDR_SIZE ) {
160
+ if (reg >= sadi -> data -> slave_addr_size ) {
123
161
dev_err (sadi -> dev ,
124
162
"slave address offset is incorrect, reg = 0x%x\n" ,
125
163
reg );
@@ -155,11 +193,35 @@ static int sprd_adi_fifo_is_full(struct sprd_adi *sadi)
155
193
return readl_relaxed (sadi -> base + REG_ADI_ARM_FIFO_STS ) & BIT_FIFO_FULL ;
156
194
}
157
195
196
+ static int sprd_adi_read_check (u32 val , u32 addr )
197
+ {
198
+ u32 rd_addr ;
199
+
200
+ rd_addr = (val & RD_ADDR_MASK ) >> RD_ADDR_SHIFT ;
201
+
202
+ if (rd_addr != addr ) {
203
+ pr_err ("ADI read error, addr = 0x%x, val = 0x%x\n" , addr , val );
204
+ return - EIO ;
205
+ }
206
+
207
+ return 0 ;
208
+ }
209
+
210
+ static int sprd_adi_read_check_r2 (u32 val , u32 reg )
211
+ {
212
+ return sprd_adi_read_check (val , reg & RDBACK_ADDR_MASK_R2 );
213
+ }
214
+
215
+ static int sprd_adi_read_check_r3 (u32 val , u32 reg )
216
+ {
217
+ return sprd_adi_read_check (val , (reg & RDBACK_ADDR_MASK_R3 ) >> RDBACK_ADDR_SHIFT_R3 );
218
+ }
219
+
158
220
static int sprd_adi_read (struct sprd_adi * sadi , u32 reg , u32 * read_val )
159
221
{
160
222
int read_timeout = ADI_READ_TIMEOUT ;
161
223
unsigned long flags ;
162
- u32 val , rd_addr ;
224
+ u32 val ;
163
225
int ret = 0 ;
164
226
165
227
if (sadi -> hwlock ) {
@@ -203,18 +265,15 @@ static int sprd_adi_read(struct sprd_adi *sadi, u32 reg, u32 *read_val)
203
265
}
204
266
205
267
/*
206
- * The return value includes data and read register address, from bit 0
207
- * to bit 15 are data, and from bit 16 to bit 30 are read register
208
- * address. Then we can check the returned register address to validate
209
- * data.
268
+ * The return value before adi r5p0 includes data and read register
269
+ * address, from bit 0to bit 15 are data, and from bit 16 to bit 30
270
+ * are read register address. Then we can check the returned register
271
+ * address to validate data.
210
272
*/
211
- rd_addr = (val & RD_ADDR_MASK ) >> RD_ADDR_SHIFT ;
212
-
213
- if (rd_addr != (reg & REG_ADDR_LOW_MASK )) {
214
- dev_err (sadi -> dev , "read error, reg addr = 0x%x, val = 0x%x\n" ,
215
- reg , val );
216
- ret = - EIO ;
217
- goto out ;
273
+ if (sadi -> data -> read_check ) {
274
+ ret = sadi -> data -> read_check (val , reg );
275
+ if (ret < 0 )
276
+ goto out ;
218
277
}
219
278
220
279
* read_val = val & RD_VALUE_MASK ;
@@ -299,20 +358,21 @@ static int sprd_adi_transfer_one(struct spi_controller *ctlr,
299
358
return ret ;
300
359
}
301
360
302
- static void sprd_adi_set_wdt_rst_mode (struct sprd_adi * sadi )
361
+ static void sprd_adi_set_wdt_rst_mode (void * p )
303
362
{
304
363
#if IS_ENABLED (CONFIG_SPRD_WATCHDOG )
305
364
u32 val ;
365
+ struct sprd_adi * sadi = (struct sprd_adi * )p ;
306
366
307
- /* Set default watchdog reboot mode */
367
+ /* Init watchdog reset mode */
308
368
sprd_adi_read (sadi , PMIC_RST_STATUS , & val );
309
369
val |= HWRST_STATUS_WATCHDOG ;
310
370
sprd_adi_write (sadi , PMIC_RST_STATUS , val );
311
371
#endif
312
372
}
313
373
314
- static int sprd_adi_restart_handler (struct notifier_block * this ,
315
- unsigned long mode , void * cmd )
374
+ static int sprd_adi_restart (struct notifier_block * this , unsigned long mode ,
375
+ void * cmd , struct sprd_adi_wdg * wdg )
316
376
{
317
377
struct sprd_adi * sadi = container_of (this , struct sprd_adi ,
318
378
restart_handler );
@@ -348,47 +408,60 @@ static int sprd_adi_restart_handler(struct notifier_block *this,
348
408
reboot_mode = HWRST_STATUS_NORMAL ;
349
409
350
410
/* Record the reboot mode */
351
- sprd_adi_read (sadi , PMIC_RST_STATUS , & val );
411
+ sprd_adi_read (sadi , wdg -> rst_sts , & val );
352
412
val &= ~HWRST_STATUS_WATCHDOG ;
353
413
val |= reboot_mode ;
354
- sprd_adi_write (sadi , PMIC_RST_STATUS , val );
414
+ sprd_adi_write (sadi , wdg -> rst_sts , val );
355
415
356
416
/* Enable the interface clock of the watchdog */
357
- sprd_adi_read (sadi , PMIC_MODULE_EN , & val );
417
+ sprd_adi_read (sadi , wdg -> wdg_en , & val );
358
418
val |= BIT_WDG_EN ;
359
- sprd_adi_write (sadi , PMIC_MODULE_EN , val );
419
+ sprd_adi_write (sadi , wdg -> wdg_en , val );
360
420
361
421
/* Enable the work clock of the watchdog */
362
- sprd_adi_read (sadi , PMIC_CLK_EN , & val );
422
+ sprd_adi_read (sadi , wdg -> wdg_clk , & val );
363
423
val |= BIT_WDG_EN ;
364
- sprd_adi_write (sadi , PMIC_CLK_EN , val );
424
+ sprd_adi_write (sadi , wdg -> wdg_clk , val );
365
425
366
426
/* Unlock the watchdog */
367
- sprd_adi_write (sadi , REG_WDG_LOCK , WDG_UNLOCK_KEY );
427
+ sprd_adi_write (sadi , wdg -> base + REG_WDG_LOCK , WDG_UNLOCK_KEY );
368
428
369
- sprd_adi_read (sadi , REG_WDG_CTRL , & val );
429
+ sprd_adi_read (sadi , wdg -> base + REG_WDG_CTRL , & val );
370
430
val |= BIT_WDG_NEW ;
371
- sprd_adi_write (sadi , REG_WDG_CTRL , val );
431
+ sprd_adi_write (sadi , wdg -> base + REG_WDG_CTRL , val );
372
432
373
433
/* Load the watchdog timeout value, 50ms is always enough. */
374
- sprd_adi_write (sadi , REG_WDG_LOAD_HIGH , 0 );
375
- sprd_adi_write (sadi , REG_WDG_LOAD_LOW ,
434
+ sprd_adi_write (sadi , wdg -> base + REG_WDG_LOAD_HIGH , 0 );
435
+ sprd_adi_write (sadi , wdg -> base + REG_WDG_LOAD_LOW ,
376
436
WDG_LOAD_VAL & WDG_LOAD_MASK );
377
437
378
438
/* Start the watchdog to reset system */
379
- sprd_adi_read (sadi , REG_WDG_CTRL , & val );
439
+ sprd_adi_read (sadi , wdg -> base + REG_WDG_CTRL , & val );
380
440
val |= BIT_WDG_RUN | BIT_WDG_RST ;
381
- sprd_adi_write (sadi , REG_WDG_CTRL , val );
441
+ sprd_adi_write (sadi , wdg -> base + REG_WDG_CTRL , val );
382
442
383
443
/* Lock the watchdog */
384
- sprd_adi_write (sadi , REG_WDG_LOCK , ~WDG_UNLOCK_KEY );
444
+ sprd_adi_write (sadi , wdg -> base + REG_WDG_LOCK , ~WDG_UNLOCK_KEY );
385
445
386
446
mdelay (1000 );
387
447
388
448
dev_emerg (sadi -> dev , "Unable to restart system\n" );
389
449
return NOTIFY_DONE ;
390
450
}
391
451
452
+ static int sprd_adi_restart_sc9860 (struct notifier_block * this ,
453
+ unsigned long mode , void * cmd )
454
+ {
455
+ struct sprd_adi_wdg wdg = {
456
+ .base = PMIC_WDG_BASE ,
457
+ .rst_sts = PMIC_RST_STATUS ,
458
+ .wdg_en = PMIC_MODULE_EN ,
459
+ .wdg_clk = PMIC_CLK_EN ,
460
+ };
461
+
462
+ return sprd_adi_restart (this , mode , cmd , & wdg );
463
+ }
464
+
392
465
static void sprd_adi_hw_init (struct sprd_adi * sadi )
393
466
{
394
467
struct device_node * np = sadi -> dev -> of_node ;
@@ -440,17 +513,24 @@ static void sprd_adi_hw_init(struct sprd_adi *sadi)
440
513
static int sprd_adi_probe (struct platform_device * pdev )
441
514
{
442
515
struct device_node * np = pdev -> dev .of_node ;
516
+ const struct sprd_adi_data * data ;
443
517
struct spi_controller * ctlr ;
444
518
struct sprd_adi * sadi ;
445
519
struct resource * res ;
446
- u32 num_chipselect ;
520
+ u16 num_chipselect ;
447
521
int ret ;
448
522
449
523
if (!np ) {
450
524
dev_err (& pdev -> dev , "can not find the adi bus node\n" );
451
525
return - ENODEV ;
452
526
}
453
527
528
+ data = of_device_get_match_data (& pdev -> dev );
529
+ if (!data ) {
530
+ dev_err (& pdev -> dev , "no matching driver data found\n" );
531
+ return - EINVAL ;
532
+ }
533
+
454
534
pdev -> id = of_alias_get_id (np , "spi" );
455
535
num_chipselect = of_get_child_count (np );
456
536
@@ -468,10 +548,12 @@ static int sprd_adi_probe(struct platform_device *pdev)
468
548
goto put_ctlr ;
469
549
}
470
550
471
- sadi -> slave_vbase = (unsigned long )sadi -> base + ADI_SLAVE_OFFSET ;
472
- sadi -> slave_pbase = res -> start + ADI_SLAVE_OFFSET ;
551
+ sadi -> slave_vbase = (unsigned long )sadi -> base +
552
+ data -> slave_offset ;
553
+ sadi -> slave_pbase = res -> start + data -> slave_offset ;
473
554
sadi -> ctlr = ctlr ;
474
555
sadi -> dev = & pdev -> dev ;
556
+ sadi -> data = data ;
475
557
ret = of_hwspin_lock_get_id (np , 0 );
476
558
if (ret > 0 || (IS_ENABLED (CONFIG_HWSPINLOCK ) && ret == 0 )) {
477
559
sadi -> hwlock =
@@ -492,7 +574,9 @@ static int sprd_adi_probe(struct platform_device *pdev)
492
574
}
493
575
494
576
sprd_adi_hw_init (sadi );
495
- sprd_adi_set_wdt_rst_mode (sadi );
577
+
578
+ if (sadi -> data -> wdg_rst )
579
+ sadi -> data -> wdg_rst (sadi );
496
580
497
581
ctlr -> dev .of_node = pdev -> dev .of_node ;
498
582
ctlr -> bus_num = pdev -> id ;
@@ -507,12 +591,14 @@ static int sprd_adi_probe(struct platform_device *pdev)
507
591
goto put_ctlr ;
508
592
}
509
593
510
- sadi -> restart_handler .notifier_call = sprd_adi_restart_handler ;
511
- sadi -> restart_handler .priority = 128 ;
512
- ret = register_restart_handler (& sadi -> restart_handler );
513
- if (ret ) {
514
- dev_err (& pdev -> dev , "can not register restart handler\n" );
515
- goto put_ctlr ;
594
+ if (sadi -> data -> restart ) {
595
+ sadi -> restart_handler .notifier_call = sadi -> data -> restart ;
596
+ sadi -> restart_handler .priority = 128 ;
597
+ ret = register_restart_handler (& sadi -> restart_handler );
598
+ if (ret ) {
599
+ dev_err (& pdev -> dev , "can not register restart handler\n" );
600
+ goto put_ctlr ;
601
+ }
516
602
}
517
603
518
604
return 0 ;
@@ -531,9 +617,38 @@ static int sprd_adi_remove(struct platform_device *pdev)
531
617
return 0 ;
532
618
}
533
619
620
+ static struct sprd_adi_data sc9860_data = {
621
+ .slave_offset = ADI_10BIT_SLAVE_OFFSET ,
622
+ .slave_addr_size = ADI_10BIT_SLAVE_ADDR_SIZE ,
623
+ .read_check = sprd_adi_read_check_r2 ,
624
+ .restart = sprd_adi_restart_sc9860 ,
625
+ .wdg_rst = sprd_adi_set_wdt_rst_mode ,
626
+ };
627
+
628
+ static struct sprd_adi_data sc9863_data = {
629
+ .slave_offset = ADI_12BIT_SLAVE_OFFSET ,
630
+ .slave_addr_size = ADI_12BIT_SLAVE_ADDR_SIZE ,
631
+ .read_check = sprd_adi_read_check_r3 ,
632
+ };
633
+
634
+ static struct sprd_adi_data ums512_data = {
635
+ .slave_offset = ADI_15BIT_SLAVE_OFFSET ,
636
+ .slave_addr_size = ADI_15BIT_SLAVE_ADDR_SIZE ,
637
+ .read_check = sprd_adi_read_check_r3 ,
638
+ };
639
+
534
640
static const struct of_device_id sprd_adi_of_match [] = {
535
641
{
536
642
.compatible = "sprd,sc9860-adi" ,
643
+ .data = & sc9860_data ,
644
+ },
645
+ {
646
+ .compatible = "sprd,sc9863-adi" ,
647
+ .data = & sc9863_data ,
648
+ },
649
+ {
650
+ .compatible = "sprd,ums512-adi" ,
651
+ .data = & ums512_data ,
537
652
},
538
653
{ },
539
654
};
0 commit comments