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()
225 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_funcs_count() local
227 return pmx->soc->nfunctions; in tegra_pinctrl_get_funcs_count()
233 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_func_name() local
235 return pmx->functions[function].name; in tegra_pinctrl_get_func_name()
243 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_func_groups() local
245 *groups = pmx->functions[function].groups; in tegra_pinctrl_get_func_groups()
246 *num_groups = pmx->functions[function].ngroups; in tegra_pinctrl_get_func_groups()
255 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_set_mux() local
260 g = &pmx->soc->groups[group]; in tegra_pinctrl_set_mux()
272 val = pmx_readl(pmx, g->mux_bank, g->mux_reg); in tegra_pinctrl_set_mux()
275 pmx_writel(pmx, val, g->mux_bank, g->mux_reg); in tegra_pinctrl_set_mux()
283 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_get_group() local
288 for (group = 0; group < pmx->soc->ngroups; ++group) { in tegra_pinctrl_get_group()
294 return &pmx->soc->groups[group]; in tegra_pinctrl_get_group()
306 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_gpio_request_enable() local
310 if (!pmx->soc->sfsel_in_mux) in tegra_pinctrl_gpio_request_enable()
321 value = pmx_readl(pmx, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_request_enable()
323 pmx_writel(pmx, value, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_request_enable()
332 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinctrl_gpio_disable_free() local
336 if (!pmx->soc->sfsel_in_mux) in tegra_pinctrl_gpio_disable_free()
347 value = pmx_readl(pmx, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_disable_free()
349 pmx_writel(pmx, value, group->mux_bank, group->mux_reg); in tegra_pinctrl_gpio_disable_free()
361 static int tegra_pinconf_reg(struct tegra_pmx *pmx, in tegra_pinconf_reg() argument
411 if (pmx->soc->hsm_in_mux) { in tegra_pinconf_reg()
422 if (pmx->soc->schmitt_in_mux) { in tegra_pinconf_reg()
463 if (pmx->soc->drvtype_in_mux) { in tegra_pinconf_reg()
474 dev_err(pmx->dev, "Invalid config param %04x\n", param); in tegra_pinconf_reg()
490 dev_err(pmx->dev, in tegra_pinconf_reg()
518 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinconf_group_get() local
527 g = &pmx->soc->groups[group]; in tegra_pinconf_group_get()
529 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit, in tegra_pinconf_group_get()
534 val = pmx_readl(pmx, bank, reg); in tegra_pinconf_group_get()
547 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinconf_group_set() local
556 g = &pmx->soc->groups[group]; in tegra_pinconf_group_set()
562 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit, in tegra_pinconf_group_set()
567 val = pmx_readl(pmx, bank, reg); in tegra_pinconf_group_set()
593 pmx_writel(pmx, val, bank, reg); in tegra_pinconf_group_set()
617 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); in tegra_pinconf_group_dbg_show() local
624 g = &pmx->soc->groups[group]; in tegra_pinconf_group_dbg_show()
627 ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false, in tegra_pinconf_group_dbg_show()
632 val = pmx_readl(pmx, bank, reg); in tegra_pinconf_group_dbg_show()
673 static void tegra_pinctrl_clear_parked_bits(struct tegra_pmx *pmx) in tegra_pinctrl_clear_parked_bits() argument
679 for (i = 0; i < pmx->soc->ngroups; ++i) { in tegra_pinctrl_clear_parked_bits()
680 g = &pmx->soc->groups[i]; in tegra_pinctrl_clear_parked_bits()
692 val = pmx_readl(pmx, bank, reg); in tegra_pinctrl_clear_parked_bits()
694 pmx_writel(pmx, val, bank, reg); in tegra_pinctrl_clear_parked_bits()
712 struct tegra_pmx *pmx = dev_get_drvdata(dev); in tegra_pinctrl_suspend() local
713 u32 *backup_regs = pmx->backup_regs; in tegra_pinctrl_suspend()
718 for (i = 0; i < pmx->nbanks; i++) { in tegra_pinctrl_suspend()
720 regs = pmx->regs[i]; in tegra_pinctrl_suspend()
725 return pinctrl_force_sleep(pmx->pctl); in tegra_pinctrl_suspend()
730 struct tegra_pmx *pmx = dev_get_drvdata(dev); in tegra_pinctrl_resume() local
731 u32 *backup_regs = pmx->backup_regs; in tegra_pinctrl_resume()
736 for (i = 0; i < pmx->nbanks; i++) { in tegra_pinctrl_resume()
738 regs = pmx->regs[i]; in tegra_pinctrl_resume()
744 readl_relaxed(pmx->regs[0]); in tegra_pinctrl_resume()
752 static bool tegra_pinctrl_gpio_node_has_range(struct tegra_pmx *pmx) in tegra_pinctrl_gpio_node_has_range() argument
757 np = of_find_compatible_node(NULL, NULL, pmx->soc->gpio_compatible); in tegra_pinctrl_gpio_node_has_range()
771 struct tegra_pmx *pmx; in tegra_pinctrl_probe() local
778 pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL); in tegra_pinctrl_probe()
779 if (!pmx) in tegra_pinctrl_probe()
782 pmx->dev = &pdev->dev; in tegra_pinctrl_probe()
783 pmx->soc = soc_data; in tegra_pinctrl_probe()
789 pmx->group_pins = devm_kcalloc(&pdev->dev, pmx->soc->ngroups * 4, in tegra_pinctrl_probe()
790 sizeof(*pmx->group_pins), GFP_KERNEL); in tegra_pinctrl_probe()
791 if (!pmx->group_pins) in tegra_pinctrl_probe()
794 pmx->functions = devm_kcalloc(&pdev->dev, pmx->soc->nfunctions, in tegra_pinctrl_probe()
795 sizeof(*pmx->functions), GFP_KERNEL); in tegra_pinctrl_probe()
796 if (!pmx->functions) in tegra_pinctrl_probe()
799 group_pins = pmx->group_pins; in tegra_pinctrl_probe()
801 for (fn = 0; fn < pmx->soc->nfunctions; fn++) { in tegra_pinctrl_probe()
802 struct tegra_function *func = &pmx->functions[fn]; in tegra_pinctrl_probe()
804 func->name = pmx->soc->functions[fn]; in tegra_pinctrl_probe()
807 for (gn = 0; gn < pmx->soc->ngroups; gn++) { in tegra_pinctrl_probe()
808 const struct tegra_pingroup *g = &pmx->soc->groups[gn]; in tegra_pinctrl_probe()
819 BUG_ON(group_pins - pmx->group_pins >= in tegra_pinctrl_probe()
820 pmx->soc->ngroups * 4); in tegra_pinctrl_probe()
826 pmx->gpio_range.name = "Tegra GPIOs"; in tegra_pinctrl_probe()
827 pmx->gpio_range.id = 0; in tegra_pinctrl_probe()
828 pmx->gpio_range.base = 0; in tegra_pinctrl_probe()
829 pmx->gpio_range.npins = pmx->soc->ngpios; in tegra_pinctrl_probe()
831 pmx->desc.pctlops = &tegra_pinctrl_ops; in tegra_pinctrl_probe()
832 pmx->desc.pmxops = &tegra_pinmux_ops; in tegra_pinctrl_probe()
833 pmx->desc.confops = &tegra_pinconf_ops; in tegra_pinctrl_probe()
834 pmx->desc.owner = THIS_MODULE; in tegra_pinctrl_probe()
835 pmx->desc.name = dev_name(&pdev->dev); in tegra_pinctrl_probe()
836 pmx->desc.pins = pmx->soc->pins; in tegra_pinctrl_probe()
837 pmx->desc.npins = pmx->soc->npins; in tegra_pinctrl_probe()
845 pmx->nbanks = i; in tegra_pinctrl_probe()
847 pmx->regs = devm_kcalloc(&pdev->dev, pmx->nbanks, sizeof(*pmx->regs), in tegra_pinctrl_probe()
849 if (!pmx->regs) in tegra_pinctrl_probe()
852 pmx->backup_regs = devm_kzalloc(&pdev->dev, backup_regs_size, in tegra_pinctrl_probe()
854 if (!pmx->backup_regs) in tegra_pinctrl_probe()
857 for (i = 0; i < pmx->nbanks; i++) { in tegra_pinctrl_probe()
858 pmx->regs[i] = devm_platform_ioremap_resource(pdev, i); in tegra_pinctrl_probe()
859 if (IS_ERR(pmx->regs[i])) in tegra_pinctrl_probe()
860 return PTR_ERR(pmx->regs[i]); in tegra_pinctrl_probe()
863 pmx->pctl = devm_pinctrl_register(&pdev->dev, &pmx->desc, pmx); in tegra_pinctrl_probe()
864 if (IS_ERR(pmx->pctl)) { in tegra_pinctrl_probe()
866 return PTR_ERR(pmx->pctl); in tegra_pinctrl_probe()
869 tegra_pinctrl_clear_parked_bits(pmx); in tegra_pinctrl_probe()
871 if (pmx->soc->ngpios > 0 && !tegra_pinctrl_gpio_node_has_range(pmx)) in tegra_pinctrl_probe()
872 pinctrl_add_gpio_range(pmx->pctl, &pmx->gpio_range); in tegra_pinctrl_probe()
874 platform_set_drvdata(pdev, pmx); in tegra_pinctrl_probe()