1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #include <linux/kernel.h>
- #include <linux/platform_device.h>
- #include <linux/gpio.h>
- #include <linux/gpio/driver.h>
- #include <linux/module.h>
- #include <linux/init.h>
- struct dummy_gpio {
- struct gpio_chip gc;
- struct mutex lock;
- };
- static struct dummy_gpio dgpio;
-
- static int dummy_gpio_direction_input(struct gpio_chip *chip, unsigned offset) {
- printk("direction input\n");
- return 0;
- }
- static void dummy_gpio_set(struct gpio_chip *chip, unsigned offset, int value) {
- printk("set\n");
- }
- static int dummy_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value) {
- printk("output\n");
- return 0;
- }
- static int dummy_gpio_get(struct gpio_chip *chip, unsigned offset) {
- printk("get\n");
- return 0;
- }
- static int __init dummy_gpio_init(void) {
- int err;
- mutex_init(&dgpio.lock);
- dgpio.gc.label = "dummy_gpio";
- dgpio.gc.direction_input = dummy_gpio_direction_input;
- dgpio.gc.get = dummy_gpio_get;
- dgpio.gc.direction_output = dummy_gpio_direction_output;
- dgpio.gc.set = dummy_gpio_set;
- dgpio.gc.ngpio = 8;
- dgpio.gc.can_sleep = true;
- // from 4.5
- dgpio.gc.parent = NULL;
- // dgpio.gc.dev = NULL;
- dgpio.gc.owner = THIS_MODULE;
- // gpiochip_add_data from 4.5
- err = gpiochip_add(&dgpio.gc);
- //err = gpiochip_add_data()
- if(err)
- goto exit_destroy;
- return err;
- exit_destroy:
- mutex_destroy(&dgpio.lock);
- return err;
- }
- static void __exit dummy_gpio_exit(void) {
- gpiochip_remove(&dgpio.gc);
- mutex_destroy(&dgpio.lock);
- printk("dummy_gpio: Cya in another life\n");
- }
- module_init(dummy_gpio_init);
- module_exit(dummy_gpio_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("encrypt";)
- MODULE_DESCRIPTION("Dummy gpiochip");
|