From patchwork Thu Dec 14 15:33:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 121984 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp6963561qgn; Thu, 14 Dec 2017 07:36:54 -0800 (PST) X-Google-Smtp-Source: ACJfBoub/A5iNVIZQpysRhp8NPPIVUykK0Bv3XsXIQ6idagdZflCw9+5NIlMjn126v3GrPWMheI7 X-Received: by 10.98.113.196 with SMTP id m187mr9966211pfc.136.1513265813939; Thu, 14 Dec 2017 07:36:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513265813; cv=none; d=google.com; s=arc-20160816; b=P4JANunogUoY43Q0ashkLmzpjAnDFEBfaRJGejPC1CMMBz2zn8U2TY7i1lXEFliviP J9QsYAWye5bGWiWDT8CwYTD+cAivKs0tSg6V+NwM/kxtVcO+G0hM8qOxsEarEkWCMbHd kfBxe6N/vZY8v14u9U5uM3D9nwn/0chX4r5hRdMw/bzSmQ9zHxMYNYyNCWu+eRDFd7Q2 jJrnuqYiWFrADryQGzNqUEJ0WQqLoYJG7MHb8KrCsW0oZeux81FKnkLQsTFGIrU5FFUR HbsfL7nkGYAtRxgtG5QFUO6FPV4rrMc+Iao5F68G033IpkEQGS1la/YowbBCjrAh6f66 wAnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=icrIZ+0hNJgAa851BNV/t+RWElv/Pouel/nrtZERfj0=; b=YSB1yWl91uE6FYFFwxjEYykF6BtSuMhFEPlKLFSy91+CW9B9dtAU2z8Z03A58AUhTM P6TJDBisORCrPbY5eBlYVQMCDq70s3BduXLE3JUvJmXfWBAmksLDaTAVsWubI2Rvwg9C mmJgHNzM44TLZ56Aq7UGIQQypDBegVUKvEck7XpvOpoNe7YRQM5GNYpZlGeEZz9XvjO1 C1i6OZTBBPS6dLUvmcIPPTN9loRLVkqZZZFrjMLei0npdAnfklj9lY4N3fnbAwh/ojvi LbHElVnPjw7y3cXAloNQVZjTaFgnmSxRnj9zrWFOdqaLcbHJL5ERC9piFD0F74CtxksY xvKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=UyXFvnvn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v4si3295862plb.791.2017.12.14.07.36.53; Thu, 14 Dec 2017 07:36:53 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=UyXFvnvn; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753554AbdLNPgt (ORCPT + 19 others); Thu, 14 Dec 2017 10:36:49 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:35230 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753330AbdLNPeC (ORCPT ); Thu, 14 Dec 2017 10:34:02 -0500 Received: by mail-pg0-f66.google.com with SMTP id q20so3635459pgv.2 for ; Thu, 14 Dec 2017 07:34:02 -0800 (PST) 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 :in-reply-to:references; bh=icrIZ+0hNJgAa851BNV/t+RWElv/Pouel/nrtZERfj0=; b=UyXFvnvngSXhJGWyn/WU2SKyx4pDr/isdHpx7gjw3taHi72pIyZTJoDX6anhBDfGno 7GG1R5d5yIXhtOo1ZOqIbnpas4SpnlmLmttLM0SBjZ9l4WGEGvl6O8ZtLFN9yFB6OuTj IBPck5dmTGgnu0cUbSeIrO0IRQY4h3HJR102g= 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:in-reply-to:references; bh=icrIZ+0hNJgAa851BNV/t+RWElv/Pouel/nrtZERfj0=; b=RvQfqg9qVG7po8hnwwSRMVi6z4ilPXqxHjj/HB5hLnSXQc98EqgOOrmAg5goRF+K1V ObH12/GINCu6HmUW+r7sE36ZTqbowtblNx336ZsTsdL+nrSSRpmlRJtL9MDFLpMohUu8 IHQmQRwZ4o2tCBhmkCNKyJ4MvKiAhGwuitOqKQHveXe3xNhJKnACJOXvNSH10ylUEzTS qbxOnvLM6QQRjz6w7AXtvelZW9ylWNImgC6w7lPwp0tRjQ9vcXueTU0M7mo1bqocwq9M mYwt520PccPufIvppO1etCi0tHl9vR3K3IfRtRhN/TY3+Vi/2CtpDGNiU8S38mMImpQU Vh9Q== X-Gm-Message-State: AKGB3mJ7rHFslIcGQd0jpFB+StFLpoOTBompSXbxZe8bAwS0FrATtNbe 0Td8r0k0aTwwUzLnYTGykE/i5g== X-Received: by 10.84.252.146 with SMTP id y18mr9882365pll.70.1513265642229; Thu, 14 Dec 2017 07:34:02 -0800 (PST) Received: from localhost ([122.172.99.7]) by smtp.gmail.com with ESMTPSA id q72sm9560151pfi.42.2017.12.14.07.34.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Dec 2017 07:34:01 -0800 (PST) From: Viresh Kumar To: Greg Kroah-Hartman Cc: Viresh Kumar , Vincent Guittot , Stephen Boyd , Rajendra Nayak , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, robdclark@gmail.com, s.hauer@pengutronix.de, l.stach@pengutronix.de, shawnguo@kernel.org, fabio.estevam@nxp.com, nm@ti.com, xuwei5@hisilicon.com, robh+dt@kernel.org Subject: [PATCH V5 04/13] boot_constraint: Add support for supply constraints Date: Thu, 14 Dec 2017 21:03:11 +0530 Message-Id: X-Mailer: git-send-email 2.15.0.194.g9af6a3dea062 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds the first constraint type: power-supply. The constraint is set by enabling the regulator and setting a voltage range (if required) for the respective regulator device, which will be honored by the regulator core even if more users turn up. Once the device is probed, the regulator is released and the constraint is removed. Tested-by: Rajendra Nayak Signed-off-by: Viresh Kumar --- drivers/boot_constraint/Makefile | 2 +- drivers/boot_constraint/core.c | 4 ++ drivers/boot_constraint/core.h | 5 +++ drivers/boot_constraint/supply.c | 95 ++++++++++++++++++++++++++++++++++++++++ include/linux/boot_constraint.h | 17 ++++++- 5 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 drivers/boot_constraint/supply.c -- 2.15.0.194.g9af6a3dea062 diff --git a/drivers/boot_constraint/Makefile b/drivers/boot_constraint/Makefile index 0f2680177974..a45616f0c3b0 100644 --- a/drivers/boot_constraint/Makefile +++ b/drivers/boot_constraint/Makefile @@ -1,3 +1,3 @@ # Makefile for device boot constraints -obj-y := core.o +obj-y := core.o supply.o diff --git a/drivers/boot_constraint/core.c b/drivers/boot_constraint/core.c index 45a0fbed1b11..63a4b1a2fa2c 100644 --- a/drivers/boot_constraint/core.c +++ b/drivers/boot_constraint/core.c @@ -91,6 +91,10 @@ static struct constraint *constraint_allocate(struct constraint_dev *cdev, void (*remove)(struct constraint *constraint); switch (type) { + case DEV_BOOT_CONSTRAINT_SUPPLY: + add = constraint_supply_add; + remove = constraint_supply_remove; + break; default: return ERR_PTR(-EINVAL); } diff --git a/drivers/boot_constraint/core.h b/drivers/boot_constraint/core.h index 1e87125de531..d0d3e7bf7d57 100644 --- a/drivers/boot_constraint/core.h +++ b/drivers/boot_constraint/core.h @@ -27,4 +27,9 @@ struct constraint { void (*remove)(struct constraint *constraint); void *private; }; + +/* Forward declarations of constraint specific callbacks */ +int constraint_supply_add(struct constraint *constraint, void *data); +void constraint_supply_remove(struct constraint *constraint); + #endif /* _CORE_H */ diff --git a/drivers/boot_constraint/supply.c b/drivers/boot_constraint/supply.c new file mode 100644 index 000000000000..916e5d6848d5 --- /dev/null +++ b/drivers/boot_constraint/supply.c @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2017 Linaro. + * Viresh Kumar + */ + +#include +#include +#include + +#include "core.h" + +struct constraint_supply { + struct dev_boot_constraint_supply_info supply; + struct regulator *reg; +}; + +int constraint_supply_add(struct constraint *constraint, void *data) +{ + struct dev_boot_constraint_supply_info *supply = data; + struct constraint_supply *csupply; + struct device *dev = constraint->cdev->dev; + int ret; + + csupply = kzalloc(sizeof(*csupply), GFP_KERNEL); + if (!csupply) + return -ENOMEM; + + csupply->reg = regulator_get(dev, supply->name); + if (IS_ERR(csupply->reg)) { + ret = PTR_ERR(csupply->reg); + if (ret != -EPROBE_DEFER) { + dev_err(dev, "regulator_get() failed for %s (%d)\n", + supply->name, ret); + } + goto free; + } + + if (supply->u_volt_min != 0 && supply->u_volt_max != 0) { + ret = regulator_set_voltage(csupply->reg, supply->u_volt_min, + supply->u_volt_max); + if (ret) { + dev_err(dev, "regulator_set_voltage %s failed (%d)\n", + supply->name, ret); + goto free_regulator; + } + } + + ret = regulator_enable(csupply->reg); + if (ret) { + dev_err(dev, "regulator_enable %s failed (%d)\n", + supply->name, ret); + goto remove_voltage; + } + + memcpy(&csupply->supply, supply, sizeof(*supply)); + csupply->supply.name = kstrdup_const(supply->name, GFP_KERNEL); + constraint->private = csupply; + + return 0; + +remove_voltage: + if (supply->u_volt_min != 0 && supply->u_volt_max != 0) + regulator_set_voltage(csupply->reg, 0, INT_MAX); +free_regulator: + regulator_put(csupply->reg); +free: + kfree(csupply); + + return ret; +} + +void constraint_supply_remove(struct constraint *constraint) +{ + struct constraint_supply *csupply = constraint->private; + struct dev_boot_constraint_supply_info *supply = &csupply->supply; + struct device *dev = constraint->cdev->dev; + int ret; + + kfree_const(supply->name); + + ret = regulator_disable(csupply->reg); + if (ret) + dev_err(dev, "regulator_disable failed (%d)\n", ret); + + if (supply->u_volt_min != 0 && supply->u_volt_max != 0) { + ret = regulator_set_voltage(csupply->reg, 0, INT_MAX); + if (ret) + dev_err(dev, "regulator_set_voltage failed (%d)\n", + ret); + } + + regulator_put(csupply->reg); + kfree(csupply); +} diff --git a/include/linux/boot_constraint.h b/include/linux/boot_constraint.h index 2ce62b7b3cc6..1db24d53b622 100644 --- a/include/linux/boot_constraint.h +++ b/include/linux/boot_constraint.h @@ -16,9 +16,24 @@ struct device; /** * enum dev_boot_constraint_type - This defines different boot constraint types. * + * @DEV_BOOT_CONSTRAINT_SUPPLY: This represents a power supply boot constraint. */ enum dev_boot_constraint_type { - DEV_BOOT_CONSTRAINT_NONE, + DEV_BOOT_CONSTRAINT_SUPPLY, +}; + +/** + * struct dev_boot_constraint_supply_info - Power supply boot constraint + * information. + * + * @name: This must match the power supply name for the device. + * @u_volt_min: This is the minimum microvolts value supported by the device. + * @u_volt_max: This is the maximum microvolts value supported by the device. + */ +struct dev_boot_constraint_supply_info { + const char *name; + unsigned int u_volt_min; + unsigned int u_volt_max; }; /**