// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) EETS GmbH, 2017, Felix Brack <f.brack@eets.ch>
 */

#include <common.h>
#include <dm.h>
#include <log.h>
#include <linux/printk.h>
#include <power/pmic.h>
#include <power/regulator.h>
#include <power/tps65910_pmic.h>

#define VOUT_CHOICE_COUNT 4

/*
 * struct regulator_props - Properties of a LDO and VIO SMPS regulator
 *
 * All of these regulators allow setting one out of four output voltages.
 * These output voltages are only achievable when supplying the regulator
 * with a minimum input voltage.
 *
 * @vin_min[]: minimum supply input voltage in uV required to achieve the
 *             corresponding vout[] voltage
 * @vout[]:    regulator output voltage in uV
 * @reg:       I2C register used to set regulator voltage
 */
struct regulator_props {
	int vin_min[VOUT_CHOICE_COUNT];
	int vout[VOUT_CHOICE_COUNT];
	int reg;
};

static const struct regulator_props ldo_props_vdig1 = {
	.vin_min = { 1700000, 2100000, 2700000, 3200000 },
	.vout = { 1200000, 1500000, 1800000, 2700000 },
	.reg = TPS65910_REG_VDIG1
};

static const struct regulator_props ldo_props_vdig2 = {
	.vin_min = { 1700000, 1700000, 1700000, 2700000 },
	.vout = { 1000000, 1100000, 1200000, 1800000 },
	.reg = TPS65910_REG_VDIG2
};

static const struct regulator_props ldo_props_vpll = {
	.vin_min = { 2700000, 2700000, 2700000, 3000000 },
	.vout = { 1000000, 1100000, 1800000, 2500000 },
	.reg = TPS65910_REG_VPLL
};

static const struct regulator_props ldo_props_vdac = {
	.vin_min = { 2700000, 3000000, 3200000, 3200000 },
	.vout = { 1800000, 2600000, 2800000, 2850000 },
	.reg = TPS65910_REG_VDAC
};

static const struct regulator_props ldo_props_vaux1 = {
	.vin_min = { 2700000, 3200000, 3200000, 3200000 },
	.vout = { 1800000, 2500000, 2800000, 2850000 },
	.reg = TPS65910_REG_VAUX1
};

static const struct regulator_props ldo_props_vaux2 = {
	.vin_min = { 2700000, 3200000, 3200000, 3600000 },
	.vout = { 1800000, 2800000, 2900000, 3300000 },
	.reg = TPS65910_REG_VAUX2
};

static const struct regulator_props ldo_props_vaux33 = {
	.vin_min = { 2700000, 2700000, 3200000, 3600000 },
	.vout = { 1800000, 2000000, 2800000, 3300000 },
	.reg = TPS65910_REG_VAUX33
};

static const struct regulator_props ldo_props_vmmc = {
	.vin_min = { 2700000, 3200000, 3200000, 3600000 },
	.vout = { 1800000, 2800000, 3000000, 3300000 },
	.reg = TPS65910_REG_VMMC
};

static const struct regulator_props smps_props_vio = {
	.vin_min = { 3200000, 3200000, 4000000, 4400000 },
	.vout = { 1500000, 1800000, 2500000, 3300000 },
	.reg = TPS65910_REG_VIO
};

/* lookup table of control registers indexed by regulator unit number */
static const int ctrl_regs[] = {
	TPS65910_REG_VRTC,
	TPS65910_REG_VIO,
	TPS65910_REG_VDD1,
	TPS65910_REG_VDD2,
	TPS65910_REG_VDD3,
	TPS65910_REG_VDIG1,
	TPS65910_REG_VDIG2,
	TPS65910_REG_VPLL,
	TPS65910_REG_VDAC,
	TPS65910_REG_VAUX1,
	TPS65910_REG_VAUX2,
	TPS65910_REG_VAUX33,
	TPS65910_REG_VMMC
};

/* supply names as used in DT */
static const char * const supply_names[] = {
	"vccio-supply",
	"vcc1-supply",
	"vcc2-supply",
	"vcc3-supply",
	"vcc4-supply",
	"vcc5-supply",
	"vcc6-supply",
	"vcc7-supply"
};

