xref: /openbmc/linux/drivers/regulator/db8500-prcmu.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
10376148fSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21032fbfdSBengt Jonsson /*
31032fbfdSBengt Jonsson  * Copyright (C) ST-Ericsson SA 2010
41032fbfdSBengt Jonsson  *
51032fbfdSBengt Jonsson  * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson
61032fbfdSBengt Jonsson  *          Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson
71032fbfdSBengt Jonsson  *
81032fbfdSBengt Jonsson  * Power domain regulators on DB8500
91032fbfdSBengt Jonsson  */
101032fbfdSBengt Jonsson 
111032fbfdSBengt Jonsson #include <linux/kernel.h>
121032fbfdSBengt Jonsson #include <linux/init.h>
131032fbfdSBengt Jonsson #include <linux/err.h>
141032fbfdSBengt Jonsson #include <linux/spinlock.h>
151032fbfdSBengt Jonsson #include <linux/platform_device.h>
1673180f85SMattias Nilsson #include <linux/mfd/dbx500-prcmu.h>
171032fbfdSBengt Jonsson #include <linux/regulator/driver.h>
181032fbfdSBengt Jonsson #include <linux/regulator/machine.h>
191032fbfdSBengt Jonsson #include <linux/regulator/db8500-prcmu.h>
201bdd670aSLee Jones #include <linux/regulator/of_regulator.h>
211bdd670aSLee Jones #include <linux/of.h>
2265602c32SPaul Gortmaker #include <linux/module.h>
2338e96838SBengt Jonsson #include "dbx500-prcmu.h"
241032fbfdSBengt Jonsson 
db8500_regulator_enable(struct regulator_dev * rdev)251032fbfdSBengt Jonsson static int db8500_regulator_enable(struct regulator_dev *rdev)
261032fbfdSBengt Jonsson {
2738e96838SBengt Jonsson 	struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
281032fbfdSBengt Jonsson 
291032fbfdSBengt Jonsson 	if (info == NULL)
301032fbfdSBengt Jonsson 		return -EINVAL;
311032fbfdSBengt Jonsson 
321032fbfdSBengt Jonsson 	dev_vdbg(rdev_get_dev(rdev), "regulator-%s-enable\n",
331032fbfdSBengt Jonsson 		info->desc.name);
341032fbfdSBengt Jonsson 
3538e96838SBengt Jonsson 	if (!info->is_enabled) {
361032fbfdSBengt Jonsson 		info->is_enabled = true;
371032fbfdSBengt Jonsson 		if (!info->exclude_from_power_state)
381032fbfdSBengt Jonsson 			power_state_active_enable();
3938e96838SBengt Jonsson 	}
401032fbfdSBengt Jonsson 
411032fbfdSBengt Jonsson 	return 0;
421032fbfdSBengt Jonsson }
431032fbfdSBengt Jonsson 
db8500_regulator_disable(struct regulator_dev * rdev)441032fbfdSBengt Jonsson static int db8500_regulator_disable(struct regulator_dev *rdev)
451032fbfdSBengt Jonsson {
4638e96838SBengt Jonsson 	struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
471032fbfdSBengt Jonsson 	int ret = 0;
481032fbfdSBengt Jonsson 
491032fbfdSBengt Jonsson 	if (info == NULL)
501032fbfdSBengt Jonsson 		return -EINVAL;
511032fbfdSBengt Jonsson 
521032fbfdSBengt Jonsson 	dev_vdbg(rdev_get_dev(rdev), "regulator-%s-disable\n",
531032fbfdSBengt Jonsson 		info->desc.name);
541032fbfdSBengt Jonsson 
5538e96838SBengt Jonsson 	if (info->is_enabled) {
561032fbfdSBengt Jonsson 		info->is_enabled = false;
571032fbfdSBengt Jonsson 		if (!info->exclude_from_power_state)
581032fbfdSBengt Jonsson 			ret = power_state_active_disable();
5938e96838SBengt Jonsson 	}
601032fbfdSBengt Jonsson 
611032fbfdSBengt Jonsson 	return ret;
621032fbfdSBengt Jonsson }
631032fbfdSBengt Jonsson 
db8500_regulator_is_enabled(struct regulator_dev * rdev)641032fbfdSBengt Jonsson static int db8500_regulator_is_enabled(struct regulator_dev *rdev)
651032fbfdSBengt Jonsson {
6638e96838SBengt Jonsson 	struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
671032fbfdSBengt Jonsson 
681032fbfdSBengt Jonsson 	if (info == NULL)
691032fbfdSBengt Jonsson 		return -EINVAL;
701032fbfdSBengt Jonsson 
711032fbfdSBengt Jonsson 	dev_vdbg(rdev_get_dev(rdev), "regulator-%s-is_enabled (is_enabled):"
721032fbfdSBengt Jonsson 		" %i\n", info->desc.name, info->is_enabled);
731032fbfdSBengt Jonsson 
741032fbfdSBengt Jonsson 	return info->is_enabled;
751032fbfdSBengt Jonsson }
761032fbfdSBengt Jonsson 
771032fbfdSBengt Jonsson /* db8500 regulator operations */
781a18195aSAxel Lin static const struct regulator_ops db8500_regulator_ops = {
791032fbfdSBengt Jonsson 	.enable			= db8500_regulator_enable,
801032fbfdSBengt Jonsson 	.disable		= db8500_regulator_disable,
811032fbfdSBengt Jonsson 	.is_enabled		= db8500_regulator_is_enabled,
821032fbfdSBengt Jonsson };
831032fbfdSBengt Jonsson 
841032fbfdSBengt Jonsson /*
851032fbfdSBengt Jonsson  * EPOD control
861032fbfdSBengt Jonsson  */
871032fbfdSBengt Jonsson static bool epod_on[NUM_EPOD_ID];
881032fbfdSBengt Jonsson static bool epod_ramret[NUM_EPOD_ID];
891032fbfdSBengt Jonsson 
enable_epod(u16 epod_id,bool ramret)901032fbfdSBengt Jonsson static int enable_epod(u16 epod_id, bool ramret)
911032fbfdSBengt Jonsson {
921032fbfdSBengt Jonsson 	int ret;
931032fbfdSBengt Jonsson 
941032fbfdSBengt Jonsson 	if (ramret) {
951032fbfdSBengt Jonsson 		if (!epod_on[epod_id]) {
961032fbfdSBengt Jonsson 			ret = prcmu_set_epod(epod_id, EPOD_STATE_RAMRET);
971032fbfdSBengt Jonsson 			if (ret < 0)
981032fbfdSBengt Jonsson 				return ret;
991032fbfdSBengt Jonsson 		}
1001032fbfdSBengt Jonsson 		epod_ramret[epod_id] = true;
1011032fbfdSBengt Jonsson 	} else {
1021032fbfdSBengt Jonsson 		ret = prcmu_set_epod(epod_id, EPOD_STATE_ON);
1031032fbfdSBengt Jonsson 		if (ret < 0)
1041032fbfdSBengt Jonsson 			return ret;
1051032fbfdSBengt Jonsson 		epod_on[epod_id] = true;
1061032fbfdSBengt Jonsson 	}
1071032fbfdSBengt Jonsson 
1081032fbfdSBengt Jonsson 	return 0;
1091032fbfdSBengt Jonsson }
1101032fbfdSBengt Jonsson 
disable_epod(u16 epod_id,bool ramret)1111032fbfdSBengt Jonsson static int disable_epod(u16 epod_id, bool ramret)
1121032fbfdSBengt Jonsson {
1131032fbfdSBengt Jonsson 	int ret;
1141032fbfdSBengt Jonsson 
1151032fbfdSBengt Jonsson 	if (ramret) {
1161032fbfdSBengt Jonsson 		if (!epod_on[epod_id]) {
1171032fbfdSBengt Jonsson 			ret = prcmu_set_epod(epod_id, EPOD_STATE_OFF);
1181032fbfdSBengt Jonsson 			if (ret < 0)
1191032fbfdSBengt Jonsson 				return ret;
1201032fbfdSBengt Jonsson 		}
1211032fbfdSBengt Jonsson 		epod_ramret[epod_id] = false;
1221032fbfdSBengt Jonsson 	} else {
1231032fbfdSBengt Jonsson 		if (epod_ramret[epod_id]) {
1241032fbfdSBengt Jonsson 			ret = prcmu_set_epod(epod_id, EPOD_STATE_RAMRET);
1251032fbfdSBengt Jonsson 			if (ret < 0)
1261032fbfdSBengt Jonsson 				return ret;
1271032fbfdSBengt Jonsson 		} else {
1281032fbfdSBengt Jonsson 			ret = prcmu_set_epod(epod_id, EPOD_STATE_OFF);
1291032fbfdSBengt Jonsson 			if (ret < 0)
1301032fbfdSBengt Jonsson 				return ret;
1311032fbfdSBengt Jonsson 		}
1321032fbfdSBengt Jonsson 		epod_on[epod_id] = false;
1331032fbfdSBengt Jonsson 	}
1341032fbfdSBengt Jonsson 
1351032fbfdSBengt Jonsson 	return 0;
1361032fbfdSBengt Jonsson }
1371032fbfdSBengt Jonsson 
1381032fbfdSBengt Jonsson /*
1391032fbfdSBengt Jonsson  * Regulator switch
1401032fbfdSBengt Jonsson  */
db8500_regulator_switch_enable(struct regulator_dev * rdev)1411032fbfdSBengt Jonsson static int db8500_regulator_switch_enable(struct regulator_dev *rdev)
1421032fbfdSBengt Jonsson {
14338e96838SBengt Jonsson 	struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
1441032fbfdSBengt Jonsson 	int ret;
1451032fbfdSBengt Jonsson 
1461032fbfdSBengt Jonsson 	if (info == NULL)
1471032fbfdSBengt Jonsson 		return -EINVAL;
1481032fbfdSBengt Jonsson 
1491032fbfdSBengt Jonsson 	dev_vdbg(rdev_get_dev(rdev), "regulator-switch-%s-enable\n",
1501032fbfdSBengt Jonsson 		info->desc.name);
1511032fbfdSBengt Jonsson 
1521032fbfdSBengt Jonsson 	ret = enable_epod(info->epod_id, info->is_ramret);
1531032fbfdSBengt Jonsson 	if (ret < 0) {
1541032fbfdSBengt Jonsson 		dev_err(rdev_get_dev(rdev),
1551032fbfdSBengt Jonsson 			"regulator-switch-%s-enable: prcmu call failed\n",
1561032fbfdSBengt Jonsson 			info->desc.name);
1571032fbfdSBengt Jonsson 		goto out;
1581032fbfdSBengt Jonsson 	}
1591032fbfdSBengt Jonsson 
1601032fbfdSBengt Jonsson 	info->is_enabled = true;
1611032fbfdSBengt Jonsson out:
1621032fbfdSBengt Jonsson 	return ret;
1631032fbfdSBengt Jonsson }
1641032fbfdSBengt Jonsson 
db8500_regulator_switch_disable(struct regulator_dev * rdev)1651032fbfdSBengt Jonsson static int db8500_regulator_switch_disable(struct regulator_dev *rdev)
1661032fbfdSBengt Jonsson {
16738e96838SBengt Jonsson 	struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
1681032fbfdSBengt Jonsson 	int ret;
1691032fbfdSBengt Jonsson 
1701032fbfdSBengt Jonsson 	if (info == NULL)
1711032fbfdSBengt Jonsson 		return -EINVAL;
1721032fbfdSBengt Jonsson 
1731032fbfdSBengt Jonsson 	dev_vdbg(rdev_get_dev(rdev), "regulator-switch-%s-disable\n",
1741032fbfdSBengt Jonsson 		info->desc.name);
1751032fbfdSBengt Jonsson 
1761032fbfdSBengt Jonsson 	ret = disable_epod(info->epod_id, info->is_ramret);
1771032fbfdSBengt Jonsson 	if (ret < 0) {
1781032fbfdSBengt Jonsson 		dev_err(rdev_get_dev(rdev),
1791032fbfdSBengt Jonsson 			"regulator_switch-%s-disable: prcmu call failed\n",
1801032fbfdSBengt Jonsson 			info->desc.name);
1811032fbfdSBengt Jonsson 		goto out;
1821032fbfdSBengt Jonsson 	}
1831032fbfdSBengt Jonsson 
184aab5fd7aSJason Yan 	info->is_enabled = false;
1851032fbfdSBengt Jonsson out:
1861032fbfdSBengt Jonsson 	return ret;
1871032fbfdSBengt Jonsson }
1881032fbfdSBengt Jonsson 
db8500_regulator_switch_is_enabled(struct regulator_dev * rdev)1891032fbfdSBengt Jonsson static int db8500_regulator_switch_is_enabled(struct regulator_dev *rdev)
1901032fbfdSBengt Jonsson {
19138e96838SBengt Jonsson 	struct dbx500_regulator_info *info = rdev_get_drvdata(rdev);
1921032fbfdSBengt Jonsson 
1931032fbfdSBengt Jonsson 	if (info == NULL)
1941032fbfdSBengt Jonsson 		return -EINVAL;
1951032fbfdSBengt Jonsson 
1961032fbfdSBengt Jonsson 	dev_vdbg(rdev_get_dev(rdev),
1971032fbfdSBengt Jonsson 		"regulator-switch-%s-is_enabled (is_enabled): %i\n",
1981032fbfdSBengt Jonsson 		info->desc.name, info->is_enabled);
1991032fbfdSBengt Jonsson 
2001032fbfdSBengt Jonsson 	return info->is_enabled;
2011032fbfdSBengt Jonsson }
2021032fbfdSBengt Jonsson 
2031a18195aSAxel Lin static const struct regulator_ops db8500_regulator_switch_ops = {
2041032fbfdSBengt Jonsson 	.enable			= db8500_regulator_switch_enable,
2051032fbfdSBengt Jonsson 	.disable		= db8500_regulator_switch_disable,
2061032fbfdSBengt Jonsson 	.is_enabled		= db8500_regulator_switch_is_enabled,
2071032fbfdSBengt Jonsson };
2081032fbfdSBengt Jonsson 
2091032fbfdSBengt Jonsson /*
2101032fbfdSBengt Jonsson  * Regulator information
2111032fbfdSBengt Jonsson  */
21238e96838SBengt Jonsson static struct dbx500_regulator_info
21338e96838SBengt Jonsson dbx500_regulator_info[DB8500_NUM_REGULATORS] = {
2141032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VAPE] = {
2151032fbfdSBengt Jonsson 		.desc = {
2161032fbfdSBengt Jonsson 			.name	= "db8500-vape",
21792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vape"),
2181032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VAPE,
2191032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2201032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2211032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2221032fbfdSBengt Jonsson 		},
2231032fbfdSBengt Jonsson 	},
2241032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VARM] = {
2251032fbfdSBengt Jonsson 		.desc = {
2261032fbfdSBengt Jonsson 			.name	= "db8500-varm",
22792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_varm"),
2281032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VARM,
2291032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2301032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2311032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2321032fbfdSBengt Jonsson 		},
2331032fbfdSBengt Jonsson 	},
2341032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VMODEM] = {
2351032fbfdSBengt Jonsson 		.desc = {
2361032fbfdSBengt Jonsson 			.name	= "db8500-vmodem",
23792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vmodem"),
2381032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VMODEM,
2391032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2401032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2411032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2421032fbfdSBengt Jonsson 		},
2431032fbfdSBengt Jonsson 	},
2441032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VPLL] = {
2451032fbfdSBengt Jonsson 		.desc = {
2461032fbfdSBengt Jonsson 			.name	= "db8500-vpll",
24792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vpll"),
2481032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VPLL,
2491032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2501032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2511032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2521032fbfdSBengt Jonsson 		},
2531032fbfdSBengt Jonsson 	},
2541032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VSMPS1] = {
2551032fbfdSBengt Jonsson 		.desc = {
2561032fbfdSBengt Jonsson 			.name	= "db8500-vsmps1",
25792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vsmps1"),
2581032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VSMPS1,
2591032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2601032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2611032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2621032fbfdSBengt Jonsson 		},
2631032fbfdSBengt Jonsson 	},
2641032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VSMPS2] = {
2651032fbfdSBengt Jonsson 		.desc = {
2661032fbfdSBengt Jonsson 			.name	= "db8500-vsmps2",
26792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vsmps2"),
2681032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VSMPS2,
2691032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2701032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2711032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
272eced9d5eSUlf Hansson 			.fixed_uV = 1800000,
273eced9d5eSUlf Hansson 			.n_voltages = 1,
2741032fbfdSBengt Jonsson 		},
2751032fbfdSBengt Jonsson 		.exclude_from_power_state = true,
2761032fbfdSBengt Jonsson 	},
2771032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VSMPS3] = {
2781032fbfdSBengt Jonsson 		.desc = {
2791032fbfdSBengt Jonsson 			.name	= "db8500-vsmps3",
28092722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vsmps3"),
2811032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VSMPS3,
2821032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2831032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2841032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2851032fbfdSBengt Jonsson 		},
2861032fbfdSBengt Jonsson 	},
2871032fbfdSBengt Jonsson 	[DB8500_REGULATOR_VRF1] = {
2881032fbfdSBengt Jonsson 		.desc = {
2891032fbfdSBengt Jonsson 			.name	= "db8500-vrf1",
29092722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_vrf1"),
2911032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_VRF1,
2921032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_ops,
2931032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
2941032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
2951032fbfdSBengt Jonsson 		},
2961032fbfdSBengt Jonsson 	},
2971032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SVAMMDSP] = {
2981032fbfdSBengt Jonsson 		.desc = {
2991032fbfdSBengt Jonsson 			.name	= "db8500-sva-mmdsp",
30092722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sva_mmdsp"),
3011032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SVAMMDSP,
3021032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3031032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3041032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3051032fbfdSBengt Jonsson 		},
3061032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SVAMMDSP,
3071032fbfdSBengt Jonsson 	},
3081032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SVAMMDSPRET] = {
3091032fbfdSBengt Jonsson 		.desc = {
3101032fbfdSBengt Jonsson 			.name	= "db8500-sva-mmdsp-ret",
31192722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sva_mmdsp_ret"),
3121032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SVAMMDSPRET,
3131032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3141032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3151032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3161032fbfdSBengt Jonsson 		},
3171032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SVAMMDSP,
3181032fbfdSBengt Jonsson 		.is_ramret = true,
3191032fbfdSBengt Jonsson 	},
3201032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SVAPIPE] = {
3211032fbfdSBengt Jonsson 		.desc = {
3221032fbfdSBengt Jonsson 			.name	= "db8500-sva-pipe",
32392722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sva_pipe"),
3241032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SVAPIPE,
3251032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3261032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3271032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3281032fbfdSBengt Jonsson 		},
3291032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SVAPIPE,
3301032fbfdSBengt Jonsson 	},
3311032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SIAMMDSP] = {
3321032fbfdSBengt Jonsson 		.desc = {
3331032fbfdSBengt Jonsson 			.name	= "db8500-sia-mmdsp",
33492722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sia_mmdsp"),
3351032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SIAMMDSP,
3361032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3371032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3381032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3391032fbfdSBengt Jonsson 		},
3401032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SIAMMDSP,
3411032fbfdSBengt Jonsson 	},
3421032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SIAMMDSPRET] = {
3431032fbfdSBengt Jonsson 		.desc = {
3441032fbfdSBengt Jonsson 			.name	= "db8500-sia-mmdsp-ret",
34592722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sia_mmdsp_ret"),
3461032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SIAMMDSPRET,
3471032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3481032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3491032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3501032fbfdSBengt Jonsson 		},
3511032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SIAMMDSP,
3521032fbfdSBengt Jonsson 		.is_ramret = true,
3531032fbfdSBengt Jonsson 	},
3541032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SIAPIPE] = {
3551032fbfdSBengt Jonsson 		.desc = {
3561032fbfdSBengt Jonsson 			.name	= "db8500-sia-pipe",
35792722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sia_pipe"),
3581032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SIAPIPE,
3591032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3601032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3611032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3621032fbfdSBengt Jonsson 		},
3631032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SIAPIPE,
3641032fbfdSBengt Jonsson 	},
3651032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_SGA] = {
3661032fbfdSBengt Jonsson 		.desc = {
3671032fbfdSBengt Jonsson 			.name	= "db8500-sga",
36892722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_sga"),
3691032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_SGA,
3701032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3711032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3721032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3731032fbfdSBengt Jonsson 		},
3741032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_SGA,
3751032fbfdSBengt Jonsson 	},
3761032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_B2R2_MCDE] = {
3771032fbfdSBengt Jonsson 		.desc = {
3781032fbfdSBengt Jonsson 			.name	= "db8500-b2r2-mcde",
37992722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_b2r2_mcde"),
3801032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_B2R2_MCDE,
3811032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3821032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3831032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3841032fbfdSBengt Jonsson 		},
3851032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_B2R2_MCDE,
3861032fbfdSBengt Jonsson 	},
3871032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_ESRAM12] = {
3881032fbfdSBengt Jonsson 		.desc = {
3891032fbfdSBengt Jonsson 			.name	= "db8500-esram12",
39092722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_esram12"),
3911032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_ESRAM12,
3921032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
3931032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
3941032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
3951032fbfdSBengt Jonsson 		},
3961032fbfdSBengt Jonsson 		.epod_id	= EPOD_ID_ESRAM12,
3971032fbfdSBengt Jonsson 		.is_enabled	= true,
3981032fbfdSBengt Jonsson 	},
3991032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_ESRAM12RET] = {
4001032fbfdSBengt Jonsson 		.desc = {
4011032fbfdSBengt Jonsson 			.name	= "db8500-esram12-ret",
40292722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_esram12_ret"),
4031032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_ESRAM12RET,
4041032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
4051032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
4061032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
4071032fbfdSBengt Jonsson 		},
4081032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_ESRAM12,
4091032fbfdSBengt Jonsson 		.is_ramret = true,
4101032fbfdSBengt Jonsson 	},
4111032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_ESRAM34] = {
4121032fbfdSBengt Jonsson 		.desc = {
4131032fbfdSBengt Jonsson 			.name	= "db8500-esram34",
41492722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_esram34"),
4151032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_ESRAM34,
4161032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
4171032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
4181032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
4191032fbfdSBengt Jonsson 		},
4201032fbfdSBengt Jonsson 		.epod_id	= EPOD_ID_ESRAM34,
4211032fbfdSBengt Jonsson 		.is_enabled	= true,
4221032fbfdSBengt Jonsson 	},
4231032fbfdSBengt Jonsson 	[DB8500_REGULATOR_SWITCH_ESRAM34RET] = {
4241032fbfdSBengt Jonsson 		.desc = {
4251032fbfdSBengt Jonsson 			.name	= "db8500-esram34-ret",
42692722a8fSAxel Lin 			.of_match = of_match_ptr("db8500_esram34_ret"),
4271032fbfdSBengt Jonsson 			.id	= DB8500_REGULATOR_SWITCH_ESRAM34RET,
4281032fbfdSBengt Jonsson 			.ops	= &db8500_regulator_switch_ops,
4291032fbfdSBengt Jonsson 			.type	= REGULATOR_VOLTAGE,
4301032fbfdSBengt Jonsson 			.owner	= THIS_MODULE,
4311032fbfdSBengt Jonsson 		},
4321032fbfdSBengt Jonsson 		.epod_id = EPOD_ID_ESRAM34,
4331032fbfdSBengt Jonsson 		.is_ramret = true,
4341032fbfdSBengt Jonsson 	},
4351032fbfdSBengt Jonsson };
4361032fbfdSBengt Jonsson 
db8500_regulator_probe(struct platform_device * pdev)43792722a8fSAxel Lin static int db8500_regulator_probe(struct platform_device *pdev)
4381032fbfdSBengt Jonsson {
43992722a8fSAxel Lin 	struct regulator_init_data *db8500_init_data;
44038e96838SBengt Jonsson 	struct dbx500_regulator_info *info;
4418986cf88SLee Jones 	struct regulator_config config = { };
4422564002aSAxel Lin 	struct regulator_dev *rdev;
44392722a8fSAxel Lin 	int err, i;
4441032fbfdSBengt Jonsson 
44592722a8fSAxel Lin 	db8500_init_data = dev_get_platdata(&pdev->dev);
44692722a8fSAxel Lin 
44792722a8fSAxel Lin 	for (i = 0; i < ARRAY_SIZE(dbx500_regulator_info); i++) {
4481032fbfdSBengt Jonsson 		/* assign per-regulator data */
44992722a8fSAxel Lin 		info = &dbx500_regulator_info[i];
4501032fbfdSBengt Jonsson 
451c172708dSMark Brown 		config.driver_data = info;
45292722a8fSAxel Lin 		config.dev = &pdev->dev;
45392722a8fSAxel Lin 		if (db8500_init_data)
45492722a8fSAxel Lin 			config.init_data = &db8500_init_data[i];
455c172708dSMark Brown 
4562564002aSAxel Lin 		rdev = devm_regulator_register(&pdev->dev, &info->desc,
45792722a8fSAxel Lin 					       &config);
4582564002aSAxel Lin 		if (IS_ERR(rdev)) {
4592564002aSAxel Lin 			err = PTR_ERR(rdev);
4601032fbfdSBengt Jonsson 			dev_err(&pdev->dev, "failed to register %s: err %i\n",
4611032fbfdSBengt Jonsson 				info->desc.name, err);
4621032fbfdSBengt Jonsson 			return err;
4631032fbfdSBengt Jonsson 		}
46492722a8fSAxel Lin 		dev_dbg(&pdev->dev, "regulator-%s-probed\n", info->desc.name);
4658986cf88SLee Jones 	}
4668986cf88SLee Jones 
46792722a8fSAxel Lin 	ux500_regulator_debug_init(pdev, dbx500_regulator_info,
46838e96838SBengt Jonsson 				   ARRAY_SIZE(dbx500_regulator_info));
4698986cf88SLee Jones 	return 0;
4701032fbfdSBengt Jonsson }
4711032fbfdSBengt Jonsson 
db8500_regulator_remove(struct platform_device * pdev)4724ceb73aeSDmitry Torokhov static int db8500_regulator_remove(struct platform_device *pdev)
4731032fbfdSBengt Jonsson {
47438e96838SBengt Jonsson 	ux500_regulator_debug_exit();
47538e96838SBengt Jonsson 
4761032fbfdSBengt Jonsson 	return 0;
4771032fbfdSBengt Jonsson }
4781032fbfdSBengt Jonsson 
4791032fbfdSBengt Jonsson static struct platform_driver db8500_regulator_driver = {
4801032fbfdSBengt Jonsson 	.driver = {
4811032fbfdSBengt Jonsson 		.name = "db8500-prcmu-regulators",
482*259b93b2SDouglas Anderson 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
4831032fbfdSBengt Jonsson 	},
4841032fbfdSBengt Jonsson 	.probe = db8500_regulator_probe,
4854ceb73aeSDmitry Torokhov 	.remove = db8500_regulator_remove,
4861032fbfdSBengt Jonsson };
4871032fbfdSBengt Jonsson 
db8500_regulator_init(void)4881032fbfdSBengt Jonsson static int __init db8500_regulator_init(void)
4891032fbfdSBengt Jonsson {
49090609503SAxel Lin 	return platform_driver_register(&db8500_regulator_driver);
4911032fbfdSBengt Jonsson }
4921032fbfdSBengt Jonsson 
db8500_regulator_exit(void)4931032fbfdSBengt Jonsson static void __exit db8500_regulator_exit(void)
4941032fbfdSBengt Jonsson {
4951032fbfdSBengt Jonsson 	platform_driver_unregister(&db8500_regulator_driver);
4961032fbfdSBengt Jonsson }
4971032fbfdSBengt Jonsson 
4981032fbfdSBengt Jonsson arch_initcall(db8500_regulator_init);
4991032fbfdSBengt Jonsson module_exit(db8500_regulator_exit);
5001032fbfdSBengt Jonsson 
5011032fbfdSBengt Jonsson MODULE_AUTHOR("STMicroelectronics/ST-Ericsson");
5021032fbfdSBengt Jonsson MODULE_DESCRIPTION("DB8500 regulator driver");
5031032fbfdSBengt Jonsson MODULE_LICENSE("GPL v2");
504