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