From patchwork Tue Nov 29 15:22:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 84849 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1642476qgi; Tue, 29 Nov 2016 07:23:01 -0800 (PST) X-Received: by 10.98.133.9 with SMTP id u9mr27947703pfd.137.1480432981829; Tue, 29 Nov 2016 07:23:01 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q4si31771310plb.201.2016.11.29.07.23.01; Tue, 29 Nov 2016 07:23:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757672AbcK2PXA (ORCPT + 7 others); Tue, 29 Nov 2016 10:23:00 -0500 Received: from mail-wm0-f49.google.com ([74.125.82.49]:36258 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757483AbcK2PW6 (ORCPT ); Tue, 29 Nov 2016 10:22:58 -0500 Received: by mail-wm0-f49.google.com with SMTP id g23so241138868wme.1 for ; Tue, 29 Nov 2016 07:22:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=IhYf2LsY5a+EX0o4fyYMH5EDR84nWSlx+7I1HA+1MME=; b=NYKQGm5Om4ku8oNHSS0qCgVTEzJRm/OHU0zAGEWXvPFc0xEK29QCzzEskHW2XvTcM2 2Nwtvbc/uO0XSQuICerBLI+QbDxu9kPBIvZFyQ7W8eViM+mJSR5z2etYDt8FNip/GS7v pNn0nL6756OHaFCzLrS3nLT2pOV59v/CDjDtKHqSoJ/6HwOR1mYxaH8bHvKoWkSlimYM h0GPCJ17n/RNxcfuP0XEjgwsw86ysvRXpU6z2GqnpWWtS5MexhNVfHsOfmPbU4ct0P/Z 0fqHw30rgphk9adqBtf2A9+TBfLlvWuMraxncx3FB+uBaOseBXiVS8cOjolYALAJ+uwH +DEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=IhYf2LsY5a+EX0o4fyYMH5EDR84nWSlx+7I1HA+1MME=; b=BfZmzupmy6MeMMbnKXZIxXqn3lmlnaJAjt7/oXSyssG4Vt66OYeANB25pwRW0tygqy yWPR+2XOjlmdxYAFQemcEPOmSqg/aR+wnnOhxJD6nsxIrapvdb93olRczP453ZxdCclO DHkN6zzOXOJRIzBZGTy/o8AQ/D2/01tZIycqtszQGRwdK0Sc8ZVRUo2zlP/VwBuuTTI8 bTBPzVb79OvJNW87D9cb58lx9xW5co45jjHrqRKGc/IvJjBvGClQ62EkgKyeFco51CYu NH0y9etFToSDS1An+Oungag1CFkniAGqvKUDRnPH5ROeWZpCGcAlwtXKnivr5QJmj83z zshQ== X-Gm-Message-State: AKaTC03JdhBzTQmj5oM5f+/KymgVYODom5PPP2MBLpzcMUFWVAfnMgJgCZECw36j2HRL/Q38 X-Received: by 10.28.25.134 with SMTP id 128mr23022500wmz.37.1480432977052; Tue, 29 Nov 2016 07:22:57 -0800 (PST) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id xu5sm68173589wjc.49.2016.11.29.07.22.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 29 Nov 2016 07:22:56 -0800 (PST) From: Bartosz Golaszewski To: Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Rob Herring , Mark Rutland Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Hilman , Patrick Titiano , Neil Armstrong , Bartosz Golaszewski Subject: [PATCH] iio: misc: add a generic regulator driver Date: Tue, 29 Nov 2016 16:22:49 +0100 Message-Id: <1480432969-20913-1-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.4 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Some iio devices are powered externally by a regulator which, for example, can be used to power-cycle an adc. This patch proposes to add a simple driver representing a regulator to the iio framework which exports attributes allowing to manipulate the underlying hardware. The reason for connecting the regulator and the iio frameworks is that once libiio learns to toggle iio attributes we'll be able to power-cycle devices remotely. Initially the driver only supports enable/disable operations, but it should be straightforward to extend it with other regulator operations in the future. Tested with a baylibre-acme board for beaglebone black. Signed-off-by: Bartosz Golaszewski --- .../devicetree/bindings/iio/misc/iio-regulator.txt | 18 +++ drivers/iio/Kconfig | 1 + drivers/iio/Makefile | 1 + drivers/iio/misc/Kconfig | 17 +++ drivers/iio/misc/Makefile | 6 + drivers/iio/misc/iio-regulator.c | 121 +++++++++++++++++++++ 6 files changed, 164 insertions(+) create mode 100644 Documentation/devicetree/bindings/iio/misc/iio-regulator.txt create mode 100644 drivers/iio/misc/Kconfig create mode 100644 drivers/iio/misc/Makefile create mode 100644 drivers/iio/misc/iio-regulator.c -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/Documentation/devicetree/bindings/iio/misc/iio-regulator.txt b/Documentation/devicetree/bindings/iio/misc/iio-regulator.txt new file mode 100644 index 0000000..147458f --- /dev/null +++ b/Documentation/devicetree/bindings/iio/misc/iio-regulator.txt @@ -0,0 +1,18 @@ +Industrial IO regulator device driver +------------------------------------- + +This document describes the bindings for the iio-regulator - a dummy device +driver representing a physical regulator within the iio framework. + +Required properties: + +- compatible: must be "iio-regulator" +- vcc-supply: phandle of the regulator this device represents + +Example +------- + +iio_regulator { + compatible = "iio-regulator"; + vcc-supply = <&vcc0>; +}; diff --git a/drivers/iio/Kconfig b/drivers/iio/Kconfig index 6743b18..2e896e0 100644 --- a/drivers/iio/Kconfig +++ b/drivers/iio/Kconfig @@ -80,6 +80,7 @@ source "drivers/iio/gyro/Kconfig" source "drivers/iio/health/Kconfig" source "drivers/iio/humidity/Kconfig" source "drivers/iio/imu/Kconfig" +source "drivers/iio/misc/Kconfig" source "drivers/iio/light/Kconfig" source "drivers/iio/magnetometer/Kconfig" source "drivers/iio/orientation/Kconfig" diff --git a/drivers/iio/Makefile b/drivers/iio/Makefile index 87e4c43..4008d5a 100644 --- a/drivers/iio/Makefile +++ b/drivers/iio/Makefile @@ -25,6 +25,7 @@ obj-y += frequency/ obj-y += health/ obj-y += humidity/ obj-y += imu/ +obj-y += misc/ obj-y += light/ obj-y += magnetometer/ obj-y += orientation/ diff --git a/drivers/iio/misc/Kconfig b/drivers/iio/misc/Kconfig new file mode 100644 index 0000000..b43a1ed --- /dev/null +++ b/drivers/iio/misc/Kconfig @@ -0,0 +1,17 @@ +# +# Miscellaneous iio drivers +# +# When adding new entries keep the list in alphabetical order + +menu "Miscellaneous iio drivers" + +config IIO_REGULATOR + tristate "IIO regulator driver" + depends on REGULATOR + help + Say yes here to build support for regulators powering iio devices. + + To compile this driver as a module, choose M here: the module will + be called iio-regulator. + +endmenu diff --git a/drivers/iio/misc/Makefile b/drivers/iio/misc/Makefile new file mode 100644 index 0000000..da8f56a --- /dev/null +++ b/drivers/iio/misc/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for IIO misc drivers +# + +# When adding new entries keep the list in alphabetical order +obj-$(CONFIG_IIO_REGULATOR) += iio-regulator.o diff --git a/drivers/iio/misc/iio-regulator.c b/drivers/iio/misc/iio-regulator.c new file mode 100644 index 0000000..0d61553 --- /dev/null +++ b/drivers/iio/misc/iio-regulator.c @@ -0,0 +1,121 @@ +/* + * Generic regulator driver for industrial IO. + * + * Copyright (C) 2016 BayLibre SAS + * + * Author: + * Bartosz Golaszewski + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include + +struct iio_regulator_context { + struct regulator *regulator; +}; + +static ssize_t iio_regulator_enable_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_regulator_context *ctx = iio_priv(dev_to_iio_dev(dev)); + + return sprintf(buf, "%d\n", regulator_is_enabled(ctx->regulator)); +} + +static ssize_t iio_regulator_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct iio_regulator_context *ctx = iio_priv(dev_to_iio_dev(dev)); + int ret, enabled; + bool val; + + ret = strtobool(buf, &val); + if (ret) + return ret; + + enabled = regulator_is_enabled(ctx->regulator); + if ((val && enabled) || (!val && !enabled)) + return -EPERM; + + ret = val ? regulator_enable(ctx->regulator) : + regulator_disable(ctx->regulator); + if (ret) + return ret; + + return len; +} + +static IIO_DEVICE_ATTR(in_enable, 0644, + iio_regulator_enable_show, + iio_regulator_enable_store, 0); + +static struct attribute *iio_regulator_attributes[] = { + &iio_dev_attr_in_enable.dev_attr.attr, + NULL, +}; + +static const struct attribute_group iio_regulator_attribute_group = { + .attrs = iio_regulator_attributes, +}; + +static const struct iio_info iio_regulator_info = { + .driver_module = THIS_MODULE, + .attrs = &iio_regulator_attribute_group, +}; + +static int iio_regulator_probe(struct platform_device *pdev) +{ + struct iio_regulator_context *ctx; + struct iio_dev *iio_dev; + struct device *dev; + + dev = &pdev->dev; + + iio_dev = devm_iio_device_alloc(dev, sizeof(*ctx)); + if (!iio_dev) + return -ENOMEM; + + ctx = iio_priv(iio_dev); + + ctx->regulator = devm_regulator_get(dev, "vcc"); + if (IS_ERR(ctx->regulator)) { + dev_err(dev, "unable to get vcc regulator: %ld\n", + PTR_ERR(ctx->regulator)); + return PTR_ERR(ctx->regulator); + } + + iio_dev->dev.parent = dev; + iio_dev->dev.of_node = dev->of_node; + iio_dev->name = dev->driver->name; + iio_dev->info = &iio_regulator_info; + + return devm_iio_device_register(dev, iio_dev); +} + +static const struct of_device_id iio_regulator_of_match[] = { + { .compatible = "iio-regulator", }, + { }, +}; + +static struct platform_driver iio_regulator_platform_driver = { + .probe = iio_regulator_probe, + .driver = { + .name = "iio-regulator", + .of_match_table = iio_regulator_of_match, + }, +}; +module_platform_driver(iio_regulator_platform_driver); + +MODULE_AUTHOR("Bartosz Golaszewski "); +MODULE_DESCRIPTION("Regulator driver for iio"); +MODULE_LICENSE("GPL v2");