Lines Matching +full:reg +full:- +full:40 +full:h

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 #include <linux/io.h>
10 #include <linux/mfd/syscon.h>
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/of.h>
14 #include <linux/platform_device.h>
15 #include <linux/pinctrl/pinctrl.h>
16 #include <linux/pinctrl/pinmux.h>
17 #include <linux/pinctrl/pinconf.h>
18 #include <linux/pinctrl/pinconf-generic.h>
19 #include <linux/regmap.h>
20 #include "pinctrl-utils.h"
21 #include "core.h"
32 * struct zynq_pinctrl - driver data
58 * struct zynq_pinmux_function - a pinmux function
158 PINCTRL_PIN(40, "MIO40"),
198 static const unsigned int spi0_2_pins[] = {40, 41, 45};
221 static const unsigned int sdio0_2_pins[] = {40, 41, 42, 43, 44, 45};
261 static const unsigned int can1_8_pins[] = {40, 41};
284 static const unsigned int uart1_8_pins[] = {40, 41};
306 static const unsigned int i2c1_7_pins[] = {40, 41};
315 static const unsigned int ttc1_2_pins[] = {40, 41};
361 static const unsigned int gpio0_40_pins[] = {40};
377 static const unsigned int usb1_0_pins[] = {40, 41, 42, 43, 44, 45, 46, 47, 48,
829 return pctrl->ngroups; in zynq_pctrl_get_groups_count()
837 return pctrl->groups[selector].name; in zynq_pctrl_get_group_name()
847 *pins = pctrl->groups[selector].pins; in zynq_pctrl_get_group_pins()
848 *num_pins = pctrl->groups[selector].npins; in zynq_pctrl_get_group_pins()
866 return pctrl->nfuncs; in zynq_pmux_get_functions_count()
874 return pctrl->funcs[selector].name; in zynq_pmux_get_function_name()
884 *groups = pctrl->funcs[selector].groups; in zynq_pmux_get_function_groups()
885 *num_groups = pctrl->funcs[selector].ngroups; in zynq_pmux_get_function_groups()
895 const struct zynq_pctrl_group *pgrp = &pctrl->groups[group]; in zynq_pinmux_set_mux()
896 const struct zynq_pinmux_function *func = &pctrl->funcs[function]; in zynq_pinmux_set_mux()
905 u32 reg; in zynq_pinmux_set_mux() local
907 ret = regmap_read(pctrl->syscon, in zynq_pinmux_set_mux()
908 pctrl->pctrl_offset + func->mux, &reg); in zynq_pinmux_set_mux()
912 reg &= ~func->mux_mask; in zynq_pinmux_set_mux()
913 reg |= pgrp->pins[0] << func->mux_shift; in zynq_pinmux_set_mux()
914 ret = regmap_write(pctrl->syscon, in zynq_pinmux_set_mux()
915 pctrl->pctrl_offset + func->mux, reg); in zynq_pinmux_set_mux()
919 for (i = 0; i < pgrp->npins; i++) { in zynq_pinmux_set_mux()
920 unsigned int pin = pgrp->pins[i]; in zynq_pinmux_set_mux()
921 u32 reg, addr = pctrl->pctrl_offset + (4 * pin); in zynq_pinmux_set_mux() local
923 ret = regmap_read(pctrl->syscon, addr, &reg); in zynq_pinmux_set_mux()
927 reg &= ~ZYNQ_PINMUX_MUX_MASK; in zynq_pinmux_set_mux()
928 reg |= func->mux_val << ZYNQ_PINMUX_MUX_SHIFT; in zynq_pinmux_set_mux()
929 ret = regmap_write(pctrl->syscon, addr, reg); in zynq_pinmux_set_mux()
971 {"io-standard", PIN_CONFIG_IOSTANDARD, zynq_iostd_lvcmos18},
976 = { PCONFDUMP(PIN_CONFIG_IOSTANDARD, "IO-standard", NULL, true),
980 static unsigned int zynq_pinconf_iostd_get(u32 reg) in zynq_pinconf_iostd_get() argument
982 return (reg & ZYNQ_PINCONF_IOTYPE_MASK) >> ZYNQ_PINCONF_IOTYPE_SHIFT; in zynq_pinconf_iostd_get()
989 u32 reg; in zynq_pinconf_cfg_get() local
996 return -ENOTSUPP; in zynq_pinconf_cfg_get()
998 ret = regmap_read(pctrl->syscon, pctrl->pctrl_offset + (4 * pin), &reg); in zynq_pinconf_cfg_get()
1000 return -EIO; in zynq_pinconf_cfg_get()
1004 if (!(reg & ZYNQ_PINCONF_PULLUP)) in zynq_pinconf_cfg_get()
1005 return -EINVAL; in zynq_pinconf_cfg_get()
1009 if (!(reg & ZYNQ_PINCONF_TRISTATE)) in zynq_pinconf_cfg_get()
1010 return -EINVAL; in zynq_pinconf_cfg_get()
1014 if (reg & ZYNQ_PINCONF_PULLUP || reg & ZYNQ_PINCONF_TRISTATE) in zynq_pinconf_cfg_get()
1015 return -EINVAL; in zynq_pinconf_cfg_get()
1018 arg = !!(reg & ZYNQ_PINCONF_SPEED); in zynq_pinconf_cfg_get()
1022 enum zynq_io_standards iostd = zynq_pinconf_iostd_get(reg); in zynq_pinconf_cfg_get()
1025 return -EINVAL; in zynq_pinconf_cfg_get()
1026 if (!(reg & ZYNQ_PINCONF_DISABLE_RECVR)) in zynq_pinconf_cfg_get()
1027 return -EINVAL; in zynq_pinconf_cfg_get()
1028 arg = !!(reg & ZYNQ_PINCONF_DISABLE_RECVR); in zynq_pinconf_cfg_get()
1033 arg = zynq_pinconf_iostd_get(reg); in zynq_pinconf_cfg_get()
1036 return -ENOTSUPP; in zynq_pinconf_cfg_get()
1049 u32 reg; in zynq_pinconf_cfg_set() local
1055 return -ENOTSUPP; in zynq_pinconf_cfg_set()
1057 ret = regmap_read(pctrl->syscon, pctrl->pctrl_offset + (4 * pin), &reg); in zynq_pinconf_cfg_set()
1059 return -EIO; in zynq_pinconf_cfg_set()
1073 reg &= ~(ZYNQ_PINCONF_PULLUP | ZYNQ_PINCONF_TRISTATE); in zynq_pinconf_cfg_set()
1077 reg |= ZYNQ_PINCONF_SPEED; in zynq_pinconf_cfg_set()
1079 reg &= ~ZYNQ_PINCONF_SPEED; in zynq_pinconf_cfg_set()
1085 dev_warn(pctldev->dev, in zynq_pinconf_cfg_set()
1090 reg &= ~ZYNQ_PINCONF_IOTYPE_MASK; in zynq_pinconf_cfg_set()
1091 reg |= arg << ZYNQ_PINCONF_IOTYPE_SHIFT; in zynq_pinconf_cfg_set()
1095 reg |= ZYNQ_PINCONF_DISABLE_RECVR; in zynq_pinconf_cfg_set()
1097 reg &= ~ZYNQ_PINCONF_DISABLE_RECVR; in zynq_pinconf_cfg_set()
1101 dev_warn(pctldev->dev, in zynq_pinconf_cfg_set()
1109 reg &= ~(ZYNQ_PINCONF_PULLUP | ZYNQ_PINCONF_TRISTATE); in zynq_pinconf_cfg_set()
1110 reg |= tristate | pullup; in zynq_pinconf_cfg_set()
1113 ret = regmap_write(pctrl->syscon, pctrl->pctrl_offset + (4 * pin), reg); in zynq_pinconf_cfg_set()
1115 return -EIO; in zynq_pinconf_cfg_set()
1127 const struct zynq_pctrl_group *pgrp = &pctrl->groups[selector]; in zynq_pinconf_group_set()
1129 for (i = 0; i < pgrp->npins; i++) { in zynq_pinconf_group_set()
1130 ret = zynq_pinconf_cfg_set(pctldev, pgrp->pins[i], configs, in zynq_pinconf_group_set()
1167 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); in zynq_pinctrl_probe()
1169 return -ENOMEM; in zynq_pinctrl_probe()
1171 pctrl->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in zynq_pinctrl_probe()
1173 if (IS_ERR(pctrl->syscon)) { in zynq_pinctrl_probe()
1174 dev_err(&pdev->dev, "unable to get syscon\n"); in zynq_pinctrl_probe()
1175 return PTR_ERR(pctrl->syscon); in zynq_pinctrl_probe()
1180 dev_err(&pdev->dev, "missing IO resource\n"); in zynq_pinctrl_probe()
1181 return -ENODEV; in zynq_pinctrl_probe()
1183 pctrl->pctrl_offset = res->start; in zynq_pinctrl_probe()
1185 pctrl->groups = zynq_pctrl_groups; in zynq_pinctrl_probe()
1186 pctrl->ngroups = ARRAY_SIZE(zynq_pctrl_groups); in zynq_pinctrl_probe()
1187 pctrl->funcs = zynq_pmux_functions; in zynq_pinctrl_probe()
1188 pctrl->nfuncs = ARRAY_SIZE(zynq_pmux_functions); in zynq_pinctrl_probe()
1190 pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynq_desc, pctrl); in zynq_pinctrl_probe()
1191 if (IS_ERR(pctrl->pctrl)) in zynq_pinctrl_probe()
1192 return PTR_ERR(pctrl->pctrl); in zynq_pinctrl_probe()
1196 dev_info(&pdev->dev, "zynq pinctrl initialized\n"); in zynq_pinctrl_probe()
1202 { .compatible = "xlnx,pinctrl-zynq" },
1209 .name = "zynq-pinctrl",