From patchwork Fri Mar 13 15:43:42 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 45790 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f69.google.com (mail-wg0-f69.google.com [74.125.82.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 86BB2214BF for ; Fri, 13 Mar 2015 15:44:10 +0000 (UTC) Received: by wggy19 with SMTP id y19sf17083289wgg.2 for ; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :list-post:list-help:list-archive:list-unsubscribe; bh=9ZWoNycf4soLCfe1VJUKc9nXQoAgLaN4gtmBLF21zU8=; b=B2F3qIdr2i8hK7AJjn7nAyYnvufYEht4N13MRr7kdMBiuFXCEhwYfGBl9xGGV8hql6 tEd4+oPSrm53rVQDJbl2mxY9MzA9Tfcc5aSUIMGlRZd1BcS1v3DJBQKM96ZE09EYO3M2 rvnoC1knumJLokequ6Vw1T8acgJAB5eLW4h//C5AxangI03+rSNAW75d047904UV9IIa Cw+CJuudvk/itA5qaR84zw4n0fjifuS1ARpJ6OABkkyUW9YV5t5WphxH0ZbpfLjSaJGu KLh9GIBE4gQrezOULr9vDm6u5tgiOKC0of0Up1tDZu2dXR98cAjEVzY3L6hnokFa4L94 r5EA== X-Gm-Message-State: ALoCoQkFZEYXrAPxiWrYCr5ASgr0icq3/YNnYipz6x+sGQWNqPnQJ6aNQMx1K0G3409yQkQYk7Cd X-Received: by 10.180.101.101 with SMTP id ff5mr10551434wib.5.1426261449779; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.7.42 with SMTP id g10ls437643laa.51.gmail; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) X-Received: by 10.112.137.164 with SMTP id qj4mr32022638lbb.17.1426261449620; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) Received: from mail-lb0-f171.google.com (mail-lb0-f171.google.com. [209.85.217.171]) by mx.google.com with ESMTPS id cj10si1635501lad.105.2015.03.13.08.44.09 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Mar 2015 08:44:09 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.171 as permitted sender) client-ip=209.85.217.171; Received: by lbjf15 with SMTP id f15so23623814lbj.2 for ; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) X-Received: by 10.112.162.167 with SMTP id yb7mr42856134lbb.76.1426261449513; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.112.35.133 with SMTP id h5csp999958lbj; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) X-Received: by 10.112.146.70 with SMTP id ta6mr20992666lbb.59.1426261449087; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) Received: from mail-la0-f51.google.com (mail-la0-f51.google.com. [209.85.215.51]) by mx.google.com with ESMTPS id x9si1628373lae.164.2015.03.13.08.44.09 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Mar 2015 08:44:09 -0700 (PDT) Received-SPF: pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.215.51 as permitted sender) client-ip=209.85.215.51; Received: by labmn12 with SMTP id mn12so23481393lab.8 for ; Fri, 13 Mar 2015 08:44:09 -0700 (PDT) X-Received: by 10.112.185.101 with SMTP id fb5mr44730763lbc.12.1426261448964; Fri, 13 Mar 2015 08:44:08 -0700 (PDT) Received: from uffe-Latitude-E6430s.lan (90-231-160-185-no158.tbcn.telia.com. [90.231.160.185]) by mx.google.com with ESMTPSA id i9sm471248lbs.26.2015.03.13.08.44.06 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 13 Mar 2015 08:44:08 -0700 (PDT) From: Ulf Hansson To: "Rafael J. Wysocki" , Len Brown , Pavel Machek , Kevin Hilman , linux-pm@vger.kernel.org Cc: Geert Uytterhoeven , Dmitry Torokhov , Russell King , Greg Kroah-Hartman , Mark Brown , Wolfram Sang , linux-arm-kernel@lists.infradead.org, Ulf Hansson Subject: [PATCH 2/9] PM / Domains: Enable genpd to support ->get|put() callbacks Date: Fri, 13 Mar 2015 16:43:42 +0100 Message-Id: <1426261429-31883-3-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1426261429-31883-1-git-send-email-ulf.hansson@linaro.org> References: <1426261429-31883-1-git-send-email-ulf.hansson@linaro.org> X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: ulf.hansson@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.171 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , To provide users control over whether the power should be maintained, implement the ->get|put() callbacks for genpd's PM domain. A usage count variable keeps track of the number of users. A positive value tells genpd to keep supplying power and also to power up if it's the first user. Once the usage count reaches zero, genpd tries to power off its PM domain. Signed-off-by: Ulf Hansson --- drivers/base/power/domain.c | 26 +++++++++++++++++++++++++- include/linux/pm_domain.h | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 45937f8..7314459 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -495,10 +495,12 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) * (2) The domain is waiting for its master to power up. * (3) One of the domain's devices is being resumed right now. * (4) System suspend is in progress. + * (5) The usage_count > 0, since it tells us to stay powered. */ if (genpd->status == GPD_STATE_POWER_OFF || genpd->status == GPD_STATE_WAIT_MASTER - || genpd->resume_count > 0 || genpd->prepared_count > 0) + || genpd->resume_count > 0 || genpd->prepared_count > 0 + || atomic_read(&genpd->usage_count) > 0) return 0; if (atomic_read(&genpd->sd_count) > 0) @@ -1377,6 +1379,25 @@ EXPORT_SYMBOL_GPL(pm_genpd_syscore_poweron); #endif /* CONFIG_PM_SLEEP */ +static int genpd_get(struct dev_pm_domain *domain) +{ + struct generic_pm_domain *genpd = pd_to_genpd(domain); + + atomic_inc(&genpd->usage_count); + + return pm_genpd_poweron(genpd); +} + +static void genpd_put(struct dev_pm_domain *domain) +{ + struct generic_pm_domain *genpd = pd_to_genpd(domain); + + if (!atomic_dec_and_test(&genpd->usage_count)) + return; + + genpd_queue_power_off_work(genpd); +} + static struct generic_pm_domain_data *genpd_alloc_dev_data(struct device *dev, struct generic_pm_domain *genpd, struct gpd_timing_data *td) @@ -1874,10 +1895,13 @@ void pm_genpd_init(struct generic_pm_domain *genpd, genpd->status = is_off ? GPD_STATE_POWER_OFF : GPD_STATE_ACTIVE; init_waitqueue_head(&genpd->status_wait_queue); genpd->poweroff_task = NULL; + atomic_set(&genpd->usage_count, 0); genpd->resume_count = 0; genpd->device_count = 0; genpd->max_off_time_ns = -1; genpd->max_off_time_changed = true; + genpd->domain.get = genpd_get; + genpd->domain.put = genpd_put; genpd->domain.ops.runtime_suspend = pm_genpd_runtime_suspend; genpd->domain.ops.runtime_resume = pm_genpd_runtime_resume; genpd->domain.ops.prepare = pm_genpd_prepare; diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index c80d6ac..698ecbe 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -61,6 +61,7 @@ struct generic_pm_domain { enum gpd_status status; /* Current state of the domain */ wait_queue_head_t status_wait_queue; struct task_struct *poweroff_task; /* Powering off task */ + atomic_t usage_count; /* Number of users of the domain */ unsigned int resume_count; /* Number of devices being resumed */ unsigned int device_count; /* Number of devices */ unsigned int suspended_count; /* System suspend device counter */