2 * GPIO driver for the TS-4800 board
4 * Copyright (c) 2016 - Savoir-faire Linux
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
11 #include <linux/gpio/driver.h>
12 #include <linux/module.h>
13 #include <linux/of_address.h>
14 #include <linux/of_device.h>
15 #include <linux/platform_device.h>
17 #define DEFAULT_PIN_NUMBER 16
18 #define INPUT_REG_OFFSET 0x00
19 #define OUTPUT_REG_OFFSET 0x02
20 #define DIRECTION_REG_OFFSET 0x04
22 static int ts4800_gpio_probe(struct platform_device
*pdev
)
24 struct device_node
*node
;
25 struct gpio_chip
*chip
;
27 void __iomem
*base_addr
;
31 chip
= devm_kzalloc(&pdev
->dev
, sizeof(struct gpio_chip
), GFP_KERNEL
);
35 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
36 base_addr
= devm_ioremap_resource(&pdev
->dev
, res
);
37 if (IS_ERR(base_addr
))
38 return PTR_ERR(base_addr
);
40 node
= pdev
->dev
.of_node
;
44 retval
= of_property_read_u32(node
, "ngpios", &ngpios
);
45 if (retval
== -EINVAL
)
46 ngpios
= DEFAULT_PIN_NUMBER
;
50 retval
= bgpio_init(chip
, &pdev
->dev
, 2, base_addr
+ INPUT_REG_OFFSET
,
51 base_addr
+ OUTPUT_REG_OFFSET
, NULL
,
52 base_addr
+ DIRECTION_REG_OFFSET
, NULL
, 0);
54 dev_err(&pdev
->dev
, "bgpio_init failed\n");
60 platform_set_drvdata(pdev
, chip
);
62 return devm_gpiochip_add_data(&pdev
->dev
, chip
, NULL
);
65 static const struct of_device_id ts4800_gpio_of_match
[] = {
66 { .compatible
= "technologic,ts4800-gpio", },
69 MODULE_DEVICE_TABLE(of
, ts4800_gpio_of_match
);
71 static struct platform_driver ts4800_gpio_driver
= {
73 .name
= "ts4800-gpio",
74 .of_match_table
= ts4800_gpio_of_match
,
76 .probe
= ts4800_gpio_probe
,
79 module_platform_driver_probe(ts4800_gpio_driver
, ts4800_gpio_probe
);
81 MODULE_AUTHOR("Julien Grossholtz <julien.grossholtz@savoirfairelinux.com>");
82 MODULE_DESCRIPTION("TS4800 FPGA GPIO driver");
83 MODULE_LICENSE("GPL v2");