cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

omap_hwmod_reset.c (3274B)


      1/*
      2 * OMAP IP block custom reset and preprogramming stubs
      3 *
      4 * Copyright (C) 2012 Texas Instruments, Inc.
      5 * Paul Walmsley
      6 *
      7 * A small number of IP blocks need custom reset and preprogramming
      8 * functions.  The stubs in this file provide a standard way for the
      9 * hwmod code to call these functions, which are to be located under
     10 * drivers/.
     11 *
     12 * This program is free software; you can redistribute it and/or
     13 * modify it under the terms of the GNU General Public License as
     14 * published by the Free Software Foundation version 2.
     15 *
     16 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
     17 * kind, whether express or implied; without even the implied warranty
     18 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     19 * GNU General Public License for more details.
     20 *
     21 * You should have received a copy of the GNU General Public License
     22 * along with this program; if not, write to the Free Software
     23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     24 * 02110-1301 USA
     25 */
     26#include <linux/kernel.h>
     27#include <linux/errno.h>
     28
     29#include "omap_hwmod.h"
     30#include "common.h"
     31
     32#define OMAP_RTC_STATUS_REG	0x44
     33#define OMAP_RTC_KICK0_REG	0x6c
     34#define OMAP_RTC_KICK1_REG	0x70
     35
     36#define OMAP_RTC_KICK0_VALUE	0x83E70B13
     37#define OMAP_RTC_KICK1_VALUE	0x95A4F1E0
     38#define OMAP_RTC_STATUS_BUSY	BIT(0)
     39#define OMAP_RTC_MAX_READY_TIME	50
     40
     41/**
     42 * omap_rtc_wait_not_busy - Wait for the RTC BUSY flag
     43 * @oh: struct omap_hwmod *
     44 *
     45 * For updating certain RTC registers, the MPU must wait
     46 * for the BUSY status in OMAP_RTC_STATUS_REG to become zero.
     47 * Once the BUSY status is zero, there is a 15 microseconds access
     48 * period in which the MPU can program.
     49 */
     50static void omap_rtc_wait_not_busy(struct omap_hwmod *oh)
     51{
     52	int i;
     53
     54	/* BUSY may stay active for 1/32768 second (~30 usec) */
     55	omap_test_timeout(omap_hwmod_read(oh, OMAP_RTC_STATUS_REG)
     56			  & OMAP_RTC_STATUS_BUSY, OMAP_RTC_MAX_READY_TIME, i);
     57	/* now we have ~15 microseconds to read/write various registers */
     58}
     59
     60/**
     61 * omap_hwmod_rtc_unlock - Unlock the Kicker mechanism.
     62 * @oh: struct omap_hwmod *
     63 *
     64 * RTC IP have kicker feature. This prevents spurious writes to its registers.
     65 * In order to write into any of the RTC registers, KICK values has te be
     66 * written in respective KICK registers. This is needed for hwmod to write into
     67 * sysconfig register.
     68 */
     69void omap_hwmod_rtc_unlock(struct omap_hwmod *oh)
     70{
     71	unsigned long flags;
     72
     73	local_irq_save(flags);
     74	omap_rtc_wait_not_busy(oh);
     75	omap_hwmod_write(OMAP_RTC_KICK0_VALUE, oh, OMAP_RTC_KICK0_REG);
     76	omap_hwmod_write(OMAP_RTC_KICK1_VALUE, oh, OMAP_RTC_KICK1_REG);
     77	local_irq_restore(flags);
     78}
     79
     80/**
     81 * omap_hwmod_rtc_lock - Lock the Kicker mechanism.
     82 * @oh: struct omap_hwmod *
     83 *
     84 * RTC IP have kicker feature. This prevents spurious writes to its registers.
     85 * Once the RTC registers are written, KICK mechanism needs to be locked,
     86 * in order to prevent any spurious writes. This function locks back the RTC
     87 * registers once hwmod completes its write into sysconfig register.
     88 */
     89void omap_hwmod_rtc_lock(struct omap_hwmod *oh)
     90{
     91	unsigned long flags;
     92
     93	local_irq_save(flags);
     94	omap_rtc_wait_not_busy(oh);
     95	omap_hwmod_write(0x0, oh, OMAP_RTC_KICK0_REG);
     96	omap_hwmod_write(0x0, oh, OMAP_RTC_KICK1_REG);
     97	local_irq_restore(flags);
     98}