Lines Matching +full:eic7700 +full:- +full:pinctrl

1 // SPDX-License-Identifier: GPL-2.0
3 * ESWIN Pinctrl Controller Platform Device Driver
21 #include <linux/pinctrl/pinconf.h>
22 #include <linux/pinctrl/pinconf-generic.h>
23 #include <linux/pinctrl/pinctrl.h>
24 #include <linux/pinctrl/pinmux.h>
41 #define EIC7700_RGMII0_SEL_MODE (0x310 - 0x80)
42 #define EIC7700_RGMII1_SEL_MODE (0x314 - 0x80)
293 return pc->desc.npins; in eic7700_get_groups_count()
300 return pc->desc.pins[selector].name; in eic7700_get_group_name()
308 *pins = &pc->desc.pins[selector].number; in eic7700_get_group_pins()
328 const struct eic7700_pin *pin_data = pc->desc.pins[pin].drv_data; in eic7700_pin_config_get()
332 if (pin_data->functions[0] == F_OSC || pin_data->functions[0] == F_DISABLED) in eic7700_pin_config_get()
333 return -EOPNOTSUPP; in eic7700_pin_config_get()
335 value = readl_relaxed(pc->base + EIC7700_PIN_REG(pin)); in eic7700_pin_config_get()
349 if (pin_data->functions[0] == F_RGMII || in eic7700_pin_config_get()
350 pin_data->functions[0] == F_LPDDR_REF_CLK) in eic7700_pin_config_get()
362 return -EOPNOTSUPP; in eic7700_pin_config_get()
366 return arg ? 0 : -EINVAL; in eic7700_pin_config_get()
373 const struct eic7700_pin *pin_data = pc->desc.pins[pin].drv_data; in eic7700_pin_config_set()
376 if (pin_data->functions[0] == F_OSC || pin_data->functions[0] == F_DISABLED) in eic7700_pin_config_set()
377 return -EOPNOTSUPP; in eic7700_pin_config_set()
379 value = readl_relaxed(pc->base + EIC7700_PIN_REG(pin)); in eic7700_pin_config_set()
391 return -EOPNOTSUPP; in eic7700_pin_config_set()
397 return -EOPNOTSUPP; in eic7700_pin_config_set()
403 if (pin_data->functions[0] == F_RGMII || in eic7700_pin_config_set()
404 pin_data->functions[0] == F_LPDDR_REF_CLK) { in eic7700_pin_config_set()
406 return -EOPNOTSUPP; in eic7700_pin_config_set()
407 value |= FIELD_PREP(EIC7700_DS, (arg - 3000) / 3000); in eic7700_pin_config_set()
410 return -EOPNOTSUPP; in eic7700_pin_config_set()
411 value |= FIELD_PREP(EIC7700_DS, (arg - 6000) / 3000); in eic7700_pin_config_set()
427 return -EOPNOTSUPP; in eic7700_pin_config_set()
431 writel_relaxed(value, pc->base + EIC7700_PIN_REG(pin)); in eic7700_pin_config_set()
441 u32 value = readl_relaxed(pc->base + EIC7700_PIN_REG(pin)) & EIC7700_PINCONF; in eic7700_pin_config_dbg_show()
463 return pc->functions_count; in eic7700_get_functions_count()
470 return pc->functions[selector].name; in eic7700_get_function_name()
478 *groups = pc->functions[selector].groups; in eic7700_get_function_groups()
479 *num_groups = pc->functions[selector].ngroups; in eic7700_get_function_groups()
488 const struct eic7700_pin *pin_data = pc->desc.pins[group_selector].drv_data; in eic7700_set_mux()
491 if (pin_data->functions[0] == F_OSC || pin_data->functions[0] == F_DISABLED) in eic7700_set_mux()
492 return -EOPNOTSUPP; in eic7700_set_mux()
495 if (pin_data->functions[fs] == func_selector) in eic7700_set_mux()
499 dev_err(pctldev->dev, "invalid mux %s for pin %s\n", in eic7700_set_mux()
500 pc->functions[func_selector].name, in eic7700_set_mux()
501 pc->desc.pins[group_selector].name); in eic7700_set_mux()
502 return -EINVAL; in eic7700_set_mux()
505 value = readl_relaxed(pc->base + EIC7700_PIN_REG(group_selector)); in eic7700_set_mux()
508 writel_relaxed(value, pc->base + EIC7700_PIN_REG(group_selector)); in eic7700_set_mux()
532 value = readl_relaxed(pc->base + EIC7700_PIN_REG(offset)); in eic7700_gpio_set_direction()
537 writel_relaxed(value, pc->base + EIC7700_PIN_REG(offset)); in eic7700_gpio_set_direction()
560 for (unsigned int pin = 0; pin < pc->desc.npins; pin++) { in eic7700_pinctrl_init_function_groups()
561 const struct eic7700_pin *pin_data = pc->desc.pins[pin].drv_data; in eic7700_pinctrl_init_function_groups()
565 unsigned int selector = pin_data->functions[fs]; in eic7700_pinctrl_init_function_groups()
566 struct pinfunction *function = &pc->functions[selector]; in eic7700_pinctrl_init_function_groups()
575 function->ngroups++; in eic7700_pinctrl_init_function_groups()
582 return -ENOMEM; in eic7700_pinctrl_init_function_groups()
584 for (unsigned int selector = 0; selector < pc->functions_count; selector++) { in eic7700_pinctrl_init_function_groups()
585 struct pinfunction *function = &pc->functions[selector]; in eic7700_pinctrl_init_function_groups()
587 function->name = function_names[selector]; in eic7700_pinctrl_init_function_groups()
588 function->groups = groups; in eic7700_pinctrl_init_function_groups()
589 groups += function->ngroups; in eic7700_pinctrl_init_function_groups()
591 /* Reset per-function ngroups for use as iterator below */ in eic7700_pinctrl_init_function_groups()
592 function->ngroups = 0; in eic7700_pinctrl_init_function_groups()
596 for (unsigned int pin = 0; pin < pc->desc.npins; pin++) { in eic7700_pinctrl_init_function_groups()
597 const struct pinctrl_pin_desc *desc = &pc->desc.pins[pin]; in eic7700_pinctrl_init_function_groups()
598 const struct eic7700_pin *pin_data = desc->drv_data; in eic7700_pinctrl_init_function_groups()
602 unsigned int selector = pin_data->functions[fs]; in eic7700_pinctrl_init_function_groups()
603 struct pinfunction *function = &pc->functions[selector]; in eic7700_pinctrl_init_function_groups()
612 ((const char **)function->groups)[function->ngroups++] = desc->name; in eic7700_pinctrl_init_function_groups()
621 struct device *dev = &pdev->dev; in eic7700_pinctrl_probe()
630 return -ENOMEM; in eic7700_pinctrl_probe()
632 pc->base = devm_platform_ioremap_resource(pdev, 0); in eic7700_pinctrl_probe()
633 if (IS_ERR(pc->base)) in eic7700_pinctrl_probe()
634 return PTR_ERR(pc->base); in eic7700_pinctrl_probe()
644 return dev_err_probe(&pdev->dev, voltage, in eic7700_pinctrl_probe()
648 rgmii0_mode = readl_relaxed(pc->base + EIC7700_RGMII0_SEL_MODE); in eic7700_pinctrl_probe()
649 rgmii1_mode = readl_relaxed(pc->base + EIC7700_RGMII1_SEL_MODE); in eic7700_pinctrl_probe()
659 return dev_err_probe(&pdev->dev, -EINVAL, in eic7700_pinctrl_probe()
663 writel_relaxed(rgmii0_mode, pc->base + EIC7700_RGMII0_SEL_MODE); in eic7700_pinctrl_probe()
664 writel_relaxed(rgmii1_mode, pc->base + EIC7700_RGMII1_SEL_MODE); in eic7700_pinctrl_probe()
666 pc->desc.name = dev_name(dev); in eic7700_pinctrl_probe()
667 pc->desc.pins = eic7700_pins; in eic7700_pinctrl_probe()
668 pc->desc.npins = ARRAY_SIZE(eic7700_pins); in eic7700_pinctrl_probe()
669 pc->desc.pctlops = &eic7700_pinctrl_ops; in eic7700_pinctrl_probe()
670 pc->desc.pmxops = &eic7700_pinmux_ops; in eic7700_pinctrl_probe()
671 pc->desc.confops = &eic7700_pinconf_ops; in eic7700_pinctrl_probe()
672 pc->desc.owner = THIS_MODULE; in eic7700_pinctrl_probe()
674 pc->functions_count = EIC7700_FUNCTIONS_COUNT; in eic7700_pinctrl_probe()
679 ret = devm_pinctrl_register_and_init(dev, &pc->desc, pc, &pctldev); in eic7700_pinctrl_probe()
681 return dev_err_probe(dev, ret, "could not register pinctrl driver\n"); in eic7700_pinctrl_probe()
687 { .compatible = "eswin,eic7700-pinctrl" },
695 .name = "pinctrl-eic7700",
701 MODULE_DESCRIPTION("Pinctrl driver for the ESWIN EIC7700 SoC");