uboot/drivers/reset/reset-bcm6345.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2017 Álvaro Fernández Rojas <noltari@gmail.com>
   4 *
   5 * Derived from linux/arch/mips/bcm63xx/reset.c:
   6 *      Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com>
   7 */
   8
   9#include <common.h>
  10#include <dm.h>
  11#include <errno.h>
  12#include <log.h>
  13#include <malloc.h>
  14#include <reset-uclass.h>
  15#include <asm/io.h>
  16#include <linux/bitops.h>
  17#include <linux/delay.h>
  18
  19#define MAX_RESETS      32
  20
  21struct bcm6345_reset_priv {
  22        void __iomem *regs;
  23};
  24
  25static int bcm6345_reset_assert(struct reset_ctl *rst)
  26{
  27        struct bcm6345_reset_priv *priv = dev_get_priv(rst->dev);
  28
  29        clrbits_be32(priv->regs, BIT(rst->id));
  30        mdelay(20);
  31
  32        return 0;
  33}
  34
  35static int bcm6345_reset_deassert(struct reset_ctl *rst)
  36{
  37        struct bcm6345_reset_priv *priv = dev_get_priv(rst->dev);
  38
  39        setbits_be32(priv->regs, BIT(rst->id));
  40        mdelay(20);
  41
  42        return 0;
  43}
  44
  45static int bcm6345_reset_free(struct reset_ctl *rst)
  46{
  47        return 0;
  48}
  49
  50static int bcm6345_reset_request(struct reset_ctl *rst)
  51{
  52        if (rst->id >= MAX_RESETS)
  53                return -EINVAL;
  54
  55        return bcm6345_reset_assert(rst);
  56}
  57
  58struct reset_ops bcm6345_reset_reset_ops = {
  59        .rfree = bcm6345_reset_free,
  60        .request = bcm6345_reset_request,
  61        .rst_assert = bcm6345_reset_assert,
  62        .rst_deassert = bcm6345_reset_deassert,
  63};
  64
  65static const struct udevice_id bcm6345_reset_ids[] = {
  66        { .compatible = "brcm,bcm6345-reset" },
  67        { /* sentinel */ }
  68};
  69
  70static int bcm6345_reset_probe(struct udevice *dev)
  71{
  72        struct bcm6345_reset_priv *priv = dev_get_priv(dev);
  73
  74        priv->regs = dev_remap_addr(dev);
  75        if (!priv->regs)
  76                return -EINVAL;
  77
  78        return 0;
  79}
  80
  81U_BOOT_DRIVER(bcm6345_reset) = {
  82        .name = "bcm6345-reset",
  83        .id = UCLASS_RESET,
  84        .of_match = bcm6345_reset_ids,
  85        .ops = &bcm6345_reset_reset_ops,
  86        .probe = bcm6345_reset_probe,
  87        .priv_auto      = sizeof(struct bcm6345_reset_priv),
  88};
  89