dts位于
linux/arch/arm/boot/dts
1.接口(此部分摘自http://www.wowotech.net/gpio_subsystem/pin-control-subsystem.html)
(1)devm_pinctrl_get和pinctrl_get。devm_pinctrl_get是Resource managed版本的pinctrl_get,核心还是pinctrl_get函数。这两个接口都是获取设备(设备模型中的struct device)的pin control state holder(struct pinctrl)。pin control state holder不是静态定义的,一般在第一次调用该函数的时候会动态创建。
(2)devm_pinctrl_put和pinctrl_put。是(1)接口中的逆函数。devm_pinctrl_get和pinctrl_get获取句柄的时候申请了很多资源,在devm_pinctrl_put和pinctrl_put可以释放。需要注意的是多次调用get函数不会重复分配资源,只会reference count加一,在put中referrenct count减一,当count==0的时候才释放该device的pin control state holder持有的所有资源。
(3)pinctrl_lookup_state。根据state name在pin control state holder找到对应的pin control state。具体的state是各个device自己定义的,不过pin control subsystem自己定义了一些标准的pin control state,定义在pinctrl-state.h文件中:
(4)pinctrl_select_state。设定一个具体的pin control state接口。
2.具体过程(含具体代码):
spi->dev.of_node=of_find_compatible_node(NULL, NULL, "mediatek,mt6735-finger");
2.2 dtsi-->(相当于dts的头文件)
finger: finger {
compatible = "mediatek,mt6735-finger";
};
2.3 dts-->
&finger {
pinctrl-names = "fp_default", "finger_rst_high", "finger_rst_low","eint_as_int", "eint_in_low", "eint_in_float", "miso_pull_up",
"miso_pull_disable","finger_power_low","finger_power_high","finger_mode_as_cs","finger_mode_as_ck","finger_mode_as_mi","finger_mode_as_mo";
pinctrl-0 = <&fp_default>;
pinctrl-1 = <&fp_rst_high>;
pinctrl-2 = <&fp_rst_low>;
pinctrl-3 = <&fp_eint_as_int>;
pinctrl-4 = <&fp_eint_in_low>;
pinctrl-5 = <&fp_eint_in_float>;
pinctrl-6 = &