From patchwork Mon Sep 24 22:43:53 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 11697 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 74A5623E54 for ; Mon, 24 Sep 2012 22:44:06 +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 0A6B9A1812A for ; Mon, 24 Sep 2012 22:44:05 +0000 (UTC) Received: by mail-ie0-f180.google.com with SMTP id e10so11389513iej.11 for ; Mon, 24 Sep 2012 15:44:05 -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=p3k37UUvXkB6ei8p7ZdddascmOf6eE1tbRT/Iz7ugzU=; b=ckF3uhF/wZ+dfXJNd+2l/DDMhJ2A7kjgUFCFl/bbpKfI2hF2bYUDVu3oWZ7QK00D8A ZI0C5YgXwKiqHtNUKGqxBeC+HVnwbcswZFDB74OlxDwDvnv8rL3qLr2AzQwVNNcNeor7 af1vZO8RcmyWUdDRyeolAlJG69uyykNAudumoaOZytJTNlUE72Pi68Ztgc4ZtT7KqHVx 0ACwQKpPi8nUlnNVl57+ZsTZtvDAXck5am3evl3MSMI4opxPm4oR2ZJj+IZLhSvjcHd6 cuZ6JPKnQCyBA4k/Ie+lYOVo9nxxYDZ6/IoFG7iyTFH2yuV1WvwhS+/tavqtEZHsYZqS EoOg== Received: by 10.50.217.229 with SMTP id pb5mr6620007igc.28.1348526645781; Mon, 24 Sep 2012 15:44:05 -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.184.232 with SMTP id ex8csp265889igc; Mon, 24 Sep 2012 15:44:04 -0700 (PDT) Received: by 10.216.211.158 with SMTP id w30mr7685735weo.55.1348526644041; Mon, 24 Sep 2012 15:44:04 -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 r1si21106082wif.4.2012.09.24.15.44.03 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 15:44:04 -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 16so4956058wgi.31 for ; Mon, 24 Sep 2012 15:44:03 -0700 (PDT) Received: by 10.180.98.200 with SMTP id ek8mr17256012wib.0.1348526643462; Mon, 24 Sep 2012 15:44:03 -0700 (PDT) Received: from localhost.localdomain (AToulouse-651-1-259-252.w109-214.abo.wanadoo.fr. [109.214.174.252]) by mx.google.com with ESMTPS id k2sm19286398wiz.7.2012.09.24.15.44.00 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 15:44:02 -0700 (PDT) From: Daniel Lezcano To: rjw@sisk.pl, lenb@kernel.org Cc: linux-pm@vger.kernel.org, lorenzo.pieralisi@arm.com, pdeschrijver@nvidia.com, linux-acpi@vger.kernel.org, patches@linaro.org, linaro-dev@lists.linaro.org Subject: [PATCH 3/4] cpuidle - prepare the driver core to be multi drivers aware Date: Tue, 25 Sep 2012 00:43:53 +0200 Message-Id: <1348526634-19029-4-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1348526634-19029-1-git-send-email-daniel.lezcano@linaro.org> References: <1348526634-19029-1-git-send-email-daniel.lezcano@linaro.org> X-Gm-Message-State: ALoCoQlwTouoKlf892lcyU9rETwzfDZ/lLozmCSJQ6QOyoFny2M354zkg06Tv9zMacbUGZA8MsHB 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 --- drivers/cpuidle/driver.c | 71 +++++++++++++++++++++++++++++----------------- 1 files changed, 45 insertions(+), 26 deletions(-) diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 4a0c4ab..391f80f 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,41 @@ 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()) { + WARN(1, "invalid cpuidle_unregister_driver(%s)\n", + drv->name); + 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,16 +114,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(1, "invalid cpuidle_unregister_driver(%s)\n", - drv->name); - goto out; - } - - if (!WARN_ON(drv->refcnt > 0)) - cpuidle_curr_driver = NULL; -out: + __cpuidle_unregister_driver(drv); spin_unlock(&cpuidle_driver_lock); } EXPORT_SYMBOL_GPL(cpuidle_unregister_driver); @@ -106,7 +125,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); @@ -115,7 +134,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);