19c6a3c67SMasahiro Yamada /*
29c6a3c67SMasahiro Yamada * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
39c6a3c67SMasahiro Yamada *
49c6a3c67SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+
59c6a3c67SMasahiro Yamada */
69c6a3c67SMasahiro Yamada
79c6a3c67SMasahiro Yamada /* #define DEBUG */
89c6a3c67SMasahiro Yamada
99c6a3c67SMasahiro Yamada #include <common.h>
10*9d922450SSimon Glass #include <dm.h>
119c6a3c67SMasahiro Yamada #include <dm/pinctrl.h>
129c6a3c67SMasahiro Yamada
139c6a3c67SMasahiro Yamada static const char * const sandbox_pins[] = {
149c6a3c67SMasahiro Yamada "SCL",
159c6a3c67SMasahiro Yamada "SDA",
169c6a3c67SMasahiro Yamada "TX",
179c6a3c67SMasahiro Yamada "RX",
189c6a3c67SMasahiro Yamada };
199c6a3c67SMasahiro Yamada
209c6a3c67SMasahiro Yamada static const char * const sandbox_groups[] = {
219c6a3c67SMasahiro Yamada "i2c",
229c6a3c67SMasahiro Yamada "serial_a",
239c6a3c67SMasahiro Yamada "serial_b",
249c6a3c67SMasahiro Yamada "spi",
259c6a3c67SMasahiro Yamada };
269c6a3c67SMasahiro Yamada
279c6a3c67SMasahiro Yamada static const char * const sandbox_functions[] = {
289c6a3c67SMasahiro Yamada "i2c",
299c6a3c67SMasahiro Yamada "serial",
309c6a3c67SMasahiro Yamada "spi",
319c6a3c67SMasahiro Yamada };
329c6a3c67SMasahiro Yamada
339c6a3c67SMasahiro Yamada static const struct pinconf_param sandbox_conf_params[] = {
349c6a3c67SMasahiro Yamada { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
359c6a3c67SMasahiro Yamada { "bias-high-impedance", PIN_CONFIG_BIAS_HIGH_IMPEDANCE, 0 },
369c6a3c67SMasahiro Yamada { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
379c6a3c67SMasahiro Yamada { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
389c6a3c67SMasahiro Yamada { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
399c6a3c67SMasahiro Yamada { "bias-pull-pin-default", PIN_CONFIG_BIAS_PULL_PIN_DEFAULT, 1 },
409c6a3c67SMasahiro Yamada { "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },
419c6a3c67SMasahiro Yamada { "drive-open-source", PIN_CONFIG_DRIVE_OPEN_SOURCE, 0 },
429c6a3c67SMasahiro Yamada { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
439c6a3c67SMasahiro Yamada { "input-enable", PIN_CONFIG_INPUT_ENABLE, 1 },
449c6a3c67SMasahiro Yamada { "input-disable", PIN_CONFIG_INPUT_ENABLE, 0 },
459c6a3c67SMasahiro Yamada };
469c6a3c67SMasahiro Yamada
sandbox_get_pins_count(struct udevice * dev)479c6a3c67SMasahiro Yamada static int sandbox_get_pins_count(struct udevice *dev)
489c6a3c67SMasahiro Yamada {
499c6a3c67SMasahiro Yamada return ARRAY_SIZE(sandbox_pins);
509c6a3c67SMasahiro Yamada }
519c6a3c67SMasahiro Yamada
sandbox_get_pin_name(struct udevice * dev,unsigned selector)529c6a3c67SMasahiro Yamada static const char *sandbox_get_pin_name(struct udevice *dev, unsigned selector)
539c6a3c67SMasahiro Yamada {
549c6a3c67SMasahiro Yamada return sandbox_pins[selector];
559c6a3c67SMasahiro Yamada }
569c6a3c67SMasahiro Yamada
sandbox_get_groups_count(struct udevice * dev)579c6a3c67SMasahiro Yamada static int sandbox_get_groups_count(struct udevice *dev)
589c6a3c67SMasahiro Yamada {
599c6a3c67SMasahiro Yamada return ARRAY_SIZE(sandbox_groups);
609c6a3c67SMasahiro Yamada }
619c6a3c67SMasahiro Yamada
sandbox_get_group_name(struct udevice * dev,unsigned selector)629c6a3c67SMasahiro Yamada static const char *sandbox_get_group_name(struct udevice *dev,
639c6a3c67SMasahiro Yamada unsigned selector)
649c6a3c67SMasahiro Yamada {
659c6a3c67SMasahiro Yamada return sandbox_groups[selector];
669c6a3c67SMasahiro Yamada }
679c6a3c67SMasahiro Yamada
sandbox_get_functions_count(struct udevice * dev)689c6a3c67SMasahiro Yamada static int sandbox_get_functions_count(struct udevice *dev)
699c6a3c67SMasahiro Yamada {
709c6a3c67SMasahiro Yamada return ARRAY_SIZE(sandbox_functions);
719c6a3c67SMasahiro Yamada }
729c6a3c67SMasahiro Yamada
sandbox_get_function_name(struct udevice * dev,unsigned selector)739c6a3c67SMasahiro Yamada static const char *sandbox_get_function_name(struct udevice *dev,
749c6a3c67SMasahiro Yamada unsigned selector)
759c6a3c67SMasahiro Yamada {
769c6a3c67SMasahiro Yamada return sandbox_functions[selector];
779c6a3c67SMasahiro Yamada }
789c6a3c67SMasahiro Yamada
sandbox_pinmux_set(struct udevice * dev,unsigned pin_selector,unsigned func_selector)799c6a3c67SMasahiro Yamada static int sandbox_pinmux_set(struct udevice *dev, unsigned pin_selector,
809c6a3c67SMasahiro Yamada unsigned func_selector)
819c6a3c67SMasahiro Yamada {
829c6a3c67SMasahiro Yamada debug("sandbox pinmux: pin = %d (%s), function = %d (%s)\n",
839c6a3c67SMasahiro Yamada pin_selector, sandbox_get_pin_name(dev, pin_selector),
849c6a3c67SMasahiro Yamada func_selector, sandbox_get_function_name(dev, func_selector));
859c6a3c67SMasahiro Yamada
869c6a3c67SMasahiro Yamada return 0;
879c6a3c67SMasahiro Yamada }
889c6a3c67SMasahiro Yamada
sandbox_pinmux_group_set(struct udevice * dev,unsigned group_selector,unsigned func_selector)899c6a3c67SMasahiro Yamada static int sandbox_pinmux_group_set(struct udevice *dev,
909c6a3c67SMasahiro Yamada unsigned group_selector,
919c6a3c67SMasahiro Yamada unsigned func_selector)
929c6a3c67SMasahiro Yamada {
939c6a3c67SMasahiro Yamada debug("sandbox pinmux: group = %d (%s), function = %d (%s)\n",
949c6a3c67SMasahiro Yamada group_selector, sandbox_get_group_name(dev, group_selector),
959c6a3c67SMasahiro Yamada func_selector, sandbox_get_function_name(dev, func_selector));
969c6a3c67SMasahiro Yamada
979c6a3c67SMasahiro Yamada return 0;
989c6a3c67SMasahiro Yamada }
999c6a3c67SMasahiro Yamada
sandbox_pinconf_set(struct udevice * dev,unsigned pin_selector,unsigned param,unsigned argument)1009c6a3c67SMasahiro Yamada static int sandbox_pinconf_set(struct udevice *dev, unsigned pin_selector,
1019c6a3c67SMasahiro Yamada unsigned param, unsigned argument)
1029c6a3c67SMasahiro Yamada {
1039c6a3c67SMasahiro Yamada debug("sandbox pinconf: pin = %d (%s), param = %d, arg = %d\n",
1049c6a3c67SMasahiro Yamada pin_selector, sandbox_get_pin_name(dev, pin_selector),
1059c6a3c67SMasahiro Yamada param, argument);
1069c6a3c67SMasahiro Yamada
1079c6a3c67SMasahiro Yamada return 0;
1089c6a3c67SMasahiro Yamada }
1099c6a3c67SMasahiro Yamada
sandbox_pinconf_group_set(struct udevice * dev,unsigned group_selector,unsigned param,unsigned argument)1109c6a3c67SMasahiro Yamada static int sandbox_pinconf_group_set(struct udevice *dev,
1119c6a3c67SMasahiro Yamada unsigned group_selector,
1129c6a3c67SMasahiro Yamada unsigned param, unsigned argument)
1139c6a3c67SMasahiro Yamada {
1149c6a3c67SMasahiro Yamada debug("sandbox pinconf: group = %d (%s), param = %d, arg = %d\n",
1159c6a3c67SMasahiro Yamada group_selector, sandbox_get_group_name(dev, group_selector),
1169c6a3c67SMasahiro Yamada param, argument);
1179c6a3c67SMasahiro Yamada
1189c6a3c67SMasahiro Yamada return 0;
1199c6a3c67SMasahiro Yamada }
1209c6a3c67SMasahiro Yamada
1219c6a3c67SMasahiro Yamada const struct pinctrl_ops sandbox_pinctrl_ops = {
1229c6a3c67SMasahiro Yamada .get_pins_count = sandbox_get_pins_count,
1239c6a3c67SMasahiro Yamada .get_pin_name = sandbox_get_pin_name,
1249c6a3c67SMasahiro Yamada .get_groups_count = sandbox_get_groups_count,
1259c6a3c67SMasahiro Yamada .get_group_name = sandbox_get_group_name,
1269c6a3c67SMasahiro Yamada .get_functions_count = sandbox_get_functions_count,
1279c6a3c67SMasahiro Yamada .get_function_name = sandbox_get_function_name,
1289c6a3c67SMasahiro Yamada .pinmux_set = sandbox_pinmux_set,
1299c6a3c67SMasahiro Yamada .pinmux_group_set = sandbox_pinmux_group_set,
1309c6a3c67SMasahiro Yamada .pinconf_num_params = ARRAY_SIZE(sandbox_conf_params),
1319c6a3c67SMasahiro Yamada .pinconf_params = sandbox_conf_params,
1329c6a3c67SMasahiro Yamada .pinconf_set = sandbox_pinconf_set,
1339c6a3c67SMasahiro Yamada .pinconf_group_set = sandbox_pinconf_group_set,
1349c6a3c67SMasahiro Yamada .set_state = pinctrl_generic_set_state,
1359c6a3c67SMasahiro Yamada };
1369c6a3c67SMasahiro Yamada
1379c6a3c67SMasahiro Yamada static const struct udevice_id sandbox_pinctrl_match[] = {
1389c6a3c67SMasahiro Yamada { .compatible = "sandbox,pinctrl" },
1399c6a3c67SMasahiro Yamada { /* sentinel */ }
1409c6a3c67SMasahiro Yamada };
1419c6a3c67SMasahiro Yamada
1429c6a3c67SMasahiro Yamada U_BOOT_DRIVER(sandbox_pinctrl) = {
1439c6a3c67SMasahiro Yamada .name = "sandbox_pinctrl",
1449c6a3c67SMasahiro Yamada .id = UCLASS_PINCTRL,
1459c6a3c67SMasahiro Yamada .of_match = sandbox_pinctrl_match,
1469c6a3c67SMasahiro Yamada .ops = &sandbox_pinctrl_ops,
1479c6a3c67SMasahiro Yamada };
148