From mboxrd@z Thu Jan 1 00:00:00 1970 From: jean.pihet@newoldbits.com Subject: [PATCH 3/6] OMAP: PM: register to the per-device PM QoS framework Date: Wed, 19 Oct 2011 15:51:00 +0200 Message-ID: <1319032263-22699-4-git-send-email-j-pihet@ti.com> References: <1319032263-22699-1-git-send-email-j-pihet@ti.com> Return-path: Received: from mail-ww0-f44.google.com ([74.125.82.44]:56814 "EHLO mail-ww0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753101Ab1JSNv3 (ORCPT ); Wed, 19 Oct 2011 09:51:29 -0400 Received: by mail-ww0-f44.google.com with SMTP id 6so2560056wwe.1 for ; Wed, 19 Oct 2011 06:51:28 -0700 (PDT) In-Reply-To: <1319032263-22699-1-git-send-email-j-pihet@ti.com> Sender: linux-omap-owner@vger.kernel.org List-Id: linux-omap@vger.kernel.org To: Kevin Hilman , Linux PM mailing list , linux-omap@vger.kernel.org, "Rafael J. Wysocki" , Paul Walmsley Cc: Jean Pihet From: Jean Pihet 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 --- arch/arm/mach-omap2/pm.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 63 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 3feb359..58b4b76 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c @@ -11,13 +11,16 @@ #include #include +#include #include #include #include +#include #include #include #include +#include #include "voltage.h" #include "powerdomain.h" @@ -242,11 +245,71 @@ static void __init omap4_init_voltages(void) omap2_set_init_voltage("iva", "dpll_iva_m5x2_ck", iva_dev); } +/* Interface to the per-device PM QoS framework */ +static int omap2_dev_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; + + pr_debug("OMAP PM CONSTRAINTS: req@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) { + pr_err("%s: Error: platform device for device %s not valid\n", + __func__, dev_name(dev_pm_qos_req->dev)); + return -EINVAL; + } + + /* Find the associated omap_device for dev */ + od = container_of(pdev, struct omap_device, pdev); + if (od->hwmods_cnt != 1) { + pr_err("%s: Error: No unique hwmod for device %s\n", + __func__, dev_name(dev_pm_qos_req->dev)); + return -EINVAL; + } + + /* Find the primary omap_hwmod for dev */ + oh = od->hwmods[0]; + + pr_debug("OMAP PM CONSTRAINTS: req@0x%p, dev=0x%p, new_value=%lu\n", + req, dev_pm_qos_req->dev, new_value); + + /* Apply the constraint */ + return omap_hwmod_set_wkup_lat_constraint(oh, dev_pm_qos_req, + new_value); +} + +static struct notifier_block omap2_dev_pm_qos_notifier = { + .notifier_call = omap2_dev_pm_qos_handler, +}; + +static int __init omap2_dev_pm_qos_init(void) +{ + int ret; + + ret = dev_pm_qos_add_global_notifier(&omap2_dev_pm_qos_notifier); + if (ret) + WARN(1, KERN_ERR "Cannot add global notifier for dev PM QoS\n"); + + return ret; +} + static int __init omap2_common_pm_init(void) { omap2_init_processor_devices(); omap_pm_if_init(); + /* Register to the per-device PM QoS framework */ + omap2_dev_pm_qos_init(); + return 0; } postcore_initcall(omap2_common_pm_init); -- 1.7.4.1