blob: 3428220c5158599d417e202426110fa862a82633 [file] [log] [blame]
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +08001/*
2 * GPIO Greybus driver.
3 *
4 * Copyright 2014 Google Inc.
5 *
6 * Released under the GPLv2 only.
7 */
8
9#include <linux/kernel.h>
10#include <linux/module.h>
11#include <linux/slab.h>
12#include <linux/gpio.h>
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080013#include <linux/gpio/driver.h>
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080014#include "greybus.h"
15
Greg Kroah-Hartman199d68d2014-08-30 16:20:22 -070016struct gb_gpio_device {
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080017 struct gpio_chip chip;
18 struct greybus_device *gdev;
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080019 struct gpio_chip *gpio;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080020 // FIXME - some lock?
21};
22
Greg Kroah-Hartman6584c8a2014-09-01 13:31:31 -070023static const struct greybus_module_id id_table[] = {
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080024 { GREYBUS_DEVICE(0x44, 0x44) }, /* make shit up */
25 { }, /* terminating NULL entry */
26};
27
28static int direction_input(struct gpio_chip *gpio, unsigned nr)
29{
Greg Kroah-Hartman199d68d2014-08-30 16:20:22 -070030 //struct gb_gpio_device *gb_gpio_dev = container_of(gpio, struct gb_gpio_device, chip);
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080031
32 // FIXME - do something there
33 return 0;
34}
35
36static int direction_output(struct gpio_chip *gpio, unsigned nr, int val)
37{
38 // FIXME - do something there
39 return 0;
40}
41
42static int gpio_get(struct gpio_chip *gpio, unsigned nr)
43{
44 // FIXME - do something there
45 return 0;
46}
47
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080048static void gpio_set(struct gpio_chip *gpio, unsigned nr, int val)
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080049{
50 // FIXME - do something there
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080051}
52
Greg Kroah-Hartmandb6e1fd2014-08-30 16:47:26 -070053int gb_gpio_probe(struct greybus_device *gdev,
Greg Kroah-Hartman6584c8a2014-09-01 13:31:31 -070054 const struct greybus_module_id *id)
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080055{
Greg Kroah-Hartman199d68d2014-08-30 16:20:22 -070056 struct gb_gpio_device *gb_gpio;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080057 struct gpio_chip *gpio;
58 struct device *dev = &gdev->dev;
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080059 int retval;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080060
Greg Kroah-Hartman8bf23e82014-08-30 17:18:04 -070061 gb_gpio = kzalloc(sizeof(*gb_gpio), GFP_KERNEL);
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080062 if (!gb_gpio)
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080063 return -ENOMEM;
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080064 gb_gpio->gdev = gdev;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080065
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080066 gpio = &gb_gpio->chip;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080067
68 gpio->label = "greybus_gpio";
69 gpio->owner = THIS_MODULE;
70 gpio->direction_input = direction_input;
71 gpio->direction_output = direction_output;
72 gpio->get = gpio_get;
73 gpio->set = gpio_set;
74 gpio->dbg_show = NULL;
75 gpio->base = 0; // FIXME!!!
76 gpio->ngpio = 42; // FIXME!!!
77 gpio->can_sleep = false; // FIXME!!!
78
Greg Kroah-Hartman3be03d42014-09-01 19:10:06 -070079 gdev->gb_gpio_dev = gb_gpio;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080080
Greg Kroah-Hartmane9023d22014-08-12 14:41:49 +080081 retval = gpiochip_add(gpio);
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080082 if (retval) {
83 dev_err(dev, "Failed to register GPIO\n");
84 return retval;
85 }
86
87 return 0;
88}
89
Greg Kroah-Hartmandb6e1fd2014-08-30 16:47:26 -070090void gb_gpio_disconnect(struct greybus_device *gdev)
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080091{
Greg Kroah-Hartman199d68d2014-08-30 16:20:22 -070092 struct gb_gpio_device *gb_gpio_dev;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080093
Greg Kroah-Hartman426f29d2014-08-30 16:51:21 -070094 gb_gpio_dev = gdev->gb_gpio_dev;
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080095
Greg Kroah-Hartman199d68d2014-08-30 16:20:22 -070096 gpiochip_remove(&gb_gpio_dev->chip);
Greg Kroah-Hartmane5f167f2014-08-30 17:11:41 -070097 kfree(gb_gpio_dev);
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +080098}
99
Greg Kroah-Hartmandb6e1fd2014-08-30 16:47:26 -0700100#if 0
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +0800101static struct greybus_driver gpio_gb_driver = {
Greg Kroah-Hartmandb6e1fd2014-08-30 16:47:26 -0700102 .probe = gb_gpio_probe,
103 .disconnect = gb_gpio_disconnect,
Greg Kroah-Hartmanc16854c2014-08-12 12:00:16 +0800104 .id_table = id_table,
105};
106
107module_greybus_driver(gpio_gb_driver);
108MODULE_LICENSE("GPL");
109MODULE_DESCRIPTION("Greybus GPIO driver");
110MODULE_AUTHOR("Greg Kroah-Hartman <gregkh@linuxfoundation.org>");
Greg Kroah-Hartmandb6e1fd2014-08-30 16:47:26 -0700111#endif