From patchwork Tue Aug 1 09:23:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 109121 Delivered-To: patch@linaro.org Received: by 10.140.101.6 with SMTP id t6csp1267107qge; Tue, 1 Aug 2017 02:29:04 -0700 (PDT) X-Received: by 10.84.174.3 with SMTP id q3mr20907203plb.289.1501579744844; Tue, 01 Aug 2017 02:29:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1501579744; cv=none; d=google.com; s=arc-20160816; b=lCzGhsz5bw7d0V/DocKfnJK1SVaT6FjdAD/vxsn855s/ttsLnBdpPEfIxOMsYGvz2Z uUbsmdS0m/eWGq4tmCatN76b6u+QNnDKO/NgWQf0/FDYMEScEIdvymfg3/sICSWUD6Oy mhts867fGRZQGssvxEgTeTD4AmLnbgIRoE8akEkWPDLUpBoUsgnRQErwzm10n5QhquWX fetBKM7Bp8bQDsXmqs5+6zycyqIrOit5jBFdBW1Iv4a1YbI3iqbBvOJoxCai7xRbeDTa kGe+uT3juMmHbGWvLNM/JqUnQX/4Sl3T8/0vDpbgLj0aXLZj6jd8TC/NopN6NJh/xK7e 2epg== 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=eRIiqaooxX0dycstPkKuTrk/FPgZsmSWzTlHoeYia6I=; b=pXUxYDJ16vSqtQkJWSOJKvmyb5bg50fpzWVjSQg801jfQEh9P1RhPhKnyzsuAO34yu +CPQ9CYZTkvjQ79M0hseKVNOsOAtjou2DjQeixXJR4H1EF2pCsKi/g7h3bGXvgcc0i4i 2aeJGUgGO6mf+3R1FmJUkWjgaI2cBVRnS/ABK/SD3Xx4mv9bmhq+/VQddYGT/8EYtoSF ynb0ZLExJpuk2DI4cJp20fCAF4hvP+sWZbsW60aFqhNKEmbq42M831eix3PH+iNrF7Qs D6BvqwYhQLfp16KBJU97EZ6ne4DKUEpy29frw+Dj5kktYOp0aPjEMehck52fZY3NzVMJ jB4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=YPKkkZlu; 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 s132si17915082pgs.645.2017.08.01.02.29.04; Tue, 01 Aug 2017 02:29:04 -0700 (PDT) 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.b=YPKkkZlu; 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 S1751833AbdHAJ3C (ORCPT + 26 others); Tue, 1 Aug 2017 05:29:02 -0400 Received: from mail-pf0-f175.google.com ([209.85.192.175]:35124 "EHLO mail-pf0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751804AbdHAJ25 (ORCPT ); Tue, 1 Aug 2017 05:28:57 -0400 Received: by mail-pf0-f175.google.com with SMTP id t86so5525365pfe.2 for ; Tue, 01 Aug 2017 02:28:57 -0700 (PDT) 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=eRIiqaooxX0dycstPkKuTrk/FPgZsmSWzTlHoeYia6I=; b=YPKkkZlubtl7mmyywj+UYemg7c5p/VDw+ve3m9ns4Xs9CZX0vu/gG4S0pqZhqX0T8f A9DzkU1iX4TZVj686XU+4/HQ0dBZ+qdO4TrbfpnYrcnclqomxN2vsC5PQ1CZ8K/wkt3x KZNejaLsk5BbEKSJSYNZe14GsjCLm6pKm6reM= 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=eRIiqaooxX0dycstPkKuTrk/FPgZsmSWzTlHoeYia6I=; b=NxQmJuefxkDJ5G7K/GyaczKybYoHoM/osXCGqfWf4p8lP5eZKoVnGLCCYfkUzDuFf0 CHxxA9fTGLFGrCE3qJexrmZN74ZPhVrUrIckZvUu6tyxPKx+aMtL2WLS+ppTn0Ey7tvN BK4SUlMx7hMKudWr+W7xpDzahrCGCpC9uMRJPMqrpDSIwVP2kzRSsJ/zUoTOHp3RJXGK 58TCql25rZBwpgMXbIyX0wNh2IZ6zkF/S7frRgt+UynzmRvga03/M6jEDNPgZd593BGx hbqOhpj50rIcyaZPwwji1TPso3+6QPi6H2l289twIS9yDJjA5oCkzC7YIetegii97Wyz QEYQ== X-Gm-Message-State: AIVw110Gi5eA09vWquENftqRztJp398f+OLUkK93lISLE2ll44cKZCu7 XkfMg+JP6ymvQlDw X-Received: by 10.84.224.207 with SMTP id k15mr20375047pln.108.1501579737106; Tue, 01 Aug 2017 02:28:57 -0700 (PDT) Received: from localhost ([122.172.27.66]) by smtp.gmail.com with ESMTPSA id r25sm3714324pgu.7.2017.08.01.02.28.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Aug 2017 02:28:56 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman Cc: Viresh Kumar , Vincent Guittot , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, robdclark@gmail.com Subject: [PATCH V3 3/8] drivers: boot_constraint: Add support for supply constraints Date: Tue, 1 Aug 2017 14:53:44 +0530 Message-Id: <0ba4891f8e7152438e6ad66b096e960646b39ad8.1501578037.git.viresh.kumar@linaro.org> X-Mailer: git-send-email 2.13.0.71.gd7076ec9c9cb 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/base/boot_constraints/Makefile | 2 +- drivers/base/boot_constraints/core.c | 4 ++ drivers/base/boot_constraints/core.h | 3 ++ drivers/base/boot_constraints/supply.c | 98 ++++++++++++++++++++++++++++++++++ include/linux/boot_constraint.h | 8 ++- 5 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 drivers/base/boot_constraints/supply.c -- 2.13.0.71.gd7076ec9c9cb diff --git a/drivers/base/boot_constraints/Makefile b/drivers/base/boot_constraints/Makefile index 0f2680177974..a45616f0c3b0 100644 --- a/drivers/base/boot_constraints/Makefile +++ b/drivers/base/boot_constraints/Makefile @@ -1,3 +1,3 @@ # Makefile for device boot constraints -obj-y := core.o +obj-y := core.o supply.o diff --git a/drivers/base/boot_constraints/core.c b/drivers/base/boot_constraints/core.c index e0c33b2b216f..06b618a85c0a 100644 --- a/drivers/base/boot_constraints/core.c +++ b/drivers/base/boot_constraints/core.c @@ -105,6 +105,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/base/boot_constraints/core.h b/drivers/base/boot_constraints/core.h index 7ba4ac172c09..73b9d2d22a12 100644 --- a/drivers/base/boot_constraints/core.h +++ b/drivers/base/boot_constraints/core.h @@ -30,4 +30,7 @@ struct constraint { }; /* 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/base/boot_constraints/supply.c b/drivers/base/boot_constraints/supply.c new file mode 100644 index 000000000000..30f816dbf12c --- /dev/null +++ b/drivers/base/boot_constraints/supply.c @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2017 Linaro. + * Viresh Kumar + * + * This file is released under the GPLv2. + */ + +#define pr_fmt(fmt) "Supply Boot Constraints: " fmt + +#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 ae34fee547c5..d19b8ec2f10d 100644 --- a/include/linux/boot_constraint.h +++ b/include/linux/boot_constraint.h @@ -15,7 +15,13 @@ struct device; enum dev_boot_constraint_type { - DEV_BOOT_CONSTRAINT_NONE, + DEV_BOOT_CONSTRAINT_SUPPLY, +}; + +struct dev_boot_constraint_supply_info { + const char *name; + unsigned int u_volt_min; + unsigned int u_volt_max; }; struct dev_boot_constraint {