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: 1501121 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 5A9553FE80 for ; Mon, 24 Sep 2012 22:44:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751754Ab2IXWoF (ORCPT ); Mon, 24 Sep 2012 18:44:05 -0400 Received: from mail-we0-f174.google.com ([74.125.82.174]:41212 "EHLO mail-we0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751710Ab2IXWoE (ORCPT ); Mon, 24 Sep 2012 18:44:04 -0400 Received: by mail-we0-f174.google.com with SMTP id t9so527447wey.19 for ; Mon, 24 Sep 2012 15:44:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=p3k37UUvXkB6ei8p7ZdddascmOf6eE1tbRT/Iz7ugzU=; b=pDgLI3f0rCO4F8CExzICsDyGZ/nocSBKW8TNhCRbL3y8aEjyedTUV9BsFnk4RvqfC7 DpDGg6sBCjigzQeQJiTV5Cl4SGqvEjxRoQgXQt5ullMmFbw5Zy3g7cTrVak8PgAv+UKJ K5D7G31QSwgpbChoNZcUAU5W6lMKX2U/oS2J6WiqKB5c7e+RVpemnWiDTfxeeethXjbK sv3Nnoqlz1W1oiJIxU+pJnrJd8CUBHr/na5xmEeopZ5CB6SDLGpZ2gm428JPtagb7eAX IL/+EaA1YILB+4J4Igyo7LmbV9/aQIamj0LDCSJLpiMJ+Rve2/CbwVoiMlJN3/2GFGAh f3nw== 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: ALoCoQncE9sVSu4p5YkeujafKbZ6cbIOj0xOXKFg9od27vllmWCs5G2HEvvA4mSBScJ9pWCJtMLK Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org 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);