static int sh_pfc_probe(struct platform_device *pdev) { const struct platform_device_id *platid = platform_get_device_id(pdev); #ifdef CONFIG_OF struct device_node *np = pdev->dev.of_node; #endif const struct sh_pfc_soc_info *info; struct sh_pfc *pfc; int ret; #ifdef CONFIG_OF if (np) info = of_device_get_match_data(&pdev->dev); else #endif info = platid ? (const void *)platid->driver_data : NULL; if (info == NULL) return -ENODEV; pfc = devm_kzalloc(&pdev->dev, sizeof(*pfc), GFP_KERNEL); if (pfc == NULL) return -ENOMEM; pfc->info = info; pfc->dev = &pdev->dev; ret = sh_pfc_map_resources(pfc, pdev); if (unlikely(ret < 0)) return ret; spin_lock_init(&pfc->lock); if (info->ops && info->ops->init) { ret = info->ops->init(pfc); if (ret < 0) return ret; } /* Enable dummy states for those platforms without pinctrl support */ if (!of_have_populated_dt()) pinctrl_provide_dummies(); ret = sh_pfc_init_ranges(pfc); if (ret < 0) return ret; /* * Initialize pinctrl bindings first */ ret = sh_pfc_register_pinctrl(pfc); if (unlikely(ret != 0)) return ret; #ifdef CONFIG_PINCTRL_SH_PFC_GPIO /* * Then the GPIO chip */ ret = sh_pfc_register_gpiochip(pfc); if (unlikely(ret != 0)) { /* * If the GPIO chip fails to come up we still leave the * PFC state as it is, given that there are already * extant users of it that have succeeded by this point. */ dev_notice(pfc->dev, "failed to init GPIO chip, ignoring...\n"); } #endif platform_set_drvdata(pdev, pfc); dev_info(pfc->dev, "%s support registered\n", info->name); return 0; }
static int sh_pfc_pinctrl_probe(struct udevice *dev) { struct sh_pfc_pinctrl_priv *priv = dev_get_priv(dev); enum sh_pfc_model model = dev_get_driver_data(dev); fdt_addr_t base; base = devfdt_get_addr(dev); if (base == FDT_ADDR_T_NONE) return -EINVAL; priv->pfc.regs = devm_ioremap(dev, base, SZ_2K); if (!priv->pfc.regs) return -ENOMEM; #ifdef CONFIG_PINCTRL_PFC_R8A7790 if (model == SH_PFC_R8A7790) priv->pfc.info = &r8a7790_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A7791 if (model == SH_PFC_R8A7791) priv->pfc.info = &r8a7791_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A7792 if (model == SH_PFC_R8A7792) priv->pfc.info = &r8a7792_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A7793 if (model == SH_PFC_R8A7793) priv->pfc.info = &r8a7793_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A7794 if (model == SH_PFC_R8A7794) priv->pfc.info = &r8a7794_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A7795 if (model == SH_PFC_R8A7795) priv->pfc.info = &r8a7795_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A7796 if (model == SH_PFC_R8A7796) priv->pfc.info = &r8a7796_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A77970 if (model == SH_PFC_R8A77970) priv->pfc.info = &r8a77970_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A77990 if (model == SH_PFC_R8A77990) priv->pfc.info = &r8a77990_pinmux_info; #endif #ifdef CONFIG_PINCTRL_PFC_R8A77995 if (model == SH_PFC_R8A77995) priv->pfc.info = &r8a77995_pinmux_info; #endif priv->pmx.pfc = &priv->pfc; sh_pfc_init_ranges(&priv->pfc); sh_pfc_map_pins(&priv->pfc, &priv->pmx); return 0; }