xref: /openbmc/linux/drivers/mfd/tps65090.c (revision 1d88f7a0)
13c33be06SVenu Byravarasu /*
23c33be06SVenu Byravarasu  * Core driver for TI TPS65090 PMIC family
33c33be06SVenu Byravarasu  *
43c33be06SVenu Byravarasu  * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
53c33be06SVenu Byravarasu 
63c33be06SVenu Byravarasu  * This program is free software; you can redistribute it and/or modify it
73c33be06SVenu Byravarasu  * under the terms and conditions of the GNU General Public License,
83c33be06SVenu Byravarasu  * version 2, as published by the Free Software Foundation.
93c33be06SVenu Byravarasu 
103c33be06SVenu Byravarasu  * This program is distributed in the hope it will be useful, but WITHOUT
113c33be06SVenu Byravarasu  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
123c33be06SVenu Byravarasu  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
133c33be06SVenu Byravarasu  * more details.
143c33be06SVenu Byravarasu 
153c33be06SVenu Byravarasu  * You should have received a copy of the GNU General Public License
163c33be06SVenu Byravarasu  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
173c33be06SVenu Byravarasu  */
183c33be06SVenu Byravarasu 
193c33be06SVenu Byravarasu #include <linux/interrupt.h>
203c33be06SVenu Byravarasu #include <linux/irq.h>
213c33be06SVenu Byravarasu #include <linux/kernel.h>
223c33be06SVenu Byravarasu #include <linux/module.h>
233c33be06SVenu Byravarasu #include <linux/mutex.h>
243c33be06SVenu Byravarasu #include <linux/slab.h>
253c33be06SVenu Byravarasu #include <linux/i2c.h>
263c33be06SVenu Byravarasu #include <linux/mfd/core.h>
273c33be06SVenu Byravarasu #include <linux/mfd/tps65090.h>
283c33be06SVenu Byravarasu #include <linux/regmap.h>
293c33be06SVenu Byravarasu #include <linux/err.h>
303c33be06SVenu Byravarasu 
313c33be06SVenu Byravarasu #define NUM_INT_REG 2
323c33be06SVenu Byravarasu #define TOTAL_NUM_REG 0x18
333c33be06SVenu Byravarasu 
343c33be06SVenu Byravarasu /* interrupt status registers */
353c33be06SVenu Byravarasu #define TPS65090_INT_STS	0x0
363c33be06SVenu Byravarasu #define TPS65090_INT_STS2	0x1
373c33be06SVenu Byravarasu 
383c33be06SVenu Byravarasu /* interrupt mask registers */
393c33be06SVenu Byravarasu #define TPS65090_INT_MSK	0x2
403c33be06SVenu Byravarasu #define TPS65090_INT_MSK2	0x3
413c33be06SVenu Byravarasu 
423c33be06SVenu Byravarasu struct tps65090_irq_data {
433c33be06SVenu Byravarasu 	u8		mask_reg;
443c33be06SVenu Byravarasu 	u8		mask_pos;
453c33be06SVenu Byravarasu };
463c33be06SVenu Byravarasu 
473c33be06SVenu Byravarasu #define TPS65090_IRQ(_reg, _mask_pos)		\
483c33be06SVenu Byravarasu 	{					\
493c33be06SVenu Byravarasu 		.mask_reg	= (_reg),	\
503c33be06SVenu Byravarasu 		.mask_pos	= (_mask_pos),	\
513c33be06SVenu Byravarasu 	}
523c33be06SVenu Byravarasu 
533c33be06SVenu Byravarasu static const struct tps65090_irq_data tps65090_irqs[] = {
543c33be06SVenu Byravarasu 	[0]		= TPS65090_IRQ(0, 0),
553c33be06SVenu Byravarasu 	[1]		= TPS65090_IRQ(0, 1),
563c33be06SVenu Byravarasu 	[2]		= TPS65090_IRQ(0, 2),
573c33be06SVenu Byravarasu 	[3]		= TPS65090_IRQ(0, 3),
583c33be06SVenu Byravarasu 	[4]		= TPS65090_IRQ(0, 4),
593c33be06SVenu Byravarasu 	[5]		= TPS65090_IRQ(0, 5),
603c33be06SVenu Byravarasu 	[6]		= TPS65090_IRQ(0, 6),
613c33be06SVenu Byravarasu 	[7]		= TPS65090_IRQ(0, 7),
623c33be06SVenu Byravarasu 	[8]		= TPS65090_IRQ(1, 0),
633c33be06SVenu Byravarasu 	[9]		= TPS65090_IRQ(1, 1),
643c33be06SVenu Byravarasu 	[10]		= TPS65090_IRQ(1, 2),
653c33be06SVenu Byravarasu 	[11]		= TPS65090_IRQ(1, 3),
663c33be06SVenu Byravarasu 	[12]		= TPS65090_IRQ(1, 4),
673c33be06SVenu Byravarasu 	[13]		= TPS65090_IRQ(1, 5),
683c33be06SVenu Byravarasu 	[14]		= TPS65090_IRQ(1, 6),
693c33be06SVenu Byravarasu 	[15]		= TPS65090_IRQ(1, 7),
703c33be06SVenu Byravarasu };
713c33be06SVenu Byravarasu 
723c33be06SVenu Byravarasu static struct mfd_cell tps65090s[] = {
733c33be06SVenu Byravarasu 	{
743c33be06SVenu Byravarasu 		.name = "tps65910-pmic",
753c33be06SVenu Byravarasu 	},
763c33be06SVenu Byravarasu 	{
773c33be06SVenu Byravarasu 		.name = "tps65910-regulator",
783c33be06SVenu Byravarasu 	},
793c33be06SVenu Byravarasu };
803c33be06SVenu Byravarasu 
813c33be06SVenu Byravarasu struct tps65090 {
823c33be06SVenu Byravarasu 	struct mutex		lock;
833c33be06SVenu Byravarasu 	struct device		*dev;
843c33be06SVenu Byravarasu 	struct i2c_client	*client;
853c33be06SVenu Byravarasu 	struct regmap		*rmap;
863c33be06SVenu Byravarasu 	struct irq_chip		irq_chip;
873c33be06SVenu Byravarasu 	struct mutex		irq_lock;
883c33be06SVenu Byravarasu 	int			irq_base;
893c33be06SVenu Byravarasu 	unsigned int		id;
903c33be06SVenu Byravarasu };
913c33be06SVenu Byravarasu 
923c33be06SVenu Byravarasu int tps65090_write(struct device *dev, int reg, uint8_t val)
933c33be06SVenu Byravarasu {
943c33be06SVenu Byravarasu 	struct tps65090 *tps = dev_get_drvdata(dev);
953c33be06SVenu Byravarasu 	return regmap_write(tps->rmap, reg, val);
963c33be06SVenu Byravarasu }
973c33be06SVenu Byravarasu EXPORT_SYMBOL_GPL(tps65090_write);
983c33be06SVenu Byravarasu 
993c33be06SVenu Byravarasu int tps65090_read(struct device *dev, int reg, uint8_t *val)
1003c33be06SVenu Byravarasu {
1013c33be06SVenu Byravarasu 	struct tps65090 *tps = dev_get_drvdata(dev);
1023c33be06SVenu Byravarasu 	unsigned int temp_val;
1033c33be06SVenu Byravarasu 	int ret;
1043c33be06SVenu Byravarasu 	ret = regmap_read(tps->rmap, reg, &temp_val);
1053c33be06SVenu Byravarasu 	if (!ret)
1063c33be06SVenu Byravarasu 		*val = temp_val;
1073c33be06SVenu Byravarasu 	return ret;
1083c33be06SVenu Byravarasu }
1093c33be06SVenu Byravarasu EXPORT_SYMBOL_GPL(tps65090_read);
1103c33be06SVenu Byravarasu 
1113c33be06SVenu Byravarasu int tps65090_set_bits(struct device *dev, int reg, uint8_t bit_num)
1123c33be06SVenu Byravarasu {
1133c33be06SVenu Byravarasu 	struct tps65090 *tps = dev_get_drvdata(dev);
1143c33be06SVenu Byravarasu 	return regmap_update_bits(tps->rmap, reg, BIT(bit_num), ~0u);
1153c33be06SVenu Byravarasu }
1163c33be06SVenu Byravarasu EXPORT_SYMBOL_GPL(tps65090_set_bits);
1173c33be06SVenu Byravarasu 
1183c33be06SVenu Byravarasu int tps65090_clr_bits(struct device *dev, int reg, uint8_t bit_num)
1193c33be06SVenu Byravarasu {
1203c33be06SVenu Byravarasu 	struct tps65090 *tps = dev_get_drvdata(dev);
1213c33be06SVenu Byravarasu 	return regmap_update_bits(tps->rmap, reg, BIT(bit_num), 0u);
1223c33be06SVenu Byravarasu }
1233c33be06SVenu Byravarasu EXPORT_SYMBOL_GPL(tps65090_clr_bits);
1243c33be06SVenu Byravarasu 
1253c33be06SVenu Byravarasu static void tps65090_irq_lock(struct irq_data *data)
1263c33be06SVenu Byravarasu {
1273c33be06SVenu Byravarasu 	struct tps65090 *tps65090 = irq_data_get_irq_chip_data(data);
1283c33be06SVenu Byravarasu 
1293c33be06SVenu Byravarasu 	mutex_lock(&tps65090->irq_lock);
1303c33be06SVenu Byravarasu }
1313c33be06SVenu Byravarasu 
1323c33be06SVenu Byravarasu static void tps65090_irq_mask(struct irq_data *irq_data)
1333c33be06SVenu Byravarasu {
1343c33be06SVenu Byravarasu 	struct tps65090 *tps65090 = irq_data_get_irq_chip_data(irq_data);
1353c33be06SVenu Byravarasu 	unsigned int __irq = irq_data->hwirq;
1363c33be06SVenu Byravarasu 	const struct tps65090_irq_data *data = &tps65090_irqs[__irq];
1373c33be06SVenu Byravarasu 
1383c33be06SVenu Byravarasu 	tps65090_set_bits(tps65090->dev, (TPS65090_INT_MSK + data->mask_reg),
1393c33be06SVenu Byravarasu 		data->mask_pos);
1403c33be06SVenu Byravarasu }
1413c33be06SVenu Byravarasu 
1423c33be06SVenu Byravarasu static void tps65090_irq_unmask(struct irq_data *irq_data)
1433c33be06SVenu Byravarasu {
1443c33be06SVenu Byravarasu 	struct tps65090 *tps65090 = irq_data_get_irq_chip_data(irq_data);
1453c33be06SVenu Byravarasu 	unsigned int __irq = irq_data->irq - tps65090->irq_base;
1463c33be06SVenu Byravarasu 	const struct tps65090_irq_data *data = &tps65090_irqs[__irq];
1473c33be06SVenu Byravarasu 
1483c33be06SVenu Byravarasu 	tps65090_clr_bits(tps65090->dev, (TPS65090_INT_MSK + data->mask_reg),
1493c33be06SVenu Byravarasu 		data->mask_pos);
1503c33be06SVenu Byravarasu }
1513c33be06SVenu Byravarasu 
1523c33be06SVenu Byravarasu static void tps65090_irq_sync_unlock(struct irq_data *data)
1533c33be06SVenu Byravarasu {
1543c33be06SVenu Byravarasu 	struct tps65090 *tps65090 = irq_data_get_irq_chip_data(data);
1553c33be06SVenu Byravarasu 
1563c33be06SVenu Byravarasu 	mutex_unlock(&tps65090->irq_lock);
1573c33be06SVenu Byravarasu }
1583c33be06SVenu Byravarasu 
1593c33be06SVenu Byravarasu static irqreturn_t tps65090_irq(int irq, void *data)
1603c33be06SVenu Byravarasu {
1613c33be06SVenu Byravarasu 	struct tps65090 *tps65090 = data;
1623c33be06SVenu Byravarasu 	int ret = 0;
1633c33be06SVenu Byravarasu 	u8 status, mask;
1643c33be06SVenu Byravarasu 	unsigned long int acks = 0;
1653c33be06SVenu Byravarasu 	int i;
1663c33be06SVenu Byravarasu 
1673c33be06SVenu Byravarasu 	for (i = 0; i < NUM_INT_REG; i++) {
1683c33be06SVenu Byravarasu 		ret = tps65090_read(tps65090->dev, TPS65090_INT_MSK + i, &mask);
1693c33be06SVenu Byravarasu 		if (ret < 0) {
1703c33be06SVenu Byravarasu 			dev_err(tps65090->dev,
1713c33be06SVenu Byravarasu 				"failed to read mask reg [addr:%d]\n",
1723c33be06SVenu Byravarasu 				TPS65090_INT_MSK + i);
1733c33be06SVenu Byravarasu 			return IRQ_NONE;
1743c33be06SVenu Byravarasu 		}
1753c33be06SVenu Byravarasu 		ret = tps65090_read(tps65090->dev, TPS65090_INT_STS + i,
1763c33be06SVenu Byravarasu 			&status);
1773c33be06SVenu Byravarasu 		if (ret < 0) {
1783c33be06SVenu Byravarasu 			dev_err(tps65090->dev,
1793c33be06SVenu Byravarasu 				"failed to read status reg [addr:%d]\n",
1803c33be06SVenu Byravarasu 				 TPS65090_INT_STS + i);
1813c33be06SVenu Byravarasu 			return IRQ_NONE;
1823c33be06SVenu Byravarasu 		}
1833c33be06SVenu Byravarasu 		if (status) {
1843c33be06SVenu Byravarasu 			/* Ack only those interrupts which are not masked */
1853c33be06SVenu Byravarasu 			status &= (~mask);
1863c33be06SVenu Byravarasu 			ret = tps65090_write(tps65090->dev,
1873c33be06SVenu Byravarasu 					TPS65090_INT_STS + i, status);
1883c33be06SVenu Byravarasu 			if (ret < 0) {
1893c33be06SVenu Byravarasu 				dev_err(tps65090->dev,
1903c33be06SVenu Byravarasu 					"failed to write interrupt status\n");
1913c33be06SVenu Byravarasu 				return IRQ_NONE;
1923c33be06SVenu Byravarasu 			}
1933c33be06SVenu Byravarasu 			acks |= (status << (i * 8));
1943c33be06SVenu Byravarasu 		}
1953c33be06SVenu Byravarasu 	}
1963c33be06SVenu Byravarasu 
1973c33be06SVenu Byravarasu 	for_each_set_bit(i, &acks, ARRAY_SIZE(tps65090_irqs))
1983c33be06SVenu Byravarasu 		handle_nested_irq(tps65090->irq_base + i);
1993c33be06SVenu Byravarasu 	return acks ? IRQ_HANDLED : IRQ_NONE;
2003c33be06SVenu Byravarasu }
2013c33be06SVenu Byravarasu 
2023c33be06SVenu Byravarasu static int __devinit tps65090_irq_init(struct tps65090 *tps65090, int irq,
2033c33be06SVenu Byravarasu 	int irq_base)
2043c33be06SVenu Byravarasu {
2053c33be06SVenu Byravarasu 	int i, ret;
2063c33be06SVenu Byravarasu 
2073c33be06SVenu Byravarasu 	if (!irq_base) {
2083c33be06SVenu Byravarasu 		dev_err(tps65090->dev, "IRQ base not set\n");
2093c33be06SVenu Byravarasu 		return -EINVAL;
2103c33be06SVenu Byravarasu 	}
2113c33be06SVenu Byravarasu 
2123c33be06SVenu Byravarasu 	mutex_init(&tps65090->irq_lock);
2133c33be06SVenu Byravarasu 
2143c33be06SVenu Byravarasu 	for (i = 0; i < NUM_INT_REG; i++)
2153c33be06SVenu Byravarasu 		tps65090_write(tps65090->dev, TPS65090_INT_MSK + i, 0xFF);
2163c33be06SVenu Byravarasu 
2173c33be06SVenu Byravarasu 	for (i = 0; i < NUM_INT_REG; i++)
2183c33be06SVenu Byravarasu 		tps65090_write(tps65090->dev, TPS65090_INT_STS + i, 0xff);
2193c33be06SVenu Byravarasu 
2203c33be06SVenu Byravarasu 	tps65090->irq_base = irq_base;
2213c33be06SVenu Byravarasu 	tps65090->irq_chip.name = "tps65090";
2223c33be06SVenu Byravarasu 	tps65090->irq_chip.irq_mask = tps65090_irq_mask;
2233c33be06SVenu Byravarasu 	tps65090->irq_chip.irq_unmask = tps65090_irq_unmask;
2243c33be06SVenu Byravarasu 	tps65090->irq_chip.irq_bus_lock = tps65090_irq_lock;
2253c33be06SVenu Byravarasu 	tps65090->irq_chip.irq_bus_sync_unlock = tps65090_irq_sync_unlock;
2263c33be06SVenu Byravarasu 
2273c33be06SVenu Byravarasu 	for (i = 0; i < ARRAY_SIZE(tps65090_irqs); i++) {
2283c33be06SVenu Byravarasu 		int __irq = i + tps65090->irq_base;
2293c33be06SVenu Byravarasu 		irq_set_chip_data(__irq, tps65090);
2303c33be06SVenu Byravarasu 		irq_set_chip_and_handler(__irq, &tps65090->irq_chip,
2313c33be06SVenu Byravarasu 					 handle_simple_irq);
2323c33be06SVenu Byravarasu 		irq_set_nested_thread(__irq, 1);
2333c33be06SVenu Byravarasu #ifdef CONFIG_ARM
2343c33be06SVenu Byravarasu 		set_irq_flags(__irq, IRQF_VALID);
2353c33be06SVenu Byravarasu #endif
2363c33be06SVenu Byravarasu 	}
2373c33be06SVenu Byravarasu 
2383c33be06SVenu Byravarasu 	ret = request_threaded_irq(irq, NULL, tps65090_irq, IRQF_ONESHOT,
2393c33be06SVenu Byravarasu 				"tps65090", tps65090);
2403c33be06SVenu Byravarasu 	if (!ret) {
2413c33be06SVenu Byravarasu 		device_init_wakeup(tps65090->dev, 1);
2423c33be06SVenu Byravarasu 		enable_irq_wake(irq);
2433c33be06SVenu Byravarasu 	}
2443c33be06SVenu Byravarasu 
2453c33be06SVenu Byravarasu 	return ret;
2463c33be06SVenu Byravarasu }
2473c33be06SVenu Byravarasu 
2483c33be06SVenu Byravarasu static bool is_volatile_reg(struct device *dev, unsigned int reg)
2493c33be06SVenu Byravarasu {
2503c33be06SVenu Byravarasu 	if ((reg == TPS65090_INT_STS) || (reg == TPS65090_INT_STS))
2513c33be06SVenu Byravarasu 		return true;
2523c33be06SVenu Byravarasu 	else
2533c33be06SVenu Byravarasu 		return false;
2543c33be06SVenu Byravarasu }
2553c33be06SVenu Byravarasu 
2563c33be06SVenu Byravarasu static const struct regmap_config tps65090_regmap_config = {
2573c33be06SVenu Byravarasu 	.reg_bits = 8,
2583c33be06SVenu Byravarasu 	.val_bits = 8,
2593c33be06SVenu Byravarasu 	.max_register = TOTAL_NUM_REG,
2603c33be06SVenu Byravarasu 	.num_reg_defaults_raw = TOTAL_NUM_REG,
2613c33be06SVenu Byravarasu 	.cache_type = REGCACHE_RBTREE,
2623c33be06SVenu Byravarasu 	.volatile_reg = is_volatile_reg,
2633c33be06SVenu Byravarasu };
2643c33be06SVenu Byravarasu 
2653c33be06SVenu Byravarasu static int __devinit tps65090_i2c_probe(struct i2c_client *client,
2663c33be06SVenu Byravarasu 					const struct i2c_device_id *id)
2673c33be06SVenu Byravarasu {
2683c33be06SVenu Byravarasu 	struct tps65090_platform_data *pdata = client->dev.platform_data;
2693c33be06SVenu Byravarasu 	struct tps65090 *tps65090;
2703c33be06SVenu Byravarasu 	int ret;
2713c33be06SVenu Byravarasu 
2723c33be06SVenu Byravarasu 	if (!pdata) {
2733c33be06SVenu Byravarasu 		dev_err(&client->dev, "tps65090 requires platform data\n");
2743c33be06SVenu Byravarasu 		return -EINVAL;
2753c33be06SVenu Byravarasu 	}
2763c33be06SVenu Byravarasu 
2773c33be06SVenu Byravarasu 	tps65090 = devm_kzalloc(&client->dev, sizeof(struct tps65090),
2783c33be06SVenu Byravarasu 		GFP_KERNEL);
2793c33be06SVenu Byravarasu 	if (tps65090 == NULL)
2803c33be06SVenu Byravarasu 		return -ENOMEM;
2813c33be06SVenu Byravarasu 
2823c33be06SVenu Byravarasu 	tps65090->client = client;
2833c33be06SVenu Byravarasu 	tps65090->dev = &client->dev;
2843c33be06SVenu Byravarasu 	i2c_set_clientdata(client, tps65090);
2853c33be06SVenu Byravarasu 
2863c33be06SVenu Byravarasu 	mutex_init(&tps65090->lock);
2873c33be06SVenu Byravarasu 
2883c33be06SVenu Byravarasu 	if (client->irq) {
2893c33be06SVenu Byravarasu 		ret = tps65090_irq_init(tps65090, client->irq, pdata->irq_base);
2903c33be06SVenu Byravarasu 		if (ret) {
2913c33be06SVenu Byravarasu 			dev_err(&client->dev, "IRQ init failed with err: %d\n",
2923c33be06SVenu Byravarasu 				ret);
2933c33be06SVenu Byravarasu 			goto err_exit;
2943c33be06SVenu Byravarasu 		}
2953c33be06SVenu Byravarasu 	}
2963c33be06SVenu Byravarasu 
2971d88f7a0SAxel Lin 	tps65090->rmap = devm_regmap_init_i2c(tps65090->client,
2983c33be06SVenu Byravarasu 					      &tps65090_regmap_config);
2993c33be06SVenu Byravarasu 	if (IS_ERR(tps65090->rmap)) {
300b683a0a6SAxel Lin 		ret = PTR_ERR(tps65090->rmap);
301b683a0a6SAxel Lin 		dev_err(&client->dev, "regmap_init failed with err: %d\n", ret);
3023c33be06SVenu Byravarasu 		goto err_irq_exit;
303b683a0a6SAxel Lin 	}
3043c33be06SVenu Byravarasu 
3053c33be06SVenu Byravarasu 	ret = mfd_add_devices(tps65090->dev, -1, tps65090s,
3063c33be06SVenu Byravarasu 		ARRAY_SIZE(tps65090s), NULL, 0);
3073c33be06SVenu Byravarasu 	if (ret) {
3083c33be06SVenu Byravarasu 		dev_err(&client->dev, "add mfd devices failed with err: %d\n",
3093c33be06SVenu Byravarasu 			ret);
3101d88f7a0SAxel Lin 		goto err_irq_exit;
3113c33be06SVenu Byravarasu 	}
3123c33be06SVenu Byravarasu 
3133c33be06SVenu Byravarasu 	return 0;
3143c33be06SVenu Byravarasu 
3153c33be06SVenu Byravarasu err_irq_exit:
3163c33be06SVenu Byravarasu 	if (client->irq)
3173c33be06SVenu Byravarasu 		free_irq(client->irq, tps65090);
3183c33be06SVenu Byravarasu err_exit:
3193c33be06SVenu Byravarasu 	return ret;
3203c33be06SVenu Byravarasu }
3213c33be06SVenu Byravarasu 
3223c33be06SVenu Byravarasu static int __devexit tps65090_i2c_remove(struct i2c_client *client)
3233c33be06SVenu Byravarasu {
3243c33be06SVenu Byravarasu 	struct tps65090 *tps65090 = i2c_get_clientdata(client);
3253c33be06SVenu Byravarasu 
3263c33be06SVenu Byravarasu 	mfd_remove_devices(tps65090->dev);
3273c33be06SVenu Byravarasu 	if (client->irq)
3283c33be06SVenu Byravarasu 		free_irq(client->irq, tps65090);
3293c33be06SVenu Byravarasu 
3303c33be06SVenu Byravarasu 	return 0;
3313c33be06SVenu Byravarasu }
3323c33be06SVenu Byravarasu 
3331ca5513aSMark Brown #ifdef CONFIG_PM_SLEEP
334b6c9eeefSMark Brown static int tps65090_suspend(struct device *dev)
3353c33be06SVenu Byravarasu {
336b6c9eeefSMark Brown 	struct i2c_client *client = to_i2c_client(dev);
3373c33be06SVenu Byravarasu 	if (client->irq)
3383c33be06SVenu Byravarasu 		disable_irq(client->irq);
3393c33be06SVenu Byravarasu 	return 0;
3403c33be06SVenu Byravarasu }
3413c33be06SVenu Byravarasu 
342b6c9eeefSMark Brown static int tps65090_resume(struct device *dev)
3433c33be06SVenu Byravarasu {
344b6c9eeefSMark Brown 	struct i2c_client *client = to_i2c_client(dev);
3453c33be06SVenu Byravarasu 	if (client->irq)
3463c33be06SVenu Byravarasu 		enable_irq(client->irq);
3473c33be06SVenu Byravarasu 	return 0;
3483c33be06SVenu Byravarasu }
3493c33be06SVenu Byravarasu #endif
3503c33be06SVenu Byravarasu 
351b6c9eeefSMark Brown static const struct dev_pm_ops tps65090_pm_ops = {
352b6c9eeefSMark Brown 	SET_SYSTEM_SLEEP_PM_OPS(tps65090_suspend, tps65090_resume)
353b6c9eeefSMark Brown };
354b6c9eeefSMark Brown 
3553c33be06SVenu Byravarasu static const struct i2c_device_id tps65090_id_table[] = {
3563c33be06SVenu Byravarasu 	{ "tps65090", 0 },
3573c33be06SVenu Byravarasu 	{ },
3583c33be06SVenu Byravarasu };
3593c33be06SVenu Byravarasu MODULE_DEVICE_TABLE(i2c, tps65090_id_table);
3603c33be06SVenu Byravarasu 
3613c33be06SVenu Byravarasu static struct i2c_driver tps65090_driver = {
3623c33be06SVenu Byravarasu 	.driver	= {
3633c33be06SVenu Byravarasu 		.name	= "tps65090",
3643c33be06SVenu Byravarasu 		.owner	= THIS_MODULE,
365b6c9eeefSMark Brown 		.pm	= &tps65090_pm_ops,
3663c33be06SVenu Byravarasu 	},
3673c33be06SVenu Byravarasu 	.probe		= tps65090_i2c_probe,
3683c33be06SVenu Byravarasu 	.remove		= __devexit_p(tps65090_i2c_remove),
3693c33be06SVenu Byravarasu 	.id_table	= tps65090_id_table,
3703c33be06SVenu Byravarasu };
3713c33be06SVenu Byravarasu 
3723c33be06SVenu Byravarasu static int __init tps65090_init(void)
3733c33be06SVenu Byravarasu {
3743c33be06SVenu Byravarasu 	return i2c_add_driver(&tps65090_driver);
3753c33be06SVenu Byravarasu }
3763c33be06SVenu Byravarasu subsys_initcall(tps65090_init);
3773c33be06SVenu Byravarasu 
3783c33be06SVenu Byravarasu static void __exit tps65090_exit(void)
3793c33be06SVenu Byravarasu {
3803c33be06SVenu Byravarasu 	i2c_del_driver(&tps65090_driver);
3813c33be06SVenu Byravarasu }
3823c33be06SVenu Byravarasu module_exit(tps65090_exit);
3833c33be06SVenu Byravarasu 
3843c33be06SVenu Byravarasu MODULE_DESCRIPTION("TPS65090 core driver");
3853c33be06SVenu Byravarasu MODULE_AUTHOR("Venu Byravarasu <vbyravarasu@nvidia.com>");
3863c33be06SVenu Byravarasu MODULE_LICENSE("GPL v2");
387