2 * Digital I/O driver for Technologic Systems I2C FPGA Core
4 * Copyright (C) 2015 Technologic Systems
5 * Copyright (C) 2016 Savoir-Faire Linux
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
12 * kind, whether expressed or implied; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License version 2 for more details.
17 #include <linux/gpio/driver.h>
18 #include <linux/i2c.h>
19 #include <linux/of_device.h>
20 #include <linux/module.h>
21 #include <linux/regmap.h>
23 #define DEFAULT_PIN_NUMBER 32
25 * Register bits used by the GPIO device
26 * Some boards, such as TS-7970 do not have a separate input bit
28 #define TS4900_GPIO_OE 0x01
29 #define TS4900_GPIO_OUT 0x02
30 #define TS4900_GPIO_IN 0x04
31 #define TS7970_GPIO_IN 0x02
33 struct ts4900_gpio_priv
{
34 struct regmap
*regmap
;
35 struct gpio_chip gpio_chip
;
36 unsigned int input_bit
;
39 static int ts4900_gpio_get_direction(struct gpio_chip
*chip
,
42 struct ts4900_gpio_priv
*priv
= gpiochip_get_data(chip
);
45 regmap_read(priv
->regmap
, offset
, ®
);
47 return !(reg
& TS4900_GPIO_OE
);
50 static int ts4900_gpio_direction_input(struct gpio_chip
*chip
,
53 struct ts4900_gpio_priv
*priv
= gpiochip_get_data(chip
);
56 * This will clear the output enable bit, the other bits are
57 * dontcare when this is cleared
59 return regmap_write(priv
->regmap
, offset
, 0);
62 static int ts4900_gpio_direction_output(struct gpio_chip
*chip
,
63 unsigned int offset
, int value
)
65 struct ts4900_gpio_priv
*priv
= gpiochip_get_data(chip
);
69 ret
= regmap_write(priv
->regmap
, offset
, TS4900_GPIO_OE
|
72 ret
= regmap_write(priv
->regmap
, offset
, TS4900_GPIO_OE
);
77 static int ts4900_gpio_get(struct gpio_chip
*chip
, unsigned int offset
)
79 struct ts4900_gpio_priv
*priv
= gpiochip_get_data(chip
);
82 regmap_read(priv
->regmap
, offset
, ®
);
84 return !!(reg
& priv
->input_bit
);
87 static void ts4900_gpio_set(struct gpio_chip
*chip
, unsigned int offset
,
90 struct ts4900_gpio_priv
*priv
= gpiochip_get_data(chip
);
93 regmap_update_bits(priv
->regmap
, offset
, TS4900_GPIO_OUT
,
96 regmap_update_bits(priv
->regmap
, offset
, TS4900_GPIO_OUT
, 0);
99 static const struct regmap_config ts4900_regmap_config
= {
104 static const struct gpio_chip template_chip
= {
105 .label
= "ts4900-gpio",
106 .owner
= THIS_MODULE
,
107 .get_direction
= ts4900_gpio_get_direction
,
108 .direction_input
= ts4900_gpio_direction_input
,
109 .direction_output
= ts4900_gpio_direction_output
,
110 .get
= ts4900_gpio_get
,
111 .set
= ts4900_gpio_set
,
116 static const struct of_device_id ts4900_gpio_of_match_table
[] = {
118 .compatible
= "technologic,ts4900-gpio",
119 .data
= (void *)TS4900_GPIO_IN
,
121 .compatible
= "technologic,ts7970-gpio",
122 .data
= (void *)TS7970_GPIO_IN
,
126 MODULE_DEVICE_TABLE(of
, ts4900_gpio_of_match_table
);
128 static int ts4900_gpio_probe(struct i2c_client
*client
,
129 const struct i2c_device_id
*id
)
131 struct ts4900_gpio_priv
*priv
;
135 if (of_property_read_u32(client
->dev
.of_node
, "ngpios", &ngpio
))
136 ngpio
= DEFAULT_PIN_NUMBER
;
138 priv
= devm_kzalloc(&client
->dev
, sizeof(*priv
), GFP_KERNEL
);
142 priv
->gpio_chip
= template_chip
;
143 priv
->gpio_chip
.label
= "ts4900-gpio";
144 priv
->gpio_chip
.ngpio
= ngpio
;
145 priv
->gpio_chip
.parent
= &client
->dev
;
146 priv
->input_bit
= (uintptr_t)of_device_get_match_data(&client
->dev
);
148 priv
->regmap
= devm_regmap_init_i2c(client
, &ts4900_regmap_config
);
149 if (IS_ERR(priv
->regmap
)) {
150 ret
= PTR_ERR(priv
->regmap
);
151 dev_err(&client
->dev
, "Failed to allocate register map: %d\n",
156 ret
= devm_gpiochip_add_data(&client
->dev
, &priv
->gpio_chip
, priv
);
158 dev_err(&client
->dev
, "Unable to register gpiochip\n");
162 i2c_set_clientdata(client
, priv
);
167 static const struct i2c_device_id ts4900_gpio_id_table
[] = {
171 MODULE_DEVICE_TABLE(i2c
, ts4900_gpio_id_table
);
173 static struct i2c_driver ts4900_gpio_driver
= {
175 .name
= "ts4900-gpio",
176 .of_match_table
= ts4900_gpio_of_match_table
,
178 .probe
= ts4900_gpio_probe
,
179 .id_table
= ts4900_gpio_id_table
,
181 module_i2c_driver(ts4900_gpio_driver
);
183 MODULE_AUTHOR("Technologic Systems");
184 MODULE_DESCRIPTION("GPIO interface for Technologic Systems I2C-FPGA core");
185 MODULE_LICENSE("GPL");