From patchwork Fri Oct 19 10:10:48 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 12366 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id ED11523F58 for ; Fri, 19 Oct 2012 10:11:03 +0000 (UTC) Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by fiordland.canonical.com (Postfix) with ESMTP id 7C8FDA1979E for ; Fri, 19 Oct 2012 10:11:03 +0000 (UTC) Received: by mail-ie0-f180.google.com with SMTP id e10so335119iej.11 for ; Fri, 19 Oct 2012 03:11:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=Mdqr9u7ROXqHtEsSpBiBJupqvwxORAugNwzO2NiVKfc=; b=P2FeNekXYpXXL37BUFOxp8BL00VttX75j7ziEGQIZuipfTGN1MyJ8pZead9/IfzarC NMTdWlzGI8j3x1xaabSfieRV21/Kh984yp3MA802fsxoQt/7d4DQ3HYyBu7Qgb88zyYF PDR+uIY7QThekEim5yyfdL+g8gJEoXJVKsG1PK5+k4zd5zXDfog/WDhIA2Vj4u+Btbkp Pqg45n8xYPBFF8dAcDHYrfr9z0fkoM6+2Z4SU0kh19wACCViybigtUvQi6XiWLymz4wd InMp+k5+xfnQqS6s+45RU5Gc2qYreq9guPTl7Tib8XrdEWcvw2GHCeU1A7DOIbanr7yW XW7g== Received: by 10.50.168.37 with SMTP id zt5mr601083igb.57.1350641463220; Fri, 19 Oct 2012 03:11:03 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.50.67.148 with SMTP id n20csp56192igt; Fri, 19 Oct 2012 03:11:02 -0700 (PDT) Received: by 10.216.194.97 with SMTP id l75mr487316wen.67.1350641461758; Fri, 19 Oct 2012 03:11:01 -0700 (PDT) Received: from mail-wg0-f50.google.com (mail-wg0-f50.google.com [74.125.82.50]) by mx.google.com with ESMTPS id o11si1292045wee.113.2012.10.19.03.11.01 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 19 Oct 2012 03:11:01 -0700 (PDT) Received-SPF: neutral (google.com: 74.125.82.50 is neither permitted nor denied by best guess record for domain of daniel.lezcano@linaro.org) client-ip=74.125.82.50; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.50 is neither permitted nor denied by best guess record for domain of daniel.lezcano@linaro.org) smtp.mail=daniel.lezcano@linaro.org Received: by mail-wg0-f50.google.com with SMTP id 16so236852wgi.31 for ; Fri, 19 Oct 2012 03:11:01 -0700 (PDT) Received: by 10.216.52.13 with SMTP id d13mr547552wec.36.1350641461196; Fri, 19 Oct 2012 03:11:01 -0700 (PDT) Received: from localhost.localdomain (AToulouse-654-1-1-158.w90-5.abo.wanadoo.fr. [90.5.56.158]) by mx.google.com with ESMTPS id v3sm2565519wiy.5.2012.10.19.03.10.57 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 19 Oct 2012 03:10:59 -0700 (PDT) From: Daniel Lezcano To: rjw@sisk.pl Cc: linux-pm@vger.kernel.org, lorenzo.pieralisi@arm.com, pdeschrijver@nvidia.com, patches@linaro.org, linaro-dev@lists.linaro.org Subject: [PATCH 3/4][V2] cpuidle: prepare the driver core to be multi drivers aware Date: Fri, 19 Oct 2012 12:10:48 +0200 Message-Id: <1350641449-22863-4-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1350641449-22863-1-git-send-email-daniel.lezcano@linaro.org> References: <1350641449-22863-1-git-send-email-daniel.lezcano@linaro.org> X-Gm-Message-State: ALoCoQl7bAEkBHX1qbqJKf9jGNUWAqIMHchTAbg+mG98E9phB6BVXIxSYyD/HNLttHF2Bvh0C5yq This patch is a preparation for the multiple drivers support. As the next patch will introduce the multiple drivers with the Kconfig option and we want to keep the code clean and understandable, this patch defines a set of functions for encapsulating some common parts and split what should be done in a lock context or not. Signed-off-by: Daniel Lezcano Acked-by: Peter De Schrijver --- drivers/cpuidle/driver.c | 60 ++++++++++++++++++++++++++++++++------------- 1 files changed, 42 insertions(+), 18 deletions(-) diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 3e59075..8246662 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c @@ -39,11 +39,20 @@ static void set_power_states(struct cpuidle_driver *drv) drv->states[i].power_usage = -1 - i; } -/** - * cpuidle_register_driver - registers a driver - * @drv: the driver - */ -int cpuidle_register_driver(struct cpuidle_driver *drv) +static void __cpuidle_driver_init(struct cpuidle_driver *drv) +{ + drv->refcnt = 0; + + if (!drv->power_specified) + set_power_states(drv); +} + +static void cpuidle_set_driver(struct cpuidle_driver *drv) +{ + cpuidle_curr_driver = drv; +} + +static int __cpuidle_register_driver(struct cpuidle_driver *drv) { if (!drv || !drv->state_count) return -EINVAL; @@ -51,22 +60,38 @@ int cpuidle_register_driver(struct cpuidle_driver *drv) if (cpuidle_disabled()) return -ENODEV; - spin_lock(&cpuidle_driver_lock); - if (cpuidle_curr_driver) { - spin_unlock(&cpuidle_driver_lock); + if (cpuidle_get_driver()) return -EBUSY; - } - if (!drv->power_specified) - set_power_states(drv); + __cpuidle_driver_init(drv); - drv->refcnt = 0; + cpuidle_set_driver(drv); - cpuidle_curr_driver = drv; + return 0; +} + +static void __cpuidle_unregister_driver(struct cpuidle_driver *drv) +{ + if (drv != cpuidle_get_driver()) + return; + + if (!WARN_ON(drv->refcnt > 0)) + cpuidle_set_driver(NULL); +} +/** + * cpuidle_register_driver - registers a driver + * @drv: the driver + */ +int cpuidle_register_driver(struct cpuidle_driver *drv) +{ + int ret; + + spin_lock(&cpuidle_driver_lock); + ret = __cpuidle_register_driver(drv); spin_unlock(&cpuidle_driver_lock); - return 0; + return ret; } EXPORT_SYMBOL_GPL(cpuidle_register_driver); @@ -86,8 +111,7 @@ EXPORT_SYMBOL_GPL(cpuidle_get_driver); void cpuidle_unregister_driver(struct cpuidle_driver *drv) { spin_lock(&cpuidle_driver_lock); - if (drv == cpuidle_curr_driver && !WARN_ON(drv->refcnt > 0)) - cpuidle_curr_driver = NULL; + __cpuidle_unregister_driver(drv); spin_unlock(&cpuidle_driver_lock); } EXPORT_SYMBOL_GPL(cpuidle_unregister_driver); @@ -98,7 +122,7 @@ struct cpuidle_driver *cpuidle_driver_ref(void) spin_lock(&cpuidle_driver_lock); - drv = cpuidle_curr_driver; + drv = cpuidle_get_driver(); drv->refcnt++; spin_unlock(&cpuidle_driver_lock); @@ -107,7 +131,7 @@ struct cpuidle_driver *cpuidle_driver_ref(void) void cpuidle_driver_unref(void) { - struct cpuidle_driver *drv = cpuidle_curr_driver; + struct cpuidle_driver *drv = cpuidle_get_driver(); spin_lock(&cpuidle_driver_lock);