在没有 pinctrl 名称的情况下设置设备树节点时 GPIO 不受控制

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

我正在研究 imx8mm 并使用 Linux 内核 v4.14.98 测试 GPIO。

设备树节点是:

&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>;
};

我写了一个驱动来测试这个

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;
}

但是,当我将pinctrl-names 注释为上面显示的设备树时,我无法控制GPIO 引脚。 GPIO 引脚始终保持高电平。

devicetree.c中,statename将被替换为propname后缀,这里是“0”。但它只是一个常量名称,可以是任何字符串。所以我的问题是为什么不设置 pinctrl-names 就无法控制 GPIO 引脚?

不能是任何名称,大多数节点将具有 pinctrl-names = "default";,因为这会使 pinctrl-0 成为设备引脚的默认状态。

这实际上非常重要,因为设备核心将在探测设备之前使用它来检索和设置正确的状态,请参阅 pinctrl_bind_pins。它确实:

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

其中 PINCTRL_STATE_DEFAULT"default"

然后,select状态为:

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

如果您不想使用 default 名称,那么,您必须 select 驱动程序中的正确状态。

其他通用状态名称是:

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