ff173d4552
The omap4_cm_wait_module_ready function would only check for the modules to be completely functional before declaring them ready to be accessed. There might also be instances where in the module is actually in idle (under h/w control) but should still be declared accessible, as the h/w control would make it functional when needed. Hence make omap4_cm_wait_module_ready return true in case the module is fully functional *or* in idle state. Fail only if the module is fully disabled or stuck intransition. The explaination from the TRM for the idlest bits on OMAP4 is as below for quick reference Module idle state: 0x0 func: Module is fully functional, including OCP 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep abortion 0x2 idle: Module is in Idle mode (only OCP part). It is functional if using separate functional clock 0x3 disabled: Module is disabled and cannot be accessed Signed-off-by: Rajendra Nayak <rnayak@ti.com> Signed-off-by: Partha Basak <p-basak2@ti.com> Signed-off-by: Benoit Cousson <b-cousson@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
/*
|
|
* OMAP4 CM module functions
|
|
*
|
|
* Copyright (C) 2009 Nokia Corporation
|
|
* Paul Walmsley
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/types.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/list.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/err.h>
|
|
#include <linux/io.h>
|
|
|
|
#include <asm/atomic.h>
|
|
|
|
#include <plat/common.h>
|
|
|
|
#include "cm.h"
|
|
#include "cm-regbits-44xx.h"
|
|
|
|
/**
|
|
* omap4_cm_wait_module_ready - wait for a module to be in 'func' state
|
|
* @clkctrl_reg: CLKCTRL module address
|
|
*
|
|
* Wait for the module IDLEST to be functional. If the idle state is in any
|
|
* the non functional state (trans, idle or disabled), module and thus the
|
|
* sysconfig cannot be accessed and will probably lead to an "imprecise
|
|
* external abort"
|
|
*
|
|
* Module idle state:
|
|
* 0x0 func: Module is fully functional, including OCP
|
|
* 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep
|
|
* abortion
|
|
* 0x2 idle: Module is in Idle mode (only OCP part). It is functional if
|
|
* using separate functional clock
|
|
* 0x3 disabled: Module is disabled and cannot be accessed
|
|
*
|
|
*/
|
|
int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg)
|
|
{
|
|
int i = 0;
|
|
|
|
if (!clkctrl_reg)
|
|
return 0;
|
|
|
|
omap_test_timeout((
|
|
((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) == 0) ||
|
|
(((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) >>
|
|
OMAP4430_IDLEST_SHIFT) == 0x2)),
|
|
MAX_MODULE_READY_TIME, i);
|
|
|
|
return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
|
|
}
|
|
|