// SPDX-License-Identifier: GPL-2.0+
//
// Regulator driver for ATC260x PMICs
//
// Copyright (C) 2019 Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
// Copyright (C) 2020 Cristian Ciocaltea <cristian.ciocaltea@gmail.com>

#include <linux/mfd/atc260x/core.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>

struct atc260x_regulator_data {
	int voltage_time_dcdc;
	int voltage_time_ldo;
};

static const struct linear_range atc2603c_dcdc_voltage_ranges[] = {
	REGULATOR_LINEAR_RANGE(1300000, 0, 13, 50000),
	REGULATOR_LINEAR_RANGE(1950000, 14, 15, 100000),
};

static const struct linear_range atc2609a_dcdc_voltage_ranges[] = {
	REGULATOR_LINEAR_RANGE(600000, 0, 127, 6250),
	REGULATOR_LINEAR_RANGE(1400000, 128, 232, 25000),
};

static const struct linear_range atc2609a_ldo_voltage_ranges0[] = {
	REGULATOR_LINEAR_RANGE(700000, 0, 15, 100000),
	REGULATOR_LINEAR_RANGE(2100000, 0, 12, 100000),
};

static const struct linear_range atc2609a_ldo_voltage_ranges1[] = {
	REGULATOR_LINEAR_RANGE(850000, 0, 15, 100000),
	REGULATOR_LINEAR_RANGE(2100000, 0, 11, 100000),
};

static const unsigned int atc260x_ldo_voltage_range_sel[] = {
	0x0, 0x20,
};

static int atc260x_dcdc_set_voltage_time_sel(struct regulator_dev *rdev,
					     unsigned int old_selector,
					     unsigned int new_selector)
{
	struct atc260x_regulator_data *data = rdev_get_drvdata(rdev);

	if (new_selector > old_selector)
		return data->voltage_time_dcdc;

	return 0;
}

static int atc260x_ldo_set_voltage_time_sel(struct regulator_dev *rdev,
					    unsigned int old_selector,
					    unsigned int new_selector)
{
	struct atc260x_regulator_data *data = rdev_get_drvdata(rdev);

	if (new_selector > old_selector)
		return data->voltage_time_ldo;

	return 0;
}

static const struct regulator_ops atc260x_dcdc_ops = {
	.enable	= regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
	.list_voltage = regulator_list_voltage_linear,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_dcdc_set_voltage_time_sel,
};

static const struct regulator_ops atc260x_ldo_ops = {
	.enable	= regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
	.list_voltage = regulator_list_voltage_linear,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel,
};

static const struct regulator_ops atc260x_ldo_bypass_ops = {
	.enable	= regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
	.list_voltage = regulator_list_voltage_linear,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel,
	.set_bypass = regulator_set_bypass_regmap,
	.get_bypass = regulator_get_bypass_regmap,
};

static const struct regulator_ops atc260x_ldo_bypass_discharge_ops = {
	.enable	= regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
	.list_voltage = regulator_list_voltage_linear,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel,
	.set_bypass = regulator_set_bypass_regmap,
	.get_bypass = regulator_get_bypass_regmap,
	.set_active_discharge = regulator_set_active_discharge_regmap,
};

static const struct regulator_ops atc260x_dcdc_range_ops = {
	.enable	= regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
	.list_voltage = regulator_list_voltage_linear_range,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_dcdc_set_voltage_time_sel,
};

static const struct regulator_ops atc260x_ldo_range_pick_ops = {
	.enable	= regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
	.list_voltage = regulator_list_voltage_pickable_linear_range,
	.set_voltage_sel = regulator_set_voltage_sel_pickable_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
	.set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel,
};

static const struct regulator_ops atc260x_dcdc_fixed_ops = {
	.list_voltage = regulator_list_voltage_linear,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_dcdc_set_voltage_time_sel,
};

static const struct regulator_ops atc260x_ldo_fixed_ops = {
	.list_voltage = regulator_list_voltage_linear,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.set_voltage_time_sel = atc260x_ldo_set_voltage_time_sel,
};

