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