forked from Minki/linux
OMAP3 hwmod: drop most of the OCP_SYSCONFIG.CLOCKACTIVITY code
Earlier, the hwmod code had considered the OCP_SYSCONFIG.CLOCKACTIVITY bits to be incremental power saving bits, controlling internal IP block clock gates. This was a misapprehension. The CLOCKACTIVITY bits are used to indicate, in advance, which clocks will be cut when the module acknowledges an idle request. This enables the IP block to take whatever action is necessary to complete any in-progress work before asserting its IdleAck. In the current Linux-OMAP code, this implies that the clock framework should be changing module CLOCKACTIVITY bits as module clocks are enabled and disabled. We don't do that yet, but in the future, we should. This must wait until the clock tree is annotated with omap_hwmod pointers (or vice-versa). In the meantime, drop most of the hwmod code that controls CLOCKACTIVITY bits to avoid confusion. This patch has benefited from many illuminating discussions with (in alphabetical order) Benoît Cousson <b-cousson@ti.com>, Rajendra Nayak <rnayak@ti.com>, and Sebastien Sabatier <s-sabatier1@ti.com>. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Rajendra Nayak <rnayak@ti.com> Cc: Sebastien Sabatier <s-sabatier1@ti.com> Cc: Benoît Cousson <b-cousson@ti.com>
This commit is contained in:
parent
718bfd7693
commit
a16b1f7f86
@ -592,6 +592,11 @@ static void _sysc_enable(struct omap_hwmod *oh)
|
||||
|
||||
/* XXX OCP ENAWAKEUP bit? */
|
||||
|
||||
/*
|
||||
* XXX The clock framework should handle this, by
|
||||
* calling into this code. But this must wait until the
|
||||
* clock structures are tagged with omap_hwmod entries
|
||||
*/
|
||||
if (oh->flags & HWMOD_SET_DEFAULT_CLOCKACT &&
|
||||
oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY)
|
||||
_set_clockactivity(oh, oh->sysconfig->clockact, &v);
|
||||
@ -913,33 +918,6 @@ static int _shutdown(struct omap_hwmod *oh)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _write_clockact_lock - set the module's clockactivity bits
|
||||
* @oh: struct omap_hwmod *
|
||||
* @clockact: CLOCKACTIVITY field bits
|
||||
*
|
||||
* Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh
|
||||
* OCP_SYSCONFIG register. Returns -EINVAL if the hwmod is in the
|
||||
* wrong state or returns 0.
|
||||
*/
|
||||
static int _write_clockact_lock(struct omap_hwmod *oh, u8 clockact)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
if (!oh->sysconfig ||
|
||||
!(oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
v = oh->_sysc_cache;
|
||||
_set_clockactivity(oh, clockact, &v);
|
||||
_write_sysconfig(v, oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* _setup - do initial configuration of omap_hwmod
|
||||
* @oh: struct omap_hwmod *
|
||||
@ -1492,62 +1470,6 @@ int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh,
|
||||
return _del_initiator_dep(oh, init_oh);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_set_clockact_none - set clockactivity test to BOTH
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* On some modules, this function can affect the wakeup latency vs.
|
||||
* power consumption balance. Intended to be called by the
|
||||
* omap_device layer. Passes along the return value from
|
||||
* _write_clockact_lock().
|
||||
*/
|
||||
int omap_hwmod_set_clockact_both(struct omap_hwmod *oh)
|
||||
{
|
||||
return _write_clockact_lock(oh, CLOCKACT_TEST_BOTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_set_clockact_none - set clockactivity test to MAIN
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* On some modules, this function can affect the wakeup latency vs.
|
||||
* power consumption balance. Intended to be called by the
|
||||
* omap_device layer. Passes along the return value from
|
||||
* _write_clockact_lock().
|
||||
*/
|
||||
int omap_hwmod_set_clockact_main(struct omap_hwmod *oh)
|
||||
{
|
||||
return _write_clockact_lock(oh, CLOCKACT_TEST_MAIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_set_clockact_none - set clockactivity test to ICLK
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* On some modules, this function can affect the wakeup latency vs.
|
||||
* power consumption balance. Intended to be called by the
|
||||
* omap_device layer. Passes along the return value from
|
||||
* _write_clockact_lock().
|
||||
*/
|
||||
int omap_hwmod_set_clockact_iclk(struct omap_hwmod *oh)
|
||||
{
|
||||
return _write_clockact_lock(oh, CLOCKACT_TEST_ICLK);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_set_clockact_none - set clockactivity test to NONE
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* On some modules, this function can affect the wakeup latency vs.
|
||||
* power consumption balance. Intended to be called by the
|
||||
* omap_device layer. Passes along the return value from
|
||||
* _write_clockact_lock().
|
||||
*/
|
||||
int omap_hwmod_set_clockact_none(struct omap_hwmod *oh)
|
||||
{
|
||||
return _write_clockact_lock(oh, CLOCKACT_TEST_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_enable_wakeup - allow device to wake up the system
|
||||
* @oh: struct omap_hwmod *
|
||||
|
Loading…
Reference in New Issue
Block a user