AVM
AVM

Reputation: 106

linux gpio driver can't export GPIO

I want to use linux GPIO driver to handle one of the GPIO pins of mpc8308 processor as output. so I enabled the GPIO driver and it's debugging in:

Device Drivers ---> GPIO Support ---> /sys/class/gpio/... (sysfs interface)

but when using echo command to export GPIO21, it gives Invalid argument errno:

gpio_request: gpio-21 (sysfs) status -22
export_store: status -22

I used cat /sys/kernel/debug/gpio to see which GPIO pins are reserved by other drivers, but it shows nothing. so this pin is free.

I hacked the kernel for the place of error and found that in beginning of gpio_request function in gpiolib.c it crashes at last line in bellow:

int gpio_request(unsigned gpio, const char *label)
{
    struct gpio_desc    *desc;
    struct gpio_chip    *chip;
    int         status = -EINVAL;
    unsigned long       flags;

    spin_lock_irqsave(&gpio_lock, flags);

    if (!gpio_is_valid(gpio))
        goto done;
    desc = &gpio_desc[gpio];
    chip = desc->chip;
    if (chip == NULL)
        goto done

gpio_desc[gpio] is an entry of an array in driver (static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];) that must be initialized by gpiochip_add function in driver. and this function must be called early as driver says:

/**
 * gpiochip_add() - register a gpio_chip
 * @chip: the chip to register, with chip->base initialized
 * Context: potentially before irqs or kmalloc will work
 *
 * Returns a negative errno if the chip can't be registered, such as
 * because the chip->base is invalid or already associated with a
 * different chip.  Otherwise it returns zero as a success code.
 *
 * When gpiochip_add() is called very early during boot, so that GPIOs
 * can be freely used, the chip->dev device must be registered before
 * the gpio framework's arch_initcall().  Otherwise sysfs initialization
 * for GPIOs will fail rudely.
 *
 * If chip->base is negative, this requests dynamic assignment of
 * a range of valid GPIOs.
 */

but gpiochip_add function never is called during boot.

Here is the .dts file:

gpio@c00 {
            device_type = "gpio";
            compatible = "fsl,mpc8315-gpio";
            reg = <0xc00 0x100>; //reg = <0xc00 0x18>;
            interrupt-parent = < &ipic >;
        };

can anyone help me with this problem?

Edit:

I changed dts file to this:

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

and now it shows gpiochip224 in /sys/class/gpio and this gpiochip has 32 GPIOs. but I don't know what is the mapping between 21 and 224-255? can anyone tell me what is the relation between PIN numbers in datasheet and GPIO numbers in kernel for MPC8308 PowerPC series processor?I try all numbers 224-255 and none of them works.

Upvotes: 3

Views: 10599

Answers (1)

gj13
gj13

Reputation: 1354

You need to use GPIO controller base + GPIO.

If you have gpiochip451 and want gpio 21:

$ ls /sys/class/gpio
export  gpiochip451@  unexport

Then you need: echo 472 > export

Upvotes: 0

Related Questions