From: rnayak@ti.com (Rajendra Nayak)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 04/10] ARM: OMAP: omap_device: register to the per-device PM QoS framework
Date: Wed, 20 Jun 2012 16:11:24 +0530 [thread overview]
Message-ID: <4FE1A8D4.1060003@ti.com> (raw)
In-Reply-To: <1339686361-11526-5-git-send-email-j-pihet@ti.com>
On Thursday 14 June 2012 08:35 PM, Jean Pihet wrote:
> Implement the devices wake-up latency constraints using the global
> device PM QoS notification handler which applies the constraints to the
> underlying layer by calling the corresponding function at hwmod level.
>
> Tested on OMAP3 Beagleboard and OMAP4 Pandaboard in RET/OFF using wake-up
> latency constraints on MPU, CORE and PER.
>
> Signed-off-by: Jean Pihet<j-pihet@ti.com>
> Reviewed-by: Kevin Hilman<khilman@ti.com>
> [paul at pwsan.com: modified to work with omap_devices with large numbers of
> hwmods; moved code to mach-omap2/omap_device.c; added documentation; use
> notifier return codes]
> Signed-off-by: Paul Walmsley<paul@pwsan.com>
> ---
> arch/arm/plat-omap/omap_device.c | 81 +++++++++++++++++++++++++++++++++++++-
> 1 files changed, 80 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c
> index c490240..241705b 100644
> --- a/arch/arm/plat-omap/omap_device.c
> +++ b/arch/arm/plat-omap/omap_device.c
> @@ -3,6 +3,7 @@
> * omap_device implementation
> *
> * Copyright (C) 2009-2010 Nokia Corporation
> + * Copyright (C) 2011 Texas Instruments, Inc.
2012?
> * Paul Walmsley, Kevin Hilman
> *
> * Developed in collaboration with (alphabetical order): Benoit
> @@ -89,6 +90,7 @@
> #include<linux/pm_runtime.h>
> #include<linux/of.h>
> #include<linux/notifier.h>
> +#include<linux/pm_qos.h>
>
> #include<plat/omap_device.h>
> #include<plat/omap_hwmod.h>
> @@ -401,6 +403,72 @@ static int _omap_device_notifier_call(struct notifier_block *nb,
> return NOTIFY_DONE;
> }
>
> +/**
> + * _omap_device_pm_qos_handler - interface to the per-device PM QoS framework
> + * @nb: pointer to omap_device_pm_qos_nb (not used)
> + * @new_value: new maximum wakeup latency constraint for @req->dev (in us)
> + * @req: struct dev_pm_qos_request * passed by the Linux PM QoS code
> + *
> + * Called by the Linux core device PM QoS code to alter the maximum
> + * wakeup latency constraint on a device. If the underlying device is
> + * an omap_device, then this code will pass the constraint on to the
> + * underlying hwmods. Returns -EINVAL if this code can't handle the
> + * constraint for some reason, or passes along the return code from the
> + * hwmod wakeup latency constraint functions.
> + */
> +static int _omap_device_pm_qos_handler(struct notifier_block *nb,
> + unsigned long new_value,
> + void *req)
> +{
> + struct omap_device *od;
> + struct omap_hwmod *oh;
> + struct platform_device *pdev;
> + struct dev_pm_qos_request *dev_pm_qos_req = req;
> + int ret = NOTIFY_OK;
> + int r, i;
> +
> + pr_debug("OMAP PM constraints: req at 0x%p, new_value=%lu\n",
> + req, new_value);
> +
> + /* Look for the platform device for the constraint target device */
> + pdev = to_platform_device(dev_pm_qos_req->dev);
> +
> + /* Try to catch non platform devices */
> + if (pdev->name == NULL) {
Is this a safe way to catch non platform devices?
regards,
Rajendra
> + pr_err("%s: Error: platform device for device %s not valid\n",
> + __func__, dev_name(dev_pm_qos_req->dev));
> + return NOTIFY_DONE;
> + }
> +
> + /* Find the associated omap_device for dev */
> + od = to_omap_device(pdev);
> + if (od == NULL) {
> + pr_err("%s: Error: no omap_device for device %s\n",
> + __func__, dev_name(dev_pm_qos_req->dev));
> + return NOTIFY_DONE;
> + }
> +
> + pr_debug("OMAP PM constraints: req at 0x%p, dev=0x%p, new_value=%lu\n",
> + req, dev_pm_qos_req->dev, new_value);
> +
> + for (i = 0; i< od->hwmods_cnt; i++) {
> + oh = od->hwmods[i];
> + if (new_value == PM_QOS_DEV_LAT_DEFAULT_VALUE)
> + r = omap_hwmod_remove_wakeuplat_constraint(
> + oh,
> + dev_pm_qos_req);
> + else
> + r = omap_hwmod_set_wakeuplat_constraint(
> + oh,
> + dev_pm_qos_req,
> + new_value);
> +
> + if (!r)
> + ret = NOTIFY_BAD;
> + }
> +
> + return ret;
> +}
>
> /* Public functions for use by core code */
>
> @@ -1115,13 +1183,24 @@ int omap_device_enable_clocks(struct omap_device *od)
> return 0;
> }
>
> +static struct notifier_block omap_device_pm_qos_nb = {
> + .notifier_call = _omap_device_pm_qos_handler,
> +};
> +
> static struct notifier_block platform_nb = {
> .notifier_call = _omap_device_notifier_call,
> };
>
> static int __init omap_device_init(void)
> {
> + int ret;
> +
> bus_register_notifier(&platform_bus_type,&platform_nb);
> - return 0;
> +
> + ret = dev_pm_qos_add_global_notifier(&omap_device_pm_qos_nb);
> + if (ret)
> + pr_err("omap_device: cannot add global notifier for dev PM QoS\n");
> +
> + return ret;
> }
> core_initcall(omap_device_init);
next prev parent reply other threads:[~2012-06-20 10:41 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-14 15:05 [PATCH v8 00/10] PM QoS: implement the OMAP low level constraints management code Jean Pihet
2012-06-14 15:05 ` [PATCH 01/10] ARM: OMAP2+: PM QoS: control the power domains next state from the constraints Jean Pihet
2012-06-15 11:37 ` Jean Pihet
2012-07-19 9:12 ` Menon, Nishanth
2012-07-20 3:08 ` Menon, Nishanth
2012-06-14 15:05 ` [PATCH 02/10] ARM: OMAP2+: hwmod: manage the wake-up latency constraints Jean Pihet
2012-06-14 15:05 ` [PATCH 03/10] ARM: OMAP2+: PM QoS: manage the per-device latency constraints in hwmod Jean Pihet
2012-06-20 10:29 ` Rajendra Nayak
2012-06-20 11:38 ` Jean Pihet
2012-06-14 15:05 ` [PATCH 04/10] ARM: OMAP: omap_device: register to the per-device PM QoS framework Jean Pihet
2012-06-20 10:41 ` Rajendra Nayak [this message]
2012-07-19 9:21 ` Menon, Nishanth
2012-06-14 15:05 ` [PATCH 05/10] ARM: OMAP3: cpuidle: next C-state decision depends on the PM QoS MPU and CORE constraints Jean Pihet
2012-06-14 15:05 ` [PATCH 06/10] ARM: OMAP3: PM: cpuidle: default to C1 in next_valid_state Jean Pihet
2012-06-14 15:05 ` [PATCH 07/10] ARM: OMAP3: update cpuidle latency and threshold figures Jean Pihet
2012-06-20 11:01 ` Rajendra Nayak
2012-06-20 11:39 ` Jean Pihet
2012-06-14 15:05 ` [PATCH 08/10] ARM: OMAP3: powerdomain data: add wake-up latency figures Jean Pihet
2012-06-14 15:06 ` [PATCH 09/10] ARM: OMAP: convert I2C driver to PM QoS for latency constraints Jean Pihet
2012-06-14 15:06 ` [PATCH 10/10] ARM: OMAP: PM: remove the latency related functions from the API Jean Pihet
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FE1A8D4.1060003@ti.com \
--to=rnayak@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).