13c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu/*
23c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * Core driver interface for TI TPS65090 PMIC family
33c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu *
43c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * Copyright (C) 2012 NVIDIA Corporation
53c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu *
63c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * This program is free software; you can redistribute it and/or modify
73c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * it under the terms of the GNU General Public License as published by
83c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * the Free Software Foundation; either version 2 of the License, or
93c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * (at your option) any later version.
103c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu *
113c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * This program is distributed in the hope that it will be useful, but WITHOUT
123c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
133c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
143c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * more details.
153c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu *
163c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * You should have received a copy of the GNU General Public License along
173c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * with this program; if not, write to the Free Software Foundation, Inc.,
183c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
193c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu *
203c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu */
213c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu
223c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu#ifndef __LINUX_MFD_TPS65090_H
233c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu#define __LINUX_MFD_TPS65090_H
243c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu
2506c4998be96f2e1f304cf79d5e9d1662d864f7d1Axel Lin#include <linux/irq.h>
26b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan#include <linux/regmap.h>
2706c4998be96f2e1f304cf79d5e9d1662d864f7d1Axel Lin
28759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan/* TPS65090 IRQs */
29759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewanganenum {
30751391c74f3d41a8d5c5dd5100385f723660c368Rhyland Klein	TPS65090_IRQ_INTERRUPT,
31759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_VAC_STATUS_CHANGE,
32759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_VSYS_STATUS_CHANGE,
33759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_BAT_STATUS_CHANGE,
34759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_CHARGING_STATUS_CHANGE,
35759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_CHARGING_COMPLETE,
36759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_DCDC1,
37759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_DCDC2,
38759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_DCDC3,
39759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET1,
40759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET2,
41759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET3,
42759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET4,
43759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET5,
44759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET6,
45759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	TPS65090_IRQ_OVERLOAD_FET7,
46759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan};
4706c4998be96f2e1f304cf79d5e9d1662d864f7d1Axel Lin
4824282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan/* TPS65090 Regulator ID */
4924282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewanganenum {
508620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_DCDC1,
518620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_DCDC2,
528620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_DCDC3,
538620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET1,
548620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET2,
558620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET3,
568620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET4,
578620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET5,
588620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET6,
598620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_FET7,
603a81ef8c27cea5c749a45765da4e06a7af75be2bLaxman Dewangan	TPS65090_REGULATOR_LDO1,
613a81ef8c27cea5c749a45765da4e06a7af75be2bLaxman Dewangan	TPS65090_REGULATOR_LDO2,
6224282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan
6324282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan	/* Last entry for maximum ID */
648620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	TPS65090_REGULATOR_MAX,
6524282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan};
6624282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan
67c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson/* Register addresses */
68c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_INTR_STS	0x00
69c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_INTR_STS2	0x01
70c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_INTR_MASK	0x02
71c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_INTR_MASK2	0x03
72c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_CTRL0	0x04
73c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_CTRL1	0x05
74c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_CTRL2	0x06
75c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_CTRL3	0x07
76c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_CTRL4	0x08
77c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_CTRL5	0x09
78c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_STATUS1	0x0a
79c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson#define TPS65090_REG_CG_STATUS2	0x0b
80c42ba72ec3a7a1b6aa30122931f1f4b91b601c31Doug Anderson
8106c4998be96f2e1f304cf79d5e9d1662d864f7d1Axel Linstruct tps65090 {
8206c4998be96f2e1f304cf79d5e9d1662d864f7d1Axel Lin	struct device		*dev;
8306c4998be96f2e1f304cf79d5e9d1662d864f7d1Axel Lin	struct regmap		*rmap;
84759f2598ef3876637e40d99a4ceb7a3d83a4d8d3Laxman Dewangan	struct regmap_irq_chip_data *irq_data;
853c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu};
863c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu
8724282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan/*
8824282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan * struct tps65090_regulator_plat_data
8924282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan *
9024282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan * @reg_init_data: The regulator init data.
91f329b1755b475f64f0472cda1ae9602e092f6f05Laxman Dewangan * @enable_ext_control: Enable extrenal control or not. Only available for
92f329b1755b475f64f0472cda1ae9602e092f6f05Laxman Dewangan *     DCDC1, DCDC2 and DCDC3.
93f329b1755b475f64f0472cda1ae9602e092f6f05Laxman Dewangan * @gpio: Gpio number if external control is enabled and controlled through
94f329b1755b475f64f0472cda1ae9602e092f6f05Laxman Dewangan *     gpio.
95290414499cf94284a97cc3c33214d13ccfcd896aDoug Anderson * @overcurrent_wait_valid: True if the overcurrent_wait should be applied.
96290414499cf94284a97cc3c33214d13ccfcd896aDoug Anderson * @overcurrent_wait: Value to set as the overcurrent wait time.  This is the
97290414499cf94284a97cc3c33214d13ccfcd896aDoug Anderson *     actual bitfield value, not a time in ms (valid value are 0 - 3).
9824282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan */
9924282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewanganstruct tps65090_regulator_plat_data {
10024282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan	struct regulator_init_data *reg_init_data;
101f329b1755b475f64f0472cda1ae9602e092f6f05Laxman Dewangan	bool enable_ext_control;
102f329b1755b475f64f0472cda1ae9602e092f6f05Laxman Dewangan	int gpio;
103290414499cf94284a97cc3c33214d13ccfcd896aDoug Anderson	bool overcurrent_wait_valid;
104290414499cf94284a97cc3c33214d13ccfcd896aDoug Anderson	int overcurrent_wait;
10524282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan};
10624282a1ca33b4a2cdfb907fb7a3ba4d0f6e93311Laxman Dewangan
1073c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasustruct tps65090_platform_data {
1083c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu	int irq_base;
1096f8da5df8c451103e0043f73a00c90676da6be9eRhyland Klein
1106f8da5df8c451103e0043f73a00c90676da6be9eRhyland Klein	char **supplied_to;
1116f8da5df8c451103e0043f73a00c90676da6be9eRhyland Klein	size_t num_supplicants;
1126f8da5df8c451103e0043f73a00c90676da6be9eRhyland Klein	int enable_low_current_chrg;
1136f8da5df8c451103e0043f73a00c90676da6be9eRhyland Klein
1148620ca9f77b71a0069a6151e859b988117ef1fa5Laxman Dewangan	struct tps65090_regulator_plat_data *reg_pdata[TPS65090_REGULATOR_MAX];
1153c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu};
1163c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu
1173c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu/*
1183c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * NOTE: the functions below are not intended for use outside
1193c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu * of the TPS65090 sub-device drivers
1203c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu */
121b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewanganstatic inline int tps65090_write(struct device *dev, int reg, uint8_t val)
122b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan{
123b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	struct tps65090 *tps = dev_get_drvdata(dev);
124b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
125b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	return regmap_write(tps->rmap, reg, val);
126b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan}
127b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
128b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewanganstatic inline int tps65090_read(struct device *dev, int reg, uint8_t *val)
129b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan{
130b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	struct tps65090 *tps = dev_get_drvdata(dev);
131b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	unsigned int temp_val;
132b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	int ret;
133b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
134b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	ret = regmap_read(tps->rmap, reg, &temp_val);
135b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	if (!ret)
136b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan		*val = temp_val;
137b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	return ret;
138b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan}
139b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
140b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewanganstatic inline int tps65090_set_bits(struct device *dev, int reg,
141b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan		uint8_t bit_num)
142b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan{
143b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	struct tps65090 *tps = dev_get_drvdata(dev);
144b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
145b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	return regmap_update_bits(tps->rmap, reg, BIT(bit_num), ~0u);
146b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan}
147b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
148b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewanganstatic inline int tps65090_clr_bits(struct device *dev, int reg,
149b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan		uint8_t bit_num)
150b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan{
151b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	struct tps65090 *tps = dev_get_drvdata(dev);
152b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan
153b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan	return regmap_update_bits(tps->rmap, reg, BIT(bit_num), 0u);
154b9c79323166530a14c1fa8c10337eeaa54e3f98dLaxman Dewangan}
1553c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu
1563c33be06f9aa0949ad24e67dfcae1f2a3006f4e1Venu Byravarasu#endif /*__LINUX_MFD_TPS65090_H */
157