Hi,

I'm having a problem with getting and freeing GPIOs. Please have a look at
this simple module:
-----------------------------8<--------------------------------
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/gpio.h>

#define DRV_NAME "GPIO Test"
#define PFX DRV_NAME ": "
#define GPIO_TEST_PIN 12

static int __init mymodule_init(void) {
    int err;
    printk (KERN_INFO PFX "requesting GPIO %d\n", GPIO_TEST_PIN);
    err = gpio_request(GPIO_TEST_PIN, "GPIO TEST");
    if (err ) {
        printk (KERN_ERR PFX "didn't get %d\n", GPIO_TEST_PIN);
        return -1;
    }
    return 0;
}

static void __exit mymodule_exit(void) {
   printk (KERN_INFO PFX "freeing GPIO %d\n", GPIO_TEST_PIN);
   gpio_free(GPIO_TEST_PIN);
   return;
}

module_init(mymodule_init);
module_exit(mymodule_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mister X");
----------------------------->8--------------------------------

It just request a GPIO and freeing it at module unload. Here is the according
dmesg: (Carambola 1 with RT3052 using actual trunk)

insmod gpio-test
[ 3814.150000] GPIO Test: requesting GPIO 12
[ 3814.150000] rt2880-pinmux pinctrl.1: request pin 12 (io12) for pio:12
rmmod gpio-test
[ 3825.000000] GPIO Test: freeing GPIO 12
insmod gpio-test # again
[ 3832.250000] GPIO Test: requesting GPIO 12
[ 3832.250000] rt2880-pinmux pinctrl.1: request pin 12 (io12) for pio:12
[ 3832.250000] rt2880-pinmux pinctrl.1: pin io12 already requested by pio:12; 
cannot claim for pio:12
[ 3832.260000] rt2880-pinmux pinctrl.1: pin-12 (pio:12) status -22
[ 3832.270000] GPIO Test: didn't get 12

Why is gpio_free() not enough ? Is there a missing peace in GPIO pinctrl glue ?
Any hint is greatly welcome ...

Regards

Gerd
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to