138c09961SWenyou Yang /* 238c09961SWenyou Yang * Voltage regulation driver for active-semi ACT8945A PMIC 338c09961SWenyou Yang * 438c09961SWenyou Yang * Copyright (C) 2015 Atmel Corporation 538c09961SWenyou Yang * 638c09961SWenyou Yang * Author: Wenyou Yang <wenyou.yang@atmel.com> 738c09961SWenyou Yang * 838c09961SWenyou Yang * This program is free software; you can redistribute it and/or 938c09961SWenyou Yang * modify it under the terms of the GNU General Public License as 1038c09961SWenyou Yang * published by the Free Software Foundation; either version 2 of the 1138c09961SWenyou Yang * License, or (at your option) any later version. 1238c09961SWenyou Yang * 1338c09961SWenyou Yang */ 1438c09961SWenyou Yang 1538c09961SWenyou Yang #include <linux/module.h> 1638c09961SWenyou Yang #include <linux/of_device.h> 1738c09961SWenyou Yang #include <linux/platform_device.h> 1890bc8ac2SClaudiu Beznea #include <linux/regmap.h> 1938c09961SWenyou Yang #include <linux/regulator/driver.h> 2038c09961SWenyou Yang #include <linux/regulator/machine.h> 217482d6ecSBoris Brezillon #include <dt-bindings/regulator/active-semi,8945a-regulator.h> 2238c09961SWenyou Yang 2338c09961SWenyou Yang /** 2438c09961SWenyou Yang * ACT8945A Global Register Map. 2538c09961SWenyou Yang */ 2638c09961SWenyou Yang #define ACT8945A_SYS_MODE 0x00 2738c09961SWenyou Yang #define ACT8945A_SYS_CTRL 0x01 2890bc8ac2SClaudiu Beznea #define ACT8945A_SYS_UNLK_REGS 0x0b 2938c09961SWenyou Yang #define ACT8945A_DCDC1_VSET1 0x20 3038c09961SWenyou Yang #define ACT8945A_DCDC1_VSET2 0x21 3138c09961SWenyou Yang #define ACT8945A_DCDC1_CTRL 0x22 327482d6ecSBoris Brezillon #define ACT8945A_DCDC1_SUS 0x24 3338c09961SWenyou Yang #define ACT8945A_DCDC2_VSET1 0x30 3438c09961SWenyou Yang #define ACT8945A_DCDC2_VSET2 0x31 3538c09961SWenyou Yang #define ACT8945A_DCDC2_CTRL 0x32 367482d6ecSBoris Brezillon #define ACT8945A_DCDC2_SUS 0x34 3738c09961SWenyou Yang #define ACT8945A_DCDC3_VSET1 0x40 3838c09961SWenyou Yang #define ACT8945A_DCDC3_VSET2 0x41 3938c09961SWenyou Yang #define ACT8945A_DCDC3_CTRL 0x42 407482d6ecSBoris Brezillon #define ACT8945A_DCDC3_SUS 0x44 4138c09961SWenyou Yang #define ACT8945A_LDO1_VSET 0x50 4238c09961SWenyou Yang #define ACT8945A_LDO1_CTRL 0x51 437482d6ecSBoris Brezillon #define ACT8945A_LDO1_SUS 0x52 4438c09961SWenyou Yang #define ACT8945A_LDO2_VSET 0x54 4538c09961SWenyou Yang #define ACT8945A_LDO2_CTRL 0x55 467482d6ecSBoris Brezillon #define ACT8945A_LDO2_SUS 0x56 4738c09961SWenyou Yang #define ACT8945A_LDO3_VSET 0x60 4838c09961SWenyou Yang #define ACT8945A_LDO3_CTRL 0x61 497482d6ecSBoris Brezillon #define ACT8945A_LDO3_SUS 0x62 5038c09961SWenyou Yang #define ACT8945A_LDO4_VSET 0x64 5138c09961SWenyou Yang #define ACT8945A_LDO4_CTRL 0x65 527482d6ecSBoris Brezillon #define ACT8945A_LDO4_SUS 0x66 5338c09961SWenyou Yang 5438c09961SWenyou Yang /** 5538c09961SWenyou Yang * Field Definitions. 5638c09961SWenyou Yang */ 5738c09961SWenyou Yang #define ACT8945A_ENA 0x80 /* ON - [7] */ 5838c09961SWenyou Yang #define ACT8945A_VSEL_MASK 0x3F /* VSET - [5:0] */ 5938c09961SWenyou Yang 6038c09961SWenyou Yang /** 6138c09961SWenyou Yang * ACT8945A Voltage Number 6238c09961SWenyou Yang */ 6338c09961SWenyou Yang #define ACT8945A_VOLTAGE_NUM 64 6438c09961SWenyou Yang 6538c09961SWenyou Yang enum { 6638c09961SWenyou Yang ACT8945A_ID_DCDC1, 6738c09961SWenyou Yang ACT8945A_ID_DCDC2, 6838c09961SWenyou Yang ACT8945A_ID_DCDC3, 6938c09961SWenyou Yang ACT8945A_ID_LDO1, 7038c09961SWenyou Yang ACT8945A_ID_LDO2, 7138c09961SWenyou Yang ACT8945A_ID_LDO3, 7238c09961SWenyou Yang ACT8945A_ID_LDO4, 737482d6ecSBoris Brezillon ACT8945A_ID_MAX, 747482d6ecSBoris Brezillon }; 757482d6ecSBoris Brezillon 767482d6ecSBoris Brezillon struct act8945a_pmic { 777482d6ecSBoris Brezillon struct regmap *regmap; 787482d6ecSBoris Brezillon u32 op_mode[ACT8945A_ID_MAX]; 7938c09961SWenyou Yang }; 8038c09961SWenyou Yang 8138c09961SWenyou Yang static const struct regulator_linear_range act8945a_voltage_ranges[] = { 8238c09961SWenyou Yang REGULATOR_LINEAR_RANGE(600000, 0, 23, 25000), 8338c09961SWenyou Yang REGULATOR_LINEAR_RANGE(1200000, 24, 47, 50000), 8438c09961SWenyou Yang REGULATOR_LINEAR_RANGE(2400000, 48, 63, 100000), 8538c09961SWenyou Yang }; 8638c09961SWenyou Yang 877482d6ecSBoris Brezillon static int act8945a_set_suspend_state(struct regulator_dev *rdev, bool enable) 887482d6ecSBoris Brezillon { 897482d6ecSBoris Brezillon struct regmap *regmap = rdev->regmap; 907482d6ecSBoris Brezillon int id = rdev->desc->id, reg, val; 917482d6ecSBoris Brezillon 927482d6ecSBoris Brezillon switch (id) { 937482d6ecSBoris Brezillon case ACT8945A_ID_DCDC1: 947482d6ecSBoris Brezillon reg = ACT8945A_DCDC1_SUS; 957482d6ecSBoris Brezillon val = 0xa8; 967482d6ecSBoris Brezillon break; 977482d6ecSBoris Brezillon case ACT8945A_ID_DCDC2: 987482d6ecSBoris Brezillon reg = ACT8945A_DCDC2_SUS; 997482d6ecSBoris Brezillon val = 0xa8; 1007482d6ecSBoris Brezillon break; 1017482d6ecSBoris Brezillon case ACT8945A_ID_DCDC3: 1027482d6ecSBoris Brezillon reg = ACT8945A_DCDC3_SUS; 1037482d6ecSBoris Brezillon val = 0xa8; 1047482d6ecSBoris Brezillon break; 1057482d6ecSBoris Brezillon case ACT8945A_ID_LDO1: 1067482d6ecSBoris Brezillon reg = ACT8945A_LDO1_SUS; 1077482d6ecSBoris Brezillon val = 0xe8; 1087482d6ecSBoris Brezillon break; 1097482d6ecSBoris Brezillon case ACT8945A_ID_LDO2: 1107482d6ecSBoris Brezillon reg = ACT8945A_LDO2_SUS; 1117482d6ecSBoris Brezillon val = 0xe8; 1127482d6ecSBoris Brezillon break; 1137482d6ecSBoris Brezillon case ACT8945A_ID_LDO3: 1147482d6ecSBoris Brezillon reg = ACT8945A_LDO3_SUS; 1157482d6ecSBoris Brezillon val = 0xe8; 1167482d6ecSBoris Brezillon break; 1177482d6ecSBoris Brezillon case ACT8945A_ID_LDO4: 1187482d6ecSBoris Brezillon reg = ACT8945A_LDO4_SUS; 1197482d6ecSBoris Brezillon val = 0xe8; 1207482d6ecSBoris Brezillon break; 1217482d6ecSBoris Brezillon default: 1227482d6ecSBoris Brezillon return -EINVAL; 1237482d6ecSBoris Brezillon } 1247482d6ecSBoris Brezillon 1257482d6ecSBoris Brezillon if (enable) 1267482d6ecSBoris Brezillon val |= BIT(4); 1277482d6ecSBoris Brezillon 1287482d6ecSBoris Brezillon /* 1297482d6ecSBoris Brezillon * Ask the PMIC to enable/disable this output when entering hibernate 1307482d6ecSBoris Brezillon * mode. 1317482d6ecSBoris Brezillon */ 1327482d6ecSBoris Brezillon return regmap_write(regmap, reg, val); 1337482d6ecSBoris Brezillon } 1347482d6ecSBoris Brezillon 1357482d6ecSBoris Brezillon static int act8945a_set_suspend_enable(struct regulator_dev *rdev) 1367482d6ecSBoris Brezillon { 1377482d6ecSBoris Brezillon return act8945a_set_suspend_state(rdev, true); 1387482d6ecSBoris Brezillon } 1397482d6ecSBoris Brezillon 1407482d6ecSBoris Brezillon static int act8945a_set_suspend_disable(struct regulator_dev *rdev) 1417482d6ecSBoris Brezillon { 1427482d6ecSBoris Brezillon return act8945a_set_suspend_state(rdev, false); 1437482d6ecSBoris Brezillon } 1447482d6ecSBoris Brezillon 1457482d6ecSBoris Brezillon static unsigned int act8945a_of_map_mode(unsigned int mode) 1467482d6ecSBoris Brezillon { 1477482d6ecSBoris Brezillon switch (mode) { 1487482d6ecSBoris Brezillon case ACT8945A_REGULATOR_MODE_FIXED: 1497482d6ecSBoris Brezillon case ACT8945A_REGULATOR_MODE_NORMAL: 1507482d6ecSBoris Brezillon return REGULATOR_MODE_NORMAL; 1517482d6ecSBoris Brezillon case ACT8945A_REGULATOR_MODE_LOWPOWER: 1527482d6ecSBoris Brezillon return REGULATOR_MODE_STANDBY; 1537482d6ecSBoris Brezillon default: 1547482d6ecSBoris Brezillon return REGULATOR_MODE_INVALID; 1557482d6ecSBoris Brezillon } 1567482d6ecSBoris Brezillon } 1577482d6ecSBoris Brezillon 1587482d6ecSBoris Brezillon static int act8945a_set_mode(struct regulator_dev *rdev, unsigned int mode) 1597482d6ecSBoris Brezillon { 1607482d6ecSBoris Brezillon struct act8945a_pmic *act8945a = rdev_get_drvdata(rdev); 1617482d6ecSBoris Brezillon struct regmap *regmap = rdev->regmap; 1627482d6ecSBoris Brezillon int id = rdev->desc->id; 1637482d6ecSBoris Brezillon int reg, ret, val = 0; 1647482d6ecSBoris Brezillon 1657482d6ecSBoris Brezillon switch (id) { 1667482d6ecSBoris Brezillon case ACT8945A_ID_DCDC1: 1677482d6ecSBoris Brezillon reg = ACT8945A_DCDC1_CTRL; 1687482d6ecSBoris Brezillon break; 1697482d6ecSBoris Brezillon case ACT8945A_ID_DCDC2: 1707482d6ecSBoris Brezillon reg = ACT8945A_DCDC2_CTRL; 1717482d6ecSBoris Brezillon break; 1727482d6ecSBoris Brezillon case ACT8945A_ID_DCDC3: 1737482d6ecSBoris Brezillon reg = ACT8945A_DCDC3_CTRL; 1747482d6ecSBoris Brezillon break; 1757482d6ecSBoris Brezillon case ACT8945A_ID_LDO1: 1767482d6ecSBoris Brezillon reg = ACT8945A_LDO1_SUS; 1777482d6ecSBoris Brezillon break; 1787482d6ecSBoris Brezillon case ACT8945A_ID_LDO2: 1797482d6ecSBoris Brezillon reg = ACT8945A_LDO2_SUS; 1807482d6ecSBoris Brezillon break; 1817482d6ecSBoris Brezillon case ACT8945A_ID_LDO3: 1827482d6ecSBoris Brezillon reg = ACT8945A_LDO3_SUS; 1837482d6ecSBoris Brezillon break; 1847482d6ecSBoris Brezillon case ACT8945A_ID_LDO4: 1857482d6ecSBoris Brezillon reg = ACT8945A_LDO4_SUS; 1867482d6ecSBoris Brezillon break; 1877482d6ecSBoris Brezillon default: 1887482d6ecSBoris Brezillon return -EINVAL; 1897482d6ecSBoris Brezillon } 1907482d6ecSBoris Brezillon 1917482d6ecSBoris Brezillon switch (mode) { 1927482d6ecSBoris Brezillon case REGULATOR_MODE_STANDBY: 1937482d6ecSBoris Brezillon if (rdev->desc->id > ACT8945A_ID_DCDC3) 1947482d6ecSBoris Brezillon val = BIT(5); 1957482d6ecSBoris Brezillon break; 1967482d6ecSBoris Brezillon case REGULATOR_MODE_NORMAL: 1977482d6ecSBoris Brezillon if (rdev->desc->id <= ACT8945A_ID_DCDC3) 1987482d6ecSBoris Brezillon val = BIT(5); 1997482d6ecSBoris Brezillon break; 2007482d6ecSBoris Brezillon default: 2017482d6ecSBoris Brezillon return -EINVAL; 2027482d6ecSBoris Brezillon } 2037482d6ecSBoris Brezillon 2047482d6ecSBoris Brezillon ret = regmap_update_bits(regmap, reg, BIT(5), val); 2057482d6ecSBoris Brezillon if (ret) 2067482d6ecSBoris Brezillon return ret; 2077482d6ecSBoris Brezillon 2087482d6ecSBoris Brezillon act8945a->op_mode[id] = mode; 2097482d6ecSBoris Brezillon 2107482d6ecSBoris Brezillon return 0; 2117482d6ecSBoris Brezillon } 2127482d6ecSBoris Brezillon 2137482d6ecSBoris Brezillon static unsigned int act8945a_get_mode(struct regulator_dev *rdev) 2147482d6ecSBoris Brezillon { 2157482d6ecSBoris Brezillon struct act8945a_pmic *act8945a = rdev_get_drvdata(rdev); 2167482d6ecSBoris Brezillon int id = rdev->desc->id; 2177482d6ecSBoris Brezillon 2187482d6ecSBoris Brezillon if (id < ACT8945A_ID_DCDC1 || id >= ACT8945A_ID_MAX) 2197482d6ecSBoris Brezillon return -EINVAL; 2207482d6ecSBoris Brezillon 2217482d6ecSBoris Brezillon return act8945a->op_mode[id]; 2227482d6ecSBoris Brezillon } 2237482d6ecSBoris Brezillon 2241ed1da3cSBhumika Goyal static const struct regulator_ops act8945a_ops = { 22538c09961SWenyou Yang .list_voltage = regulator_list_voltage_linear_range, 22638c09961SWenyou Yang .map_voltage = regulator_map_voltage_linear_range, 22738c09961SWenyou Yang .get_voltage_sel = regulator_get_voltage_sel_regmap, 22838c09961SWenyou Yang .set_voltage_sel = regulator_set_voltage_sel_regmap, 22938c09961SWenyou Yang .enable = regulator_enable_regmap, 23038c09961SWenyou Yang .disable = regulator_disable_regmap, 2317482d6ecSBoris Brezillon .set_mode = act8945a_set_mode, 2327482d6ecSBoris Brezillon .get_mode = act8945a_get_mode, 23338c09961SWenyou Yang .is_enabled = regulator_is_enabled_regmap, 2347482d6ecSBoris Brezillon .set_suspend_enable = act8945a_set_suspend_enable, 2357482d6ecSBoris Brezillon .set_suspend_disable = act8945a_set_suspend_disable, 23638c09961SWenyou Yang }; 23738c09961SWenyou Yang 23838c09961SWenyou Yang #define ACT89xx_REG(_name, _family, _id, _vsel_reg, _supply) \ 23938c09961SWenyou Yang [_family##_ID_##_id] = { \ 24038c09961SWenyou Yang .name = _name, \ 24138c09961SWenyou Yang .supply_name = _supply, \ 24238c09961SWenyou Yang .of_match = of_match_ptr("REG_"#_id), \ 2437482d6ecSBoris Brezillon .of_map_mode = act8945a_of_map_mode, \ 24438c09961SWenyou Yang .regulators_node = of_match_ptr("regulators"), \ 24538c09961SWenyou Yang .id = _family##_ID_##_id, \ 24638c09961SWenyou Yang .type = REGULATOR_VOLTAGE, \ 24738c09961SWenyou Yang .ops = &act8945a_ops, \ 24838c09961SWenyou Yang .n_voltages = ACT8945A_VOLTAGE_NUM, \ 24938c09961SWenyou Yang .linear_ranges = act8945a_voltage_ranges, \ 25038c09961SWenyou Yang .n_linear_ranges = ARRAY_SIZE(act8945a_voltage_ranges), \ 25138c09961SWenyou Yang .vsel_reg = _family##_##_id##_##_vsel_reg, \ 25238c09961SWenyou Yang .vsel_mask = ACT8945A_VSEL_MASK, \ 25338c09961SWenyou Yang .enable_reg = _family##_##_id##_CTRL, \ 25438c09961SWenyou Yang .enable_mask = ACT8945A_ENA, \ 25538c09961SWenyou Yang .owner = THIS_MODULE, \ 25638c09961SWenyou Yang } 25738c09961SWenyou Yang 25838c09961SWenyou Yang static const struct regulator_desc act8945a_regulators[] = { 25938c09961SWenyou Yang ACT89xx_REG("DCDC_REG1", ACT8945A, DCDC1, VSET1, "vp1"), 26038c09961SWenyou Yang ACT89xx_REG("DCDC_REG2", ACT8945A, DCDC2, VSET1, "vp2"), 26138c09961SWenyou Yang ACT89xx_REG("DCDC_REG3", ACT8945A, DCDC3, VSET1, "vp3"), 26238c09961SWenyou Yang ACT89xx_REG("LDO_REG1", ACT8945A, LDO1, VSET, "inl45"), 26338c09961SWenyou Yang ACT89xx_REG("LDO_REG2", ACT8945A, LDO2, VSET, "inl45"), 26438c09961SWenyou Yang ACT89xx_REG("LDO_REG3", ACT8945A, LDO3, VSET, "inl67"), 26538c09961SWenyou Yang ACT89xx_REG("LDO_REG4", ACT8945A, LDO4, VSET, "inl67"), 26638c09961SWenyou Yang }; 26738c09961SWenyou Yang 26838c09961SWenyou Yang static const struct regulator_desc act8945a_alt_regulators[] = { 26938c09961SWenyou Yang ACT89xx_REG("DCDC_REG1", ACT8945A, DCDC1, VSET2, "vp1"), 27038c09961SWenyou Yang ACT89xx_REG("DCDC_REG2", ACT8945A, DCDC2, VSET2, "vp2"), 27138c09961SWenyou Yang ACT89xx_REG("DCDC_REG3", ACT8945A, DCDC3, VSET2, "vp3"), 27238c09961SWenyou Yang ACT89xx_REG("LDO_REG1", ACT8945A, LDO1, VSET, "inl45"), 27338c09961SWenyou Yang ACT89xx_REG("LDO_REG2", ACT8945A, LDO2, VSET, "inl45"), 27438c09961SWenyou Yang ACT89xx_REG("LDO_REG3", ACT8945A, LDO3, VSET, "inl67"), 27538c09961SWenyou Yang ACT89xx_REG("LDO_REG4", ACT8945A, LDO4, VSET, "inl67"), 27638c09961SWenyou Yang }; 27738c09961SWenyou Yang 27838c09961SWenyou Yang static int act8945a_pmic_probe(struct platform_device *pdev) 27938c09961SWenyou Yang { 28038c09961SWenyou Yang struct regulator_config config = { }; 28138c09961SWenyou Yang const struct regulator_desc *regulators; 2827482d6ecSBoris Brezillon struct act8945a_pmic *act8945a; 28338c09961SWenyou Yang struct regulator_dev *rdev; 28438c09961SWenyou Yang int i, num_regulators; 28538c09961SWenyou Yang bool voltage_select; 28638c09961SWenyou Yang 2877482d6ecSBoris Brezillon act8945a = devm_kzalloc(&pdev->dev, sizeof(*act8945a), GFP_KERNEL); 2887482d6ecSBoris Brezillon if (!act8945a) 2897482d6ecSBoris Brezillon return -ENOMEM; 2907482d6ecSBoris Brezillon 2917482d6ecSBoris Brezillon act8945a->regmap = dev_get_regmap(pdev->dev.parent, NULL); 2927482d6ecSBoris Brezillon if (!act8945a->regmap) { 29390bc8ac2SClaudiu Beznea dev_err(&pdev->dev, 29490bc8ac2SClaudiu Beznea "could not retrieve regmap from parent device\n"); 29590bc8ac2SClaudiu Beznea return -EINVAL; 29690bc8ac2SClaudiu Beznea } 29790bc8ac2SClaudiu Beznea 29838c09961SWenyou Yang voltage_select = of_property_read_bool(pdev->dev.parent->of_node, 29938c09961SWenyou Yang "active-semi,vsel-high"); 30038c09961SWenyou Yang 30138c09961SWenyou Yang if (voltage_select) { 30238c09961SWenyou Yang regulators = act8945a_alt_regulators; 30338c09961SWenyou Yang num_regulators = ARRAY_SIZE(act8945a_alt_regulators); 30438c09961SWenyou Yang } else { 30538c09961SWenyou Yang regulators = act8945a_regulators; 30638c09961SWenyou Yang num_regulators = ARRAY_SIZE(act8945a_regulators); 30738c09961SWenyou Yang } 30838c09961SWenyou Yang 30938c09961SWenyou Yang config.dev = &pdev->dev; 31038c09961SWenyou Yang config.dev->of_node = pdev->dev.parent->of_node; 3117482d6ecSBoris Brezillon config.driver_data = act8945a; 31238c09961SWenyou Yang for (i = 0; i < num_regulators; i++) { 31303ffbf9cSClaudiu Beznea rdev = devm_regulator_register(&pdev->dev, ®ulators[i], 31403ffbf9cSClaudiu Beznea &config); 31538c09961SWenyou Yang if (IS_ERR(rdev)) { 31638c09961SWenyou Yang dev_err(&pdev->dev, 31738c09961SWenyou Yang "failed to register %s regulator\n", 31838c09961SWenyou Yang regulators[i].name); 31938c09961SWenyou Yang return PTR_ERR(rdev); 32038c09961SWenyou Yang } 32138c09961SWenyou Yang } 32238c09961SWenyou Yang 3237482d6ecSBoris Brezillon platform_set_drvdata(pdev, act8945a); 3247482d6ecSBoris Brezillon 32590bc8ac2SClaudiu Beznea /* Unlock expert registers. */ 3267482d6ecSBoris Brezillon return regmap_write(act8945a->regmap, ACT8945A_SYS_UNLK_REGS, 0xef); 32738c09961SWenyou Yang } 32838c09961SWenyou Yang 32922a5a4a4SClaudiu Beznea static int __maybe_unused act8945a_suspend(struct device *pdev) 3307482d6ecSBoris Brezillon { 3317482d6ecSBoris Brezillon struct act8945a_pmic *act8945a = dev_get_drvdata(pdev); 3327482d6ecSBoris Brezillon 3337482d6ecSBoris Brezillon /* 3347482d6ecSBoris Brezillon * Ask the PMIC to enter the suspend mode on the next PWRHLD 3357482d6ecSBoris Brezillon * transition. 3367482d6ecSBoris Brezillon */ 3377482d6ecSBoris Brezillon return regmap_write(act8945a->regmap, ACT8945A_SYS_CTRL, 0x42); 3387482d6ecSBoris Brezillon } 3397482d6ecSBoris Brezillon 34078e6fbf3SWei Yongjun static SIMPLE_DEV_PM_OPS(act8945a_pm, act8945a_suspend, NULL); 3417482d6ecSBoris Brezillon 342b5ebba46SClaudiu Beznea static void act8945a_pmic_shutdown(struct platform_device *pdev) 343b5ebba46SClaudiu Beznea { 344b5ebba46SClaudiu Beznea struct act8945a_pmic *act8945a = platform_get_drvdata(pdev); 345b5ebba46SClaudiu Beznea 346b5ebba46SClaudiu Beznea /* 347b5ebba46SClaudiu Beznea * Ask the PMIC to shutdown everything on the next PWRHLD transition. 348b5ebba46SClaudiu Beznea */ 349b5ebba46SClaudiu Beznea regmap_write(act8945a->regmap, ACT8945A_SYS_CTRL, 0x0); 350b5ebba46SClaudiu Beznea } 351b5ebba46SClaudiu Beznea 35238c09961SWenyou Yang static struct platform_driver act8945a_pmic_driver = { 35338c09961SWenyou Yang .driver = { 35438c09961SWenyou Yang .name = "act8945a-regulator", 3557482d6ecSBoris Brezillon .pm = &act8945a_pm, 35638c09961SWenyou Yang }, 35738c09961SWenyou Yang .probe = act8945a_pmic_probe, 358b5ebba46SClaudiu Beznea .shutdown = act8945a_pmic_shutdown, 35938c09961SWenyou Yang }; 36038c09961SWenyou Yang module_platform_driver(act8945a_pmic_driver); 36138c09961SWenyou Yang 36238c09961SWenyou Yang MODULE_DESCRIPTION("Active-semi ACT8945A voltage regulator driver"); 36338c09961SWenyou Yang MODULE_AUTHOR("Wenyou Yang <wenyou.yang@atmel.com>"); 36438c09961SWenyou Yang MODULE_LICENSE("GPL"); 365