Skip to content

Commit 3b66ca9

Browse files
Chunyan Zhangbroonie
authored andcommitted
spi: sprd: Add ADI r3 support
ADI r3p0 is used on SC9863 and UMS512 SoCs. Signed-off-by: Chunyan Zhang <[email protected]> Reviewed-by: Baolin Wang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 245ca2c commit 3b66ca9

File tree

1 file changed

+165
-50
lines changed

1 file changed

+165
-50
lines changed

drivers/spi/spi-sprd-adi.c

Lines changed: 165 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,20 @@
5252

5353
/*
5454
* 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.
5662
*/
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
5969

6070
/* Timeout (ms) for the trylock of hardware spinlocks */
6171
#define ADI_HWSPINLOCK_TIMEOUT 5000
@@ -67,24 +77,35 @@
6777

6878
#define ADI_FIFO_DRAIN_TIMEOUT 1000
6979
#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
7189

7290
/* 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
7795

7896
/* Bits definitions for register REG_WDG_CTRL */
7997
#define BIT_WDG_RUN BIT(1)
8098
#define BIT_WDG_NEW BIT(2)
8199
#define BIT_WDG_RST BIT(3)
82100

101+
/* Bits definitions for register REG_MODULE_EN */
102+
#define BIT_WDG_EN BIT(2)
103+
83104
/* Registers definitions for PMIC */
84105
#define PMIC_RST_STATUS 0xee8
85106
#define PMIC_MODULE_EN 0xc08
86107
#define PMIC_CLK_EN 0xc18
87-
#define BIT_WDG_EN BIT(2)
108+
#define PMIC_WDG_BASE 0x80
88109