/* lookup table of regulator supplies indexed by regulator unit number */
static const int regulator_supplies[] = {
	TPS65910_SUPPLY_VCC7,
	TPS65910_SUPPLY_VCCIO,
	TPS65910_SUPPLY_VCC1,
	TPS65910_SUPPLY_VCC2,
	TPS65910_SUPPLY_VCC7,
	TPS65910_SUPPLY_VCC6,
	TPS65910_SUPPLY_VCC6,
	TPS65910_SUPPLY_VCC5,
	TPS65910_SUPPLY_VCC5,
	TPS65910_SUPPLY_VCC4,
	TPS65910_SUPPLY_VCC4,
	TPS65910_SUPPLY_VCC3,
	TPS65910_SUPPLY_VCC3
};

static int get_ctrl_reg_from_unit_addr(const uint unit_addr)
{
	if (unit_addr < ARRAY_SIZE(ctrl_regs))
		return ctrl_regs[unit_addr];
	return -ENXIO;
}

static int tps65910_regulator_get_value(struct udevice *dev,
					const struct regulator_props *rgp)
{
	int sel, val, vout;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);
	int vin = pdata->supply;

	val = pmic_reg_read(dev->parent, rgp->reg);
	if (val < 0)
		return val;
	sel = (val & TPS65910_SEL_MASK) >> 2;
	vout = (vin >= *(rgp->vin_min + sel)) ? *(rgp->vout + sel) : 0;
	vout = ((val & TPS65910_SUPPLY_STATE_MASK) == 1) ? vout : 0;

	return vout;
}

static int tps65910_ldo_get_value(struct udevice *dev)
{
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);
	int vin;

	if (!pdata)
		return 0;
	vin = pdata->supply;

	switch (pdata->unit) {
	case TPS65910_UNIT_VRTC:
		/* VRTC is fixed and can't be turned off */
		return (vin >= 2500000) ? 1830000 : 0;
	case TPS65910_UNIT_VDIG1:
		return tps65910_regulator_get_value(dev, &ldo_props_vdig1);
	case TPS65910_UNIT_VDIG2:
		return tps65910_regulator_get_value(dev, &ldo_props_vdig2);
	case TPS65910_UNIT_VPLL:
		return tps65910_regulator_get_value(dev, &ldo_props_vpll);
	case TPS65910_UNIT_VDAC:
		return tps65910_regulator_get_value(dev, &ldo_props_vdac);
	case TPS65910_UNIT_VAUX1:
		return tps65910_regulator_get_value(dev, &ldo_props_vaux1);
	case TPS65910_UNIT_VAUX2:
		return tps65910_regulator_get_value(dev, &ldo_props_vaux2);
	case TPS65910_UNIT_VAUX33:
		return tps65910_regulator_get_value(dev, &ldo_props_vaux33);
	case TPS65910_UNIT_VMMC:
		return tps65910_regulator_get_value(dev, &ldo_props_vmmc);
	default:
		return 0;
	}
}

static int tps65910_regulator_set_value(struct udevice *dev,
					const struct regulator_props *ldo,
					int uV)
{
	int val;
	int sel = 0;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	do {
		/* we only allow exact voltage matches */
		if (uV == *(ldo->vout + sel))
			break;
	} while (++sel < VOUT_CHOICE_COUNT);
	if (sel == VOUT_CHOICE_COUNT)
		return -EINVAL;
	if (pdata->supply < *(ldo->vin_min + sel))
		return -EINVAL;

	val = pmic_reg_read(dev->parent, ldo->reg);
	if (val < 0)
		return val;
	val &= ~TPS65910_SEL_MASK;
	val |= sel << 2;
	return pmic_reg_write(dev->parent, ldo->reg, val);
}

