cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pcf50633-regulator.c (3755B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* NXP PCF50633 PMIC Driver
      3 *
      4 * (C) 2006-2008 by Openmoko, Inc.
      5 * Author: Balaji Rao <balajirrao@openmoko.org>
      6 * All rights reserved.
      7 *
      8 * Broken down from monstrous PCF50633 driver mainly by
      9 * Harald Welte and Andy Green and Werner Almesberger
     10 */
     11
     12#include <linux/kernel.h>
     13#include <linux/module.h>
     14#include <linux/init.h>
     15#include <linux/device.h>
     16#include <linux/err.h>
     17#include <linux/platform_device.h>
     18
     19#include <linux/mfd/pcf50633/core.h>
     20#include <linux/mfd/pcf50633/pmic.h>
     21
     22#define PCF50633_REGULATOR(_name, _id, _min_uV, _uV_step, _min_sel, _n) \
     23	{							\
     24		.name = _name,					\
     25		.id = PCF50633_REGULATOR_##_id,			\
     26		.ops = &pcf50633_regulator_ops,			\
     27		.n_voltages = _n,				\
     28		.min_uV = _min_uV,				\
     29		.uV_step = _uV_step,				\
     30		.linear_min_sel = _min_sel,			\
     31		.type = REGULATOR_VOLTAGE,			\
     32		.owner = THIS_MODULE,				\
     33		.vsel_reg = PCF50633_REG_##_id##OUT,		\
     34		.vsel_mask = 0xff,				\
     35		.enable_reg = PCF50633_REG_##_id##OUT + 1,	\
     36		.enable_mask = PCF50633_REGULATOR_ON,		\
     37	}
     38
     39static const struct regulator_ops pcf50633_regulator_ops = {
     40	.set_voltage_sel = regulator_set_voltage_sel_regmap,
     41	.get_voltage_sel = regulator_get_voltage_sel_regmap,
     42	.list_voltage = regulator_list_voltage_linear,
     43	.map_voltage = regulator_map_voltage_linear,
     44	.enable = regulator_enable_regmap,
     45	.disable = regulator_disable_regmap,
     46	.is_enabled = regulator_is_enabled_regmap,
     47};
     48
     49static const struct regulator_desc regulators[] = {
     50	[PCF50633_REGULATOR_AUTO] =
     51		PCF50633_REGULATOR("auto", AUTO, 1800000, 25000, 0x2f, 128),
     52	[PCF50633_REGULATOR_DOWN1] =
     53		PCF50633_REGULATOR("down1", DOWN1, 625000, 25000, 0, 96),
     54	[PCF50633_REGULATOR_DOWN2] =
     55		PCF50633_REGULATOR("down2", DOWN2, 625000, 25000, 0, 96),
     56	[PCF50633_REGULATOR_LDO1] =
     57		PCF50633_REGULATOR("ldo1", LDO1, 900000, 100000, 0, 28),
     58	[PCF50633_REGULATOR_LDO2] =
     59		PCF50633_REGULATOR("ldo2", LDO2, 900000, 100000, 0, 28),
     60	[PCF50633_REGULATOR_LDO3] =
     61		PCF50633_REGULATOR("ldo3", LDO3, 900000, 100000, 0, 28),
     62	[PCF50633_REGULATOR_LDO4] =
     63		PCF50633_REGULATOR("ldo4", LDO4, 900000, 100000, 0, 28),
     64	[PCF50633_REGULATOR_LDO5] =
     65		PCF50633_REGULATOR("ldo5", LDO5, 900000, 100000, 0, 28),
     66	[PCF50633_REGULATOR_LDO6] =
     67		PCF50633_REGULATOR("ldo6", LDO6, 900000, 100000, 0, 28),
     68	[PCF50633_REGULATOR_HCLDO] =
     69		PCF50633_REGULATOR("hcldo", HCLDO, 900000, 100000, 0, 28),
     70	[PCF50633_REGULATOR_MEMLDO] =
     71		PCF50633_REGULATOR("memldo", MEMLDO, 900000, 100000, 0, 28),
     72};
     73
     74static int pcf50633_regulator_probe(struct platform_device *pdev)
     75{
     76	struct regulator_dev *rdev;
     77	struct pcf50633 *pcf;
     78	struct regulator_config config = { };
     79
     80	/* Already set by core driver */
     81	pcf = dev_to_pcf50633(pdev->dev.parent);
     82
     83	config.dev = &pdev->dev;
     84	config.init_data = dev_get_platdata(&pdev->dev);
     85	config.driver_data = pcf;
     86	config.regmap = pcf->regmap;
     87
     88	rdev = devm_regulator_register(&pdev->dev, &regulators[pdev->id],
     89				       &config);
     90	if (IS_ERR(rdev))
     91		return PTR_ERR(rdev);
     92
     93	platform_set_drvdata(pdev, rdev);
     94
     95	if (pcf->pdata->regulator_registered)
     96		pcf->pdata->regulator_registered(pcf, pdev->id);
     97
     98	return 0;
     99}
    100
    101static struct platform_driver pcf50633_regulator_driver = {
    102	.driver = {
    103		.name = "pcf50633-regulator",
    104	},
    105	.probe = pcf50633_regulator_probe,
    106};
    107
    108static int __init pcf50633_regulator_init(void)
    109{
    110	return platform_driver_register(&pcf50633_regulator_driver);
    111}
    112subsys_initcall(pcf50633_regulator_init);
    113
    114static void __exit pcf50633_regulator_exit(void)
    115{
    116	platform_driver_unregister(&pcf50633_regulator_driver);
    117}
    118module_exit(pcf50633_regulator_exit);
    119
    120MODULE_AUTHOR("Balaji Rao <balajirrao@openmoko.org>");
    121MODULE_DESCRIPTION("PCF50633 regulator driver");
    122MODULE_LICENSE("GPL");
    123MODULE_ALIAS("platform:pcf50633-regulator");