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