mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 23:45:31 +08:00
19c8915ca3
We can now probe devices with ti-sysc interconnect driver and dts data. Let's drop the related platform data and custom ti,hwmods dts property. As we're just dropping data, and the early platform data init is based on the custom ti,hwmods property, we want to drop both the platform data and ti,hwmods property in a single patch. Cc: Keerthy <j-keerthy@ti.com> Cc: Peter Ujfalusi <peter.ujfalusi@ti.com> Cc: Tero Kristo <t-kristo@ti.com> Tested-by: Keerthy <j-keerthy@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
99 lines
3.2 KiB
C
99 lines
3.2 KiB
C
/*
|
|
* OMAP IP block custom reset and preprogramming stubs
|
|
*
|
|
* Copyright (C) 2012 Texas Instruments, Inc.
|
|
* Paul Walmsley
|
|
*
|
|
* A small number of IP blocks need custom reset and preprogramming
|
|
* functions. The stubs in this file provide a standard way for the
|
|
* hwmod code to call these functions, which are to be located under
|
|
* drivers/.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation version 2.
|
|
*
|
|
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
|
* kind, whether express or implied; without even the implied warranty
|
|
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
|
|
#include "omap_hwmod.h"
|
|
#include "common.h"
|
|
|
|
#define OMAP_RTC_STATUS_REG 0x44
|
|
#define OMAP_RTC_KICK0_REG 0x6c
|
|
#define OMAP_RTC_KICK1_REG 0x70
|
|
|
|
#define OMAP_RTC_KICK0_VALUE 0x83E70B13
|
|
#define OMAP_RTC_KICK1_VALUE 0x95A4F1E0
|
|
#define OMAP_RTC_STATUS_BUSY BIT(0)
|
|
#define OMAP_RTC_MAX_READY_TIME 50
|
|
|
|
/**
|
|
* omap_rtc_wait_not_busy - Wait for the RTC BUSY flag
|
|
* @oh: struct omap_hwmod *
|
|
*
|
|
* For updating certain RTC registers, the MPU must wait
|
|
* for the BUSY status in OMAP_RTC_STATUS_REG to become zero.
|
|
* Once the BUSY status is zero, there is a 15 microseconds access
|
|
* period in which the MPU can program.
|
|
*/
|
|
static void omap_rtc_wait_not_busy(struct omap_hwmod *oh)
|
|
{
|
|
int i;
|
|
|
|
/* BUSY may stay active for 1/32768 second (~30 usec) */
|
|
omap_test_timeout(omap_hwmod_read(oh, OMAP_RTC_STATUS_REG)
|
|
& OMAP_RTC_STATUS_BUSY, OMAP_RTC_MAX_READY_TIME, i);
|
|
/* now we have ~15 microseconds to read/write various registers */
|
|
}
|
|
|
|
/**
|
|
* omap_hwmod_rtc_unlock - Unlock the Kicker mechanism.
|
|
* @oh: struct omap_hwmod *
|
|
*
|
|
* RTC IP have kicker feature. This prevents spurious writes to its registers.
|
|
* In order to write into any of the RTC registers, KICK values has te be
|
|
* written in respective KICK registers. This is needed for hwmod to write into
|
|
* sysconfig register.
|
|
*/
|
|
void omap_hwmod_rtc_unlock(struct omap_hwmod *oh)
|
|
{
|
|
unsigned long flags;
|
|
|
|
local_irq_save(flags);
|
|
omap_rtc_wait_not_busy(oh);
|
|
omap_hwmod_write(OMAP_RTC_KICK0_VALUE, oh, OMAP_RTC_KICK0_REG);
|
|
omap_hwmod_write(OMAP_RTC_KICK1_VALUE, oh, OMAP_RTC_KICK1_REG);
|
|
local_irq_restore(flags);
|
|
}
|
|
|
|
/**
|
|
* omap_hwmod_rtc_lock - Lock the Kicker mechanism.
|
|
* @oh: struct omap_hwmod *
|
|
*
|
|
* RTC IP have kicker feature. This prevents spurious writes to its registers.
|
|
* Once the RTC registers are written, KICK mechanism needs to be locked,
|
|
* in order to prevent any spurious writes. This function locks back the RTC
|
|
* registers once hwmod completes its write into sysconfig register.
|
|
*/
|
|
void omap_hwmod_rtc_lock(struct omap_hwmod *oh)
|
|
{
|
|
unsigned long flags;
|
|
|
|
local_irq_save(flags);
|
|
omap_rtc_wait_not_busy(oh);
|
|
omap_hwmod_write(0x0, oh, OMAP_RTC_KICK0_REG);
|
|
omap_hwmod_write(0x0, oh, OMAP_RTC_KICK1_REG);
|
|
local_irq_restore(flags);
|
|
}
|