Commit | Line | Data |
---|---|---|
2537df72 | 1 | /* |
c103de24 | 2 | * TI TPS6591x GPIO driver |
2537df72 GG |
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 | ||
11ad14f8 | 28 | tps65910->read(tps65910, TPS65910_GPIO0 + offset, 1, &val); |
2537df72 | 29 | |
11ad14f8 | 30 | if (val & GPIO_STS_MASK) |
2537df72 GG |
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) | |
11ad14f8 JEC |
42 | tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, |
43 | GPIO_SET_MASK); | |
2537df72 | 44 | else |
11ad14f8 JEC |
45 | tps65910_clear_bits(tps65910, TPS65910_GPIO0 + offset, |
46 | GPIO_SET_MASK); | |
2537df72 GG |
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 */ | |
94bd2442 | 55 | tps65910_gpio_set(gc, offset, value); |
2537df72 | 56 | |
11ad14f8 JEC |
57 | return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, |
58 | GPIO_CFG_MASK); | |
2537df72 GG |
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 | ||
11ad14f8 JEC |
65 | return tps65910_clear_bits(tps65910, TPS65910_GPIO0 + offset, |
66 | GPIO_CFG_MASK); | |
2537df72 GG |
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; | |
11ad14f8 JEC |
80 | |
81 | switch(tps65910_chip_id(tps65910)) { | |
82 | case TPS65910: | |
83 | tps65910->gpio.ngpio = 6; | |
58956ba2 | 84 | break; |
11ad14f8 JEC |
85 | case TPS65911: |
86 | tps65910->gpio.ngpio = 9; | |
58956ba2 | 87 | break; |
11ad14f8 JEC |
88 | default: |
89 | return; | |
90 | } | |
2537df72 GG |
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 | } |