驱动代码分析
引脚名字和编号解析与存储
- imx6ull.dtsi
iomuxc: iomuxc@20e0000 {
compatible = "fsl,imx6ul-iomuxc";
reg = <0x20e0000 0x4000>;
};
- pinctrl-imx6ul.c
static struct platform_driver imx6ul_pinctrl_driver = {
.driver = {
.name = "imx6ul-pinctrl",
.of_match_table = imx6ul_pinctrl_of_match,
.suppress_bind_attrs = true,
},
.probe = imx6ul_pinctrl_probe,
};
static const struct of_device_id imx6ul_pinctrl_of_match[] = {
{
.compatible = "fsl,imx6ul-iomuxc", .data = &imx6ul_pinctrl_info, },
{
.compatible = "fsl,imx6ull-iomuxc-snvs", .data = &imx6ull_snvs_pinctrl_info, },
{
/* sentinel */ }
};
设备树当中的compatible属性与驱动平台当中的imx6ul_pinctrl_of_match相匹配,匹配成功以后执行对应的imx6ul_pinctrl_probe函数。
imx6ul_pinctrl_probe()函数
drivers/pinctrl/freescale/pinctrl-imx6ul.c
static int imx6ul_pinctrl_probe(struct platform_device *pdev)
{
const struct imx_pinctrl_soc_info *pinctrl_info;
const struct of_device_id *match;
//通过dev获取对应的pinctrl信息
pinctrl_info = of_device_get_match_data(&pdev->dev);
if (!pinctrl_info)
return -ENODEV;
return imx_pinctrl_probe(pdev, pinctrl_info);
}
imx6ul_pinctrl_pads
- 引脚的编号和名字表
IMX_PINCTRL_PIN宏
drivers/pinctrl/freescale/pinctrl-imx.h
#define IMX_PINCTRL_PIN(pin) PINCTRL_PIN(pin