Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/lib/stmp_device.c

  1 /*
  2  * Copyright (C) 1999 ARM Limited
  3  * Copyright (C) 2000 Deep Blue Solutions Ltd
  4  * Copyright 2006-2007,2010 Freescale Semiconductor, Inc. All Rights Reserved.
  5  * Copyright 2008 Juergen Beisert, kernel@pengutronix.de
  6  * Copyright 2009 Ilya Yanok, Emcraft Systems Ltd, yanok@emcraft.com
  7  * Copyright (C) 2011 Wolfram Sang, Pengutronix e.K.
  8  *
  9  * This program is free software; you can redistribute it and/or modify
 10  * it under the terms of the GNU General Public License as published by
 11  * the Free Software Foundation; either version 2 of the License, or
 12  * (at your option) any later version.
 13  */
 14 
 15 #include <linux/io.h>
 16 #include <linux/errno.h>
 17 #include <linux/delay.h>
 18 #include <linux/compiler.h>
 19 #include <linux/export.h>
 20 #include <linux/stmp_device.h>
 21 
 22 #define STMP_MODULE_CLKGATE     (1 << 30)
 23 #define STMP_MODULE_SFTRST      (1 << 31)
 24 
 25 /*
 26  * Clear the bit and poll it cleared.  This is usually called with
 27  * a reset address and mask being either SFTRST(bit 31) or CLKGATE
 28  * (bit 30).
 29  */
 30 static int stmp_clear_poll_bit(void __iomem *addr, u32 mask)
 31 {
 32         int timeout = 0x400;
 33 
 34         writel(mask, addr + STMP_OFFSET_REG_CLR);
 35         udelay(1);
 36         while ((readl(addr) & mask) && --timeout)
 37                 /* nothing */;
 38 
 39         return !timeout;
 40 }
 41 
 42 int stmp_reset_block(void __iomem *reset_addr)
 43 {
 44         int ret;
 45         int timeout = 0x400;
 46 
 47         /* clear and poll SFTRST */
 48         ret = stmp_clear_poll_bit(reset_addr, STMP_MODULE_SFTRST);
 49         if (unlikely(ret))
 50                 goto error;
 51 
 52         /* clear CLKGATE */
 53         writel(STMP_MODULE_CLKGATE, reset_addr + STMP_OFFSET_REG_CLR);
 54 
 55         /* set SFTRST to reset the block */
 56         writel(STMP_MODULE_SFTRST, reset_addr + STMP_OFFSET_REG_SET);
 57         udelay(1);
 58 
 59         /* poll CLKGATE becoming set */
 60         while ((!(readl(reset_addr) & STMP_MODULE_CLKGATE)) && --timeout)
 61                 /* nothing */;
 62         if (unlikely(!timeout))
 63                 goto error;
 64 
 65         /* clear and poll SFTRST */
 66         ret = stmp_clear_poll_bit(reset_addr, STMP_MODULE_SFTRST);
 67         if (unlikely(ret))
 68                 goto error;
 69 
 70         /* clear and poll CLKGATE */
 71         ret = stmp_clear_poll_bit(reset_addr, STMP_MODULE_CLKGATE);
 72         if (unlikely(ret))
 73                 goto error;
 74 
 75         return 0;
 76 
 77 error:
 78         pr_err("%s(%p): module reset timeout\n", __func__, reset_addr);
 79         return -ETIMEDOUT;
 80 }
 81 EXPORT_SYMBOL(stmp_reset_block);
 82 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us