<Linux> pinctrl MTK 举例

android kernel dts中的pinctrl用于pin复用的情况.

Spec

如以下为MT6797 GPIO的应用Spec:
这里写图片描述

对应DTS

&pio {
    ctp_pins_default: eint0default {
    };
    ctp_pins_eint_as_int: eint@0 {
        pins_cmd_dat {
            pins = <PINMUX_GPIO65__FUNC_EINT4>;
            slew-rate = <0>;
            bias-disable;
        };
    };
};
&touch {
    pinctrl-names = "default", "state_eint_as_int"
    pinctrl-0 = <&ctp_pins_default>;
    pinctrl-1 = <&ctp_pins_eint_as_int>;
};

其中PINMUX_GPIO65__FUNC_EINT4 定义在
include/dt-bindings/pinctrl/mt6797-pinfunc.h

#define PINMUX_GPIO65__FUNC_GPIO65 (MTK_PIN_NO(65) | 0)
#define PINMUX_GPIO65__FUNC_EINT4 (MTK_PIN_NO(65) | 1)
#define PINMUX_GPIO65__FUNC_CLKM0 (MTK_PIN_NO(65) | 2)
#define PINMUX_GPIO65__FUNC_SPI5_CLK_B (MTK_PIN_NO(65) | 3)
#define PINMUX_GPIO65__FUNC_I2S1_LRCK (MTK_PIN_NO(65) | 4)
#define PINMUX_GPIO65__FUNC_PWM_A (MTK_PIN_NO(65) | 5)
#define PINMUX_GPIO65__FUNC_C2K_DM_EINT2 (MTK_PIN_NO(65) | 7)

driver代码

获取pinctrl
int parse_dt(struct platform_device *pdev)
{
    // ...
    pinctrl1 = devm_pinctrl_get(&pdev->dev);
    if (IS_ERR(pinctrl1)) {
        ret = PTR_ERR(pinctrl1);
        dev_err(&pdev->dev, "fwq Cannot find touch pinctrl1!\n");
        return ret;
    }
    pins_default = pinctrl_lookup_state(pinctrl1, "default");
    if (IS_ERR(pins_default)) {
        ret = PTR_ERR(pins_default);
        dev_err(&pdev->dev, "fwq Cannot find touch pinctrl default %d!\n", ret);
    }
    eint_as_int = pinctrl_lookup_state(pinctrl1, "state_eint_as_int");
    if (IS_ERR(eint_as_int)) {
        ret = PTR_ERR(eint_as_int);
        dev_err(&pdev->dev, "fwq Cannot find touch pinctrl state_eint_as_int!\n");
        return ret;
    }
}

使能PIN

pinctrl_select_state(pinctrl1, eint_as_int);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值