Lines Matching +full:sparx5 +full:- +full:switch +full:- +full:reset

1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
5 * Author: <alexandre.belloni@free-electrons.com>
17 #include <linux/reset.h>
21 #include <linux/pinctrl/pinconf-generic.h>
1342 *groups = info->func[function].groups; in ocelot_get_function_groups()
1343 *num_groups = info->func[function].ngroups; in ocelot_get_function_groups()
1351 struct ocelot_pin_caps *p = info->desc->pins[pin].drv_data; in ocelot_pin_function_idx()
1355 if (function == p->functions[i]) in ocelot_pin_function_idx()
1358 if (function == p->a_functions[i]) in ocelot_pin_function_idx()
1362 return -1; in ocelot_pin_function_idx()
1365 #define REG_ALT(msb, info, p) (OCELOT_GPIO_ALT0 * (info)->stride + 4 * ((msb) + ((info)->stride * (…
1371 struct ocelot_pin_caps *pin = info->desc->pins[group].drv_data; in ocelot_pinmux_set_mux()
1372 unsigned int p = pin->pin % 32; in ocelot_pinmux_set_mux()
1377 return -EINVAL; in ocelot_pinmux_set_mux()
1387 regmap_update_bits(info->map, REG_ALT(0, info, pin->pin), in ocelot_pinmux_set_mux()
1389 regmap_update_bits(info->map, REG_ALT(1, info, pin->pin), in ocelot_pinmux_set_mux()
1399 struct ocelot_pin_caps *pin = info->desc->pins[group].drv_data; in lan966x_pinmux_set_mux()
1400 unsigned int p = pin->pin % 32; in lan966x_pinmux_set_mux()
1405 return -EINVAL; in lan966x_pinmux_set_mux()
1415 regmap_update_bits(info->map, REG_ALT(0, info, pin->pin), in lan966x_pinmux_set_mux()
1417 regmap_update_bits(info->map, REG_ALT(1, info, pin->pin), in lan966x_pinmux_set_mux()
1419 regmap_update_bits(info->map, REG_ALT(2, info, pin->pin), in lan966x_pinmux_set_mux()
1425 #define REG(r, info, p) ((r) * (info)->stride + (4 * ((p) / 32)))
1434 regmap_update_bits(info->map, REG(OCELOT_GPIO_OE, info, pin), BIT(p), in ocelot_gpio_set_direction()
1447 regmap_update_bits(info->map, REG_ALT(0, info, offset), in ocelot_gpio_request_enable()
1449 regmap_update_bits(info->map, REG_ALT(1, info, offset), in ocelot_gpio_request_enable()
1462 regmap_update_bits(info->map, REG_ALT(0, info, offset), in lan966x_gpio_request_enable()
1464 regmap_update_bits(info->map, REG_ALT(1, info, offset), in lan966x_gpio_request_enable()
1466 regmap_update_bits(info->map, REG_ALT(2, info, offset), in lan966x_gpio_request_enable()
1494 return info->desc->npins; in ocelot_pctl_get_groups_count()
1502 return info->desc->pins[group].name; in ocelot_pctl_get_group_name()
1512 *pins = &info->desc->pins[group].number; in ocelot_pctl_get_group_pins()
1523 int ret = -EOPNOTSUPP; in ocelot_hw_get_value()
1525 if (info->pincfg) { in ocelot_hw_get_value()
1526 const struct ocelot_pincfg_data *opd = info->pincfg_data; in ocelot_hw_get_value()
1529 ret = regmap_read(info->pincfg, in ocelot_hw_get_value()
1530 pin * regmap_get_reg_stride(info->pincfg), in ocelot_hw_get_value()
1536 switch (reg) { in ocelot_hw_get_value()
1538 *val = regcfg & (opd->pd_bit | opd->pu_bit); in ocelot_hw_get_value()
1542 *val = regcfg & opd->schmitt_bit; in ocelot_hw_get_value()
1546 *val = regcfg & opd->drive_bits; in ocelot_hw_get_value()
1550 ret = -EOPNOTSUPP; in ocelot_hw_get_value()
1563 ret = regmap_read(info->pincfg, in ocelot_pincfg_clrsetbits()
1564 regaddr * regmap_get_reg_stride(info->pincfg), in ocelot_pincfg_clrsetbits()
1572 ret = regmap_write(info->pincfg, in ocelot_pincfg_clrsetbits()
1573 regaddr * regmap_get_reg_stride(info->pincfg), in ocelot_pincfg_clrsetbits()
1584 int ret = -EOPNOTSUPP; in ocelot_hw_set_value()
1586 if (info->pincfg) { in ocelot_hw_set_value()
1587 const struct ocelot_pincfg_data *opd = info->pincfg_data; in ocelot_hw_set_value()
1589 switch (reg) { in ocelot_hw_set_value()
1592 opd->pd_bit | opd->pu_bit, in ocelot_hw_set_value()
1598 opd->schmitt_bit, in ocelot_hw_set_value()
1605 opd->drive_bits, in ocelot_hw_set_value()
1608 ret = -EINVAL; in ocelot_hw_set_value()
1612 ret = -EOPNOTSUPP; in ocelot_hw_set_value()
1626 switch (param) { in ocelot_pinconf_get()
1636 val = !!(val & info->pincfg_data->pd_bit); in ocelot_pinconf_get()
1638 val = !!(val & info->pincfg_data->pu_bit); in ocelot_pinconf_get()
1642 if (!info->pincfg_data->schmitt_bit) in ocelot_pinconf_get()
1643 return -EOPNOTSUPP; in ocelot_pinconf_get()
1649 val = !!(val & info->pincfg_data->schmitt_bit); in ocelot_pinconf_get()
1660 err = regmap_read(info->map, REG(OCELOT_GPIO_OUT, info, pin), in ocelot_pinconf_get()
1669 err = regmap_read(info->map, REG(OCELOT_GPIO_OE, info, pin), in ocelot_pinconf_get()
1681 return -EOPNOTSUPP; in ocelot_pinconf_get()
1693 const struct ocelot_pincfg_data *opd = info->pincfg_data; in ocelot_pinconf_set()
1701 switch (param) { in ocelot_pinconf_set()
1707 opd->pu_bit : opd->pd_bit; in ocelot_pinconf_set()
1716 if (!opd->schmitt_bit) in ocelot_pinconf_set()
1717 return -EOPNOTSUPP; in ocelot_pinconf_set()
1719 arg = arg ? opd->schmitt_bit : 0; in ocelot_pinconf_set()
1741 regmap_write(info->map, in ocelot_pinconf_set()
1746 regmap_write(info->map, in ocelot_pinconf_set()
1750 regmap_update_bits(info->map, in ocelot_pinconf_set()
1758 err = -EOPNOTSUPP; in ocelot_pinconf_set()
1782 .name = "luton-pinctrl",
1793 .name = "serval-pinctrl",
1804 .name = "ocelot-pinctrl",
1815 .name = "jaguar2-pinctrl",
1826 .name = "servalt-pinctrl",
1837 .name = "sparx5-pinctrl",
1855 .name = "lan966x-pinctrl",
1872 .name = "lan969x-pinctrl",
1891 u8 *pins = kcalloc(info->desc->npins, sizeof(u8), GFP_KERNEL); in ocelot_create_group_func_map()
1894 return -ENOMEM; in ocelot_create_group_func_map()
1897 for (npins = 0, i = 0; i < info->desc->npins; i++) { in ocelot_create_group_func_map()
1905 info->func[f].ngroups = npins; in ocelot_create_group_func_map()
1906 info->func[f].groups = devm_kcalloc(dev, npins, sizeof(char *), in ocelot_create_group_func_map()
1908 if (!info->func[f].groups) { in ocelot_create_group_func_map()
1910 return -ENOMEM; in ocelot_create_group_func_map()
1914 info->func[f].groups[i] = in ocelot_create_group_func_map()
1915 info->desc->pins[pins[i]].name; in ocelot_create_group_func_map()
1928 ret = ocelot_create_group_func_map(&pdev->dev, info); in ocelot_pinctrl_register()
1930 dev_err(&pdev->dev, "Unable to create group func map.\n"); in ocelot_pinctrl_register()
1934 info->pctl = devm_pinctrl_register(&pdev->dev, info->desc, info); in ocelot_pinctrl_register()
1935 if (IS_ERR(info->pctl)) { in ocelot_pinctrl_register()
1936 dev_err(&pdev->dev, "Failed to register pinctrl\n"); in ocelot_pinctrl_register()
1937 return PTR_ERR(info->pctl); in ocelot_pinctrl_register()
1948 regmap_read(info->map, REG(OCELOT_GPIO_IN, info, offset), &val); in ocelot_gpio_get()
1959 regmap_write(info->map, REG(OCELOT_GPIO_OUT_SET, info, offset), in ocelot_gpio_set()
1962 regmap_write(info->map, REG(OCELOT_GPIO_OUT_CLR, info, offset), in ocelot_gpio_set()
1972 regmap_read(info->map, REG(OCELOT_GPIO_OE, info, offset), &val); in ocelot_gpio_get_direction()
1987 regmap_write(info->map, REG(OCELOT_GPIO_OUT_SET, info, offset), in ocelot_gpio_direction_output()
1990 regmap_write(info->map, REG(OCELOT_GPIO_OUT_CLR, info, offset), in ocelot_gpio_direction_output()
2013 regmap_update_bits(info->map, REG(OCELOT_GPIO_INTR_ENA, info, gpio), in ocelot_irq_mask()
2021 struct irq_chip *parent_chip = irq_desc_get_chip(w->irq_desc); in ocelot_irq_work()
2022 struct gpio_chip *chip = irq_desc_get_chip_data(w->irq_desc); in ocelot_irq_work()
2023 struct irq_data *data = irq_desc_get_irq_data(w->irq_desc); in ocelot_irq_work()
2027 chained_irq_enter(parent_chip, w->irq_desc); in ocelot_irq_work()
2028 generic_handle_domain_irq(chip->irq.domain, gpio); in ocelot_irq_work()
2029 chained_irq_exit(parent_chip, w->irq_desc); in ocelot_irq_work()
2049 regmap_read(info->map, REG(OCELOT_GPIO_IN, info, gpio), &val); in ocelot_irq_unmask_level()
2058 regmap_read(info->map, REG(OCELOT_GPIO_INTR, info, gpio), &val); in ocelot_irq_unmask_level()
2064 regmap_write_bits(info->map, REG(OCELOT_GPIO_INTR, info, gpio), in ocelot_irq_unmask_level()
2069 regmap_update_bits(info->map, REG(OCELOT_GPIO_INTR_ENA, info, gpio), in ocelot_irq_unmask_level()
2078 regmap_read(info->map, REG(OCELOT_GPIO_IN, info, gpio), &val); in ocelot_irq_unmask_level()
2090 work->irq_desc = desc; in ocelot_irq_unmask_level()
2091 INIT_WORK(&work->irq_work, ocelot_irq_work); in ocelot_irq_unmask_level()
2092 queue_work(info->wq, &work->irq_work); in ocelot_irq_unmask_level()
2103 regmap_update_bits(info->map, REG(OCELOT_GPIO_INTR_ENA, info, gpio), in ocelot_irq_unmask()
2113 regmap_write_bits(info->map, REG(OCELOT_GPIO_INTR, info, gpio), in ocelot_irq_ack()
2156 unsigned int id_reg = OCELOT_GPIO_INTR_IDENT * info->stride; in ocelot_irq_handler()
2162 for (i = 0; i < info->stride; i++) { in ocelot_irq_handler()
2163 regmap_read(info->map, id_reg + 4 * i, &reg); in ocelot_irq_handler()
2170 min(32U, info->desc->npins - 32 * i)) in ocelot_irq_handler()
2171 generic_handle_domain_irq(chip->irq.domain, irq + 32 * i); in ocelot_irq_handler()
2184 info->gpio_chip = ocelot_gpiolib_chip; in ocelot_gpiochip_register()
2186 gc = &info->gpio_chip; in ocelot_gpiochip_register()
2187 gc->ngpio = info->desc->npins; in ocelot_gpiochip_register()
2188 gc->parent = &pdev->dev; in ocelot_gpiochip_register()
2189 gc->base = -1; in ocelot_gpiochip_register()
2190 gc->label = "ocelot-gpio"; in ocelot_gpiochip_register()
2194 girq = &gc->irq; in ocelot_gpiochip_register()
2196 girq->parent_handler = ocelot_irq_handler; in ocelot_gpiochip_register()
2197 girq->num_parents = 1; in ocelot_gpiochip_register()
2198 girq->parents = devm_kcalloc(&pdev->dev, 1, in ocelot_gpiochip_register()
2199 sizeof(*girq->parents), in ocelot_gpiochip_register()
2201 if (!girq->parents) in ocelot_gpiochip_register()
2202 return -ENOMEM; in ocelot_gpiochip_register()
2203 girq->parents[0] = irq; in ocelot_gpiochip_register()
2204 girq->default_type = IRQ_TYPE_NONE; in ocelot_gpiochip_register()
2205 girq->handler = handle_edge_irq; in ocelot_gpiochip_register()
2208 return devm_gpiochip_add_data(&pdev->dev, gc, info); in ocelot_gpiochip_register()
2212 { .compatible = "mscc,luton-pinctrl", .data = &luton_desc },
2213 { .compatible = "mscc,serval-pinctrl", .data = &serval_desc },
2214 { .compatible = "mscc,ocelot-pinctrl", .data = &ocelot_desc },
2215 { .compatible = "mscc,jaguar2-pinctrl", .data = &jaguar2_desc },
2216 { .compatible = "mscc,servalt-pinctrl", .data = &servalt_desc },
2217 { .compatible = "microchip,sparx5-pinctrl", .data = &sparx5_desc },
2218 { .compatible = "microchip,lan966x-pinctrl", .data = &lan966x_desc },
2219 { .compatible = "microchip,lan9691-pinctrl", .data = &lan969x_desc },
2233 .max_register = info->desc->npins * 4, in ocelot_pinctrl_create_pincfg()
2239 dev_dbg(&pdev->dev, "Failed to ioremap config registers (no extended pinconf)\n"); in ocelot_pinctrl_create_pincfg()
2243 return devm_regmap_init_mmio(&pdev->dev, base, &regmap_config); in ocelot_pinctrl_create_pincfg()
2254 struct device *dev = &pdev->dev; in ocelot_pinctrl_probe()
2256 struct reset_control *reset; in ocelot_pinctrl_probe() local
2267 return -ENOMEM; in ocelot_pinctrl_probe()
2271 return -EINVAL; in ocelot_pinctrl_probe()
2273 info->desc = devm_kmemdup(dev, &data->desc, sizeof(*info->desc), in ocelot_pinctrl_probe()
2275 if (!info->desc) in ocelot_pinctrl_probe()
2276 return -ENOMEM; in ocelot_pinctrl_probe()
2278 info->wq = alloc_ordered_workqueue("ocelot_ordered", 0); in ocelot_pinctrl_probe()
2279 if (!info->wq) in ocelot_pinctrl_probe()
2280 return -ENOMEM; in ocelot_pinctrl_probe()
2283 info->wq); in ocelot_pinctrl_probe()
2287 info->pincfg_data = &data->pincfg_data; in ocelot_pinctrl_probe()
2289 reset = devm_reset_control_get_optional_shared(dev, "switch"); in ocelot_pinctrl_probe()
2290 if (IS_ERR(reset)) in ocelot_pinctrl_probe()
2291 return dev_err_probe(dev, PTR_ERR(reset), in ocelot_pinctrl_probe()
2292 "Failed to get reset\n"); in ocelot_pinctrl_probe()
2293 reset_control_reset(reset); in ocelot_pinctrl_probe()
2295 info->stride = 1 + (info->desc->npins - 1) / 32; in ocelot_pinctrl_probe()
2297 regmap_config.max_register = OCELOT_GPIO_SD_MAP * info->stride + 15 * 4; in ocelot_pinctrl_probe()
2299 info->map = ocelot_regmap_from_resource(pdev, 0, &regmap_config); in ocelot_pinctrl_probe()
2300 if (IS_ERR(info->map)) in ocelot_pinctrl_probe()
2301 return dev_err_probe(dev, PTR_ERR(info->map), in ocelot_pinctrl_probe()
2304 info->dev = dev; in ocelot_pinctrl_probe()
2307 if (info->desc->confops) { in ocelot_pinctrl_probe()
2312 info->pincfg = pincfg; in ocelot_pinctrl_probe()
2330 .name = "pinctrl-ocelot",