1 // SPDX-License-Identifier: GPL-2.0-only
3 * GPIO driver for the TS-4800 board
5 * Copyright (c) 2016 - Savoir-faire Linux
8 #include <linux/gpio/driver.h>
9 #include <linux/module.h>
11 #include <linux/platform_device.h>
13 #define DEFAULT_PIN_NUMBER 16
14 #define INPUT_REG_OFFSET 0x00
15 #define OUTPUT_REG_OFFSET 0x02
16 #define DIRECTION_REG_OFFSET 0x04
18 static int ts4800_gpio_probe(struct platform_device
*pdev
)
20 struct device_node
*node
;
21 struct gpio_chip
*chip
;
22 void __iomem
*base_addr
;
26 chip
= devm_kzalloc(&pdev
->dev
, sizeof(struct gpio_chip
), GFP_KERNEL
);
30 base_addr
= devm_platform_ioremap_resource(pdev
, 0);
31 if (IS_ERR(base_addr
))
32 return PTR_ERR(base_addr
);
34 node
= pdev
->dev
.of_node
;
38 retval
= of_property_read_u32(node
, "ngpios", &ngpios
);
39 if (retval
== -EINVAL
)
40 ngpios
= DEFAULT_PIN_NUMBER
;
44 retval
= bgpio_init(chip
, &pdev
->dev
, 2, base_addr
+ INPUT_REG_OFFSET
,
45 base_addr
+ OUTPUT_REG_OFFSET
, NULL
,
46 base_addr
+ DIRECTION_REG_OFFSET
, NULL
, 0);
48 dev_err(&pdev
->dev
, "bgpio_init failed\n");
54 platform_set_drvdata(pdev
, chip
);
56 return devm_gpiochip_add_data(&pdev
->dev
, chip
, NULL
);
59 static const struct of_device_id ts4800_gpio_of_match
[] = {
60 { .compatible
= "technologic,ts4800-gpio", },
63 MODULE_DEVICE_TABLE(of
, ts4800_gpio_of_match
);
65 static struct platform_driver ts4800_gpio_driver
= {
67 .name
= "ts4800-gpio",
68 .of_match_table
= ts4800_gpio_of_match
,
70 .probe
= ts4800_gpio_probe
,
73 module_platform_driver_probe(ts4800_gpio_driver
, ts4800_gpio_probe
);
75 MODULE_AUTHOR("Julien Grossholtz <julien.grossholtz@savoirfairelinux.com>");
76 MODULE_DESCRIPTION("TS4800 FPGA GPIO driver");
77 MODULE_LICENSE("GPL v2");