static int rockchip_pinctrl_probe(struct platform_device *pdev){ struct rockchip_pinctrl *info; // Rockchip GPIO 控制器的信息结构体指针 struct device *dev = &pdev->dev; // 设备结构体指针 struct rockchip_pin_ctrl *ctrl; // Rockchip GPIO 控制器的配置结构体指针 struct device_node *np = pdev->dev.of_node, *node; // 设备节点指针 struct resource *res; void __iomem *base; int ret;if (!dev->of_node) { dev_err(dev, "device tree node not found\n");return -ENODEV; }// 分配并初始化一个 rockchip_pinctrl 结构体 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);if (!info)return -ENOMEM; info->dev = dev;// 获取并设置与 pdev 相关的 rockchip_pin_ctrl 结构体 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);if (!ctrl) { dev_err(dev, "driver data not available\n");return -EINVAL; } info->ctrl = ctrl;// 解析设备树中的"rockchip,grf"节点, 获取寄存器映射基地址 node = of_parse_phandle(np, "rockchip,grf", 0);if (node) { info->regmap_base = syscon_node_to_regmap(node);if (IS_ERR(info->regmap_base))return PTR_ERR(info->regmap_base); } else { res = platform_get_resource(pdev, IORESOURCE_MEM, 0); base = devm_ioremap_resource(&pdev->dev, res);if (IS_ERR(base))return PTR_ERR(base); rockchip_regmap_config.max_register = resource_size(res) - 4; rockchip_regmap_config.name = "rockchip,pinctrl"; info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base, &rockchip_regmap_config);/* to check for the old dt-bindings */ info->reg_size = resource_size(res);/* Honor the old binding, with pull registers as 2nd resource */if (ctrl->type == RK3188 && info->reg_size < 0x200) { res = platform_get_resource(pdev, IORESOURCE_MEM, 1); base = devm_ioremap_resource(&pdev->dev, res);if (IS_ERR(base))return PTR_ERR(base); rockchip_regmap_config.max_register = resource_size(res) - 4; rockchip_regmap_config.name = "rockchip,pinctrl-pull"; info->regmap_pull = devm_regmap_init_mmio(&pdev->dev, base, &rockchip_regmap_config); } }/* try to find the optional reference to the pmu syscon */ node = of_parse_phandle(np, "rockchip,pmu", 0);if (node) { info->regmap_pmu = syscon_node_to_regmap(node);if (IS_ERR(info->regmap_pmu))return PTR_ERR(info->regmap_pmu); }/* Special handle for some Socs */if (ctrl->soc_data_init) { ret = ctrl->soc_data_init(info);if (ret)return ret; } ret = rockchip_pinctrl_register(pdev, info);if (ret)return ret; platform_set_drvdata(pdev, info); ret = of_platform_populate(np, rockchip_bank_match, NULL, NULL);if (ret) { dev_err(&pdev->dev, "failed to register gpio device\n");return ret; } dev_info(dev, "probed %s\n", dev_name(dev));return0;}