hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/spi/spi-sprd-adi.c
....@@ -77,6 +77,7 @@
7777
7878 /* Bits definitions for register REG_WDG_CTRL */
7979 #define BIT_WDG_RUN BIT(1)
80
+#define BIT_WDG_NEW BIT(2)
8081 #define BIT_WDG_RST BIT(3)
8182
8283 /* Registers definitions for PMIC */
....@@ -86,6 +87,7 @@
8687 #define BIT_WDG_EN BIT(2)
8788
8889 /* Definition of PMIC reset status register */
90
+#define HWRST_STATUS_SECURITY 0x02
8991 #define HWRST_STATUS_RECOVERY 0x20
9092 #define HWRST_STATUS_NORMAL 0x40
9193 #define HWRST_STATUS_ALARM 0x50
....@@ -97,6 +99,8 @@
9799 #define HWRST_STATUS_AUTODLOADER 0xa0
98100 #define HWRST_STATUS_IQMODE 0xb0
99101 #define HWRST_STATUS_SPRDISK 0xc0
102
+#define HWRST_STATUS_FACTORYTEST 0xe0
103
+#define HWRST_STATUS_WATCHDOG 0xf0
100104
101105 /* Use default timeout 50 ms that converts to watchdog values */
102106 #define WDG_LOAD_VAL ((50 * 32768) / 1000)
....@@ -162,14 +166,16 @@
162166 int read_timeout = ADI_READ_TIMEOUT;
163167 unsigned long flags;
164168 u32 val, rd_addr;
165
- int ret;
169
+ int ret = 0;
166170
167
- ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
168
- ADI_HWSPINLOCK_TIMEOUT,
169
- &flags);
170
- if (ret) {
171
- dev_err(sadi->dev, "get the hw lock failed\n");
172
- return ret;
171
+ if (sadi->hwlock) {
172
+ ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
173
+ ADI_HWSPINLOCK_TIMEOUT,
174
+ &flags);
175
+ if (ret) {
176
+ dev_err(sadi->dev, "get the hw lock failed\n");
177
+ return ret;
178
+ }
173179 }
174180
175181 /*
....@@ -216,7 +222,8 @@
216222 *read_val = val & RD_VALUE_MASK;
217223
218224 out:
219
- hwspin_unlock_irqrestore(sadi->hwlock, &flags);
225
+ if (sadi->hwlock)
226
+ hwspin_unlock_irqrestore(sadi->hwlock, &flags);
220227 return ret;
221228 }
222229
....@@ -227,12 +234,14 @@
227234 unsigned long flags;
228235 int ret;
229236
230
- ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
231
- ADI_HWSPINLOCK_TIMEOUT,
232
- &flags);
233
- if (ret) {
234
- dev_err(sadi->dev, "get the hw lock failed\n");
235
- return ret;
237
+ if (sadi->hwlock) {
238
+ ret = hwspin_lock_timeout_irqsave(sadi->hwlock,
239
+ ADI_HWSPINLOCK_TIMEOUT,
240
+ &flags);
241
+ if (ret) {
242
+ dev_err(sadi->dev, "get the hw lock failed\n");
243
+ return ret;
244
+ }
236245 }
237246
238247 ret = sprd_adi_drain_fifo(sadi);
....@@ -258,7 +267,8 @@
258267 }
259268
260269 out:
261
- hwspin_unlock_irqrestore(sadi->hwlock, &flags);
270
+ if (sadi->hwlock)
271
+ hwspin_unlock_irqrestore(sadi->hwlock, &flags);
262272 return ret;
263273 }
264274
....@@ -307,6 +317,18 @@
307317 return 0;
308318 }
309319
320
+static void sprd_adi_set_wdt_rst_mode(struct sprd_adi *sadi)
321
+{
322
+#if IS_ENABLED(CONFIG_SPRD_WATCHDOG)
323
+ u32 val;
324
+
325
+ /* Set default watchdog reboot mode */
326
+ sprd_adi_read(sadi, sadi->slave_pbase + PMIC_RST_STATUS, &val);
327
+ val |= HWRST_STATUS_WATCHDOG;
328
+ sprd_adi_write(sadi, sadi->slave_pbase + PMIC_RST_STATUS, val);
329
+#endif
330
+}
331
+
310332 static int sprd_adi_restart_handler(struct notifier_block *this,
311333 unsigned long mode, void *cmd)
312334 {
....@@ -336,11 +358,16 @@
336358 reboot_mode = HWRST_STATUS_IQMODE;
337359 else if (!strncmp(cmd, "sprdisk", 7))
338360 reboot_mode = HWRST_STATUS_SPRDISK;
361
+ else if (!strncmp(cmd, "tospanic", 8))
362
+ reboot_mode = HWRST_STATUS_SECURITY;
363
+ else if (!strncmp(cmd, "factorytest", 11))
364
+ reboot_mode = HWRST_STATUS_FACTORYTEST;
339365 else
340366 reboot_mode = HWRST_STATUS_NORMAL;
341367
342368 /* Record the reboot mode */
343369 sprd_adi_read(sadi, sadi->slave_pbase + PMIC_RST_STATUS, &val);
370
+ val &= ~HWRST_STATUS_WATCHDOG;
344371 val |= reboot_mode;
345372 sprd_adi_write(sadi, sadi->slave_pbase + PMIC_RST_STATUS, val);
346373
....@@ -356,6 +383,10 @@
356383
357384 /* Unlock the watchdog */
358385 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, WDG_UNLOCK_KEY);
386
+
387
+ sprd_adi_read(sadi, sadi->slave_pbase + REG_WDG_CTRL, &val);
388
+ val |= BIT_WDG_NEW;
389
+ sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_CTRL, val);
359390
360391 /* Load the watchdog timeout value, 50ms is always enough. */
361392 sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOAD_HIGH, 0);
....@@ -382,9 +413,6 @@
382413 int i, size, chn_cnt;
383414 const __be32 *list;
384415 u32 tmp;
385
-
386
- /* Address bits select default 12 bits */
387
- writel_relaxed(0, sadi->base + REG_ADI_CTRL0);
388416
389417 /* Set all channels as default priority */
390418 writel_relaxed(0, sadi->base + REG_ADI_CHN_PRIL);
....@@ -462,19 +490,27 @@
462490 sadi->slave_pbase = res->start + ADI_SLAVE_OFFSET;
463491 sadi->ctlr = ctlr;
464492 sadi->dev = &pdev->dev;
465
- ret = of_hwspin_lock_get_id_byname(np, "adi");
466
- if (ret < 0) {
467
- dev_err(&pdev->dev, "can not get the hardware spinlock\n");
468
- goto put_ctlr;
469
- }
470
-
471
- sadi->hwlock = devm_hwspin_lock_request_specific(&pdev->dev, ret);
472
- if (!sadi->hwlock) {
473
- ret = -ENXIO;
474
- goto put_ctlr;
493
+ ret = of_hwspin_lock_get_id(np, 0);
494
+ if (ret > 0 || (IS_ENABLED(CONFIG_HWSPINLOCK) && ret == 0)) {
495
+ sadi->hwlock =
496
+ devm_hwspin_lock_request_specific(&pdev->dev, ret);
497
+ if (!sadi->hwlock) {
498
+ ret = -ENXIO;
499
+ goto put_ctlr;
500
+ }
501
+ } else {
502
+ switch (ret) {
503
+ case -ENOENT:
504
+ dev_info(&pdev->dev, "no hardware spinlock supplied\n");
505
+ break;
506
+ default:
507
+ dev_err_probe(&pdev->dev, ret, "failed to find hwlock id\n");
508
+ goto put_ctlr;
509
+ }
475510 }
476511
477512 sprd_adi_hw_init(sadi);
513
+ sprd_adi_set_wdt_rst_mode(sadi);
478514
479515 ctlr->dev.of_node = pdev->dev.of_node;
480516 ctlr->bus_num = pdev->id;