uboot/drivers/pinctrl/pinctrl_stm32.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2017-2020 STMicroelectronics - All Rights Reserved
   4 */
   5
   6#define LOG_CATEGORY UCLASS_PINCTRL
   7
   8#include <common.h>
   9#include <dm.h>
  10#include <hwspinlock.h>
  11#include <log.h>
  12#include <malloc.h>
  13#include <asm/gpio.h>
  14#include <asm/io.h>
  15#include <dm/device_compat.h>
  16#include <dm/lists.h>
  17#include <dm/pinctrl.h>
  18#include <linux/bitops.h>
  19#include <linux/err.h>
  20#include <linux/libfdt.h>
  21
  22#include "../gpio/stm32_gpio_priv.h"
  23
  24#define MAX_PINS_ONE_IP                 70
  25#define MODE_BITS_MASK                  3
  26#define OSPEED_MASK                     3
  27#define PUPD_MASK                       3
  28#define OTYPE_MSK                       1
  29#define AFR_MASK                        0xF
  30
  31struct stm32_pinctrl_priv {
  32        struct hwspinlock hws;
  33        int pinctrl_ngpios;
  34        struct list_head gpio_dev;
  35};
  36
  37struct stm32_gpio_bank {
  38        struct udevice *gpio_dev;
  39        struct list_head list;
  40};
  41
  42#ifndef CONFIG_SPL_BUILD
  43
  44static char pin_name[PINNAME_SIZE];
  45static const char * const pinmux_mode[GPIOF_COUNT] = {
  46        [GPIOF_INPUT] = "gpio input",
  47        [GPIOF_OUTPUT] = "gpio output",
  48        [GPIOF_UNUSED] = "analog",
  49        [GPIOF_UNKNOWN] = "unknown",
  50        [GPIOF_FUNC] = "alt function",
  51};
  52
  53static const char * const pinmux_bias[] = {
  54        [STM32_GPIO_PUPD_NO] = "",
  55        [STM32_GPIO_PUPD_UP] = "pull-up",
  56        [STM32_GPIO_PUPD_DOWN] = "pull-down",
  57};
  58
  59static const char * const pinmux_otype[] = {
  60        [STM32_GPIO_OTYPE_PP] = "push-pull",
  61        [STM32_GPIO_OTYPE_OD] = "open-drain",
  62};
  63
  64static int stm32_pinctrl_get_af(struct udevice *dev, unsigned int offset)
  65{
  66        struct stm32_gpio_priv *priv = dev_get_priv(dev);
  67        struct stm32_gpio_regs *regs = priv->regs;
  68        u32 af;
  69        u32 alt_shift = (offset % 8) * 4;
  70        u32 alt_index =  offset / 8;
  71
  72        af = (readl(&regs->afr[alt_index]) &
  73              GENMASK(alt_shift + 3, alt_shift)) >> alt_shift;
  74
  75        return af;
  76}
  77
  78static int stm32_populate_gpio_dev_list(struct udevice *dev)
  79{
  80        struct stm32_pinctrl_priv *priv = dev_get_priv(dev);
  81        struct udevice *gpio_dev;
  82        struct udevice *child;
  83        struct stm32_gpio_bank *gpio_bank;
  84        int ret;
  85
  86        /*
  87         * parse pin-controller sub-nodes (ie gpio bank nodes) and fill
  88         * a list with all gpio device reference which belongs to the
  89         * current pin-controller. This list is used to find pin_name and
  90         * pin muxing
  91         */
  92        list_for_each_entry(child, &dev->child_head, sibling_node) {
  93                ret = uclass_get_device_by_name(UCLASS_GPIO, child->name,
  94                                                &gpio_dev);
  95                if (ret < 0)
  96                        continue;
  97
  98                gpio_bank = malloc(sizeof(*gpio_bank));
  99                if (!gpio_bank) {
 100                        dev_err(dev, "Not enough memory\n");
 101                        return -ENOMEM;
 102                }
 103
 104                gpio_bank->gpio_dev = gpio_dev;
 105                list_add_tail(&gpio_bank->list, &priv->gpio_dev);
 106        }
 107
 108        return 0;
 109}
 110
 111static int stm32_pinctrl_get_pins_count(struct udevice *dev)
 112{
 113        struct stm32_pinctrl_priv *priv = dev_get_priv(dev);
 114        struct gpio_dev_priv *uc_priv;
 115        struct stm32_gpio_bank *gpio_bank;
 116
 117        /*
 118         * if get_pins_count has already been executed once on this
 119         * pin-controller, no need to run it again
 120         */
 121        if (priv->pinctrl_ngpios)
 122                return priv->pinctrl_ngpios;
 123
 124        if (list_empty(&priv->gpio_dev))
 125                stm32_populate_gpio_dev_list(dev);
 126        /*
 127         * walk through all banks to retrieve the pin-controller
 128         * pins number
 129         */
 130        list_for_each_entry(gpio_bank, &priv->gpio_dev, list) {
 131                uc_priv = dev_get_uclass_priv(gpio_bank->gpio_dev);
 132
 133                priv->pinctrl_ngpios += uc_priv->gpio_count;
 134        }
 135
 136        return priv->pinctrl_ngpios;
 137}
 138
 139static struct udevice *stm32_pinctrl_get_gpio_dev(struct udevice *dev,
 140                                                  unsigned int selector,
 141                                                  unsigned int *idx)
 142{
 143        struct stm32_pinctrl_priv *priv = dev_get_priv(dev);
 144        struct stm32_gpio_bank *gpio_bank;
 145        struct gpio_dev_priv *uc_priv;
 146        int pin_count = 0;
 147
 148        if (list_empty(&priv->gpio_dev))
 149                stm32_populate_gpio_dev_list(dev);
 150
 151        /* look up for the bank which owns the requested pin */
 152        list_for_each_entry(gpio_bank, &priv->gpio_dev, list) {
 153                uc_priv = dev_get_uclass_priv(gpio_bank->gpio_dev);
 154
 155                if (selector < (pin_count + uc_priv->gpio_count)) {
 156                        /*
 157                         * we found the bank, convert pin selector to
 158                         * gpio bank index
 159                         */
 160                        *idx = selector - pin_count;
 161
 162                        return gpio_bank->gpio_dev;
 163                }
 164                pin_count += uc_priv->gpio_count;
 165        }
 166
 167        return NULL;
 168}
 169
 170static const char *stm32_pinctrl_get_pin_name(struct udevice *dev,
 171                                              unsigned int selector)
 172{
 173        struct gpio_dev_priv *uc_priv;
 174        struct udevice *gpio_dev;
 175        unsigned int gpio_idx;
 176
 177        /* look up for the bank which owns the requested pin */
 178        gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector, &gpio_idx);
 179        if (!gpio_dev) {
 180                snprintf(pin_name, PINNAME_SIZE, "Error");
 181        } else {
 182                uc_priv = dev_get_uclass_priv(gpio_dev);
 183
 184                snprintf(pin_name, PINNAME_SIZE, "%s%d",
 185                         uc_priv->bank_name,
 186                         gpio_idx);
 187        }
 188
 189        return pin_name;
 190}
 191
 192static int stm32_pinctrl_get_pin_muxing(struct udevice *dev,
 193                                        unsigned int selector,
 194                                        char *buf,
 195                                        int size)
 196{
 197        struct udevice *gpio_dev;
 198        struct stm32_gpio_priv *priv;
 199        const char *label;
 200        int mode;
 201        int af_num;
 202        unsigned int gpio_idx;
 203        u32 pupd, otype;
 204
 205        /* look up for the bank which owns the requested pin */
 206        gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector, &gpio_idx);
 207
 208        if (!gpio_dev)
 209                return -ENODEV;
 210
 211        mode = gpio_get_raw_function(gpio_dev, gpio_idx, &label);
 212        dev_dbg(dev, "selector = %d gpio_idx = %d mode = %d\n",
 213                selector, gpio_idx, mode);
 214        priv = dev_get_priv(gpio_dev);
 215        pupd = (readl(&priv->regs->pupdr) >> (gpio_idx * 2)) & PUPD_MASK;
 216        otype = (readl(&priv->regs->otyper) >> gpio_idx) & OTYPE_MSK;
 217
 218        switch (mode) {
 219        case GPIOF_UNKNOWN:
 220        case GPIOF_UNUSED:
 221                snprintf(buf, size, "%s", pinmux_mode[mode]);
 222                break;
 223        case GPIOF_FUNC:
 224                af_num = stm32_pinctrl_get_af(gpio_dev, gpio_idx);
 225                snprintf(buf, size, "%s %d %s %s", pinmux_mode[mode], af_num,
 226                         pinmux_otype[otype], pinmux_bias[pupd]);
 227                break;
 228        case GPIOF_OUTPUT:
 229                snprintf(buf, size, "%s %s %s %s",
 230                         pinmux_mode[mode], pinmux_otype[otype],
 231                         pinmux_bias[pupd], label ? label : "");
 232                break;
 233        case GPIOF_INPUT:
 234                snprintf(buf, size, "%s %s %s", pinmux_mode[mode],
 235                         pinmux_bias[pupd], label ? label : "");
 236                break;
 237        }
 238
 239        return 0;
 240}
 241
 242#endif
 243
 244static int stm32_pinctrl_probe(struct udevice *dev)
 245{
 246        struct stm32_pinctrl_priv *priv = dev_get_priv(dev);
 247        int ret;
 248
 249        INIT_LIST_HEAD(&priv->gpio_dev);
 250
 251        /* hwspinlock property is optional, just log the error */
 252        ret = hwspinlock_get_by_index(dev, 0, &priv->hws);
 253        if (ret)
 254                dev_dbg(dev, "hwspinlock_get_by_index may have failed (%d)\n",
 255                        ret);
 256
 257        return 0;
 258}
 259
 260static int stm32_gpio_config(struct gpio_desc *desc,
 261                             const struct stm32_gpio_ctl *ctl)
 262{
 263        struct stm32_gpio_priv *priv = dev_get_priv(desc->dev);
 264        struct stm32_gpio_regs *regs = priv->regs;
 265        struct stm32_pinctrl_priv *ctrl_priv;
 266        int ret;
 267        u32 index;
 268
 269        if (!ctl || ctl->af > 15 || ctl->mode > 3 || ctl->otype > 1 ||
 270            ctl->pupd > 2 || ctl->speed > 3)
 271                return -EINVAL;
 272
 273        ctrl_priv = dev_get_priv(dev_get_parent(desc->dev));
 274        ret = hwspinlock_lock_timeout(&ctrl_priv->hws, 10);
 275        if (ret == -ETIME) {
 276                dev_err(desc->dev, "HWSpinlock timeout\n");
 277                return ret;
 278        }
 279
 280        index = (desc->offset & 0x07) * 4;
 281        clrsetbits_le32(&regs->afr[desc->offset >> 3], AFR_MASK << index,
 282                        ctl->af << index);
 283
 284        index = desc->offset * 2;
 285        clrsetbits_le32(&regs->moder, MODE_BITS_MASK << index,
 286                        ctl->mode << index);
 287        clrsetbits_le32(&regs->ospeedr, OSPEED_MASK << index,
 288                        ctl->speed << index);
 289        clrsetbits_le32(&regs->pupdr, PUPD_MASK << index, ctl->pupd << index);
 290
 291        index = desc->offset;
 292        clrsetbits_le32(&regs->otyper, OTYPE_MSK << index, ctl->otype << index);
 293
 294        hwspinlock_unlock(&ctrl_priv->hws);
 295
 296        return 0;
 297}
 298
 299static int prep_gpio_dsc(struct stm32_gpio_dsc *gpio_dsc, u32 port_pin)
 300{
 301        gpio_dsc->port = (port_pin & 0x1F000) >> 12;
 302        gpio_dsc->pin = (port_pin & 0x0F00) >> 8;
 303        log_debug("GPIO:port= %d, pin= %d\n", gpio_dsc->port, gpio_dsc->pin);
 304
 305        return 0;
 306}
 307
 308static int prep_gpio_ctl(struct stm32_gpio_ctl *gpio_ctl, u32 gpio_fn,
 309                         ofnode node)
 310{
 311        gpio_fn &= 0x00FF;
 312        gpio_ctl->af = 0;
 313
 314        switch (gpio_fn) {
 315        case 0:
 316                gpio_ctl->mode = STM32_GPIO_MODE_IN;
 317                break;
 318        case 1 ... 16:
 319                gpio_ctl->mode = STM32_GPIO_MODE_AF;
 320                gpio_ctl->af = gpio_fn - 1;
 321                break;
 322        case 17:
 323                gpio_ctl->mode = STM32_GPIO_MODE_AN;
 324                break;
 325        default:
 326                gpio_ctl->mode = STM32_GPIO_MODE_OUT;
 327                break;
 328        }
 329
 330        gpio_ctl->speed = ofnode_read_u32_default(node, "slew-rate", 0);
 331
 332        if (ofnode_read_bool(node, "drive-open-drain"))
 333                gpio_ctl->otype = STM32_GPIO_OTYPE_OD;
 334        else
 335                gpio_ctl->otype = STM32_GPIO_OTYPE_PP;
 336
 337        if (ofnode_read_bool(node, "bias-pull-up"))
 338                gpio_ctl->pupd = STM32_GPIO_PUPD_UP;
 339        else if (ofnode_read_bool(node, "bias-pull-down"))
 340                gpio_ctl->pupd = STM32_GPIO_PUPD_DOWN;
 341        else
 342                gpio_ctl->pupd = STM32_GPIO_PUPD_NO;
 343
 344        log_debug("gpio fn= %d, slew-rate= %x, op type= %x, pull-upd is = %x\n",
 345                  gpio_fn, gpio_ctl->speed, gpio_ctl->otype,
 346                  gpio_ctl->pupd);
 347
 348        return 0;
 349}
 350
 351static int stm32_pinctrl_config(ofnode node)
 352{
 353        u32 pin_mux[MAX_PINS_ONE_IP];
 354        int rv, len;
 355        ofnode subnode;
 356
 357        /*
 358         * check for "pinmux" property in each subnode (e.g. pins1 and pins2 for
 359         * usart1) of pin controller phandle "pinctrl-0"
 360         * */
 361        ofnode_for_each_subnode(subnode, node) {
 362                struct stm32_gpio_dsc gpio_dsc;
 363                struct stm32_gpio_ctl gpio_ctl;
 364                int i;
 365
 366                rv = ofnode_read_size(subnode, "pinmux");
 367                if (rv < 0)
 368                        return rv;
 369                len = rv / sizeof(pin_mux[0]);
 370                log_debug("No of pinmux entries= %d\n", len);
 371                if (len > MAX_PINS_ONE_IP)
 372                        return -EINVAL;
 373                rv = ofnode_read_u32_array(subnode, "pinmux", pin_mux, len);
 374                if (rv < 0)
 375                        return rv;
 376                for (i = 0; i < len; i++) {
 377                        struct gpio_desc desc;
 378
 379                        log_debug("pinmux = %x\n", *(pin_mux + i));
 380                        prep_gpio_dsc(&gpio_dsc, *(pin_mux + i));
 381                        prep_gpio_ctl(&gpio_ctl, *(pin_mux + i), subnode);
 382                        rv = uclass_get_device_by_seq(UCLASS_GPIO,
 383                                                      gpio_dsc.port,
 384                                                      &desc.dev);
 385                        if (rv)
 386                                return rv;
 387                        desc.offset = gpio_dsc.pin;
 388                        rv = stm32_gpio_config(&desc, &gpio_ctl);
 389                        log_debug("rv = %d\n\n", rv);
 390                        if (rv)
 391                                return rv;
 392                }
 393        }
 394
 395        return 0;
 396}
 397
 398static int stm32_pinctrl_bind(struct udevice *dev)
 399{
 400        ofnode node;
 401        const char *name;
 402        int ret;
 403
 404        dev_for_each_subnode(node, dev) {
 405                dev_dbg(dev, "bind %s\n", ofnode_get_name(node));
 406
 407                if (!ofnode_is_enabled(node))
 408                        continue;
 409
 410                ofnode_get_property(node, "gpio-controller", &ret);
 411                if (ret < 0)
 412                        continue;
 413                /* Get the name of each gpio node */
 414                name = ofnode_get_name(node);
 415                if (!name)
 416                        return -EINVAL;
 417
 418                /* Bind each gpio node */
 419                ret = device_bind_driver_to_node(dev, "gpio_stm32",
 420                                                 name, node, NULL);
 421                if (ret)
 422                        return ret;
 423
 424                dev_dbg(dev, "bind %s\n", name);
 425        }
 426
 427        return 0;
 428}
 429
 430#if CONFIG_IS_ENABLED(PINCTRL_FULL)
 431static int stm32_pinctrl_set_state(struct udevice *dev, struct udevice *config)
 432{
 433        return stm32_pinctrl_config(dev_ofnode(config));
 434}
 435#else /* PINCTRL_FULL */
 436static int stm32_pinctrl_set_state_simple(struct udevice *dev,
 437                                          struct udevice *periph)
 438{
 439        const fdt32_t *list;
 440        uint32_t phandle;
 441        ofnode config_node;
 442        int size, i, ret;
 443
 444        list = ofnode_get_property(dev_ofnode(periph), "pinctrl-0", &size);
 445        if (!list)
 446                return -EINVAL;
 447
 448        dev_dbg(dev, "periph->name = %s\n", periph->name);
 449
 450        size /= sizeof(*list);
 451        for (i = 0; i < size; i++) {
 452                phandle = fdt32_to_cpu(*list++);
 453
 454                config_node = ofnode_get_by_phandle(phandle);
 455                if (!ofnode_valid(config_node)) {
 456                        dev_err(periph,
 457                                "prop pinctrl-0 index %d invalid phandle\n", i);
 458                        return -EINVAL;
 459                }
 460
 461                ret = stm32_pinctrl_config(config_node);
 462                if (ret)
 463                        return ret;
 464        }
 465
 466        return 0;
 467}
 468#endif /* PINCTRL_FULL */
 469
 470static struct pinctrl_ops stm32_pinctrl_ops = {
 471#if CONFIG_IS_ENABLED(PINCTRL_FULL)
 472        .set_state              = stm32_pinctrl_set_state,
 473#else /* PINCTRL_FULL */
 474        .set_state_simple       = stm32_pinctrl_set_state_simple,
 475#endif /* PINCTRL_FULL */
 476#ifndef CONFIG_SPL_BUILD
 477        .get_pin_name           = stm32_pinctrl_get_pin_name,
 478        .get_pins_count         = stm32_pinctrl_get_pins_count,
 479        .get_pin_muxing         = stm32_pinctrl_get_pin_muxing,
 480#endif
 481};
 482
 483static const struct udevice_id stm32_pinctrl_ids[] = {
 484        { .compatible = "st,stm32f429-pinctrl" },
 485        { .compatible = "st,stm32f469-pinctrl" },
 486        { .compatible = "st,stm32f746-pinctrl" },
 487        { .compatible = "st,stm32f769-pinctrl" },
 488        { .compatible = "st,stm32h743-pinctrl" },
 489        { .compatible = "st,stm32mp157-pinctrl" },
 490        { .compatible = "st,stm32mp157-z-pinctrl" },
 491        { }
 492};
 493
 494U_BOOT_DRIVER(pinctrl_stm32) = {
 495        .name                   = "pinctrl_stm32",
 496        .id                     = UCLASS_PINCTRL,
 497        .of_match               = stm32_pinctrl_ids,
 498        .ops                    = &stm32_pinctrl_ops,
 499        .bind                   = stm32_pinctrl_bind,
 500        .probe                  = stm32_pinctrl_probe,
 501        .priv_auto      = sizeof(struct stm32_pinctrl_priv),
 502};
 503