static int tps65910_ldo_set_value(struct udevice *dev, int uV)
{
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);
	int vin = pdata->supply;

	switch (pdata->unit) {
	case TPS65910_UNIT_VRTC:
		/* VRTC is fixed to 1.83V and can't be turned off */
		if (vin < 2500000)
			return -EINVAL;
		return 0;
	case TPS65910_UNIT_VDIG1:
		return tps65910_regulator_set_value(dev, &ldo_props_vdig1, uV);
	case TPS65910_UNIT_VDIG2:
		return tps65910_regulator_set_value(dev, &ldo_props_vdig2, uV);
	case TPS65910_UNIT_VPLL:
		return tps65910_regulator_set_value(dev, &ldo_props_vpll, uV);
	case TPS65910_UNIT_VDAC:
		return tps65910_regulator_set_value(dev, &ldo_props_vdac, uV);
	case TPS65910_UNIT_VAUX1:
		return tps65910_regulator_set_value(dev, &ldo_props_vaux1, uV);
	case TPS65910_UNIT_VAUX2:
		return tps65910_regulator_set_value(dev, &ldo_props_vaux2, uV);
	case TPS65910_UNIT_VAUX33:
		return tps65910_regulator_set_value(dev, &ldo_props_vaux33, uV);
	case TPS65910_UNIT_VMMC:
		return tps65910_regulator_set_value(dev, &ldo_props_vmmc, uV);
	default:
		return 0;
	}
}

static int tps65910_get_enable(struct udevice *dev)
{
	int reg, val;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	reg = get_ctrl_reg_from_unit_addr(pdata->unit);
	if (reg < 0)
		return reg;

	val = pmic_reg_read(dev->parent, reg);
	if (val < 0)
		return val;

	/* bits 1:0 of regulator control register define state */
	return ((val & TPS65910_SUPPLY_STATE_MASK) == 1);
}

static int tps65910_set_enable(struct udevice *dev, bool enable)
{
	int reg;
	uint clr, set;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	reg = get_ctrl_reg_from_unit_addr(pdata->unit);
	if (reg < 0)
		return reg;

	if (enable) {
		clr = TPS65910_SUPPLY_STATE_MASK & ~TPS65910_SUPPLY_STATE_ON;
		set = TPS65910_SUPPLY_STATE_MASK & TPS65910_SUPPLY_STATE_ON;
	} else {
		clr = TPS65910_SUPPLY_STATE_MASK & ~TPS65910_SUPPLY_STATE_OFF;
		set = TPS65910_SUPPLY_STATE_MASK & TPS65910_SUPPLY_STATE_OFF;
	}
	return pmic_clrsetbits(dev->parent, reg, clr, set);
}

static int buck_get_vdd1_vdd2_value(struct udevice *dev, int reg_vdd)
{
	int gain;
	int val = pmic_reg_read(dev, reg_vdd);

	if (val < 0)
		return val;
	gain = (val & TPS65910_GAIN_SEL_MASK) >> 6;
	gain = (gain == 0) ? 1 : gain;
	val = pmic_reg_read(dev, reg_vdd + 1);
	if (val < 0)
		return val;
	if (val & TPS65910_VDD_SR_MASK)
		/* use smart reflex value instead */
		val = pmic_reg_read(dev, reg_vdd + 2);
	if (val < 0)
		return val;
	return (562500 + (val & TPS65910_VDD_SEL_MASK) * 12500) * gain;
}

static int tps65910_buck_get_value(struct udevice *dev)
{
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	switch (pdata->unit) {
	case TPS65910_UNIT_VIO:
		return tps65910_regulator_get_value(dev, &smps_props_vio);
	case TPS65910_UNIT_VDD1:
		return buck_get_vdd1_vdd2_value(dev->parent, TPS65910_REG_VDD1);
	case TPS65910_UNIT_VDD2:
		return buck_get_vdd1_vdd2_value(dev->parent, TPS65910_REG_VDD2);
	default:
		return 0;
	}
}

