YC Yao
YC Yao

Reputation: 35

GPIO is uncontrolled when setting device-tree node without pinctrl-names

I'm working on imx8mm and testing GPIO with Linux kernel v4.14.98.

Device tree node is:

&iomuxc {
    pinctrl-names = "default";
    
    ...

    imx8mm-evk {    
        pinctrl_gpio_plural: gpiopluralgrp {
            fsl,pins = <
                MX8MM_IOMUXC_GPIO1_IO11_GPIO1_IO11      0x41
            >;
        };
    };
};

...

plural {
    compatible = "gpio-plural";
    /* pinctrl-names = "default"; */   
    pinctrl-0 = <&pinctrl_gpio_plural>;
    reset-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
};

and I wrote a driver to testing this

static int gpio_plural_probe(struct platform_device *pdev)
{
    struct gpio_plural_data *drvdata;

    drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL);
    if (drvdata == NULL)
        return -ENOMEM;

    drvdata->reset = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_HIGH);
    if (IS_ERR(drvdata->reset)) {
        printk("Error: reset not found\n");
        return -EINVAL;
    }

    gpiod_set_value(drvdata->reset, 0);
    mdelay(100);
    gpiod_set_value(drvdata->reset, 1);
    mdelay(100);
    gpiod_set_value(drvdata->reset, 0);
    mdelay(100);
    gpiod_set_value(drvdata->reset, 1);

    return 0;
}

However, I can't control GPIO pin when I comment pinctrl-names as device tree shown above. The GPIO pin always remains high.

In devicetree.c, the statename would be replaced to propname suffix, which in here is "0". But it just a constant name which could be any string. So my question is why I can't control GPIO pin without setting pinctrl-names?

Upvotes: 1

Views: 1963

Answers (1)

Alexandre Belloni
Alexandre Belloni

Reputation: 2304

It can't be any name, most of the node will have pinctrl-names = "default"; because this make pinctrl-0 the default state for the pins of the device.

This is actually quite important because the device core will use that to retrieve and set the proper state before probing the device, see pinctrl_bind_pins. It does:

dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
                    PINCTRL_STATE_DEFAULT);

where PINCTRL_STATE_DEFAULT is "default".

Then, it selects the state with:

ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);

If you don't want to use the default name, then, you'll have to select the proper state in your driver.

Other generic state names are:

#define PINCTRL_STATE_DEFAULT "default"
#define PINCTRL_STATE_INIT "init"
#define PINCTRL_STATE_IDLE "idle"
#define PINCTRL_STATE_SLEEP "sleep"

Upvotes: 2

Related Questions