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, ®val); 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, ®val); 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