^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <linux/regulator/driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) enum fan53880_regulator_ids {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) FAN53880_LDO1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) FAN53880_LDO2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) FAN53880_LDO3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) FAN53880_LDO4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) FAN53880_BUCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) FAN53880_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) enum fan53880_registers {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) FAN53880_PRODUCT_ID = 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) FAN53880_SILICON_REV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) FAN53880_BUCKVOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) FAN53880_BOOSTVOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) FAN53880_LDO1VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) FAN53880_LDO2VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) FAN53880_LDO3VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) FAN53880_LDO4VOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) FAN53880_IOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) FAN53880_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) FAN53880_ENABLE_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define FAN53880_ID 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) static const struct regulator_ops fan53880_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .list_voltage = regulator_list_voltage_linear_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .map_voltage = regulator_map_voltage_linear_range,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .set_voltage_sel = regulator_set_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .get_voltage_sel = regulator_get_voltage_sel_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .enable = regulator_enable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .disable = regulator_disable_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .is_enabled = regulator_is_enabled_regmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define FAN53880_LDO(_num, _supply, _default) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) [FAN53880_LDO ## _num] = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .name = "LDO"#_num, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .of_match = of_match_ptr("LDO"#_num), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .regulators_node = of_match_ptr("regulators"), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .type = REGULATOR_VOLTAGE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .owner = THIS_MODULE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .linear_ranges = (struct linear_range[]) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) REGULATOR_LINEAR_RANGE(_default, 0x0, 0x0, 0), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) REGULATOR_LINEAR_RANGE(800000, 0xf, 0x73, 25000), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .n_linear_ranges = 2, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .n_voltages = 0x74, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .vsel_reg = FAN53880_LDO ## _num ## VOUT, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .vsel_mask = 0x7f, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .enable_reg = FAN53880_ENABLE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .enable_mask = BIT(_num - 1), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .enable_time = 150, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .supply_name = _supply, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .ops = &fan53880_ops, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static const struct regulator_desc fan53880_regulators[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) FAN53880_LDO(1, "VIN12", 2800000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) FAN53880_LDO(2, "VIN12", 2800000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) FAN53880_LDO(3, "VIN3", 1800000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) FAN53880_LDO(4, "VIN4", 1800000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) [FAN53880_BUCK] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .name = "BUCK",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .of_match = of_match_ptr("BUCK"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .linear_ranges = (struct linear_range[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) REGULATOR_LINEAR_RANGE(1100000, 0x0, 0x0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) REGULATOR_LINEAR_RANGE(600000, 0x1f, 0xf7, 12500),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .n_linear_ranges = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .n_voltages = 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .vsel_reg = FAN53880_BUCKVOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .vsel_mask = 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .enable_reg = FAN53880_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .enable_mask = 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .enable_time = 480,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .supply_name = "PVIN",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .ops = &fan53880_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) [FAN53880_BOOST] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .name = "BOOST",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .of_match = of_match_ptr("BOOST"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .regulators_node = of_match_ptr("regulators"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .type = REGULATOR_VOLTAGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .linear_ranges = (struct linear_range[]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) REGULATOR_LINEAR_RANGE(5000000, 0x0, 0x0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) REGULATOR_LINEAR_RANGE(3000000, 0x4, 0x70, 25000),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .n_linear_ranges = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .n_voltages = 0x71,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .vsel_reg = FAN53880_BOOSTVOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .vsel_mask = 0x7f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .enable_reg = FAN53880_ENABLE_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .enable_mask = 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .enable_time = 580,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .supply_name = "PVIN",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .ops = &fan53880_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static const struct regmap_config fan53880_regmap = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .reg_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .val_bits = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .max_register = FAN53880_ENABLE_BOOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static int fan53880_i2c_probe(struct i2c_client *i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct regulator_config config = { };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct regulator_dev *rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct regmap *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int i, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) unsigned int data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) regmap = devm_regmap_init_i2c(i2c, &fan53880_regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if (IS_ERR(regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) ret = PTR_ERR(regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) dev_err(&i2c->dev, "Failed to create regmap: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) ret = regmap_read(regmap, FAN53880_PRODUCT_ID, &data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) dev_err(&i2c->dev, "Failed to read PRODUCT_ID: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (data != FAN53880_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) dev_err(&i2c->dev, "Unsupported device id: 0x%x.\n", data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) config.dev = &i2c->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) config.init_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) for (i = 0; i < ARRAY_SIZE(fan53880_regulators); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) rdev = devm_regulator_register(&i2c->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) &fan53880_regulators[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) &config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) if (IS_ERR(rdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ret = PTR_ERR(rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) dev_err(&i2c->dev, "Failed to register %s: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) fan53880_regulators[i].name, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #ifdef CONFIG_OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static const struct of_device_id fan53880_dt_ids[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) { .compatible = "onnn,fan53880", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) MODULE_DEVICE_TABLE(of, fan53880_dt_ids);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static const struct i2c_device_id fan53880_i2c_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { "fan53880", },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) MODULE_DEVICE_TABLE(i2c, fan53880_i2c_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static struct i2c_driver fan53880_regulator_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) .name = "fan53880",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .of_match_table = of_match_ptr(fan53880_dt_ids),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .probe = fan53880_i2c_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .id_table = fan53880_i2c_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) module_i2c_driver(fan53880_regulator_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) MODULE_DESCRIPTION("FAN53880 PMIC voltage regulator driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) MODULE_AUTHOR("Christoph Fritz <chf.fritz@googlemail.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) MODULE_LICENSE("GPL");