Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  CLPS711X GPIO driver
0004  *
0005  *  Copyright (C) 2012,2013 Alexander Shiyan <shc_work@mail.ru>
0006  */
0007 
0008 #include <linux/err.h>
0009 #include <linux/module.h>
0010 #include <linux/gpio/driver.h>
0011 #include <linux/platform_device.h>
0012 
0013 static int clps711x_gpio_probe(struct platform_device *pdev)
0014 {
0015     struct device_node *np = pdev->dev.of_node;
0016     void __iomem *dat, *dir;
0017     struct gpio_chip *gc;
0018     int err, id;
0019 
0020     if (!np)
0021         return -ENODEV;
0022 
0023     id = of_alias_get_id(np, "gpio");
0024     if ((id < 0) || (id > 4))
0025         return -ENODEV;
0026 
0027     gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
0028     if (!gc)
0029         return -ENOMEM;
0030 
0031     dat = devm_platform_ioremap_resource(pdev, 0);
0032     if (IS_ERR(dat))
0033         return PTR_ERR(dat);
0034 
0035     dir = devm_platform_ioremap_resource(pdev, 1);
0036     if (IS_ERR(dir))
0037         return PTR_ERR(dir);
0038 
0039     switch (id) {
0040     case 3:
0041         /* PORTD is inverted logic for direction register */
0042         err = bgpio_init(gc, &pdev->dev, 1, dat, NULL, NULL,
0043                  NULL, dir, 0);
0044         break;
0045     default:
0046         err = bgpio_init(gc, &pdev->dev, 1, dat, NULL, NULL,
0047                  dir, NULL, 0);
0048         break;
0049     }
0050 
0051     if (err)
0052         return err;
0053 
0054     switch (id) {
0055     case 4:
0056         /* PORTE is 3 lines only */
0057         gc->ngpio = 3;
0058         break;
0059     default:
0060         break;
0061     }
0062 
0063     gc->base = -1;
0064     gc->owner = THIS_MODULE;
0065     platform_set_drvdata(pdev, gc);
0066 
0067     return devm_gpiochip_add_data(&pdev->dev, gc, NULL);
0068 }
0069 
0070 static const struct of_device_id __maybe_unused clps711x_gpio_ids[] = {
0071     { .compatible = "cirrus,ep7209-gpio" },
0072     { }
0073 };
0074 MODULE_DEVICE_TABLE(of, clps711x_gpio_ids);
0075 
0076 static struct platform_driver clps711x_gpio_driver = {
0077     .driver = {
0078         .name       = "clps711x-gpio",
0079         .of_match_table = of_match_ptr(clps711x_gpio_ids),
0080     },
0081     .probe  = clps711x_gpio_probe,
0082 };
0083 module_platform_driver(clps711x_gpio_driver);
0084 
0085 MODULE_LICENSE("GPL");
0086 MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
0087 MODULE_DESCRIPTION("CLPS711X GPIO driver");
0088 MODULE_ALIAS("platform:clps711x-gpio");