1 /* 2 * TI TPS6591x GPIO driver 3 * 4 * Copyright 2010 Texas Instruments Inc. 5 * 6 * Author: Graeme Gregory <gg@slimlogic.co.uk> 7 * Author: Jorge Eduardo Candelaria jedu@slimlogic.co.uk> 8 * 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by the 11 * Free Software Foundation; either version 2 of the License, or (at your 12 * option) any later version. 13 * 14 */ 15 16 #include <linux/kernel.h> 17 #include <linux/module.h> 18 #include <linux/errno.h> 19 #include <linux/gpio.h> 20 #include <linux/i2c.h> 21 #include <linux/mfd/tps65910.h> 22 23 static int tps65910_gpio_get(struct gpio_chip *gc, unsigned offset) 24 { 25 struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); 26 uint8_t val; 27 28 tps65910->read(tps65910, TPS65910_GPIO0 + offset, 1, &val); 29 30 if (val & GPIO_STS_MASK) 31 return 1; 32 33 return 0; 34 } 35 36 static void tps65910_gpio_set(struct gpio_chip *gc, unsigned offset, 37 int value) 38 { 39 struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); 40 41 if (value) 42 tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, 43 GPIO_SET_MASK); 44 else 45 tps65910_clear_bits(tps65910, TPS65910_GPIO0 + offset, 46 GPIO_SET_MASK); 47 } 48 49 static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset, 50 int value) 51 { 52 struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); 53 54 /* Set the initial value */ 55 tps65910_gpio_set(gc, offset, value); 56 57 return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, 58 GPIO_CFG_MASK); 59 } 60 61 static int tps65910_gpio_input(struct gpio_chip *gc, unsigned offset) 62 { 63 struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); 64 65 return tps65910_clear_bits(tps65910, TPS65910_GPIO0 + offset, 66 GPIO_CFG_MASK); 67 } 68 69 void tps65910_gpio_init(struct tps65910 *tps65910, int gpio_base) 70 { 71 int ret; 72 73 if (!gpio_base) 74 return; 75 76 tps65910->gpio.owner = THIS_MODULE; 77 tps65910->gpio.label = tps65910->i2c_client->name; 78 tps65910->gpio.dev = tps65910->dev; 79 tps65910->gpio.base = gpio_base; 80 81 switch(tps65910_chip_id(tps65910)) { 82 case TPS65910: 83 tps65910->gpio.ngpio = 6; 84 break; 85 case TPS65911: 86 tps65910->gpio.ngpio = 9; 87 break; 88 default: 89 return; 90 } 91 tps65910->gpio.can_sleep = 1; 92 93 tps65910->gpio.direction_input = tps65910_gpio_input; 94 tps65910->gpio.direction_output = tps65910_gpio_output; 95 tps65910->gpio.set = tps65910_gpio_set; 96 tps65910->gpio.get = tps65910_gpio_get; 97 98 ret = gpiochip_add(&tps65910->gpio); 99 100 if (ret) 101 dev_warn(tps65910->dev, "GPIO registration failed: %d\n", ret); 102 } 103