162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) ST-Ericsson SA 2010 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Authors: Sundar Iyer <sundar.iyer@stericsson.com> for ST-Ericsson 662306a36Sopenharmony_ci * Bengt Jonsson <bengt.g.jonsson@stericsson.com> for ST-Ericsson 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Power domain regulators on DB8500 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/init.h> 1362306a36Sopenharmony_ci#include <linux/err.h> 1462306a36Sopenharmony_ci#include <linux/spinlock.h> 1562306a36Sopenharmony_ci#include <linux/platform_device.h> 1662306a36Sopenharmony_ci#include <linux/mfd/dbx500-prcmu.h> 1762306a36Sopenharmony_ci#include <linux/regulator/driver.h> 1862306a36Sopenharmony_ci#include <linux/regulator/machine.h> 1962306a36Sopenharmony_ci#include <linux/regulator/db8500-prcmu.h> 2062306a36Sopenharmony_ci#include <linux/regulator/of_regulator.h> 2162306a36Sopenharmony_ci#include <linux/of.h> 2262306a36Sopenharmony_ci#include <linux/module.h> 2362306a36Sopenharmony_ci#include "dbx500-prcmu.h" 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistatic int db8500_regulator_enable(struct regulator_dev *rdev) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci struct dbx500_regulator_info *info = rdev_get_drvdata(rdev); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (info == NULL) 3062306a36Sopenharmony_ci return -EINVAL; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci dev_vdbg(rdev_get_dev(rdev), "regulator-%s-enable\n", 3362306a36Sopenharmony_ci info->desc.name); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (!info->is_enabled) { 3662306a36Sopenharmony_ci info->is_enabled = true; 3762306a36Sopenharmony_ci if (!info->exclude_from_power_state) 3862306a36Sopenharmony_ci power_state_active_enable(); 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci return 0; 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic int db8500_regulator_disable(struct regulator_dev *rdev) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci struct dbx500_regulator_info *info = rdev_get_drvdata(rdev); 4762306a36Sopenharmony_ci int ret = 0; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci if (info == NULL) 5062306a36Sopenharmony_ci return -EINVAL; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci dev_vdbg(rdev_get_dev(rdev), "regulator-%s-disable\n", 5362306a36Sopenharmony_ci info->desc.name); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci if (info->is_enabled) { 5662306a36Sopenharmony_ci info->is_enabled = false; 5762306a36Sopenharmony_ci if (!info->exclude_from_power_state) 5862306a36Sopenharmony_ci ret = power_state_active_disable(); 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci return ret; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic int db8500_regulator_is_enabled(struct regulator_dev *rdev) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci struct dbx500_regulator_info *info = rdev_get_drvdata(rdev); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (info == NULL) 6962306a36Sopenharmony_ci return -EINVAL; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci dev_vdbg(rdev_get_dev(rdev), "regulator-%s-is_enabled (is_enabled):" 7262306a36Sopenharmony_ci " %i\n", info->desc.name, info->is_enabled); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci return info->is_enabled; 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* db8500 regulator operations */ 7862306a36Sopenharmony_cistatic const struct regulator_ops db8500_regulator_ops = { 7962306a36Sopenharmony_ci .enable = db8500_regulator_enable, 8062306a36Sopenharmony_ci .disable = db8500_regulator_disable, 8162306a36Sopenharmony_ci .is_enabled = db8500_regulator_is_enabled, 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* 8562306a36Sopenharmony_ci * EPOD control 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_cistatic bool epod_on[NUM_EPOD_ID]; 8862306a36Sopenharmony_cistatic bool epod_ramret[NUM_EPOD_ID]; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic int enable_epod(u16 epod_id, bool ramret) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci int ret; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci if (ramret) { 9562306a36Sopenharmony_ci if (!epod_on[epod_id]) { 9662306a36Sopenharmony_ci ret = prcmu_set_epod(epod_id, EPOD_STATE_RAMRET); 9762306a36Sopenharmony_ci if (ret < 0) 9862306a36Sopenharmony_ci return ret; 9962306a36Sopenharmony_ci } 10062306a36Sopenharmony_ci epod_ramret[epod_id] = true; 10162306a36Sopenharmony_ci } else { 10262306a36Sopenharmony_ci ret = prcmu_set_epod(epod_id, EPOD_STATE_ON); 10362306a36Sopenharmony_ci if (ret < 0) 10462306a36Sopenharmony_ci return ret; 10562306a36Sopenharmony_ci epod_on[epod_id] = true; 10662306a36Sopenharmony_ci } 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci return 0; 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic int disable_epod(u16 epod_id, bool ramret) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci int ret; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci if (ramret) { 11662306a36Sopenharmony_ci if (!epod_on[epod_id]) { 11762306a36Sopenharmony_ci ret = prcmu_set_epod(epod_id, EPOD_STATE_OFF); 11862306a36Sopenharmony_ci if (ret < 0) 11962306a36Sopenharmony_ci return ret; 12062306a36Sopenharmony_ci } 12162306a36Sopenharmony_ci epod_ramret[epod_id] = false; 12262306a36Sopenharmony_ci } else { 12362306a36Sopenharmony_ci if (epod_ramret[epod_id]) { 12462306a36Sopenharmony_ci ret = prcmu_set_epod(epod_id, EPOD_STATE_RAMRET); 12562306a36Sopenharmony_ci if (ret < 0) 12662306a36Sopenharmony_ci return ret; 12762306a36Sopenharmony_ci } else { 12862306a36Sopenharmony_ci ret = prcmu_set_epod(epod_id, EPOD_STATE_OFF); 12962306a36Sopenharmony_ci if (ret < 0) 13062306a36Sopenharmony_ci return ret; 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci epod_on[epod_id] = false; 13362306a36Sopenharmony_ci } 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci return 0; 13662306a36Sopenharmony_ci} 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* 13962306a36Sopenharmony_ci * Regulator switch 14062306a36Sopenharmony_ci */ 14162306a36Sopenharmony_cistatic int db8500_regulator_switch_enable(struct regulator_dev *rdev) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci struct dbx500_regulator_info *info = rdev_get_drvdata(rdev); 14462306a36Sopenharmony_ci int ret; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci if (info == NULL) 14762306a36Sopenharmony_ci return -EINVAL; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci dev_vdbg(rdev_get_dev(rdev), "regulator-switch-%s-enable\n", 15062306a36Sopenharmony_ci info->desc.name); 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci ret = enable_epod(info->epod_id, info->is_ramret); 15362306a36Sopenharmony_ci if (ret < 0) { 15462306a36Sopenharmony_ci dev_err(rdev_get_dev(rdev), 15562306a36Sopenharmony_ci "regulator-switch-%s-enable: prcmu call failed\n", 15662306a36Sopenharmony_ci info->desc.name); 15762306a36Sopenharmony_ci goto out; 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci info->is_enabled = true; 16162306a36Sopenharmony_ciout: 16262306a36Sopenharmony_ci return ret; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic int db8500_regulator_switch_disable(struct regulator_dev *rdev) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci struct dbx500_regulator_info *info = rdev_get_drvdata(rdev); 16862306a36Sopenharmony_ci int ret; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci if (info == NULL) 17162306a36Sopenharmony_ci return -EINVAL; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci dev_vdbg(rdev_get_dev(rdev), "regulator-switch-%s-disable\n", 17462306a36Sopenharmony_ci info->desc.name); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci ret = disable_epod(info->epod_id, info->is_ramret); 17762306a36Sopenharmony_ci if (ret < 0) { 17862306a36Sopenharmony_ci dev_err(rdev_get_dev(rdev), 17962306a36Sopenharmony_ci "regulator_switch-%s-disable: prcmu call failed\n", 18062306a36Sopenharmony_ci info->desc.name); 18162306a36Sopenharmony_ci goto out; 18262306a36Sopenharmony_ci } 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci info->is_enabled = false; 18562306a36Sopenharmony_ciout: 18662306a36Sopenharmony_ci return ret; 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic int db8500_regulator_switch_is_enabled(struct regulator_dev *rdev) 19062306a36Sopenharmony_ci{ 19162306a36Sopenharmony_ci struct dbx500_regulator_info *info = rdev_get_drvdata(rdev); 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci if (info == NULL) 19462306a36Sopenharmony_ci return -EINVAL; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci dev_vdbg(rdev_get_dev(rdev), 19762306a36Sopenharmony_ci "regulator-switch-%s-is_enabled (is_enabled): %i\n", 19862306a36Sopenharmony_ci info->desc.name, info->is_enabled); 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci return info->is_enabled; 20162306a36Sopenharmony_ci} 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic const struct regulator_ops db8500_regulator_switch_ops = { 20462306a36Sopenharmony_ci .enable = db8500_regulator_switch_enable, 20562306a36Sopenharmony_ci .disable = db8500_regulator_switch_disable, 20662306a36Sopenharmony_ci .is_enabled = db8500_regulator_switch_is_enabled, 20762306a36Sopenharmony_ci}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci/* 21062306a36Sopenharmony_ci * Regulator information 21162306a36Sopenharmony_ci */ 21262306a36Sopenharmony_cistatic struct dbx500_regulator_info 21362306a36Sopenharmony_cidbx500_regulator_info[DB8500_NUM_REGULATORS] = { 21462306a36Sopenharmony_ci [DB8500_REGULATOR_VAPE] = { 21562306a36Sopenharmony_ci .desc = { 21662306a36Sopenharmony_ci .name = "db8500-vape", 21762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vape"), 21862306a36Sopenharmony_ci .id = DB8500_REGULATOR_VAPE, 21962306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 22062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 22162306a36Sopenharmony_ci .owner = THIS_MODULE, 22262306a36Sopenharmony_ci }, 22362306a36Sopenharmony_ci }, 22462306a36Sopenharmony_ci [DB8500_REGULATOR_VARM] = { 22562306a36Sopenharmony_ci .desc = { 22662306a36Sopenharmony_ci .name = "db8500-varm", 22762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_varm"), 22862306a36Sopenharmony_ci .id = DB8500_REGULATOR_VARM, 22962306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 23062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 23162306a36Sopenharmony_ci .owner = THIS_MODULE, 23262306a36Sopenharmony_ci }, 23362306a36Sopenharmony_ci }, 23462306a36Sopenharmony_ci [DB8500_REGULATOR_VMODEM] = { 23562306a36Sopenharmony_ci .desc = { 23662306a36Sopenharmony_ci .name = "db8500-vmodem", 23762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vmodem"), 23862306a36Sopenharmony_ci .id = DB8500_REGULATOR_VMODEM, 23962306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 24062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 24162306a36Sopenharmony_ci .owner = THIS_MODULE, 24262306a36Sopenharmony_ci }, 24362306a36Sopenharmony_ci }, 24462306a36Sopenharmony_ci [DB8500_REGULATOR_VPLL] = { 24562306a36Sopenharmony_ci .desc = { 24662306a36Sopenharmony_ci .name = "db8500-vpll", 24762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vpll"), 24862306a36Sopenharmony_ci .id = DB8500_REGULATOR_VPLL, 24962306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 25062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 25162306a36Sopenharmony_ci .owner = THIS_MODULE, 25262306a36Sopenharmony_ci }, 25362306a36Sopenharmony_ci }, 25462306a36Sopenharmony_ci [DB8500_REGULATOR_VSMPS1] = { 25562306a36Sopenharmony_ci .desc = { 25662306a36Sopenharmony_ci .name = "db8500-vsmps1", 25762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vsmps1"), 25862306a36Sopenharmony_ci .id = DB8500_REGULATOR_VSMPS1, 25962306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 26062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 26162306a36Sopenharmony_ci .owner = THIS_MODULE, 26262306a36Sopenharmony_ci }, 26362306a36Sopenharmony_ci }, 26462306a36Sopenharmony_ci [DB8500_REGULATOR_VSMPS2] = { 26562306a36Sopenharmony_ci .desc = { 26662306a36Sopenharmony_ci .name = "db8500-vsmps2", 26762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vsmps2"), 26862306a36Sopenharmony_ci .id = DB8500_REGULATOR_VSMPS2, 26962306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 27062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 27162306a36Sopenharmony_ci .owner = THIS_MODULE, 27262306a36Sopenharmony_ci .fixed_uV = 1800000, 27362306a36Sopenharmony_ci .n_voltages = 1, 27462306a36Sopenharmony_ci }, 27562306a36Sopenharmony_ci .exclude_from_power_state = true, 27662306a36Sopenharmony_ci }, 27762306a36Sopenharmony_ci [DB8500_REGULATOR_VSMPS3] = { 27862306a36Sopenharmony_ci .desc = { 27962306a36Sopenharmony_ci .name = "db8500-vsmps3", 28062306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vsmps3"), 28162306a36Sopenharmony_ci .id = DB8500_REGULATOR_VSMPS3, 28262306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 28362306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 28462306a36Sopenharmony_ci .owner = THIS_MODULE, 28562306a36Sopenharmony_ci }, 28662306a36Sopenharmony_ci }, 28762306a36Sopenharmony_ci [DB8500_REGULATOR_VRF1] = { 28862306a36Sopenharmony_ci .desc = { 28962306a36Sopenharmony_ci .name = "db8500-vrf1", 29062306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_vrf1"), 29162306a36Sopenharmony_ci .id = DB8500_REGULATOR_VRF1, 29262306a36Sopenharmony_ci .ops = &db8500_regulator_ops, 29362306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 29462306a36Sopenharmony_ci .owner = THIS_MODULE, 29562306a36Sopenharmony_ci }, 29662306a36Sopenharmony_ci }, 29762306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SVAMMDSP] = { 29862306a36Sopenharmony_ci .desc = { 29962306a36Sopenharmony_ci .name = "db8500-sva-mmdsp", 30062306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sva_mmdsp"), 30162306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SVAMMDSP, 30262306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 30362306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 30462306a36Sopenharmony_ci .owner = THIS_MODULE, 30562306a36Sopenharmony_ci }, 30662306a36Sopenharmony_ci .epod_id = EPOD_ID_SVAMMDSP, 30762306a36Sopenharmony_ci }, 30862306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SVAMMDSPRET] = { 30962306a36Sopenharmony_ci .desc = { 31062306a36Sopenharmony_ci .name = "db8500-sva-mmdsp-ret", 31162306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sva_mmdsp_ret"), 31262306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SVAMMDSPRET, 31362306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 31462306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 31562306a36Sopenharmony_ci .owner = THIS_MODULE, 31662306a36Sopenharmony_ci }, 31762306a36Sopenharmony_ci .epod_id = EPOD_ID_SVAMMDSP, 31862306a36Sopenharmony_ci .is_ramret = true, 31962306a36Sopenharmony_ci }, 32062306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SVAPIPE] = { 32162306a36Sopenharmony_ci .desc = { 32262306a36Sopenharmony_ci .name = "db8500-sva-pipe", 32362306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sva_pipe"), 32462306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SVAPIPE, 32562306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 32662306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 32762306a36Sopenharmony_ci .owner = THIS_MODULE, 32862306a36Sopenharmony_ci }, 32962306a36Sopenharmony_ci .epod_id = EPOD_ID_SVAPIPE, 33062306a36Sopenharmony_ci }, 33162306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SIAMMDSP] = { 33262306a36Sopenharmony_ci .desc = { 33362306a36Sopenharmony_ci .name = "db8500-sia-mmdsp", 33462306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sia_mmdsp"), 33562306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SIAMMDSP, 33662306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 33762306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 33862306a36Sopenharmony_ci .owner = THIS_MODULE, 33962306a36Sopenharmony_ci }, 34062306a36Sopenharmony_ci .epod_id = EPOD_ID_SIAMMDSP, 34162306a36Sopenharmony_ci }, 34262306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SIAMMDSPRET] = { 34362306a36Sopenharmony_ci .desc = { 34462306a36Sopenharmony_ci .name = "db8500-sia-mmdsp-ret", 34562306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sia_mmdsp_ret"), 34662306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SIAMMDSPRET, 34762306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 34862306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 34962306a36Sopenharmony_ci .owner = THIS_MODULE, 35062306a36Sopenharmony_ci }, 35162306a36Sopenharmony_ci .epod_id = EPOD_ID_SIAMMDSP, 35262306a36Sopenharmony_ci .is_ramret = true, 35362306a36Sopenharmony_ci }, 35462306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SIAPIPE] = { 35562306a36Sopenharmony_ci .desc = { 35662306a36Sopenharmony_ci .name = "db8500-sia-pipe", 35762306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sia_pipe"), 35862306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SIAPIPE, 35962306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 36062306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 36162306a36Sopenharmony_ci .owner = THIS_MODULE, 36262306a36Sopenharmony_ci }, 36362306a36Sopenharmony_ci .epod_id = EPOD_ID_SIAPIPE, 36462306a36Sopenharmony_ci }, 36562306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_SGA] = { 36662306a36Sopenharmony_ci .desc = { 36762306a36Sopenharmony_ci .name = "db8500-sga", 36862306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_sga"), 36962306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_SGA, 37062306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 37162306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 37262306a36Sopenharmony_ci .owner = THIS_MODULE, 37362306a36Sopenharmony_ci }, 37462306a36Sopenharmony_ci .epod_id = EPOD_ID_SGA, 37562306a36Sopenharmony_ci }, 37662306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_B2R2_MCDE] = { 37762306a36Sopenharmony_ci .desc = { 37862306a36Sopenharmony_ci .name = "db8500-b2r2-mcde", 37962306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_b2r2_mcde"), 38062306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_B2R2_MCDE, 38162306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 38262306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 38362306a36Sopenharmony_ci .owner = THIS_MODULE, 38462306a36Sopenharmony_ci }, 38562306a36Sopenharmony_ci .epod_id = EPOD_ID_B2R2_MCDE, 38662306a36Sopenharmony_ci }, 38762306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_ESRAM12] = { 38862306a36Sopenharmony_ci .desc = { 38962306a36Sopenharmony_ci .name = "db8500-esram12", 39062306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_esram12"), 39162306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_ESRAM12, 39262306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 39362306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 39462306a36Sopenharmony_ci .owner = THIS_MODULE, 39562306a36Sopenharmony_ci }, 39662306a36Sopenharmony_ci .epod_id = EPOD_ID_ESRAM12, 39762306a36Sopenharmony_ci .is_enabled = true, 39862306a36Sopenharmony_ci }, 39962306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_ESRAM12RET] = { 40062306a36Sopenharmony_ci .desc = { 40162306a36Sopenharmony_ci .name = "db8500-esram12-ret", 40262306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_esram12_ret"), 40362306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_ESRAM12RET, 40462306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 40562306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 40662306a36Sopenharmony_ci .owner = THIS_MODULE, 40762306a36Sopenharmony_ci }, 40862306a36Sopenharmony_ci .epod_id = EPOD_ID_ESRAM12, 40962306a36Sopenharmony_ci .is_ramret = true, 41062306a36Sopenharmony_ci }, 41162306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_ESRAM34] = { 41262306a36Sopenharmony_ci .desc = { 41362306a36Sopenharmony_ci .name = "db8500-esram34", 41462306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_esram34"), 41562306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_ESRAM34, 41662306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 41762306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 41862306a36Sopenharmony_ci .owner = THIS_MODULE, 41962306a36Sopenharmony_ci }, 42062306a36Sopenharmony_ci .epod_id = EPOD_ID_ESRAM34, 42162306a36Sopenharmony_ci .is_enabled = true, 42262306a36Sopenharmony_ci }, 42362306a36Sopenharmony_ci [DB8500_REGULATOR_SWITCH_ESRAM34RET] = { 42462306a36Sopenharmony_ci .desc = { 42562306a36Sopenharmony_ci .name = "db8500-esram34-ret", 42662306a36Sopenharmony_ci .of_match = of_match_ptr("db8500_esram34_ret"), 42762306a36Sopenharmony_ci .id = DB8500_REGULATOR_SWITCH_ESRAM34RET, 42862306a36Sopenharmony_ci .ops = &db8500_regulator_switch_ops, 42962306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, 43062306a36Sopenharmony_ci .owner = THIS_MODULE, 43162306a36Sopenharmony_ci }, 43262306a36Sopenharmony_ci .epod_id = EPOD_ID_ESRAM34, 43362306a36Sopenharmony_ci .is_ramret = true, 43462306a36Sopenharmony_ci }, 43562306a36Sopenharmony_ci}; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic int db8500_regulator_probe(struct platform_device *pdev) 43862306a36Sopenharmony_ci{ 43962306a36Sopenharmony_ci struct regulator_init_data *db8500_init_data; 44062306a36Sopenharmony_ci struct dbx500_regulator_info *info; 44162306a36Sopenharmony_ci struct regulator_config config = { }; 44262306a36Sopenharmony_ci struct regulator_dev *rdev; 44362306a36Sopenharmony_ci int err, i; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci db8500_init_data = dev_get_platdata(&pdev->dev); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(dbx500_regulator_info); i++) { 44862306a36Sopenharmony_ci /* assign per-regulator data */ 44962306a36Sopenharmony_ci info = &dbx500_regulator_info[i]; 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci config.driver_data = info; 45262306a36Sopenharmony_ci config.dev = &pdev->dev; 45362306a36Sopenharmony_ci if (db8500_init_data) 45462306a36Sopenharmony_ci config.init_data = &db8500_init_data[i]; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci rdev = devm_regulator_register(&pdev->dev, &info->desc, 45762306a36Sopenharmony_ci &config); 45862306a36Sopenharmony_ci if (IS_ERR(rdev)) { 45962306a36Sopenharmony_ci err = PTR_ERR(rdev); 46062306a36Sopenharmony_ci dev_err(&pdev->dev, "failed to register %s: err %i\n", 46162306a36Sopenharmony_ci info->desc.name, err); 46262306a36Sopenharmony_ci return err; 46362306a36Sopenharmony_ci } 46462306a36Sopenharmony_ci dev_dbg(&pdev->dev, "regulator-%s-probed\n", info->desc.name); 46562306a36Sopenharmony_ci } 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci ux500_regulator_debug_init(pdev, dbx500_regulator_info, 46862306a36Sopenharmony_ci ARRAY_SIZE(dbx500_regulator_info)); 46962306a36Sopenharmony_ci return 0; 47062306a36Sopenharmony_ci} 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_cistatic int db8500_regulator_remove(struct platform_device *pdev) 47362306a36Sopenharmony_ci{ 47462306a36Sopenharmony_ci ux500_regulator_debug_exit(); 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci return 0; 47762306a36Sopenharmony_ci} 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_cistatic struct platform_driver db8500_regulator_driver = { 48062306a36Sopenharmony_ci .driver = { 48162306a36Sopenharmony_ci .name = "db8500-prcmu-regulators", 48262306a36Sopenharmony_ci .probe_type = PROBE_PREFER_ASYNCHRONOUS, 48362306a36Sopenharmony_ci }, 48462306a36Sopenharmony_ci .probe = db8500_regulator_probe, 48562306a36Sopenharmony_ci .remove = db8500_regulator_remove, 48662306a36Sopenharmony_ci}; 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_cistatic int __init db8500_regulator_init(void) 48962306a36Sopenharmony_ci{ 49062306a36Sopenharmony_ci return platform_driver_register(&db8500_regulator_driver); 49162306a36Sopenharmony_ci} 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_cistatic void __exit db8500_regulator_exit(void) 49462306a36Sopenharmony_ci{ 49562306a36Sopenharmony_ci platform_driver_unregister(&db8500_regulator_driver); 49662306a36Sopenharmony_ci} 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ciarch_initcall(db8500_regulator_init); 49962306a36Sopenharmony_cimodule_exit(db8500_regulator_exit); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ciMODULE_AUTHOR("STMicroelectronics/ST-Ericsson"); 50262306a36Sopenharmony_ciMODULE_DESCRIPTION("DB8500 regulator driver"); 50362306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 504