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