From patchwork Fri Sep 13 19:01:15 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 20295 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ye0-f199.google.com (mail-ye0-f199.google.com [209.85.213.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 1956220286 for ; Fri, 13 Sep 2013 19:01:29 +0000 (UTC) Received: by mail-ye0-f199.google.com with SMTP id l4sf1628393yen.2 for ; Fri, 13 Sep 2013 12:01:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-unsubscribe; bh=+GFjAFHXrtIkHBgGZyfn4RaYaNy2kQyvqQEZZISHncw=; b=m39fxiagmnZWdlmirWUBmdGNUv8xp46bYZTMBCoKipru/xeeCMmSDqAOqkdfGIdmw9 K28zwVDYrrXugVeqnnBuCpwSSJB6nB3mZ3F+oy36cuYzH+YXvzcuaVOxJGVWBw7gZnHW RypdeYShnJXQTcS1QMzvDYhazD4OHW/spO7wBMHkR7JU/nU7WPxABSR0S6clzQVbeNGS oco8nF5UMFs94PpINEYGv5FXc6KIoHMC0yWXUThGFs4il6NhxkWcIzXe+T78RknrHQj9 VSRN6Dsy5GRQlw6VJTHB2xZxU49T/SEmcY68rc/MPcMtBnbwK5o/CAYlTpi9FZZxGzZd K+og== X-Gm-Message-State: ALoCoQkzjQwpAZOUu9LNGZbjzOqsSdcRgHvEKwe/I/qpnf7+6rYjHzY97tIiBNjS3aq/qQLWYbKR X-Received: by 10.58.240.10 with SMTP id vw10mr1013254vec.14.1379098889292; Fri, 13 Sep 2013 12:01:29 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.49.39.193 with SMTP id r1ls1357598qek.30.gmail; Fri, 13 Sep 2013 12:01:29 -0700 (PDT) X-Received: by 10.52.230.202 with SMTP id ta10mr42497vdc.41.1379098889056; Fri, 13 Sep 2013 12:01:29 -0700 (PDT) Received: from mail-ve0-f174.google.com (mail-ve0-f174.google.com [209.85.128.174]) by mx.google.com with ESMTPS id c8si3568811vcq.63.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 13 Sep 2013 12:01:29 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.128.174 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.128.174; Received: by mail-ve0-f174.google.com with SMTP id jy13so1315156veb.33 for ; Fri, 13 Sep 2013 12:01:29 -0700 (PDT) X-Received: by 10.52.119.139 with SMTP id ku11mr16914vdb.42.1379098888943; Fri, 13 Sep 2013 12:01:28 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patches@linaro.org Received: by 10.220.174.196 with SMTP id u4csp95984vcz; Fri, 13 Sep 2013 12:01:27 -0700 (PDT) X-Received: by 10.152.8.115 with SMTP id q19mr12297268laa.16.1379098887142; Fri, 13 Sep 2013 12:01:27 -0700 (PDT) Received: from mail-la0-f50.google.com (mail-la0-f50.google.com [209.85.215.50]) by mx.google.com with ESMTPS id 2si4378759lar.171.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 13 Sep 2013 12:01:27 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.215.50 is neither permitted nor denied by best guess record for domain of linus.walleij@linaro.org) client-ip=209.85.215.50; Received: by mail-la0-f50.google.com with SMTP id lv10so1353580lab.23 for ; Fri, 13 Sep 2013 12:01:26 -0700 (PDT) X-Received: by 10.152.5.162 with SMTP id t2mr12053064lat.1.1379098886573; Fri, 13 Sep 2013 12:01:26 -0700 (PDT) Received: from localhost.localdomain (c83-249-209-96.bredband.comhem.se. [83.249.209.96]) by mx.google.com with ESMTPSA id ao4sm5056809lac.1.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 13 Sep 2013 12:01:25 -0700 (PDT) From: Linus Walleij To: Mark Brown Cc: linux-kernel@vger.kernel.org, Wang Shilong , Samuel Ortiz , Lee Jones , Linus Walleij Subject: [PATCH 2/4 v2] regulator: add STw481x VMMC driver Date: Fri, 13 Sep 2013 21:01:15 +0200 Message-Id: <1379098875-9959-1-git-send-email-linus.walleij@linaro.org> X-Mailer: git-send-email 1.8.1.4 X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: linus.walleij@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.128.174 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Precedence: list Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org List-ID: X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , The ST Microelectronics STw481x PMIC used for the Nomadik has one single software-controlled regulator for VMMC. This driver registers directly to the compatible string as there is just one regulator. Signed-off-by: Linus Walleij --- ChangeLog v1->v2: - Use core regmap regulator helpers cutting half of the code. - Fix checkpatch moanings. - Move default-disable of the external regulator to probe() - Cut the pointless sysfs debug node. - Use module_platform_driver() macro. --- drivers/regulator/Kconfig | 8 +++ drivers/regulator/Makefile | 1 + drivers/regulator/stw481x-vmmc.c | 110 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 drivers/regulator/stw481x-vmmc.c diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index dfe5809..d957010 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -429,6 +429,14 @@ config REGULATOR_TI_ABB on TI SoCs may be unstable without enabling this as it provides device specific optimized bias to allow/optimize functionality. +config REGULATOR_STW481X_VMMC + bool "ST Microelectronics STW481X VMMC regulator" + depends on MFD_STW481X + default y if MFD_STW481X + help + This driver supports the internal VMMC regulator in the STw481x + PMIC chips. + config REGULATOR_TPS51632 tristate "TI TPS51632 Power Regulator" depends on I2C diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index 185cce2..f2cfc45 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -56,6 +56,7 @@ obj-$(CONFIG_REGULATOR_PCF50633) += pcf50633-regulator.o obj-$(CONFIG_REGULATOR_RC5T583) += rc5t583-regulator.o obj-$(CONFIG_REGULATOR_S2MPS11) += s2mps11.o obj-$(CONFIG_REGULATOR_S5M8767) += s5m8767.o +obj-$(CONFIG_REGULATOR_STW481X_VMMC) += stw481x-vmmc.o obj-$(CONFIG_REGULATOR_TI_ABB) += ti-abb-regulator.o obj-$(CONFIG_REGULATOR_TPS6105X) += tps6105x-regulator.o obj-$(CONFIG_REGULATOR_TPS62360) += tps62360-regulator.o diff --git a/drivers/regulator/stw481x-vmmc.c b/drivers/regulator/stw481x-vmmc.c new file mode 100644 index 0000000..5ae72a8 --- /dev/null +++ b/drivers/regulator/stw481x-vmmc.c @@ -0,0 +1,110 @@ +/* + * Regulator driver for STw4810/STw4811 VMMC regulator. + * + * Copyright (C) 2013 ST-Ericsson SA + * Written on behalf of Linaro for ST-Ericsson + * + * Author: Linus Walleij + * + * License terms: GNU General Public License (GPL) version 2 + */ + +#include +#include +#include +#include +#include +#include +#include + +static const unsigned int stw481x_vmmc_voltages[] = { + 1800000, + 1800000, + 2850000, + 3000000, + 1850000, + 2600000, + 2700000, + 3300000, +}; + +static struct regulator_ops stw481x_vmmc_ops = { + .list_voltage = regulator_list_voltage_table, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, +}; + +static struct regulator_desc vmmc_regulator = { + .name = "VMMC", + .id = 0, + .ops = &stw481x_vmmc_ops, + .type = REGULATOR_VOLTAGE, + .owner = THIS_MODULE, + .n_voltages = ARRAY_SIZE(stw481x_vmmc_voltages), + .volt_table = stw481x_vmmc_voltages, + .enable_time = 200, /* FIXME: look this up */ + .enable_reg = STW_CONF1, + .enable_mask = STW_CONF1_PDN_VMMC, + .vsel_reg = STW_CONF1, + .vsel_mask = STW_CONF1_VMMC_MASK, +}; + +static int stw481x_vmmc_regulator_probe(struct platform_device *pdev) +{ + struct stw481x *stw481x = dev_get_platdata(&pdev->dev); + struct regulator_config config = { }; + int ret; + + /* First disable the external VMMC if it's active */ + ret = regmap_update_bits(stw481x->map, STW_CONF2, + STW_CONF2_VMMC_EXT, 0); + if (ret) { + dev_err(&pdev->dev, "could not disable external VMMC\n"); + return ret; + } + + /* Register VMMC regulator */ + config.dev = &pdev->dev; + config.driver_data = stw481x; + config.regmap = stw481x->map; + config.of_node = pdev->dev.of_node; + config.init_data = of_get_regulator_init_data(&pdev->dev, + pdev->dev.of_node); + + stw481x->vmmc_regulator = regulator_register(&vmmc_regulator, &config); + if (IS_ERR(stw481x->vmmc_regulator)) { + dev_err(&pdev->dev, + "error initializing STw481x VMMC regulator\n"); + return PTR_ERR(stw481x->vmmc_regulator); + } + + dev_info(&pdev->dev, "initialized STw481x VMMC regulator\n"); + return 0; +} + +static int stw481x_vmmc_regulator_remove(struct platform_device *pdev) +{ + struct stw481x *stw481x = dev_get_platdata(&pdev->dev); + + regulator_unregister(stw481x->vmmc_regulator); + return 0; +} + +static const struct of_device_id stw481x_vmmc_match[] = { + { .compatible = "st,stw481x-vmmc", }, + {}, +}; + +static struct platform_driver stw481x_vmmc_regulator_driver = { + .driver = { + .name = "stw481x-vmmc-regulator", + .owner = THIS_MODULE, + }, + .probe = stw481x_vmmc_regulator_probe, + .remove = stw481x_vmmc_regulator_remove, +}; + +module_platform_driver(stw481x_vmmc_regulator_driver);