Lines Matching refs:pmx
30 static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg) in pmx_readl() argument
32 return readl(pmx->regs[bank] + reg); in pmx_readl()
35 static inline void pmx_writel(struct tegra_pmx *pmx, u32 val, u32 bank, u32 reg) in pmx_writel() argument
37 writel_relaxed(val, pmx->regs[bank] + reg); in pmx_writel()
39 pmx_readl(pmx, bank, reg); in pmx_writel()
44 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_groups_count() local
46 return pmx->soc->ngroups; in tegra_pinctrl_get_groups_count()
52 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_group_name() local
54 return pmx->soc->groups[group].name; in tegra_pinctrl_get_group_name()
62 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_group_pins() local
64 *pins = pmx->soc->groups[group].pins; in tegra_pinctrl_get_group_pins()
65 *num_pins = pmx->soc->groups[group].npins; in tegra_pinctrl_get_group_pins()
224 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_funcs_count() local
226 return pmx->soc->nfunctions; in tegra_pinctrl_get_funcs_count()
232 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_func_name() local
234 return pmx->functions[function].name; in tegra_pinctrl_get_func_name()
242 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_func_groups() local
244 *groups = pmx->functions[function].groups; in tegra_pinctrl_get_func_groups()
245 *num_groups = pmx->functions[function].ngroups; in tegra_pinctrl_get_func_groups()
254 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_set_mux() local
259 g = &pmx->soc->groups[group]; in tegra_pinctrl_set_mux()
271 val = pmx_readl(pmx, g->mux_bank, g->mux_reg); in tegra_pinctrl_set_mux()
275 if (pmx->soc->sfsel_in_mux) in tegra_pinctrl_set_mux()
277 pmx_writel(pmx, val, g->mux_bank, g->mux_reg); in tegra_pinctrl_set_mux()
285 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_group_index() local
290 for (group = 0; group < pmx->soc->ngroups; ++group) { in tegra_pinctrl_get_group_index()
307 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_group() local
309 if (group_index < 0 || group_index >= pmx->soc->ngroups) in tegra_pinctrl_get_group()
312 return &pmx->soc->groups[group_index]; in tegra_pinctrl_get_group()
319 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_group_config() local
324 return &pmx->pingroup_configs[group_index]; in tegra_pinctrl_get_group_config()
331 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_gpio_request_enable() local
337 if (!pmx->soc->sfsel_in_mux) in tegra_pinctrl_gpio_request_enable()
352 value = pmx_readl(pmx, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_request_enable()
355 pmx_writel(pmx, value, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_request_enable()
364 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_gpio_disable_free() local
370 if (!pmx->soc->sfsel_in_mux) in tegra_pinctrl_gpio_disable_free()
385 value = pmx_readl(pmx, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_disable_free()
388 pmx_writel(pmx, value, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_disable_free()
400 static int tegra_pinconf_reg(struct tegra_pmx *pmx, in tegra_pinconf_reg() argument
450 if (pmx->soc->hsm_in_mux) { in tegra_pinconf_reg()
461 if (pmx->soc->schmitt_in_mux) { in tegra_pinconf_reg()
502 if (pmx->soc->drvtype_in_mux) { in tegra_pinconf_reg()
513 if (pmx->soc->sfsel_in_mux) { in tegra_pinconf_reg()
523 dev_err(pmx->dev, "Invalid config param %04x\n", param); in tegra_pinconf_reg()
539 dev_err(pmx->dev, in tegra_pinconf_reg()
567 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinconf_group_get() local
576 g = &pmx->soc->groups[group]; in tegra_pinconf_group_get()
578 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit, in tegra_pinconf_group_get()
583 val = pmx_readl(pmx, bank, reg); in tegra_pinconf_group_get()
596 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinconf_group_set() local
605 g = &pmx->soc->groups[group]; in tegra_pinconf_group_set()
611 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit, in tegra_pinconf_group_set()
616 val = pmx_readl(pmx, bank, reg); in tegra_pinconf_group_set()
642 pmx_writel(pmx, val, bank, reg); in tegra_pinconf_group_set()
666 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinconf_group_dbg_show() local
673 g = &pmx->soc->groups[group]; in tegra_pinconf_group_dbg_show()
676 ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false, in tegra_pinconf_group_dbg_show()
681 val = pmx_readl(pmx, bank, reg); in tegra_pinconf_group_dbg_show()
691 val = pmx_readl(pmx, g->mux_bank, g->mux_reg); in tegra_pinconf_group_dbg_show()
694 seq_printf(s, "\n\tfunction=%s", pmx->functions[val].name); in tegra_pinconf_group_dbg_show()
730 static void tegra_pinctrl_clear_parked_bits(struct tegra_pmx *pmx) in tegra_pinctrl_clear_parked_bits() argument
736 for (i = 0; i < pmx->soc->ngroups; ++i) { in tegra_pinctrl_clear_parked_bits()
737 g = &pmx->soc->groups[i]; in tegra_pinctrl_clear_parked_bits()
749 val = pmx_readl(pmx, bank, reg); in tegra_pinctrl_clear_parked_bits()
751 pmx_writel(pmx, val, bank, reg); in tegra_pinctrl_clear_parked_bits()
769 struct tegra_pmx *pmx = dev_get_drvdata(dev); in tegra_pinctrl_suspend() local
770 u32 *backup_regs = pmx->backup_regs; in tegra_pinctrl_suspend()
775 for (i = 0; i < pmx->nbanks; i++) { in tegra_pinctrl_suspend()
777 regs = pmx->regs[i]; in tegra_pinctrl_suspend()
782 return pinctrl_force_sleep(pmx->pctl); in tegra_pinctrl_suspend()
787 struct tegra_pmx *pmx = dev_get_drvdata(dev); in tegra_pinctrl_resume() local
788 u32 *backup_regs = pmx->backup_regs; in tegra_pinctrl_resume()
793 for (i = 0; i < pmx->nbanks; i++) { in tegra_pinctrl_resume()
795 regs = pmx->regs[i]; in tegra_pinctrl_resume()
801 readl_relaxed(pmx->regs[0]); in tegra_pinctrl_resume()
809 static bool tegra_pinctrl_gpio_node_has_range(struct tegra_pmx *pmx) in tegra_pinctrl_gpio_node_has_range() argument
814 np = of_find_compatible_node(NULL, NULL, pmx->soc->gpio_compatible); in tegra_pinctrl_gpio_node_has_range()
828 struct tegra_pmx *pmx; in tegra_pinctrl_probe() local
835 pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL); in tegra_pinctrl_probe()
836 if (!pmx) in tegra_pinctrl_probe()
839 pmx->dev = &pdev->dev; in tegra_pinctrl_probe()
840 pmx->soc = soc_data; in tegra_pinctrl_probe()
842 pmx->pingroup_configs = devm_kcalloc(&pdev->dev, in tegra_pinctrl_probe()
843 pmx->soc->ngroups, sizeof(*pmx->pingroup_configs), in tegra_pinctrl_probe()
845 if (!pmx->pingroup_configs) in tegra_pinctrl_probe()
852 pmx->group_pins = devm_kcalloc(&pdev->dev, pmx->soc->ngroups * 4, in tegra_pinctrl_probe()
853 sizeof(*pmx->group_pins), GFP_KERNEL); in tegra_pinctrl_probe()
854 if (!pmx->group_pins) in tegra_pinctrl_probe()
857 pmx->functions = devm_kcalloc(&pdev->dev, pmx->soc->nfunctions, in tegra_pinctrl_probe()
858 sizeof(*pmx->functions), GFP_KERNEL); in tegra_pinctrl_probe()
859 if (!pmx->functions) in tegra_pinctrl_probe()
862 group_pins = pmx->group_pins; in tegra_pinctrl_probe()
864 for (fn = 0; fn < pmx->soc->nfunctions; fn++) { in tegra_pinctrl_probe()
865 struct tegra_function *func = &pmx->functions[fn]; in tegra_pinctrl_probe()
867 func->name = pmx->soc->functions[fn]; in tegra_pinctrl_probe()
870 for (gn = 0; gn < pmx->soc->ngroups; gn++) { in tegra_pinctrl_probe()
871 const struct tegra_pingroup *g = &pmx->soc->groups[gn]; in tegra_pinctrl_probe()
882 BUG_ON(group_pins - pmx->group_pins >= in tegra_pinctrl_probe()
883 pmx->soc->ngroups * 4); in tegra_pinctrl_probe()
889 pmx->gpio_range.name = "Tegra GPIOs"; in tegra_pinctrl_probe()
890 pmx->gpio_range.id = 0; in tegra_pinctrl_probe()
891 pmx->gpio_range.base = 0; in tegra_pinctrl_probe()
892 pmx->gpio_range.npins = pmx->soc->ngpios; in tegra_pinctrl_probe()
894 pmx->desc.pctlops = &tegra_pinctrl_ops; in tegra_pinctrl_probe()
895 pmx->desc.pmxops = &tegra_pinmux_ops; in tegra_pinctrl_probe()
896 pmx->desc.confops = &tegra_pinconf_ops; in tegra_pinctrl_probe()
897 pmx->desc.owner = THIS_MODULE; in tegra_pinctrl_probe()
898 pmx->desc.name = dev_name(&pdev->dev); in tegra_pinctrl_probe()
899 pmx->desc.pins = pmx->soc->pins; in tegra_pinctrl_probe()
900 pmx->desc.npins = pmx->soc->npins; in tegra_pinctrl_probe()
908 pmx->nbanks = i; in tegra_pinctrl_probe()
910 pmx->regs = devm_kcalloc(&pdev->dev, pmx->nbanks, sizeof(*pmx->regs), in tegra_pinctrl_probe()
912 if (!pmx->regs) in tegra_pinctrl_probe()
915 pmx->backup_regs = devm_kzalloc(&pdev->dev, backup_regs_size, in tegra_pinctrl_probe()
917 if (!pmx->backup_regs) in tegra_pinctrl_probe()
920 for (i = 0; i < pmx->nbanks; i++) { in tegra_pinctrl_probe()
921 pmx->regs[i] = devm_platform_ioremap_resource(pdev, i); in tegra_pinctrl_probe()
922 if (IS_ERR(pmx->regs[i])) in tegra_pinctrl_probe()
923 return PTR_ERR(pmx->regs[i]); in tegra_pinctrl_probe()
926 pmx->pctl = devm_pinctrl_register(&pdev->dev, &pmx->desc, pmx); in tegra_pinctrl_probe()
927 if (IS_ERR(pmx->pctl)) { in tegra_pinctrl_probe()
929 return PTR_ERR(pmx->pctl); in tegra_pinctrl_probe()
932 tegra_pinctrl_clear_parked_bits(pmx); in tegra_pinctrl_probe()
934 if (pmx->soc->ngpios > 0 && !tegra_pinctrl_gpio_node_has_range(pmx)) in tegra_pinctrl_probe()
935 pinctrl_add_gpio_range(pmx->pctl, &pmx->gpio_range); in tegra_pinctrl_probe()
937 platform_set_drvdata(pdev, pmx); in tegra_pinctrl_probe()