/*
 * Regulator driver for TI TPS65912x PMICs
 *
 * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
 *	Andrew F. Davis <afd@ti.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
 * kind, whether expressed or implied; without even the implied warranty
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License version 2 for more details.
 *
 * Based on the TPS65218 driver and the previous TPS65912 driver by
 * Margarita Olaya Cabrera <magi@slimlogic.co.uk>
 */

#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>

#include <linux/mfd/tps65912.h>

enum tps65912_regulators { DCDC1, DCDC2, DCDC3, DCDC4, LDO1, LDO2, LDO3,
	LDO4, LDO5, LDO6, LDO7, LDO8, LDO9, LDO10 };

#define TPS65912_REGULATOR(_name, _id, _of_match, _ops, _vr, _er, _lr)	\
	[_id] = {							\
		.name			= _name,			\
		.of_match		= _of_match,			\
		.regulators_node	= "regulators",			\
		.id			= _id,				\
		.ops			= &_ops,			\
		.n_voltages		= 64,				\
		.type			= REGULATOR_VOLTAGE,		\
		.owner			= THIS_MODULE,			\
		.vsel_reg		= _vr,				\
		.vsel_mask		= 0x3f,				\
		.enable_reg		= _er,				\
		.enable_mask		= BIT(7),			\
		.volt_table		= NULL,				\
		.linear_ranges		= _lr,				\
		.n_linear_ranges	= ARRAY_SIZE(_lr),		\
	}

static const struct regulator_linear_range tps65912_dcdc_ranges[] = {
	REGULATOR_LINEAR_RANGE(500000, 0x0, 0x3f, 50000),
};

static const struct regulator_linear_range tps65912_ldo_ranges[] = {
	REGULATOR_LINEAR_RANGE(800000, 0x0, 0x20, 25000),
	REGULATOR_LINEAR_RANGE(1650000, 0x21, 0x3c, 50000),
	REGULATOR_LINEAR_RANGE(3100000, 0x3d, 0x3f, 100000),
};

/* Operations permitted on DCDCx */
static struct regulator_ops tps65912_ops_dcdc = {
	.is_enabled		= regulator_is_enabled_regmap,
	.enable			= regulator_enable_regmap,
	.disable		= regulator_disable_regmap,
	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
	.list_voltage		= regulator_list_voltage_linear_range,
};

/* Operations permitted on LDOx */
static struct regulator_ops tps65912_ops_ldo = {
	.is_enabled		= regulator_is_enabled_regmap,
	.enable			= regulator_enable_regmap,
	.disable		= regulator_disable_regmap,
	.get_voltage_sel	= regulator_get_voltage_sel_regmap,
	.set_voltage_sel	= regulator_set_voltage_sel_regmap,
	.list_voltage		= regulator_list_voltage_linear_range,
	.map_voltage		= regulator_map_voltage_linear_range,
};

static const struct regulator_desc regulators[] = {
	TPS65912_REGULATOR("DCDC1", DCDC1, "dcdc1", tps65912_ops_dcdc,
			   TPS65912_DCDC1_OP, TPS65912_DCDC1_CTRL,
			   tps65912_dcdc_ranges),
	TPS65912_REGULATOR("DCDC2", DCDC2, "dcdc2", tps65912_ops_dcdc,
			   TPS65912_DCDC2_OP, TPS65912_DCDC2_CTRL,
			   tps65912_dcdc_ranges),
	TPS65912_REGULATOR("DCDC3", DCDC3, "dcdc3", tps65912_ops_dcdc,
			   TPS65912_DCDC3_OP, TPS65912_DCDC3_CTRL,
			   tps65912_dcdc_ranges),
	TPS65912_REGULATOR("DCDC4", DCDC4, "dcdc4", tps65912_ops_dcdc,
			   TPS65912_DCDC4_OP, TPS65912_DCDC4_CTRL,
			   tps65912_dcdc_ranges),
	TPS65912_REGULATOR("LDO1", LDO1, "ldo1", tps65912_ops_ldo,
			   TPS65912_LDO1_OP, TPS65912_LDO1_AVS,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO2", LDO2, "ldo2", tps65912_ops_ldo,
			   TPS65912_LDO2_OP, TPS65912_LDO2_AVS,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO3", LDO3, "ldo3", tps65912_ops_ldo,
			   TPS65912_LDO3_OP, TPS65912_LDO3_AVS,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO4", LDO4, "ldo4", tps65912_ops_ldo,
			   TPS65912_LDO4_OP, TPS65912_LDO4_AVS,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO5", LDO5, "ldo5", tps65912_ops_ldo,
			   TPS65912_LDO5, TPS65912_LDO5,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO6", LDO6, "ldo6", tps65912_ops_ldo,
			   TPS65912_LDO6, TPS65912_LDO6,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO7", LDO7, "ldo7", tps65912_ops_ldo,
			   TPS65912_LDO7, TPS65912_LDO7,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO8", LDO8, "ldo8", tps65912_ops_ldo,
			   TPS65912_LDO8, TPS65912_LDO8,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO9", LDO9, "ldo9", tps65912_ops_ldo,
			   TPS65912_LDO9, TPS65912_LDO9,
			   tps65912_ldo_ranges),
	TPS65912_REGULATOR("LDO10", LDO10, "ldo10", tps65912_ops_ldo,
			   TPS65912_LDO10, TPS65912_LDO10,
			   tps65912_ldo_ranges),
};

static int tps65912_regulator_probe(struct platform_device *pdev)
{
	struct tps65912 *tps = dev_get_drvdata(pdev->dev.parent);
	struct regulator_config config = { };
	struct regulator_dev *rdev;
	int i;

	platform_set_drvdata(pdev, tps);

	config.dev = &pdev->dev;
	config.driver_data = tps;
	config.dev->of_node = tps->dev->of_node;
	config.regmap = tps->regmap;

	for (i = 0; i < ARRAY_SIZE(regulators); i++) {
		rdev = devm_regulator_register(&pdev->dev, &regulators[i],
					       &config);
		if (IS_ERR(rdev)) {
			dev_err(tps->dev, "failed to register %s regulator\n",
				pdev->name);
			return PTR_ERR(rdev);
		}
	}

	return 0;
}

static const struct platform_device_id tps65912_regulator_id_table[] = {
	{ "tps65912-regulator", },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(platform, tps65912_regulator_id_table);

static struct platform_driver tps65912_regulator_driver = {
	.driver = {
		.name = "tps65912-regulator",
	},
	.probe = tps65912_regulator_probe,
	.id_table = tps65912_regulator_id_table,
};
module_platform_driver(tps65912_regulator_driver);

MODULE_AUTHOR("Andrew F. Davis <afd@ti.com>");
MODULE_DESCRIPTION("TPS65912 voltage regulator driver");
MODULE_LICENSE("GPL v2");