static const struct regulator_ops atc260x_no_ops = {
};

/*
 * Note LDO8 is not documented in datasheet (v2.4), but supported
 * in the vendor's driver implementation (xapp-le-kernel).
 */
enum atc2603c_reg_ids {
	ATC2603C_ID_DCDC1,
	ATC2603C_ID_DCDC2,
	ATC2603C_ID_DCDC3,
	ATC2603C_ID_LDO1,
	ATC2603C_ID_LDO2,
	ATC2603C_ID_LDO3,
	ATC2603C_ID_LDO5,
	ATC2603C_ID_LDO6,
	ATC2603C_ID_LDO7,
	ATC2603C_ID_LDO8,
	ATC2603C_ID_LDO11,
	ATC2603C_ID_LDO12,
	ATC2603C_ID_SWITCHLDO1,
	ATC2603C_ID_MAX,
};

#define atc2603c_reg_desc_dcdc(num, min, step, n_volt, vsel_h, vsel_l) { \
	.name = "DCDC"#num, \
	.supply_name = "dcdc"#num, \
	.of_match = of_match_ptr("dcdc"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_DCDC##num, \
	.ops = &atc260x_dcdc_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = min, \
	.uV_step = step, \
	.n_voltages = n_volt, \
	.vsel_reg = ATC2603C_PMU_DC##num##_CTL0, \
	.vsel_mask = GENMASK(vsel_h, vsel_l), \
	.enable_reg = ATC2603C_PMU_DC##num##_CTL0, \
	.enable_mask = BIT(15), \
	.enable_time = 800, \
	.owner = THIS_MODULE, \
}

#define atc2603c_reg_desc_dcdc_range(num, vsel_h, vsel_l) { \
	.name = "DCDC"#num, \
	.supply_name = "dcdc"#num, \
	.of_match = of_match_ptr("dcdc"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_DCDC##num, \
	.ops = &atc260x_dcdc_range_ops, \
	.type = REGULATOR_VOLTAGE, \
	.n_voltages = 16, \
	.linear_ranges = atc2603c_dcdc_voltage_ranges, \
	.n_linear_ranges = ARRAY_SIZE(atc2603c_dcdc_voltage_ranges), \
	.vsel_reg = ATC2603C_PMU_DC##num##_CTL0, \
	.vsel_mask = GENMASK(vsel_h, vsel_l), \
	.enable_reg = ATC2603C_PMU_DC##num##_CTL0, \
	.enable_mask = BIT(15), \
	.enable_time = 800, \
	.owner = THIS_MODULE, \
}

#define atc2603c_reg_desc_dcdc_fixed(num, min, step, n_volt, vsel_h, vsel_l) { \
	.name = "DCDC"#num, \
	.supply_name = "dcdc"#num, \
	.of_match = of_match_ptr("dcdc"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_DCDC##num, \
	.ops = &atc260x_dcdc_fixed_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = min, \
	.uV_step = step, \
	.n_voltages = n_volt, \
	.vsel_reg = ATC2603C_PMU_DC##num##_CTL0, \
	.vsel_mask = GENMASK(vsel_h, vsel_l), \
	.enable_time = 800, \
	.owner = THIS_MODULE, \
}

#define atc2603c_reg_desc_ldo(num, min, step, n_volt, vsel_h, vsel_l) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_LDO##num, \
	.ops = &atc260x_ldo_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = min, \
	.uV_step = step, \
	.n_voltages = n_volt, \
	.vsel_reg = ATC2603C_PMU_LDO##num##_CTL, \
	.vsel_mask = GENMASK(vsel_h, vsel_l), \
	.enable_reg = ATC2603C_PMU_LDO##num##_CTL, \
	.enable_mask = BIT(0), \
	.enable_time = 2000, \
	.owner = THIS_MODULE, \
}

