How to use mpc8xxx_gpio.c device driver

Ravi Gupta dceravigupta at gmail.com
Fri Aug 13 19:59:11 EST 2010


On Wed, Aug 11, 2010 at 10:15 PM, Anton Vorontsov <cbouatmailru at gmail.com>wrote:

> Hi,
>
> On Wed, Aug 11, 2010 at 06:57:16PM +0530, Ravi Gupta wrote:
> > I am new to device driver development. I am trying to access the GPIO of
> > MPC837xERDB eval board. I have upgraded its kernel to linux-2.6.28.9 and
> > enable support for mpc8xxx_gpio.c. On boot up, it successfully detect two
> > gpio controllers. Now my question is how I am going to use it to
> communicate
> > with the gpio pins? Do I have to modify the code in mpc8xxx_gpio.c file
> to
> > do whatever I want to do with gpios or I can use the standard gpio API
> > provided in kernel ( gpio_request()/gpio_free() ). I also tries the
> standard
> > kernel API, but it fails. Here is my code :
>
> No, you don't have to modify anything, and yes, you can
> use standard kernel GPIO API.
>
> > #include <linux/module.h>
> > #include <linux/errno.h>  /* error codes */
> > #include <linux/gpio.h>
> >
> > static __init int sample_module_init(void)
> > {
> >   int ret;
> >
> >   int i;
> >   for (i=1; i<32; i++) {
> >     ret = gpio_request(i, "Sample Driver");
>
> Before issing gpio_request() you must get GPIO number from the
> of_get_gpio() or of_get_gpio_flags() calls (the _flags variant
> will also retreive flags such as 'active-low').
>
> The calls assume that you have gpio = <> specifier in the
> device tree, see arch/powerpc/boot/dts/mpc8377_rdb.dts's
> "leds" node as an example.
>
> As you want GPIO LEDs, you can use drivers/leds/leds-gpio.c
> (see of_gpio_leds_probe() call, it gets gpio numbers via
> of_get_gpio_flags() and then requests them via gpio_request()).
>
> Also see
>
> Documentation/powerpc/dts-bindings/gpio/gpio.txt
> Documentation/powerpc/dts-bindings/gpio/led.txt
>
> >     if (ret) {
> >       printk(KERN_WARNING "sample_driver: unable to request GPIO_PG%d\n",
> > i);
> >       //return ret;
> >     }
> >   }
> >
> >   return 0;
> > }
>
>
> On Wed, Aug 11, 2010 at 07:49:40PM +0530, Ravi Gupta wrote:
> > Also, when I try to export a gpio in sysfs
> >
> > echo 9 > /sys/class/gpio/export
>
> The gpio numbers are global, i.e. GPIO controller base + GPIO
> number within the controller.
>
> [...]
> > drwxr-xr-x    3 root     root            0 Jan  1 00:00 gpiochip192
>
> So, if you want GPIO9 within gpiochip192, you should issue
> "echo 201 > export".
>
> Thanks,
>
> --
> Anton Vorontsov
> email: cbouatmailru at gmail.com
> irc://irc.freenode.net/bd2
>

Hi Anton,

Thanks for the reply.
I had added the entries for gpio pin 9 for both controllers(I was not sure
with controller's pin is connected to LED, but now I know it is pin no. 233
i.e 224+9) in the mpc8377_rdb.dts file. Below is a portion of my dts file, I
have attached the complete dts file as attachment.

immr at e0000000 {
    #address-cells = <1>;
    #size-cells = <1>;
    device_type = "soc";
    compatible = "simple-bus";
    ranges = <0x0 0xe0000000 0x00100000>;
    reg = <0xe0000000 0x00000200>;
    bus-frequency = <0>;

    wdt at 200 {
        device_type = "watchdog";
        compatible = "mpc83xx_wdt";
        reg = <0x200 0x100>;
    };

    gpio1: gpio-controller at c00 {
        #gpio-cells = <2>;
        compatible = "fsl,mpc8377-gpio", "fsl,mpc8349-gpio";
        reg = <0xc00 0x100>;
        interrupts = <74 0x8>;
        interrupt-parent = <&ipic>;
        gpio-controller;
    };

    gpio2: gpio-controller at d00 {
        #gpio-cells = <2>;
        compatible = "fsl,mpc8377-gpio", "fsl,mpc8349-gpio";
        reg = <0xd00 0x100>;
        interrupts = <75 0x8>;
        interrupt-parent = <&ipic>;
        gpio-controller;
    };

   * led at 0 {
        compatible = "gpio-leds";
        label = "hdd";
        gpios = <&gpio1 9 0>;
    };

    led at 1 {
        compatible = "gpio-leds";
        label = "rom";
        gpios = <&gpio2 9 0>;
    };*
    .
    .
    .
    .
};


Also I have enabled drivers/leds/leds-gpio.c in my kernel. To test whether
the leds entires in dts file get attached to leds-gpio driver, I added
printks in the probe function of the driver.

static int gpio_led_probe(struct platform_device *pdev)
{
  struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
  struct gpio_led *cur_led;
  struct gpio_led_data *leds_data, *led_dat;
  int i, ret = 0;

  *printk(KERN_INFO "led: inside gpio_led_probe.\n");*

  ....
}

But I couldn't see "led: inside gpio_led_probe." message in dmesg. I checked
sysfs and I can see entries of leds. Here is contents of sysfs on my
machine.

# ls /sys/devices/ -la
drwxr-xr-x    7 root     root            0 Jan  1 01:58 .
drwxr-xr-x   12 root     root            0 Jan  1 00:00 ..
drwxr-xr-x   22 root     root            0 Jan  1 01:58 *e0000000.immr*
drwxr-xr-x    5 root     root            0 Jan  1 01:58 e0005000.localbus
drwxr-xr-x    4 root     root            0 Jan  1 01:58 pci0000:00
drwxr-xr-x    9 root     root            0 Jan  1 01:58 platform
drwxr-xr-x    8 root     root            0 Jan  1 01:58 system


# ls /sys/devices/e0000000.immr/
bus                           e0004600.serial       *led1.0*
devspec                    e0007000.spi           *led2.1*
e0000200.wdt            e00082a8.dma         modalias
e0000700.interrupt-    e0018000.sata         name
e0000b00.power        e0019000.sata         power
e0000c00.gpio-contr  e0023000.usb          sleep-nexus.2
e0000d00.gpio-contr  e0024000.ethernet    subsystem
e0003100.i2c            e0025000.ethernet    uevent
e0004500.serial        e0030000.crypto

Is there something that I am doing wrong? Please suggest.

Thanks in Advance
Ravi Gupta
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20100813/29cdcd74/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mpc8377_rdb.dts
Type: application/octet-stream
Size: 11596 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20100813/29cdcd74/attachment-0001.obj>


More information about the Linuxppc-dev mailing list