linux/drivers/gpio/gpio-rockchip.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2013 MundoReader S.L.
   4 * Author: Heiko Stuebner <heiko@sntech.de>
   5 *
   6 * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
   7 */
   8
   9#include <linux/bitops.h>
  10#include <linux/clk.h>
  11#include <linux/device.h>
  12#include <linux/err.h>
  13#include <linux/gpio/driver.h>
  14#include <linux/init.h>
  15#include <linux/interrupt.h>
  16#include <linux/io.h>
  17#include <linux/module.h>
  18#include <linux/of.h>
  19#include <linux/of_address.h>
  20#include <linux/of_device.h>
  21#include <linux/of_irq.h>
  22#include <linux/regmap.h>
  23
  24#include "../pinctrl/core.h"
  25#include "../pinctrl/pinctrl-rockchip.h"
  26
  27#define GPIO_TYPE_V1            (0)           /* GPIO Version ID reserved */
  28#define GPIO_TYPE_V2            (0x01000C2B)  /* GPIO Version ID 0x01000C2B */
  29
  30static const struct rockchip_gpio_regs gpio_regs_v1 = {
  31        .port_dr = 0x00,
  32        .port_ddr = 0x04,
  33        .int_en = 0x30,
  34        .int_mask = 0x34,
  35        .int_type = 0x38,
  36        .int_polarity = 0x3c,
  37        .int_status = 0x40,
  38        .int_rawstatus = 0x44,
  39        .debounce = 0x48,
  40        .port_eoi = 0x4c,
  41        .ext_port = 0x50,
  42};
  43
  44static const struct rockchip_gpio_regs gpio_regs_v2 = {
  45        .port_dr = 0x00,
  46        .port_ddr = 0x08,
  47        .int_en = 0x10,
  48        .int_mask = 0x18,
  49        .int_type = 0x20,
  50        .int_polarity = 0x28,
  51        .int_bothedge = 0x30,
  52        .int_status = 0x50,
  53        .int_rawstatus = 0x58,
  54        .debounce = 0x38,
  55        .dbclk_div_en = 0x40,
  56        .dbclk_div_con = 0x48,
  57        .port_eoi = 0x60,
  58        .ext_port = 0x70,
  59        .version_id = 0x78,
  60};
  61
  62static inline void gpio_writel_v2(u32 val, void __iomem *reg)
  63{
  64        writel((val & 0xffff) | 0xffff0000, reg);
  65        writel((val >> 16) | 0xffff0000, reg + 0x4);
  66}
  67
  68static inline u32 gpio_readl_v2(void __iomem *reg)
  69{
  70        return readl(reg + 0x4) << 16 | readl(reg);
  71}
  72
  73static inline void rockchip_gpio_writel(struct rockchip_pin_bank *bank,
  74                                        u32 value, unsigned int offset)
  75{
  76        void __iomem *reg = bank->reg_base + offset;
  77
  78        if (bank->gpio_type == GPIO_TYPE_V2)
  79                gpio_writel_v2(value, reg);
  80        else
  81                writel(value, reg);
  82}
  83
  84static inline u32 rockchip_gpio_readl(struct rockchip_pin_bank *bank,
  85                                      unsigned int offset)
  86{
  87        void __iomem *reg = bank->reg_base + offset;
  88        u32 value;
  89
  90        if (bank->gpio_type == GPIO_TYPE_V2)
  91                value = gpio_readl_v2(reg);
  92        else
  93                value = readl(reg);
  94
  95        return value;
  96}
  97
  98static inline void rockchip_gpio_writel_bit(struct rockchip_pin_bank *bank,
  99                                            u32 bit, u32 value,
 100                                            unsigned int offset)
 101{
 102        void __iomem *reg = bank->reg_base + offset;
 103        u32 data;
 104
 105        if (bank->gpio_type == GPIO_TYPE_V2) {
 106                if (value)
 107                        data = BIT(bit % 16) | BIT(bit % 16 + 16);
 108                else
 109                        data = BIT(bit % 16 + 16);
 110                writel(data, bit >= 16 ? reg + 0x4 : reg);
 111        } else {
 112                data = readl(reg);
 113                data &= ~BIT(bit);
 114                if (value)
 115                        data |= BIT(bit);
 116                writel(data, reg);
 117        }
 118}
 119
 120static inline u32 rockchip_gpio_readl_bit(struct rockchip_pin_bank *bank,
 121                                          u32 bit, unsigned int offset)
 122{
 123        void __iomem *reg = bank->reg_base + offset;
 124        u32 data;
 125
 126        if (bank->gpio_type == GPIO_TYPE_V2) {
 127                data = readl(bit >= 16 ? reg + 0x4 : reg);
 128                data >>= bit % 16;
 129        } else {
 130                data = readl(reg);
 131                data >>= bit;
 132        }
 133
 134        return data & (0x1);
 135}
 136
 137static int rockchip_gpio_get_direction(struct gpio_chip *chip,
 138                                       unsigned int offset)
 139{
 140        struct rockchip_pin_bank *bank = gpiochip_get_data(chip);
 141        u32 data;
 142
 143        data = rockchip_gpio_readl_bit(bank, offset, bank->gpio_regs->port_ddr);
 144        if (data)
 145                return GPIO_LINE_DIRECTION_OUT;
 146
 147        return GPIO_LINE_DIRECTION_IN;
 148}
 149
 150static int rockchip_gpio_set_direction(struct gpio_chip *chip,
 151                                       unsigned int offset, bool input)
 152{
 153        struct rockchip_pin_bank *bank = gpiochip_get_data(chip);
 154        unsigned long flags;
 155        u32 data = input ? 0 : 1;
 156
 157        raw_spin_lock_irqsave(&bank->slock, flags);
 158        rockchip_gpio_writel_bit(bank, offset, data, bank->gpio_regs->port_ddr);
 159        raw_spin_unlock_irqrestore(&bank->slock, flags);
 160
 161        return 0;
 162}
 163
 164static void rockchip_gpio_set(struct gpio_chip *gc, unsigned int offset,
 165                              int value)
 166{
 167        struct rockchip_pin_bank *bank = gpiochip_get_data(gc);
 168        unsigned long flags;
 169
 170        raw_spin_lock_irqsave(&bank->slock, flags);
 171        rockchip_gpio_writel_bit(bank, offset, value, bank->gpio_regs->port_dr);
 172        raw_spin_unlock_irqrestore(&bank->slock, flags);
 173}
 174
 175static int rockchip_gpio_get(struct gpio_chip *gc, unsigned int offset)
 176{
 177        struct rockchip_pin_bank *bank = gpiochip_get_data(gc);
 178        u32 data;
 179
 180        data = readl(bank->reg_base + bank->gpio_regs->ext_port);
 181        data >>= offset;
 182        data &= 1;
 183
 184        return data;
 185}
 186
 187static int rockchip_gpio_set_debounce(struct gpio_chip *gc,
 188                                      unsigned int offset,
 189                                      unsigned int debounce)
 190{
 191        struct rockchip_pin_bank *bank = gpiochip_get_data(gc);
 192        const struct rockchip_gpio_regs *reg = bank->gpio_regs;
 193        unsigned long flags, div_reg, freq, max_debounce;
 194        bool div_debounce_support;
 195        unsigned int cur_div_reg;
 196        u64 div;
 197
 198        if (bank->gpio_type == GPIO_TYPE_V2 && !IS_ERR(bank->db_clk)) {
 199                div_debounce_support = true;
 200                freq = clk_get_rate(bank->db_clk);
 201                max_debounce = (GENMASK(23, 0) + 1) * 2 * 1000000 / freq;
 202                if (debounce > max_debounce)
 203                        return -EINVAL;
 204
 205                div = debounce * freq;
 206                div_reg = DIV_ROUND_CLOSEST_ULL(div, 2 * USEC_PER_SEC) - 1;
 207        } else {
 208                div_debounce_support = false;
 209        }
 210
 211        raw_spin_lock_irqsave(&bank->slock, flags);
 212
 213        /* Only the v1 needs to configure div_en and div_con for dbclk */
 214        if (debounce) {
 215                if (div_debounce_support) {
 216                        /* Configure the max debounce from consumers */
 217                        cur_div_reg = readl(bank->reg_base +
 218                                            reg->dbclk_div_con);
 219                        if (cur_div_reg < div_reg)
 220                                writel(div_reg, bank->reg_base +
 221                                       reg->dbclk_div_con);
 222                        rockchip_gpio_writel_bit(bank, offset, 1,
 223                                                 reg->dbclk_div_en);
 224                }
 225
 226                rockchip_gpio_writel_bit(bank, offset, 1, reg->debounce);
 227        } else {
 228                if (div_debounce_support)
 229                        rockchip_gpio_writel_bit(bank, offset, 0,
 230                                                 reg->dbclk_div_en);
 231
 232                rockchip_gpio_writel_bit(bank, offset, 0, reg->debounce);
 233        }
 234
 235        raw_spin_unlock_irqrestore(&bank->slock, flags);
 236
 237        /* Enable or disable dbclk at last */
 238        if (div_debounce_support) {
 239                if (debounce)
 240                        clk_prepare_enable(bank->db_clk);
 241                else
 242                        clk_disable_unprepare(bank->db_clk);
 243        }
 244
 245        return 0;
 246}
 247
 248static int rockchip_gpio_direction_input(struct gpio_chip *gc,
 249                                         unsigned int offset)
 250{
 251        return rockchip_gpio_set_direction(gc, offset, true);
 252}
 253
 254static int rockchip_gpio_direction_output(struct gpio_chip *gc,
 255                                          unsigned int offset, int value)
 256{
 257        rockchip_gpio_set(gc, offset, value);
 258
 259        return rockchip_gpio_set_direction(gc, offset, false);
 260}
 261
 262/*
 263 * gpiolib set_config callback function. The setting of the pin
 264 * mux function as 'gpio output' will be handled by the pinctrl subsystem
 265 * interface.
 266 */
 267static int rockchip_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
 268                                  unsigned long config)
 269{
 270        enum pin_config_param param = pinconf_to_config_param(config);
 271
 272        switch (param) {
 273        case PIN_CONFIG_INPUT_DEBOUNCE:
 274                rockchip_gpio_set_debounce(gc, offset, true);
 275                /*
 276                 * Rockchip's gpio could only support up to one period
 277                 * of the debounce clock(pclk), which is far away from
 278                 * satisftying the requirement, as pclk is usually near
 279                 * 100MHz shared by all peripherals. So the fact is it
 280                 * has crippled debounce capability could only be useful
 281                 * to prevent any spurious glitches from waking up the system
 282                 * if the gpio is conguired as wakeup interrupt source. Let's
 283                 * still return -ENOTSUPP as before, to make sure the caller
 284                 * of gpiod_set_debounce won't change its behaviour.
 285                 */
 286                return -ENOTSUPP;
 287        default:
 288                return -ENOTSUPP;
 289        }
 290}
 291
 292/*
 293 * gpiolib gpio_to_irq callback function. Creates a mapping between a GPIO pin
 294 * and a virtual IRQ, if not already present.
 295 */
 296static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned int offset)
 297{
 298        struct rockchip_pin_bank *bank = gpiochip_get_data(gc);
 299        unsigned int virq;
 300
 301        if (!bank->domain)
 302                return -ENXIO;
 303
 304        virq = irq_create_mapping(bank->domain, offset);
 305
 306        return (virq) ? : -ENXIO;
 307}
 308
 309static const struct gpio_chip rockchip_gpiolib_chip = {
 310        .request = gpiochip_generic_request,
 311        .free = gpiochip_generic_free,
 312        .set = rockchip_gpio_set,
 313        .get = rockchip_gpio_get,
 314        .get_direction  = rockchip_gpio_get_direction,
 315        .direction_input = rockchip_gpio_direction_input,
 316        .direction_output = rockchip_gpio_direction_output,
 317        .set_config = rockchip_gpio_set_config,
 318        .to_irq = rockchip_gpio_to_irq,
 319        .owner = THIS_MODULE,
 320};
 321
 322static void rockchip_irq_demux(struct irq_desc *desc)
 323{
 324        struct irq_chip *chip = irq_desc_get_chip(desc);
 325        struct rockchip_pin_bank *bank = irq_desc_get_handler_data(desc);
 326        u32 pend;
 327
 328        dev_dbg(bank->dev, "got irq for bank %s\n", bank->name);
 329
 330        chained_irq_enter(chip, desc);
 331
 332        pend = readl_relaxed(bank->reg_base + bank->gpio_regs->int_status);
 333
 334        while (pend) {
 335                unsigned int irq, virq;
 336
 337                irq = __ffs(pend);
 338                pend &= ~BIT(irq);
 339                virq = irq_find_mapping(bank->domain, irq);
 340
 341                if (!virq) {
 342                        dev_err(bank->dev, "unmapped irq %d\n", irq);
 343                        continue;
 344                }
 345
 346                dev_dbg(bank->dev, "handling irq %d\n", irq);
 347
 348                /*
 349                 * Triggering IRQ on both rising and falling edge
 350                 * needs manual intervention.
 351                 */
 352                if (bank->toggle_edge_mode & BIT(irq)) {
 353                        u32 data, data_old, polarity;
 354                        unsigned long flags;
 355
 356                        data = readl_relaxed(bank->reg_base +
 357                                             bank->gpio_regs->ext_port);
 358                        do {
 359                                raw_spin_lock_irqsave(&bank->slock, flags);
 360
 361                                polarity = readl_relaxed(bank->reg_base +
 362                                                         bank->gpio_regs->int_polarity);
 363                                if (data & BIT(irq))
 364                                        polarity &= ~BIT(irq);
 365                                else
 366                                        polarity |= BIT(irq);
 367                                writel(polarity,
 368                                       bank->reg_base +
 369                                       bank->gpio_regs->int_polarity);
 370
 371                                raw_spin_unlock_irqrestore(&bank->slock, flags);
 372
 373                                data_old = data;
 374                                data = readl_relaxed(bank->reg_base +
 375                                                     bank->gpio_regs->ext_port);
 376                        } while ((data & BIT(irq)) != (data_old & BIT(irq)));
 377                }
 378
 379                generic_handle_irq(virq);
 380        }
 381
 382        chained_irq_exit(chip, desc);
 383}
 384
 385static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)
 386{
 387        struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 388        struct rockchip_pin_bank *bank = gc->private;
 389        u32 mask = BIT(d->hwirq);
 390        u32 polarity;
 391        u32 level;
 392        u32 data;
 393        unsigned long flags;
 394        int ret = 0;
 395
 396        raw_spin_lock_irqsave(&bank->slock, flags);
 397
 398        rockchip_gpio_writel_bit(bank, d->hwirq, 0,
 399                                 bank->gpio_regs->port_ddr);
 400
 401        raw_spin_unlock_irqrestore(&bank->slock, flags);
 402
 403        if (type & IRQ_TYPE_EDGE_BOTH)
 404                irq_set_handler_locked(d, handle_edge_irq);
 405        else
 406                irq_set_handler_locked(d, handle_level_irq);
 407
 408        raw_spin_lock_irqsave(&bank->slock, flags);
 409
 410        level = rockchip_gpio_readl(bank, bank->gpio_regs->int_type);
 411        polarity = rockchip_gpio_readl(bank, bank->gpio_regs->int_polarity);
 412
 413        switch (type) {
 414        case IRQ_TYPE_EDGE_BOTH:
 415                if (bank->gpio_type == GPIO_TYPE_V2) {
 416                        bank->toggle_edge_mode &= ~mask;
 417                        rockchip_gpio_writel_bit(bank, d->hwirq, 1,
 418                                                 bank->gpio_regs->int_bothedge);
 419                        goto out;
 420                } else {
 421                        bank->toggle_edge_mode |= mask;
 422                        level |= mask;
 423
 424                        /*
 425                         * Determine gpio state. If 1 next interrupt should be
 426                         * falling otherwise rising.
 427                         */
 428                        data = readl(bank->reg_base + bank->gpio_regs->ext_port);
 429                        if (data & mask)
 430                                polarity &= ~mask;
 431                        else
 432                                polarity |= mask;
 433                }
 434                break;
 435        case IRQ_TYPE_EDGE_RISING:
 436                bank->toggle_edge_mode &= ~mask;
 437                level |= mask;
 438                polarity |= mask;
 439                break;
 440        case IRQ_TYPE_EDGE_FALLING:
 441                bank->toggle_edge_mode &= ~mask;
 442                level |= mask;
 443                polarity &= ~mask;
 444                break;
 445        case IRQ_TYPE_LEVEL_HIGH:
 446                bank->toggle_edge_mode &= ~mask;
 447                level &= ~mask;
 448                polarity |= mask;
 449                break;
 450        case IRQ_TYPE_LEVEL_LOW:
 451                bank->toggle_edge_mode &= ~mask;
 452                level &= ~mask;
 453                polarity &= ~mask;
 454                break;
 455        default:
 456                ret = -EINVAL;
 457                goto out;
 458        }
 459
 460        rockchip_gpio_writel(bank, level, bank->gpio_regs->int_type);
 461        rockchip_gpio_writel(bank, polarity, bank->gpio_regs->int_polarity);
 462out:
 463        raw_spin_unlock_irqrestore(&bank->slock, flags);
 464
 465        return ret;
 466}
 467
 468static void rockchip_irq_suspend(struct irq_data *d)
 469{
 470        struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 471        struct rockchip_pin_bank *bank = gc->private;
 472
 473        bank->saved_masks = irq_reg_readl(gc, bank->gpio_regs->int_mask);
 474        irq_reg_writel(gc, ~gc->wake_active, bank->gpio_regs->int_mask);
 475}
 476
 477static void rockchip_irq_resume(struct irq_data *d)
 478{
 479        struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
 480        struct rockchip_pin_bank *bank = gc->private;
 481
 482        irq_reg_writel(gc, bank->saved_masks, bank->gpio_regs->int_mask);
 483}
 484
 485static void rockchip_irq_enable(struct irq_data *d)
 486{
 487        irq_gc_mask_clr_bit(d);
 488}
 489
 490static void rockchip_irq_disable(struct irq_data *d)
 491{
 492        irq_gc_mask_set_bit(d);
 493}
 494
 495static int rockchip_interrupts_register(struct rockchip_pin_bank *bank)
 496{
 497        unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
 498        struct irq_chip_generic *gc;
 499        int ret;
 500
 501        bank->domain = irq_domain_add_linear(bank->of_node, 32,
 502                                        &irq_generic_chip_ops, NULL);
 503        if (!bank->domain) {
 504                dev_warn(bank->dev, "could not init irq domain for bank %s\n",
 505                         bank->name);
 506                return -EINVAL;
 507        }
 508
 509        ret = irq_alloc_domain_generic_chips(bank->domain, 32, 1,
 510                                             "rockchip_gpio_irq",
 511                                             handle_level_irq,
 512                                             clr, 0, 0);
 513        if (ret) {
 514                dev_err(bank->dev, "could not alloc generic chips for bank %s\n",
 515                        bank->name);
 516                irq_domain_remove(bank->domain);
 517                return -EINVAL;
 518        }
 519
 520        gc = irq_get_domain_generic_chip(bank->domain, 0);
 521        if (bank->gpio_type == GPIO_TYPE_V2) {
 522                gc->reg_writel = gpio_writel_v2;
 523                gc->reg_readl = gpio_readl_v2;
 524        }
 525
 526        gc->reg_base = bank->reg_base;
 527        gc->private = bank;
 528        gc->chip_types[0].regs.mask = bank->gpio_regs->int_mask;
 529        gc->chip_types[0].regs.ack = bank->gpio_regs->port_eoi;
 530        gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit;
 531        gc->chip_types[0].chip.irq_mask = irq_gc_mask_set_bit;
 532        gc->chip_types[0].chip.irq_unmask = irq_gc_mask_clr_bit;
 533        gc->chip_types[0].chip.irq_enable = rockchip_irq_enable;
 534        gc->chip_types[0].chip.irq_disable = rockchip_irq_disable;
 535        gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake;
 536        gc->chip_types[0].chip.irq_suspend = rockchip_irq_suspend;
 537        gc->chip_types[0].chip.irq_resume = rockchip_irq_resume;
 538        gc->chip_types[0].chip.irq_set_type = rockchip_irq_set_type;
 539        gc->wake_enabled = IRQ_MSK(bank->nr_pins);
 540
 541        /*
 542         * Linux assumes that all interrupts start out disabled/masked.
 543         * Our driver only uses the concept of masked and always keeps
 544         * things enabled, so for us that's all masked and all enabled.
 545         */
 546        rockchip_gpio_writel(bank, 0xffffffff, bank->gpio_regs->int_mask);
 547        rockchip_gpio_writel(bank, 0xffffffff, bank->gpio_regs->port_eoi);
 548        rockchip_gpio_writel(bank, 0xffffffff, bank->gpio_regs->int_en);
 549        gc->mask_cache = 0xffffffff;
 550
 551        irq_set_chained_handler_and_data(bank->irq,
 552                                         rockchip_irq_demux, bank);
 553
 554        return 0;
 555}
 556
 557static int rockchip_gpiolib_register(struct rockchip_pin_bank *bank)
 558{
 559        struct gpio_chip *gc;
 560        int ret;
 561
 562        bank->gpio_chip = rockchip_gpiolib_chip;
 563
 564        gc = &bank->gpio_chip;
 565        gc->base = bank->pin_base;
 566        gc->ngpio = bank->nr_pins;
 567        gc->label = bank->name;
 568        gc->parent = bank->dev;
 569#ifdef CONFIG_OF_GPIO
 570        gc->of_node = of_node_get(bank->of_node);
 571#endif
 572
 573        ret = gpiochip_add_data(gc, bank);
 574        if (ret) {
 575                dev_err(bank->dev, "failed to add gpiochip %s, %d\n",
 576                        gc->label, ret);
 577                return ret;
 578        }
 579
 580        /*
 581         * For DeviceTree-supported systems, the gpio core checks the
 582         * pinctrl's device node for the "gpio-ranges" property.
 583         * If it is present, it takes care of adding the pin ranges
 584         * for the driver. In this case the driver can skip ahead.
 585         *
 586         * In order to remain compatible with older, existing DeviceTree
 587         * files which don't set the "gpio-ranges" property or systems that
 588         * utilize ACPI the driver has to call gpiochip_add_pin_range().
 589         */
 590        if (!of_property_read_bool(bank->of_node, "gpio-ranges")) {
 591                struct device_node *pctlnp = of_get_parent(bank->of_node);
 592                struct pinctrl_dev *pctldev = NULL;
 593
 594                if (!pctlnp)
 595                        return -ENODATA;
 596
 597                pctldev = of_pinctrl_get(pctlnp);
 598                if (!pctldev)
 599                        return -ENODEV;
 600
 601                ret = gpiochip_add_pin_range(gc, dev_name(pctldev->dev), 0,
 602                                             gc->base, gc->ngpio);
 603                if (ret) {
 604                        dev_err(bank->dev, "Failed to add pin range\n");
 605                        goto fail;
 606                }
 607        }
 608
 609        ret = rockchip_interrupts_register(bank);
 610        if (ret) {
 611                dev_err(bank->dev, "failed to register interrupt, %d\n", ret);
 612                goto fail;
 613        }
 614
 615        return 0;
 616
 617fail:
 618        gpiochip_remove(&bank->gpio_chip);
 619
 620        return ret;
 621}
 622
 623static int rockchip_get_bank_data(struct rockchip_pin_bank *bank)
 624{
 625        struct resource res;
 626        int id = 0;
 627
 628        if (of_address_to_resource(bank->of_node, 0, &res)) {
 629                dev_err(bank->dev, "cannot find IO resource for bank\n");
 630                return -ENOENT;
 631        }
 632
 633        bank->reg_base = devm_ioremap_resource(bank->dev, &res);
 634        if (IS_ERR(bank->reg_base))
 635                return PTR_ERR(bank->reg_base);
 636
 637        bank->irq = irq_of_parse_and_map(bank->of_node, 0);
 638        if (!bank->irq)
 639                return -EINVAL;
 640
 641        bank->clk = of_clk_get(bank->of_node, 0);
 642        if (IS_ERR(bank->clk))
 643                return PTR_ERR(bank->clk);
 644
 645        clk_prepare_enable(bank->clk);
 646        id = readl(bank->reg_base + gpio_regs_v2.version_id);
 647
 648        /* If not gpio v2, that is default to v1. */
 649        if (id == GPIO_TYPE_V2) {
 650                bank->gpio_regs = &gpio_regs_v2;
 651                bank->gpio_type = GPIO_TYPE_V2;
 652                bank->db_clk = of_clk_get(bank->of_node, 1);
 653                if (IS_ERR(bank->db_clk)) {
 654                        dev_err(bank->dev, "cannot find debounce clk\n");
 655                        clk_disable_unprepare(bank->clk);
 656                        return -EINVAL;
 657                }
 658        } else {
 659                bank->gpio_regs = &gpio_regs_v1;
 660                bank->gpio_type = GPIO_TYPE_V1;
 661        }
 662
 663        return 0;
 664}
 665
 666static struct rockchip_pin_bank *
 667rockchip_gpio_find_bank(struct pinctrl_dev *pctldev, int id)
 668{
 669        struct rockchip_pinctrl *info;
 670        struct rockchip_pin_bank *bank;
 671        int i, found = 0;
 672
 673        info = pinctrl_dev_get_drvdata(pctldev);
 674        bank = info->ctrl->pin_banks;
 675        for (i = 0; i < info->ctrl->nr_banks; i++, bank++) {
 676                if (bank->bank_num == id) {
 677                        found = 1;
 678                        break;
 679                }
 680        }
 681
 682        return found ? bank : NULL;
 683}
 684
 685static int rockchip_gpio_probe(struct platform_device *pdev)
 686{
 687        struct device *dev = &pdev->dev;
 688        struct device_node *np = dev->of_node;
 689        struct device_node *pctlnp = of_get_parent(np);
 690        struct pinctrl_dev *pctldev = NULL;
 691        struct rockchip_pin_bank *bank = NULL;
 692        struct rockchip_pin_output_deferred *cfg;
 693        static int gpio;
 694        int id, ret;
 695
 696        if (!np || !pctlnp)
 697                return -ENODEV;
 698
 699        pctldev = of_pinctrl_get(pctlnp);
 700        if (!pctldev)
 701                return -EPROBE_DEFER;
 702
 703        id = of_alias_get_id(np, "gpio");
 704        if (id < 0)
 705                id = gpio++;
 706
 707        bank = rockchip_gpio_find_bank(pctldev, id);
 708        if (!bank)
 709                return -EINVAL;
 710
 711        bank->dev = dev;
 712        bank->of_node = np;
 713
 714        raw_spin_lock_init(&bank->slock);
 715
 716        ret = rockchip_get_bank_data(bank);
 717        if (ret)
 718                return ret;
 719
 720        /*
 721         * Prevent clashes with a deferred output setting
 722         * being added right at this moment.
 723         */
 724        mutex_lock(&bank->deferred_lock);
 725
 726        ret = rockchip_gpiolib_register(bank);
 727        if (ret) {
 728                clk_disable_unprepare(bank->clk);
 729                mutex_unlock(&bank->deferred_lock);
 730                return ret;
 731        }
 732
 733        while (!list_empty(&bank->deferred_output)) {
 734                cfg = list_first_entry(&bank->deferred_output,
 735                                       struct rockchip_pin_output_deferred, head);
 736                list_del(&cfg->head);
 737
 738                ret = rockchip_gpio_direction_output(&bank->gpio_chip, cfg->pin, cfg->arg);
 739                if (ret)
 740                        dev_warn(dev, "setting output pin %u to %u failed\n", cfg->pin, cfg->arg);
 741
 742                kfree(cfg);
 743        }
 744
 745        mutex_unlock(&bank->deferred_lock);
 746
 747        platform_set_drvdata(pdev, bank);
 748        dev_info(dev, "probed %pOF\n", np);
 749
 750        return 0;
 751}
 752
 753static int rockchip_gpio_remove(struct platform_device *pdev)
 754{
 755        struct rockchip_pin_bank *bank = platform_get_drvdata(pdev);
 756
 757        clk_disable_unprepare(bank->clk);
 758        gpiochip_remove(&bank->gpio_chip);
 759
 760        return 0;
 761}
 762
 763static const struct of_device_id rockchip_gpio_match[] = {
 764        { .compatible = "rockchip,gpio-bank", },
 765        { .compatible = "rockchip,rk3188-gpio-bank0" },
 766        { },
 767};
 768
 769static struct platform_driver rockchip_gpio_driver = {
 770        .probe          = rockchip_gpio_probe,
 771        .remove         = rockchip_gpio_remove,
 772        .driver         = {
 773                .name   = "rockchip-gpio",
 774                .of_match_table = rockchip_gpio_match,
 775        },
 776};
 777
 778static int __init rockchip_gpio_init(void)
 779{
 780        return platform_driver_register(&rockchip_gpio_driver);
 781}
 782postcore_initcall(rockchip_gpio_init);
 783
 784static void __exit rockchip_gpio_exit(void)
 785{
 786        platform_driver_unregister(&rockchip_gpio_driver);
 787}
 788module_exit(rockchip_gpio_exit);
 789
 790MODULE_DESCRIPTION("Rockchip gpio driver");
 791MODULE_ALIAS("platform:rockchip-gpio");
 792MODULE_LICENSE("GPL v2");
 793MODULE_DEVICE_TABLE(of, rockchip_gpio_match);
 794