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_request(struct reset_ctl *rst) 46{ 47 if (rst->id >= MAX_RESETS) 48 return -EINVAL; 49 50 return bcm6345_reset_assert(rst); 51} 52 53struct reset_ops bcm6345_reset_reset_ops = { 54 .request = bcm6345_reset_request, 55 .rst_assert = bcm6345_reset_assert, 56 .rst_deassert = bcm6345_reset_deassert, 57}; 58 59static const struct udevice_id bcm6345_reset_ids[] = { 60 { .compatible = "brcm,bcm6345-reset" }, 61 { /* sentinel */ } 62}; 63 64static int bcm6345_reset_probe(struct udevice *dev) 65{ 66 struct bcm6345_reset_priv *priv = dev_get_priv(dev); 67 68 priv->regs = dev_remap_addr(dev); 69 if (!priv->regs) 70 return -EINVAL; 71 72 return 0; 73} 74 75U_BOOT_DRIVER(bcm6345_reset) = { 76 .name = "bcm6345-reset", 77 .id = UCLASS_RESET, 78 .of_match = bcm6345_reset_ids, 79 .ops = &bcm6345_reset_reset_ops, 80 .probe = bcm6345_reset_probe, 81 .priv_auto = sizeof(struct bcm6345_reset_priv), 82}; 83