static int buck_set_vdd1_vdd2_value(struct udevice *dev, int uV)
{
	int ret, reg_vdd, gain;
	int val;
	struct dm_regulator_uclass_plat *uc_pdata;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	switch (pdata->unit) {
	case TPS65910_UNIT_VDD1:
		reg_vdd = TPS65910_REG_VDD1;
		break;
	case TPS65910_UNIT_VDD2:
		reg_vdd = TPS65910_REG_VDD2;
		break;
	default:
		return -EINVAL;
	}
	uc_pdata = dev_get_uclass_plat(dev);

	/* check setpoint is within limits */
	if (uV < uc_pdata->min_uV) {
		pr_err("voltage %duV for %s too low\n", uV, dev->name);
		return -EINVAL;
	}
	if (uV > uc_pdata->max_uV) {
		pr_err("voltage %duV for %s too high\n", uV, dev->name);
		return -EINVAL;
	}

	val = pmic_reg_read(dev->parent, reg_vdd);
	if (val < 0)
		return val;
	gain = (val & TPS65910_GAIN_SEL_MASK) >> 6;
	gain = (gain == 0) ? 1 : gain;
	val = ((uV / gain) - 562500) / 12500;
	if (val < TPS65910_VDD_SEL_MIN || val > TPS65910_VDD_SEL_MAX)
		/*
		 * Neither do we change the gain, nor do we allow shutdown or
		 * any approximate value (for now)
		 */
		return -EPERM;
	val &= TPS65910_VDD_SEL_MASK;
	ret = pmic_reg_write(dev->parent, reg_vdd + 1, val);
	if (ret)
		return ret;
	return 0;
}

static int tps65910_buck_set_value(struct udevice *dev, int uV)
{
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	if (pdata->unit == TPS65910_UNIT_VIO)
		return tps65910_regulator_set_value(dev, &smps_props_vio, uV);

	return buck_set_vdd1_vdd2_value(dev, uV);
}

static int tps65910_boost_get_value(struct udevice *dev)
{
	int vout;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	vout = (pdata->supply >= 3000000) ? 5000000 : 0;
	return vout;
}

static int tps65910_regulator_of_to_plat(struct udevice *dev)
{
	struct udevice *supply;
	int ret;
	const char *supply_name;
	struct tps65910_regulator_pdata *pdata = dev_get_plat(dev);

	pdata->unit = dev_get_driver_data(dev);
	if (pdata->unit > TPS65910_UNIT_VMMC)
		return -EINVAL;
	supply_name = supply_names[regulator_supplies[pdata->unit]];

	debug("Looking up supply power %s\n", supply_name);
	ret = device_get_supply_regulator(dev->parent, supply_name, &supply);
	if (ret) {
		debug("  missing supply power %s\n", supply_name);
		return ret;
	}
	pdata->supply = regulator_get_value(supply);
	if (pdata->supply < 0) {
		debug("  invalid supply voltage for regulator %s\n",
		      supply->name);
		return -EINVAL;
	}

	return 0;
}

static const struct dm_regulator_ops tps65910_boost_ops = {
	.get_value  = tps65910_boost_get_value,
	.get_enable = tps65910_get_enable,
	.set_enable = tps65910_set_enable,
};

U_BOOT_DRIVER(tps65910_boost) = {
	.name = TPS65910_BOOST_DRIVER,
	.id = UCLASS_REGULATOR,
	.ops = &tps65910_boost_ops,
	.plat_auto	= sizeof(struct tps65910_regulator_pdata),
	.of_to_plat = tps65910_regulator_of_to_plat,
};

static const struct dm_regulator_ops tps65910_buck_ops = {
	.get_value  = tps65910_buck_get_value,
	.set_value  = tps65910_buck_set_value,
	.get_enable = tps65910_get_enable,
	.set_enable = tps65910_set_enable,
};

U_BOOT_DRIVER(tps65910_buck) = {
	.name = TPS65910_BUCK_DRIVER,
	.id = UCLASS_REGULATOR,
	.ops = &tps65910_buck_ops,
	.plat_auto	= sizeof(struct tps65910_regulator_pdata),
	.of_to_plat = tps65910_regulator_of_to_plat,
};

static const struct dm_regulator_ops tps65910_ldo_ops = {
	.get_value  = tps65910_ldo_get_value,
	.set_value  = tps65910_ldo_set_value,
	.get_enable = tps65910_get_enable,
	.set_enable = tps65910_set_enable,
};

U_BOOT_DRIVER(tps65910_ldo) = {
	.name = TPS65910_LDO_DRIVER,
	.id = UCLASS_REGULATOR,
	.ops = &tps65910_ldo_ops,
	.plat_auto	= sizeof(struct tps65910_regulator_pdata),
	.of_to_plat = tps65910_regulator_of_to_plat,
};