#define atc2603c_reg_desc_ldo_fixed(num, min, step, n_volt, vsel_h, vsel_l) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_LDO##num, \
	.ops = &atc260x_ldo_fixed_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = min, \
	.uV_step = step, \
	.n_voltages = n_volt, \
	.vsel_reg = ATC2603C_PMU_LDO##num##_CTL, \
	.vsel_mask = GENMASK(vsel_h, vsel_l), \
	.enable_time = 2000, \
	.owner = THIS_MODULE, \
}

#define atc2603c_reg_desc_ldo_noops(num, vfixed) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_LDO##num, \
	.ops = &atc260x_no_ops, \
	.type = REGULATOR_VOLTAGE, \
	.fixed_uV = vfixed, \
	.n_voltages = 1, \
	.owner = THIS_MODULE, \
}

#define atc2603c_reg_desc_ldo_switch(num, min, step, n_volt, vsel_h, vsel_l) { \
	.name = "SWITCHLDO"#num, \
	.supply_name = "switchldo"#num, \
	.of_match = of_match_ptr("switchldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2603C_ID_SWITCHLDO##num, \
	.ops = &atc260x_ldo_bypass_discharge_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = min, \
	.uV_step = step, \
	.n_voltages = n_volt, \
	.vsel_reg = ATC2603C_PMU_SWITCH_CTL, \
	.vsel_mask = GENMASK(vsel_h, vsel_l), \
	.enable_reg = ATC2603C_PMU_SWITCH_CTL, \
	.enable_mask = BIT(15), \
	.enable_is_inverted = true, \
	.enable_time = 2000, \
	.bypass_reg = ATC2603C_PMU_SWITCH_CTL, \
	.bypass_mask = BIT(5), \
	.active_discharge_reg = ATC2603C_PMU_SWITCH_CTL, \
	.active_discharge_mask = BIT(1), \
	.owner = THIS_MODULE, \
}

static const struct regulator_desc atc2603c_reg[] = {
	atc2603c_reg_desc_dcdc_fixed(1, 700000, 25000, 29, 11, 7),
	atc2603c_reg_desc_dcdc_range(2, 12, 8),
	atc2603c_reg_desc_dcdc_fixed(3, 2600000, 100000, 8, 11, 9),
	atc2603c_reg_desc_ldo_fixed(1, 2600000, 100000, 8, 15, 13),
	atc2603c_reg_desc_ldo_fixed(2, 2600000, 100000, 8, 15, 13),
	atc2603c_reg_desc_ldo_fixed(3, 1500000, 100000, 6, 15, 13),
	atc2603c_reg_desc_ldo(5, 2600000, 100000, 8, 15, 13),
	atc2603c_reg_desc_ldo_fixed(6, 700000, 25000, 29, 15, 11),
	atc2603c_reg_desc_ldo(7, 1500000, 100000, 6, 15, 13),
	atc2603c_reg_desc_ldo(8, 2300000, 100000, 11, 15, 12),
	atc2603c_reg_desc_ldo_fixed(11, 2600000, 100000, 8, 15, 13),
	atc2603c_reg_desc_ldo_noops(12, 1800000),
	atc2603c_reg_desc_ldo_switch(1, 3000000, 100000, 4, 4, 3),
};

static const struct regulator_desc atc2603c_reg_dcdc2_ver_b =
	atc2603c_reg_desc_dcdc(2, 1000000, 50000, 18, 12, 8);

enum atc2609a_reg_ids {
	ATC2609A_ID_DCDC0,
	ATC2609A_ID_DCDC1,
	ATC2609A_ID_DCDC2,
	ATC2609A_ID_DCDC3,
	ATC2609A_ID_DCDC4,
	ATC2609A_ID_LDO0,
	ATC2609A_ID_LDO1,
	ATC2609A_ID_LDO2,
	ATC2609A_ID_LDO3,
	ATC2609A_ID_LDO4,
	ATC2609A_ID_LDO5,
	ATC2609A_ID_LDO6,
	ATC2609A_ID_LDO7,
	ATC2609A_ID_LDO8,
	ATC2609A_ID_LDO9,
	ATC2609A_ID_MAX,
};

#define atc2609a_reg_desc_dcdc(num, en_bit) { \
	.name = "DCDC"#num, \
	.supply_name = "dcdc"#num, \
	.of_match = of_match_ptr("dcdc"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2609A_ID_DCDC##num, \
	.ops = &atc260x_dcdc_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = 600000, \
	.uV_step = 6250, \
	.n_voltages = 256, \
	.vsel_reg = ATC2609A_PMU_DC##num##_CTL0, \
	.vsel_mask = GENMASK(15, 8), \
	.enable_reg = ATC2609A_PMU_DC_OSC, \
	.enable_mask = BIT(en_bit), \
	.enable_time = 800, \
	.owner = THIS_MODULE, \
}

#define atc2609a_reg_desc_dcdc_range(num, en_bit) { \
	.name = "DCDC"#num, \
	.supply_name = "dcdc"#num, \
	.of_match = of_match_ptr("dcdc"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2609A_ID_DCDC##num, \
	.ops = &atc260x_dcdc_range_ops, \
	.type = REGULATOR_VOLTAGE, \
	.n_voltages = 233, \
	.linear_ranges = atc2609a_dcdc_voltage_ranges, \
	.n_linear_ranges = ARRAY_SIZE(atc2609a_dcdc_voltage_ranges), \
	.vsel_reg = ATC2609A_PMU_DC##num##_CTL0, \
	.vsel_mask = GENMASK(15, 8), \
	.enable_reg = ATC2609A_PMU_DC_OSC, \
	.enable_mask = BIT(en_bit), \
	.enable_time = 800, \
	.owner = THIS_MODULE, \
}

#define atc2609a_reg_desc_ldo(num) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2609A_ID_LDO##num, \
	.ops = &atc260x_ldo_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = 700000, \
	.uV_step = 100000, \
	.n_voltages = 16, \
	.vsel_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.vsel_mask = GENMASK(4, 1), \
	.enable_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.enable_mask = BIT(0), \
	.enable_time = 2000, \
	.owner = THIS_MODULE, \
}

