162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Voltage regulation driver for active-semi ACT8945A PMIC 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015 Atmel Corporation 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Wenyou Yang <wenyou.yang@atmel.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/module.h> 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include <linux/platform_device.h> 1362306a36Sopenharmony_ci#include <linux/regmap.h> 1462306a36Sopenharmony_ci#include <linux/regulator/driver.h> 1562306a36Sopenharmony_ci#include <linux/regulator/machine.h> 1662306a36Sopenharmony_ci#include <dt-bindings/regulator/active-semi,8945a-regulator.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* 1962306a36Sopenharmony_ci * ACT8945A Global Register Map. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci#define ACT8945A_SYS_MODE 0x00 2262306a36Sopenharmony_ci#define ACT8945A_SYS_CTRL 0x01 2362306a36Sopenharmony_ci#define ACT8945A_SYS_UNLK_REGS 0x0b 2462306a36Sopenharmony_ci#define ACT8945A_DCDC1_VSET1 0x20 2562306a36Sopenharmony_ci#define ACT8945A_DCDC1_VSET2 0x21 2662306a36Sopenharmony_ci#define ACT8945A_DCDC1_CTRL 0x22 2762306a36Sopenharmony_ci#define ACT8945A_DCDC1_SUS 0x24 2862306a36Sopenharmony_ci#define ACT8945A_DCDC2_VSET1 0x30 2962306a36Sopenharmony_ci#define ACT8945A_DCDC2_VSET2 0x31 3062306a36Sopenharmony_ci#define ACT8945A_DCDC2_CTRL 0x32 3162306a36Sopenharmony_ci#define ACT8945A_DCDC2_SUS 0x34 3262306a36Sopenharmony_ci#define ACT8945A_DCDC3_VSET1 0x40 3362306a36Sopenharmony_ci#define ACT8945A_DCDC3_VSET2 0x41 3462306a36Sopenharmony_ci#define ACT8945A_DCDC3_CTRL 0x42 3562306a36Sopenharmony_ci#define ACT8945A_DCDC3_SUS 0x44 3662306a36Sopenharmony_ci#define ACT8945A_LDO1_VSET 0x50 3762306a36Sopenharmony_ci#define ACT8945A_LDO1_CTRL 0x51 3862306a36Sopenharmony_ci#define ACT8945A_LDO1_SUS 0x52 3962306a36Sopenharmony_ci#define ACT8945A_LDO2_VSET 0x54 4062306a36Sopenharmony_ci#define ACT8945A_LDO2_CTRL 0x55 4162306a36Sopenharmony_ci#define ACT8945A_LDO2_SUS 0x56 4262306a36Sopenharmony_ci#define ACT8945A_LDO3_VSET 0x60 4362306a36Sopenharmony_ci#define ACT8945A_LDO3_CTRL 0x61 4462306a36Sopenharmony_ci#define ACT8945A_LDO3_SUS 0x62 4562306a36Sopenharmony_ci#define ACT8945A_LDO4_VSET 0x64 4662306a36Sopenharmony_ci#define ACT8945A_LDO4_CTRL 0x65 4762306a36Sopenharmony_ci#define ACT8945A_LDO4_SUS 0x66 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * Field Definitions. 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_ci#define ACT8945A_ENA 0x80 /* ON - [7] */ 5362306a36Sopenharmony_ci#define ACT8945A_VSEL_MASK 0x3F /* VSET - [5:0] */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* 5662306a36Sopenharmony_ci * ACT8945A Voltage Number 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_ci#define ACT8945A_VOLTAGE_NUM 64 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cienum { 6162306a36Sopenharmony_ci ACT8945A_ID_DCDC1, 6262306a36Sopenharmony_ci ACT8945A_ID_DCDC2, 6362306a36Sopenharmony_ci ACT8945A_ID_DCDC3, 6462306a36Sopenharmony_ci ACT8945A_ID_LDO1, 6562306a36Sopenharmony_ci ACT8945A_ID_LDO2, 6662306a36Sopenharmony_ci ACT8945A_ID_LDO3, 6762306a36Sopenharmony_ci ACT8945A_ID_LDO4, 6862306a36Sopenharmony_ci ACT8945A_ID_MAX, 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistruct act8945a_pmic { 7262306a36Sopenharmony_ci struct regmap *regmap; 7362306a36Sopenharmony_ci u32 op_mode[ACT8945A_ID_MAX]; 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic const struct linear_range act8945a_voltage_ranges[] = { 7762306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(600000, 0, 23, 25000), 7862306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(1200000, 24, 47, 50000), 7962306a36Sopenharmony_ci REGULATOR_LINEAR_RANGE(2400000, 48, 63, 100000), 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistatic int act8945a_set_suspend_state(struct regulator_dev *rdev, bool enable) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci struct regmap *regmap = rdev->regmap; 8562306a36Sopenharmony_ci int id = rdev_get_id(rdev); 8662306a36Sopenharmony_ci int reg, val; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci switch (id) { 8962306a36Sopenharmony_ci case ACT8945A_ID_DCDC1: 9062306a36Sopenharmony_ci reg = ACT8945A_DCDC1_SUS; 9162306a36Sopenharmony_ci val = 0xa8; 9262306a36Sopenharmony_ci break; 9362306a36Sopenharmony_ci case ACT8945A_ID_DCDC2: 9462306a36Sopenharmony_ci reg = ACT8945A_DCDC2_SUS; 9562306a36Sopenharmony_ci val = 0xa8; 9662306a36Sopenharmony_ci break; 9762306a36Sopenharmony_ci case ACT8945A_ID_DCDC3: 9862306a36Sopenharmony_ci reg = ACT8945A_DCDC3_SUS; 9962306a36Sopenharmony_ci val = 0xa8; 10062306a36Sopenharmony_ci break; 10162306a36Sopenharmony_ci case ACT8945A_ID_LDO1: 10262306a36Sopenharmony_ci reg = ACT8945A_LDO1_SUS; 10362306a36Sopenharmony_ci val = 0xe8; 10462306a36Sopenharmony_ci break; 10562306a36Sopenharmony_ci case ACT8945A_ID_LDO2: 10662306a36Sopenharmony_ci reg = ACT8945A_LDO2_SUS; 10762306a36Sopenharmony_ci val = 0xe8; 10862306a36Sopenharmony_ci break; 10962306a36Sopenharmony_ci case ACT8945A_ID_LDO3: 11062306a36Sopenharmony_ci reg = ACT8945A_LDO3_SUS; 11162306a36Sopenharmony_ci val = 0xe8; 11262306a36Sopenharmony_ci break; 11362306a36Sopenharmony_ci case ACT8945A_ID_LDO4: 11462306a36Sopenharmony_ci reg = ACT8945A_LDO4_SUS; 11562306a36Sopenharmony_ci val = 0xe8; 11662306a36Sopenharmony_ci break; 11762306a36Sopenharmony_ci default: 11862306a36Sopenharmony_ci return -EINVAL; 11962306a36Sopenharmony_ci } 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci if (enable) 12262306a36Sopenharmony_ci val |= BIT(4); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci /* 12562306a36Sopenharmony_ci * Ask the PMIC to enable/disable this output when entering hibernate 12662306a36Sopenharmony_ci * mode. 12762306a36Sopenharmony_ci */ 12862306a36Sopenharmony_ci return regmap_write(regmap, reg, val); 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic int act8945a_set_suspend_enable(struct regulator_dev *rdev) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci return act8945a_set_suspend_state(rdev, true); 13462306a36Sopenharmony_ci} 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic int act8945a_set_suspend_disable(struct regulator_dev *rdev) 13762306a36Sopenharmony_ci{ 13862306a36Sopenharmony_ci return act8945a_set_suspend_state(rdev, false); 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistatic unsigned int act8945a_of_map_mode(unsigned int mode) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci switch (mode) { 14462306a36Sopenharmony_ci case ACT8945A_REGULATOR_MODE_FIXED: 14562306a36Sopenharmony_ci case ACT8945A_REGULATOR_MODE_NORMAL: 14662306a36Sopenharmony_ci return REGULATOR_MODE_NORMAL; 14762306a36Sopenharmony_ci case ACT8945A_REGULATOR_MODE_LOWPOWER: 14862306a36Sopenharmony_ci return REGULATOR_MODE_STANDBY; 14962306a36Sopenharmony_ci default: 15062306a36Sopenharmony_ci return REGULATOR_MODE_INVALID; 15162306a36Sopenharmony_ci } 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic int act8945a_set_mode(struct regulator_dev *rdev, unsigned int mode) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci struct act8945a_pmic *act8945a = rdev_get_drvdata(rdev); 15762306a36Sopenharmony_ci struct regmap *regmap = rdev->regmap; 15862306a36Sopenharmony_ci int id = rdev_get_id(rdev); 15962306a36Sopenharmony_ci int reg, ret, val = 0; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci switch (id) { 16262306a36Sopenharmony_ci case ACT8945A_ID_DCDC1: 16362306a36Sopenharmony_ci reg = ACT8945A_DCDC1_CTRL; 16462306a36Sopenharmony_ci break; 16562306a36Sopenharmony_ci case ACT8945A_ID_DCDC2: 16662306a36Sopenharmony_ci reg = ACT8945A_DCDC2_CTRL; 16762306a36Sopenharmony_ci break; 16862306a36Sopenharmony_ci case ACT8945A_ID_DCDC3: 16962306a36Sopenharmony_ci reg = ACT8945A_DCDC3_CTRL; 17062306a36Sopenharmony_ci break; 17162306a36Sopenharmony_ci case ACT8945A_ID_LDO1: 17262306a36Sopenharmony_ci reg = ACT8945A_LDO1_CTRL; 17362306a36Sopenharmony_ci break; 17462306a36Sopenharmony_ci case ACT8945A_ID_LDO2: 17562306a36Sopenharmony_ci reg = ACT8945A_LDO2_CTRL; 17662306a36Sopenharmony_ci break; 17762306a36Sopenharmony_ci case ACT8945A_ID_LDO3: 17862306a36Sopenharmony_ci reg = ACT8945A_LDO3_CTRL; 17962306a36Sopenharmony_ci break; 18062306a36Sopenharmony_ci case ACT8945A_ID_LDO4: 18162306a36Sopenharmony_ci reg = ACT8945A_LDO4_CTRL; 18262306a36Sopenharmony_ci break; 18362306a36Sopenharmony_ci default: 18462306a36Sopenharmony_ci return -EINVAL; 18562306a36Sopenharmony_ci } 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci switch (mode) { 18862306a36Sopenharmony_ci case REGULATOR_MODE_STANDBY: 18962306a36Sopenharmony_ci if (id > ACT8945A_ID_DCDC3) 19062306a36Sopenharmony_ci val = BIT(5); 19162306a36Sopenharmony_ci break; 19262306a36Sopenharmony_ci case REGULATOR_MODE_NORMAL: 19362306a36Sopenharmony_ci if (id <= ACT8945A_ID_DCDC3) 19462306a36Sopenharmony_ci val = BIT(5); 19562306a36Sopenharmony_ci break; 19662306a36Sopenharmony_ci default: 19762306a36Sopenharmony_ci return -EINVAL; 19862306a36Sopenharmony_ci } 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci ret = regmap_update_bits(regmap, reg, BIT(5), val); 20162306a36Sopenharmony_ci if (ret) 20262306a36Sopenharmony_ci return ret; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci act8945a->op_mode[id] = mode; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci return 0; 20762306a36Sopenharmony_ci} 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistatic unsigned int act8945a_get_mode(struct regulator_dev *rdev) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci struct act8945a_pmic *act8945a = rdev_get_drvdata(rdev); 21262306a36Sopenharmony_ci int id = rdev_get_id(rdev); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci if (id < ACT8945A_ID_DCDC1 || id >= ACT8945A_ID_MAX) 21562306a36Sopenharmony_ci return -EINVAL; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci return act8945a->op_mode[id]; 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic const struct regulator_ops act8945a_ops = { 22162306a36Sopenharmony_ci .list_voltage = regulator_list_voltage_linear_range, 22262306a36Sopenharmony_ci .map_voltage = regulator_map_voltage_linear_range, 22362306a36Sopenharmony_ci .get_voltage_sel = regulator_get_voltage_sel_regmap, 22462306a36Sopenharmony_ci .set_voltage_sel = regulator_set_voltage_sel_regmap, 22562306a36Sopenharmony_ci .enable = regulator_enable_regmap, 22662306a36Sopenharmony_ci .disable = regulator_disable_regmap, 22762306a36Sopenharmony_ci .set_mode = act8945a_set_mode, 22862306a36Sopenharmony_ci .get_mode = act8945a_get_mode, 22962306a36Sopenharmony_ci .is_enabled = regulator_is_enabled_regmap, 23062306a36Sopenharmony_ci .set_suspend_enable = act8945a_set_suspend_enable, 23162306a36Sopenharmony_ci .set_suspend_disable = act8945a_set_suspend_disable, 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci#define ACT89xx_REG(_name, _family, _id, _vsel_reg, _supply) \ 23562306a36Sopenharmony_ci [_family##_ID_##_id] = { \ 23662306a36Sopenharmony_ci .name = _name, \ 23762306a36Sopenharmony_ci .supply_name = _supply, \ 23862306a36Sopenharmony_ci .of_match = of_match_ptr("REG_"#_id), \ 23962306a36Sopenharmony_ci .of_map_mode = act8945a_of_map_mode, \ 24062306a36Sopenharmony_ci .regulators_node = of_match_ptr("regulators"), \ 24162306a36Sopenharmony_ci .id = _family##_ID_##_id, \ 24262306a36Sopenharmony_ci .type = REGULATOR_VOLTAGE, \ 24362306a36Sopenharmony_ci .ops = &act8945a_ops, \ 24462306a36Sopenharmony_ci .n_voltages = ACT8945A_VOLTAGE_NUM, \ 24562306a36Sopenharmony_ci .linear_ranges = act8945a_voltage_ranges, \ 24662306a36Sopenharmony_ci .n_linear_ranges = ARRAY_SIZE(act8945a_voltage_ranges), \ 24762306a36Sopenharmony_ci .vsel_reg = _family##_##_id##_##_vsel_reg, \ 24862306a36Sopenharmony_ci .vsel_mask = ACT8945A_VSEL_MASK, \ 24962306a36Sopenharmony_ci .enable_reg = _family##_##_id##_CTRL, \ 25062306a36Sopenharmony_ci .enable_mask = ACT8945A_ENA, \ 25162306a36Sopenharmony_ci .owner = THIS_MODULE, \ 25262306a36Sopenharmony_ci } 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cistatic const struct regulator_desc act8945a_regulators[] = { 25562306a36Sopenharmony_ci ACT89xx_REG("DCDC_REG1", ACT8945A, DCDC1, VSET1, "vp1"), 25662306a36Sopenharmony_ci ACT89xx_REG("DCDC_REG2", ACT8945A, DCDC2, VSET1, "vp2"), 25762306a36Sopenharmony_ci ACT89xx_REG("DCDC_REG3", ACT8945A, DCDC3, VSET1, "vp3"), 25862306a36Sopenharmony_ci ACT89xx_REG("LDO_REG1", ACT8945A, LDO1, VSET, "inl45"), 25962306a36Sopenharmony_ci ACT89xx_REG("LDO_REG2", ACT8945A, LDO2, VSET, "inl45"), 26062306a36Sopenharmony_ci ACT89xx_REG("LDO_REG3", ACT8945A, LDO3, VSET, "inl67"), 26162306a36Sopenharmony_ci ACT89xx_REG("LDO_REG4", ACT8945A, LDO4, VSET, "inl67"), 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cistatic const struct regulator_desc act8945a_alt_regulators[] = { 26562306a36Sopenharmony_ci ACT89xx_REG("DCDC_REG1", ACT8945A, DCDC1, VSET2, "vp1"), 26662306a36Sopenharmony_ci ACT89xx_REG("DCDC_REG2", ACT8945A, DCDC2, VSET2, "vp2"), 26762306a36Sopenharmony_ci ACT89xx_REG("DCDC_REG3", ACT8945A, DCDC3, VSET2, "vp3"), 26862306a36Sopenharmony_ci ACT89xx_REG("LDO_REG1", ACT8945A, LDO1, VSET, "inl45"), 26962306a36Sopenharmony_ci ACT89xx_REG("LDO_REG2", ACT8945A, LDO2, VSET, "inl45"), 27062306a36Sopenharmony_ci ACT89xx_REG("LDO_REG3", ACT8945A, LDO3, VSET, "inl67"), 27162306a36Sopenharmony_ci ACT89xx_REG("LDO_REG4", ACT8945A, LDO4, VSET, "inl67"), 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic int act8945a_pmic_probe(struct platform_device *pdev) 27562306a36Sopenharmony_ci{ 27662306a36Sopenharmony_ci struct regulator_config config = { }; 27762306a36Sopenharmony_ci const struct regulator_desc *regulators; 27862306a36Sopenharmony_ci struct act8945a_pmic *act8945a; 27962306a36Sopenharmony_ci struct regulator_dev *rdev; 28062306a36Sopenharmony_ci int i, num_regulators; 28162306a36Sopenharmony_ci bool voltage_select; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci act8945a = devm_kzalloc(&pdev->dev, sizeof(*act8945a), GFP_KERNEL); 28462306a36Sopenharmony_ci if (!act8945a) 28562306a36Sopenharmony_ci return -ENOMEM; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci act8945a->regmap = dev_get_regmap(pdev->dev.parent, NULL); 28862306a36Sopenharmony_ci if (!act8945a->regmap) { 28962306a36Sopenharmony_ci dev_err(&pdev->dev, 29062306a36Sopenharmony_ci "could not retrieve regmap from parent device\n"); 29162306a36Sopenharmony_ci return -EINVAL; 29262306a36Sopenharmony_ci } 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci voltage_select = of_property_read_bool(pdev->dev.parent->of_node, 29562306a36Sopenharmony_ci "active-semi,vsel-high"); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci if (voltage_select) { 29862306a36Sopenharmony_ci regulators = act8945a_alt_regulators; 29962306a36Sopenharmony_ci num_regulators = ARRAY_SIZE(act8945a_alt_regulators); 30062306a36Sopenharmony_ci } else { 30162306a36Sopenharmony_ci regulators = act8945a_regulators; 30262306a36Sopenharmony_ci num_regulators = ARRAY_SIZE(act8945a_regulators); 30362306a36Sopenharmony_ci } 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci config.dev = &pdev->dev; 30662306a36Sopenharmony_ci config.dev->of_node = pdev->dev.parent->of_node; 30762306a36Sopenharmony_ci config.driver_data = act8945a; 30862306a36Sopenharmony_ci for (i = 0; i < num_regulators; i++) { 30962306a36Sopenharmony_ci rdev = devm_regulator_register(&pdev->dev, ®ulators[i], 31062306a36Sopenharmony_ci &config); 31162306a36Sopenharmony_ci if (IS_ERR(rdev)) { 31262306a36Sopenharmony_ci dev_err(&pdev->dev, 31362306a36Sopenharmony_ci "failed to register %s regulator\n", 31462306a36Sopenharmony_ci regulators[i].name); 31562306a36Sopenharmony_ci return PTR_ERR(rdev); 31662306a36Sopenharmony_ci } 31762306a36Sopenharmony_ci } 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci platform_set_drvdata(pdev, act8945a); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci /* Unlock expert registers. */ 32262306a36Sopenharmony_ci return regmap_write(act8945a->regmap, ACT8945A_SYS_UNLK_REGS, 0xef); 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic int __maybe_unused act8945a_suspend(struct device *pdev) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci struct act8945a_pmic *act8945a = dev_get_drvdata(pdev); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci /* 33062306a36Sopenharmony_ci * Ask the PMIC to enter the suspend mode on the next PWRHLD 33162306a36Sopenharmony_ci * transition. 33262306a36Sopenharmony_ci */ 33362306a36Sopenharmony_ci return regmap_write(act8945a->regmap, ACT8945A_SYS_CTRL, 0x42); 33462306a36Sopenharmony_ci} 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistatic SIMPLE_DEV_PM_OPS(act8945a_pm, act8945a_suspend, NULL); 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic void act8945a_pmic_shutdown(struct platform_device *pdev) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci struct act8945a_pmic *act8945a = platform_get_drvdata(pdev); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci /* 34362306a36Sopenharmony_ci * Ask the PMIC to shutdown everything on the next PWRHLD transition. 34462306a36Sopenharmony_ci */ 34562306a36Sopenharmony_ci regmap_write(act8945a->regmap, ACT8945A_SYS_CTRL, 0x0); 34662306a36Sopenharmony_ci} 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistatic struct platform_driver act8945a_pmic_driver = { 34962306a36Sopenharmony_ci .driver = { 35062306a36Sopenharmony_ci .name = "act8945a-regulator", 35162306a36Sopenharmony_ci .probe_type = PROBE_PREFER_ASYNCHRONOUS, 35262306a36Sopenharmony_ci .pm = &act8945a_pm, 35362306a36Sopenharmony_ci }, 35462306a36Sopenharmony_ci .probe = act8945a_pmic_probe, 35562306a36Sopenharmony_ci .shutdown = act8945a_pmic_shutdown, 35662306a36Sopenharmony_ci}; 35762306a36Sopenharmony_cimodule_platform_driver(act8945a_pmic_driver); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ciMODULE_DESCRIPTION("Active-semi ACT8945A voltage regulator driver"); 36062306a36Sopenharmony_ciMODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>"); 36162306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 362