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

bd71828-regulator.c (25065B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2// Copyright (C) 2019 ROHM Semiconductors
      3// bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver
      4//
      5
      6#include <linux/delay.h>
      7#include <linux/err.h>
      8#include <linux/gpio.h>
      9#include <linux/interrupt.h>
     10#include <linux/kernel.h>
     11#include <linux/mfd/rohm-bd71828.h>
     12#include <linux/module.h>
     13#include <linux/of.h>
     14#include <linux/platform_device.h>
     15#include <linux/regmap.h>
     16#include <linux/regulator/driver.h>
     17#include <linux/regulator/machine.h>
     18#include <linux/regulator/of_regulator.h>
     19
     20struct reg_init {
     21	unsigned int reg;
     22	unsigned int mask;
     23	unsigned int val;
     24};
     25struct bd71828_regulator_data {
     26	struct regulator_desc desc;
     27	const struct rohm_dvs_config dvs;
     28	const struct reg_init *reg_inits;
     29	int reg_init_amnt;
     30};
     31
     32static const struct reg_init buck1_inits[] = {
     33	/*
     34	 * DVS Buck voltages can be changed by register values or via GPIO.
     35	 * Use register accesses by default.
     36	 */
     37	{
     38		.reg = BD71828_REG_PS_CTRL_1,
     39		.mask = BD71828_MASK_DVS_BUCK1_CTRL,
     40		.val = BD71828_DVS_BUCK1_CTRL_I2C,
     41	},
     42};
     43
     44static const struct reg_init buck2_inits[] = {
     45	{
     46		.reg = BD71828_REG_PS_CTRL_1,
     47		.mask = BD71828_MASK_DVS_BUCK2_CTRL,
     48		.val = BD71828_DVS_BUCK2_CTRL_I2C,
     49	},
     50};
     51
     52static const struct reg_init buck6_inits[] = {
     53	{
     54		.reg = BD71828_REG_PS_CTRL_1,
     55		.mask = BD71828_MASK_DVS_BUCK6_CTRL,
     56		.val = BD71828_DVS_BUCK6_CTRL_I2C,
     57	},
     58};
     59
     60static const struct reg_init buck7_inits[] = {
     61	{
     62		.reg = BD71828_REG_PS_CTRL_1,
     63		.mask = BD71828_MASK_DVS_BUCK7_CTRL,
     64		.val = BD71828_DVS_BUCK7_CTRL_I2C,
     65	},
     66};
     67
     68static const struct linear_range bd71828_buck1267_volts[] = {
     69	REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250),
     70	REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0),
     71};
     72
     73static const struct linear_range bd71828_buck3_volts[] = {
     74	REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x0f, 50000),
     75	REGULATOR_LINEAR_RANGE(2000000, 0x10, 0x1f, 0),
     76};
     77
     78static const struct linear_range bd71828_buck4_volts[] = {
     79	REGULATOR_LINEAR_RANGE(1000000, 0x00, 0x1f, 25000),
     80	REGULATOR_LINEAR_RANGE(1800000, 0x20, 0x3f, 0),
     81};
     82
     83static const struct linear_range bd71828_buck5_volts[] = {
     84	REGULATOR_LINEAR_RANGE(2500000, 0x00, 0x0f, 50000),
     85	REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0),
     86};
     87
     88static const struct linear_range bd71828_ldo_volts[] = {
     89	REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000),
     90	REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0),
     91};
     92
     93static const unsigned int bd71828_ramp_delay[] = { 2500, 5000, 10000, 20000 };
     94
     95static int buck_set_hw_dvs_levels(struct device_node *np,
     96				  const struct regulator_desc *desc,
     97				  struct regulator_config *cfg)
     98{
     99	struct bd71828_regulator_data *data;
    100
    101	data = container_of(desc, struct bd71828_regulator_data, desc);
    102
    103	return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap);
    104}
    105
    106static int ldo6_parse_dt(struct device_node *np,
    107			 const struct regulator_desc *desc,
    108			 struct regulator_config *cfg)
    109{
    110	int ret, i;
    111	uint32_t uv = 0;
    112	unsigned int en;
    113	struct regmap *regmap = cfg->regmap;
    114	static const char * const props[] = { "rohm,dvs-run-voltage",
    115					      "rohm,dvs-idle-voltage",
    116					      "rohm,dvs-suspend-voltage",
    117					      "rohm,dvs-lpsr-voltage" };
    118	unsigned int mask[] = { BD71828_MASK_RUN_EN, BD71828_MASK_IDLE_EN,
    119			       BD71828_MASK_SUSP_EN, BD71828_MASK_LPSR_EN };
    120
    121	for (i = 0; i < ARRAY_SIZE(props); i++) {
    122		ret = of_property_read_u32(np, props[i], &uv);
    123		if (ret) {
    124			if (ret != -EINVAL)
    125				return ret;
    126			continue;
    127		}
    128		if (uv)
    129			en = 0xffffffff;
    130		else
    131			en = 0;
    132
    133		ret = regmap_update_bits(regmap, desc->enable_reg, mask[i], en);
    134		if (ret)
    135			return ret;
    136	}
    137	return 0;
    138}
    139
    140static const struct regulator_ops bd71828_buck_ops = {
    141	.enable = regulator_enable_regmap,
    142	.disable = regulator_disable_regmap,
    143	.is_enabled = regulator_is_enabled_regmap,
    144	.list_voltage = regulator_list_voltage_linear_range,
    145	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    146	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    147};
    148
    149static const struct regulator_ops bd71828_dvs_buck_ops = {
    150	.enable = regulator_enable_regmap,
    151	.disable = regulator_disable_regmap,
    152	.is_enabled = regulator_is_enabled_regmap,
    153	.list_voltage = regulator_list_voltage_linear_range,
    154	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    155	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    156	.set_voltage_time_sel = regulator_set_voltage_time_sel,
    157	.set_ramp_delay = regulator_set_ramp_delay_regmap,
    158};
    159
    160static const struct regulator_ops bd71828_ldo_ops = {
    161	.enable = regulator_enable_regmap,
    162	.disable = regulator_disable_regmap,
    163	.is_enabled = regulator_is_enabled_regmap,
    164	.list_voltage = regulator_list_voltage_linear_range,
    165	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    166	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    167};
    168
    169static const struct regulator_ops bd71828_ldo6_ops = {
    170	.enable = regulator_enable_regmap,
    171	.disable = regulator_disable_regmap,
    172	.is_enabled = regulator_is_enabled_regmap,
    173};
    174
    175static const struct bd71828_regulator_data bd71828_rdata[] = {
    176	{
    177		.desc = {
    178			.name = "buck1",
    179			.of_match = of_match_ptr("BUCK1"),
    180			.regulators_node = of_match_ptr("regulators"),
    181			.id = BD71828_BUCK1,
    182			.ops = &bd71828_dvs_buck_ops,
    183			.type = REGULATOR_VOLTAGE,
    184			.linear_ranges = bd71828_buck1267_volts,
    185			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
    186			.n_voltages = BD71828_BUCK1267_VOLTS,
    187			.enable_reg = BD71828_REG_BUCK1_EN,
    188			.enable_mask = BD71828_MASK_RUN_EN,
    189			.vsel_reg = BD71828_REG_BUCK1_VOLT,
    190			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
    191			.ramp_delay_table = bd71828_ramp_delay,
    192			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
    193			.ramp_reg = BD71828_REG_BUCK1_MODE,
    194			.ramp_mask = BD71828_MASK_RAMP_DELAY,
    195			.owner = THIS_MODULE,
    196			.of_parse_cb = buck_set_hw_dvs_levels,
    197		},
    198		.dvs = {
    199			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    200				     ROHM_DVS_LEVEL_SUSPEND |
    201				     ROHM_DVS_LEVEL_LPSR,
    202			.run_reg = BD71828_REG_BUCK1_VOLT,
    203			.run_mask = BD71828_MASK_BUCK1267_VOLT,
    204			.idle_reg = BD71828_REG_BUCK1_IDLE_VOLT,
    205			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
    206			.idle_on_mask = BD71828_MASK_IDLE_EN,
    207			.suspend_reg = BD71828_REG_BUCK1_SUSP_VOLT,
    208			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
    209			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    210			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    211			/*
    212			 * LPSR voltage is same as SUSPEND voltage. Allow
    213			 * setting it so that regulator can be set enabled at
    214			 * LPSR state
    215			 */
    216			.lpsr_reg = BD71828_REG_BUCK1_SUSP_VOLT,
    217			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
    218		},
    219		.reg_inits = buck1_inits,
    220		.reg_init_amnt = ARRAY_SIZE(buck1_inits),
    221	},
    222	{
    223		.desc = {
    224			.name = "buck2",
    225			.of_match = of_match_ptr("BUCK2"),
    226			.regulators_node = of_match_ptr("regulators"),
    227			.id = BD71828_BUCK2,
    228			.ops = &bd71828_dvs_buck_ops,
    229			.type = REGULATOR_VOLTAGE,
    230			.linear_ranges = bd71828_buck1267_volts,
    231			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
    232			.n_voltages = BD71828_BUCK1267_VOLTS,
    233			.enable_reg = BD71828_REG_BUCK2_EN,
    234			.enable_mask = BD71828_MASK_RUN_EN,
    235			.vsel_reg = BD71828_REG_BUCK2_VOLT,
    236			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
    237			.ramp_delay_table = bd71828_ramp_delay,
    238			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
    239			.ramp_reg = BD71828_REG_BUCK2_MODE,
    240			.ramp_mask = BD71828_MASK_RAMP_DELAY,
    241			.owner = THIS_MODULE,
    242			.of_parse_cb = buck_set_hw_dvs_levels,
    243		},
    244		.dvs = {
    245			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    246				     ROHM_DVS_LEVEL_SUSPEND |
    247				     ROHM_DVS_LEVEL_LPSR,
    248			.run_reg = BD71828_REG_BUCK2_VOLT,
    249			.run_mask = BD71828_MASK_BUCK1267_VOLT,
    250			.idle_reg = BD71828_REG_BUCK2_IDLE_VOLT,
    251			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
    252			.idle_on_mask = BD71828_MASK_IDLE_EN,
    253			.suspend_reg = BD71828_REG_BUCK2_SUSP_VOLT,
    254			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
    255			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    256			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    257			.lpsr_reg = BD71828_REG_BUCK2_SUSP_VOLT,
    258			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
    259		},
    260		.reg_inits = buck2_inits,
    261		.reg_init_amnt = ARRAY_SIZE(buck2_inits),
    262	},
    263	{
    264		.desc = {
    265			.name = "buck3",
    266			.of_match = of_match_ptr("BUCK3"),
    267			.regulators_node = of_match_ptr("regulators"),
    268			.id = BD71828_BUCK3,
    269			.ops = &bd71828_buck_ops,
    270			.type = REGULATOR_VOLTAGE,
    271			.linear_ranges = bd71828_buck3_volts,
    272			.n_linear_ranges = ARRAY_SIZE(bd71828_buck3_volts),
    273			.n_voltages = BD71828_BUCK3_VOLTS,
    274			.enable_reg = BD71828_REG_BUCK3_EN,
    275			.enable_mask = BD71828_MASK_RUN_EN,
    276			.vsel_reg = BD71828_REG_BUCK3_VOLT,
    277			.vsel_mask = BD71828_MASK_BUCK3_VOLT,
    278			.owner = THIS_MODULE,
    279			.of_parse_cb = buck_set_hw_dvs_levels,
    280		},
    281		.dvs = {
    282			/*
    283			 * BUCK3 only supports single voltage for all states.
    284			 * voltage can be individually enabled for each state
    285			 * though => allow setting all states to support
    286			 * enabling power rail on different states.
    287			 */
    288			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    289				     ROHM_DVS_LEVEL_SUSPEND |
    290				     ROHM_DVS_LEVEL_LPSR,
    291			.run_reg = BD71828_REG_BUCK3_VOLT,
    292			.idle_reg = BD71828_REG_BUCK3_VOLT,
    293			.suspend_reg = BD71828_REG_BUCK3_VOLT,
    294			.lpsr_reg = BD71828_REG_BUCK3_VOLT,
    295			.run_mask = BD71828_MASK_BUCK3_VOLT,
    296			.idle_mask = BD71828_MASK_BUCK3_VOLT,
    297			.suspend_mask = BD71828_MASK_BUCK3_VOLT,
    298			.lpsr_mask = BD71828_MASK_BUCK3_VOLT,
    299			.idle_on_mask = BD71828_MASK_IDLE_EN,
    300			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    301			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    302		},
    303	},
    304	{
    305		.desc = {
    306			.name = "buck4",
    307			.of_match = of_match_ptr("BUCK4"),
    308			.regulators_node = of_match_ptr("regulators"),
    309			.id = BD71828_BUCK4,
    310			.ops = &bd71828_buck_ops,
    311			.type = REGULATOR_VOLTAGE,
    312			.linear_ranges = bd71828_buck4_volts,
    313			.n_linear_ranges = ARRAY_SIZE(bd71828_buck4_volts),
    314			.n_voltages = BD71828_BUCK4_VOLTS,
    315			.enable_reg = BD71828_REG_BUCK4_EN,
    316			.enable_mask = BD71828_MASK_RUN_EN,
    317			.vsel_reg = BD71828_REG_BUCK4_VOLT,
    318			.vsel_mask = BD71828_MASK_BUCK4_VOLT,
    319			.owner = THIS_MODULE,
    320			.of_parse_cb = buck_set_hw_dvs_levels,
    321		},
    322		.dvs = {
    323			/*
    324			 * BUCK4 only supports single voltage for all states.
    325			 * voltage can be individually enabled for each state
    326			 * though => allow setting all states to support
    327			 * enabling power rail on different states.
    328			 */
    329			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    330				     ROHM_DVS_LEVEL_SUSPEND |
    331				     ROHM_DVS_LEVEL_LPSR,
    332			.run_reg = BD71828_REG_BUCK4_VOLT,
    333			.idle_reg = BD71828_REG_BUCK4_VOLT,
    334			.suspend_reg = BD71828_REG_BUCK4_VOLT,
    335			.lpsr_reg = BD71828_REG_BUCK4_VOLT,
    336			.run_mask = BD71828_MASK_BUCK4_VOLT,
    337			.idle_mask = BD71828_MASK_BUCK4_VOLT,
    338			.suspend_mask = BD71828_MASK_BUCK4_VOLT,
    339			.lpsr_mask = BD71828_MASK_BUCK4_VOLT,
    340			.idle_on_mask = BD71828_MASK_IDLE_EN,
    341			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    342			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    343		},
    344	},
    345	{
    346		.desc = {
    347			.name = "buck5",
    348			.of_match = of_match_ptr("BUCK5"),
    349			.regulators_node = of_match_ptr("regulators"),
    350			.id = BD71828_BUCK5,
    351			.ops = &bd71828_buck_ops,
    352			.type = REGULATOR_VOLTAGE,
    353			.linear_ranges = bd71828_buck5_volts,
    354			.n_linear_ranges = ARRAY_SIZE(bd71828_buck5_volts),
    355			.n_voltages = BD71828_BUCK5_VOLTS,
    356			.enable_reg = BD71828_REG_BUCK5_EN,
    357			.enable_mask = BD71828_MASK_RUN_EN,
    358			.vsel_reg = BD71828_REG_BUCK5_VOLT,
    359			.vsel_mask = BD71828_MASK_BUCK5_VOLT,
    360			.owner = THIS_MODULE,
    361			.of_parse_cb = buck_set_hw_dvs_levels,
    362		},
    363		.dvs = {
    364			/*
    365			 * BUCK5 only supports single voltage for all states.
    366			 * voltage can be individually enabled for each state
    367			 * though => allow setting all states to support
    368			 * enabling power rail on different states.
    369			 */
    370			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    371				     ROHM_DVS_LEVEL_SUSPEND |
    372				     ROHM_DVS_LEVEL_LPSR,
    373			.run_reg = BD71828_REG_BUCK5_VOLT,
    374			.idle_reg = BD71828_REG_BUCK5_VOLT,
    375			.suspend_reg = BD71828_REG_BUCK5_VOLT,
    376			.lpsr_reg = BD71828_REG_BUCK5_VOLT,
    377			.run_mask = BD71828_MASK_BUCK5_VOLT,
    378			.idle_mask = BD71828_MASK_BUCK5_VOLT,
    379			.suspend_mask = BD71828_MASK_BUCK5_VOLT,
    380			.lpsr_mask = BD71828_MASK_BUCK5_VOLT,
    381			.idle_on_mask = BD71828_MASK_IDLE_EN,
    382			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    383			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    384		},
    385	},
    386	{
    387		.desc = {
    388			.name = "buck6",
    389			.of_match = of_match_ptr("BUCK6"),
    390			.regulators_node = of_match_ptr("regulators"),
    391			.id = BD71828_BUCK6,
    392			.ops = &bd71828_dvs_buck_ops,
    393			.type = REGULATOR_VOLTAGE,
    394			.linear_ranges = bd71828_buck1267_volts,
    395			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
    396			.n_voltages = BD71828_BUCK1267_VOLTS,
    397			.enable_reg = BD71828_REG_BUCK6_EN,
    398			.enable_mask = BD71828_MASK_RUN_EN,
    399			.vsel_reg = BD71828_REG_BUCK6_VOLT,
    400			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
    401			.ramp_delay_table = bd71828_ramp_delay,
    402			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
    403			.ramp_reg = BD71828_REG_BUCK6_MODE,
    404			.ramp_mask = BD71828_MASK_RAMP_DELAY,
    405			.owner = THIS_MODULE,
    406			.of_parse_cb = buck_set_hw_dvs_levels,
    407		},
    408		.dvs = {
    409			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    410				     ROHM_DVS_LEVEL_SUSPEND |
    411				     ROHM_DVS_LEVEL_LPSR,
    412			.run_reg = BD71828_REG_BUCK6_VOLT,
    413			.run_mask = BD71828_MASK_BUCK1267_VOLT,
    414			.idle_reg = BD71828_REG_BUCK6_IDLE_VOLT,
    415			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
    416			.idle_on_mask = BD71828_MASK_IDLE_EN,
    417			.suspend_reg = BD71828_REG_BUCK6_SUSP_VOLT,
    418			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
    419			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    420			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    421			.lpsr_reg = BD71828_REG_BUCK6_SUSP_VOLT,
    422			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
    423		},
    424		.reg_inits = buck6_inits,
    425		.reg_init_amnt = ARRAY_SIZE(buck6_inits),
    426	},
    427	{
    428		.desc = {
    429			.name = "buck7",
    430			.of_match = of_match_ptr("BUCK7"),
    431			.regulators_node = of_match_ptr("regulators"),
    432			.id = BD71828_BUCK7,
    433			.ops = &bd71828_dvs_buck_ops,
    434			.type = REGULATOR_VOLTAGE,
    435			.linear_ranges = bd71828_buck1267_volts,
    436			.n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts),
    437			.n_voltages = BD71828_BUCK1267_VOLTS,
    438			.enable_reg = BD71828_REG_BUCK7_EN,
    439			.enable_mask = BD71828_MASK_RUN_EN,
    440			.vsel_reg = BD71828_REG_BUCK7_VOLT,
    441			.vsel_mask = BD71828_MASK_BUCK1267_VOLT,
    442			.ramp_delay_table = bd71828_ramp_delay,
    443			.n_ramp_values = ARRAY_SIZE(bd71828_ramp_delay),
    444			.ramp_reg = BD71828_REG_BUCK7_MODE,
    445			.ramp_mask = BD71828_MASK_RAMP_DELAY,
    446			.owner = THIS_MODULE,
    447			.of_parse_cb = buck_set_hw_dvs_levels,
    448		},
    449		.dvs = {
    450			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    451				     ROHM_DVS_LEVEL_SUSPEND |
    452				     ROHM_DVS_LEVEL_LPSR,
    453			.run_reg = BD71828_REG_BUCK7_VOLT,
    454			.run_mask = BD71828_MASK_BUCK1267_VOLT,
    455			.idle_reg = BD71828_REG_BUCK7_IDLE_VOLT,
    456			.idle_mask = BD71828_MASK_BUCK1267_VOLT,
    457			.idle_on_mask = BD71828_MASK_IDLE_EN,
    458			.suspend_reg = BD71828_REG_BUCK7_SUSP_VOLT,
    459			.suspend_mask = BD71828_MASK_BUCK1267_VOLT,
    460			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    461			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    462			.lpsr_reg = BD71828_REG_BUCK7_SUSP_VOLT,
    463			.lpsr_mask = BD71828_MASK_BUCK1267_VOLT,
    464		},
    465		.reg_inits = buck7_inits,
    466		.reg_init_amnt = ARRAY_SIZE(buck7_inits),
    467	},
    468	{
    469		.desc = {
    470			.name = "ldo1",
    471			.of_match = of_match_ptr("LDO1"),
    472			.regulators_node = of_match_ptr("regulators"),
    473			.id = BD71828_LDO1,
    474			.ops = &bd71828_ldo_ops,
    475			.type = REGULATOR_VOLTAGE,
    476			.linear_ranges = bd71828_ldo_volts,
    477			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
    478			.n_voltages = BD71828_LDO_VOLTS,
    479			.enable_reg = BD71828_REG_LDO1_EN,
    480			.enable_mask = BD71828_MASK_RUN_EN,
    481			.vsel_reg = BD71828_REG_LDO1_VOLT,
    482			.vsel_mask = BD71828_MASK_LDO_VOLT,
    483			.owner = THIS_MODULE,
    484			.of_parse_cb = buck_set_hw_dvs_levels,
    485		},
    486		.dvs = {
    487			/*
    488			 * LDO1 only supports single voltage for all states.
    489			 * voltage can be individually enabled for each state
    490			 * though => allow setting all states to support
    491			 * enabling power rail on different states.
    492			 */
    493			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    494				     ROHM_DVS_LEVEL_SUSPEND |
    495				     ROHM_DVS_LEVEL_LPSR,
    496			.run_reg = BD71828_REG_LDO1_VOLT,
    497			.idle_reg = BD71828_REG_LDO1_VOLT,
    498			.suspend_reg = BD71828_REG_LDO1_VOLT,
    499			.lpsr_reg = BD71828_REG_LDO1_VOLT,
    500			.run_mask = BD71828_MASK_LDO_VOLT,
    501			.idle_mask = BD71828_MASK_LDO_VOLT,
    502			.suspend_mask = BD71828_MASK_LDO_VOLT,
    503			.lpsr_mask = BD71828_MASK_LDO_VOLT,
    504			.idle_on_mask = BD71828_MASK_IDLE_EN,
    505			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    506			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    507		},
    508	}, {
    509		.desc = {
    510			.name = "ldo2",
    511			.of_match = of_match_ptr("LDO2"),
    512			.regulators_node = of_match_ptr("regulators"),
    513			.id = BD71828_LDO2,
    514			.ops = &bd71828_ldo_ops,
    515			.type = REGULATOR_VOLTAGE,
    516			.linear_ranges = bd71828_ldo_volts,
    517			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
    518			.n_voltages = BD71828_LDO_VOLTS,
    519			.enable_reg = BD71828_REG_LDO2_EN,
    520			.enable_mask = BD71828_MASK_RUN_EN,
    521			.vsel_reg = BD71828_REG_LDO2_VOLT,
    522			.vsel_mask = BD71828_MASK_LDO_VOLT,
    523			.owner = THIS_MODULE,
    524			.of_parse_cb = buck_set_hw_dvs_levels,
    525		},
    526		.dvs = {
    527			/*
    528			 * LDO2 only supports single voltage for all states.
    529			 * voltage can be individually enabled for each state
    530			 * though => allow setting all states to support
    531			 * enabling power rail on different states.
    532			 */
    533			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    534				     ROHM_DVS_LEVEL_SUSPEND |
    535				     ROHM_DVS_LEVEL_LPSR,
    536			.run_reg = BD71828_REG_LDO2_VOLT,
    537			.idle_reg = BD71828_REG_LDO2_VOLT,
    538			.suspend_reg = BD71828_REG_LDO2_VOLT,
    539			.lpsr_reg = BD71828_REG_LDO2_VOLT,
    540			.run_mask = BD71828_MASK_LDO_VOLT,
    541			.idle_mask = BD71828_MASK_LDO_VOLT,
    542			.suspend_mask = BD71828_MASK_LDO_VOLT,
    543			.lpsr_mask = BD71828_MASK_LDO_VOLT,
    544			.idle_on_mask = BD71828_MASK_IDLE_EN,
    545			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    546			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    547		},
    548	}, {
    549		.desc = {
    550			.name = "ldo3",
    551			.of_match = of_match_ptr("LDO3"),
    552			.regulators_node = of_match_ptr("regulators"),
    553			.id = BD71828_LDO3,
    554			.ops = &bd71828_ldo_ops,
    555			.type = REGULATOR_VOLTAGE,
    556			.linear_ranges = bd71828_ldo_volts,
    557			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
    558			.n_voltages = BD71828_LDO_VOLTS,
    559			.enable_reg = BD71828_REG_LDO3_EN,
    560			.enable_mask = BD71828_MASK_RUN_EN,
    561			.vsel_reg = BD71828_REG_LDO3_VOLT,
    562			.vsel_mask = BD71828_MASK_LDO_VOLT,
    563			.owner = THIS_MODULE,
    564			.of_parse_cb = buck_set_hw_dvs_levels,
    565		},
    566		.dvs = {
    567			/*
    568			 * LDO3 only supports single voltage for all states.
    569			 * voltage can be individually enabled for each state
    570			 * though => allow setting all states to support
    571			 * enabling power rail on different states.
    572			 */
    573			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    574				     ROHM_DVS_LEVEL_SUSPEND |
    575				     ROHM_DVS_LEVEL_LPSR,
    576			.run_reg = BD71828_REG_LDO3_VOLT,
    577			.idle_reg = BD71828_REG_LDO3_VOLT,
    578			.suspend_reg = BD71828_REG_LDO3_VOLT,
    579			.lpsr_reg = BD71828_REG_LDO3_VOLT,
    580			.run_mask = BD71828_MASK_LDO_VOLT,
    581			.idle_mask = BD71828_MASK_LDO_VOLT,
    582			.suspend_mask = BD71828_MASK_LDO_VOLT,
    583			.lpsr_mask = BD71828_MASK_LDO_VOLT,
    584			.idle_on_mask = BD71828_MASK_IDLE_EN,
    585			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    586			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    587		},
    588
    589	}, {
    590		.desc = {
    591			.name = "ldo4",
    592			.of_match = of_match_ptr("LDO4"),
    593			.regulators_node = of_match_ptr("regulators"),
    594			.id = BD71828_LDO4,
    595			.ops = &bd71828_ldo_ops,
    596			.type = REGULATOR_VOLTAGE,
    597			.linear_ranges = bd71828_ldo_volts,
    598			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
    599			.n_voltages = BD71828_LDO_VOLTS,
    600			.enable_reg = BD71828_REG_LDO4_EN,
    601			.enable_mask = BD71828_MASK_RUN_EN,
    602			.vsel_reg = BD71828_REG_LDO4_VOLT,
    603			.vsel_mask = BD71828_MASK_LDO_VOLT,
    604			.owner = THIS_MODULE,
    605			.of_parse_cb = buck_set_hw_dvs_levels,
    606		},
    607		.dvs = {
    608			/*
    609			 * LDO1 only supports single voltage for all states.
    610			 * voltage can be individually enabled for each state
    611			 * though => allow setting all states to support
    612			 * enabling power rail on different states.
    613			 */
    614			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    615				     ROHM_DVS_LEVEL_SUSPEND |
    616				     ROHM_DVS_LEVEL_LPSR,
    617			.run_reg = BD71828_REG_LDO4_VOLT,
    618			.idle_reg = BD71828_REG_LDO4_VOLT,
    619			.suspend_reg = BD71828_REG_LDO4_VOLT,
    620			.lpsr_reg = BD71828_REG_LDO4_VOLT,
    621			.run_mask = BD71828_MASK_LDO_VOLT,
    622			.idle_mask = BD71828_MASK_LDO_VOLT,
    623			.suspend_mask = BD71828_MASK_LDO_VOLT,
    624			.lpsr_mask = BD71828_MASK_LDO_VOLT,
    625			.idle_on_mask = BD71828_MASK_IDLE_EN,
    626			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    627			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    628		},
    629	}, {
    630		.desc = {
    631			.name = "ldo5",
    632			.of_match = of_match_ptr("LDO5"),
    633			.regulators_node = of_match_ptr("regulators"),
    634			.id = BD71828_LDO5,
    635			.ops = &bd71828_ldo_ops,
    636			.type = REGULATOR_VOLTAGE,
    637			.linear_ranges = bd71828_ldo_volts,
    638			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
    639			.n_voltages = BD71828_LDO_VOLTS,
    640			.enable_reg = BD71828_REG_LDO5_EN,
    641			.enable_mask = BD71828_MASK_RUN_EN,
    642			.vsel_reg = BD71828_REG_LDO5_VOLT,
    643			.vsel_mask = BD71828_MASK_LDO_VOLT,
    644			.of_parse_cb = buck_set_hw_dvs_levels,
    645			.owner = THIS_MODULE,
    646		},
    647		/*
    648		 * LDO5 is special. It can choose vsel settings to be configured
    649		 * from 2 different registers (by GPIO).
    650		 *
    651		 * This driver supports only configuration where
    652		 * BD71828_REG_LDO5_VOLT_L is used.
    653		 */
    654		.dvs = {
    655			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    656				     ROHM_DVS_LEVEL_SUSPEND |
    657				     ROHM_DVS_LEVEL_LPSR,
    658			.run_reg = BD71828_REG_LDO5_VOLT,
    659			.idle_reg = BD71828_REG_LDO5_VOLT,
    660			.suspend_reg = BD71828_REG_LDO5_VOLT,
    661			.lpsr_reg = BD71828_REG_LDO5_VOLT,
    662			.run_mask = BD71828_MASK_LDO_VOLT,
    663			.idle_mask = BD71828_MASK_LDO_VOLT,
    664			.suspend_mask = BD71828_MASK_LDO_VOLT,
    665			.lpsr_mask = BD71828_MASK_LDO_VOLT,
    666			.idle_on_mask = BD71828_MASK_IDLE_EN,
    667			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    668			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    669		},
    670
    671	}, {
    672		.desc = {
    673			.name = "ldo6",
    674			.of_match = of_match_ptr("LDO6"),
    675			.regulators_node = of_match_ptr("regulators"),
    676			.id = BD71828_LDO6,
    677			.ops = &bd71828_ldo6_ops,
    678			.type = REGULATOR_VOLTAGE,
    679			.fixed_uV = BD71828_LDO_6_VOLTAGE,
    680			.n_voltages = 1,
    681			.enable_reg = BD71828_REG_LDO6_EN,
    682			.enable_mask = BD71828_MASK_RUN_EN,
    683			.owner = THIS_MODULE,
    684			/*
    685			 * LDO6 only supports enable/disable for all states.
    686			 * Voltage for LDO6 is fixed.
    687			 */
    688			.of_parse_cb = ldo6_parse_dt,
    689		},
    690	}, {
    691		.desc = {
    692			/* SNVS LDO in data-sheet */
    693			.name = "ldo7",
    694			.of_match = of_match_ptr("LDO7"),
    695			.regulators_node = of_match_ptr("regulators"),
    696			.id = BD71828_LDO_SNVS,
    697			.ops = &bd71828_ldo_ops,
    698			.type = REGULATOR_VOLTAGE,
    699			.linear_ranges = bd71828_ldo_volts,
    700			.n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts),
    701			.n_voltages = BD71828_LDO_VOLTS,
    702			.enable_reg = BD71828_REG_LDO7_EN,
    703			.enable_mask = BD71828_MASK_RUN_EN,
    704			.vsel_reg = BD71828_REG_LDO7_VOLT,
    705			.vsel_mask = BD71828_MASK_LDO_VOLT,
    706			.owner = THIS_MODULE,
    707			.of_parse_cb = buck_set_hw_dvs_levels,
    708		},
    709		.dvs = {
    710			/*
    711			 * LDO7 only supports single voltage for all states.
    712			 * voltage can be individually enabled for each state
    713			 * though => allow setting all states to support
    714			 * enabling power rail on different states.
    715			 */
    716			.level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
    717				     ROHM_DVS_LEVEL_SUSPEND |
    718				     ROHM_DVS_LEVEL_LPSR,
    719			.run_reg = BD71828_REG_LDO7_VOLT,
    720			.idle_reg = BD71828_REG_LDO7_VOLT,
    721			.suspend_reg = BD71828_REG_LDO7_VOLT,
    722			.lpsr_reg = BD71828_REG_LDO7_VOLT,
    723			.run_mask = BD71828_MASK_LDO_VOLT,
    724			.idle_mask = BD71828_MASK_LDO_VOLT,
    725			.suspend_mask = BD71828_MASK_LDO_VOLT,
    726			.lpsr_mask = BD71828_MASK_LDO_VOLT,
    727			.idle_on_mask = BD71828_MASK_IDLE_EN,
    728			.suspend_on_mask = BD71828_MASK_SUSP_EN,
    729			.lpsr_on_mask = BD71828_MASK_LPSR_EN,
    730		},
    731
    732	},
    733};
    734
    735static int bd71828_probe(struct platform_device *pdev)
    736{
    737	int i, j, ret;
    738	struct regulator_config config = {
    739		.dev = pdev->dev.parent,
    740	};
    741
    742	config.regmap = dev_get_regmap(pdev->dev.parent, NULL);
    743	if (!config.regmap)
    744		return -ENODEV;
    745
    746	for (i = 0; i < ARRAY_SIZE(bd71828_rdata); i++) {
    747		struct regulator_dev *rdev;
    748		const struct bd71828_regulator_data *rd;
    749
    750		rd = &bd71828_rdata[i];
    751		rdev = devm_regulator_register(&pdev->dev,
    752					       &rd->desc, &config);
    753		if (IS_ERR(rdev)) {
    754			dev_err(&pdev->dev,
    755				"failed to register %s regulator\n",
    756				rd->desc.name);
    757			return PTR_ERR(rdev);
    758		}
    759		for (j = 0; j < rd->reg_init_amnt; j++) {
    760			ret = regmap_update_bits(config.regmap,
    761						 rd->reg_inits[j].reg,
    762						 rd->reg_inits[j].mask,
    763						 rd->reg_inits[j].val);
    764			if (ret) {
    765				dev_err(&pdev->dev,
    766					"regulator %s init failed\n",
    767					rd->desc.name);
    768				return ret;
    769			}
    770		}
    771	}
    772	return 0;
    773}
    774
    775static struct platform_driver bd71828_regulator = {
    776	.driver = {
    777		.name = "bd71828-pmic"
    778	},
    779	.probe = bd71828_probe,
    780};
    781
    782module_platform_driver(bd71828_regulator);
    783
    784MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
    785MODULE_DESCRIPTION("BD71828 voltage regulator driver");
    786MODULE_LICENSE("GPL");
    787MODULE_ALIAS("platform:bd71828-pmic");