cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lp8755.c (11953B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * LP8755 High Performance Power Management Unit : System Interface Driver
      4 * (based on rev. 0.26)
      5 * Copyright 2012 Texas Instruments
      6 *
      7 * Author: Daniel(Geon Si) Jeong <daniel.jeong@ti.com>
      8 */
      9
     10#include <linux/module.h>
     11#include <linux/slab.h>
     12#include <linux/i2c.h>
     13#include <linux/err.h>
     14#include <linux/irq.h>
     15#include <linux/interrupt.h>
     16#include <linux/gpio.h>
     17#include <linux/regmap.h>
     18#include <linux/uaccess.h>
     19#include <linux/regulator/driver.h>
     20#include <linux/regulator/machine.h>
     21#include <linux/platform_data/lp8755.h>
     22
     23#define LP8755_REG_BUCK0	0x00
     24#define LP8755_REG_BUCK1	0x03
     25#define LP8755_REG_BUCK2	0x04
     26#define LP8755_REG_BUCK3	0x01
     27#define LP8755_REG_BUCK4	0x05
     28#define LP8755_REG_BUCK5	0x02
     29#define LP8755_REG_MAX		0xFF
     30
     31#define LP8755_BUCK_EN_M	BIT(7)
     32#define LP8755_BUCK_LINEAR_OUT_MAX	0x76
     33#define LP8755_BUCK_VOUT_M	0x7F
     34
     35struct lp8755_mphase {
     36	int nreg;
     37	int buck_num[LP8755_BUCK_MAX];
     38};
     39
     40struct lp8755_chip {
     41	struct device *dev;
     42	struct regmap *regmap;
     43	struct lp8755_platform_data *pdata;
     44
     45	int irq;
     46	unsigned int irqmask;
     47
     48	int mphase;
     49	struct regulator_dev *rdev[LP8755_BUCK_MAX];
     50};
     51
     52static int lp8755_buck_enable_time(struct regulator_dev *rdev)
     53{
     54	int ret;
     55	unsigned int regval;
     56	enum lp8755_bucks id = rdev_get_id(rdev);
     57
     58	ret = regmap_read(rdev->regmap, 0x12 + id, &regval);
     59	if (ret < 0) {
     60		dev_err(&rdev->dev, "i2c access error %s\n", __func__);
     61		return ret;
     62	}
     63	return (regval & 0xff) * 100;
     64}
     65
     66static int lp8755_buck_set_mode(struct regulator_dev *rdev, unsigned int mode)
     67{
     68	int ret;
     69	unsigned int regbval = 0x0;
     70	enum lp8755_bucks id = rdev_get_id(rdev);
     71	struct lp8755_chip *pchip = rdev_get_drvdata(rdev);
     72
     73	switch (mode) {
     74	case REGULATOR_MODE_FAST:
     75		/* forced pwm mode */
     76		regbval = (0x01 << id);
     77		break;
     78	case REGULATOR_MODE_NORMAL:
     79		/* enable automatic pwm/pfm mode */
     80		ret = regmap_update_bits(rdev->regmap, 0x08 + id, 0x20, 0x00);
     81		if (ret < 0)
     82			goto err_i2c;
     83		break;
     84	case REGULATOR_MODE_IDLE:
     85		/* enable automatic pwm/pfm/lppfm mode */
     86		ret = regmap_update_bits(rdev->regmap, 0x08 + id, 0x20, 0x20);
     87		if (ret < 0)
     88			goto err_i2c;
     89
     90		ret = regmap_update_bits(rdev->regmap, 0x10, 0x01, 0x01);
     91		if (ret < 0)
     92			goto err_i2c;
     93		break;
     94	default:
     95		dev_err(pchip->dev, "Not supported buck mode %s\n", __func__);
     96		/* forced pwm mode */
     97		regbval = (0x01 << id);
     98	}
     99
    100	ret = regmap_update_bits(rdev->regmap, 0x06, 0x01 << id, regbval);
    101	if (ret < 0)
    102		goto err_i2c;
    103	return ret;
    104err_i2c:
    105	dev_err(&rdev->dev, "i2c access error %s\n", __func__);
    106	return ret;
    107}
    108
    109static unsigned int lp8755_buck_get_mode(struct regulator_dev *rdev)
    110{
    111	int ret;
    112	unsigned int regval;
    113	enum lp8755_bucks id = rdev_get_id(rdev);
    114
    115	ret = regmap_read(rdev->regmap, 0x06, &regval);
    116	if (ret < 0)
    117		goto err_i2c;
    118
    119	/* mode fast means forced pwm mode */
    120	if (regval & (0x01 << id))
    121		return REGULATOR_MODE_FAST;
    122
    123	ret = regmap_read(rdev->regmap, 0x08 + id, &regval);
    124	if (ret < 0)
    125		goto err_i2c;
    126
    127	/* mode idle means automatic pwm/pfm/lppfm mode */
    128	if (regval & 0x20)
    129		return REGULATOR_MODE_IDLE;
    130
    131	/* mode normal means automatic pwm/pfm mode */
    132	return REGULATOR_MODE_NORMAL;
    133
    134err_i2c:
    135	dev_err(&rdev->dev, "i2c access error %s\n", __func__);
    136	return 0;
    137}
    138
    139static const unsigned int lp8755_buck_ramp_table[] = {
    140	30000, 15000, 7500, 3800, 1900, 940, 470, 230
    141};
    142
    143static const struct regulator_ops lp8755_buck_ops = {
    144	.map_voltage = regulator_map_voltage_linear,
    145	.list_voltage = regulator_list_voltage_linear,
    146	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    147	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    148	.enable = regulator_enable_regmap,
    149	.disable = regulator_disable_regmap,
    150	.is_enabled = regulator_is_enabled_regmap,
    151	.enable_time = lp8755_buck_enable_time,
    152	.set_mode = lp8755_buck_set_mode,
    153	.get_mode = lp8755_buck_get_mode,
    154	.set_ramp_delay = regulator_set_ramp_delay_regmap,
    155};
    156
    157#define lp8755_rail(_id) "lp8755_buck"#_id
    158#define lp8755_buck_init(_id)\
    159{\
    160	.constraints = {\
    161		.name = lp8755_rail(_id),\
    162		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,\
    163		.min_uV = 500000,\
    164		.max_uV = 1675000,\
    165	},\
    166}
    167
    168static struct regulator_init_data lp8755_reg_default[LP8755_BUCK_MAX] = {
    169	[LP8755_BUCK0] = lp8755_buck_init(0),
    170	[LP8755_BUCK1] = lp8755_buck_init(1),
    171	[LP8755_BUCK2] = lp8755_buck_init(2),
    172	[LP8755_BUCK3] = lp8755_buck_init(3),
    173	[LP8755_BUCK4] = lp8755_buck_init(4),
    174	[LP8755_BUCK5] = lp8755_buck_init(5),
    175};
    176
    177static const struct lp8755_mphase mphase_buck[MPHASE_CONF_MAX] = {
    178	{ 3, { LP8755_BUCK0, LP8755_BUCK3, LP8755_BUCK5 } },
    179	{ 6, { LP8755_BUCK0, LP8755_BUCK1, LP8755_BUCK2, LP8755_BUCK3,
    180	       LP8755_BUCK4, LP8755_BUCK5 } },
    181	{ 5, { LP8755_BUCK0, LP8755_BUCK2, LP8755_BUCK3, LP8755_BUCK4,
    182	       LP8755_BUCK5} },
    183	{ 4, { LP8755_BUCK0, LP8755_BUCK3, LP8755_BUCK4, LP8755_BUCK5} },
    184	{ 3, { LP8755_BUCK0, LP8755_BUCK4, LP8755_BUCK5} },
    185	{ 2, { LP8755_BUCK0, LP8755_BUCK5} },
    186	{ 1, { LP8755_BUCK0} },
    187	{ 2, { LP8755_BUCK0, LP8755_BUCK3} },
    188	{ 4, { LP8755_BUCK0, LP8755_BUCK2, LP8755_BUCK3, LP8755_BUCK5} },
    189};
    190
    191static int lp8755_init_data(struct lp8755_chip *pchip)
    192{
    193	unsigned int regval;
    194	int ret, icnt, buck_num;
    195	struct lp8755_platform_data *pdata = pchip->pdata;
    196
    197	/* read back  muti-phase configuration */
    198	ret = regmap_read(pchip->regmap, 0x3D, &regval);
    199	if (ret < 0)
    200		goto out_i2c_error;
    201	pchip->mphase = regval & 0x0F;
    202
    203	/* set default data based on multi-phase config */
    204	for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) {
    205		buck_num = mphase_buck[pchip->mphase].buck_num[icnt];
    206		pdata->buck_data[buck_num] = &lp8755_reg_default[buck_num];
    207	}
    208	return ret;
    209
    210out_i2c_error:
    211	dev_err(pchip->dev, "i2c access error %s\n", __func__);
    212	return ret;
    213}
    214
    215#define lp8755_buck_desc(_id)\
    216{\
    217	.name = lp8755_rail(_id),\
    218	.id   = LP8755_BUCK##_id,\
    219	.ops  = &lp8755_buck_ops,\
    220	.n_voltages = LP8755_BUCK_LINEAR_OUT_MAX+1,\
    221	.uV_step = 10000,\
    222	.min_uV = 500000,\
    223	.type = REGULATOR_VOLTAGE,\
    224	.owner = THIS_MODULE,\
    225	.enable_reg = LP8755_REG_BUCK##_id,\
    226	.enable_mask = LP8755_BUCK_EN_M,\
    227	.vsel_reg = LP8755_REG_BUCK##_id,\
    228	.vsel_mask = LP8755_BUCK_VOUT_M,\
    229	.ramp_reg = (LP8755_BUCK##_id) + 0x7,\
    230	.ramp_mask = 0x7,\
    231	.ramp_delay_table = lp8755_buck_ramp_table,\
    232	.n_ramp_values = ARRAY_SIZE(lp8755_buck_ramp_table),\
    233}
    234
    235static const struct regulator_desc lp8755_regulators[] = {
    236	lp8755_buck_desc(0),
    237	lp8755_buck_desc(1),
    238	lp8755_buck_desc(2),
    239	lp8755_buck_desc(3),
    240	lp8755_buck_desc(4),
    241	lp8755_buck_desc(5),
    242};
    243
    244static int lp8755_regulator_init(struct lp8755_chip *pchip)
    245{
    246	int ret, icnt, buck_num;
    247	struct lp8755_platform_data *pdata = pchip->pdata;
    248	struct regulator_config rconfig = { };
    249
    250	rconfig.regmap = pchip->regmap;
    251	rconfig.dev = pchip->dev;
    252	rconfig.driver_data = pchip;
    253
    254	for (icnt = 0; icnt < mphase_buck[pchip->mphase].nreg; icnt++) {
    255		buck_num = mphase_buck[pchip->mphase].buck_num[icnt];
    256		rconfig.init_data = pdata->buck_data[buck_num];
    257		rconfig.of_node = pchip->dev->of_node;
    258		pchip->rdev[buck_num] =
    259		    devm_regulator_register(pchip->dev,
    260				    &lp8755_regulators[buck_num], &rconfig);
    261		if (IS_ERR(pchip->rdev[buck_num])) {
    262			ret = PTR_ERR(pchip->rdev[buck_num]);
    263			pchip->rdev[buck_num] = NULL;
    264			dev_err(pchip->dev, "regulator init failed: buck %d\n",
    265				buck_num);
    266			return ret;
    267		}
    268	}
    269
    270	return 0;
    271}
    272
    273static irqreturn_t lp8755_irq_handler(int irq, void *data)
    274{
    275	int ret, icnt;
    276	unsigned int flag0, flag1;
    277	struct lp8755_chip *pchip = data;
    278
    279	/* read flag0 register */
    280	ret = regmap_read(pchip->regmap, 0x0D, &flag0);
    281	if (ret < 0)
    282		goto err_i2c;
    283	/* clear flag register to pull up int. pin */
    284	ret = regmap_write(pchip->regmap, 0x0D, 0x00);
    285	if (ret < 0)
    286		goto err_i2c;
    287
    288	/* sent power fault detection event to specific regulator */
    289	for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
    290		if ((flag0 & (0x4 << icnt))
    291		    && (pchip->irqmask & (0x04 << icnt))
    292		    && (pchip->rdev[icnt] != NULL)) {
    293			regulator_notifier_call_chain(pchip->rdev[icnt],
    294						      LP8755_EVENT_PWR_FAULT,
    295						      NULL);
    296		}
    297
    298	/* read flag1 register */
    299	ret = regmap_read(pchip->regmap, 0x0E, &flag1);
    300	if (ret < 0)
    301		goto err_i2c;
    302	/* clear flag register to pull up int. pin */
    303	ret = regmap_write(pchip->regmap, 0x0E, 0x00);
    304	if (ret < 0)
    305		goto err_i2c;
    306
    307	/* send OCP event to all regulator devices */
    308	if ((flag1 & 0x01) && (pchip->irqmask & 0x01))
    309		for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
    310			if (pchip->rdev[icnt] != NULL) {
    311				regulator_notifier_call_chain(pchip->rdev[icnt],
    312							      LP8755_EVENT_OCP,
    313							      NULL);
    314			}
    315
    316	/* send OVP event to all regulator devices */
    317	if ((flag1 & 0x02) && (pchip->irqmask & 0x02))
    318		for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
    319			if (pchip->rdev[icnt] != NULL) {
    320				regulator_notifier_call_chain(pchip->rdev[icnt],
    321							      LP8755_EVENT_OVP,
    322							      NULL);
    323			}
    324	return IRQ_HANDLED;
    325
    326err_i2c:
    327	dev_err(pchip->dev, "i2c access error %s\n", __func__);
    328	return IRQ_NONE;
    329}
    330
    331static int lp8755_int_config(struct lp8755_chip *pchip)
    332{
    333	int ret;
    334	unsigned int regval;
    335
    336	if (pchip->irq == 0) {
    337		dev_warn(pchip->dev, "not use interrupt : %s\n", __func__);
    338		return 0;
    339	}
    340
    341	ret = regmap_read(pchip->regmap, 0x0F, &regval);
    342	if (ret < 0) {
    343		dev_err(pchip->dev, "i2c access error %s\n", __func__);
    344		return ret;
    345	}
    346
    347	pchip->irqmask = regval;
    348	return devm_request_threaded_irq(pchip->dev, pchip->irq, NULL,
    349					 lp8755_irq_handler,
    350					 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
    351					 "lp8755-irq", pchip);
    352}
    353
    354static const struct regmap_config lp8755_regmap = {
    355	.reg_bits = 8,
    356	.val_bits = 8,
    357	.max_register = LP8755_REG_MAX,
    358};
    359
    360static int lp8755_probe(struct i2c_client *client,
    361			const struct i2c_device_id *id)
    362{
    363	int ret, icnt;
    364	struct lp8755_chip *pchip;
    365	struct lp8755_platform_data *pdata = dev_get_platdata(&client->dev);
    366
    367	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
    368		dev_err(&client->dev, "i2c functionality check fail.\n");
    369		return -EOPNOTSUPP;
    370	}
    371
    372	pchip = devm_kzalloc(&client->dev,
    373			     sizeof(struct lp8755_chip), GFP_KERNEL);
    374	if (!pchip)
    375		return -ENOMEM;
    376
    377	pchip->dev = &client->dev;
    378	pchip->regmap = devm_regmap_init_i2c(client, &lp8755_regmap);
    379	if (IS_ERR(pchip->regmap)) {
    380		ret = PTR_ERR(pchip->regmap);
    381		dev_err(&client->dev, "fail to allocate regmap %d\n", ret);
    382		return ret;
    383	}
    384	i2c_set_clientdata(client, pchip);
    385
    386	if (pdata != NULL) {
    387		pchip->pdata = pdata;
    388		pchip->mphase = pdata->mphase;
    389	} else {
    390		pchip->pdata = devm_kzalloc(pchip->dev,
    391					    sizeof(struct lp8755_platform_data),
    392					    GFP_KERNEL);
    393		if (!pchip->pdata)
    394			return -ENOMEM;
    395		ret = lp8755_init_data(pchip);
    396		if (ret < 0) {
    397			dev_err(&client->dev, "fail to initialize chip\n");
    398			return ret;
    399		}
    400	}
    401
    402	ret = lp8755_regulator_init(pchip);
    403	if (ret < 0) {
    404		dev_err(&client->dev, "fail to initialize regulators\n");
    405		goto err;
    406	}
    407
    408	pchip->irq = client->irq;
    409	ret = lp8755_int_config(pchip);
    410	if (ret < 0) {
    411		dev_err(&client->dev, "fail to irq config\n");
    412		goto err;
    413	}
    414
    415	return ret;
    416
    417err:
    418	/* output disable */
    419	for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
    420		regmap_write(pchip->regmap, icnt, 0x00);
    421
    422	return ret;
    423}
    424
    425static int lp8755_remove(struct i2c_client *client)
    426{
    427	int icnt;
    428	struct lp8755_chip *pchip = i2c_get_clientdata(client);
    429
    430	for (icnt = 0; icnt < LP8755_BUCK_MAX; icnt++)
    431		regmap_write(pchip->regmap, icnt, 0x00);
    432
    433	return 0;
    434}
    435
    436static const struct i2c_device_id lp8755_id[] = {
    437	{LP8755_NAME, 0},
    438	{}
    439};
    440
    441MODULE_DEVICE_TABLE(i2c, lp8755_id);
    442
    443static struct i2c_driver lp8755_i2c_driver = {
    444	.driver = {
    445		   .name = LP8755_NAME,
    446		   },
    447	.probe = lp8755_probe,
    448	.remove = lp8755_remove,
    449	.id_table = lp8755_id,
    450};
    451
    452static int __init lp8755_init(void)
    453{
    454	return i2c_add_driver(&lp8755_i2c_driver);
    455}
    456
    457subsys_initcall(lp8755_init);
    458
    459static void __exit lp8755_exit(void)
    460{
    461	i2c_del_driver(&lp8755_i2c_driver);
    462}
    463
    464module_exit(lp8755_exit);
    465
    466MODULE_DESCRIPTION("Texas Instruments lp8755 driver");
    467MODULE_AUTHOR("Daniel Jeong <daniel.jeong@ti.com>");
    468MODULE_LICENSE("GPL v2");