18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) ST-Ericsson SA 2010
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
68c2ecf20Sopenharmony_ci *          Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
78c2ecf20Sopenharmony_ci *          Daniel Willerud <daniel.willerud@stericsson.com> for ST-Ericsson
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * AB8500 peripheral regulators
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci * AB8500 supports the following regulators:
128c2ecf20Sopenharmony_ci *   VAUX1/2/3, VINTCORE, VTVOUT, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
138c2ecf20Sopenharmony_ci *
148c2ecf20Sopenharmony_ci * AB8505 supports the following regulators:
158c2ecf20Sopenharmony_ci *   VAUX1/2/3/4/5/6, VINTCORE, VADC, VUSB, VAUDIO, VAMIC1/2, VDMIC, VANA
168c2ecf20Sopenharmony_ci */
178c2ecf20Sopenharmony_ci#include <linux/init.h>
188c2ecf20Sopenharmony_ci#include <linux/kernel.h>
198c2ecf20Sopenharmony_ci#include <linux/module.h>
208c2ecf20Sopenharmony_ci#include <linux/err.h>
218c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
228c2ecf20Sopenharmony_ci#include <linux/mfd/abx500.h>
238c2ecf20Sopenharmony_ci#include <linux/mfd/abx500/ab8500.h>
248c2ecf20Sopenharmony_ci#include <linux/of.h>
258c2ecf20Sopenharmony_ci#include <linux/regulator/of_regulator.h>
268c2ecf20Sopenharmony_ci#include <linux/regulator/driver.h>
278c2ecf20Sopenharmony_ci#include <linux/regulator/machine.h>
288c2ecf20Sopenharmony_ci#include <linux/regulator/ab8500.h>
298c2ecf20Sopenharmony_ci#include <linux/slab.h>
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/**
328c2ecf20Sopenharmony_ci * struct ab8500_shared_mode - is used when mode is shared between
338c2ecf20Sopenharmony_ci * two regulators.
348c2ecf20Sopenharmony_ci * @shared_regulator: pointer to the other sharing regulator
358c2ecf20Sopenharmony_ci * @lp_mode_req: low power mode requested by this regulator
368c2ecf20Sopenharmony_ci */
378c2ecf20Sopenharmony_cistruct ab8500_shared_mode {
388c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *shared_regulator;
398c2ecf20Sopenharmony_ci	bool lp_mode_req;
408c2ecf20Sopenharmony_ci};
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/**
438c2ecf20Sopenharmony_ci * struct ab8500_regulator_info - ab8500 regulator information
448c2ecf20Sopenharmony_ci * @dev: device pointer
458c2ecf20Sopenharmony_ci * @desc: regulator description
468c2ecf20Sopenharmony_ci * @shared_mode: used when mode is shared between two regulators
478c2ecf20Sopenharmony_ci * @load_lp_uA: maximum load in idle (low power) mode
488c2ecf20Sopenharmony_ci * @update_bank: bank to control on/off
498c2ecf20Sopenharmony_ci * @update_reg: register to control on/off
508c2ecf20Sopenharmony_ci * @update_mask: mask to enable/disable and set mode of regulator
518c2ecf20Sopenharmony_ci * @update_val: bits holding the regulator current mode
528c2ecf20Sopenharmony_ci * @update_val_idle: bits to enable the regulator in idle (low power) mode
538c2ecf20Sopenharmony_ci * @update_val_normal: bits to enable the regulator in normal (high power) mode
548c2ecf20Sopenharmony_ci * @mode_bank: bank with location of mode register
558c2ecf20Sopenharmony_ci * @mode_reg: mode register
568c2ecf20Sopenharmony_ci * @mode_mask: mask for setting mode
578c2ecf20Sopenharmony_ci * @mode_val_idle: mode setting for low power
588c2ecf20Sopenharmony_ci * @mode_val_normal: mode setting for normal power
598c2ecf20Sopenharmony_ci * @voltage_bank: bank to control regulator voltage
608c2ecf20Sopenharmony_ci * @voltage_reg: register to control regulator voltage
618c2ecf20Sopenharmony_ci * @voltage_mask: mask to control regulator voltage
628c2ecf20Sopenharmony_ci * @expand_register:
638c2ecf20Sopenharmony_ci */
648c2ecf20Sopenharmony_cistruct ab8500_regulator_info {
658c2ecf20Sopenharmony_ci	struct device		*dev;
668c2ecf20Sopenharmony_ci	struct regulator_desc	desc;
678c2ecf20Sopenharmony_ci	struct ab8500_shared_mode *shared_mode;
688c2ecf20Sopenharmony_ci	int load_lp_uA;
698c2ecf20Sopenharmony_ci	u8 update_bank;
708c2ecf20Sopenharmony_ci	u8 update_reg;
718c2ecf20Sopenharmony_ci	u8 update_mask;
728c2ecf20Sopenharmony_ci	u8 update_val;
738c2ecf20Sopenharmony_ci	u8 update_val_idle;
748c2ecf20Sopenharmony_ci	u8 update_val_normal;
758c2ecf20Sopenharmony_ci	u8 mode_bank;
768c2ecf20Sopenharmony_ci	u8 mode_reg;
778c2ecf20Sopenharmony_ci	u8 mode_mask;
788c2ecf20Sopenharmony_ci	u8 mode_val_idle;
798c2ecf20Sopenharmony_ci	u8 mode_val_normal;
808c2ecf20Sopenharmony_ci	u8 voltage_bank;
818c2ecf20Sopenharmony_ci	u8 voltage_reg;
828c2ecf20Sopenharmony_ci	u8 voltage_mask;
838c2ecf20Sopenharmony_ci};
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci/* voltage tables for the vauxn/vintcore supplies */
868c2ecf20Sopenharmony_cistatic const unsigned int ldo_vauxn_voltages[] = {
878c2ecf20Sopenharmony_ci	1100000,
888c2ecf20Sopenharmony_ci	1200000,
898c2ecf20Sopenharmony_ci	1300000,
908c2ecf20Sopenharmony_ci	1400000,
918c2ecf20Sopenharmony_ci	1500000,
928c2ecf20Sopenharmony_ci	1800000,
938c2ecf20Sopenharmony_ci	1850000,
948c2ecf20Sopenharmony_ci	1900000,
958c2ecf20Sopenharmony_ci	2500000,
968c2ecf20Sopenharmony_ci	2650000,
978c2ecf20Sopenharmony_ci	2700000,
988c2ecf20Sopenharmony_ci	2750000,
998c2ecf20Sopenharmony_ci	2800000,
1008c2ecf20Sopenharmony_ci	2900000,
1018c2ecf20Sopenharmony_ci	3000000,
1028c2ecf20Sopenharmony_ci	3300000,
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistatic const unsigned int ldo_vaux3_voltages[] = {
1068c2ecf20Sopenharmony_ci	1200000,
1078c2ecf20Sopenharmony_ci	1500000,
1088c2ecf20Sopenharmony_ci	1800000,
1098c2ecf20Sopenharmony_ci	2100000,
1108c2ecf20Sopenharmony_ci	2500000,
1118c2ecf20Sopenharmony_ci	2750000,
1128c2ecf20Sopenharmony_ci	2790000,
1138c2ecf20Sopenharmony_ci	2910000,
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cistatic const unsigned int ldo_vaux56_voltages[] = {
1178c2ecf20Sopenharmony_ci	1800000,
1188c2ecf20Sopenharmony_ci	1050000,
1198c2ecf20Sopenharmony_ci	1100000,
1208c2ecf20Sopenharmony_ci	1200000,
1218c2ecf20Sopenharmony_ci	1500000,
1228c2ecf20Sopenharmony_ci	2200000,
1238c2ecf20Sopenharmony_ci	2500000,
1248c2ecf20Sopenharmony_ci	2790000,
1258c2ecf20Sopenharmony_ci};
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_cistatic const unsigned int ldo_vintcore_voltages[] = {
1288c2ecf20Sopenharmony_ci	1200000,
1298c2ecf20Sopenharmony_ci	1225000,
1308c2ecf20Sopenharmony_ci	1250000,
1318c2ecf20Sopenharmony_ci	1275000,
1328c2ecf20Sopenharmony_ci	1300000,
1338c2ecf20Sopenharmony_ci	1325000,
1348c2ecf20Sopenharmony_ci	1350000,
1358c2ecf20Sopenharmony_ci};
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cistatic const unsigned int fixed_1200000_voltage[] = {
1388c2ecf20Sopenharmony_ci	1200000,
1398c2ecf20Sopenharmony_ci};
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_cistatic const unsigned int fixed_1800000_voltage[] = {
1428c2ecf20Sopenharmony_ci	1800000,
1438c2ecf20Sopenharmony_ci};
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_cistatic const unsigned int fixed_2000000_voltage[] = {
1468c2ecf20Sopenharmony_ci	2000000,
1478c2ecf20Sopenharmony_ci};
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_cistatic const unsigned int fixed_2050000_voltage[] = {
1508c2ecf20Sopenharmony_ci	2050000,
1518c2ecf20Sopenharmony_ci};
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_cistatic const unsigned int ldo_vana_voltages[] = {
1548c2ecf20Sopenharmony_ci	1050000,
1558c2ecf20Sopenharmony_ci	1075000,
1568c2ecf20Sopenharmony_ci	1100000,
1578c2ecf20Sopenharmony_ci	1125000,
1588c2ecf20Sopenharmony_ci	1150000,
1598c2ecf20Sopenharmony_ci	1175000,
1608c2ecf20Sopenharmony_ci	1200000,
1618c2ecf20Sopenharmony_ci	1225000,
1628c2ecf20Sopenharmony_ci};
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_cistatic const unsigned int ldo_vaudio_voltages[] = {
1658c2ecf20Sopenharmony_ci	2000000,
1668c2ecf20Sopenharmony_ci	2100000,
1678c2ecf20Sopenharmony_ci	2200000,
1688c2ecf20Sopenharmony_ci	2300000,
1698c2ecf20Sopenharmony_ci	2400000,
1708c2ecf20Sopenharmony_ci	2500000,
1718c2ecf20Sopenharmony_ci	2600000,
1728c2ecf20Sopenharmony_ci	2600000,	/* Duplicated in Vaudio and IsoUicc Control register. */
1738c2ecf20Sopenharmony_ci};
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(shared_mode_mutex);
1768c2ecf20Sopenharmony_cistatic struct ab8500_shared_mode ldo_anamic1_shared;
1778c2ecf20Sopenharmony_cistatic struct ab8500_shared_mode ldo_anamic2_shared;
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_cistatic int ab8500_regulator_enable(struct regulator_dev *rdev)
1808c2ecf20Sopenharmony_ci{
1818c2ecf20Sopenharmony_ci	int ret;
1828c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci	if (info == NULL) {
1858c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
1868c2ecf20Sopenharmony_ci		return -EINVAL;
1878c2ecf20Sopenharmony_ci	}
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	ret = abx500_mask_and_set_register_interruptible(info->dev,
1908c2ecf20Sopenharmony_ci		info->update_bank, info->update_reg,
1918c2ecf20Sopenharmony_ci		info->update_mask, info->update_val);
1928c2ecf20Sopenharmony_ci	if (ret < 0) {
1938c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev),
1948c2ecf20Sopenharmony_ci			"couldn't set enable bits for regulator\n");
1958c2ecf20Sopenharmony_ci		return ret;
1968c2ecf20Sopenharmony_ci	}
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	dev_vdbg(rdev_get_dev(rdev),
1998c2ecf20Sopenharmony_ci		"%s-enable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
2008c2ecf20Sopenharmony_ci		info->desc.name, info->update_bank, info->update_reg,
2018c2ecf20Sopenharmony_ci		info->update_mask, info->update_val);
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	return ret;
2048c2ecf20Sopenharmony_ci}
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_cistatic int ab8500_regulator_disable(struct regulator_dev *rdev)
2078c2ecf20Sopenharmony_ci{
2088c2ecf20Sopenharmony_ci	int ret;
2098c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci	if (info == NULL) {
2128c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
2138c2ecf20Sopenharmony_ci		return -EINVAL;
2148c2ecf20Sopenharmony_ci	}
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci	ret = abx500_mask_and_set_register_interruptible(info->dev,
2178c2ecf20Sopenharmony_ci		info->update_bank, info->update_reg,
2188c2ecf20Sopenharmony_ci		info->update_mask, 0x0);
2198c2ecf20Sopenharmony_ci	if (ret < 0) {
2208c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev),
2218c2ecf20Sopenharmony_ci			"couldn't set disable bits for regulator\n");
2228c2ecf20Sopenharmony_ci		return ret;
2238c2ecf20Sopenharmony_ci	}
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	dev_vdbg(rdev_get_dev(rdev),
2268c2ecf20Sopenharmony_ci		"%s-disable (bank, reg, mask, value): 0x%x, 0x%x, 0x%x, 0x%x\n",
2278c2ecf20Sopenharmony_ci		info->desc.name, info->update_bank, info->update_reg,
2288c2ecf20Sopenharmony_ci		info->update_mask, 0x0);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	return ret;
2318c2ecf20Sopenharmony_ci}
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_cistatic int ab8500_regulator_is_enabled(struct regulator_dev *rdev)
2348c2ecf20Sopenharmony_ci{
2358c2ecf20Sopenharmony_ci	int ret;
2368c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
2378c2ecf20Sopenharmony_ci	u8 regval;
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci	if (info == NULL) {
2408c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
2418c2ecf20Sopenharmony_ci		return -EINVAL;
2428c2ecf20Sopenharmony_ci	}
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci	ret = abx500_get_register_interruptible(info->dev,
2458c2ecf20Sopenharmony_ci		info->update_bank, info->update_reg, &regval);
2468c2ecf20Sopenharmony_ci	if (ret < 0) {
2478c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev),
2488c2ecf20Sopenharmony_ci			"couldn't read 0x%x register\n", info->update_reg);
2498c2ecf20Sopenharmony_ci		return ret;
2508c2ecf20Sopenharmony_ci	}
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci	dev_vdbg(rdev_get_dev(rdev),
2538c2ecf20Sopenharmony_ci		"%s-is_enabled (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
2548c2ecf20Sopenharmony_ci		" 0x%x\n",
2558c2ecf20Sopenharmony_ci		info->desc.name, info->update_bank, info->update_reg,
2568c2ecf20Sopenharmony_ci		info->update_mask, regval);
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci	if (regval & info->update_mask)
2598c2ecf20Sopenharmony_ci		return 1;
2608c2ecf20Sopenharmony_ci	else
2618c2ecf20Sopenharmony_ci		return 0;
2628c2ecf20Sopenharmony_ci}
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_cistatic unsigned int ab8500_regulator_get_optimum_mode(
2658c2ecf20Sopenharmony_ci		struct regulator_dev *rdev, int input_uV,
2668c2ecf20Sopenharmony_ci		int output_uV, int load_uA)
2678c2ecf20Sopenharmony_ci{
2688c2ecf20Sopenharmony_ci	unsigned int mode;
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci	if (info == NULL) {
2738c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
2748c2ecf20Sopenharmony_ci		return -EINVAL;
2758c2ecf20Sopenharmony_ci	}
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci	if (load_uA <= info->load_lp_uA)
2788c2ecf20Sopenharmony_ci		mode = REGULATOR_MODE_IDLE;
2798c2ecf20Sopenharmony_ci	else
2808c2ecf20Sopenharmony_ci		mode = REGULATOR_MODE_NORMAL;
2818c2ecf20Sopenharmony_ci
2828c2ecf20Sopenharmony_ci	return mode;
2838c2ecf20Sopenharmony_ci}
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_cistatic int ab8500_regulator_set_mode(struct regulator_dev *rdev,
2868c2ecf20Sopenharmony_ci				     unsigned int mode)
2878c2ecf20Sopenharmony_ci{
2888c2ecf20Sopenharmony_ci	int ret = 0;
2898c2ecf20Sopenharmony_ci	u8 bank, reg, mask, val;
2908c2ecf20Sopenharmony_ci	bool lp_mode_req = false;
2918c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci	if (info == NULL) {
2948c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
2958c2ecf20Sopenharmony_ci		return -EINVAL;
2968c2ecf20Sopenharmony_ci	}
2978c2ecf20Sopenharmony_ci
2988c2ecf20Sopenharmony_ci	if (info->mode_mask) {
2998c2ecf20Sopenharmony_ci		bank = info->mode_bank;
3008c2ecf20Sopenharmony_ci		reg = info->mode_reg;
3018c2ecf20Sopenharmony_ci		mask = info->mode_mask;
3028c2ecf20Sopenharmony_ci	} else {
3038c2ecf20Sopenharmony_ci		bank = info->update_bank;
3048c2ecf20Sopenharmony_ci		reg = info->update_reg;
3058c2ecf20Sopenharmony_ci		mask = info->update_mask;
3068c2ecf20Sopenharmony_ci	}
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci	if (info->shared_mode)
3098c2ecf20Sopenharmony_ci		mutex_lock(&shared_mode_mutex);
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci	switch (mode) {
3128c2ecf20Sopenharmony_ci	case REGULATOR_MODE_NORMAL:
3138c2ecf20Sopenharmony_ci		if (info->shared_mode)
3148c2ecf20Sopenharmony_ci			lp_mode_req = false;
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci		if (info->mode_mask)
3178c2ecf20Sopenharmony_ci			val = info->mode_val_normal;
3188c2ecf20Sopenharmony_ci		else
3198c2ecf20Sopenharmony_ci			val = info->update_val_normal;
3208c2ecf20Sopenharmony_ci		break;
3218c2ecf20Sopenharmony_ci	case REGULATOR_MODE_IDLE:
3228c2ecf20Sopenharmony_ci		if (info->shared_mode) {
3238c2ecf20Sopenharmony_ci			struct ab8500_regulator_info *shared_regulator;
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ci			shared_regulator = info->shared_mode->shared_regulator;
3268c2ecf20Sopenharmony_ci			if (!shared_regulator->shared_mode->lp_mode_req) {
3278c2ecf20Sopenharmony_ci				/* Other regulator prevent LP mode */
3288c2ecf20Sopenharmony_ci				info->shared_mode->lp_mode_req = true;
3298c2ecf20Sopenharmony_ci				goto out_unlock;
3308c2ecf20Sopenharmony_ci			}
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci			lp_mode_req = true;
3338c2ecf20Sopenharmony_ci		}
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_ci		if (info->mode_mask)
3368c2ecf20Sopenharmony_ci			val = info->mode_val_idle;
3378c2ecf20Sopenharmony_ci		else
3388c2ecf20Sopenharmony_ci			val = info->update_val_idle;
3398c2ecf20Sopenharmony_ci		break;
3408c2ecf20Sopenharmony_ci	default:
3418c2ecf20Sopenharmony_ci		ret = -EINVAL;
3428c2ecf20Sopenharmony_ci		goto out_unlock;
3438c2ecf20Sopenharmony_ci	}
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci	if (info->mode_mask || ab8500_regulator_is_enabled(rdev)) {
3468c2ecf20Sopenharmony_ci		ret = abx500_mask_and_set_register_interruptible(info->dev,
3478c2ecf20Sopenharmony_ci			bank, reg, mask, val);
3488c2ecf20Sopenharmony_ci		if (ret < 0) {
3498c2ecf20Sopenharmony_ci			dev_err(rdev_get_dev(rdev),
3508c2ecf20Sopenharmony_ci				"couldn't set regulator mode\n");
3518c2ecf20Sopenharmony_ci			goto out_unlock;
3528c2ecf20Sopenharmony_ci		}
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_ci		dev_vdbg(rdev_get_dev(rdev),
3558c2ecf20Sopenharmony_ci			"%s-set_mode (bank, reg, mask, value): "
3568c2ecf20Sopenharmony_ci			"0x%x, 0x%x, 0x%x, 0x%x\n",
3578c2ecf20Sopenharmony_ci			info->desc.name, bank, reg,
3588c2ecf20Sopenharmony_ci			mask, val);
3598c2ecf20Sopenharmony_ci	}
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci	if (!info->mode_mask)
3628c2ecf20Sopenharmony_ci		info->update_val = val;
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ci	if (info->shared_mode)
3658c2ecf20Sopenharmony_ci		info->shared_mode->lp_mode_req = lp_mode_req;
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ciout_unlock:
3688c2ecf20Sopenharmony_ci	if (info->shared_mode)
3698c2ecf20Sopenharmony_ci		mutex_unlock(&shared_mode_mutex);
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci	return ret;
3728c2ecf20Sopenharmony_ci}
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_cistatic unsigned int ab8500_regulator_get_mode(struct regulator_dev *rdev)
3758c2ecf20Sopenharmony_ci{
3768c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
3778c2ecf20Sopenharmony_ci	int ret;
3788c2ecf20Sopenharmony_ci	u8 val;
3798c2ecf20Sopenharmony_ci	u8 val_normal;
3808c2ecf20Sopenharmony_ci	u8 val_idle;
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci	if (info == NULL) {
3838c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
3848c2ecf20Sopenharmony_ci		return -EINVAL;
3858c2ecf20Sopenharmony_ci	}
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci	/* Need special handling for shared mode */
3888c2ecf20Sopenharmony_ci	if (info->shared_mode) {
3898c2ecf20Sopenharmony_ci		if (info->shared_mode->lp_mode_req)
3908c2ecf20Sopenharmony_ci			return REGULATOR_MODE_IDLE;
3918c2ecf20Sopenharmony_ci		else
3928c2ecf20Sopenharmony_ci			return REGULATOR_MODE_NORMAL;
3938c2ecf20Sopenharmony_ci	}
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_ci	if (info->mode_mask) {
3968c2ecf20Sopenharmony_ci		/* Dedicated register for handling mode */
3978c2ecf20Sopenharmony_ci		ret = abx500_get_register_interruptible(info->dev,
3988c2ecf20Sopenharmony_ci		info->mode_bank, info->mode_reg, &val);
3998c2ecf20Sopenharmony_ci		val = val & info->mode_mask;
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci		val_normal = info->mode_val_normal;
4028c2ecf20Sopenharmony_ci		val_idle = info->mode_val_idle;
4038c2ecf20Sopenharmony_ci	} else {
4048c2ecf20Sopenharmony_ci		/* Mode register same as enable register */
4058c2ecf20Sopenharmony_ci		val = info->update_val;
4068c2ecf20Sopenharmony_ci		val_normal = info->update_val_normal;
4078c2ecf20Sopenharmony_ci		val_idle = info->update_val_idle;
4088c2ecf20Sopenharmony_ci	}
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci	if (val == val_normal)
4118c2ecf20Sopenharmony_ci		ret = REGULATOR_MODE_NORMAL;
4128c2ecf20Sopenharmony_ci	else if (val == val_idle)
4138c2ecf20Sopenharmony_ci		ret = REGULATOR_MODE_IDLE;
4148c2ecf20Sopenharmony_ci	else
4158c2ecf20Sopenharmony_ci		ret = -EINVAL;
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci	return ret;
4188c2ecf20Sopenharmony_ci}
4198c2ecf20Sopenharmony_ci
4208c2ecf20Sopenharmony_cistatic int ab8500_regulator_get_voltage_sel(struct regulator_dev *rdev)
4218c2ecf20Sopenharmony_ci{
4228c2ecf20Sopenharmony_ci	int ret, voltage_shift;
4238c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
4248c2ecf20Sopenharmony_ci	u8 regval;
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	if (info == NULL) {
4278c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
4288c2ecf20Sopenharmony_ci		return -EINVAL;
4298c2ecf20Sopenharmony_ci	}
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci	voltage_shift = ffs(info->voltage_mask) - 1;
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci	ret = abx500_get_register_interruptible(info->dev,
4348c2ecf20Sopenharmony_ci			info->voltage_bank, info->voltage_reg, &regval);
4358c2ecf20Sopenharmony_ci	if (ret < 0) {
4368c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev),
4378c2ecf20Sopenharmony_ci			"couldn't read voltage reg for regulator\n");
4388c2ecf20Sopenharmony_ci		return ret;
4398c2ecf20Sopenharmony_ci	}
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_ci	dev_vdbg(rdev_get_dev(rdev),
4428c2ecf20Sopenharmony_ci		"%s-get_voltage (bank, reg, mask, shift, value): "
4438c2ecf20Sopenharmony_ci		"0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
4448c2ecf20Sopenharmony_ci		info->desc.name, info->voltage_bank,
4458c2ecf20Sopenharmony_ci		info->voltage_reg, info->voltage_mask,
4468c2ecf20Sopenharmony_ci		voltage_shift, regval);
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci	return (regval & info->voltage_mask) >> voltage_shift;
4498c2ecf20Sopenharmony_ci}
4508c2ecf20Sopenharmony_ci
4518c2ecf20Sopenharmony_cistatic int ab8500_regulator_set_voltage_sel(struct regulator_dev *rdev,
4528c2ecf20Sopenharmony_ci					    unsigned selector)
4538c2ecf20Sopenharmony_ci{
4548c2ecf20Sopenharmony_ci	int ret, voltage_shift;
4558c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = rdev_get_drvdata(rdev);
4568c2ecf20Sopenharmony_ci	u8 regval;
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	if (info == NULL) {
4598c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
4608c2ecf20Sopenharmony_ci		return -EINVAL;
4618c2ecf20Sopenharmony_ci	}
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci	voltage_shift = ffs(info->voltage_mask) - 1;
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	/* set the registers for the request */
4668c2ecf20Sopenharmony_ci	regval = (u8)selector << voltage_shift;
4678c2ecf20Sopenharmony_ci	ret = abx500_mask_and_set_register_interruptible(info->dev,
4688c2ecf20Sopenharmony_ci			info->voltage_bank, info->voltage_reg,
4698c2ecf20Sopenharmony_ci			info->voltage_mask, regval);
4708c2ecf20Sopenharmony_ci	if (ret < 0)
4718c2ecf20Sopenharmony_ci		dev_err(rdev_get_dev(rdev),
4728c2ecf20Sopenharmony_ci		"couldn't set voltage reg for regulator\n");
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_ci	dev_vdbg(rdev_get_dev(rdev),
4758c2ecf20Sopenharmony_ci		"%s-set_voltage (bank, reg, mask, value): 0x%x, 0x%x, 0x%x,"
4768c2ecf20Sopenharmony_ci		" 0x%x\n",
4778c2ecf20Sopenharmony_ci		info->desc.name, info->voltage_bank, info->voltage_reg,
4788c2ecf20Sopenharmony_ci		info->voltage_mask, regval);
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci	return ret;
4818c2ecf20Sopenharmony_ci}
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_cistatic const struct regulator_ops ab8500_regulator_volt_mode_ops = {
4848c2ecf20Sopenharmony_ci	.enable			= ab8500_regulator_enable,
4858c2ecf20Sopenharmony_ci	.disable		= ab8500_regulator_disable,
4868c2ecf20Sopenharmony_ci	.is_enabled		= ab8500_regulator_is_enabled,
4878c2ecf20Sopenharmony_ci	.get_optimum_mode	= ab8500_regulator_get_optimum_mode,
4888c2ecf20Sopenharmony_ci	.set_mode		= ab8500_regulator_set_mode,
4898c2ecf20Sopenharmony_ci	.get_mode		= ab8500_regulator_get_mode,
4908c2ecf20Sopenharmony_ci	.get_voltage_sel 	= ab8500_regulator_get_voltage_sel,
4918c2ecf20Sopenharmony_ci	.set_voltage_sel	= ab8500_regulator_set_voltage_sel,
4928c2ecf20Sopenharmony_ci	.list_voltage		= regulator_list_voltage_table,
4938c2ecf20Sopenharmony_ci};
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_cistatic const struct regulator_ops ab8500_regulator_volt_ops = {
4968c2ecf20Sopenharmony_ci	.enable		= ab8500_regulator_enable,
4978c2ecf20Sopenharmony_ci	.disable	= ab8500_regulator_disable,
4988c2ecf20Sopenharmony_ci	.is_enabled	= ab8500_regulator_is_enabled,
4998c2ecf20Sopenharmony_ci	.get_voltage_sel = ab8500_regulator_get_voltage_sel,
5008c2ecf20Sopenharmony_ci	.set_voltage_sel = ab8500_regulator_set_voltage_sel,
5018c2ecf20Sopenharmony_ci	.list_voltage	= regulator_list_voltage_table,
5028c2ecf20Sopenharmony_ci};
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_cistatic const struct regulator_ops ab8500_regulator_mode_ops = {
5058c2ecf20Sopenharmony_ci	.enable			= ab8500_regulator_enable,
5068c2ecf20Sopenharmony_ci	.disable		= ab8500_regulator_disable,
5078c2ecf20Sopenharmony_ci	.is_enabled		= ab8500_regulator_is_enabled,
5088c2ecf20Sopenharmony_ci	.get_optimum_mode	= ab8500_regulator_get_optimum_mode,
5098c2ecf20Sopenharmony_ci	.set_mode		= ab8500_regulator_set_mode,
5108c2ecf20Sopenharmony_ci	.get_mode		= ab8500_regulator_get_mode,
5118c2ecf20Sopenharmony_ci	.list_voltage		= regulator_list_voltage_table,
5128c2ecf20Sopenharmony_ci};
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_cistatic const struct regulator_ops ab8500_regulator_ops = {
5158c2ecf20Sopenharmony_ci	.enable			= ab8500_regulator_enable,
5168c2ecf20Sopenharmony_ci	.disable		= ab8500_regulator_disable,
5178c2ecf20Sopenharmony_ci	.is_enabled		= ab8500_regulator_is_enabled,
5188c2ecf20Sopenharmony_ci	.list_voltage		= regulator_list_voltage_table,
5198c2ecf20Sopenharmony_ci};
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_cistatic const struct regulator_ops ab8500_regulator_anamic_mode_ops = {
5228c2ecf20Sopenharmony_ci	.enable		= ab8500_regulator_enable,
5238c2ecf20Sopenharmony_ci	.disable	= ab8500_regulator_disable,
5248c2ecf20Sopenharmony_ci	.is_enabled	= ab8500_regulator_is_enabled,
5258c2ecf20Sopenharmony_ci	.set_mode	= ab8500_regulator_set_mode,
5268c2ecf20Sopenharmony_ci	.get_mode	= ab8500_regulator_get_mode,
5278c2ecf20Sopenharmony_ci	.list_voltage	= regulator_list_voltage_table,
5288c2ecf20Sopenharmony_ci};
5298c2ecf20Sopenharmony_ci
5308c2ecf20Sopenharmony_ci/* AB8500 regulator information */
5318c2ecf20Sopenharmony_cistatic struct ab8500_regulator_info
5328c2ecf20Sopenharmony_ci		ab8500_regulator_info[AB8500_NUM_REGULATORS] = {
5338c2ecf20Sopenharmony_ci	/*
5348c2ecf20Sopenharmony_ci	 * Variable Voltage Regulators
5358c2ecf20Sopenharmony_ci	 *   name, min mV, max mV,
5368c2ecf20Sopenharmony_ci	 *   update bank, reg, mask, enable val
5378c2ecf20Sopenharmony_ci	 *   volt bank, reg, mask
5388c2ecf20Sopenharmony_ci	 */
5398c2ecf20Sopenharmony_ci	[AB8500_LDO_AUX1] = {
5408c2ecf20Sopenharmony_ci		.desc = {
5418c2ecf20Sopenharmony_ci			.name		= "LDO-AUX1",
5428c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
5438c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
5448c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_AUX1,
5458c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
5468c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
5478c2ecf20Sopenharmony_ci			.volt_table	= ldo_vauxn_voltages,
5488c2ecf20Sopenharmony_ci			.enable_time	= 200,
5498c2ecf20Sopenharmony_ci			.supply_name    = "vin",
5508c2ecf20Sopenharmony_ci		},
5518c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
5528c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
5538c2ecf20Sopenharmony_ci		.update_reg		= 0x09,
5548c2ecf20Sopenharmony_ci		.update_mask		= 0x03,
5558c2ecf20Sopenharmony_ci		.update_val		= 0x01,
5568c2ecf20Sopenharmony_ci		.update_val_idle	= 0x03,
5578c2ecf20Sopenharmony_ci		.update_val_normal	= 0x01,
5588c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
5598c2ecf20Sopenharmony_ci		.voltage_reg		= 0x1f,
5608c2ecf20Sopenharmony_ci		.voltage_mask		= 0x0f,
5618c2ecf20Sopenharmony_ci	},
5628c2ecf20Sopenharmony_ci	[AB8500_LDO_AUX2] = {
5638c2ecf20Sopenharmony_ci		.desc = {
5648c2ecf20Sopenharmony_ci			.name		= "LDO-AUX2",
5658c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
5668c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
5678c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_AUX2,
5688c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
5698c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
5708c2ecf20Sopenharmony_ci			.volt_table	= ldo_vauxn_voltages,
5718c2ecf20Sopenharmony_ci			.enable_time	= 200,
5728c2ecf20Sopenharmony_ci			.supply_name    = "vin",
5738c2ecf20Sopenharmony_ci		},
5748c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
5758c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
5768c2ecf20Sopenharmony_ci		.update_reg		= 0x09,
5778c2ecf20Sopenharmony_ci		.update_mask		= 0x0c,
5788c2ecf20Sopenharmony_ci		.update_val		= 0x04,
5798c2ecf20Sopenharmony_ci		.update_val_idle	= 0x0c,
5808c2ecf20Sopenharmony_ci		.update_val_normal	= 0x04,
5818c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
5828c2ecf20Sopenharmony_ci		.voltage_reg		= 0x20,
5838c2ecf20Sopenharmony_ci		.voltage_mask		= 0x0f,
5848c2ecf20Sopenharmony_ci	},
5858c2ecf20Sopenharmony_ci	[AB8500_LDO_AUX3] = {
5868c2ecf20Sopenharmony_ci		.desc = {
5878c2ecf20Sopenharmony_ci			.name		= "LDO-AUX3",
5888c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
5898c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
5908c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_AUX3,
5918c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
5928c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vaux3_voltages),
5938c2ecf20Sopenharmony_ci			.volt_table	= ldo_vaux3_voltages,
5948c2ecf20Sopenharmony_ci			.enable_time	= 450,
5958c2ecf20Sopenharmony_ci			.supply_name    = "vin",
5968c2ecf20Sopenharmony_ci		},
5978c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
5988c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
5998c2ecf20Sopenharmony_ci		.update_reg		= 0x0a,
6008c2ecf20Sopenharmony_ci		.update_mask		= 0x03,
6018c2ecf20Sopenharmony_ci		.update_val		= 0x01,
6028c2ecf20Sopenharmony_ci		.update_val_idle	= 0x03,
6038c2ecf20Sopenharmony_ci		.update_val_normal	= 0x01,
6048c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
6058c2ecf20Sopenharmony_ci		.voltage_reg		= 0x21,
6068c2ecf20Sopenharmony_ci		.voltage_mask		= 0x07,
6078c2ecf20Sopenharmony_ci	},
6088c2ecf20Sopenharmony_ci	[AB8500_LDO_INTCORE] = {
6098c2ecf20Sopenharmony_ci		.desc = {
6108c2ecf20Sopenharmony_ci			.name		= "LDO-INTCORE",
6118c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
6128c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
6138c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_INTCORE,
6148c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
6158c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vintcore_voltages),
6168c2ecf20Sopenharmony_ci			.volt_table	= ldo_vintcore_voltages,
6178c2ecf20Sopenharmony_ci			.enable_time	= 750,
6188c2ecf20Sopenharmony_ci		},
6198c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
6208c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
6218c2ecf20Sopenharmony_ci		.update_reg		= 0x80,
6228c2ecf20Sopenharmony_ci		.update_mask		= 0x44,
6238c2ecf20Sopenharmony_ci		.update_val		= 0x44,
6248c2ecf20Sopenharmony_ci		.update_val_idle	= 0x44,
6258c2ecf20Sopenharmony_ci		.update_val_normal	= 0x04,
6268c2ecf20Sopenharmony_ci		.voltage_bank		= 0x03,
6278c2ecf20Sopenharmony_ci		.voltage_reg		= 0x80,
6288c2ecf20Sopenharmony_ci		.voltage_mask		= 0x38,
6298c2ecf20Sopenharmony_ci	},
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_ci	/*
6328c2ecf20Sopenharmony_ci	 * Fixed Voltage Regulators
6338c2ecf20Sopenharmony_ci	 *   name, fixed mV,
6348c2ecf20Sopenharmony_ci	 *   update bank, reg, mask, enable val
6358c2ecf20Sopenharmony_ci	 */
6368c2ecf20Sopenharmony_ci	[AB8500_LDO_TVOUT] = {
6378c2ecf20Sopenharmony_ci		.desc = {
6388c2ecf20Sopenharmony_ci			.name		= "LDO-TVOUT",
6398c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_mode_ops,
6408c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
6418c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_TVOUT,
6428c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
6438c2ecf20Sopenharmony_ci			.n_voltages	= 1,
6448c2ecf20Sopenharmony_ci			.volt_table	= fixed_2000000_voltage,
6458c2ecf20Sopenharmony_ci			.enable_time	= 500,
6468c2ecf20Sopenharmony_ci		},
6478c2ecf20Sopenharmony_ci		.load_lp_uA		= 1000,
6488c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
6498c2ecf20Sopenharmony_ci		.update_reg		= 0x80,
6508c2ecf20Sopenharmony_ci		.update_mask		= 0x82,
6518c2ecf20Sopenharmony_ci		.update_val		= 0x02,
6528c2ecf20Sopenharmony_ci		.update_val_idle	= 0x82,
6538c2ecf20Sopenharmony_ci		.update_val_normal	= 0x02,
6548c2ecf20Sopenharmony_ci	},
6558c2ecf20Sopenharmony_ci	[AB8500_LDO_AUDIO] = {
6568c2ecf20Sopenharmony_ci		.desc = {
6578c2ecf20Sopenharmony_ci			.name		= "LDO-AUDIO",
6588c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_ops,
6598c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
6608c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_AUDIO,
6618c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
6628c2ecf20Sopenharmony_ci			.n_voltages	= 1,
6638c2ecf20Sopenharmony_ci			.enable_time	= 140,
6648c2ecf20Sopenharmony_ci			.volt_table	= fixed_2000000_voltage,
6658c2ecf20Sopenharmony_ci		},
6668c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
6678c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
6688c2ecf20Sopenharmony_ci		.update_mask		= 0x02,
6698c2ecf20Sopenharmony_ci		.update_val		= 0x02,
6708c2ecf20Sopenharmony_ci	},
6718c2ecf20Sopenharmony_ci	[AB8500_LDO_ANAMIC1] = {
6728c2ecf20Sopenharmony_ci		.desc = {
6738c2ecf20Sopenharmony_ci			.name		= "LDO-ANAMIC1",
6748c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_ops,
6758c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
6768c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_ANAMIC1,
6778c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
6788c2ecf20Sopenharmony_ci			.n_voltages	= 1,
6798c2ecf20Sopenharmony_ci			.enable_time	= 500,
6808c2ecf20Sopenharmony_ci			.volt_table	= fixed_2050000_voltage,
6818c2ecf20Sopenharmony_ci		},
6828c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
6838c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
6848c2ecf20Sopenharmony_ci		.update_mask		= 0x08,
6858c2ecf20Sopenharmony_ci		.update_val		= 0x08,
6868c2ecf20Sopenharmony_ci	},
6878c2ecf20Sopenharmony_ci	[AB8500_LDO_ANAMIC2] = {
6888c2ecf20Sopenharmony_ci		.desc = {
6898c2ecf20Sopenharmony_ci			.name		= "LDO-ANAMIC2",
6908c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_ops,
6918c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
6928c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_ANAMIC2,
6938c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
6948c2ecf20Sopenharmony_ci			.n_voltages	= 1,
6958c2ecf20Sopenharmony_ci			.enable_time	= 500,
6968c2ecf20Sopenharmony_ci			.volt_table	= fixed_2050000_voltage,
6978c2ecf20Sopenharmony_ci		},
6988c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
6998c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
7008c2ecf20Sopenharmony_ci		.update_mask		= 0x10,
7018c2ecf20Sopenharmony_ci		.update_val		= 0x10,
7028c2ecf20Sopenharmony_ci	},
7038c2ecf20Sopenharmony_ci	[AB8500_LDO_DMIC] = {
7048c2ecf20Sopenharmony_ci		.desc = {
7058c2ecf20Sopenharmony_ci			.name		= "LDO-DMIC",
7068c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_ops,
7078c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
7088c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_DMIC,
7098c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
7108c2ecf20Sopenharmony_ci			.n_voltages	= 1,
7118c2ecf20Sopenharmony_ci			.enable_time	= 420,
7128c2ecf20Sopenharmony_ci			.volt_table	= fixed_1800000_voltage,
7138c2ecf20Sopenharmony_ci		},
7148c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
7158c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
7168c2ecf20Sopenharmony_ci		.update_mask		= 0x04,
7178c2ecf20Sopenharmony_ci		.update_val		= 0x04,
7188c2ecf20Sopenharmony_ci	},
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci	/*
7218c2ecf20Sopenharmony_ci	 * Regulators with fixed voltage and normal/idle modes
7228c2ecf20Sopenharmony_ci	 */
7238c2ecf20Sopenharmony_ci	[AB8500_LDO_ANA] = {
7248c2ecf20Sopenharmony_ci		.desc = {
7258c2ecf20Sopenharmony_ci			.name		= "LDO-ANA",
7268c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_mode_ops,
7278c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
7288c2ecf20Sopenharmony_ci			.id		= AB8500_LDO_ANA,
7298c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
7308c2ecf20Sopenharmony_ci			.n_voltages	= 1,
7318c2ecf20Sopenharmony_ci			.enable_time	= 140,
7328c2ecf20Sopenharmony_ci			.volt_table	= fixed_1200000_voltage,
7338c2ecf20Sopenharmony_ci		},
7348c2ecf20Sopenharmony_ci		.load_lp_uA		= 1000,
7358c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
7368c2ecf20Sopenharmony_ci		.update_reg		= 0x06,
7378c2ecf20Sopenharmony_ci		.update_mask		= 0x0c,
7388c2ecf20Sopenharmony_ci		.update_val		= 0x04,
7398c2ecf20Sopenharmony_ci		.update_val_idle	= 0x0c,
7408c2ecf20Sopenharmony_ci		.update_val_normal	= 0x04,
7418c2ecf20Sopenharmony_ci	},
7428c2ecf20Sopenharmony_ci};
7438c2ecf20Sopenharmony_ci
7448c2ecf20Sopenharmony_ci/* AB8505 regulator information */
7458c2ecf20Sopenharmony_cistatic struct ab8500_regulator_info
7468c2ecf20Sopenharmony_ci		ab8505_regulator_info[AB8505_NUM_REGULATORS] = {
7478c2ecf20Sopenharmony_ci	/*
7488c2ecf20Sopenharmony_ci	 * Variable Voltage Regulators
7498c2ecf20Sopenharmony_ci	 *   name, min mV, max mV,
7508c2ecf20Sopenharmony_ci	 *   update bank, reg, mask, enable val
7518c2ecf20Sopenharmony_ci	 *   volt bank, reg, mask
7528c2ecf20Sopenharmony_ci	 */
7538c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX1] = {
7548c2ecf20Sopenharmony_ci		.desc = {
7558c2ecf20Sopenharmony_ci			.name		= "LDO-AUX1",
7568c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
7578c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
7588c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX1,
7598c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
7608c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
7618c2ecf20Sopenharmony_ci			.volt_table	= ldo_vauxn_voltages,
7628c2ecf20Sopenharmony_ci		},
7638c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
7648c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
7658c2ecf20Sopenharmony_ci		.update_reg		= 0x09,
7668c2ecf20Sopenharmony_ci		.update_mask		= 0x03,
7678c2ecf20Sopenharmony_ci		.update_val		= 0x01,
7688c2ecf20Sopenharmony_ci		.update_val_idle	= 0x03,
7698c2ecf20Sopenharmony_ci		.update_val_normal	= 0x01,
7708c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
7718c2ecf20Sopenharmony_ci		.voltage_reg		= 0x1f,
7728c2ecf20Sopenharmony_ci		.voltage_mask		= 0x0f,
7738c2ecf20Sopenharmony_ci	},
7748c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX2] = {
7758c2ecf20Sopenharmony_ci		.desc = {
7768c2ecf20Sopenharmony_ci			.name		= "LDO-AUX2",
7778c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
7788c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
7798c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX2,
7808c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
7818c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
7828c2ecf20Sopenharmony_ci			.volt_table	= ldo_vauxn_voltages,
7838c2ecf20Sopenharmony_ci		},
7848c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
7858c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
7868c2ecf20Sopenharmony_ci		.update_reg		= 0x09,
7878c2ecf20Sopenharmony_ci		.update_mask		= 0x0c,
7888c2ecf20Sopenharmony_ci		.update_val		= 0x04,
7898c2ecf20Sopenharmony_ci		.update_val_idle	= 0x0c,
7908c2ecf20Sopenharmony_ci		.update_val_normal	= 0x04,
7918c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
7928c2ecf20Sopenharmony_ci		.voltage_reg		= 0x20,
7938c2ecf20Sopenharmony_ci		.voltage_mask		= 0x0f,
7948c2ecf20Sopenharmony_ci	},
7958c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX3] = {
7968c2ecf20Sopenharmony_ci		.desc = {
7978c2ecf20Sopenharmony_ci			.name		= "LDO-AUX3",
7988c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
7998c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
8008c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX3,
8018c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
8028c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vaux3_voltages),
8038c2ecf20Sopenharmony_ci			.volt_table	= ldo_vaux3_voltages,
8048c2ecf20Sopenharmony_ci		},
8058c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
8068c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
8078c2ecf20Sopenharmony_ci		.update_reg		= 0x0a,
8088c2ecf20Sopenharmony_ci		.update_mask		= 0x03,
8098c2ecf20Sopenharmony_ci		.update_val		= 0x01,
8108c2ecf20Sopenharmony_ci		.update_val_idle	= 0x03,
8118c2ecf20Sopenharmony_ci		.update_val_normal	= 0x01,
8128c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
8138c2ecf20Sopenharmony_ci		.voltage_reg		= 0x21,
8148c2ecf20Sopenharmony_ci		.voltage_mask		= 0x07,
8158c2ecf20Sopenharmony_ci	},
8168c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX4] = {
8178c2ecf20Sopenharmony_ci		.desc = {
8188c2ecf20Sopenharmony_ci			.name		= "LDO-AUX4",
8198c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
8208c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
8218c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX4,
8228c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
8238c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vauxn_voltages),
8248c2ecf20Sopenharmony_ci			.volt_table	= ldo_vauxn_voltages,
8258c2ecf20Sopenharmony_ci		},
8268c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
8278c2ecf20Sopenharmony_ci		/* values for Vaux4Regu register */
8288c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
8298c2ecf20Sopenharmony_ci		.update_reg		= 0x2e,
8308c2ecf20Sopenharmony_ci		.update_mask		= 0x03,
8318c2ecf20Sopenharmony_ci		.update_val		= 0x01,
8328c2ecf20Sopenharmony_ci		.update_val_idle	= 0x03,
8338c2ecf20Sopenharmony_ci		.update_val_normal	= 0x01,
8348c2ecf20Sopenharmony_ci		/* values for Vaux4SEL register */
8358c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
8368c2ecf20Sopenharmony_ci		.voltage_reg		= 0x2f,
8378c2ecf20Sopenharmony_ci		.voltage_mask		= 0x0f,
8388c2ecf20Sopenharmony_ci	},
8398c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX5] = {
8408c2ecf20Sopenharmony_ci		.desc = {
8418c2ecf20Sopenharmony_ci			.name		= "LDO-AUX5",
8428c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
8438c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
8448c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX5,
8458c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
8468c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vaux56_voltages),
8478c2ecf20Sopenharmony_ci			.volt_table	= ldo_vaux56_voltages,
8488c2ecf20Sopenharmony_ci		},
8498c2ecf20Sopenharmony_ci		.load_lp_uA		= 2000,
8508c2ecf20Sopenharmony_ci		/* values for CtrlVaux5 register */
8518c2ecf20Sopenharmony_ci		.update_bank		= 0x01,
8528c2ecf20Sopenharmony_ci		.update_reg		= 0x55,
8538c2ecf20Sopenharmony_ci		.update_mask		= 0x18,
8548c2ecf20Sopenharmony_ci		.update_val		= 0x10,
8558c2ecf20Sopenharmony_ci		.update_val_idle	= 0x18,
8568c2ecf20Sopenharmony_ci		.update_val_normal	= 0x10,
8578c2ecf20Sopenharmony_ci		.voltage_bank		= 0x01,
8588c2ecf20Sopenharmony_ci		.voltage_reg		= 0x55,
8598c2ecf20Sopenharmony_ci		.voltage_mask		= 0x07,
8608c2ecf20Sopenharmony_ci	},
8618c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX6] = {
8628c2ecf20Sopenharmony_ci		.desc = {
8638c2ecf20Sopenharmony_ci			.name		= "LDO-AUX6",
8648c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
8658c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
8668c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX6,
8678c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
8688c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vaux56_voltages),
8698c2ecf20Sopenharmony_ci			.volt_table	= ldo_vaux56_voltages,
8708c2ecf20Sopenharmony_ci		},
8718c2ecf20Sopenharmony_ci		.load_lp_uA		= 2000,
8728c2ecf20Sopenharmony_ci		/* values for CtrlVaux6 register */
8738c2ecf20Sopenharmony_ci		.update_bank		= 0x01,
8748c2ecf20Sopenharmony_ci		.update_reg		= 0x56,
8758c2ecf20Sopenharmony_ci		.update_mask		= 0x18,
8768c2ecf20Sopenharmony_ci		.update_val		= 0x10,
8778c2ecf20Sopenharmony_ci		.update_val_idle	= 0x18,
8788c2ecf20Sopenharmony_ci		.update_val_normal	= 0x10,
8798c2ecf20Sopenharmony_ci		.voltage_bank		= 0x01,
8808c2ecf20Sopenharmony_ci		.voltage_reg		= 0x56,
8818c2ecf20Sopenharmony_ci		.voltage_mask		= 0x07,
8828c2ecf20Sopenharmony_ci	},
8838c2ecf20Sopenharmony_ci	[AB8505_LDO_INTCORE] = {
8848c2ecf20Sopenharmony_ci		.desc = {
8858c2ecf20Sopenharmony_ci			.name		= "LDO-INTCORE",
8868c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
8878c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
8888c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_INTCORE,
8898c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
8908c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vintcore_voltages),
8918c2ecf20Sopenharmony_ci			.volt_table	= ldo_vintcore_voltages,
8928c2ecf20Sopenharmony_ci		},
8938c2ecf20Sopenharmony_ci		.load_lp_uA		= 5000,
8948c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
8958c2ecf20Sopenharmony_ci		.update_reg		= 0x80,
8968c2ecf20Sopenharmony_ci		.update_mask		= 0x44,
8978c2ecf20Sopenharmony_ci		.update_val		= 0x04,
8988c2ecf20Sopenharmony_ci		.update_val_idle	= 0x44,
8998c2ecf20Sopenharmony_ci		.update_val_normal	= 0x04,
9008c2ecf20Sopenharmony_ci		.voltage_bank		= 0x03,
9018c2ecf20Sopenharmony_ci		.voltage_reg		= 0x80,
9028c2ecf20Sopenharmony_ci		.voltage_mask		= 0x38,
9038c2ecf20Sopenharmony_ci	},
9048c2ecf20Sopenharmony_ci
9058c2ecf20Sopenharmony_ci	/*
9068c2ecf20Sopenharmony_ci	 * Fixed Voltage Regulators
9078c2ecf20Sopenharmony_ci	 *   name, fixed mV,
9088c2ecf20Sopenharmony_ci	 *   update bank, reg, mask, enable val
9098c2ecf20Sopenharmony_ci	 */
9108c2ecf20Sopenharmony_ci	[AB8505_LDO_ADC] = {
9118c2ecf20Sopenharmony_ci		.desc = {
9128c2ecf20Sopenharmony_ci			.name		= "LDO-ADC",
9138c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_mode_ops,
9148c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
9158c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_ADC,
9168c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
9178c2ecf20Sopenharmony_ci			.n_voltages	= 1,
9188c2ecf20Sopenharmony_ci			.volt_table	= fixed_2000000_voltage,
9198c2ecf20Sopenharmony_ci			.enable_time	= 10000,
9208c2ecf20Sopenharmony_ci		},
9218c2ecf20Sopenharmony_ci		.load_lp_uA		= 1000,
9228c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
9238c2ecf20Sopenharmony_ci		.update_reg		= 0x80,
9248c2ecf20Sopenharmony_ci		.update_mask		= 0x82,
9258c2ecf20Sopenharmony_ci		.update_val		= 0x02,
9268c2ecf20Sopenharmony_ci		.update_val_idle	= 0x82,
9278c2ecf20Sopenharmony_ci		.update_val_normal	= 0x02,
9288c2ecf20Sopenharmony_ci	},
9298c2ecf20Sopenharmony_ci	[AB8505_LDO_AUDIO] = {
9308c2ecf20Sopenharmony_ci		.desc = {
9318c2ecf20Sopenharmony_ci			.name		= "LDO-AUDIO",
9328c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_ops,
9338c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
9348c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUDIO,
9358c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
9368c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vaudio_voltages),
9378c2ecf20Sopenharmony_ci			.volt_table	= ldo_vaudio_voltages,
9388c2ecf20Sopenharmony_ci		},
9398c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
9408c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
9418c2ecf20Sopenharmony_ci		.update_mask		= 0x02,
9428c2ecf20Sopenharmony_ci		.update_val		= 0x02,
9438c2ecf20Sopenharmony_ci		.voltage_bank		= 0x01,
9448c2ecf20Sopenharmony_ci		.voltage_reg		= 0x57,
9458c2ecf20Sopenharmony_ci		.voltage_mask		= 0x70,
9468c2ecf20Sopenharmony_ci	},
9478c2ecf20Sopenharmony_ci	[AB8505_LDO_ANAMIC1] = {
9488c2ecf20Sopenharmony_ci		.desc = {
9498c2ecf20Sopenharmony_ci			.name		= "LDO-ANAMIC1",
9508c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_anamic_mode_ops,
9518c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
9528c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_ANAMIC1,
9538c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
9548c2ecf20Sopenharmony_ci			.n_voltages	= 1,
9558c2ecf20Sopenharmony_ci			.volt_table	= fixed_2050000_voltage,
9568c2ecf20Sopenharmony_ci		},
9578c2ecf20Sopenharmony_ci		.shared_mode		= &ldo_anamic1_shared,
9588c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
9598c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
9608c2ecf20Sopenharmony_ci		.update_mask		= 0x08,
9618c2ecf20Sopenharmony_ci		.update_val		= 0x08,
9628c2ecf20Sopenharmony_ci		.mode_bank		= 0x01,
9638c2ecf20Sopenharmony_ci		.mode_reg		= 0x54,
9648c2ecf20Sopenharmony_ci		.mode_mask		= 0x04,
9658c2ecf20Sopenharmony_ci		.mode_val_idle		= 0x04,
9668c2ecf20Sopenharmony_ci		.mode_val_normal	= 0x00,
9678c2ecf20Sopenharmony_ci	},
9688c2ecf20Sopenharmony_ci	[AB8505_LDO_ANAMIC2] = {
9698c2ecf20Sopenharmony_ci		.desc = {
9708c2ecf20Sopenharmony_ci			.name		= "LDO-ANAMIC2",
9718c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_anamic_mode_ops,
9728c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
9738c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_ANAMIC2,
9748c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
9758c2ecf20Sopenharmony_ci			.n_voltages	= 1,
9768c2ecf20Sopenharmony_ci			.volt_table	= fixed_2050000_voltage,
9778c2ecf20Sopenharmony_ci		},
9788c2ecf20Sopenharmony_ci		.shared_mode		= &ldo_anamic2_shared,
9798c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
9808c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
9818c2ecf20Sopenharmony_ci		.update_mask		= 0x10,
9828c2ecf20Sopenharmony_ci		.update_val		= 0x10,
9838c2ecf20Sopenharmony_ci		.mode_bank		= 0x01,
9848c2ecf20Sopenharmony_ci		.mode_reg		= 0x54,
9858c2ecf20Sopenharmony_ci		.mode_mask		= 0x04,
9868c2ecf20Sopenharmony_ci		.mode_val_idle		= 0x04,
9878c2ecf20Sopenharmony_ci		.mode_val_normal	= 0x00,
9888c2ecf20Sopenharmony_ci	},
9898c2ecf20Sopenharmony_ci	[AB8505_LDO_AUX8] = {
9908c2ecf20Sopenharmony_ci		.desc = {
9918c2ecf20Sopenharmony_ci			.name		= "LDO-AUX8",
9928c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_ops,
9938c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
9948c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_AUX8,
9958c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
9968c2ecf20Sopenharmony_ci			.n_voltages	= 1,
9978c2ecf20Sopenharmony_ci			.volt_table	= fixed_1800000_voltage,
9988c2ecf20Sopenharmony_ci		},
9998c2ecf20Sopenharmony_ci		.update_bank		= 0x03,
10008c2ecf20Sopenharmony_ci		.update_reg		= 0x83,
10018c2ecf20Sopenharmony_ci		.update_mask		= 0x04,
10028c2ecf20Sopenharmony_ci		.update_val		= 0x04,
10038c2ecf20Sopenharmony_ci	},
10048c2ecf20Sopenharmony_ci	/*
10058c2ecf20Sopenharmony_ci	 * Regulators with fixed voltage and normal/idle modes
10068c2ecf20Sopenharmony_ci	 */
10078c2ecf20Sopenharmony_ci	[AB8505_LDO_ANA] = {
10088c2ecf20Sopenharmony_ci		.desc = {
10098c2ecf20Sopenharmony_ci			.name		= "LDO-ANA",
10108c2ecf20Sopenharmony_ci			.ops		= &ab8500_regulator_volt_mode_ops,
10118c2ecf20Sopenharmony_ci			.type		= REGULATOR_VOLTAGE,
10128c2ecf20Sopenharmony_ci			.id		= AB8505_LDO_ANA,
10138c2ecf20Sopenharmony_ci			.owner		= THIS_MODULE,
10148c2ecf20Sopenharmony_ci			.n_voltages	= ARRAY_SIZE(ldo_vana_voltages),
10158c2ecf20Sopenharmony_ci			.volt_table	= ldo_vana_voltages,
10168c2ecf20Sopenharmony_ci		},
10178c2ecf20Sopenharmony_ci		.load_lp_uA		= 1000,
10188c2ecf20Sopenharmony_ci		.update_bank		= 0x04,
10198c2ecf20Sopenharmony_ci		.update_reg		= 0x06,
10208c2ecf20Sopenharmony_ci		.update_mask		= 0x0c,
10218c2ecf20Sopenharmony_ci		.update_val		= 0x04,
10228c2ecf20Sopenharmony_ci		.update_val_idle	= 0x0c,
10238c2ecf20Sopenharmony_ci		.update_val_normal	= 0x04,
10248c2ecf20Sopenharmony_ci		.voltage_bank		= 0x04,
10258c2ecf20Sopenharmony_ci		.voltage_reg		= 0x29,
10268c2ecf20Sopenharmony_ci		.voltage_mask		= 0x7,
10278c2ecf20Sopenharmony_ci	},
10288c2ecf20Sopenharmony_ci};
10298c2ecf20Sopenharmony_ci
10308c2ecf20Sopenharmony_cistatic struct ab8500_shared_mode ldo_anamic1_shared = {
10318c2ecf20Sopenharmony_ci	.shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC2],
10328c2ecf20Sopenharmony_ci};
10338c2ecf20Sopenharmony_ci
10348c2ecf20Sopenharmony_cistatic struct ab8500_shared_mode ldo_anamic2_shared = {
10358c2ecf20Sopenharmony_ci	.shared_regulator = &ab8505_regulator_info[AB8505_LDO_ANAMIC1],
10368c2ecf20Sopenharmony_ci};
10378c2ecf20Sopenharmony_ci
10388c2ecf20Sopenharmony_cistruct ab8500_reg_init {
10398c2ecf20Sopenharmony_ci	u8 bank;
10408c2ecf20Sopenharmony_ci	u8 addr;
10418c2ecf20Sopenharmony_ci	u8 mask;
10428c2ecf20Sopenharmony_ci};
10438c2ecf20Sopenharmony_ci
10448c2ecf20Sopenharmony_ci#define REG_INIT(_id, _bank, _addr, _mask)	\
10458c2ecf20Sopenharmony_ci	[_id] = {				\
10468c2ecf20Sopenharmony_ci		.bank = _bank,			\
10478c2ecf20Sopenharmony_ci		.addr = _addr,			\
10488c2ecf20Sopenharmony_ci		.mask = _mask,			\
10498c2ecf20Sopenharmony_ci	}
10508c2ecf20Sopenharmony_ci
10518c2ecf20Sopenharmony_ci/* AB8500 register init */
10528c2ecf20Sopenharmony_cistatic struct ab8500_reg_init ab8500_reg_init[] = {
10538c2ecf20Sopenharmony_ci	/*
10548c2ecf20Sopenharmony_ci	 * 0x30, VanaRequestCtrl
10558c2ecf20Sopenharmony_ci	 * 0xc0, VextSupply1RequestCtrl
10568c2ecf20Sopenharmony_ci	 */
10578c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUREQUESTCTRL2,	0x03, 0x04, 0xf0),
10588c2ecf20Sopenharmony_ci	/*
10598c2ecf20Sopenharmony_ci	 * 0x03, VextSupply2RequestCtrl
10608c2ecf20Sopenharmony_ci	 * 0x0c, VextSupply3RequestCtrl
10618c2ecf20Sopenharmony_ci	 * 0x30, Vaux1RequestCtrl
10628c2ecf20Sopenharmony_ci	 * 0xc0, Vaux2RequestCtrl
10638c2ecf20Sopenharmony_ci	 */
10648c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUREQUESTCTRL3,	0x03, 0x05, 0xff),
10658c2ecf20Sopenharmony_ci	/*
10668c2ecf20Sopenharmony_ci	 * 0x03, Vaux3RequestCtrl
10678c2ecf20Sopenharmony_ci	 * 0x04, SwHPReq
10688c2ecf20Sopenharmony_ci	 */
10698c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUREQUESTCTRL4,	0x03, 0x06, 0x07),
10708c2ecf20Sopenharmony_ci	/*
10718c2ecf20Sopenharmony_ci	 * 0x08, VanaSysClkReq1HPValid
10728c2ecf20Sopenharmony_ci	 * 0x20, Vaux1SysClkReq1HPValid
10738c2ecf20Sopenharmony_ci	 * 0x40, Vaux2SysClkReq1HPValid
10748c2ecf20Sopenharmony_ci	 * 0x80, Vaux3SysClkReq1HPValid
10758c2ecf20Sopenharmony_ci	 */
10768c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID1,	0x03, 0x07, 0xe8),
10778c2ecf20Sopenharmony_ci	/*
10788c2ecf20Sopenharmony_ci	 * 0x10, VextSupply1SysClkReq1HPValid
10798c2ecf20Sopenharmony_ci	 * 0x20, VextSupply2SysClkReq1HPValid
10808c2ecf20Sopenharmony_ci	 * 0x40, VextSupply3SysClkReq1HPValid
10818c2ecf20Sopenharmony_ci	 */
10828c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUSYSCLKREQ1HPVALID2,	0x03, 0x08, 0x70),
10838c2ecf20Sopenharmony_ci	/*
10848c2ecf20Sopenharmony_ci	 * 0x08, VanaHwHPReq1Valid
10858c2ecf20Sopenharmony_ci	 * 0x20, Vaux1HwHPReq1Valid
10868c2ecf20Sopenharmony_ci	 * 0x40, Vaux2HwHPReq1Valid
10878c2ecf20Sopenharmony_ci	 * 0x80, Vaux3HwHPReq1Valid
10888c2ecf20Sopenharmony_ci	 */
10898c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUHWHPREQ1VALID1,	0x03, 0x09, 0xe8),
10908c2ecf20Sopenharmony_ci	/*
10918c2ecf20Sopenharmony_ci	 * 0x01, VextSupply1HwHPReq1Valid
10928c2ecf20Sopenharmony_ci	 * 0x02, VextSupply2HwHPReq1Valid
10938c2ecf20Sopenharmony_ci	 * 0x04, VextSupply3HwHPReq1Valid
10948c2ecf20Sopenharmony_ci	 */
10958c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUHWHPREQ1VALID2,	0x03, 0x0a, 0x07),
10968c2ecf20Sopenharmony_ci	/*
10978c2ecf20Sopenharmony_ci	 * 0x08, VanaHwHPReq2Valid
10988c2ecf20Sopenharmony_ci	 * 0x20, Vaux1HwHPReq2Valid
10998c2ecf20Sopenharmony_ci	 * 0x40, Vaux2HwHPReq2Valid
11008c2ecf20Sopenharmony_ci	 * 0x80, Vaux3HwHPReq2Valid
11018c2ecf20Sopenharmony_ci	 */
11028c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUHWHPREQ2VALID1,	0x03, 0x0b, 0xe8),
11038c2ecf20Sopenharmony_ci	/*
11048c2ecf20Sopenharmony_ci	 * 0x01, VextSupply1HwHPReq2Valid
11058c2ecf20Sopenharmony_ci	 * 0x02, VextSupply2HwHPReq2Valid
11068c2ecf20Sopenharmony_ci	 * 0x04, VextSupply3HwHPReq2Valid
11078c2ecf20Sopenharmony_ci	 */
11088c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUHWHPREQ2VALID2,	0x03, 0x0c, 0x07),
11098c2ecf20Sopenharmony_ci	/*
11108c2ecf20Sopenharmony_ci	 * 0x20, VanaSwHPReqValid
11118c2ecf20Sopenharmony_ci	 * 0x80, Vaux1SwHPReqValid
11128c2ecf20Sopenharmony_ci	 */
11138c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUSWHPREQVALID1,	0x03, 0x0d, 0xa0),
11148c2ecf20Sopenharmony_ci	/*
11158c2ecf20Sopenharmony_ci	 * 0x01, Vaux2SwHPReqValid
11168c2ecf20Sopenharmony_ci	 * 0x02, Vaux3SwHPReqValid
11178c2ecf20Sopenharmony_ci	 * 0x04, VextSupply1SwHPReqValid
11188c2ecf20Sopenharmony_ci	 * 0x08, VextSupply2SwHPReqValid
11198c2ecf20Sopenharmony_ci	 * 0x10, VextSupply3SwHPReqValid
11208c2ecf20Sopenharmony_ci	 */
11218c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUSWHPREQVALID2,	0x03, 0x0e, 0x1f),
11228c2ecf20Sopenharmony_ci	/*
11238c2ecf20Sopenharmony_ci	 * 0x02, SysClkReq2Valid1
11248c2ecf20Sopenharmony_ci	 * 0x04, SysClkReq3Valid1
11258c2ecf20Sopenharmony_ci	 * 0x08, SysClkReq4Valid1
11268c2ecf20Sopenharmony_ci	 * 0x10, SysClkReq5Valid1
11278c2ecf20Sopenharmony_ci	 * 0x20, SysClkReq6Valid1
11288c2ecf20Sopenharmony_ci	 * 0x40, SysClkReq7Valid1
11298c2ecf20Sopenharmony_ci	 * 0x80, SysClkReq8Valid1
11308c2ecf20Sopenharmony_ci	 */
11318c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUSYSCLKREQVALID1,	0x03, 0x0f, 0xfe),
11328c2ecf20Sopenharmony_ci	/*
11338c2ecf20Sopenharmony_ci	 * 0x02, SysClkReq2Valid2
11348c2ecf20Sopenharmony_ci	 * 0x04, SysClkReq3Valid2
11358c2ecf20Sopenharmony_ci	 * 0x08, SysClkReq4Valid2
11368c2ecf20Sopenharmony_ci	 * 0x10, SysClkReq5Valid2
11378c2ecf20Sopenharmony_ci	 * 0x20, SysClkReq6Valid2
11388c2ecf20Sopenharmony_ci	 * 0x40, SysClkReq7Valid2
11398c2ecf20Sopenharmony_ci	 * 0x80, SysClkReq8Valid2
11408c2ecf20Sopenharmony_ci	 */
11418c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUSYSCLKREQVALID2,	0x03, 0x10, 0xfe),
11428c2ecf20Sopenharmony_ci	/*
11438c2ecf20Sopenharmony_ci	 * 0x02, VTVoutEna
11448c2ecf20Sopenharmony_ci	 * 0x04, Vintcore12Ena
11458c2ecf20Sopenharmony_ci	 * 0x38, Vintcore12Sel
11468c2ecf20Sopenharmony_ci	 * 0x40, Vintcore12LP
11478c2ecf20Sopenharmony_ci	 * 0x80, VTVoutLP
11488c2ecf20Sopenharmony_ci	 */
11498c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUMISC1,		0x03, 0x80, 0xfe),
11508c2ecf20Sopenharmony_ci	/*
11518c2ecf20Sopenharmony_ci	 * 0x02, VaudioEna
11528c2ecf20Sopenharmony_ci	 * 0x04, VdmicEna
11538c2ecf20Sopenharmony_ci	 * 0x08, Vamic1Ena
11548c2ecf20Sopenharmony_ci	 * 0x10, Vamic2Ena
11558c2ecf20Sopenharmony_ci	 */
11568c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VAUDIOSUPPLY,		0x03, 0x83, 0x1e),
11578c2ecf20Sopenharmony_ci	/*
11588c2ecf20Sopenharmony_ci	 * 0x01, Vamic1_dzout
11598c2ecf20Sopenharmony_ci	 * 0x02, Vamic2_dzout
11608c2ecf20Sopenharmony_ci	 */
11618c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUCTRL1VAMIC,		0x03, 0x84, 0x03),
11628c2ecf20Sopenharmony_ci	/*
11638c2ecf20Sopenharmony_ci	 * 0x03, VpllRegu (NOTE! PRCMU register bits)
11648c2ecf20Sopenharmony_ci	 * 0x0c, VanaRegu
11658c2ecf20Sopenharmony_ci	 */
11668c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VPLLVANAREGU,		0x04, 0x06, 0x0f),
11678c2ecf20Sopenharmony_ci	/*
11688c2ecf20Sopenharmony_ci	 * 0x01, VrefDDREna
11698c2ecf20Sopenharmony_ci	 * 0x02, VrefDDRSleepMode
11708c2ecf20Sopenharmony_ci	 */
11718c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VREFDDR,		0x04, 0x07, 0x03),
11728c2ecf20Sopenharmony_ci	/*
11738c2ecf20Sopenharmony_ci	 * 0x03, VextSupply1Regu
11748c2ecf20Sopenharmony_ci	 * 0x0c, VextSupply2Regu
11758c2ecf20Sopenharmony_ci	 * 0x30, VextSupply3Regu
11768c2ecf20Sopenharmony_ci	 * 0x40, ExtSupply2Bypass
11778c2ecf20Sopenharmony_ci	 * 0x80, ExtSupply3Bypass
11788c2ecf20Sopenharmony_ci	 */
11798c2ecf20Sopenharmony_ci	REG_INIT(AB8500_EXTSUPPLYREGU,		0x04, 0x08, 0xff),
11808c2ecf20Sopenharmony_ci	/*
11818c2ecf20Sopenharmony_ci	 * 0x03, Vaux1Regu
11828c2ecf20Sopenharmony_ci	 * 0x0c, Vaux2Regu
11838c2ecf20Sopenharmony_ci	 */
11848c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VAUX12REGU,		0x04, 0x09, 0x0f),
11858c2ecf20Sopenharmony_ci	/*
11868c2ecf20Sopenharmony_ci	 * 0x03, Vaux3Regu
11878c2ecf20Sopenharmony_ci	 */
11888c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VRF1VAUX3REGU,		0x04, 0x0a, 0x03),
11898c2ecf20Sopenharmony_ci	/*
11908c2ecf20Sopenharmony_ci	 * 0x0f, Vaux1Sel
11918c2ecf20Sopenharmony_ci	 */
11928c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VAUX1SEL,		0x04, 0x1f, 0x0f),
11938c2ecf20Sopenharmony_ci	/*
11948c2ecf20Sopenharmony_ci	 * 0x0f, Vaux2Sel
11958c2ecf20Sopenharmony_ci	 */
11968c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VAUX2SEL,		0x04, 0x20, 0x0f),
11978c2ecf20Sopenharmony_ci	/*
11988c2ecf20Sopenharmony_ci	 * 0x07, Vaux3Sel
11998c2ecf20Sopenharmony_ci	 */
12008c2ecf20Sopenharmony_ci	REG_INIT(AB8500_VRF1VAUX3SEL,		0x04, 0x21, 0x07),
12018c2ecf20Sopenharmony_ci	/*
12028c2ecf20Sopenharmony_ci	 * 0x01, VextSupply12LP
12038c2ecf20Sopenharmony_ci	 */
12048c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUCTRL2SPARE,		0x04, 0x22, 0x01),
12058c2ecf20Sopenharmony_ci	/*
12068c2ecf20Sopenharmony_ci	 * 0x04, Vaux1Disch
12078c2ecf20Sopenharmony_ci	 * 0x08, Vaux2Disch
12088c2ecf20Sopenharmony_ci	 * 0x10, Vaux3Disch
12098c2ecf20Sopenharmony_ci	 * 0x20, Vintcore12Disch
12108c2ecf20Sopenharmony_ci	 * 0x40, VTVoutDisch
12118c2ecf20Sopenharmony_ci	 * 0x80, VaudioDisch
12128c2ecf20Sopenharmony_ci	 */
12138c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUCTRLDISCH,		0x04, 0x43, 0xfc),
12148c2ecf20Sopenharmony_ci	/*
12158c2ecf20Sopenharmony_ci	 * 0x02, VanaDisch
12168c2ecf20Sopenharmony_ci	 * 0x04, VdmicPullDownEna
12178c2ecf20Sopenharmony_ci	 * 0x10, VdmicDisch
12188c2ecf20Sopenharmony_ci	 */
12198c2ecf20Sopenharmony_ci	REG_INIT(AB8500_REGUCTRLDISCH2,		0x04, 0x44, 0x16),
12208c2ecf20Sopenharmony_ci};
12218c2ecf20Sopenharmony_ci
12228c2ecf20Sopenharmony_ci/* AB8505 register init */
12238c2ecf20Sopenharmony_cistatic struct ab8500_reg_init ab8505_reg_init[] = {
12248c2ecf20Sopenharmony_ci	/*
12258c2ecf20Sopenharmony_ci	 * 0x03, VarmRequestCtrl
12268c2ecf20Sopenharmony_ci	 * 0x0c, VsmpsCRequestCtrl
12278c2ecf20Sopenharmony_ci	 * 0x30, VsmpsARequestCtrl
12288c2ecf20Sopenharmony_ci	 * 0xc0, VsmpsBRequestCtrl
12298c2ecf20Sopenharmony_ci	 */
12308c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUREQUESTCTRL1,	0x03, 0x03, 0xff),
12318c2ecf20Sopenharmony_ci	/*
12328c2ecf20Sopenharmony_ci	 * 0x03, VsafeRequestCtrl
12338c2ecf20Sopenharmony_ci	 * 0x0c, VpllRequestCtrl
12348c2ecf20Sopenharmony_ci	 * 0x30, VanaRequestCtrl
12358c2ecf20Sopenharmony_ci	 */
12368c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUREQUESTCTRL2,	0x03, 0x04, 0x3f),
12378c2ecf20Sopenharmony_ci	/*
12388c2ecf20Sopenharmony_ci	 * 0x30, Vaux1RequestCtrl
12398c2ecf20Sopenharmony_ci	 * 0xc0, Vaux2RequestCtrl
12408c2ecf20Sopenharmony_ci	 */
12418c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUREQUESTCTRL3,	0x03, 0x05, 0xf0),
12428c2ecf20Sopenharmony_ci	/*
12438c2ecf20Sopenharmony_ci	 * 0x03, Vaux3RequestCtrl
12448c2ecf20Sopenharmony_ci	 * 0x04, SwHPReq
12458c2ecf20Sopenharmony_ci	 */
12468c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUREQUESTCTRL4,	0x03, 0x06, 0x07),
12478c2ecf20Sopenharmony_ci	/*
12488c2ecf20Sopenharmony_ci	 * 0x01, VsmpsASysClkReq1HPValid
12498c2ecf20Sopenharmony_ci	 * 0x02, VsmpsBSysClkReq1HPValid
12508c2ecf20Sopenharmony_ci	 * 0x04, VsafeSysClkReq1HPValid
12518c2ecf20Sopenharmony_ci	 * 0x08, VanaSysClkReq1HPValid
12528c2ecf20Sopenharmony_ci	 * 0x10, VpllSysClkReq1HPValid
12538c2ecf20Sopenharmony_ci	 * 0x20, Vaux1SysClkReq1HPValid
12548c2ecf20Sopenharmony_ci	 * 0x40, Vaux2SysClkReq1HPValid
12558c2ecf20Sopenharmony_ci	 * 0x80, Vaux3SysClkReq1HPValid
12568c2ecf20Sopenharmony_ci	 */
12578c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID1,	0x03, 0x07, 0xff),
12588c2ecf20Sopenharmony_ci	/*
12598c2ecf20Sopenharmony_ci	 * 0x01, VsmpsCSysClkReq1HPValid
12608c2ecf20Sopenharmony_ci	 * 0x02, VarmSysClkReq1HPValid
12618c2ecf20Sopenharmony_ci	 * 0x04, VbbSysClkReq1HPValid
12628c2ecf20Sopenharmony_ci	 * 0x08, VsmpsMSysClkReq1HPValid
12638c2ecf20Sopenharmony_ci	 */
12648c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUSYSCLKREQ1HPVALID2,	0x03, 0x08, 0x0f),
12658c2ecf20Sopenharmony_ci	/*
12668c2ecf20Sopenharmony_ci	 * 0x01, VsmpsAHwHPReq1Valid
12678c2ecf20Sopenharmony_ci	 * 0x02, VsmpsBHwHPReq1Valid
12688c2ecf20Sopenharmony_ci	 * 0x04, VsafeHwHPReq1Valid
12698c2ecf20Sopenharmony_ci	 * 0x08, VanaHwHPReq1Valid
12708c2ecf20Sopenharmony_ci	 * 0x10, VpllHwHPReq1Valid
12718c2ecf20Sopenharmony_ci	 * 0x20, Vaux1HwHPReq1Valid
12728c2ecf20Sopenharmony_ci	 * 0x40, Vaux2HwHPReq1Valid
12738c2ecf20Sopenharmony_ci	 * 0x80, Vaux3HwHPReq1Valid
12748c2ecf20Sopenharmony_ci	 */
12758c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUHWHPREQ1VALID1,	0x03, 0x09, 0xff),
12768c2ecf20Sopenharmony_ci	/*
12778c2ecf20Sopenharmony_ci	 * 0x08, VsmpsMHwHPReq1Valid
12788c2ecf20Sopenharmony_ci	 */
12798c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUHWHPREQ1VALID2,	0x03, 0x0a, 0x08),
12808c2ecf20Sopenharmony_ci	/*
12818c2ecf20Sopenharmony_ci	 * 0x01, VsmpsAHwHPReq2Valid
12828c2ecf20Sopenharmony_ci	 * 0x02, VsmpsBHwHPReq2Valid
12838c2ecf20Sopenharmony_ci	 * 0x04, VsafeHwHPReq2Valid
12848c2ecf20Sopenharmony_ci	 * 0x08, VanaHwHPReq2Valid
12858c2ecf20Sopenharmony_ci	 * 0x10, VpllHwHPReq2Valid
12868c2ecf20Sopenharmony_ci	 * 0x20, Vaux1HwHPReq2Valid
12878c2ecf20Sopenharmony_ci	 * 0x40, Vaux2HwHPReq2Valid
12888c2ecf20Sopenharmony_ci	 * 0x80, Vaux3HwHPReq2Valid
12898c2ecf20Sopenharmony_ci	 */
12908c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUHWHPREQ2VALID1,	0x03, 0x0b, 0xff),
12918c2ecf20Sopenharmony_ci	/*
12928c2ecf20Sopenharmony_ci	 * 0x08, VsmpsMHwHPReq2Valid
12938c2ecf20Sopenharmony_ci	 */
12948c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUHWHPREQ2VALID2,	0x03, 0x0c, 0x08),
12958c2ecf20Sopenharmony_ci	/*
12968c2ecf20Sopenharmony_ci	 * 0x01, VsmpsCSwHPReqValid
12978c2ecf20Sopenharmony_ci	 * 0x02, VarmSwHPReqValid
12988c2ecf20Sopenharmony_ci	 * 0x04, VsmpsASwHPReqValid
12998c2ecf20Sopenharmony_ci	 * 0x08, VsmpsBSwHPReqValid
13008c2ecf20Sopenharmony_ci	 * 0x10, VsafeSwHPReqValid
13018c2ecf20Sopenharmony_ci	 * 0x20, VanaSwHPReqValid
13028c2ecf20Sopenharmony_ci	 * 0x40, VpllSwHPReqValid
13038c2ecf20Sopenharmony_ci	 * 0x80, Vaux1SwHPReqValid
13048c2ecf20Sopenharmony_ci	 */
13058c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUSWHPREQVALID1,	0x03, 0x0d, 0xff),
13068c2ecf20Sopenharmony_ci	/*
13078c2ecf20Sopenharmony_ci	 * 0x01, Vaux2SwHPReqValid
13088c2ecf20Sopenharmony_ci	 * 0x02, Vaux3SwHPReqValid
13098c2ecf20Sopenharmony_ci	 * 0x20, VsmpsMSwHPReqValid
13108c2ecf20Sopenharmony_ci	 */
13118c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUSWHPREQVALID2,	0x03, 0x0e, 0x23),
13128c2ecf20Sopenharmony_ci	/*
13138c2ecf20Sopenharmony_ci	 * 0x02, SysClkReq2Valid1
13148c2ecf20Sopenharmony_ci	 * 0x04, SysClkReq3Valid1
13158c2ecf20Sopenharmony_ci	 * 0x08, SysClkReq4Valid1
13168c2ecf20Sopenharmony_ci	 */
13178c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUSYSCLKREQVALID1,	0x03, 0x0f, 0x0e),
13188c2ecf20Sopenharmony_ci	/*
13198c2ecf20Sopenharmony_ci	 * 0x02, SysClkReq2Valid2
13208c2ecf20Sopenharmony_ci	 * 0x04, SysClkReq3Valid2
13218c2ecf20Sopenharmony_ci	 * 0x08, SysClkReq4Valid2
13228c2ecf20Sopenharmony_ci	 */
13238c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUSYSCLKREQVALID2,	0x03, 0x10, 0x0e),
13248c2ecf20Sopenharmony_ci	/*
13258c2ecf20Sopenharmony_ci	 * 0x01, Vaux4SwHPReqValid
13268c2ecf20Sopenharmony_ci	 * 0x02, Vaux4HwHPReq2Valid
13278c2ecf20Sopenharmony_ci	 * 0x04, Vaux4HwHPReq1Valid
13288c2ecf20Sopenharmony_ci	 * 0x08, Vaux4SysClkReq1HPValid
13298c2ecf20Sopenharmony_ci	 */
13308c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUVAUX4REQVALID,	0x03, 0x11, 0x0f),
13318c2ecf20Sopenharmony_ci	/*
13328c2ecf20Sopenharmony_ci	 * 0x02, VadcEna
13338c2ecf20Sopenharmony_ci	 * 0x04, VintCore12Ena
13348c2ecf20Sopenharmony_ci	 * 0x38, VintCore12Sel
13358c2ecf20Sopenharmony_ci	 * 0x40, VintCore12LP
13368c2ecf20Sopenharmony_ci	 * 0x80, VadcLP
13378c2ecf20Sopenharmony_ci	 */
13388c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUMISC1,		0x03, 0x80, 0xfe),
13398c2ecf20Sopenharmony_ci	/*
13408c2ecf20Sopenharmony_ci	 * 0x02, VaudioEna
13418c2ecf20Sopenharmony_ci	 * 0x04, VdmicEna
13428c2ecf20Sopenharmony_ci	 * 0x08, Vamic1Ena
13438c2ecf20Sopenharmony_ci	 * 0x10, Vamic2Ena
13448c2ecf20Sopenharmony_ci	 */
13458c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUDIOSUPPLY,		0x03, 0x83, 0x1e),
13468c2ecf20Sopenharmony_ci	/*
13478c2ecf20Sopenharmony_ci	 * 0x01, Vamic1_dzout
13488c2ecf20Sopenharmony_ci	 * 0x02, Vamic2_dzout
13498c2ecf20Sopenharmony_ci	 */
13508c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUCTRL1VAMIC,		0x03, 0x84, 0x03),
13518c2ecf20Sopenharmony_ci	/*
13528c2ecf20Sopenharmony_ci	 * 0x03, VsmpsARegu
13538c2ecf20Sopenharmony_ci	 * 0x0c, VsmpsASelCtrl
13548c2ecf20Sopenharmony_ci	 * 0x10, VsmpsAAutoMode
13558c2ecf20Sopenharmony_ci	 * 0x20, VsmpsAPWMMode
13568c2ecf20Sopenharmony_ci	 */
13578c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSAREGU,		0x04, 0x03, 0x3f),
13588c2ecf20Sopenharmony_ci	/*
13598c2ecf20Sopenharmony_ci	 * 0x03, VsmpsBRegu
13608c2ecf20Sopenharmony_ci	 * 0x0c, VsmpsBSelCtrl
13618c2ecf20Sopenharmony_ci	 * 0x10, VsmpsBAutoMode
13628c2ecf20Sopenharmony_ci	 * 0x20, VsmpsBPWMMode
13638c2ecf20Sopenharmony_ci	 */
13648c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSBREGU,		0x04, 0x04, 0x3f),
13658c2ecf20Sopenharmony_ci	/*
13668c2ecf20Sopenharmony_ci	 * 0x03, VsafeRegu
13678c2ecf20Sopenharmony_ci	 * 0x0c, VsafeSelCtrl
13688c2ecf20Sopenharmony_ci	 * 0x10, VsafeAutoMode
13698c2ecf20Sopenharmony_ci	 * 0x20, VsafePWMMode
13708c2ecf20Sopenharmony_ci	 */
13718c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSAFEREGU,		0x04, 0x05, 0x3f),
13728c2ecf20Sopenharmony_ci	/*
13738c2ecf20Sopenharmony_ci	 * 0x03, VpllRegu (NOTE! PRCMU register bits)
13748c2ecf20Sopenharmony_ci	 * 0x0c, VanaRegu
13758c2ecf20Sopenharmony_ci	 */
13768c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VPLLVANAREGU,		0x04, 0x06, 0x0f),
13778c2ecf20Sopenharmony_ci	/*
13788c2ecf20Sopenharmony_ci	 * 0x03, VextSupply1Regu
13798c2ecf20Sopenharmony_ci	 * 0x0c, VextSupply2Regu
13808c2ecf20Sopenharmony_ci	 * 0x30, VextSupply3Regu
13818c2ecf20Sopenharmony_ci	 * 0x40, ExtSupply2Bypass
13828c2ecf20Sopenharmony_ci	 * 0x80, ExtSupply3Bypass
13838c2ecf20Sopenharmony_ci	 */
13848c2ecf20Sopenharmony_ci	REG_INIT(AB8505_EXTSUPPLYREGU,		0x04, 0x08, 0xff),
13858c2ecf20Sopenharmony_ci	/*
13868c2ecf20Sopenharmony_ci	 * 0x03, Vaux1Regu
13878c2ecf20Sopenharmony_ci	 * 0x0c, Vaux2Regu
13888c2ecf20Sopenharmony_ci	 */
13898c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUX12REGU,		0x04, 0x09, 0x0f),
13908c2ecf20Sopenharmony_ci	/*
13918c2ecf20Sopenharmony_ci	 * 0x0f, Vaux3Regu
13928c2ecf20Sopenharmony_ci	 */
13938c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VRF1VAUX3REGU,		0x04, 0x0a, 0x0f),
13948c2ecf20Sopenharmony_ci	/*
13958c2ecf20Sopenharmony_ci	 * 0x3f, VsmpsASel1
13968c2ecf20Sopenharmony_ci	 */
13978c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSASEL1,		0x04, 0x13, 0x3f),
13988c2ecf20Sopenharmony_ci	/*
13998c2ecf20Sopenharmony_ci	 * 0x3f, VsmpsASel2
14008c2ecf20Sopenharmony_ci	 */
14018c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSASEL2,		0x04, 0x14, 0x3f),
14028c2ecf20Sopenharmony_ci	/*
14038c2ecf20Sopenharmony_ci	 * 0x3f, VsmpsASel3
14048c2ecf20Sopenharmony_ci	 */
14058c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSASEL3,		0x04, 0x15, 0x3f),
14068c2ecf20Sopenharmony_ci	/*
14078c2ecf20Sopenharmony_ci	 * 0x3f, VsmpsBSel1
14088c2ecf20Sopenharmony_ci	 */
14098c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSBSEL1,		0x04, 0x17, 0x3f),
14108c2ecf20Sopenharmony_ci	/*
14118c2ecf20Sopenharmony_ci	 * 0x3f, VsmpsBSel2
14128c2ecf20Sopenharmony_ci	 */
14138c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSBSEL2,		0x04, 0x18, 0x3f),
14148c2ecf20Sopenharmony_ci	/*
14158c2ecf20Sopenharmony_ci	 * 0x3f, VsmpsBSel3
14168c2ecf20Sopenharmony_ci	 */
14178c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSMPSBSEL3,		0x04, 0x19, 0x3f),
14188c2ecf20Sopenharmony_ci	/*
14198c2ecf20Sopenharmony_ci	 * 0x7f, VsafeSel1
14208c2ecf20Sopenharmony_ci	 */
14218c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSAFESEL1,		0x04, 0x1b, 0x7f),
14228c2ecf20Sopenharmony_ci	/*
14238c2ecf20Sopenharmony_ci	 * 0x3f, VsafeSel2
14248c2ecf20Sopenharmony_ci	 */
14258c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSAFESEL2,		0x04, 0x1c, 0x7f),
14268c2ecf20Sopenharmony_ci	/*
14278c2ecf20Sopenharmony_ci	 * 0x3f, VsafeSel3
14288c2ecf20Sopenharmony_ci	 */
14298c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VSAFESEL3,		0x04, 0x1d, 0x7f),
14308c2ecf20Sopenharmony_ci	/*
14318c2ecf20Sopenharmony_ci	 * 0x0f, Vaux1Sel
14328c2ecf20Sopenharmony_ci	 */
14338c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUX1SEL,		0x04, 0x1f, 0x0f),
14348c2ecf20Sopenharmony_ci	/*
14358c2ecf20Sopenharmony_ci	 * 0x0f, Vaux2Sel
14368c2ecf20Sopenharmony_ci	 */
14378c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUX2SEL,		0x04, 0x20, 0x0f),
14388c2ecf20Sopenharmony_ci	/*
14398c2ecf20Sopenharmony_ci	 * 0x07, Vaux3Sel
14408c2ecf20Sopenharmony_ci	 * 0x30, VRF1Sel
14418c2ecf20Sopenharmony_ci	 */
14428c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VRF1VAUX3SEL,		0x04, 0x21, 0x37),
14438c2ecf20Sopenharmony_ci	/*
14448c2ecf20Sopenharmony_ci	 * 0x03, Vaux4RequestCtrl
14458c2ecf20Sopenharmony_ci	 */
14468c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUX4REQCTRL,		0x04, 0x2d, 0x03),
14478c2ecf20Sopenharmony_ci	/*
14488c2ecf20Sopenharmony_ci	 * 0x03, Vaux4Regu
14498c2ecf20Sopenharmony_ci	 */
14508c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUX4REGU,		0x04, 0x2e, 0x03),
14518c2ecf20Sopenharmony_ci	/*
14528c2ecf20Sopenharmony_ci	 * 0x0f, Vaux4Sel
14538c2ecf20Sopenharmony_ci	 */
14548c2ecf20Sopenharmony_ci	REG_INIT(AB8505_VAUX4SEL,		0x04, 0x2f, 0x0f),
14558c2ecf20Sopenharmony_ci	/*
14568c2ecf20Sopenharmony_ci	 * 0x04, Vaux1Disch
14578c2ecf20Sopenharmony_ci	 * 0x08, Vaux2Disch
14588c2ecf20Sopenharmony_ci	 * 0x10, Vaux3Disch
14598c2ecf20Sopenharmony_ci	 * 0x20, Vintcore12Disch
14608c2ecf20Sopenharmony_ci	 * 0x40, VTVoutDisch
14618c2ecf20Sopenharmony_ci	 * 0x80, VaudioDisch
14628c2ecf20Sopenharmony_ci	 */
14638c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUCTRLDISCH,		0x04, 0x43, 0xfc),
14648c2ecf20Sopenharmony_ci	/*
14658c2ecf20Sopenharmony_ci	 * 0x02, VanaDisch
14668c2ecf20Sopenharmony_ci	 * 0x04, VdmicPullDownEna
14678c2ecf20Sopenharmony_ci	 * 0x10, VdmicDisch
14688c2ecf20Sopenharmony_ci	 */
14698c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUCTRLDISCH2,		0x04, 0x44, 0x16),
14708c2ecf20Sopenharmony_ci	/*
14718c2ecf20Sopenharmony_ci	 * 0x01, Vaux4Disch
14728c2ecf20Sopenharmony_ci	 */
14738c2ecf20Sopenharmony_ci	REG_INIT(AB8505_REGUCTRLDISCH3,		0x04, 0x48, 0x01),
14748c2ecf20Sopenharmony_ci	/*
14758c2ecf20Sopenharmony_ci	 * 0x07, Vaux5Sel
14768c2ecf20Sopenharmony_ci	 * 0x08, Vaux5LP
14778c2ecf20Sopenharmony_ci	 * 0x10, Vaux5Ena
14788c2ecf20Sopenharmony_ci	 * 0x20, Vaux5Disch
14798c2ecf20Sopenharmony_ci	 * 0x40, Vaux5DisSfst
14808c2ecf20Sopenharmony_ci	 * 0x80, Vaux5DisPulld
14818c2ecf20Sopenharmony_ci	 */
14828c2ecf20Sopenharmony_ci	REG_INIT(AB8505_CTRLVAUX5,		0x01, 0x55, 0xff),
14838c2ecf20Sopenharmony_ci	/*
14848c2ecf20Sopenharmony_ci	 * 0x07, Vaux6Sel
14858c2ecf20Sopenharmony_ci	 * 0x08, Vaux6LP
14868c2ecf20Sopenharmony_ci	 * 0x10, Vaux6Ena
14878c2ecf20Sopenharmony_ci	 * 0x80, Vaux6DisPulld
14888c2ecf20Sopenharmony_ci	 */
14898c2ecf20Sopenharmony_ci	REG_INIT(AB8505_CTRLVAUX6,		0x01, 0x56, 0x9f),
14908c2ecf20Sopenharmony_ci};
14918c2ecf20Sopenharmony_ci
14928c2ecf20Sopenharmony_cistatic struct of_regulator_match ab8500_regulator_match[] = {
14938c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux1",    .driver_data = (void *) AB8500_LDO_AUX1, },
14948c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux2",    .driver_data = (void *) AB8500_LDO_AUX2, },
14958c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux3",    .driver_data = (void *) AB8500_LDO_AUX3, },
14968c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_intcore", .driver_data = (void *) AB8500_LDO_INTCORE, },
14978c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_tvout",   .driver_data = (void *) AB8500_LDO_TVOUT, },
14988c2ecf20Sopenharmony_ci	{ .name = "ab8500_ldo_audio",   .driver_data = (void *) AB8500_LDO_AUDIO, },
14998c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_anamic1", .driver_data = (void *) AB8500_LDO_ANAMIC1, },
15008c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_anamic2", .driver_data = (void *) AB8500_LDO_ANAMIC2, },
15018c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_dmic",    .driver_data = (void *) AB8500_LDO_DMIC, },
15028c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_ana",     .driver_data = (void *) AB8500_LDO_ANA, },
15038c2ecf20Sopenharmony_ci};
15048c2ecf20Sopenharmony_ci
15058c2ecf20Sopenharmony_cistatic struct of_regulator_match ab8505_regulator_match[] = {
15068c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux1",    .driver_data = (void *) AB8505_LDO_AUX1, },
15078c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux2",    .driver_data = (void *) AB8505_LDO_AUX2, },
15088c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux3",    .driver_data = (void *) AB8505_LDO_AUX3, },
15098c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux4",    .driver_data = (void *) AB8505_LDO_AUX4, },
15108c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux5",    .driver_data = (void *) AB8505_LDO_AUX5, },
15118c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux6",    .driver_data = (void *) AB8505_LDO_AUX6, },
15128c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_intcore", .driver_data = (void *) AB8505_LDO_INTCORE, },
15138c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_adc",	.driver_data = (void *) AB8505_LDO_ADC, },
15148c2ecf20Sopenharmony_ci	{ .name = "ab8500_ldo_audio",   .driver_data = (void *) AB8505_LDO_AUDIO, },
15158c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_anamic1", .driver_data = (void *) AB8505_LDO_ANAMIC1, },
15168c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_anamic2", .driver_data = (void *) AB8505_LDO_ANAMIC2, },
15178c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_aux8",    .driver_data = (void *) AB8505_LDO_AUX8, },
15188c2ecf20Sopenharmony_ci	{ .name	= "ab8500_ldo_ana",     .driver_data = (void *) AB8505_LDO_ANA, },
15198c2ecf20Sopenharmony_ci};
15208c2ecf20Sopenharmony_ci
15218c2ecf20Sopenharmony_cistatic struct {
15228c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info;
15238c2ecf20Sopenharmony_ci	int info_size;
15248c2ecf20Sopenharmony_ci	struct ab8500_reg_init *init;
15258c2ecf20Sopenharmony_ci	int init_size;
15268c2ecf20Sopenharmony_ci	struct of_regulator_match *match;
15278c2ecf20Sopenharmony_ci	int match_size;
15288c2ecf20Sopenharmony_ci} abx500_regulator;
15298c2ecf20Sopenharmony_ci
15308c2ecf20Sopenharmony_cistatic void abx500_get_regulator_info(struct ab8500 *ab8500)
15318c2ecf20Sopenharmony_ci{
15328c2ecf20Sopenharmony_ci	if (is_ab8505(ab8500)) {
15338c2ecf20Sopenharmony_ci		abx500_regulator.info = ab8505_regulator_info;
15348c2ecf20Sopenharmony_ci		abx500_regulator.info_size = ARRAY_SIZE(ab8505_regulator_info);
15358c2ecf20Sopenharmony_ci		abx500_regulator.init = ab8505_reg_init;
15368c2ecf20Sopenharmony_ci		abx500_regulator.init_size = AB8505_NUM_REGULATOR_REGISTERS;
15378c2ecf20Sopenharmony_ci		abx500_regulator.match = ab8505_regulator_match;
15388c2ecf20Sopenharmony_ci		abx500_regulator.match_size = ARRAY_SIZE(ab8505_regulator_match);
15398c2ecf20Sopenharmony_ci	} else {
15408c2ecf20Sopenharmony_ci		abx500_regulator.info = ab8500_regulator_info;
15418c2ecf20Sopenharmony_ci		abx500_regulator.info_size = ARRAY_SIZE(ab8500_regulator_info);
15428c2ecf20Sopenharmony_ci		abx500_regulator.init = ab8500_reg_init;
15438c2ecf20Sopenharmony_ci		abx500_regulator.init_size = AB8500_NUM_REGULATOR_REGISTERS;
15448c2ecf20Sopenharmony_ci		abx500_regulator.match = ab8500_regulator_match;
15458c2ecf20Sopenharmony_ci		abx500_regulator.match_size = ARRAY_SIZE(ab8500_regulator_match);
15468c2ecf20Sopenharmony_ci	}
15478c2ecf20Sopenharmony_ci}
15488c2ecf20Sopenharmony_ci
15498c2ecf20Sopenharmony_cistatic int ab8500_regulator_register(struct platform_device *pdev,
15508c2ecf20Sopenharmony_ci				     struct regulator_init_data *init_data,
15518c2ecf20Sopenharmony_ci				     int id, struct device_node *np)
15528c2ecf20Sopenharmony_ci{
15538c2ecf20Sopenharmony_ci	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
15548c2ecf20Sopenharmony_ci	struct ab8500_regulator_info *info = NULL;
15558c2ecf20Sopenharmony_ci	struct regulator_config config = { };
15568c2ecf20Sopenharmony_ci	struct regulator_dev *rdev;
15578c2ecf20Sopenharmony_ci
15588c2ecf20Sopenharmony_ci	/* assign per-regulator data */
15598c2ecf20Sopenharmony_ci	info = &abx500_regulator.info[id];
15608c2ecf20Sopenharmony_ci	info->dev = &pdev->dev;
15618c2ecf20Sopenharmony_ci
15628c2ecf20Sopenharmony_ci	config.dev = &pdev->dev;
15638c2ecf20Sopenharmony_ci	config.init_data = init_data;
15648c2ecf20Sopenharmony_ci	config.driver_data = info;
15658c2ecf20Sopenharmony_ci	config.of_node = np;
15668c2ecf20Sopenharmony_ci
15678c2ecf20Sopenharmony_ci	/* fix for hardware before ab8500v2.0 */
15688c2ecf20Sopenharmony_ci	if (is_ab8500_1p1_or_earlier(ab8500)) {
15698c2ecf20Sopenharmony_ci		if (info->desc.id == AB8500_LDO_AUX3) {
15708c2ecf20Sopenharmony_ci			info->desc.n_voltages =
15718c2ecf20Sopenharmony_ci				ARRAY_SIZE(ldo_vauxn_voltages);
15728c2ecf20Sopenharmony_ci			info->desc.volt_table = ldo_vauxn_voltages;
15738c2ecf20Sopenharmony_ci			info->voltage_mask = 0xf;
15748c2ecf20Sopenharmony_ci		}
15758c2ecf20Sopenharmony_ci	}
15768c2ecf20Sopenharmony_ci
15778c2ecf20Sopenharmony_ci	/* register regulator with framework */
15788c2ecf20Sopenharmony_ci	rdev = devm_regulator_register(&pdev->dev, &info->desc, &config);
15798c2ecf20Sopenharmony_ci	if (IS_ERR(rdev)) {
15808c2ecf20Sopenharmony_ci		dev_err(&pdev->dev, "failed to register regulator %s\n",
15818c2ecf20Sopenharmony_ci			info->desc.name);
15828c2ecf20Sopenharmony_ci		return PTR_ERR(rdev);
15838c2ecf20Sopenharmony_ci	}
15848c2ecf20Sopenharmony_ci
15858c2ecf20Sopenharmony_ci	return 0;
15868c2ecf20Sopenharmony_ci}
15878c2ecf20Sopenharmony_ci
15888c2ecf20Sopenharmony_cistatic int ab8500_regulator_probe(struct platform_device *pdev)
15898c2ecf20Sopenharmony_ci{
15908c2ecf20Sopenharmony_ci	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
15918c2ecf20Sopenharmony_ci	struct device_node *np = pdev->dev.of_node;
15928c2ecf20Sopenharmony_ci	struct of_regulator_match *match;
15938c2ecf20Sopenharmony_ci	int err, i;
15948c2ecf20Sopenharmony_ci
15958c2ecf20Sopenharmony_ci	if (!ab8500) {
15968c2ecf20Sopenharmony_ci		dev_err(&pdev->dev, "null mfd parent\n");
15978c2ecf20Sopenharmony_ci		return -EINVAL;
15988c2ecf20Sopenharmony_ci	}
15998c2ecf20Sopenharmony_ci
16008c2ecf20Sopenharmony_ci	abx500_get_regulator_info(ab8500);
16018c2ecf20Sopenharmony_ci
16028c2ecf20Sopenharmony_ci	err = of_regulator_match(&pdev->dev, np,
16038c2ecf20Sopenharmony_ci				 abx500_regulator.match,
16048c2ecf20Sopenharmony_ci				 abx500_regulator.match_size);
16058c2ecf20Sopenharmony_ci	if (err < 0) {
16068c2ecf20Sopenharmony_ci		dev_err(&pdev->dev,
16078c2ecf20Sopenharmony_ci			"Error parsing regulator init data: %d\n", err);
16088c2ecf20Sopenharmony_ci		return err;
16098c2ecf20Sopenharmony_ci	}
16108c2ecf20Sopenharmony_ci
16118c2ecf20Sopenharmony_ci	match = abx500_regulator.match;
16128c2ecf20Sopenharmony_ci	for (i = 0; i < abx500_regulator.info_size; i++) {
16138c2ecf20Sopenharmony_ci		err = ab8500_regulator_register(pdev, match[i].init_data, i,
16148c2ecf20Sopenharmony_ci						match[i].of_node);
16158c2ecf20Sopenharmony_ci		if (err)
16168c2ecf20Sopenharmony_ci			return err;
16178c2ecf20Sopenharmony_ci	}
16188c2ecf20Sopenharmony_ci
16198c2ecf20Sopenharmony_ci	return 0;
16208c2ecf20Sopenharmony_ci}
16218c2ecf20Sopenharmony_ci
16228c2ecf20Sopenharmony_cistatic struct platform_driver ab8500_regulator_driver = {
16238c2ecf20Sopenharmony_ci	.probe = ab8500_regulator_probe,
16248c2ecf20Sopenharmony_ci	.driver         = {
16258c2ecf20Sopenharmony_ci		.name   = "ab8500-regulator",
16268c2ecf20Sopenharmony_ci	},
16278c2ecf20Sopenharmony_ci};
16288c2ecf20Sopenharmony_ci
16298c2ecf20Sopenharmony_cistatic int __init ab8500_regulator_init(void)
16308c2ecf20Sopenharmony_ci{
16318c2ecf20Sopenharmony_ci	int ret;
16328c2ecf20Sopenharmony_ci
16338c2ecf20Sopenharmony_ci	ret = platform_driver_register(&ab8500_regulator_driver);
16348c2ecf20Sopenharmony_ci	if (ret != 0)
16358c2ecf20Sopenharmony_ci		pr_err("Failed to register ab8500 regulator: %d\n", ret);
16368c2ecf20Sopenharmony_ci
16378c2ecf20Sopenharmony_ci	return ret;
16388c2ecf20Sopenharmony_ci}
16398c2ecf20Sopenharmony_cisubsys_initcall(ab8500_regulator_init);
16408c2ecf20Sopenharmony_ci
16418c2ecf20Sopenharmony_cistatic void __exit ab8500_regulator_exit(void)
16428c2ecf20Sopenharmony_ci{
16438c2ecf20Sopenharmony_ci	platform_driver_unregister(&ab8500_regulator_driver);
16448c2ecf20Sopenharmony_ci}
16458c2ecf20Sopenharmony_cimodule_exit(ab8500_regulator_exit);
16468c2ecf20Sopenharmony_ci
16478c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
16488c2ecf20Sopenharmony_ciMODULE_AUTHOR("Sundar Iyer <sundar.iyer@stericsson.com>");
16498c2ecf20Sopenharmony_ciMODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
16508c2ecf20Sopenharmony_ciMODULE_AUTHOR("Daniel Willerud <daniel.willerud@stericsson.com>");
16518c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Regulator Driver for ST-Ericsson AB8500 Mixed-Sig PMIC");
16528c2ecf20Sopenharmony_ciMODULE_ALIAS("platform:ab8500-regulator");
1653