183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2c0bc2a7eSChristophe Leroy /*
3c0bc2a7eSChristophe Leroy * Copyright 2017 CS Systemes d'Information
4c0bc2a7eSChristophe Leroy */
5c0bc2a7eSChristophe Leroy
6c0bc2a7eSChristophe Leroy #include <common.h>
7*749c9aaeSChristophe Leroy #include <dm.h>
8*749c9aaeSChristophe Leroy #include <wdt.h>
9c0bc2a7eSChristophe Leroy #include <mpc8xx.h>
10c0bc2a7eSChristophe Leroy #include <asm/cpm_8xx.h>
11c0bc2a7eSChristophe Leroy #include <asm/io.h>
12c0bc2a7eSChristophe Leroy
hw_watchdog_reset(void)13c0bc2a7eSChristophe Leroy void hw_watchdog_reset(void)
14c0bc2a7eSChristophe Leroy {
15c0bc2a7eSChristophe Leroy immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
16c0bc2a7eSChristophe Leroy
17c0bc2a7eSChristophe Leroy out_be16(&immap->im_siu_conf.sc_swsr, 0x556c); /* write magic1 */
18c0bc2a7eSChristophe Leroy out_be16(&immap->im_siu_conf.sc_swsr, 0xaa39); /* write magic2 */
19c0bc2a7eSChristophe Leroy }
20c0bc2a7eSChristophe Leroy
21*749c9aaeSChristophe Leroy #ifdef CONFIG_WDT_MPC8xx
mpc8xx_wdt_start(struct udevice * dev,u64 timeout,ulong flags)22*749c9aaeSChristophe Leroy static int mpc8xx_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
23*749c9aaeSChristophe Leroy {
24*749c9aaeSChristophe Leroy immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
25*749c9aaeSChristophe Leroy
26*749c9aaeSChristophe Leroy out_be32(&immap->im_siu_conf.sc_sypcr, CONFIG_SYS_SYPCR);
27*749c9aaeSChristophe Leroy
28*749c9aaeSChristophe Leroy if (!(in_be32(&immap->im_siu_conf.sc_sypcr) & SYPCR_SWE))
29*749c9aaeSChristophe Leroy return -EBUSY;
30*749c9aaeSChristophe Leroy return 0;
31*749c9aaeSChristophe Leroy
32*749c9aaeSChristophe Leroy }
33*749c9aaeSChristophe Leroy
mpc8xx_wdt_stop(struct udevice * dev)34*749c9aaeSChristophe Leroy static int mpc8xx_wdt_stop(struct udevice *dev)
35*749c9aaeSChristophe Leroy {
36*749c9aaeSChristophe Leroy immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
37*749c9aaeSChristophe Leroy
38*749c9aaeSChristophe Leroy out_be32(&immap->im_siu_conf.sc_sypcr, CONFIG_SYS_SYPCR & ~SYPCR_SWE);
39*749c9aaeSChristophe Leroy
40*749c9aaeSChristophe Leroy if (in_be32(&immap->im_siu_conf.sc_sypcr) & SYPCR_SWE)
41*749c9aaeSChristophe Leroy return -EBUSY;
42*749c9aaeSChristophe Leroy return 0;
43*749c9aaeSChristophe Leroy }
44*749c9aaeSChristophe Leroy
mpc8xx_wdt_reset(struct udevice * dev)45*749c9aaeSChristophe Leroy static int mpc8xx_wdt_reset(struct udevice *dev)
46*749c9aaeSChristophe Leroy {
47*749c9aaeSChristophe Leroy hw_watchdog_reset();
48*749c9aaeSChristophe Leroy
49*749c9aaeSChristophe Leroy return 0;
50*749c9aaeSChristophe Leroy }
51*749c9aaeSChristophe Leroy
52*749c9aaeSChristophe Leroy static const struct wdt_ops mpc8xx_wdt_ops = {
53*749c9aaeSChristophe Leroy .start = mpc8xx_wdt_start,
54*749c9aaeSChristophe Leroy .reset = mpc8xx_wdt_reset,
55*749c9aaeSChristophe Leroy .stop = mpc8xx_wdt_stop,
56*749c9aaeSChristophe Leroy };
57*749c9aaeSChristophe Leroy
58*749c9aaeSChristophe Leroy static const struct udevice_id mpc8xx_wdt_ids[] = {
59*749c9aaeSChristophe Leroy { .compatible = "fsl,pq1-wdt" },
60*749c9aaeSChristophe Leroy {}
61*749c9aaeSChristophe Leroy };
62*749c9aaeSChristophe Leroy
63*749c9aaeSChristophe Leroy U_BOOT_DRIVER(wdt_mpc8xx) = {
64*749c9aaeSChristophe Leroy .name = "wdt_mpc8xx",
65*749c9aaeSChristophe Leroy .id = UCLASS_WDT,
66*749c9aaeSChristophe Leroy .of_match = mpc8xx_wdt_ids,
67*749c9aaeSChristophe Leroy .ops = &mpc8xx_wdt_ops,
68*749c9aaeSChristophe Leroy };
69*749c9aaeSChristophe Leroy #endif /* CONFIG_WDT_MPC8xx */
70