Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 36 additions & 3 deletions drivers/pinctrl/pinctrl-rp1.c
Original file line number Diff line number Diff line change
Expand Up @@ -1082,6 +1082,31 @@ static int rp1_pctl_legacy_map_func(struct rp1_pinctrl *pc,
return 0;
}

static int rp1_pctl_legacy_map_dir(struct rp1_pinctrl *pc,
struct device_node *np, u32 pin, u32 fnum,
struct pinctrl_map *maps,
unsigned int *num_maps)
{
struct pinctrl_map *map = &maps[*num_maps];
enum pin_config_param param;
unsigned long *configs;

param = fnum ? PIN_CONFIG_OUTPUT_ENABLE : PIN_CONFIG_INPUT_ENABLE;

configs = kzalloc(sizeof(*configs), GFP_KERNEL);
if (!configs)
return -ENOMEM;

configs[0] = pinconf_to_config_packed(param, 1);
map->type = PIN_MAP_TYPE_CONFIGS_PIN;
map->data.configs.group_or_pin = rp1_gpio_pins[pin].name;
map->data.configs.configs = configs;
map->data.configs.num_configs = 1;
(*num_maps)++;

return 0;
}

static int rp1_pctl_legacy_map_pull(struct rp1_pinctrl *pc,
struct device_node *np, u32 pin, u32 pull,
struct pinctrl_map *maps,
Expand Down Expand Up @@ -1178,6 +1203,8 @@ static int rp1_pctl_dt_node_to_map(struct pinctrl_dev *pctldev,
maps_per_pin = 0;
if (function || num_funcs)
maps_per_pin++;
if (num_funcs)
maps_per_pin++; /* legacy GPIO in/out direction */
if (num_configs || num_pulls)
maps_per_pin++;
reserved_maps = num_pins * maps_per_pin;
Expand All @@ -1199,6 +1226,9 @@ static int rp1_pctl_dt_node_to_map(struct pinctrl_dev *pctldev,
goto out;
err = rp1_pctl_legacy_map_func(pc, np, pin, func,
maps, num_maps);
if (!err && func < 2)
err = rp1_pctl_legacy_map_dir(pc, np, pin, func,
maps, num_maps);
} else if (function) {
err = pinctrl_utils_add_map_mux(pctldev, &maps,
&reserved_maps, num_maps,
Expand Down Expand Up @@ -1383,10 +1413,14 @@ static int rp1_pinconf_set(struct pinctrl_dev *pctldev, unsigned int offset,

case PIN_CONFIG_INPUT_ENABLE:
rp1_input_enable(pin, arg);
if (arg && rp1_get_fsel(pin) == RP1_FSEL_GPIO)
rp1_set_dir(pin, RP1_DIR_INPUT);
break;

case PIN_CONFIG_OUTPUT_ENABLE:
rp1_output_enable(pin, arg);
if (arg && rp1_get_fsel(pin) == RP1_FSEL_GPIO)
rp1_set_dir(pin, RP1_DIR_OUTPUT);
break;

case PIN_CONFIG_LEVEL:
Expand Down Expand Up @@ -1604,11 +1638,10 @@ static int rp1_pinctrl_probe(struct platform_device *pdev)
else if (pace_pin_updates &&
of_device_is_compatible(rp1_node->parent, "brcm,bcm2712-pcie")) {
pc->dummy_base = of_iomap(rp1_node->parent, 0);
if (IS_ERR(pc->dummy_base)) {
if (!pc->dummy_base)
dev_warn(&pdev->dev, "could not map bcm2712 root complex registers\n");
pc->dummy_base = NULL;
}
}
of_node_put(rp1_node);

for (i = 0; i < RP1_NUM_BANKS; i++) {
const struct rp1_iobank_desc *bank = &rp1_iobanks[i];
Expand Down
Loading