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