From: Graeme Gregory <dp@xora.org.uk>
To: Tero Kristo <t-kristo@ti.com>
Cc: linux-omap@vger.kernel.org, khilman@ti.com, tony@atomide.com,
toddpoynor@google.com, broonie@opensource.wolfsonmicro.com,
lrg@ti.com
Subject: Re: [PATCHv3 3/6] regulator: omap smps regulator driver
Date: Tue, 19 Jul 2011 11:28:21 +0100 [thread overview]
Message-ID: <4E255C45.3040700@xora.org.uk> (raw)
In-Reply-To: <1311010522-5868-4-git-send-email-t-kristo@ti.com>
On 07/18/2011 06:35 PM, Tero Kristo wrote:
> OMAP SMPS regulator driver provides access to OMAP voltage processor
> controlled regulators. These include VDD_MPU and VDD_CORE for OMAP3 and
> additionally VDD_IVA for OMAP4. SMPS regulators use the OMAP voltage
> layer for the actual voltage regulation operations.
>
> Signed-off-by: Tero Kristo <t-kristo@ti.com>
> Cc: Kevin Hilman <khilman@ti.com>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Todd Poynor <toddpoynor@google.com>
> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
> Cc: Liam Girdwood <lrg@ti.com>
> ---
> drivers/regulator/Kconfig | 9 ++
> drivers/regulator/Makefile | 1 +
> drivers/regulator/omap-smps-regulator.c | 180 +++++++++++++++++++++++++++++++
> include/linux/regulator/omap-smps.h | 20 ++++
> 4 files changed, 210 insertions(+), 0 deletions(-)
> create mode 100644 drivers/regulator/omap-smps-regulator.c
> create mode 100644 include/linux/regulator/omap-smps.h
>
> diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig
> index d7ed20f..bb18ff2 100644
> --- a/drivers/regulator/Kconfig
> +++ b/drivers/regulator/Kconfig
> @@ -303,5 +303,14 @@ config REGULATOR_TPS65910
> help
> This driver supports TPS65910 voltage regulator chips.
>
> +config REGULATOR_OMAP_SMPS
> + tristate "TI OMAP SMPS Power Regulators"
> + depends on (ARCH_OMAP3 || ARCH_OMAP4) && PM && TWL4030_CORE
> + help
> + This driver supports the OMAP3 / OMAP4 SMPS regulators for VDD1,
> + VDD2 and VDD3. These regulators reside inside the TWL4030 /
> + TWL6030 chip but are accessed using the voltage processor
> + interface of OMAP.
> +
> endif
>
> diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile
> index 3932d2e..191e3d5 100644
> --- a/drivers/regulator/Makefile
> +++ b/drivers/regulator/Makefile
> @@ -43,5 +43,6 @@ obj-$(CONFIG_REGULATOR_ISL6271A) += isl6271a-regulator.o
> obj-$(CONFIG_REGULATOR_AB8500) += ab8500.o
> obj-$(CONFIG_REGULATOR_DB8500_PRCMU) += db8500-prcmu.o
> obj-$(CONFIG_REGULATOR_TPS65910) += tps65910-regulator.o
> +obj-$(CONFIG_REGULATOR_OMAP_SMPS) += omap-smps-regulator.o
>
> ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG
> diff --git a/drivers/regulator/omap-smps-regulator.c b/drivers/regulator/omap-smps-regulator.c
> new file mode 100644
> index 0000000..8b56e4f
> --- /dev/null
> +++ b/drivers/regulator/omap-smps-regulator.c
> @@ -0,0 +1,179 @@
> +/*
> + * omap-vp-regulator.c -- support SMPS regulators for OMAP chips
> + *
> + * Copyright (C) 2011 Texas Instruments, Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/ctype.h>
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include <linux/init.h>
> +#include <linux/err.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/regulator/driver.h>
> +#include <linux/regulator/machine.h>
> +#include <linux/regulator/omap-smps.h>
> +#include <plat/voltage.h>
> +
> +#define DRIVER_NAME "omap-smps"
> +
> +struct omap_smps_reg_info {
> + const char *vdd_name;
> + struct regulator_dev *rdev;
> + struct voltagedomain *voltdm;
> + struct regulator_desc desc;
> +};
> +
> +static int omap_smps_set_voltage(struct regulator_dev *rdev, int min_uV,
> + int max_uV, unsigned *selector)
> +{
> + struct omap_smps_reg_info *info = rdev_get_drvdata(rdev);
> + return voltdm_scale(info->voltdm, min_uV);
> +}
> +
> +static int omap_smps_get_voltage(struct regulator_dev *rdev)
> +{
> + struct omap_smps_reg_info *info = rdev_get_drvdata(rdev);
> + return omap_vp_get_curr_volt(info->voltdm);
> +}
> +
> +static struct regulator_ops omap_smps_ops = {
> + .set_voltage = omap_smps_set_voltage,
> + .get_voltage = omap_smps_get_voltage,
> +};
> +
> +#define SMPS_REG(name) { \
> + .vdd_name = #name, \
> + .desc = { \
> + .ops = &omap_smps_ops, \
> + .type = REGULATOR_VOLTAGE, \
> + .owner = THIS_MODULE, \
> + }, \
> + }
> +
> +static struct omap_smps_reg_info omap_smps_regs[] = {
> + SMPS_REG(mpu),
> + SMPS_REG(mpu_iva),
> + SMPS_REG(iva),
> + SMPS_REG(core),
> +};
> +
> +static void omap_smps_reg_cleanup(void)
> +{
> + int i;
> + struct omap_smps_reg_info *info;
> +
> + for (i = 0; i < ARRAY_SIZE(omap_smps_regs); i++) {
> + info = &omap_smps_regs[i];
> + if (info->rdev) {
> + regulator_unregister(info->rdev);
> + info->rdev = NULL;
> + }
> +
> + kfree(info->desc.name);
> + info->desc.name = NULL;
> + }
> +}
> +
> +static struct regulator_init_data dummy_initdata __initdata;
> +
> +static int __devinit omap_smps_reg_probe(struct platform_device *pdev)
> +{
> + int i, j, ret;
> + struct omap_smps_reg_info *info;
> + struct omap_smps_platform_data *pdata;
> + struct regulator_dev *rdev;
> + struct regulator_init_data *initdata;
> + struct voltagedomain *voltdm;
> + char *name;
> +
> + pdata = pdev->dev.platform_data;
> +
> + for (i = 0; i < ARRAY_SIZE(omap_smps_regs); i++) {
> + initdata = &dummy_initdata;
> + info = &omap_smps_regs[i];
> +
> + for (j = 0; j < pdata->num_regulators; j++)
> + if (!strcmp(info->vdd_name,
> + pdata->regulators[j]->consumer_supplies[0].
> + dev_name)) {
> + initdata = pdata->regulators[j];
> + break;
> + }
> +
> + voltdm = voltdm_lookup(info->vdd_name);
> +
> + if (!voltdm)
> + continue;
> +
> + info->voltdm = voltdm;
> +
> + name = kmalloc(strlen(info->vdd_name) + 5, GFP_KERNEL);
> +
> + if (!name) {
> + ret = -ENOMEM;
> + goto err;
> + }
> +
> + sprintf(name, "VDD_%s", info->vdd_name);
> +
> + for (j = 0; j < strlen(name); j++)
> + name[j] = toupper(name[j]);
> +
> + info->desc.name = name;
> +
> + rdev = regulator_register(&info->desc, &pdev->dev, initdata,
> + info);
> +
> + if (IS_ERR(rdev)) {
> + dev_err(&pdev->dev, "can't register %s, %ld\n",
> + info->desc.name, PTR_ERR(rdev));
> + ret = PTR_ERR(rdev);
> + goto err;
> + }
> +
> + info->rdev = rdev;
> + }
> +
> + return 0;
> +err:
> + omap_smps_reg_cleanup();
> + return ret;
> +}
> +
> +static int omap_smps_reg_remove(struct platform_device *pdev)
> +{
> + omap_smps_reg_cleanup();
> + return 0;
> +}
> +
> +static struct platform_driver omap_smps_reg_driver = {
> + .probe = omap_smps_reg_probe,
> + .remove = __devexit_p(omap_smps_reg_remove),
> + .driver.name = DRIVER_NAME,
> + .driver.owner = THIS_MODULE,
> +};
> +
> +static int __init omap_smps_reg_init(void)
> +{
> + return platform_driver_register(&omap_smps_reg_driver);
> +}
> +subsys_initcall(omap_smps_reg_init);
> +
> +static void __exit omap_smps_reg_exit(void)
> +{
> + platform_driver_unregister(&omap_smps_reg_driver);
> +}
> +module_exit(omap_smps_reg_exit);
> +
> +MODULE_ALIAS("platform:"DRIVER_NAME);
> +MODULE_AUTHOR("Tero Kristo <t-kristo@ti.com>");
> +MODULE_DESCRIPTION("OMAP SMPS regulator driver");
> +MODULE_LICENSE("GPL");
> diff --git a/include/linux/regulator/omap-smps.h b/include/linux/regulator/omap-smps.h
> new file mode 100644
> index 0000000..1d5f940
> --- /dev/null
> +++ b/include/linux/regulator/omap-smps.h
> @@ -0,0 +1,20 @@
> +/*
> + * omap-smps.h - header for OMAP SMPS regulator support
> + *
> + * Copyright (C) 2011 Texas Instruments, Inc.
> + *
> + *
> + * 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.
> + */
> +
> +#ifndef __OMAP_SMPS_H__
> +#define __OMAP_SMPS_H__
> +
> +struct omap_smps_platform_data {
> + struct regulator_init_data **regulators;
> + int num_regulators;
> +};
> +
> +#endif /* End of __OMAP_SMPS_H__ */
This does not conflict with my driver for the same functionality on non
omap CPUs which is still waiting for me to clean up and upstream. So
Acked-by: Graeme Gregory <gg@slimlogic.co.uk>
Graeme
next prev parent reply other threads:[~2011-07-19 10:36 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-18 17:35 [PATCHv3 0/6] OMAP SMPS regulator driver Tero Kristo
2011-07-18 17:35 ` [PATCHv3 1/6] OMAP: move voltage.h and vp.h under platform include directory Tero Kristo
2011-07-18 18:16 ` Felipe Balbi
2011-07-19 7:49 ` Tero Kristo
2011-07-18 23:45 ` Kevin Hilman
2011-07-18 17:35 ` [PATCHv3 2/6] omap: voltage: change code to use new location of voltage.h and vp.h Tero Kristo
2011-07-18 18:16 ` Felipe Balbi
2011-07-19 7:47 ` Tero Kristo
2011-07-18 17:35 ` [PATCHv3 3/6] regulator: omap smps regulator driver Tero Kristo
2011-07-18 18:22 ` Felipe Balbi
2011-07-18 23:40 ` Kevin Hilman
2011-07-19 7:53 ` Tero Kristo
2011-07-19 7:58 ` Tero Kristo
2011-07-19 10:28 ` Graeme Gregory [this message]
2011-07-19 15:38 ` Mark Brown
2011-07-19 15:52 ` Tero Kristo
2011-07-18 17:35 ` [PATCHv3 4/6] omap3: pmic: add API to get common SMPS regulators Tero Kristo
2011-07-18 18:23 ` Felipe Balbi
2011-07-19 8:07 ` Tero Kristo
2011-07-18 17:35 ` [PATCHv3 5/6] omap3: beagleboard: add " Tero Kristo
2011-07-18 17:35 ` [PATCHv3 6/6] TEMP: OMAP3: beagle rev-c4: enable OPP6 Tero Kristo
2011-07-18 17:55 ` [PATCHv3 0/6] OMAP SMPS regulator driver Tero Kristo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E255C45.3040700@xora.org.uk \
--to=dp@xora.org.uk \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=khilman@ti.com \
--cc=linux-omap@vger.kernel.org \
--cc=lrg@ti.com \
--cc=t-kristo@ti.com \
--cc=toddpoynor@google.com \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.