From patchwork Fri May 18 10:31:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 136287 Delivered-To: patches@linaro.org Received: by 2002:a2e:9706:0:0:0:0:0 with SMTP id r6-v6csp1056748lji; Fri, 18 May 2018 03:31:59 -0700 (PDT) X-Received: by 2002:a19:4310:: with SMTP id q16-v6mr5021601lfa.74.1526639519721; Fri, 18 May 2018 03:31:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526639519; cv=none; d=google.com; s=arc-20160816; b=liVcWabbNrVSFb8IzkhRVnDqqm9it3YBAYIIdu7YbiXLA/xbKrqG8iG8aU9JU5K9xp fr3zYIX9ksek/VA1ps6W7ugDyemjYYN8ovH3CrELVSIfE615frXBQ0fdF5X6xsO+WcvB 80aG4PoX4V3v67t2+KzxSfEw3+mdXaltmzEP9GIruykPyk4rj3htaMmgm/Pzv7efIOz3 v/U7bBgu0gKQpCV839JnXDPp4F2+EopqZuhsuAl569xKTL6SU8OCDZAQ9jt4MyJQXd8t iTcblCdbs3F3B4y1cQEXAx3JnCoZ6h365oyZN9CibZgJ5NTto6n2xjq07kIjV6K8sRJ8 cqqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=ZcMqktTgVrlFyixB7rDxIq6FvIIB/LXvMKcWVjQol/I=; b=chEzVheFUO4jI4xEQ/E/qB1Eos8UWfTnFfgfYJtl+RevBGEvbanYCOOfmfH39xk8FA pI4DYBZ0PR6HnrRQIpd7rnnRuVKBSsJgjQxQ1eHgFkntLoTh8P1RPcOcQA3jElBC2VWg FqKtrReTVJcmTTOAQwzjXbEfsMPDR4GGQGncWbK7sGvdQW3aAIE5/dOwfnM763Oo6iKp FMLM5ZDmgfPqzrzBZhACEi8j/w5xDZ5DtDUi8/PPzE+VpeZokV/0VPKdqPUqIYDGbSDN mVrB2deOOkrcQf6xPjviuYGUYm9ChpwwKgLkLvmPx1QTRb0zTwyuq9Ng4alplPAEeqcG g2VQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=kxVJatCT; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id d67-v6sor1747364ljd.97.2018.05.18.03.31.59 for (Google Transport Security); Fri, 18 May 2018 03:31:59 -0700 (PDT) Received-SPF: pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=kxVJatCT; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZcMqktTgVrlFyixB7rDxIq6FvIIB/LXvMKcWVjQol/I=; b=kxVJatCTSOTh6Lqrzf13A9ATud2vAtbdxmpWBmHDU+gZilYcWS6t3W00VFtGFU8MhJ 5if4Hj6N8ZvupxeajqUt0/yT+yo09zUveZc8pxSdi/Yf9oYpcf6QOrCLb1sCedEkGzZF RZMebIvCf3WyaYEqg6vw0G7NPwYV8bqgy1qK4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ZcMqktTgVrlFyixB7rDxIq6FvIIB/LXvMKcWVjQol/I=; b=oNLs8FHGR4FAKm4Sl4bX6OcE9qLwEftxuzwXT9wjUpEDZR9Fzsz5FtU61L0T1bp/sM V0u0sjnDEm6hEz7TQWFZCV+o0GbTRR4HtdfROuX6uF/QE+JzjaRGoI4xYa03cJ/SA0TT /xgc3IiqHLfynKsEIYKQT6OUQweFp7N+xUe8Lc41TDdpIc39Unat6rTb2jiFZ2hOYXI9 3LKixAflimLP/KIQz+vrJTCB3IFt25tpfgkd3b7nxwl8KMTgpwhi0lqjIiPqpQGcjAHT 3L2xP722rE/gzNmQC848sxvU4hJ9LaJr97/BC2n41ymxu06uzqw+BK2V6BgbVT9LyY77 KHwQ== X-Gm-Message-State: ALKqPwexMgAWELk9TYKtOU0EwJwIn9EAVb5tgg1Fkcg8G9WCA6XzbCng oQbhvzvTCH04MuzOyHVyV3LAYe/1 X-Google-Smtp-Source: AB8JxZon1aIya6jSBJzU5mKTem807xN1/o7m1G6xeqQKKjiIDloQLl2HRjnxC44xXsTrdBKzbIT0GA== X-Received: by 2002:a2e:2402:: with SMTP id k2-v6mr5751500ljk.20.1526639519449; Fri, 18 May 2018 03:31:59 -0700 (PDT) Return-Path: Received: from localhost.localdomain (h-158-174-22-210.NA.cust.bahnhof.se. [158.174.22.210]) by smtp.gmail.com with ESMTPSA id u14-v6sm393447lfk.55.2018.05.18.03.31.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 18 May 2018 03:31:58 -0700 (PDT) From: Ulf Hansson To: "Rafael J . Wysocki" , linux-pm@vger.kernel.org Cc: Ulf Hansson , Greg Kroah-Hartman , Jon Hunter , Geert Uytterhoeven , Todor Tomov , Rajendra Nayak , Viresh Kumar , Vincent Guittot , Kevin Hilman , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-tegra@vger.kernel.org Subject: [PATCH 9/9] PM / Domains: Add dev_pm_domain_attach_by_id() to manage multi PM domains Date: Fri, 18 May 2018 12:31:30 +0200 Message-Id: <1526639490-12167-10-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1526639490-12167-1-git-send-email-ulf.hansson@linaro.org> References: <1526639490-12167-1-git-send-email-ulf.hansson@linaro.org> The existing dev_pm_domain_attach() function, allows a single PM domain to be attached per device. To be able to support devices that are partitioned across multiple PM domains, let's introduce a new interface, dev_pm_domain_attach_by_id(). The dev_pm_domain_attach_by_id() returns a new allocated struct device with the corresponding attached PM domain. This enables for example a driver to operate on the new device from a power management point of view. The driver may then also benefit from using the received device, to set up so called device-links towards its original device. Depending on the situation, these links may then be dynamically changed. The new interface is typically called by drivers during their probe phase, in case they manages devices which uses multiple PM domains. If that is the case, the driver also becomes responsible of managing the detaching of the PM domains, which typically should be done at the remove phase. Detaching is done by calling the existing dev_pm_domain_detach() function and for each of the received devices from dev_pm_domain_attach_by_id(). Note, currently its only genpd that supports multiple PM domains per device, but dev_pm_domain_attach_by_id() can easily by extended to cover other PM domain types, if/when needed. Signed-off-by: Ulf Hansson --- drivers/base/power/common.c | 33 ++++++++++++++++++++++++++++++++- include/linux/pm_domain.h | 7 +++++++ 2 files changed, 39 insertions(+), 1 deletion(-) -- 2.7.4 diff --git a/drivers/base/power/common.c b/drivers/base/power/common.c index 7ae62b6..d3db974 100644 --- a/drivers/base/power/common.c +++ b/drivers/base/power/common.c @@ -117,13 +117,44 @@ int dev_pm_domain_attach(struct device *dev, bool power_on) EXPORT_SYMBOL_GPL(dev_pm_domain_attach); /** + * dev_pm_domain_attach_by_id - Attach a device to one of its PM domains. + * @index: The index of the PM domain. + * @dev: Device to attach. + * + * As @dev may only be attached to a single PM domain, the backend PM domain + * provider should create a virtual device to attach instead. As attachment + * succeeds, the ->detach() callback in the struct dev_pm_domain should be + * assigned by the corresponding backend attach function. + * + * This function should typically be invoked from drivers during probe phase. + * Especially for those that manages devices which requires power management + * through more than one PM domain. + * + * Callers must ensure proper synchronization of this function with power + * management callbacks. + * + * Returns the virtual attached device in case successfully attached PM domain, + * NULL in case @dev don't need a PM domain, else a PTR_ERR(). + */ +struct device *dev_pm_domain_attach_by_id(struct device *dev, + unsigned int index) +{ + if (dev->pm_domain) + return NULL; + + return genpd_dev_pm_attach_by_id(dev, index); +} +EXPORT_SYMBOL_GPL(dev_pm_domain_attach_by_id); + +/** * dev_pm_domain_detach - Detach a device from its PM domain. * @dev: Device to detach. * @power_off: Used to indicate whether we should power off the device. * * This functions will reverse the actions from dev_pm_domain_attach() and thus * try to detach the @dev from its PM domain. Typically it should be invoked - * from subsystem level code during the remove phase. + * during the remove phase, either from subsystem level code or from drivers in + * case attaching was done through dev_pm_domain_attach_by_id. * * Callers must ensure proper synchronization of this function with power * management callbacks. diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index 82458e8..493ce67 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -299,6 +299,8 @@ struct generic_pm_domain *of_genpd_remove_last(struct device_node *np) #ifdef CONFIG_PM int dev_pm_domain_attach(struct device *dev, bool power_on); +struct device *dev_pm_domain_attach_by_id(struct device *dev, + unsigned int index); void dev_pm_domain_detach(struct device *dev, bool power_off); void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd); #else @@ -306,6 +308,11 @@ static inline int dev_pm_domain_attach(struct device *dev, bool power_on) { return 0; } +static inline struct device *dev_pm_domain_attach_by_id(struct device *dev, + unsigned int index); +{ + return NULL; +} static inline void dev_pm_domain_detach(struct device *dev, bool power_off) {} static inline void dev_pm_domain_set(struct device *dev, struct dev_pm_domain *pd) {}