#define atc2609a_reg_desc_ldo_bypass(num) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2609A_ID_LDO##num, \
	.ops = &atc260x_ldo_bypass_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = 2300000, \
	.uV_step = 100000, \
	.n_voltages = 12, \
	.vsel_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.vsel_mask = GENMASK(5, 2), \
	.enable_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.enable_mask = BIT(0), \
	.enable_time = 2000, \
	.bypass_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.bypass_mask = BIT(1), \
	.owner = THIS_MODULE, \
}

#define atc2609a_reg_desc_ldo_range_pick(num, n_range, n_volt) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2609A_ID_LDO##num, \
	.ops = &atc260x_ldo_range_pick_ops, \
	.type = REGULATOR_VOLTAGE, \
	.linear_ranges = atc2609a_ldo_voltage_ranges##n_range, \
	.n_linear_ranges = ARRAY_SIZE(atc2609a_ldo_voltage_ranges##n_range), \
	.n_voltages = n_volt, \
	.vsel_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.vsel_mask = GENMASK(4, 1), \
	.vsel_range_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.vsel_range_mask = BIT(5), \
	.linear_range_selectors = atc260x_ldo_voltage_range_sel, \
	.enable_reg = ATC2609A_PMU_LDO##num##_CTL0, \
	.enable_mask = BIT(0), \
	.enable_time = 2000, \
	.owner = THIS_MODULE, \
}

#define atc2609a_reg_desc_ldo_fixed(num) { \
	.name = "LDO"#num, \
	.supply_name = "ldo"#num, \
	.of_match = of_match_ptr("ldo"#num), \
	.regulators_node = of_match_ptr("regulators"), \
	.id = ATC2609A_ID_LDO##num, \
	.ops = &atc260x_ldo_fixed_ops, \
	.type = REGULATOR_VOLTAGE, \
	.min_uV = 2600000, \
	.uV_step = 100000, \
	.n_voltages = 8, \
	.vsel_reg = ATC2609A_PMU_LDO##num##_CTL, \
	.vsel_mask = GENMASK(15, 13), \
	.enable_time = 2000, \
	.owner = THIS_MODULE, \
}

