From patchwork Wed Jul 12 06:34:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 107443 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp432472qge; Tue, 11 Jul 2017 23:35:00 -0700 (PDT) X-Received: by 10.99.185.28 with SMTP id z28mr2355045pge.123.1499841300080; Tue, 11 Jul 2017 23:35:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499841300; cv=none; d=google.com; s=arc-20160816; b=eRHkulOXDlGP/7HdkuZGn+11TxuoduJPlljZeUHTHtsqzcCAjg8XpVCYFkbtfKMp+m TGRtJK04onmjGcAsh2lmakK+4Ss8d64BaBfSaJ8YlegLn18x33RaQC8/fjclXmsf6hOM i36A2ZmlRhg0XwYpaesIIu2yHdDIUp8AlXddRKOzzusVQd/i1ik8ihrmfVIfvJGpZ7rx YPXF+pJnoNBVkCKPr/N4AxFpSs+tn1Ftmgj7rH1Gs13d5i3skJSNw7w0ygC2dTPXhZ7H lE40nUlN91IIW4egyheqMDskSj6fZegYmN2WU13LkcimUHqdRwDXiYGkHcgMiBdp5Hs4 qr2w== 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=IToC8rz7lvMckfGIP9vtma0LUJG6whPNvJQ95dwPPt4=; b=ny+iDUhrumnYWFuTn5hw8AICznIGRcNZI09tpeCB5LxzYY3LQkTirbr2pCsEgUhSHv 122fIchQZVrfAInD57xnl6qAvhxs/KosoAzGY3wcEPxqK6znf6BzlcQzIa71DgrHcuTP uIlyjacxqzUYeIjZw/GW4lNaUPUWo0uPaVs46aN04KyHPI/VyHjzjMu0yI7MsonE17Lj m+lX6xv3nYASfoWZaNz5O29AdSSvF/Hs/uqUsj2qsHCNxY/cxBi25ibZD0nuW9nX9GWV w4fjc1K5spIwSb28wWP+F6Gm4Gs2WWsOKPyestw1PtBpo9UxQ/dzT8wwa7cuYqe0bAyg x2vA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=hUZKS3Hl; 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 x13si1265814pgq.222.2017.07.11.23.34.59; Tue, 11 Jul 2017 23:35:00 -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=hUZKS3Hl; 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 S1756667AbdGLGe5 (ORCPT + 25 others); Wed, 12 Jul 2017 02:34:57 -0400 Received: from mail-pg0-f43.google.com ([74.125.83.43]:34275 "EHLO mail-pg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755899AbdGLGex (ORCPT ); Wed, 12 Jul 2017 02:34:53 -0400 Received: by mail-pg0-f43.google.com with SMTP id t186so8046892pgb.1 for ; Tue, 11 Jul 2017 23:34:47 -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=IToC8rz7lvMckfGIP9vtma0LUJG6whPNvJQ95dwPPt4=; b=hUZKS3Hlk+0x58NqL+v5TsjFvnPUWDp1yJSHK7+NyXdbHZQf8fbTm5Amp1ikGUMcrD n12UzWdy1gbimIn+JrZbJjD1zonW+dcXvG6htTH/UqfOzk+EOJAFcqMHiC12W7zYTdCa ALYgIvULiJk2EePUr3sx9NFckV5kw8Z2YDfF0= 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=IToC8rz7lvMckfGIP9vtma0LUJG6whPNvJQ95dwPPt4=; b=kQRaHRsXlo6ej0l5/GxBpfiU1QTwR+ejjBtEFya/ODqnbU+g+bwWJ/EvdozlTDhqOm 0wDzLvdMhkfaVAEWBz4LNIEm635T72bo5M2XXNYkpiS13guZAs0MrHtj3TsWEY+Oln18 mi+vZJzsw3pbB1QfV+MqM0jtQTc+bEaeJF2PeWh/lK5y4O8nt/2TJthX+GbSvgdcoB8S Tf7VLCWddJCPigr9At1YnvJsAtmgMuqQzzBd2UFIyi1ZCPda25d/Bmra3nF+9/VVj0Y/ mulYDQnt/X0S4+PaurJ4JdXHI3b1YzuN9AJmqJgkdeJF8/pQmyTZ22kOcPHwjAkvMP/y QgNg== X-Gm-Message-State: AIVw111ZFH3rRev3X4lffTMxWMWPEWYZsaMxSD1R4pPwfDMEvtZSCoU+ czQojAVzuYQCLr++ X-Received: by 10.84.229.13 with SMTP id b13mr2472433plk.1.1499841287252; Tue, 11 Jul 2017 23:34:47 -0700 (PDT) Received: from localhost ([122.167.138.108]) by smtp.gmail.com with ESMTPSA id i28sm2779556pfk.17.2017.07.11.23.34.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 23:34:46 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman Cc: Viresh Kumar , Vincent Guittot , Rob Herring , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC v2 1/6] drivers: Add boot constraints core Date: Wed, 12 Jul 2017 12:04:31 +0530 Message-Id: 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 Some devices are powered ON by the bootloader before the bootloader handovers control to Linux. It maybe important for those devices to keep working until the time a Linux device driver probes the device and reconfigure its resources. A typical example of that can be the LCD controller, which is used by the bootloaders to show image(s) while the platform is booting into Linux. The LCD controller can be using some resources, like clk, regulators, etc, that are shared between several devices. These shared resources should be configured to satisfy need of all the users. If another device's (X) driver gets probed before the LCD controller driver in this case, then it may end up reconfiguring these resources to ranges satisfying the current users (only device X) and that can make the LCD screen unstable. This patch introduces the concept of boot-constraints, which will be set by the bootloaders and the kernel will satisfy them until the time driver for such a device is probed (successfully or unsuccessfully). The list of boot constraint types is empty for now, and will be added by a later patch. Only two routines are exposed by the boot constraints core for now: - boot_constraint_add(): This will be called by parts of the kernel (before the device is probed) to set the constraints. - boot_constraints_remove(): This is called only by the driver core after a device is probed successfully or unsuccessfully. Special handling is done here for deffered probing. Signed-off-by: Viresh Kumar --- drivers/base/Kconfig | 10 ++ drivers/base/Makefile | 1 + drivers/base/boot_constraint.c | 219 ++++++++++++++++++++++++++++++++++++++++ drivers/base/dd.c | 20 ++-- include/linux/boot_constraint.h | 36 +++++++ 5 files changed, 279 insertions(+), 7 deletions(-) create mode 100644 drivers/base/boot_constraint.c create mode 100644 include/linux/boot_constraint.h -- 2.13.0.71.gd7076ec9c9cb diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index d718ae4b907a..0cf7cdd3081e 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig @@ -339,4 +339,14 @@ config CMA_ALIGNMENT endif +config BOOT_CONSTRAINTS + bool "Boot constraints for devices" + help + This enables boot constraints detection for devices. These constraints + are (normally) set by the Bootloader and must be satisfied by the + kernel until the relevant device driver is probed. Once the driver is + probed, the constraint is dropped. + + If unsure, say N. + endmenu diff --git a/drivers/base/Makefile b/drivers/base/Makefile index f2816f6ff76a..6094b3b75184 100644 --- a/drivers/base/Makefile +++ b/drivers/base/Makefile @@ -5,6 +5,7 @@ obj-y := component.o core.o bus.o dd.o syscore.o \ cpu.o firmware.o init.o map.o devres.o \ attribute_container.o transport_class.o \ topology.o container.o property.o cacheinfo.o +obj-$(CONFIG_BOOT_CONSTRAINTS) += boot_constraint.o obj-$(CONFIG_DEVTMPFS) += devtmpfs.o obj-$(CONFIG_DMA_CMA) += dma-contiguous.o obj-y += power/ diff --git a/drivers/base/boot_constraint.c b/drivers/base/boot_constraint.c new file mode 100644 index 000000000000..7dc7b6132765 --- /dev/null +++ b/drivers/base/boot_constraint.c @@ -0,0 +1,219 @@ +/* + * This takes care of boot time constraints, normally set by the Bootloader. + * + * Copyright (C) 2017 Linaro. + * Viresh Kumar + * + * This file is released under the GPLv2. + */ + +#define pr_fmt(fmt) "Boot Constraints: " fmt + +#include +#include +#include +#include +#include +#include +#include + +struct constraint { + struct constraint_dev *cdev; + struct list_head node; + enum boot_constraint_type type; + void (*free_resources)(void *data); + void *free_resources_data; + + int (*add)(struct constraint *constraint, void *data); + void (*remove)(struct constraint *constraint); + void *private; +}; + +struct constraint_dev { + struct device *dev; + struct list_head node; + struct list_head constraints; +}; + +#define for_each_constraint(_constraint, _temp, _cdev) \ + list_for_each_entry_safe(_constraint, _temp, &_cdev->constraints, node) + +/* Global list of all constraint devices currently registered */ +static LIST_HEAD(constraint_devices); +static DEFINE_MUTEX(constraint_devices_mutex); + +/* Forward declarations of constraints */ + + +/* Boot constraints core */ + +static struct constraint_dev *constraint_device_find(struct device *dev) +{ + struct constraint_dev *cdev; + + list_for_each_entry(cdev, &constraint_devices, node) { + if (cdev->dev == dev) + return cdev; + } + + return NULL; +} + +static struct constraint_dev *constraint_device_allocate(struct device *dev) +{ + struct constraint_dev *cdev; + + cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); + if (!cdev) + return ERR_PTR(-ENOMEM); + + cdev->dev = dev; + INIT_LIST_HEAD(&cdev->node); + INIT_LIST_HEAD(&cdev->constraints); + + list_add(&cdev->node, &constraint_devices); + + return cdev; +} + +static void constraint_device_free(struct constraint_dev *cdev) +{ + list_del(&cdev->node); + kfree(cdev); +} + +static struct constraint_dev *constraint_device_get(struct device *dev) +{ + struct constraint_dev *cdev; + + cdev = constraint_device_find(dev); + if (cdev) + return cdev; + + cdev = constraint_device_allocate(dev); + if (IS_ERR(cdev)) { + dev_err(dev, "Failed to add constraint dev (%ld)\n", + PTR_ERR(cdev)); + } + + return cdev; +} + +static void constraint_device_put(struct constraint_dev *cdev) +{ + if (!list_empty(&cdev->constraints)) + return; + + constraint_device_free(cdev); +} + +static struct constraint *constraint_allocate(struct constraint_dev *cdev, + enum boot_constraint_type type) +{ + struct constraint *constraint; + int (*add)(struct constraint *constraint, void *data); + void (*remove)(struct constraint *constraint); + + switch (type) { + default: + return ERR_PTR(-EINVAL); + } + + constraint = kzalloc(sizeof(*constraint), GFP_KERNEL); + if (!constraint) + return ERR_PTR(-ENOMEM); + + constraint->cdev = cdev; + constraint->type = type; + constraint->add = add; + constraint->remove = remove; + INIT_LIST_HEAD(&constraint->node); + + list_add(&constraint->node, &cdev->constraints); + + return constraint; +} + +static void constraint_free(struct constraint *constraint) +{ + list_del(&constraint->node); + kfree(constraint); +} + +int boot_constraint_add(struct device *dev, enum boot_constraint_type type, + struct boot_constraint_info *info) +{ + struct constraint_dev *cdev; + struct constraint *constraint; + int ret; + + mutex_lock(&constraint_devices_mutex); + + /* Find or add the cdev type first */ + cdev = constraint_device_get(dev); + if (IS_ERR(cdev)) { + ret = PTR_ERR(cdev); + goto unlock; + } + + constraint = constraint_allocate(cdev, type); + if (IS_ERR(constraint)) { + dev_err(dev, "Failed to add constraint type: %d (%ld)\n", type, + PTR_ERR(constraint)); + ret = PTR_ERR(constraint); + goto put_cdev; + } + + constraint->free_resources = info->free_resources; + constraint->free_resources_data = info->free_resources_data; + + /* Set constraint */ + ret = constraint->add(constraint, info->constraint_info); + if (ret) + goto free_constraint; + + dev_dbg(dev, "Added boot constraint-type (%d)\n", type); + + mutex_unlock(&constraint_devices_mutex); + + return 0; + +free_constraint: + constraint_free(constraint); +put_cdev: + constraint_device_put(cdev); +unlock: + mutex_unlock(&constraint_devices_mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(boot_constraint_add); + +static void constraint_remove(struct constraint *constraint) +{ + constraint->remove(constraint); + + if (constraint->free_resources) + constraint->free_resources(constraint->free_resources_data); + + constraint_free(constraint); +} + +void boot_constraints_remove(struct device *dev) +{ + struct constraint_dev *cdev; + struct constraint *constraint, *temp; + + mutex_lock(&constraint_devices_mutex); + + cdev = constraint_device_find(dev); + if (!cdev) + goto unlock; + + for_each_constraint(constraint, temp, cdev) + constraint_remove(constraint); + + constraint_device_put(cdev); +unlock: + mutex_unlock(&constraint_devices_mutex); +} diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 4882f06d12df..4eb9d183d647 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -17,6 +17,7 @@ * This file is released under the GPLv2 */ +#include #include #include #include @@ -381,15 +382,20 @@ static int really_probe(struct device *dev, struct device_driver *drv) */ devices_kset_move_last(dev); - if (dev->bus->probe) { + if (dev->bus->probe) ret = dev->bus->probe(dev); - if (ret) - goto probe_failed; - } else if (drv->probe) { + else if (drv->probe) ret = drv->probe(dev); - if (ret) - goto probe_failed; - } + + /* + * Remove boot constraints for both successful and unsuccessful probe(), + * except for the case where EPROBE_DEFER is returned by probe(). + */ + if (ret != -EPROBE_DEFER) + boot_constraints_remove(dev); + + if (ret) + goto probe_failed; if (test_remove) { test_remove = false; diff --git a/include/linux/boot_constraint.h b/include/linux/boot_constraint.h new file mode 100644 index 000000000000..99f268447f72 --- /dev/null +++ b/include/linux/boot_constraint.h @@ -0,0 +1,36 @@ +/* + * Boot constraints header. + * + * Copyright (C) 2017 Linaro. + * Viresh Kumar + * + * This file is released under the GPLv2 + */ + +#include +#include + +struct device; + +enum boot_constraint_type { + BOOT_CONSTRAINT_NONE, +}; + +struct boot_constraint_info { + /* This will be called just before the constraint is removed */ + void (*free_resources)(void *data); + void *free_resources_data; + void *constraint_info; +}; + +#ifdef CONFIG_BOOT_CONSTRAINTS +int boot_constraint_add(struct device *dev, enum boot_constraint_type type, + struct boot_constraint_info *info); +void boot_constraints_remove(struct device *dev); +#else +static inline int boot_constraint_add(struct device *dev, + enum boot_constraint_type type, + struct boot_constraint_info *info) +{ return -EINVAL; } +static inline void boot_constraints_remove(struct device *dev) {} +#endif From patchwork Wed Jul 12 06:34:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 107442 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp432462qge; Tue, 11 Jul 2017 23:34:59 -0700 (PDT) X-Received: by 10.98.113.71 with SMTP id m68mr37157768pfc.220.1499841299663; Tue, 11 Jul 2017 23:34:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499841299; cv=none; d=google.com; s=arc-20160816; b=MZWkUzcil/A4w+IQWnzMZvXIcQRQwOCTKhB/K+QT7mqdWd6SiMncr3/Ml7dtf4KNVd uQuacbcp9vvmk3k4IilR8CH7v6JO9JU7r3U2bV6fG9EReDM9IyG0ckXPWWdU18Pa2bTe BO1rEkh7GIAnglRNccuojfBCXQSIq3ZNBTsfUzJTa6r60HB13m/n+ITkCiHDQb1YdfRW XkPMY0xRRtb7S/ZOdfr5p7mUnPZ8L3IvJTCzrqBS5hKgHC6CytH0vkrb6LhTFiaL2B8l XDnah8C1lg15ttVVlzWGO8bsDNiz2YDtUKvCHezxJ748jgqqIIowEezG/MV7F6pHVL5L e0vQ== 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=m16X9ipbd33AgAsVfnjWbNFaVVu9Q6bCDEEDZHi1Pf8=; b=PtY5xueLh6SsZV3OLE4jlrJpSt/W3CPZ8K0T4ubJu0ovI+WCthr2W9vwmNU8/R7xD6 P/LGnEVsZCuLu3taLIpG+83Yo7tcZfnzX+XsE/AgS378PpiJGsBpjwGchnyowvqCIbm4 adeEd4gJ0T5TKp/Gg8pXprwqih2kDVIUW6uSRQ19EM5OtCyw8wu9rEQTgYzkg9Zdep0v Q6NgYBW/n0/aC5voYDX4Qk41y3e1YGHoT+lrQg7CpdLJh5blra9TEXuSfJDxOEPwFzeD XYIBbHPq1nNm/CGqJHXQvHrPzbifvwryW5Vzq4vX1DyjZfjjetdSJX/C/fDhtkMXFSQM fx3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=O56eTPWl; 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 x13si1265814pgq.222.2017.07.11.23.34.58; Tue, 11 Jul 2017 23:34:59 -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=O56eTPWl; 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 S1756432AbdGLGew (ORCPT + 25 others); Wed, 12 Jul 2017 02:34:52 -0400 Received: from mail-pg0-f43.google.com ([74.125.83.43]:32854 "EHLO mail-pg0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755899AbdGLGeu (ORCPT ); Wed, 12 Jul 2017 02:34:50 -0400 Received: by mail-pg0-f43.google.com with SMTP id k14so8071592pgr.0 for ; Tue, 11 Jul 2017 23:34:50 -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=m16X9ipbd33AgAsVfnjWbNFaVVu9Q6bCDEEDZHi1Pf8=; b=O56eTPWlh7A3pvRRLoBepnkHJEc4hz6YJ9R+DQkRzob4NeAdz6rdz6V/h8+1tnlzZQ 0SXMs54AEGaozP809k52aLO2NWf+qOhQwfsLpBFETcAf1nOtzKtX/WRwM9bNT04djX0j /sKkrG86SKvkuQ7iPrc6N8PbBCl/A8f0X6dV4= 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=m16X9ipbd33AgAsVfnjWbNFaVVu9Q6bCDEEDZHi1Pf8=; b=YWGrNSmH2zxqePYO0jPfv2wsA1e1KIuJpN1+B0wycjkrqiwZ+MzYyzoJLTbtL/CQMU sH8eFAdlgW2y8ubEBALvz3Fzb+oKxc1pbszF4d152hhSNLo904lfvHFyWK+coCI98afZ 7ox2W6IlH+DFmctNygb8hZd7IK6lJDOrQpQyCltulWsgS1C9E3ABZxrbZ4XdwCxkHK9Z iQfi0g8CIWmWkqsuahS3jXVRsyHQJcNeh5yPx+8ygkyIvaVo6t4tR/3LbdG/Rfhl9hDC X3AAz9ZuJmyO0Onjh3w114wu1vaqd4mtZXaA03klTGa1xUVaLGM4raDqEwxi8afKK+YR 5qPQ== X-Gm-Message-State: AIVw110ZYl/3Cts4s2ghatbAGS/TRq88O8dvG5v0XklUswcZfJyWrZNM T4xtZ7rlctsUFHU+ X-Received: by 10.98.36.19 with SMTP id r19mr52462660pfj.95.1499841290187; Tue, 11 Jul 2017 23:34:50 -0700 (PDT) Received: from localhost ([122.167.138.108]) by smtp.gmail.com with ESMTPSA id 71sm2668797pge.45.2017.07.11.23.34.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 23:34:49 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman Cc: Viresh Kumar , Vincent Guittot , Rob Herring , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC v2 2/6] drivers: boot_constraint: Add support for supply constraints Date: Wed, 12 Jul 2017 12:04:32 +0530 Message-Id: <9a0ae6f5bf543373f6a3e51fd6e83706c3cb9683.1499770771.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 setting a voltage range 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. Signed-off-by: Viresh Kumar --- drivers/base/boot_constraint.c | 88 +++++++++++++++++++++++++++++++++++++++++ include/linux/boot_constraint.h | 8 +++- 2 files changed, 95 insertions(+), 1 deletion(-) -- 2.13.0.71.gd7076ec9c9cb diff --git a/drivers/base/boot_constraint.c b/drivers/base/boot_constraint.c index 7dc7b6132765..4e4332751c5f 100644 --- a/drivers/base/boot_constraint.c +++ b/drivers/base/boot_constraint.c @@ -15,6 +15,7 @@ #include #include #include +#include #include struct constraint { @@ -43,6 +44,8 @@ static LIST_HEAD(constraint_devices); static DEFINE_MUTEX(constraint_devices_mutex); /* Forward declarations of constraints */ +static int constraint_supply_add(struct constraint *constraint, void *data); +static void constraint_supply_remove(struct constraint *constraint); /* Boot constraints core */ @@ -115,6 +118,10 @@ static struct constraint *constraint_allocate(struct constraint_dev *cdev, void (*remove)(struct constraint *constraint); switch (type) { + case BOOT_CONSTRAINT_SUPPLY: + add = constraint_supply_add; + remove = constraint_supply_remove; + break; default: return ERR_PTR(-EINVAL); } @@ -217,3 +224,84 @@ void boot_constraints_remove(struct device *dev) unlock: mutex_unlock(&constraint_devices_mutex); } + + +/* Boot constraints */ + +/* Boot constraint - Supply */ + +struct constraint_supply { + struct boot_constraint_supply_info supply; + struct regulator *reg; +}; + +static int constraint_supply_add(struct constraint *constraint, void *data) +{ + struct 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; + } + + 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: + regulator_set_voltage(csupply->reg, 0, INT_MAX); +free_regulator: + regulator_put(csupply->reg); +free: + kfree(csupply); + + return ret; +} + +static void constraint_supply_remove(struct constraint *constraint) +{ + struct constraint_supply *csupply = constraint->private; + struct device *dev = constraint->cdev->dev; + int ret; + + ret = regulator_disable(csupply->reg); + if (ret) + dev_err(dev, "regulator_disable failed (%d)\n", ret); + + 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_const(csupply->supply.name); + kfree(csupply); +} diff --git a/include/linux/boot_constraint.h b/include/linux/boot_constraint.h index 99f268447f72..110e5eca36c6 100644 --- a/include/linux/boot_constraint.h +++ b/include/linux/boot_constraint.h @@ -13,7 +13,13 @@ struct device; enum boot_constraint_type { - BOOT_CONSTRAINT_NONE, + BOOT_CONSTRAINT_SUPPLY, +}; + +struct boot_constraint_supply_info { + const char *name; + unsigned int u_volt_min; + unsigned int u_volt_max; }; struct boot_constraint_info { From patchwork Wed Jul 12 06:34:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 107447 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp433231qge; Tue, 11 Jul 2017 23:36:04 -0700 (PDT) X-Received: by 10.98.20.21 with SMTP id 21mr54343663pfu.29.1499841364725; Tue, 11 Jul 2017 23:36:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499841364; cv=none; d=google.com; s=arc-20160816; b=AkD3F3IuQEEWM6T3r2JG19rX6w9QTRPQ3lZ3722RjnZOKnj/z1hhCaSLF+7Gi3kPgr 7scwZhi9nrIUcx++pzmUJ9zwpomL+v2b2KOovSxCl4LpaHNauUI+2bukzEd6DdUDfYnA 30hNocUiuKrMFx2p+x56eg24l7XmGmWIdIn1ViwTAvuiGzy48hFCSfSr3h+jvG/oT5aX 7Br6HBzOBqKhW9seRjWaBcIhQY2e6sLAg32rb35PlSqH6EAnFjBX+0QJ2VlbOT58udLA Nvjqy1jaZutcEK6ntM8JwNs0ugaBTVSArcZxy9hx7Gxxo1toI+llxq3YT1+h7i8VwXuD qplw== 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=JN2s3a0iKOt7yZpQvgFqmRb/Kxe2j8m64PVCr/uK68k=; b=Ujnzq/aAbe9fbUFuLBGx2mukVwWMouIPf0oSQJlxmL2KhzJVZRZ38m4d7Zl7/JwbPE ct74FLgbNxsfp6ut+n5YOb/f6SDvSe8NNVET+HzqnL71u1gAYkd08kJXB1ZnmhI3l2/s w4mgKzdbBZqYlrnEqH0M250EzPzF1cc3AcjK3b00jd25c97Th0k3kv/SMd7T2yjJHVTe CK1AFVoNFArZAjclKp+d45z/8YJqocYlMRd3AaoUJ+RYO/O0xhz3XNeY8nhdP2ckSd41 siOMC9a4xjwyaSVDMrtLoNFwZXe8beuxkfqxOQzJxAcx5kw/0P6x6okDgD45AaqAr8+P bE1A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=UI+hRtQX; 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 t1si1258344pfj.130.2017.07.11.23.36.04; Tue, 11 Jul 2017 23:36: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=UI+hRtQX; 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 S1756619AbdGLGe4 (ORCPT + 25 others); Wed, 12 Jul 2017 02:34:56 -0400 Received: from mail-pf0-f181.google.com ([209.85.192.181]:33098 "EHLO mail-pf0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756455AbdGLGex (ORCPT ); Wed, 12 Jul 2017 02:34:53 -0400 Received: by mail-pf0-f181.google.com with SMTP id e7so8025181pfk.0 for ; Tue, 11 Jul 2017 23:34:53 -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=JN2s3a0iKOt7yZpQvgFqmRb/Kxe2j8m64PVCr/uK68k=; b=UI+hRtQXKHzHjDUZCip91tPgbNiPlDzHyskaiEhRp/wzn++7hglhjrN6Sh/h+TnQ6k wjbbhj/xHrPoGsZaxtl6yjku9Jf9/iUqxpzyg8S70aNT8RPE99C5bsqQ8MzXbkgz1Je8 sAa4DkFeLEkIJlvNKO+GqDs54z59RfPzRsVl4= 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=JN2s3a0iKOt7yZpQvgFqmRb/Kxe2j8m64PVCr/uK68k=; b=iQO77oLhTvBQ6dpdI1d096PUxSIgYChpVw8xIxInv4aep1TRv2Y5w7rgDM5bP35qZf 7KMUpCnipU1+IS4jBqiVkvGGdx89MtCdhHNkdoRUbYob2iwDmxMAY1T8XGvpXekKHJKk CVAd+GnRf474RMVYXUxgkUk10KRe1FtqHhYZU+vLl0PRHKIPLaob2YdEXS803wVFYfzo kilN3Ws6HyfqscAWU9v5nkw2Y7Hoy9YdCb5Wrl2mw52Kfbn1UYmWnNDYo5wppEsmonwJ S+jF3rmy/tI7yF2OfM7vbeYm3s//3/g06xEJ69XWRNwXtjdTqt79wPjjCl946phDNXOf PMew== X-Gm-Message-State: AIVw112izJ4CaKeDvm8fVxlC/nCkM7BYZ6bMu+NuzK3NbOT66GvlTO21 mOIB/k+dwGQrrQGv X-Received: by 10.98.178.15 with SMTP id x15mr52878276pfe.75.1499841293091; Tue, 11 Jul 2017 23:34:53 -0700 (PDT) Received: from localhost ([122.167.138.108]) by smtp.gmail.com with ESMTPSA id 8sm2649133pfs.23.2017.07.11.23.34.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 23:34:52 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman , Jonathan Corbet Cc: Viresh Kumar , Vincent Guittot , Rob Herring , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org Subject: [RFC v2 3/6] drivers: boot_constraint: Add boot_constraints_disable kernel parameter Date: Wed, 12 Jul 2017 12:04:33 +0530 Message-Id: <8bcfe99c1392bee097199b682fa922f36a842857.1499770771.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 Users must be given an option to discard any constraints set by bootloaders. For example, consider that a constraint is set for the LCD controller's supply and the LCD driver isn't loaded by the kernel. If the user doesn't need to use the LCD device, then he shouldn't be forced to honour the constraint. We can also think about finer control of such constraints with help of some sysfs files, but a kernel parameter is fine to begin with. Signed-off-by: Viresh Kumar --- Documentation/admin-guide/kernel-parameters.txt | 3 +++ drivers/base/boot_constraint.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) -- 2.13.0.71.gd7076ec9c9cb diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 7737ab5d04b2..59ad24822d10 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -426,6 +426,9 @@ embedded devices based on command line input. See Documentation/block/cmdline-partition.txt + boot_constraints_disable + Do not set any boot constraints for devices. + boot_delay= Milliseconds to delay each printk during boot. Values larger than 10 seconds (10000) are changed to no delay (0). diff --git a/drivers/base/boot_constraint.c b/drivers/base/boot_constraint.c index 4e4332751c5f..d372ddfe1264 100644 --- a/drivers/base/boot_constraint.c +++ b/drivers/base/boot_constraint.c @@ -47,6 +47,17 @@ static DEFINE_MUTEX(constraint_devices_mutex); static int constraint_supply_add(struct constraint *constraint, void *data); static void constraint_supply_remove(struct constraint *constraint); +static bool boot_constraints_disabled; + +static int __init constraints_disable(char *str) +{ + boot_constraints_disabled = true; + pr_debug("disabled\n"); + + return 0; +} +early_param("boot_constraints_disable", constraints_disable); + /* Boot constraints core */ @@ -154,6 +165,9 @@ int boot_constraint_add(struct device *dev, enum boot_constraint_type type, struct constraint *constraint; int ret; + if (boot_constraints_disabled) + return -ENODEV; + mutex_lock(&constraint_devices_mutex); /* Find or add the cdev type first */ @@ -211,6 +225,9 @@ void boot_constraints_remove(struct device *dev) struct constraint_dev *cdev; struct constraint *constraint, *temp; + if (boot_constraints_disabled) + return; + mutex_lock(&constraint_devices_mutex); cdev = constraint_device_find(dev); From patchwork Wed Jul 12 06:34:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 107444 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp432803qge; Tue, 11 Jul 2017 23:35:29 -0700 (PDT) X-Received: by 10.99.117.94 with SMTP id f30mr2293339pgn.197.1499841329005; Tue, 11 Jul 2017 23:35:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499841328; cv=none; d=google.com; s=arc-20160816; b=zey76jNyBLQ98wW46q0++d3n0xRjEEAQlycqP39TBRR8/7vqnuxIafotdIycLFSw9Q x4SCVm8odfRfzZuj60Q3Urd+kezFvKHvv9v4ZG2dqBRfFIHLvgIw/JLGuw3HUvqeMYns JCN8DPEp/akoS4mbhJ4lsAy2U5i4Xuc5gqK6Wo7p34ycXDTTyB1AT8H8J0PM7xn13DoS 5cYJkxN0w4L++ITgKUlZMtarZMlBSQ8DdskQvQu8bu5ENEoz4wLQw4jSHhMFbXMBIaMk YgFSfKqxTL1fM9gtVvViC+RNOwVRjBxlAZs05YoJwQve3Dq/W7RH0oHLSPCelYb4GdE8 xFEg== 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=0Blu/aTAvn5OqHYZR7PoOCnkMR5Y1/Y/TlE5/ep+TC8=; b=dXTwSO8dfbNSi/kkbISdIJPW2Pt0kvlAnFMvUBAYDYGQNtvbhIwELBRZCtDpA2we8+ aTULq7eYkucc/NxgVB/ET1/tJzRj/MtZCnaeshMjv52sc2hFG0HqtMh6qKHtYvL4SpU6 hV1u+7+O18G0qlCprpt8w9YrYl6vQeM7SNvusMFv5TP070yd5pp/WeQvUiSt91Xdrmq0 Wy4rH7z+bgHPaZHwp0ufjlnSPi8nlf1GmXyOcowcZrQjWLXGvFkj1e3T6Xqnxy/5OvxQ X4xrH5IlClDW9uVfO4brOUZGaSptjqH6uNd9pJu8ACM3Phf/kGo+CA+buKWGP+ZaPeYh cs8g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=ELsRujEb; 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 j1si1272640pld.16.2017.07.11.23.35.28; Tue, 11 Jul 2017 23:35:28 -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=ELsRujEb; 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 S1756698AbdGLGfF (ORCPT + 25 others); Wed, 12 Jul 2017 02:35:05 -0400 Received: from mail-pg0-f49.google.com ([74.125.83.49]:32879 "EHLO mail-pg0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756632AbdGLGe5 (ORCPT ); Wed, 12 Jul 2017 02:34:57 -0400 Received: by mail-pg0-f49.google.com with SMTP id k14so8072824pgr.0 for ; Tue, 11 Jul 2017 23:34:56 -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=0Blu/aTAvn5OqHYZR7PoOCnkMR5Y1/Y/TlE5/ep+TC8=; b=ELsRujEbxUTuCdeTZc4IxhixFHN81pG92Nj00Th6OWA+U/A9bjHD+gpuLbgwiDKzWR TrmtRNKesVFz0oynnqxgOiX03uhGPXhawNXrmyBGofAvtQsRfC5NT4JPalBN2Bo9HNuY Xv2/ZwAQp3CcXBWJedy/edz4yfUmF9N+yxfCg= 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=0Blu/aTAvn5OqHYZR7PoOCnkMR5Y1/Y/TlE5/ep+TC8=; b=DYyuZ38dbLi0DV6RB2aajcEqm1qHbtdicxNft29Lxy6V6PUFYOHEzHAJw3TMAjNFug ytPBmcCLyXe23DT3XMyrtYbhT73AIvf/+IZKNa8orlOSJ3yDnyCc37cUAKNeG9k4kOBF 4gPUErNwLEQq0vj/s5ISA2p/vww6UNGlMGXoTW5a4U/DgkjVAQzZQJs+qD/4MAUND6iO WJZIUMCKIWqRKHJhwdou2A/Wkr+IIs1ZwbLNjRWCpdZzqg8hyQPG3tDSgSrgbDwHA0Vb 0akz/XuwRqvJnVNeYVCRLOoOwWCWILpdy8oaQr3e2UyidZ4KSSclcWqK6hQJLTTNVCgT bRaw== X-Gm-Message-State: AIVw112n0I1iT/cY4HdemdESkbbtakFxclpDvR1sN08nZRNl6rJf7836 atGq3x8A76kCb4+N X-Received: by 10.99.60.28 with SMTP id j28mr2270194pga.18.1499841296308; Tue, 11 Jul 2017 23:34:56 -0700 (PDT) Received: from localhost ([122.167.138.108]) by smtp.gmail.com with ESMTPSA id q67sm2580908pfi.81.2017.07.11.23.34.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 23:34:55 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman Cc: Viresh Kumar , Vincent Guittot , Rob Herring , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [RFC v2 4/6] drivers: boot_constraint: Add debugfs support Date: Wed, 12 Jul 2017 12:04:34 +0530 Message-Id: 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 debugfs support for boot constraints. This is how it looks for a "vmmc-supply" constraint for the MMC device. $ ls -R /sys/kernel/debug/boot_constraints/ /sys/kernel/debug/boot_constraints/: f723d000.dwmmc0 /sys/kernel/debug/boot_constraints/f723d000.dwmmc0: supply-vmmc /sys/kernel/debug/boot_constraints/f723d000.dwmmc0/supply-vmmc: u_volt_max u_volt_min Signed-off-by: Viresh Kumar --- drivers/base/boot_constraint.c | 80 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) -- 2.13.0.71.gd7076ec9c9cb diff --git a/drivers/base/boot_constraint.c b/drivers/base/boot_constraint.c index d372ddfe1264..4e3b5e1aec7c 100644 --- a/drivers/base/boot_constraint.c +++ b/drivers/base/boot_constraint.c @@ -10,6 +10,7 @@ #define pr_fmt(fmt) "Boot Constraints: " fmt #include +#include #include #include #include @@ -24,6 +25,7 @@ struct constraint { enum boot_constraint_type type; void (*free_resources)(void *data); void *free_resources_data; + struct dentry *dentry; int (*add)(struct constraint *constraint, void *data); void (*remove)(struct constraint *constraint); @@ -34,6 +36,7 @@ struct constraint_dev { struct device *dev; struct list_head node; struct list_head constraints; + struct dentry *dentry; }; #define for_each_constraint(_constraint, _temp, _cdev) \ @@ -59,6 +62,71 @@ static int __init constraints_disable(char *str) early_param("boot_constraints_disable", constraints_disable); +/* Debugfs */ + +static struct dentry *rootdir; + +static void constraint_device_add_debugfs(struct constraint_dev *cdev) +{ + struct device *dev = cdev->dev; + + cdev->dentry = debugfs_create_dir(dev_name(dev), rootdir); + if (!cdev->dentry) + dev_err(dev, "Failed to create constraint dev debugfs dir\n"); +} + +static void constraint_device_remove_debugfs(struct constraint_dev *cdev) +{ + debugfs_remove_recursive(cdev->dentry); +} + +static void constraint_add_debugfs(struct constraint *constraint, + const char *suffix) +{ + struct device *dev = constraint->cdev->dev; + const char *prefix; + char name[NAME_MAX]; + + switch (constraint->type) { + case BOOT_CONSTRAINT_SUPPLY: + prefix = "supply"; + break; + default: + dev_err(dev, "%s: Constraint type (%d) not supported\n", + __func__, constraint->type); + return; + } + + snprintf(name, NAME_MAX, "%s-%s", prefix, suffix); + + constraint->dentry = debugfs_create_dir(name, constraint->cdev->dentry); + if (!constraint->dentry) + dev_err(dev, "Failed to create constraint (%s) debugfs dir\n", + name); +} + +static void constraint_remove_debugfs(struct constraint *constraint) +{ + debugfs_remove_recursive(constraint->dentry); +} + +static int __init constraint_debugfs_init(void) +{ + if (boot_constraints_disabled) + return -ENODEV; + + /* Create /sys/kernel/debug/opp directory */ + rootdir = debugfs_create_dir("boot_constraints", NULL); + if (!rootdir) { + pr_err("Failed to create root directory\n"); + return -ENOMEM; + } + + return 0; +} +core_initcall(constraint_debugfs_init); + + /* Boot constraints core */ static struct constraint_dev *constraint_device_find(struct device *dev) @@ -86,12 +154,14 @@ static struct constraint_dev *constraint_device_allocate(struct device *dev) INIT_LIST_HEAD(&cdev->constraints); list_add(&cdev->node, &constraint_devices); + constraint_device_add_debugfs(cdev); return cdev; } static void constraint_device_free(struct constraint_dev *cdev) { + constraint_device_remove_debugfs(cdev); list_del(&cdev->node); kfree(cdev); } @@ -292,6 +362,15 @@ static int constraint_supply_add(struct constraint *constraint, void *data) csupply->supply.name = kstrdup_const(supply->name, GFP_KERNEL); constraint->private = csupply; + /* Debugfs */ + constraint_add_debugfs(constraint, supply->name); + + debugfs_create_u32("u_volt_min", 0444, constraint->dentry, + &csupply->supply.u_volt_min); + + debugfs_create_u32("u_volt_max", 0444, constraint->dentry, + &csupply->supply.u_volt_max); + return 0; remove_voltage: @@ -319,6 +398,7 @@ static void constraint_supply_remove(struct constraint *constraint) dev_err(dev, "regulator_set_voltage failed (%d)\n", ret); regulator_put(csupply->reg); + constraint_remove_debugfs(constraint); kfree_const(csupply->supply.name); kfree(csupply); } From patchwork Wed Jul 12 06:34:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 107445 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp432805qge; Tue, 11 Jul 2017 23:35:29 -0700 (PDT) X-Received: by 10.101.70.15 with SMTP id v15mr2268710pgq.229.1499841329443; Tue, 11 Jul 2017 23:35:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499841329; cv=none; d=google.com; s=arc-20160816; b=kHxGSZNxBNxuACu82ZlauBPDchz7Vllp/sl7F83UQzmRXcOdkc5/2z60EaRG0wcPtr 6DupCOc9LgSLC+8Nb9KCoEVOzbJdNjDbTco4lALI0B+UfnnJaCz8XC2oXMURWqGgzG6H 9zClTpk7tNMfjsznmWRdDBAoaWLk5O0P5cEWvDMj47NkWCCMWSsZmvX44047s6DVN4Oa L9LCn0/XwWeWhD1umfKfKkI4txSWCr22qPBXxI0ZuN2oBH/soDEn4n4/LfnBQuOxd5er Cb0E6D3LSJFwP4Li5QkGZLmLDjMFdPLZHd/GwnaZ1JNY1qk/iQaSKu002/ti0U5cYejD X6XQ== 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=6QubhvYZiBgYMMjWZt5eTfe/h08H/7pi5xeESTfWzRI=; b=iAJQAMyVOIqxm+hfc0/TjYnIsj0vJbmRBTxoZYyddIRlnshJhXggYFhHyqqllFCFZk XN2LPfCgVAlkKTeZr2EaqXGm+HQ/U9ufDTRIFyBqjZtLtqJDo9lqVRrFHCjtfj9FhPYG 2+4X3sUUQod022uBm1C8QhLMgyP2ngtNdUXVm3jI60e3XAYJecVDITZuJrDKhsqPqe1Q sMleH9V4Br/2VIwr9hd8zqAbTrc6vmN/7wqGodLvRN99Ily1w2fFCPsxPRMPK5pkfGDI V2PRlStwBYY9eSc9VtlzTnk4zM9NQMBTkQqemKkZVdhIyz1+NnoJW31aEczdLSu795YK 7OKw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=TFuR5/GB; 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 j1si1272640pld.16.2017.07.11.23.35.29; Tue, 11 Jul 2017 23:35:29 -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=TFuR5/GB; 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 S1756713AbdGLGfI (ORCPT + 25 others); Wed, 12 Jul 2017 02:35:08 -0400 Received: from mail-pg0-f41.google.com ([74.125.83.41]:35747 "EHLO mail-pg0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756694AbdGLGfF (ORCPT ); Wed, 12 Jul 2017 02:35:05 -0400 Received: by mail-pg0-f41.google.com with SMTP id j186so8004666pge.2 for ; Tue, 11 Jul 2017 23:35:05 -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=6QubhvYZiBgYMMjWZt5eTfe/h08H/7pi5xeESTfWzRI=; b=TFuR5/GBbjyj/0On8L9Bz9QIFEB5GI8s0r1x+JjvxdA8PMqeUEVQUGnQ85Cv9IVbOa lsJJvr3bnne7b5hIAIDPZFLRhnu/lLiV8swVAiFKiepVNCE4f1sB92vNprdFmavCPYgg nFaiRZVhuUC1LxB8VTIkyXTnniB/KwPNLGTI0= 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=6QubhvYZiBgYMMjWZt5eTfe/h08H/7pi5xeESTfWzRI=; b=cDO1oIzoy4vC0ZgXaWl2oY4ZuC94rgAxI7J7a9CzX9xUzWlIshQsTk8JuyAHP1TKg1 6j5VlVPWzVwp1Z2FOOtZddQKKFoVcdyEsWshl2xxjkWoAc59inxJs+yTtanVyVRmJdzc r4WzlMEZlXqqpqxPOTu7uhIlnV2630xpENYc6NJr/NBKSmT5M5He2SSAPY8TFpJKtYaq OyOGe/qKvbcyUftHmnc3Oh3FguOan73juYJnZz/QOlK3iUyvlNGXcFdXCgFK/aalWGw3 fTuv0Ne1OrFWPSyuv7259KT6MOGd5JYGJiKqolcFssTl0nYSq0Y89+AejpGNqOWZ4LMj P/Bw== X-Gm-Message-State: AIVw111TbmmrcT0vzaPK9Z+qjHoadPkCD74Wdm9V+55SjFdt+mf6O127 GeAA9BvVi2BHIb26 X-Received: by 10.101.77.69 with SMTP id j5mr2247397pgt.133.1499841299289; Tue, 11 Jul 2017 23:34:59 -0700 (PDT) Received: from localhost ([122.167.138.108]) by smtp.gmail.com with ESMTPSA id y192sm2018488pgd.38.2017.07.11.23.34.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 23:34:58 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman , Rob Herring , Mark Rutland Cc: Viresh Kumar , Vincent Guittot , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org Subject: [RFC v2 5/6] drivers: boot_constraint: Add initial DT bindings Date: Wed, 12 Jul 2017 12:04:35 +0530 Message-Id: <0610277aef9830cff53b7b53cf41cc54886fdc7f.1499770771.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 adds device tree bindings for boot constraints. Only power supply constraint types are supported currently. Signed-off-by: Viresh Kumar --- .../devicetree/bindings/boot-constraints.txt | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Documentation/devicetree/bindings/boot-constraints.txt -- 2.13.0.71.gd7076ec9c9cb diff --git a/Documentation/devicetree/bindings/boot-constraints.txt b/Documentation/devicetree/bindings/boot-constraints.txt new file mode 100644 index 000000000000..9a01ea1e6e72 --- /dev/null +++ b/Documentation/devicetree/bindings/boot-constraints.txt @@ -0,0 +1,68 @@ +BOOT CONSTRAINTS +================ + +Some devices are powered ON by the bootloader before the bootloader handovers +control to the Operating System (OS). It maybe important for those devices to +keep working until the time the OS takes over and starts configuring the devices +again. + +A typical example of that can be the LCD controller, which is used by the +bootloaders to show image(s) while the platform is booting into the Operating +System. The LCD controller can be using some resources, like clk, supplies, etc, +that are shared between several devices. These shared resources should be +configured to satisfy need of all the users. If another device's (X) driver gets +probed before the LCD controller driver in this case, then it may end up +reconfiguring these resources to ranges satisfying the current users (only +device X) and that can make the LCD screen unstable. + +This document describes the binding used to specify such boot constraints to the +OS. + +Power Supply Constraints: +------------------------- + +This describes the binding of constraints for the power supply resources. These +must be present directly in the consumer device's node. + +Required properties: +- boot-constraint-supplies: + + This contains an array of (one or more) strings, each of which must match with + the of a corresponding -supply property in the same device node. + This is required for the OS to know about the power supplies that are + configured (and enabled) by the bootloader for the consumer device. + + It is assumed that the power supply is already enabled by the bootloader. + +- boot-constraint-uV: + + This contains an array of {min max} microvolt tuples for the power supplies in + the same order in which they are present in "boot-constraint-supplies" + property. Here, min is the smallest and max is the largest voltage that the + consumer (corresponding to the device node where this property is present) may + set. + +Example of a consumer device node (mmc) referencing two regulators and setting +their boot constraints (twl_reg1 and twl_reg2): + + twl_reg1: regulator@0 { + ... + ... + ... + }; + + twl_reg2: regulator@1 { + ... + ... + ... + }; + + mmc: mmc@0x0 { + ... + ... + vmmc-supply = <&twl_reg1>; + vmmcaux-supply = <&twl_reg2>; + boot-constraint-supplies = "vmmc", "vmmcaux"; + boot-constraint-uV = <1800000 2000000>, /* vmmc */ + <2000000 2000000>; /* vmmcaux */ + }; From patchwork Wed Jul 12 06:34:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 107446 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp432814qge; Tue, 11 Jul 2017 23:35:30 -0700 (PDT) X-Received: by 10.98.206.67 with SMTP id y64mr53597395pfg.108.1499841329890; Tue, 11 Jul 2017 23:35:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499841329; cv=none; d=google.com; s=arc-20160816; b=qi/HTqTuP19sPWgtG8PQUsT/z4o9ZURz33b5trNIz5rvzmluTjlWiKYwIluESGwf2d 5Kc9c0ISBsCV/MSjfLimVLxTIRB++fYhSkjncQhpxPTCViJGDzBSm0vg53/YtAiXkZ6v 9Ml/PN/TT112E0Ist21VWSLgamjANKNugic5SNm4nmptzndNIZ7MbDCRxcPIOzb3Nids VxNRuF8xeZWgUz2OkSmNgaQgc618YsQNr50sALfHa9IW8LHQg6nGKg/btM7hWfiZNzAB MFHskNuqwrYiDheFrXfMPwd5uMBK8+osLSby8ylOLub0se0tCxi8rT7Mn2ME3AnxXY0N X4sQ== 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=GWGI79/ndSZf0l1Xlb5CvTkRht+8YQtiIxYyryWB2yE=; b=PE+RvaXoZRKoMQ8yX+u9SdIrWVZR8nbFEO2ANjCILc4X8XbYfri53CRpsdS/apQDgu /e06ceZEN2UReDLCINwCHimIE7s1kYRp1UcJbN82KhajxTiL2tH1Qbe54gug8dYeOo98 59/64iejlHkX5Y9S1YqscyMs11i67A8jqgdlyAInn58H9Dcl2wz2RTF/a+hxHExe7fci TlA7tY7kKKKx2k4+8vXHSUDy0bk0lMsqfqaO3R6d4K+LmzUjhkEOUAOhE5WYRm0pht3V nOu5sG9Mv6oA5CWLoVamO8uc+wBw71edZ5AYWeEmbgQFXBeZtgMaVFzjK23G2KmCcjFE zHXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=c8rneFeQ; 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 j1si1272640pld.16.2017.07.11.23.35.29; Tue, 11 Jul 2017 23:35:29 -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=c8rneFeQ; 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 S1756725AbdGLGfM (ORCPT + 25 others); Wed, 12 Jul 2017 02:35:12 -0400 Received: from mail-pg0-f44.google.com ([74.125.83.44]:35764 "EHLO mail-pg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756712AbdGLGfI (ORCPT ); Wed, 12 Jul 2017 02:35:08 -0400 Received: by mail-pg0-f44.google.com with SMTP id j186so8005349pge.2 for ; Tue, 11 Jul 2017 23:35:03 -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=GWGI79/ndSZf0l1Xlb5CvTkRht+8YQtiIxYyryWB2yE=; b=c8rneFeQV9DgJHurKFYndxC7hlyvHOgLkntpIakvel7bZ5y+S6RR8x1qZHY7BrzgRK uF96xdtc/D4FfmXhMRXE4Yu9pfMGwvNQOTFLwWGhLOua22v0fRsr/N0UweWO4Ocficjh 3BYZBncrdw7aVF7I4yvnCf2tN7ZFZ90zKWzLA= 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=GWGI79/ndSZf0l1Xlb5CvTkRht+8YQtiIxYyryWB2yE=; b=h5irodZCoJd1EFGfk0We3o3IXHLr8ABE2A4UIhO8oKF26zai+IIn3c9zuVEbQppLwi 9ZBjSlPL5mQ+ikypNAgJ9ImLm2bLt8vaU5Gs7aiwQROqLiRn4XIm8YcOyku2xjdams+K ZA893QdXPlBD39bb6+x8/v2zDpFEEl9FLwZ7LqmhYMFgVnTHtJt0iG8AYrYrsXEVjjD9 EPBUaLzP0bhGTWwf4a9Tdj3lTpngG2I5rVWvuI7Y4nEgNqwqXPZqvnK3AGUR/U94Nsj+ 1ZaYk4V9OXqqzu+zhC5nTPPlZefdXGWvZzWT2aiGgKEiE/+YaGa9U2H79v7aplpIE2Wo GUjQ== X-Gm-Message-State: AIVw113G3OtZ1gYT0svuuvN9v2Jm0N5BwgMXTp2E9XX/rWvZNF0MQPau TlGZ7d80CkImZCU5 X-Received: by 10.98.7.204 with SMTP id 73mr45722056pfh.110.1499841302695; Tue, 11 Jul 2017 23:35:02 -0700 (PDT) Received: from localhost ([122.167.138.108]) by smtp.gmail.com with ESMTPSA id t23sm2136538pgb.25.2017.07.11.23.35.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jul 2017 23:35:02 -0700 (PDT) From: Viresh Kumar To: Greg Kroah-Hartman , Rob Herring , Frank Rowand Cc: Viresh Kumar , Vincent Guittot , Mark Brown , Stephen Boyd , Rajendra Nayak , Shiraz Hashim , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org Subject: [RFC v2 6/6] drivers: boot_constraint: Add constraints for OF devices Date: Wed, 12 Jul 2017 12:04:36 +0530 Message-Id: <2d53af367f7d912338d5d00e8fb7065b8ce45548.1499770771.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 implements the device tree dependent part of the boot constraints. The supply constraints are added automatically for the platform and AMBA devices created from DT and will be removed after the driver is registered for the devices. It is possible that some of the resources aren't available at the time when the devices are added and so the boot constraints core will return -EPROBE_DEFER for them. In order to retry adding the constraints at a later point of time (after the resource is added and before any of its users come up), this patch proposes two things: - Each constraint is represented by a virtual platform device, so that it is re-probed again until the time all the dependencies aren't met. The platform device is removed along with the constraint, with help of the free_resources() callback. - Enable early defer probing support by calling driver_enable_deferred_probe(), so that the core retries probing deferred devices every time any device is bound to a driver. This makes sure that the constraint is set before any of the users of the resources come up. This is tested on ARM64 Hikey board where probe was deferred for a device. Signed-off-by: Viresh Kumar --- drivers/base/Makefile | 3 + drivers/base/base.h | 1 + drivers/base/boot_constraint.c | 2 +- drivers/base/boot_constraint_of.c | 122 ++++++++++++++++++++++++++++++++++++++ drivers/base/dd.c | 12 ++++ drivers/of/platform.c | 4 ++ include/linux/boot_constraint.h | 2 + 7 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 drivers/base/boot_constraint_of.c -- 2.13.0.71.gd7076ec9c9cb diff --git a/drivers/base/Makefile b/drivers/base/Makefile index 6094b3b75184..0f47a5de585a 100644 --- a/drivers/base/Makefile +++ b/drivers/base/Makefile @@ -6,6 +6,9 @@ obj-y := component.o core.o bus.o dd.o syscore.o \ attribute_container.o transport_class.o \ topology.o container.o property.o cacheinfo.o obj-$(CONFIG_BOOT_CONSTRAINTS) += boot_constraint.o +ifeq ($(CONFIG_OF),y) +obj-$(CONFIG_BOOT_CONSTRAINTS) += boot_constraint_of.o +endif obj-$(CONFIG_DEVTMPFS) += devtmpfs.o obj-$(CONFIG_DMA_CMA) += dma-contiguous.o obj-y += power/ diff --git a/drivers/base/base.h b/drivers/base/base.h index e19b1008e5fb..9d6910cdbc8e 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -136,6 +136,7 @@ extern char *make_class_name(const char *name, struct kobject *kobj); extern int devres_release_all(struct device *dev); extern void device_block_probing(void); extern void device_unblock_probing(void); +extern void driver_enable_deferred_probe(void); /* /sys/devices directory */ extern struct kset *devices_kset; diff --git a/drivers/base/boot_constraint.c b/drivers/base/boot_constraint.c index 4e3b5e1aec7c..80ac3f9aaa72 100644 --- a/drivers/base/boot_constraint.c +++ b/drivers/base/boot_constraint.c @@ -50,7 +50,7 @@ static DEFINE_MUTEX(constraint_devices_mutex); static int constraint_supply_add(struct constraint *constraint, void *data); static void constraint_supply_remove(struct constraint *constraint); -static bool boot_constraints_disabled; +bool boot_constraints_disabled; static int __init constraints_disable(char *str) { diff --git a/drivers/base/boot_constraint_of.c b/drivers/base/boot_constraint_of.c new file mode 100644 index 000000000000..671241b3d3a3 --- /dev/null +++ b/drivers/base/boot_constraint_of.c @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2017 Linaro. + * Viresh Kumar + * + * This file is released under the GPLv2. + */ + +#define pr_fmt(fmt) "Boot Constraints: " fmt + +#include +#include +#include +#include + +#include "base.h" + +extern bool boot_constraints_disabled; + +struct boot_constraint_of_pdata { + struct device *dev; + enum boot_constraint_type type; + struct boot_constraint_supply_info info; +}; + +static void boot_constraint_add_supply(struct device *dev, int index) +{ + struct boot_constraint_of_pdata pdata = { + .dev = dev, + .type = BOOT_CONSTRAINT_SUPPLY, + }; + struct boot_constraint_supply_info *info; + struct device_node *np = dev->of_node; + struct platform_device *pdev; + int ret; + + info = &pdata.info; + + ret = of_property_read_string_index(np, "boot-constraint-supplies", + index, &info->name); + if (ret < 0) { + dev_err(dev, "%s: Failed to read supply at index %d (%d)\n", + __func__, index, ret); + return; + } + + of_property_read_u32_index(np, "boot-constraint-uV", 2 * index, + &info->u_volt_min); + + of_property_read_u32_index(np, "boot-constraint-uV", 2 * index + 1, + &info->u_volt_max); + + pdev = platform_device_register_data(NULL, "boot-constraints-of", index, + &pdata, sizeof(pdata)); + if (IS_ERR(pdev)) { + dev_err(dev, "%s: Failed to create pdev for index %d (%d)\n", + __func__, index, ret); + } +} + +static void boot_constraint_add_supplies(struct device *dev) +{ + struct device_node *np = dev->of_node; + int i, count; + + count = of_property_count_strings(np, "boot-constraint-supplies"); + if (count <= 0) + return; + + for (i = 0; i < count; i++) + boot_constraint_add_supply(dev, i); +} + +void of_boot_constraint_init(struct device *dev) +{ + if (boot_constraints_disabled) + return; + + BUG_ON(!dev->of_node); + + boot_constraint_add_supplies(dev); +} + +static void boot_constraint_remove_of(void *data) +{ + platform_device_unregister(data); +} + +/* + * A platform device is added for each and every constraint, to handle + * -EPROBE_DEFER properly. + */ +static int boot_constraint_of_probe(struct platform_device *pdev) +{ + struct boot_constraint_of_pdata *pdata = dev_get_platdata(&pdev->dev); + struct boot_constraint_info info; + int ret; + + BUG_ON(!pdata); + + info.free_resources = boot_constraint_remove_of; + info.free_resources_data = pdev; + info.constraint_info = &pdata->info; + + ret = boot_constraint_add(pdata->dev, pdata->type, &info); + if (ret == -EPROBE_DEFER) + driver_enable_deferred_probe(); + + return ret; +} + +static struct platform_driver boot_constraint_of_driver = { + .driver = { + .name = "boot-constraints-of", + }, + .probe = boot_constraint_of_probe, +}; + +static int __init boot_constraint_of_init(void) +{ + return platform_driver_register(&boot_constraint_of_driver); +} +core_initcall(boot_constraint_of_init); diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 4eb9d183d647..aa761e13d8a7 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -204,6 +204,18 @@ void device_unblock_probing(void) } /** + * driver_enable_deferred_probe() - Enable probing of deferred devices + * + * We don't want to get in the way when the bulk of drivers are getting probed + * and so deferred probe is disabled in the beginning. Enable it now because we + * need it. + */ +void driver_enable_deferred_probe(void) +{ + driver_deferred_probe_enable = true; +} + +/** * deferred_probe_initcall() - Enable probing of deferred devices * * We don't want to get in the way when the bulk of drivers are getting probed. diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 703a42118ffc..b88a1bf3e7fb 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -194,6 +195,8 @@ static struct platform_device *of_platform_device_create_pdata( goto err_clear_flag; } + of_boot_constraint_init(&dev->dev); + return dev; err_clear_flag: @@ -271,6 +274,7 @@ static struct amba_device *of_amba_device_create(struct device_node *node, goto err_free; } + of_boot_constraint_init(&dev->dev); return dev; err_free: diff --git a/include/linux/boot_constraint.h b/include/linux/boot_constraint.h index 110e5eca36c6..17bec71df228 100644 --- a/include/linux/boot_constraint.h +++ b/include/linux/boot_constraint.h @@ -33,10 +33,12 @@ struct boot_constraint_info { int boot_constraint_add(struct device *dev, enum boot_constraint_type type, struct boot_constraint_info *info); void boot_constraints_remove(struct device *dev); +void of_boot_constraint_init(struct device *dev); #else static inline int boot_constraint_add(struct device *dev, enum boot_constraint_type type, struct boot_constraint_info *info) { return -EINVAL; } static inline void boot_constraints_remove(struct device *dev) {} +static inline void of_boot_constraint_init(struct device *dev) {} #endif