#include <linux/gpio/driver.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/slab.h>
#define GEF_GPIO_DIRECT …
#define GEF_GPIO_IN …
#define GEF_GPIO_OUT …
#define GEF_GPIO_TRIG …
#define GEF_GPIO_POLAR_A …
#define GEF_GPIO_POLAR_B …
#define GEF_GPIO_INT_STAT …
#define GEF_GPIO_OVERRUN …
#define GEF_GPIO_MODE …
static const struct of_device_id gef_gpio_ids[] = …;
MODULE_DEVICE_TABLE(of, gef_gpio_ids);
static int __init gef_gpio_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct gpio_chip *gc;
void __iomem *regs;
int ret;
gc = devm_kzalloc(dev, sizeof(*gc), GFP_KERNEL);
if (!gc)
return -ENOMEM;
regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(regs))
return PTR_ERR(regs);
ret = bgpio_init(gc, dev, 4, regs + GEF_GPIO_IN, regs + GEF_GPIO_OUT,
NULL, NULL, regs + GEF_GPIO_DIRECT,
BGPIOF_BIG_ENDIAN_BYTE_ORDER);
if (ret)
return dev_err_probe(dev, ret, "bgpio_init failed\n");
gc->label = devm_kasprintf(dev, GFP_KERNEL, "%pfw", dev_fwnode(dev));
if (!gc->label)
return -ENOMEM;
gc->base = -1;
gc->ngpio = (uintptr_t)device_get_match_data(dev);
ret = devm_gpiochip_add_data(dev, gc, NULL);
if (ret)
return dev_err_probe(dev, ret, "GPIO chip registration failed\n");
return 0;
};
static struct platform_driver gef_gpio_driver = …;
module_platform_driver_probe(…);
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;
MODULE_LICENSE(…) …;