static const struct regulator_desc atc2609a_reg[] = {
	atc2609a_reg_desc_dcdc(0, 4),
	atc2609a_reg_desc_dcdc(1, 5),
	atc2609a_reg_desc_dcdc(2, 6),
	atc2609a_reg_desc_dcdc_range(3, 7),
	atc2609a_reg_desc_dcdc(4, 8),
	atc2609a_reg_desc_ldo_bypass(0),
	atc2609a_reg_desc_ldo_bypass(1),
	atc2609a_reg_desc_ldo_bypass(2),
	atc2609a_reg_desc_ldo_range_pick(3, 0, 29),
	atc2609a_reg_desc_ldo_range_pick(4, 0, 29),
	atc2609a_reg_desc_ldo(5),
	atc2609a_reg_desc_ldo_range_pick(6, 1, 28),
	atc2609a_reg_desc_ldo_range_pick(7, 0, 29),
	atc2609a_reg_desc_ldo_range_pick(8, 0, 29),
	atc2609a_reg_desc_ldo_fixed(9),
};

static int atc260x_regulator_probe(struct platform_device *pdev)
{
	struct atc260x *atc260x = dev_get_drvdata(pdev->dev.parent);
	struct device *dev = atc260x->dev;
	struct atc260x_regulator_data *atc260x_data;
	struct regulator_config config = {};
	struct regulator_dev *atc260x_rdev;
	const struct regulator_desc *regulators;
	bool atc2603c_ver_b = false;
	int i, nregulators;

	atc260x_data = devm_kzalloc(&pdev->dev, sizeof(*atc260x_data), GFP_KERNEL);
	if (!atc260x_data)
		return -ENOMEM;

	atc260x_data->voltage_time_dcdc = 350;
	atc260x_data->voltage_time_ldo = 800;

	switch (atc260x->ic_type) {
	case ATC2603C:
		regulators = atc2603c_reg;
		nregulators = ATC2603C_ID_MAX;
		atc2603c_ver_b = atc260x->ic_ver == ATC260X_B;
		break;
	case ATC2609A:
		atc260x_data->voltage_time_dcdc = 250;
		regulators = atc2609a_reg;
		nregulators = ATC2609A_ID_MAX;
		break;
	default:
		dev_err(dev, "unsupported ATC260X ID %d\n", atc260x->ic_type);
		return -EINVAL;
	}

	config.dev = dev;
	config.regmap = atc260x->regmap;
	config.driver_data = atc260x_data;

	/* Instantiate the regulators */
	for (i = 0; i < nregulators; i++) {
		if (atc2603c_ver_b && regulators[i].id == ATC2603C_ID_DCDC2)
			atc260x_rdev = devm_regulator_register(&pdev->dev,
							       &atc2603c_reg_dcdc2_ver_b,
							       &config);
		else
			atc260x_rdev = devm_regulator_register(&pdev->dev,
							       &regulators[i],
							       &config);
		if (IS_ERR(atc260x_rdev)) {
			dev_err(dev, "failed to register regulator: %d\n", i);
			return PTR_ERR(atc260x_rdev);
		}
	}

	return 0;
}

static struct platform_driver atc260x_regulator_driver = {
	.probe = atc260x_regulator_probe,
	.driver = {
		.name = "atc260x-regulator",
	},
};

module_platform_driver(atc260x_regulator_driver);

MODULE_DESCRIPTION("Regulator driver for ATC260x PMICs");
MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
MODULE_AUTHOR("Cristian Ciocaltea <cristian.ciocaltea@gmail.com>");
MODULE_LICENSE("GPL");