89110
/* Definition of PMIC reset status register */
90111
#define HWRST_STATUS_SECURITY 0x02
@@ -107,6 +128,22 @@
107128
#define WDG_LOAD_MASK GENMASK(15, 0)
108129
#define WDG_UNLOCK_KEY 0xe551
109130

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+
110147
struct sprd_adi {
111148
struct spi_controller *ctlr;
112149
struct device *dev;
@@ -115,11 +152,12 @@ struct sprd_adi {
115152
unsigned long slave_vbase;
116153
unsigned long slave_pbase;
117154
struct notifier_block restart_handler;
155+
const struct sprd_adi_data *data;
118156
};
119157

120158
static int sprd_adi_check_addr(struct sprd_adi *sadi, u32 reg)
121159
{
122-
if (reg >= ADI_SLAVE_ADDR_SIZE) {
160+
if (reg >= sadi->data->slave_addr_size) {
123161
dev_err(sadi->dev,
124162
"slave address offset is incorrect, reg = 0x%x\n",
125163
reg);
@@ -155,11 +193,35 @@ static int sprd_adi_fifo_is_full(struct sprd_adi *sadi)
155193
return readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS) & BIT_FIFO_FULL;
156194
}
157195

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+
158220
static int sprd_adi_read(struct sprd_adi *sadi, u32 reg, u32 *read_val)
159221
{
160222
int read_timeout = ADI_READ_TIMEOUT;
161223
unsigned long flags;
162-
u32 val, rd_addr;
224+
u32 val;
163225
int ret = 0;
164226

165227
if (sadi->hwlock) {
@@ -203,18 +265,15 @@ static int sprd_adi_read(struct sprd_adi *sadi, u32 reg, u32 *read_val)
203265
}
204266

205267
/*
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.
210272
*/
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;
218277
}
219278

220279
*read_val = val & RD_VALUE_MASK;
@@ -299,20 +358,21 @@ static int sprd_adi_transfer_one(struct spi_controller *ctlr,
299358
return ret;
300359
}
301360

302-
static void sprd_adi_set_wdt_rst_mode(struct sprd_adi *sadi)
361+
static void sprd_adi_set_wdt_rst_mode(void *p)
303362
{
304363
#if IS_ENABLED(CONFIG_SPRD_WATCHDOG)
305364
u32 val;
365+
struct sprd_adi *sadi = (struct sprd_adi *)p;
306366

307-
/* Set default watchdog reboot mode */
367+
/* Init watchdog reset mode */
308368
sprd_adi_read(sadi, PMIC_RST_STATUS, &val);
309369
val |= HWRST_STATUS_WATCHDOG;
310370
sprd_adi_write(sadi, PMIC_RST_STATUS, val);
311371
#endif
312372
}
313373

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)
316376
{
317377
struct sprd_adi *sadi = container_of(this, struct sprd_adi,
318378
restart_handler);
@@ -348,47 +408,60 @@ static int sprd_adi_restart_handler(struct notifier_block *this,
348408
reboot_mode = HWRST_STATUS_NORMAL;
349409

350410
/* Record the reboot mode */
351-
sprd_adi_read(sadi, PMIC_RST_STATUS, &val);
411+
sprd_adi_read(sadi, wdg->rst_sts, &val);
352412
val &= ~HWRST_STATUS_WATCHDOG;
353413
val |= reboot_mode;
354-
sprd_adi_write(sadi, PMIC_RST_STATUS, val);
414+
sprd_adi_write(sadi, wdg->rst_sts, val);
355415

356416
/* 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);
358418
val |= BIT_WDG_EN;
359-
sprd_adi_write(sadi, PMIC_MODULE_EN, val);
419+
sprd_adi_write(sadi, wdg->wdg_en, val);
360420

361421
/* 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);
363423
val |= BIT_WDG_EN;
364-
sprd_adi_write(sadi, PMIC_CLK_EN, val);
424+
sprd_adi_write(sadi, wdg->wdg_clk, val);
365425

366426
/* 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);
368428

369-
sprd_adi_read(sadi, REG_WDG_CTRL, &val);
429+
sprd_adi_read(sadi, wdg->base + REG_WDG_CTRL, &val);
370430
val |= BIT_WDG_NEW;
371-
sprd_adi_write(sadi, REG_WDG_CTRL, val);
431+
sprd_adi_write(sadi, wdg->base + REG_WDG_CTRL, val);
372432

373433
/* 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,
376436
WDG_LOAD_VAL & WDG_LOAD_MASK);
377437

378438
/* 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);
380440
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);
382442

383443
/* 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);
385445

386446
mdelay(1000);
387447

388448
dev_emerg(sadi->dev, "Unable to restart system\n");
389449
return NOTIFY_DONE;
390450
}
391451

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+
392465
static void sprd_adi_hw_init(struct sprd_adi *sadi)
393466
{
394467
struct device_node *np = sadi->dev->of_node;
@@ -440,17 +513,24 @@ static void sprd_adi_hw_init(struct sprd_adi *sadi)
440513
static int sprd_adi_probe(struct platform_device *pdev)
441514
{
442515
struct device_node *np = pdev->dev.of_node;
516+
const struct sprd_adi_data *data;
443517
struct spi_controller *ctlr;
444518
struct sprd_adi *sadi;
445519
struct resource *res;
446-
u32 num_chipselect;
520+
u16 num_chipselect;
447521
int ret;
448522

449523
if (!np) {
450524
dev_err(&pdev->dev, "can not find the adi bus node\n");
451525
return -ENODEV;
452526
}
453527

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+
454534
pdev->id = of_alias_get_id(np, "spi");
455535
num_chipselect = of_get_child_count(np);
456536

@@ -468,10 +548,12 @@ static int sprd_adi_probe(struct platform_device *pdev)
468548
goto put_ctlr;
469549
}
470550

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;
473554
sadi->ctlr = ctlr;
474555
sadi->dev = &pdev->dev;
556+
sadi->data = data;
475557
ret = of_hwspin_lock_get_id(np, 0);
476558
if (ret > 0 || (IS_ENABLED(CONFIG_HWSPINLOCK) && ret == 0)) {
477559
sadi->hwlock =
@@ -492,7 +574,9 @@ static int sprd_adi_probe(struct platform_device *pdev)
492574
}
493575

494576
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);
496580

497581
ctlr->dev.of_node = pdev->dev.of_node;
498582
ctlr->bus_num = pdev->id;
@@ -507,12 +591,14 @@ static int sprd_adi_probe(struct platform_device *pdev)
507591
goto put_ctlr;
508592
}
509593

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+
}
516602
}
517603

518604
return 0;
@@ -531,9 +617,38 @@ static int sprd_adi_remove(struct platform_device *pdev)
531617
return 0;
532618
}
533619

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+
534640
static const struct of_device_id sprd_adi_of_match[] = {
535641
{
536642
.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,
537652
},
538653
{ },
539654
};

0 commit comments

Comments
 (0)