static int meson_pinctrl_probe(struct platform_device *pdev) { const struct of_device_id *match; struct device *dev = &pdev->dev; struct meson_pinctrl *pc; int ret; pc = devm_kzalloc(dev, sizeof(struct meson_pinctrl), GFP_KERNEL); if (!pc) return -ENOMEM; pc->dev = dev; match = of_match_node(meson_pinctrl_dt_match, pdev->dev.of_node); pc->data = (struct meson_pinctrl_data *) match->data; ret = meson_pinctrl_parse_dt(pc, pdev->dev.of_node); if (ret) return ret; pc->desc.name = "pinctrl-meson"; pc->desc.owner = THIS_MODULE; pc->desc.pctlops = &meson_pctrl_ops; pc->desc.pmxops = &meson_pmx_ops; pc->desc.confops = &meson_pinconf_ops; pc->desc.pins = pc->data->pins; pc->desc.npins = pc->data->num_pins; pc->pcdev = devm_pinctrl_register(pc->dev, &pc->desc, pc); if (IS_ERR(pc->pcdev)) { dev_err(pc->dev, "can't register pinctrl device"); return PTR_ERR(pc->pcdev); } return meson_gpiolib_register(pc); }
int amlogic_pmx_probe(struct platform_device *pdev, struct amlogic_pinctrl_soc_data *soc_data) { struct amlogic_pmx *apmx; int ret, val; pr_info("Init pinux probe!\n"); apmx = devm_kzalloc(&pdev->dev, sizeof(*apmx), GFP_KERNEL); if (!apmx) { dev_err(&pdev->dev, "Can't alloc amlogic_pmx\n"); return -ENOMEM; } apmx->dev = &pdev->dev; apmx->soc = soc_data; platform_set_drvdata(pdev, apmx); ret = meson_pinctrl_parse_dt(apmx, pdev->dev.of_node); if (ret) return ret; ret = of_property_read_u32(pdev->dev.of_node, "#pinmux-cells", &val); if (ret) { dev_err(&pdev->dev, "dt probe #pinmux-cells failed: %d\n", ret); goto err; } apmx->pinmux_cell = val; ret = amlogic_pinctrl_probe_dt(pdev, apmx); if (ret) { dev_err(&pdev->dev, "dt probe failed: %d\n", ret); goto err; } #ifdef AML_PIN_DEBUG_GUP amlogic_dump_pinctrl_data(pdev); #endif amlogic_gpio_ranges.npins = apmx->soc->npins; amlogic_pmx_desc.name = dev_name(&pdev->dev); amlogic_pmx_desc.pins = apmx->soc->pins; amlogic_pmx_desc.npins = apmx->soc->npins; apmx->pctl = pinctrl_register(&amlogic_pmx_desc, &pdev->dev, apmx); if (!apmx->pctl) { dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); goto err; } ret = meson_gpiolib_register(apmx); if (ret) { pinctrl_unregister(apmx->pctl); return ret; } /* pinctrl_add_gpio_range(apmx->pctl, &amlogic_gpio_ranges); */ pctdev_name = dev_name(&pdev->dev); pinctrl_provide_dummies(); dev_info(&pdev->dev, "Probed amlogic pinctrl driver\n"); pctl = apmx->pctl; int_reg = meson_map(&pdev->dev, pdev->dev.of_node, "Int"); gl_pmx = apmx; return 0; err: devm_kfree(&pdev->dev, apmx); return ret; }