diff for duplicates of <87ipvttt3a.fsf@ti.com> diff --git a/a/1.txt b/N1/1.txt index a5e4ede..af3a03a 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -10,7 +10,7 @@ Jean Pihet <jean.pihet@newoldbits.com> writes: >>> release the constraints. >>> >>> NOTE: only works for devices which have been converted to use ->>> omap_device/omap_hwmod. +>>> ? ? ? omap_device/omap_hwmod. >>> >>> Longer term, we could possibly remove this API from the OMAP PM layer, >>> and instead directly use the device level API. @@ -31,7 +31,7 @@ Jean Pihet <jean.pihet@newoldbits.com> writes: >> started. >> >> Also, I had a problem doing a real dumb test until I figured out the ->> problem with the init sequence. I tried setting a constraint in the +>> problem with the init sequence. ?I tried setting a constraint in the >> device init code for UART (mach-omap2/serial.c:omap_serial_init_port()), >> and then I realized that that runs before >> mach-omap2/pm34xx.c:pwrdms_setup() which also calls @@ -47,9 +47,9 @@ cannot be used before pwrdms_setup(). But since that happens much later in the boot process than device init code, that might be too strict. >> Also, for debug purposes, it might be useful to have a per-device sysfs ->> interface to setting this wakeup latency constraint. Something like +>> interface to setting this wakeup latency constraint. ?Something like >> ->> /sys/devices/platform/omap/.../power/wakeup_latency +>> ? /sys/devices/platform/omap/.../power/wakeup_latency > I do not see this as a debug interface but rather an API to the user space. > If that is the case there are some issues to deal with, cf. below. @@ -65,14 +65,14 @@ A dummy device could be created for all sysfs requesters since you would want subsequent writes to override previous ones. >> As far as implementation goes, you've so far implemented only wakeup ->> latencies, but not througput. When you implement throughput you will +>> latencies, but not througput. ?When you implement throughput you will >> have to duplicate large parts of this code and data structures for >> throughput, and if ever add some other constraint (frequency, voltage) >> it would need to be duplicated again. >> >> Maybe now is the time to consider an interface to add a generic >> per-device constraint, with a type (latency, throughput, etc.), or ->> "class" as it's called in PM QoS. For now the type/class does not need +>> "class" as it's called in PM QoS. ?For now the type/class does not need >> to be exposed externally, but will make implementing new constraint >> types much easer. > Ok that makes sense. @@ -92,32 +92,32 @@ constraint plist managed for each class of constraint. >>> --- >>> Based on khilman's pm-core branch >>> ->>> arch/arm/mach-omap2/omap_hwmod.c | 62 ++++++++- ->>> arch/arm/mach-omap2/powerdomain.c | 197 +++++++++++++++++++++++++ ->>> arch/arm/mach-omap2/powerdomain.h | 39 +++++- ->>> arch/arm/mach-omap2/powerdomains3xxx_data.c | 60 ++++++++ ->>> arch/arm/plat-omap/include/plat/omap_device.h | 2 + ->>> arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 + ->>> arch/arm/plat-omap/omap-pm-constraints.c | 121 +++++++-------- ->>> arch/arm/plat-omap/omap_device.c | 28 ++++ ->>> 8 files changed, 446 insertions(+), 65 deletions(-) +>>> ?arch/arm/mach-omap2/omap_hwmod.c ? ? ? ? ? ? ?| ? 62 ++++++++- +>>> ?arch/arm/mach-omap2/powerdomain.c ? ? ? ? ? ? | ?197 +++++++++++++++++++++++++ +>>> ?arch/arm/mach-omap2/powerdomain.h ? ? ? ? ? ? | ? 39 +++++- +>>> ?arch/arm/mach-omap2/powerdomains3xxx_data.c ? | ? 60 ++++++++ +>>> ?arch/arm/plat-omap/include/plat/omap_device.h | ? ?2 + +>>> ?arch/arm/plat-omap/include/plat/omap_hwmod.h ?| ? ?2 + +>>> ?arch/arm/plat-omap/omap-pm-constraints.c ? ? ?| ?121 +++++++-------- +>>> ?arch/arm/plat-omap/omap_device.c ? ? ? ? ? ? ?| ? 28 ++++ +>>> ?8 files changed, 446 insertions(+), 65 deletions(-) >>> >>> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c >>> index 028efda..bad8248 100644 >>> --- a/arch/arm/mach-omap2/omap_hwmod.c >>> +++ b/arch/arm/mach-omap2/omap_hwmod.c >>> @@ -142,6 +142,7 @@ ->>> #include "powerdomain.h" ->>> #include <plat/clock.h> ->>> #include <plat/omap_hwmod.h> +>>> ?#include "powerdomain.h" +>>> ?#include <plat/clock.h> +>>> ?#include <plat/omap_hwmod.h> >>> +#include <plat/omap_device.h> ->>> #include <plat/prcm.h> +>>> ?#include <plat/prcm.h> >>> ->>> #include "cm2xxx_3xxx.h" +>>> ?#include "cm2xxx_3xxx.h" >>> @@ -2267,10 +2268,69 @@ ohsps_unlock: ->>> } +>>> ?} >>> ->>> /** +>>> ?/** >>> + * omap_hwmod_set_max_dev_wakeup_lat - set a device wake-up constraint >>> + * @oh: the device of @oh to set a constraint on. >>> + * @req_oh: the device of @req_oh is the requester of the constraint. @@ -133,88 +133,88 @@ constraint plist managed for each class of constraint. >>> + * of the powerdomain assocated with @oh. >>> + */ >>> +int omap_hwmod_set_max_dev_wakeup_lat(struct omap_hwmod *req_oh, ->>> + struct omap_hwmod *oh, long t) +>>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_hwmod *oh, long t) >>> +{ ->>> + struct device *req_dev; ->>> + struct platform_device *req_pdev; ->>> + struct powerdomain *pwrdm; +>>> + ? ? struct device *req_dev; +>>> + ? ? struct platform_device *req_pdev; +>>> + ? ? struct powerdomain *pwrdm; >>> + ->>> + pwrdm = omap_hwmod_get_pwrdm(oh); +>>> + ? ? pwrdm = omap_hwmod_get_pwrdm(oh); >>> + ->>> + /* Catch devices with undefined powerdomains */ ->>> + if (!PTR_ERR(pwrdm)) { ->>> + pr_err("omap_hwmod: Error: could not find parent " ->>> + "powerdomain for %s\n", oh->name); ->>> + return -EINVAL; ->>> + } +>>> + ? ? /* Catch devices with undefined powerdomains */ +>>> + ? ? if (!PTR_ERR(pwrdm)) { +>>> + ? ? ? ? ? ? pr_err("omap_hwmod: Error: could not find parent " +>>> + ? ? ? ? ? ? ? ? ? ? "powerdomain for %s\n", oh->name); +>>> + ? ? ? ? ? ? return -EINVAL; +>>> + ? ? } >>> + ->>> + req_pdev = &(req_oh->od->pdev); ->>> + if (!PTR_ERR(req_pdev)) { ->>> + pr_err("omap_hwmod: Error: pdev not found for oh %s\n", ->>> + oh->name); ->>> + return -EINVAL; ->>> + } +>>> + ? ? req_pdev = &(req_oh->od->pdev); +>>> + ? ? if (!PTR_ERR(req_pdev)) { +>>> + ? ? ? ? ? ? pr_err("omap_hwmod: Error: pdev not found for oh %s\n", +>>> + ? ? ? ? ? ? ? ? ? ?oh->name); +>>> + ? ? ? ? ? ? return -EINVAL; +>>> + ? ? } >>> + ->>> + req_dev = &(req_pdev->dev); ->>> + if (!PTR_ERR(req_dev)) { ->>> + pr_err("omap_hwmod: Error: device not found for oh %s\n", ->>> + oh->name); ->>> + return -EINVAL; ->>> + } +>>> + ? ? req_dev = &(req_pdev->dev); +>>> + ? ? if (!PTR_ERR(req_dev)) { +>>> + ? ? ? ? ? ? pr_err("omap_hwmod: Error: device not found for oh %s\n", +>>> + ? ? ? ? ? ? ? ? ? ?oh->name); +>>> + ? ? ? ? ? ? return -EINVAL; +>>> + ? ? } >>> + ->>> + /* Call set/release_constraint for the given pwrdm */ ->>> + if (t == -1) { ->>> + pr_debug("omap_hwmod: remove max device latency constraint: " ->>> + "oh %s, pwrdm %s, req by oh %s\n", ->>> + oh->name, pwrdm->name, req_oh->name); ->>> + } else { ->>> + pr_debug("omap_hwmod: add max device latency constraint: " ->>> + "oh %s, t = %ld usec, pwrdm %s, req by oh %s\n", ->>> + oh->name, t, pwrdm->name, req_oh->name); ->>> + } +>>> + ? ? /* Call set/release_constraint for the given pwrdm */ +>>> + ? ? if (t == -1) { +>>> + ? ? ? ? ? ? pr_debug("omap_hwmod: remove max device latency constraint: " +>>> + ? ? ? ? ? ? ? ? ? ? ?"oh %s, pwrdm %s, req by oh %s\n", +>>> + ? ? ? ? ? ? ? ? ? ? ?oh->name, pwrdm->name, req_oh->name); +>>> + ? ? } else { +>>> + ? ? ? ? ? ? pr_debug("omap_hwmod: add max device latency constraint: " +>>> + ? ? ? ? ? ? ? ? ? ? ?"oh %s, t = %ld usec, pwrdm %s, req by oh %s\n", +>>> + ? ? ? ? ? ? ? ? ? ? ?oh->name, t, pwrdm->name, req_oh->name); +>>> + ? ? } >>> + ->>> + return pwrdm_wakeuplat_set_constraint(pwrdm, req_dev, t); +>>> + ? ? return pwrdm_wakeuplat_set_constraint(pwrdm, req_dev, t); >>> +} >>> + >>> +/** ->>> * omap_hwmod_get_context_loss_count - get lost context count ->>> * @oh: struct omap_hwmod * ->>> * +>>> ? * omap_hwmod_get_context_loss_count - get lost context count +>>> ? * @oh: struct omap_hwmod * +>>> ? * >>> - * Query the powerdomain of of @oh to get the context loss >>> + * Query the powerdomain of @oh to get the context loss ->>> * count for this device. ->>> * ->>> * Returns the context loss count of the powerdomain assocated with @oh +>>> ? * count for this device. +>>> ? * +>>> ? * Returns the context loss count of the powerdomain assocated with @oh >>> diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c >>> index eaed0df..6fb4741 100644 >>> --- a/arch/arm/mach-omap2/powerdomain.c >>> +++ b/arch/arm/mach-omap2/powerdomain.c >>> @@ -19,6 +19,8 @@ ->>> #include <linux/list.h> ->>> #include <linux/errno.h> ->>> #include <linux/string.h> +>>> ?#include <linux/list.h> +>>> ?#include <linux/errno.h> +>>> ?#include <linux/string.h> >>> +#include <linux/slab.h> >>> + ->>> #include "cm2xxx_3xxx.h" ->>> #include "prcm44xx.h" ->>> #include "cm44xx.h" +>>> ?#include "cm2xxx_3xxx.h" +>>> ?#include "prcm44xx.h" +>>> ?#include "cm44xx.h" >>> @@ -103,6 +105,13 @@ static int _pwrdm_register(struct powerdomain *pwrdm) ->>> pwrdm->state = pwrdm_read_pwrst(pwrdm); ->>> pwrdm->state_counter[pwrdm->state] = 1; +>>> ? ? ? pwrdm->state = pwrdm_read_pwrst(pwrdm); +>>> ? ? ? pwrdm->state_counter[pwrdm->state] = 1; >>> ->>> + /* Initialize priority ordered list for wakeup latency constraint */ ->>> + spin_lock_init(&pwrdm->wakeuplat_lock); ->>> + plist_head_init(&pwrdm->wakeuplat_dev_list, &pwrdm->wakeuplat_lock); +>>> + ? ? /* Initialize priority ordered list for wakeup latency constraint */ +>>> + ? ? spin_lock_init(&pwrdm->wakeuplat_lock); +>>> + ? ? plist_head_init(&pwrdm->wakeuplat_dev_list, &pwrdm->wakeuplat_lock); >>> + ->>> + /* res_mutex protects res_list add and del ops */ ->>> + mutex_init(&pwrdm->wakeuplat_mutex); +>>> + ? ? /* res_mutex protects res_list add and del ops */ +>>> + ? ? mutex_init(&pwrdm->wakeuplat_mutex); >>> + ->>> pr_debug("powerdomain: registered %s\n", pwrdm->name); +>>> ? ? ? pr_debug("powerdomain: registered %s\n", pwrdm->name); >>> ->>> return 0; +>>> ? ? ? return 0; >>> @@ -176,6 +185,74 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused) ->>> return 0; ->>> } +>>> ? ? ? return 0; +>>> ?} >>> >>> +/** >>> + * pwrdm_wakeuplat_update_pwrst - Update power domain power state if needed @@ -230,30 +230,30 @@ constraint plist managed for each class of constraint. >>> + */ >>> +static int pwrdm_wakeuplat_update_pwrst(struct powerdomain *pwrdm) >>> +{ ->>> + struct plist_node *node; ->>> + int ret = 0, new_state; ->>> + long min_latency = -1; +>>> + ? ? struct plist_node *node; +>>> + ? ? int ret = 0, new_state; +>>> + ? ? long min_latency = -1; >>> + ->>> + /* Find the strongest constraint from the plist */ ->>> + if (!plist_head_empty(&pwrdm->wakeuplat_dev_list)) { ->>> + node = plist_first(&pwrdm->wakeuplat_dev_list); ->>> + min_latency = node->prio; ->>> + } +>>> + ? ? /* Find the strongest constraint from the plist */ +>>> + ? ? if (!plist_head_empty(&pwrdm->wakeuplat_dev_list)) { +>>> + ? ? ? ? ? ? node = plist_first(&pwrdm->wakeuplat_dev_list); +>>> + ? ? ? ? ? ? min_latency = node->prio; +>>> + ? ? } >>> + ->>> + /* Find power state with wakeup latency < minimum constraint. */ ->>> + for (new_state = 0x0; new_state < PWRDM_MAX_PWRSTS; new_state++) { ->>> + if (min_latency == -1 || ->>> + pwrdm->wakeup_lat[new_state] <= min_latency) ->>> + break; ->>> + } +>>> + ? ? /* Find power state with wakeup latency < minimum constraint. */ +>>> + ? ? for (new_state = 0x0; new_state < PWRDM_MAX_PWRSTS; new_state++) { +>>> + ? ? ? ? ? ? if (min_latency == -1 || +>>> + ? ? ? ? ? ? ? ? pwrdm->wakeup_lat[new_state] <= min_latency) +>>> + ? ? ? ? ? ? ? ? ? ? break; +>>> + ? ? } >>> + ->>> + switch (new_state) { ->>> + case PWRDM_FUNC_PWRST_OFF: ->>> + new_state = PWRDM_POWER_OFF; ->>> + break; ->>> + case PWRDM_FUNC_PWRST_OSWR: ->>> + if (cpu_is_omap34xx()) ->>> + pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_OFF); +>>> + ? ? switch (new_state) { +>>> + ? ? case PWRDM_FUNC_PWRST_OFF: +>>> + ? ? ? ? ? ? new_state = PWRDM_POWER_OFF; +>>> + ? ? ? ? ? ? break; +>>> + ? ? case PWRDM_FUNC_PWRST_OSWR: +>>> + ? ? ? ? ? ? if (cpu_is_omap34xx()) +>>> + ? ? ? ? ? ? ? ? ? ? pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_OFF); >> >> cpu_is_* checks here aren't right. >> @@ -272,34 +272,34 @@ Right, I think you can just drop the cpu_is_* checks here since as you pointed out, the called functions already handle SoC specifics. >> ->>> + new_state = PWRDM_POWER_RET; ->>> + break; ->>> + case PWRDM_FUNC_PWRST_CSWR: ->>> + if (cpu_is_omap34xx()) ->>> + pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_RET); ->>> + new_state = PWRDM_POWER_RET; ->>> + break; ->>> + case PWRDM_FUNC_PWRST_ON: ->>> + new_state = PWRDM_POWER_ON; ->>> + break; ->>> + default: ->>> + pr_warn("powerdomain: requested latency constraint not " ->>> + "supported %s set to ON state\n", pwrdm->name); ->>> + new_state = PWRDM_POWER_ON; ->>> + break; ->>> + } +>>> + ? ? ? ? ? ? new_state = PWRDM_POWER_RET; +>>> + ? ? ? ? ? ? break; +>>> + ? ? case PWRDM_FUNC_PWRST_CSWR: +>>> + ? ? ? ? ? ? if (cpu_is_omap34xx()) +>>> + ? ? ? ? ? ? ? ? ? ? pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_RET); +>>> + ? ? ? ? ? ? new_state = PWRDM_POWER_RET; +>>> + ? ? ? ? ? ? break; +>>> + ? ? case PWRDM_FUNC_PWRST_ON: +>>> + ? ? ? ? ? ? new_state = PWRDM_POWER_ON; +>>> + ? ? ? ? ? ? break; +>>> + ? ? default: +>>> + ? ? ? ? ? ? pr_warn("powerdomain: requested latency constraint not " +>>> + ? ? ? ? ? ? ? ? ? ? "supported %s set to ON state\n", pwrdm->name); +>>> + ? ? ? ? ? ? new_state = PWRDM_POWER_ON; +>>> + ? ? ? ? ? ? break; +>>> + ? ? } >>> + ->>> + if (pwrdm_read_pwrst(pwrdm) != new_state) { ->>> + if (cpu_is_omap34xx()) ->>> + ret = omap_set_pwrdm_state(pwrdm, new_state); ->>> + } +>>> + ? ? if (pwrdm_read_pwrst(pwrdm) != new_state) { +>>> + ? ? ? ? ? ? if (cpu_is_omap34xx()) +>>> + ? ? ? ? ? ? ? ? ? ? ret = omap_set_pwrdm_state(pwrdm, new_state); +>>> + ? ? } >>> + ->>> + pr_debug("powerdomain: %s pwrst: curr=%d, prev=%d next=%d " ->>> + "min_latency=%ld, set_state=%d\n", pwrdm->name, ->>> + pwrdm_read_pwrst(pwrdm), pwrdm_read_prev_pwrst(pwrdm), ->>> + pwrdm_read_next_pwrst(pwrdm), min_latency, new_state); +>>> + ? ? pr_debug("powerdomain: %s pwrst: curr=%d, prev=%d next=%d " +>>> + ? ? ? ? ? ? ?"min_latency=%ld, set_state=%d\n", pwrdm->name, +>>> + ? ? ? ? ? ? ?pwrdm_read_pwrst(pwrdm), pwrdm_read_prev_pwrst(pwrdm), +>>> + ? ? ? ? ? ? ?pwrdm_read_next_pwrst(pwrdm), min_latency, new_state); >>> + ->>> + return ret; +>>> + ? ? return ret; >>> +} >>> + >> @@ -310,133 +310,133 @@ pointed out, the called functions already handle SoC specifics. >>> --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c >>> +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c >>> @@ -52,6 +52,12 @@ static struct powerdomain iva2_pwrdm = { ->>> [2] = PWRSTS_OFF_ON, ->>> [3] = PWRDM_POWER_ON, ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 1100, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 350, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? ? ? ? ? [2] = PWRSTS_OFF_ON, +>>> ? ? ? ? ? ? ? [3] = PWRDM_POWER_ON, +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 1100, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 350, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain mpu_3xxx_pwrdm = { +>>> ?static struct powerdomain mpu_3xxx_pwrdm = { >>> @@ -68,6 +74,12 @@ static struct powerdomain mpu_3xxx_pwrdm = { ->>> .pwrsts_mem_on = { ->>> [0] = PWRSTS_OFF_ON, ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 95, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 45, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .pwrsts_mem_on ? ?= { +>>> ? ? ? ? ? ? ? [0] = PWRSTS_OFF_ON, +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 95, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 45, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> /* +>>> ?/* >>> @@ -98,6 +110,12 @@ static struct powerdomain core_3xxx_pre_es3_1_pwrdm = { ->>> [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ ->>> [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 100, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 60, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? ? ? ? ? [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ +>>> ? ? ? ? ? ? ? [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 100, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 60, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain core_3xxx_es3_1_pwrdm = { +>>> ?static struct powerdomain core_3xxx_es3_1_pwrdm = { >>> @@ -121,6 +139,12 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = { ->>> [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ ->>> [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 100, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 60, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? ? ? ? ? [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ +>>> ? ? ? ? ? ? ? [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 100, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 60, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain dss_pwrdm = { +>>> ?static struct powerdomain dss_pwrdm = { >>> @@ -136,6 +160,12 @@ static struct powerdomain dss_pwrdm = { ->>> .pwrsts_mem_on = { ->>> [0] = PWRDM_POWER_ON, /* MEMONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 70, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 20, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .pwrsts_mem_on ? ?= { +>>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 70, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 20, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> /* +>>> ?/* >>> @@ -157,6 +187,12 @@ static struct powerdomain sgx_pwrdm = { ->>> .pwrsts_mem_on = { ->>> [0] = PWRDM_POWER_ON, /* MEMONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 1000, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .pwrsts_mem_on ? ?= { +>>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 1000, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain cam_pwrdm = { +>>> ?static struct powerdomain cam_pwrdm = { >>> @@ -172,6 +208,12 @@ static struct powerdomain cam_pwrdm = { ->>> .pwrsts_mem_on = { ->>> [0] = PWRDM_POWER_ON, /* MEMONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 850, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 35, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .pwrsts_mem_on ? ?= { +>>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 850, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 35, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain per_pwrdm = { +>>> ?static struct powerdomain per_pwrdm = { >>> @@ -187,6 +229,12 @@ static struct powerdomain per_pwrdm = { ->>> .pwrsts_mem_on = { ->>> [0] = PWRDM_POWER_ON, /* MEMONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 200, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 110, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .pwrsts_mem_on ? ?= { +>>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 200, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 110, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain emu_pwrdm = { +>>> ?static struct powerdomain emu_pwrdm = { >>> @@ -201,6 +249,12 @@ static struct powerdomain neon_pwrdm = { ->>> .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), ->>> .pwrsts = PWRSTS_OFF_RET_ON, ->>> .pwrsts_logic_ret = PWRDM_POWER_RET, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 200, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 35, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .omap_chip ? ? ? ?= OMAP_CHIP_INIT(CHIP_IS_OMAP3430), +>>> ? ? ? .pwrsts ? ? ? ? ? = PWRSTS_OFF_RET_ON, +>>> ? ? ? .pwrsts_logic_ret = PWRDM_POWER_RET, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 200, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 35, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >>> ->>> static struct powerdomain usbhost_pwrdm = { +>>> ?static struct powerdomain usbhost_pwrdm = { >>> @@ -223,6 +277,12 @@ static struct powerdomain usbhost_pwrdm = { ->>> .pwrsts_mem_on = { ->>> [0] = PWRDM_POWER_ON, /* MEMONSTATE */ ->>> }, ->>> + .wakeup_lat = { ->>> + [PWRDM_FUNC_PWRST_OFF] = 800, ->>> + [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, ->>> + [PWRDM_FUNC_PWRST_CSWR] = 150, ->>> + [PWRDM_FUNC_PWRST_ON] = 0, ->>> + }, ->>> }; +>>> ? ? ? .pwrsts_mem_on ? ?= { +>>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */ +>>> ? ? ? }, +>>> + ? ? .wakeup_lat = { +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 800, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 150, +>>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0, +>>> + ? ? }, +>>> ?}; >> >> A summary about where the latency numbers for each powerdomain come from >> would be useful. @@ -446,48 +446,48 @@ pointed out, the called functions already handle SoC specifics. >> [...] >> >>> @@ -87,64 +60,86 @@ int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r) ->>> return 0; ->>> } +>>> ? ? ? return 0; +>>> ?} >>> >>> +/* >>> + * omap_pm_set_max_dev_wakeup_lat - set/release devices wake-up latency >>> + * constraints >>> + */ ->>> int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev, ->>> long t) ->>> { ->>> + struct platform_device *pdev, *req_pdev; ->>> + int ret = 0; +>>> ?int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev, +>>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?long t) +>>> ?{ +>>> + ? ? struct platform_device *pdev, *req_pdev; +>>> + ? ? int ret = 0; >>> + ->>> if (!req_dev || !dev || t < -1) { ->>> WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); ->>> return -EINVAL; ->>> + } +>>> ? ? ? if (!req_dev || !dev || t < -1) { +>>> ? ? ? ? ? ? ? WARN(1, "OMAP PM: %s: invalid parameter(s)", __func__); +>>> ? ? ? ? ? ? ? return -EINVAL; +>>> + ? ? } >>> + ->>> + /* Look for the platform devices */ ->>> + pdev = to_platform_device(dev); ->>> + req_pdev = to_platform_device(req_dev); +>>> + ? ? /* Look for the platform devices */ +>>> + ? ? pdev = to_platform_device(dev); +>>> + ? ? req_pdev = to_platform_device(req_dev); >>> + ->>> + /* Try to catch non platform devices. */ ->>> + if ((pdev->name == NULL) || (req_pdev->name == NULL)) { ->>> + pr_err("OMAP-PM set_wakeup_lat: Error: platform devices " ->>> + "not valid\n"); ->>> + return -EINVAL; ->>> + } else { ->>> + /* Call the omap_device API */ ->>> + ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t); ->>> + } +>>> + ? ? /* Try to catch non platform devices. */ +>>> + ? ? if ((pdev->name == NULL) || (req_pdev->name == NULL)) { +>>> + ? ? ? ? ? ? pr_err("OMAP-PM set_wakeup_lat: Error: platform devices " +>>> + ? ? ? ? ? ? ? ? ? ?"not valid\n"); +>>> + ? ? ? ? ? ? return -EINVAL; +>>> + ? ? } else { +>>> + ? ? ? ? ? ? /* Call the omap_device API */ +>>> + ? ? ? ? ? ? ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t); +>>> + ? ? } >> ->> I don't think a NULL name check is the right sanity check here. WHat +>> I don't think a NULL name check is the right sanity check here. ?WHat >> you really need to know is whether the target device is an omap_device. >> The requesting device can be anything (I think.) >> >> Here's a simpler check: >> ->> if (pdev->dev->parent == &omap_device_parent) ->> ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t); ->> else ->> ... +>> ? ? ? ?if (pdev->dev->parent == &omap_device_parent) +>> ? ? ? ? ? ? ? ?ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t); +>> ? ? ? ?else +>> ? ? ? ? ? ? ? ?... > Ok I will use this test. Note: the dev parameter is already checked > for NULL above. > @@ -502,7 +502,3 @@ I agree that the only the target device needs to be an omap_device, the requester can be any device. Kevin --- -To unsubscribe from this list: send the line "unsubscribe linux-omap" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/a/content_digest b/N1/content_digest index 944f302..c6bdc32 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,14 +2,10 @@ "ref\01299250375-26134-3-git-send-email-j-pihet@ti.com\0" "ref\087aah6xsqk.fsf@ti.com\0" "ref\0AANLkTinKmQztha_tKM0zB7CWMqbCLtsaYxZrdX3RVvW+@mail.gmail.com\0" - "From\0Kevin Hilman <khilman@ti.com>\0" - "Subject\0Re: [PATCH 2/2] OMAP: PM: implement devices wakeup latency constraints APIs\0" + "From\0khilman@ti.com (Kevin Hilman)\0" + "Subject\0[PATCH 2/2] OMAP: PM: implement devices wakeup latency constraints APIs\0" "Date\0Tue, 08 Mar 2011 09:33:45 -0800\0" - "To\0Jean Pihet <jean.pihet@newoldbits.com>\0" - "Cc\0linux-omap@vger.kernel.org" - linux-arm-kernel@lists.infradead.org - Jean Pihet <j-pihet@ti.com> - " Vibhore Vardhan <vvardhan@ti.com>\0" + "To\0linux-arm-kernel@lists.infradead.org\0" "\00:1\0" "b\0" "Jean Pihet <jean.pihet@newoldbits.com> writes:\n" @@ -24,7 +20,7 @@ ">>> release the constraints.\n" ">>>\n" ">>> NOTE: only works for devices which have been converted to use\n" - ">>> \302\240 \302\240 \302\240 omap_device/omap_hwmod.\n" + ">>> ? ? ? omap_device/omap_hwmod.\n" ">>>\n" ">>> Longer term, we could possibly remove this API from the OMAP PM layer,\n" ">>> and instead directly use the device level API.\n" @@ -45,7 +41,7 @@ ">> started.\n" ">>\n" ">> Also, I had a problem doing a real dumb test until I figured out the\n" - ">> problem with the init sequence. \302\240I tried setting a constraint in the\n" + ">> problem with the init sequence. ?I tried setting a constraint in the\n" ">> device init code for UART (mach-omap2/serial.c:omap_serial_init_port()),\n" ">> and then I realized that that runs before\n" ">> mach-omap2/pm34xx.c:pwrdms_setup() which also calls\n" @@ -61,9 +57,9 @@ "in the boot process than device init code, that might be too strict.\n" "\n" ">> Also, for debug purposes, it might be useful to have a per-device sysfs\n" - ">> interface to setting this wakeup latency constraint. \302\240Something like\n" + ">> interface to setting this wakeup latency constraint. ?Something like\n" ">>\n" - ">> \302\240 /sys/devices/platform/omap/.../power/wakeup_latency\n" + ">> ? /sys/devices/platform/omap/.../power/wakeup_latency\n" "> I do not see this as a debug interface but rather an API to the user space.\n" "> If that is the case there are some issues to deal with, cf. below.\n" "\n" @@ -79,14 +75,14 @@ "want subsequent writes to override previous ones.\n" "\n" ">> As far as implementation goes, you've so far implemented only wakeup\n" - ">> latencies, but not througput. \302\240When you implement throughput you will\n" + ">> latencies, but not througput. ?When you implement throughput you will\n" ">> have to duplicate large parts of this code and data structures for\n" ">> throughput, and if ever add some other constraint (frequency, voltage)\n" ">> it would need to be duplicated again.\n" ">>\n" ">> Maybe now is the time to consider an interface to add a generic\n" ">> per-device constraint, with a type (latency, throughput, etc.), or\n" - ">> \"class\" as it's called in PM QoS. \302\240For now the type/class does not need\n" + ">> \"class\" as it's called in PM QoS. ?For now the type/class does not need\n" ">> to be exposed externally, but will make implementing new constraint\n" ">> types much easer.\n" "> Ok that makes sense.\n" @@ -106,32 +102,32 @@ ">>> ---\n" ">>> Based on khilman's pm-core branch\n" ">>>\n" - ">>> \302\240arch/arm/mach-omap2/omap_hwmod.c \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240| \302\240 62 ++++++++-\n" - ">>> \302\240arch/arm/mach-omap2/powerdomain.c \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 | \302\240197 +++++++++++++++++++++++++\n" - ">>> \302\240arch/arm/mach-omap2/powerdomain.h \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 | \302\240 39 +++++-\n" - ">>> \302\240arch/arm/mach-omap2/powerdomains3xxx_data.c \302\240 | \302\240 60 ++++++++\n" - ">>> \302\240arch/arm/plat-omap/include/plat/omap_device.h | \302\240 \302\2402 +\n" - ">>> \302\240arch/arm/plat-omap/include/plat/omap_hwmod.h \302\240| \302\240 \302\2402 +\n" - ">>> \302\240arch/arm/plat-omap/omap-pm-constraints.c \302\240 \302\240 \302\240| \302\240121 +++++++--------\n" - ">>> \302\240arch/arm/plat-omap/omap_device.c \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240| \302\240 28 ++++\n" - ">>> \302\2408 files changed, 446 insertions(+), 65 deletions(-)\n" + ">>> ?arch/arm/mach-omap2/omap_hwmod.c ? ? ? ? ? ? ?| ? 62 ++++++++-\n" + ">>> ?arch/arm/mach-omap2/powerdomain.c ? ? ? ? ? ? | ?197 +++++++++++++++++++++++++\n" + ">>> ?arch/arm/mach-omap2/powerdomain.h ? ? ? ? ? ? | ? 39 +++++-\n" + ">>> ?arch/arm/mach-omap2/powerdomains3xxx_data.c ? | ? 60 ++++++++\n" + ">>> ?arch/arm/plat-omap/include/plat/omap_device.h | ? ?2 +\n" + ">>> ?arch/arm/plat-omap/include/plat/omap_hwmod.h ?| ? ?2 +\n" + ">>> ?arch/arm/plat-omap/omap-pm-constraints.c ? ? ?| ?121 +++++++--------\n" + ">>> ?arch/arm/plat-omap/omap_device.c ? ? ? ? ? ? ?| ? 28 ++++\n" + ">>> ?8 files changed, 446 insertions(+), 65 deletions(-)\n" ">>>\n" ">>> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c\n" ">>> index 028efda..bad8248 100644\n" ">>> --- a/arch/arm/mach-omap2/omap_hwmod.c\n" ">>> +++ b/arch/arm/mach-omap2/omap_hwmod.c\n" ">>> @@ -142,6 +142,7 @@\n" - ">>> \302\240#include \"powerdomain.h\"\n" - ">>> \302\240#include <plat/clock.h>\n" - ">>> \302\240#include <plat/omap_hwmod.h>\n" + ">>> ?#include \"powerdomain.h\"\n" + ">>> ?#include <plat/clock.h>\n" + ">>> ?#include <plat/omap_hwmod.h>\n" ">>> +#include <plat/omap_device.h>\n" - ">>> \302\240#include <plat/prcm.h>\n" + ">>> ?#include <plat/prcm.h>\n" ">>>\n" - ">>> \302\240#include \"cm2xxx_3xxx.h\"\n" + ">>> ?#include \"cm2xxx_3xxx.h\"\n" ">>> @@ -2267,10 +2268,69 @@ ohsps_unlock:\n" - ">>> \302\240}\n" + ">>> ?}\n" ">>>\n" - ">>> \302\240/**\n" + ">>> ?/**\n" ">>> + * omap_hwmod_set_max_dev_wakeup_lat - set a device wake-up constraint\n" ">>> + * @oh: the device of @oh to set a constraint on.\n" ">>> + * @req_oh: the device of @req_oh is the requester of the constraint.\n" @@ -147,88 +143,88 @@ ">>> + * of the powerdomain assocated with @oh.\n" ">>> + */\n" ">>> +int omap_hwmod_set_max_dev_wakeup_lat(struct omap_hwmod *req_oh,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 struct omap_hwmod *oh, long t)\n" + ">>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct omap_hwmod *oh, long t)\n" ">>> +{\n" - ">>> + \302\240 \302\240 struct device *req_dev;\n" - ">>> + \302\240 \302\240 struct platform_device *req_pdev;\n" - ">>> + \302\240 \302\240 struct powerdomain *pwrdm;\n" + ">>> + ? ? struct device *req_dev;\n" + ">>> + ? ? struct platform_device *req_pdev;\n" + ">>> + ? ? struct powerdomain *pwrdm;\n" ">>> +\n" - ">>> + \302\240 \302\240 pwrdm = omap_hwmod_get_pwrdm(oh);\n" + ">>> + ? ? pwrdm = omap_hwmod_get_pwrdm(oh);\n" ">>> +\n" - ">>> + \302\240 \302\240 /* Catch devices with undefined powerdomains */\n" - ">>> + \302\240 \302\240 if (!PTR_ERR(pwrdm)) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_err(\"omap_hwmod: Error: could not find parent \"\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \"powerdomain for %s\\n\", oh->name);\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -EINVAL;\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? /* Catch devices with undefined powerdomains */\n" + ">>> + ? ? if (!PTR_ERR(pwrdm)) {\n" + ">>> + ? ? ? ? ? ? pr_err(\"omap_hwmod: Error: could not find parent \"\n" + ">>> + ? ? ? ? ? ? ? ? ? ? \"powerdomain for %s\\n\", oh->name);\n" + ">>> + ? ? ? ? ? ? return -EINVAL;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 req_pdev = &(req_oh->od->pdev);\n" - ">>> + \302\240 \302\240 if (!PTR_ERR(req_pdev)) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_err(\"omap_hwmod: Error: pdev not found for oh %s\\n\",\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240oh->name);\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -EINVAL;\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? req_pdev = &(req_oh->od->pdev);\n" + ">>> + ? ? if (!PTR_ERR(req_pdev)) {\n" + ">>> + ? ? ? ? ? ? pr_err(\"omap_hwmod: Error: pdev not found for oh %s\\n\",\n" + ">>> + ? ? ? ? ? ? ? ? ? ?oh->name);\n" + ">>> + ? ? ? ? ? ? return -EINVAL;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 req_dev = &(req_pdev->dev);\n" - ">>> + \302\240 \302\240 if (!PTR_ERR(req_dev)) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_err(\"omap_hwmod: Error: device not found for oh %s\\n\",\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240oh->name);\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -EINVAL;\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? req_dev = &(req_pdev->dev);\n" + ">>> + ? ? if (!PTR_ERR(req_dev)) {\n" + ">>> + ? ? ? ? ? ? pr_err(\"omap_hwmod: Error: device not found for oh %s\\n\",\n" + ">>> + ? ? ? ? ? ? ? ? ? ?oh->name);\n" + ">>> + ? ? ? ? ? ? return -EINVAL;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 /* Call set/release_constraint for the given pwrdm */\n" - ">>> + \302\240 \302\240 if (t == -1) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_debug(\"omap_hwmod: remove max device latency constraint: \"\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240\"oh %s, pwrdm %s, req by oh %s\\n\",\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240oh->name, pwrdm->name, req_oh->name);\n" - ">>> + \302\240 \302\240 } else {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_debug(\"omap_hwmod: add max device latency constraint: \"\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240\"oh %s, t = %ld usec, pwrdm %s, req by oh %s\\n\",\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240oh->name, t, pwrdm->name, req_oh->name);\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? /* Call set/release_constraint for the given pwrdm */\n" + ">>> + ? ? if (t == -1) {\n" + ">>> + ? ? ? ? ? ? pr_debug(\"omap_hwmod: remove max device latency constraint: \"\n" + ">>> + ? ? ? ? ? ? ? ? ? ? ?\"oh %s, pwrdm %s, req by oh %s\\n\",\n" + ">>> + ? ? ? ? ? ? ? ? ? ? ?oh->name, pwrdm->name, req_oh->name);\n" + ">>> + ? ? } else {\n" + ">>> + ? ? ? ? ? ? pr_debug(\"omap_hwmod: add max device latency constraint: \"\n" + ">>> + ? ? ? ? ? ? ? ? ? ? ?\"oh %s, t = %ld usec, pwrdm %s, req by oh %s\\n\",\n" + ">>> + ? ? ? ? ? ? ? ? ? ? ?oh->name, t, pwrdm->name, req_oh->name);\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 return pwrdm_wakeuplat_set_constraint(pwrdm, req_dev, t);\n" + ">>> + ? ? return pwrdm_wakeuplat_set_constraint(pwrdm, req_dev, t);\n" ">>> +}\n" ">>> +\n" ">>> +/**\n" - ">>> \302\240 * omap_hwmod_get_context_loss_count - get lost context count\n" - ">>> \302\240 * @oh: struct omap_hwmod *\n" - ">>> \302\240 *\n" + ">>> ? * omap_hwmod_get_context_loss_count - get lost context count\n" + ">>> ? * @oh: struct omap_hwmod *\n" + ">>> ? *\n" ">>> - * Query the powerdomain of of @oh to get the context loss\n" ">>> + * Query the powerdomain of @oh to get the context loss\n" - ">>> \302\240 * count for this device.\n" - ">>> \302\240 *\n" - ">>> \302\240 * Returns the context loss count of the powerdomain assocated with @oh\n" + ">>> ? * count for this device.\n" + ">>> ? *\n" + ">>> ? * Returns the context loss count of the powerdomain assocated with @oh\n" ">>> diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c\n" ">>> index eaed0df..6fb4741 100644\n" ">>> --- a/arch/arm/mach-omap2/powerdomain.c\n" ">>> +++ b/arch/arm/mach-omap2/powerdomain.c\n" ">>> @@ -19,6 +19,8 @@\n" - ">>> \302\240#include <linux/list.h>\n" - ">>> \302\240#include <linux/errno.h>\n" - ">>> \302\240#include <linux/string.h>\n" + ">>> ?#include <linux/list.h>\n" + ">>> ?#include <linux/errno.h>\n" + ">>> ?#include <linux/string.h>\n" ">>> +#include <linux/slab.h>\n" ">>> +\n" - ">>> \302\240#include \"cm2xxx_3xxx.h\"\n" - ">>> \302\240#include \"prcm44xx.h\"\n" - ">>> \302\240#include \"cm44xx.h\"\n" + ">>> ?#include \"cm2xxx_3xxx.h\"\n" + ">>> ?#include \"prcm44xx.h\"\n" + ">>> ?#include \"cm44xx.h\"\n" ">>> @@ -103,6 +105,13 @@ static int _pwrdm_register(struct powerdomain *pwrdm)\n" - ">>> \302\240 \302\240 \302\240 pwrdm->state = pwrdm_read_pwrst(pwrdm);\n" - ">>> \302\240 \302\240 \302\240 pwrdm->state_counter[pwrdm->state] = 1;\n" + ">>> ? ? ? pwrdm->state = pwrdm_read_pwrst(pwrdm);\n" + ">>> ? ? ? pwrdm->state_counter[pwrdm->state] = 1;\n" ">>>\n" - ">>> + \302\240 \302\240 /* Initialize priority ordered list for wakeup latency constraint */\n" - ">>> + \302\240 \302\240 spin_lock_init(&pwrdm->wakeuplat_lock);\n" - ">>> + \302\240 \302\240 plist_head_init(&pwrdm->wakeuplat_dev_list, &pwrdm->wakeuplat_lock);\n" + ">>> + ? ? /* Initialize priority ordered list for wakeup latency constraint */\n" + ">>> + ? ? spin_lock_init(&pwrdm->wakeuplat_lock);\n" + ">>> + ? ? plist_head_init(&pwrdm->wakeuplat_dev_list, &pwrdm->wakeuplat_lock);\n" ">>> +\n" - ">>> + \302\240 \302\240 /* res_mutex protects res_list add and del ops */\n" - ">>> + \302\240 \302\240 mutex_init(&pwrdm->wakeuplat_mutex);\n" + ">>> + ? ? /* res_mutex protects res_list add and del ops */\n" + ">>> + ? ? mutex_init(&pwrdm->wakeuplat_mutex);\n" ">>> +\n" - ">>> \302\240 \302\240 \302\240 pr_debug(\"powerdomain: registered %s\\n\", pwrdm->name);\n" + ">>> ? ? ? pr_debug(\"powerdomain: registered %s\\n\", pwrdm->name);\n" ">>>\n" - ">>> \302\240 \302\240 \302\240 return 0;\n" + ">>> ? ? ? return 0;\n" ">>> @@ -176,6 +185,74 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused)\n" - ">>> \302\240 \302\240 \302\240 return 0;\n" - ">>> \302\240}\n" + ">>> ? ? ? return 0;\n" + ">>> ?}\n" ">>>\n" ">>> +/**\n" ">>> + * pwrdm_wakeuplat_update_pwrst - Update power domain power state if needed\n" @@ -244,30 +240,30 @@ ">>> + */\n" ">>> +static int pwrdm_wakeuplat_update_pwrst(struct powerdomain *pwrdm)\n" ">>> +{\n" - ">>> + \302\240 \302\240 struct plist_node *node;\n" - ">>> + \302\240 \302\240 int ret = 0, new_state;\n" - ">>> + \302\240 \302\240 long min_latency = -1;\n" + ">>> + ? ? struct plist_node *node;\n" + ">>> + ? ? int ret = 0, new_state;\n" + ">>> + ? ? long min_latency = -1;\n" ">>> +\n" - ">>> + \302\240 \302\240 /* Find the strongest constraint from the plist */\n" - ">>> + \302\240 \302\240 if (!plist_head_empty(&pwrdm->wakeuplat_dev_list)) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 node = plist_first(&pwrdm->wakeuplat_dev_list);\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 min_latency = node->prio;\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? /* Find the strongest constraint from the plist */\n" + ">>> + ? ? if (!plist_head_empty(&pwrdm->wakeuplat_dev_list)) {\n" + ">>> + ? ? ? ? ? ? node = plist_first(&pwrdm->wakeuplat_dev_list);\n" + ">>> + ? ? ? ? ? ? min_latency = node->prio;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 /* Find power state with wakeup latency < minimum constraint. */\n" - ">>> + \302\240 \302\240 for (new_state = 0x0; new_state < PWRDM_MAX_PWRSTS; new_state++) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (min_latency == -1 ||\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pwrdm->wakeup_lat[new_state] <= min_latency)\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? /* Find power state with wakeup latency < minimum constraint. */\n" + ">>> + ? ? for (new_state = 0x0; new_state < PWRDM_MAX_PWRSTS; new_state++) {\n" + ">>> + ? ? ? ? ? ? if (min_latency == -1 ||\n" + ">>> + ? ? ? ? ? ? ? ? pwrdm->wakeup_lat[new_state] <= min_latency)\n" + ">>> + ? ? ? ? ? ? ? ? ? ? break;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 switch (new_state) {\n" - ">>> + \302\240 \302\240 case PWRDM_FUNC_PWRST_OFF:\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 new_state = PWRDM_POWER_OFF;\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">>> + \302\240 \302\240 case PWRDM_FUNC_PWRST_OSWR:\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (cpu_is_omap34xx())\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_OFF);\n" + ">>> + ? ? switch (new_state) {\n" + ">>> + ? ? case PWRDM_FUNC_PWRST_OFF:\n" + ">>> + ? ? ? ? ? ? new_state = PWRDM_POWER_OFF;\n" + ">>> + ? ? ? ? ? ? break;\n" + ">>> + ? ? case PWRDM_FUNC_PWRST_OSWR:\n" + ">>> + ? ? ? ? ? ? if (cpu_is_omap34xx())\n" + ">>> + ? ? ? ? ? ? ? ? ? ? pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_OFF);\n" ">>\n" ">> cpu_is_* checks here aren't right.\n" ">>\n" @@ -286,34 +282,34 @@ "pointed out, the called functions already handle SoC specifics.\n" "\n" ">>\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 new_state = PWRDM_POWER_RET;\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">>> + \302\240 \302\240 case PWRDM_FUNC_PWRST_CSWR:\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (cpu_is_omap34xx())\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_RET);\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 new_state = PWRDM_POWER_RET;\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">>> + \302\240 \302\240 case PWRDM_FUNC_PWRST_ON:\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 new_state = PWRDM_POWER_ON;\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">>> + \302\240 \302\240 default:\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_warn(\"powerdomain: requested latency constraint not \"\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \"supported %s set to ON state\\n\", pwrdm->name);\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 new_state = PWRDM_POWER_ON;\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 break;\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? ? ? ? ? new_state = PWRDM_POWER_RET;\n" + ">>> + ? ? ? ? ? ? break;\n" + ">>> + ? ? case PWRDM_FUNC_PWRST_CSWR:\n" + ">>> + ? ? ? ? ? ? if (cpu_is_omap34xx())\n" + ">>> + ? ? ? ? ? ? ? ? ? ? pwrdm_set_logic_retst(pwrdm, PWRDM_POWER_RET);\n" + ">>> + ? ? ? ? ? ? new_state = PWRDM_POWER_RET;\n" + ">>> + ? ? ? ? ? ? break;\n" + ">>> + ? ? case PWRDM_FUNC_PWRST_ON:\n" + ">>> + ? ? ? ? ? ? new_state = PWRDM_POWER_ON;\n" + ">>> + ? ? ? ? ? ? break;\n" + ">>> + ? ? default:\n" + ">>> + ? ? ? ? ? ? pr_warn(\"powerdomain: requested latency constraint not \"\n" + ">>> + ? ? ? ? ? ? ? ? ? ? \"supported %s set to ON state\\n\", pwrdm->name);\n" + ">>> + ? ? ? ? ? ? new_state = PWRDM_POWER_ON;\n" + ">>> + ? ? ? ? ? ? break;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 if (pwrdm_read_pwrst(pwrdm) != new_state) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 if (cpu_is_omap34xx())\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = omap_set_pwrdm_state(pwrdm, new_state);\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? if (pwrdm_read_pwrst(pwrdm) != new_state) {\n" + ">>> + ? ? ? ? ? ? if (cpu_is_omap34xx())\n" + ">>> + ? ? ? ? ? ? ? ? ? ? ret = omap_set_pwrdm_state(pwrdm, new_state);\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 pr_debug(\"powerdomain: %s pwrst: curr=%d, prev=%d next=%d \"\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240\"min_latency=%ld, set_state=%d\\n\", pwrdm->name,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240pwrdm_read_pwrst(pwrdm), pwrdm_read_prev_pwrst(pwrdm),\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240pwrdm_read_next_pwrst(pwrdm), min_latency, new_state);\n" + ">>> + ? ? pr_debug(\"powerdomain: %s pwrst: curr=%d, prev=%d next=%d \"\n" + ">>> + ? ? ? ? ? ? ?\"min_latency=%ld, set_state=%d\\n\", pwrdm->name,\n" + ">>> + ? ? ? ? ? ? ?pwrdm_read_pwrst(pwrdm), pwrdm_read_prev_pwrst(pwrdm),\n" + ">>> + ? ? ? ? ? ? ?pwrdm_read_next_pwrst(pwrdm), min_latency, new_state);\n" ">>> +\n" - ">>> + \302\240 \302\240 return ret;\n" + ">>> + ? ? return ret;\n" ">>> +}\n" ">>> +\n" ">>\n" @@ -324,133 +320,133 @@ ">>> --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c\n" ">>> +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c\n" ">>> @@ -52,6 +52,12 @@ static struct powerdomain iva2_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [2] = PWRSTS_OFF_ON,\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [3] = PWRDM_POWER_ON,\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 1100,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 350,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? ? ? ? ? [2] = PWRSTS_OFF_ON,\n" + ">>> ? ? ? ? ? ? ? [3] = PWRDM_POWER_ON,\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 1100,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 350,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain mpu_3xxx_pwrdm = {\n" + ">>> ?static struct powerdomain mpu_3xxx_pwrdm = {\n" ">>> @@ -68,6 +74,12 @@ static struct powerdomain mpu_3xxx_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_mem_on \302\240 \302\240= {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRSTS_OFF_ON,\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 95,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 45,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .pwrsts_mem_on ? ?= {\n" + ">>> ? ? ? ? ? ? ? [0] = PWRSTS_OFF_ON,\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 95,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 45,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240/*\n" + ">>> ?/*\n" ">>> @@ -98,6 +110,12 @@ static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 100,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 60,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? ? ? ? ? [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */\n" + ">>> ? ? ? ? ? ? ? [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 100,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 60,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain core_3xxx_es3_1_pwrdm = {\n" + ">>> ?static struct powerdomain core_3xxx_es3_1_pwrdm = {\n" ">>> @@ -121,6 +139,12 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 100,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 60,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? ? ? ? ? [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */\n" + ">>> ? ? ? ? ? ? ? [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 100,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 60,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain dss_pwrdm = {\n" + ">>> ?static struct powerdomain dss_pwrdm = {\n" ">>> @@ -136,6 +160,12 @@ static struct powerdomain dss_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_mem_on \302\240 \302\240= {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRDM_POWER_ON, \302\240/* MEMONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 70,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 20,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .pwrsts_mem_on ? ?= {\n" + ">>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 70,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 20,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240/*\n" + ">>> ?/*\n" ">>> @@ -157,6 +187,12 @@ static struct powerdomain sgx_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_mem_on \302\240 \302\240= {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRDM_POWER_ON, \302\240/* MEMONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 1000,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .pwrsts_mem_on ? ?= {\n" + ">>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 1000,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain cam_pwrdm = {\n" + ">>> ?static struct powerdomain cam_pwrdm = {\n" ">>> @@ -172,6 +208,12 @@ static struct powerdomain cam_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_mem_on \302\240 \302\240= {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRDM_POWER_ON, \302\240/* MEMONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 850,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 35,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .pwrsts_mem_on ? ?= {\n" + ">>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 850,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 35,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain per_pwrdm = {\n" + ">>> ?static struct powerdomain per_pwrdm = {\n" ">>> @@ -187,6 +229,12 @@ static struct powerdomain per_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_mem_on \302\240 \302\240= {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRDM_POWER_ON, \302\240/* MEMONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 200,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 110,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .pwrsts_mem_on ? ?= {\n" + ">>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 200,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 110,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain emu_pwrdm = {\n" + ">>> ?static struct powerdomain emu_pwrdm = {\n" ">>> @@ -201,6 +249,12 @@ static struct powerdomain neon_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .omap_chip \302\240 \302\240 \302\240 \302\240= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),\n" - ">>> \302\240 \302\240 \302\240 .pwrsts \302\240 \302\240 \302\240 \302\240 \302\240 = PWRSTS_OFF_RET_ON,\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_logic_ret = PWRDM_POWER_RET,\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 200,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 35,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .omap_chip ? ? ? ?= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),\n" + ">>> ? ? ? .pwrsts ? ? ? ? ? = PWRSTS_OFF_RET_ON,\n" + ">>> ? ? ? .pwrsts_logic_ret = PWRDM_POWER_RET,\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 200,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 35,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>>\n" - ">>> \302\240static struct powerdomain usbhost_pwrdm = {\n" + ">>> ?static struct powerdomain usbhost_pwrdm = {\n" ">>> @@ -223,6 +277,12 @@ static struct powerdomain usbhost_pwrdm = {\n" - ">>> \302\240 \302\240 \302\240 .pwrsts_mem_on \302\240 \302\240= {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [0] = PWRDM_POWER_ON, \302\240/* MEMONSTATE */\n" - ">>> \302\240 \302\240 \302\240 },\n" - ">>> + \302\240 \302\240 .wakeup_lat = {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OFF] = 800,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_CSWR] = 150,\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 [PWRDM_FUNC_PWRST_ON] = 0,\n" - ">>> + \302\240 \302\240 },\n" - ">>> \302\240};\n" + ">>> ? ? ? .pwrsts_mem_on ? ?= {\n" + ">>> ? ? ? ? ? ? ? [0] = PWRDM_POWER_ON, ?/* MEMONSTATE */\n" + ">>> ? ? ? },\n" + ">>> + ? ? .wakeup_lat = {\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OFF] = 800,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_OSWR] = UNSUP_STATE,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_CSWR] = 150,\n" + ">>> + ? ? ? ? ? ? [PWRDM_FUNC_PWRST_ON] = 0,\n" + ">>> + ? ? },\n" + ">>> ?};\n" ">>\n" ">> A summary about where the latency numbers for each powerdomain come from\n" ">> would be useful.\n" @@ -460,48 +456,48 @@ ">> [...]\n" ">>\n" ">>> @@ -87,64 +60,86 @@ int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r)\n" - ">>> \302\240 \302\240 \302\240 return 0;\n" - ">>> \302\240}\n" + ">>> ? ? ? return 0;\n" + ">>> ?}\n" ">>>\n" ">>> +/*\n" ">>> + * omap_pm_set_max_dev_wakeup_lat - set/release devices wake-up latency\n" ">>> + * constraints\n" ">>> + */\n" - ">>> \302\240int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev,\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240long t)\n" - ">>> \302\240{\n" - ">>> + \302\240 \302\240 struct platform_device *pdev, *req_pdev;\n" - ">>> + \302\240 \302\240 int ret = 0;\n" + ">>> ?int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev,\n" + ">>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?long t)\n" + ">>> ?{\n" + ">>> + ? ? struct platform_device *pdev, *req_pdev;\n" + ">>> + ? ? int ret = 0;\n" ">>> +\n" - ">>> \302\240 \302\240 \302\240 if (!req_dev || !dev || t < -1) {\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 WARN(1, \"OMAP PM: %s: invalid parameter(s)\", __func__);\n" - ">>> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -EINVAL;\n" - ">>> + \302\240 \302\240 }\n" + ">>> ? ? ? if (!req_dev || !dev || t < -1) {\n" + ">>> ? ? ? ? ? ? ? WARN(1, \"OMAP PM: %s: invalid parameter(s)\", __func__);\n" + ">>> ? ? ? ? ? ? ? return -EINVAL;\n" + ">>> + ? ? }\n" ">>> +\n" - ">>> + \302\240 \302\240 /* Look for the platform devices */\n" - ">>> + \302\240 \302\240 pdev = to_platform_device(dev);\n" - ">>> + \302\240 \302\240 req_pdev = to_platform_device(req_dev);\n" + ">>> + ? ? /* Look for the platform devices */\n" + ">>> + ? ? pdev = to_platform_device(dev);\n" + ">>> + ? ? req_pdev = to_platform_device(req_dev);\n" ">>> +\n" - ">>> + \302\240 \302\240 /* Try to catch non platform devices. */\n" - ">>> + \302\240 \302\240 if ((pdev->name == NULL) || (req_pdev->name == NULL)) {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 pr_err(\"OMAP-PM set_wakeup_lat: Error: platform devices \"\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240\"not valid\\n\");\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return -EINVAL;\n" - ">>> + \302\240 \302\240 } else {\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 /* Call the omap_device API */\n" - ">>> + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t);\n" - ">>> + \302\240 \302\240 }\n" + ">>> + ? ? /* Try to catch non platform devices. */\n" + ">>> + ? ? if ((pdev->name == NULL) || (req_pdev->name == NULL)) {\n" + ">>> + ? ? ? ? ? ? pr_err(\"OMAP-PM set_wakeup_lat: Error: platform devices \"\n" + ">>> + ? ? ? ? ? ? ? ? ? ?\"not valid\\n\");\n" + ">>> + ? ? ? ? ? ? return -EINVAL;\n" + ">>> + ? ? } else {\n" + ">>> + ? ? ? ? ? ? /* Call the omap_device API */\n" + ">>> + ? ? ? ? ? ? ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t);\n" + ">>> + ? ? }\n" ">>\n" - ">> I don't think a NULL name check is the right sanity check here. \302\240WHat\n" + ">> I don't think a NULL name check is the right sanity check here. ?WHat\n" ">> you really need to know is whether the target device is an omap_device.\n" ">> The requesting device can be anything (I think.)\n" ">>\n" ">> Here's a simpler check:\n" ">>\n" - ">> \302\240 \302\240 \302\240 \302\240if (pdev->dev->parent == &omap_device_parent)\n" - ">> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t);\n" - ">> \302\240 \302\240 \302\240 \302\240else\n" - ">> \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240...\n" + ">> ? ? ? ?if (pdev->dev->parent == &omap_device_parent)\n" + ">> ? ? ? ? ? ? ? ?ret = omap_device_set_max_dev_wakeup_lat(req_pdev, pdev, t);\n" + ">> ? ? ? ?else\n" + ">> ? ? ? ? ? ? ? ?...\n" "> Ok I will use this test. Note: the dev parameter is already checked\n" "> for NULL above.\n" ">\n" @@ -515,10 +511,6 @@ "I agree that the only the target device needs to be an omap_device, the\n" "requester can be any device.\n" "\n" - "Kevin\n" - "--\n" - "To unsubscribe from this list: send the line \"unsubscribe linux-omap\" in\n" - "the body of a message to majordomo@vger.kernel.org\n" - More majordomo info at http://vger.kernel.org/majordomo-info.html + Kevin -5860dc4afb160e67ba30ce135132020fc4f02393e6091ab2f4c2cb07d982b3f6 +eea02f12e51ddae20adca479ad205c5cdb9b2f17bf1c85d7108a9614817f4099
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.