2 * Pinctrl driver for Rockchip SoCs
4 * Copyright (c) 2013 MundoReader S.L.
5 * Author: Heiko Stuebner <heiko@sntech.de>
7 * With some ideas taken from pinctrl-samsung:
8 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
9 * http://www.samsung.com
10 * Copyright (c) 2012 Linaro Ltd
11 * http://www.linaro.org
14 * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2 as published
18 * by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
26 #include <linux/module.h>
27 #include <linux/platform_device.h>
29 #include <linux/bitops.h>
30 #include <linux/irq.h>
31 #include <linux/interrupt.h>
32 #include <linux/gpio.h>
33 #include <linux/of_address.h>
34 #include <linux/of_irq.h>
35 #include <linux/pinctrl/machine.h>
36 #include <linux/pinctrl/pinconf.h>
37 #include <linux/pinctrl/pinctrl.h>
38 #include <linux/pinctrl/pinmux.h>
39 #include <linux/pinctrl/pinconf-generic.h>
40 #include <linux/irqchip/chained_irq.h>
41 #include <linux/clk.h>
42 #include <dt-bindings/pinctrl/rockchip.h>
43 #include <dt-bindings/pinctrl/rockchip-rk3188.h>
47 #include <linux/of_device.h>
48 #include <linux/pinctrl/consumer.h>
49 #include <linux/slab.h>
57 #define DBG_PINCTRL(x...) if(atomic_read(&info->debug_flag) == 1) printk(x)
59 #define DBG_PINCTRL(x...)
63 /* GPIO control registers */
64 #define GPIO_SWPORT_DR 0x00
65 #define GPIO_SWPORT_DDR 0x04
66 #define GPIO_INTEN 0x30
67 #define GPIO_INTMASK 0x34
68 #define GPIO_INTTYPE_LEVEL 0x38
69 #define GPIO_INT_POLARITY 0x3c
70 #define GPIO_INT_STATUS 0x40
71 #define GPIO_INT_RAWSTATUS 0x44
72 #define GPIO_DEBOUNCE 0x48
73 #define GPIO_PORTS_EOI 0x4c
74 #define GPIO_EXT_PORT 0x50
75 #define GPIO_LS_SYNC 0x60
77 enum rockchip_pinctrl_type {
83 enum rockchip_pin_bank_type {
89 * @reg_base: register base of the gpio bank
90 * @reg_pull: optional separate register for additional pull settings
91 * @clk: clock of the gpio bank
92 * @irq: interrupt of the gpio bank
93 * @pin_base: first pin number
94 * @nr_pins: number of pins in this bank
95 * @name: name of the bank
96 * @bank_num: number of the bank, to account for holes
97 * @valid: are all necessary informations present
98 * @of_node: dt node of this bank
99 * @drvdata: common pinctrl basedata
100 * @domain: irqdomain of the gpio bank
101 * @gpio_chip: gpiolib chip
102 * @grange: gpio range
103 * @slock: spinlock for the gpio bank
105 struct rockchip_pin_bank {
106 void __iomem *reg_base;
107 void __iomem *reg_pull;
114 enum rockchip_pin_bank_type bank_type;
116 struct device_node *of_node;
117 struct rockchip_pinctrl *drvdata;
118 struct irq_domain *domain;
119 struct gpio_chip gpio_chip;
120 struct pinctrl_gpio_range grange;
122 u32 toggle_edge_mode;
127 #define PIN_BANK(id, pins, label) \
136 struct rockchip_pin_ctrl {
137 struct rockchip_pin_bank *pin_banks;
141 enum rockchip_pinctrl_type type;
143 void (*pull_calc_reg)(struct rockchip_pin_bank *bank, int pin_num,
144 void __iomem **reg, u8 *bit);
147 struct rockchip_pin_config {
149 unsigned long *configs;
150 unsigned int nconfigs;
154 * struct rockchip_pin_group: represent group of pins of a pinmux function.
155 * @name: name of the pin group, used to lookup the group.
156 * @pins: the pins included in this group.
157 * @npins: number of pins included in this group.
158 * @func: the mux function number to be programmed when selected.
159 * @configs: the config values to be set for each pin
160 * @nconfigs: number of configs for each pin
162 struct rockchip_pin_group {
164 const char *func_name;
167 struct rockchip_pin_config *data;
171 * struct rockchip_pmx_func: represent a pin function.
172 * @name: name of the pin function, used to lookup the function.
173 * @groups: one or more names of pin groups that provide this function.
174 * @num_groups: number of groups included in @groups.
176 struct rockchip_pmx_func {
182 struct rockchip_pinctrl {
183 void __iomem *reg_base;
184 void __iomem *reg_pull;
186 struct rockchip_pin_ctrl *ctrl;
187 struct pinctrl_desc pctl;
188 struct pinctrl_dev *pctl_dev;
189 struct rockchip_pin_group *groups;
190 unsigned int ngroups;
191 struct rockchip_pmx_func *functions;
192 unsigned int nfunctions;
207 struct iomux_mode mux;
212 struct func_to_reg_offset {
213 unsigned int reg_type;
214 const char *vol_name;
215 const char *func_name;
216 const char *group_name;
217 unsigned int reg_offset;
218 unsigned int bit_offset;
219 unsigned int bit_mask;
222 #define FUNC_GROUP_TO_REG_OFFSET(type, vol, func, group, reg, bit, mask) \
227 .group_name = group, \
235 static inline struct rockchip_pin_bank *gc_to_pin_bank(struct gpio_chip *gc)
237 return container_of(gc, struct rockchip_pin_bank, gpio_chip);
240 static const inline struct rockchip_pin_group *pinctrl_name_to_group(
241 const struct rockchip_pinctrl *info,
246 for (i = 0; i < info->ngroups; i++) {
247 if (!strcmp(info->groups[i].name, name))
248 return &info->groups[i];
255 * given a pin number that is local to a pin controller, find out the pin bank
256 * and the register base of the pin bank.
258 static struct rockchip_pin_bank *pin_to_bank(struct rockchip_pinctrl *info,
261 struct rockchip_pin_bank *b = info->ctrl->pin_banks;
263 while (pin >= (b->pin_base + b->nr_pins))
269 static struct rockchip_pin_bank *bank_num_to_bank(
270 struct rockchip_pinctrl *info,
273 struct rockchip_pin_bank *b = info->ctrl->pin_banks;
276 for (i = 0; i < info->ctrl->nr_banks; i++, b++) {
277 if (b->bank_num == num)
281 return ERR_PTR(-EINVAL);
285 * Pinctrl_ops handling
288 static int rockchip_get_groups_count(struct pinctrl_dev *pctldev)
290 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
292 return info->ngroups;
295 static const char *rockchip_get_group_name(struct pinctrl_dev *pctldev,
298 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
300 return info->groups[selector].name;
303 static int rockchip_get_group_pins(struct pinctrl_dev *pctldev,
304 unsigned selector, const unsigned **pins,
307 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
309 if (selector >= info->ngroups)
312 *pins = info->groups[selector].pins;
313 *npins = info->groups[selector].npins;
318 static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
319 struct device_node *np,
320 struct pinctrl_map **map, unsigned *num_maps)
322 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
323 const struct rockchip_pin_group *grp;
324 struct pinctrl_map *new_map;
325 struct device_node *parent;
330 * first find the group of this node and check if we need to create
331 * config maps for pins
333 grp = pinctrl_name_to_group(info, np->name);
335 dev_err(info->dev, "unable to find group for node %s\n",
340 map_num += grp->npins;
341 new_map = devm_kzalloc(pctldev->dev, sizeof(*new_map) * map_num,
350 parent = of_get_parent(np);
352 devm_kfree(pctldev->dev, new_map);
355 new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
356 new_map[0].data.mux.function = parent->name;
357 new_map[0].data.mux.group = np->name;
360 /* create config map */
362 for (i = 0; i < grp->npins; i++) {
363 new_map[i].type = PIN_MAP_TYPE_CONFIGS_GROUP;
364 new_map[i].data.configs.group_or_pin = grp->name;
365 //pin_get_name(pctldev, grp->pins[i]);
366 new_map[i].data.configs.configs = grp->data[i].configs;
367 new_map[i].data.configs.num_configs = grp->data[i].nconfigs;
370 dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n",
371 (*map)->data.mux.function, (*map)->data.mux.group, map_num);
376 static void rockchip_dt_free_map(struct pinctrl_dev *pctldev,
377 struct pinctrl_map *map, unsigned num_maps)
381 static const struct pinctrl_ops rockchip_pctrl_ops = {
382 .get_groups_count = rockchip_get_groups_count,
383 .get_group_name = rockchip_get_group_name,
384 .get_group_pins = rockchip_get_group_pins,
385 .dt_node_to_map = rockchip_dt_node_to_map,
386 .dt_free_map = rockchip_dt_free_map,
392 * Set a new mux function for a pin.
394 * The register is divided into the upper and lower 16 bit. When changing
395 * a value, the previous register value is not read and changed. Instead
396 * it seems the changed bits are marked in the upper 16 bit, while the
397 * changed value gets set in the same offset in the lower 16 bit.
398 * All pin settings seem to be 2 bit wide in both the upper and lower
400 * @bank: pin bank to change
401 * @pin: pin to change
402 * @mux: new mux function to set
404 static void rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
406 struct rockchip_pinctrl *info = bank->drvdata;
407 void __iomem *reg = info->reg_base + info->ctrl->mux_offset;
414 /*GPIO0_C0 = 0x0c00, NAND_D8, */
415 /*GPIO0_C1 = 0x0c10, NAND_D9, */
417 if(bank->bank_num == 15)
419 printk("%s:error bank num %d is out of range\n",__func__, bank->bank_num);
425 if((m.mux.bank != bank->bank_num) || (((m.mux.goff - 0x0A) * 8 + m.mux.off ) != pin))
427 printk("%s:error:mux_bank(%d) != gpio_bank(%d), mux_offset(%d) != gpio_offset(%d)\n",__func__,
428 m.mux.bank, bank->bank_num, ((m.mux.goff - 0x0A) * 8 + m.mux.off ), pin);
432 /* get basic quadrupel of mux registers and the correct reg inside */
433 reg += bank->bank_num * 0x10;
434 reg += (pin / 8) * 4;
437 spin_lock_irqsave(&bank->slock, flags);
439 data = (3 << (bit + 16));
440 data |= (mux & 3) << bit;
443 spin_unlock_irqrestore(&bank->slock, flags);
445 DBG_PINCTRL("%s:setting GPIO%d-%d to mux:0x%x\n", __func__, m.mux.bank, ((m.mux.goff - 0x0A) * 8 + m.mux.off ), mux);
447 //DBG_PINCTRL("%s:setting mux of GPIO%d-%d to %d\n", __func__, bank->bank_num, pin, mux&0x3);
452 * Pinmux_ops handling
455 static int rockchip_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
457 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
459 return info->nfunctions;
462 static const char *rockchip_pmx_get_func_name(struct pinctrl_dev *pctldev,
465 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
467 return info->functions[selector].name;
470 static int rockchip_pmx_get_groups(struct pinctrl_dev *pctldev,
471 unsigned selector, const char * const **groups,
472 unsigned * const num_groups)
474 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
476 *groups = info->functions[selector].groups;
477 *num_groups = info->functions[selector].ngroups;
482 static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
485 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
486 const unsigned int *pins = info->groups[group].pins;
487 const struct rockchip_pin_config *data = info->groups[group].data;
488 struct rockchip_pin_bank *bank;
491 DBG_PINCTRL("%s:enable function %s group %s\n",
492 __func__, info->functions[selector].name, info->groups[group].name);
495 * for each pin in the pin group selected, program the correspoding pin
496 * pin function number in the config register.
498 for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
499 bank = pin_to_bank(info, pins[cnt]);
500 rockchip_set_mux(bank, pins[cnt] - bank->pin_base,
507 static void rockchip_pmx_disable(struct pinctrl_dev *pctldev,
508 unsigned selector, unsigned group)
510 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
511 const unsigned int *pins = info->groups[group].pins;
512 struct rockchip_pin_bank *bank;
515 DBG_PINCTRL("%s:disable function %s group %s\n",
516 __func__, info->functions[selector].name, info->groups[group].name);
518 for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
519 bank = pin_to_bank(info, pins[cnt]);
520 rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
525 * The calls to gpio_direction_output() and gpio_direction_input()
526 * leads to this function call (via the pinctrl_gpio_direction_{input|output}()
527 * function called from the gpiolib interface).
529 static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
530 struct pinctrl_gpio_range *range,
531 unsigned offset, bool input)
533 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
534 struct rockchip_pin_bank *bank;
535 struct gpio_chip *chip;
541 bank = gc_to_pin_bank(chip);
542 pin = offset - chip->base;
544 DBG_PINCTRL("%s:gpio_direction for pin %u as %s-%d to %s\n",
545 __func__, offset, range->name, pin, input ? "input" : "output");
547 mux = (bank->bank_num << 12) | (((pin / 8) + 0x0A) << 8) | ((pin % 8)<< 4) | RK_FUNC_GPIO;
549 rockchip_set_mux(bank, pin, mux);
551 data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
552 /* set bit to 1 for output, 0 for input */
557 writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR);
562 static const struct pinmux_ops rockchip_pmx_ops = {
563 .get_functions_count = rockchip_pmx_get_funcs_count,
564 .get_function_name = rockchip_pmx_get_func_name,
565 .get_function_groups = rockchip_pmx_get_groups,
566 .enable = rockchip_pmx_enable,
567 .disable = rockchip_pmx_disable,
568 .gpio_set_direction = rockchip_pmx_gpio_set_direction,
577 static struct func_to_reg_offset rk3188_func_to_drv_reg_offset[] =
579 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "NULL", "reserve" ,"NULL", RK3188_GRF_IO_CON0, 0 ,3),
580 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "flash-vcc", "gpio0_flash" ,"NULL", RK3188_GRF_IO_CON0, 2, 3),
581 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "flash-vcc", "gpio0_flash" ,"NULL", RK3188_GRF_IO_CON0, 4 ,3),
582 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "flash-vcc", "gpio0_d" ,"NULL", RK3188_GRF_IO_CON0, 6 ,3),
583 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap0-vcc", "gpio1_uart0" ,"NULL", RK3188_GRF_IO_CON0, 8 ,3),
584 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap1-vcc", "gpio1_uart1" ,"NULL", RK3188_GRF_IO_CON0, 10 ,3),
585 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap1-vcc", "gpio1_spi0" ,"NULL", RK3188_GRF_IO_CON0, 10 ,3),
586 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "NULL", "gpio1_uart2" ,"NULL", RK3188_GRF_IO_CON0, 12 ,3),
587 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "gpio1_uart3" ,"NULL", RK3188_GRF_IO_CON0, 14 ,3),
588 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "gpio1_spi1" ,"NULL", RK3188_GRF_IO_CON0, 14 ,3),
590 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap1-vcc", "gpio1_i2s0" ,"NULL", RK3188_GRF_IO_CON1, 0 ,3),
591 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap1-vcc", "gpio1_i2s0" ,"NULL", RK3188_GRF_IO_CON1, 2 ,3),
592 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap1-vcc", "gpio1_c" ,"NULL", RK3188_GRF_IO_CON1, 4 ,3),
593 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio1-vcc", "gpio1_i2c0" ,"NULL", RK3188_GRF_IO_CON1, 6 ,3),
594 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio1-vcc", "gpio1_i2c1" ,"NULL", RK3188_GRF_IO_CON1, 8 ,3),
595 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio1-vcc", "gpio1_i2c2" ,"NULL", RK3188_GRF_IO_CON1, 10 ,3),
596 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap1-vcc", "gpio1_i2c4" ,"NULL", RK3188_GRF_IO_CON1, 12 ,3),
597 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "lcdc1-vcc", "gpio2_lcdc1" ,"NULL", RK3188_GRF_IO_CON1, 14 ,3),
599 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "lcdc1-vcc", "gpio2_lcdc1" ,"NULL", RK3188_GRF_IO_CON2, 0 ,3),
600 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "lcdc1-vcc", "gpio2_smc" ,"NULL", RK3188_GRF_IO_CON2, 2 ,3),
601 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "NULL", "reserve" ,"NULL", RK3188_GRF_IO_CON2, 4 ,3),
602 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap0-vcc", "gpio3_sdmmc" ,"NULL", RK3188_GRF_IO_CON2, 6 ,3),
603 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "ap0-vcc", "gpio3_sdmmc" ,"NULL", RK3188_GRF_IO_CON2, 8 ,3),
604 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "cif-vcc", "gpio3_b" ,"NULL", RK3188_GRF_IO_CON2, 10 ,3),
605 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "cif-vcc", "gpio3_cif" ,"NULL", RK3188_GRF_IO_CON2, 12 ,3),
606 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "cif-vcc", "gpio3_cif" ,"NULL", RK3188_GRF_IO_CON2, 14 ,3),
608 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "gpio3_sdio" ,"NULL", RK3188_GRF_IO_CON3, 0 ,3),
609 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "gpio3_sdio" ,"NULL", RK3188_GRF_IO_CON3, 2 ,3),
610 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "gpio3_pwm" ,"NULL", RK3188_GRF_IO_CON3, 4 ,3),
611 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "gpio3_d" ,"NULL", RK3188_GRF_IO_CON3, 6 ,3),
612 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "flash-vcc", "flash" ,"NULL", RK3188_GRF_IO_CON3, 8 ,3),
613 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "flash-vcc", "flash" ,"NULL", RK3188_GRF_IO_CON3, 10 ,3),
614 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "cif-vcc", "cif" ,"NULL", RK3188_GRF_IO_CON3, 12 ,3),
615 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "lcdc0-vcc", "lcdc0" ,"NULL", RK3188_GRF_IO_CON3, 14 ,3),
617 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "lcdc0-vcc", "lcdc0" ,"NULL", RK3188_GRF_IO_CON4, 0 ,3),
618 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "vccio0-vcc", "jtag" ,"NULL", RK3188_GRF_IO_CON4, 2 ,3),
619 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "NULL", "misc" ,"NULL", RK3188_GRF_IO_CON4, 4 ,3),
620 FUNC_GROUP_TO_REG_OFFSET(TYPE_DRV_REG, "NULL", "reserve" ,"NULL", RK3188_GRF_IO_CON4, 6 ,3),
624 static struct func_to_reg_offset rk3188_func_to_vol_reg_offset[] =
626 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "ap0-vcc", "vol_domain", "ap0-vcc", RK3188_GRF_IO_CON4, 8 ,1),
627 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "ap1-vcc", "vol_domain", "ap1-vcc", RK3188_GRF_IO_CON4, 9 ,1),
628 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "cif-vcc", "vol_domain", "cif-vcc", RK3188_GRF_IO_CON4, 10 ,1),
629 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "flash-vcc", "vol_domain", "flash-vcc", RK3188_GRF_IO_CON4, 11 ,1),
630 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "vccio0-vcc", "vol_domain", "vccio0-vcc", RK3188_GRF_IO_CON4, 12 ,1),
631 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "vccio1-vcc", "vol_domain", "vccio1-vcc", RK3188_GRF_IO_CON4, 13 ,1),
632 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "lcdc0-vcc", "vol_domain", "lcdc0-vcc", RK3188_GRF_IO_CON4, 14 ,1),
633 FUNC_GROUP_TO_REG_OFFSET(TYPE_VOL_REG, "lcdc1-vcc", "vol_domain", "lcdc1-vcc", RK3188_GRF_IO_CON4, 15 ,1),
636 static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
637 int pin_num, void __iomem **reg, u8 *bit)
639 struct rockchip_pinctrl *info = bank->drvdata;
641 *reg = info->reg_base + RK2928_PULL_OFFSET;
642 *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
643 *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
645 *bit = pin_num % RK2928_PULL_PINS_PER_REG;
647 DBG_PINCTRL("%s:GPIO%d-%d, pull_reg=0x%p, bit=%d\n", __func__, bank->bank_num, pin_num, *reg, *bit);
651 static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
652 int pin_num, void __iomem **reg, u8 *bit)
654 struct rockchip_pinctrl *info = bank->drvdata;
656 /* The first 12 pins of the first bank are located elsewhere */
657 if (bank->bank_type == RK3188_BANK0 && pin_num < 12) {
658 *reg = bank->reg_pull +
659 ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
660 *bit = pin_num % RK3188_PULL_PINS_PER_REG;
661 *bit *= RK3188_PULL_BITS_PER_PIN;
663 *reg = info->reg_pull - 4;
664 *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
665 *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
668 * The bits in these registers have an inverse ordering
669 * with the lowest pin being in bits 15:14 and the highest
672 *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
673 *bit *= RK3188_PULL_BITS_PER_PIN;
676 DBG_PINCTRL("%s:GPIO%d-%d, pull_reg=0x%p, bit=%d\n", __func__, bank->bank_num, pin_num, *reg, *bit);
679 static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
681 struct rockchip_pinctrl *info = bank->drvdata;
682 struct rockchip_pin_ctrl *ctrl = info->ctrl;
687 /* rk3066b does support any pulls */
688 if (ctrl->type == RK3066B)
689 return PIN_CONFIG_BIAS_DISABLE;
691 ctrl->pull_calc_reg(bank, pin_num, ®, &bit);
693 switch (ctrl->type) {
695 return !(readl_relaxed(reg) & BIT(bit))
696 ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
697 : PIN_CONFIG_BIAS_DISABLE;
699 data = readl_relaxed(reg) >> bit;
700 data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
704 return PIN_CONFIG_BIAS_DISABLE;
706 return PIN_CONFIG_BIAS_PULL_UP;
708 return PIN_CONFIG_BIAS_PULL_DOWN;
710 return PIN_CONFIG_BIAS_BUS_HOLD;
713 dev_err(info->dev, "unknown pull setting\n");
716 dev_err(info->dev, "unsupported pinctrl type\n");
720 DBG_PINCTRL("%s:GPIO%d-%d pull is 0x%x\n", __func__, bank->bank_num, pin_num, data);
723 static int rockchip_set_pull(struct rockchip_pin_bank *bank,
724 int pin_num, int pull)
726 struct rockchip_pinctrl *info = bank->drvdata;
727 struct rockchip_pin_ctrl *ctrl = info->ctrl;
734 /* rk3066b does support any pulls */
735 if (ctrl->type == RK3066B)
736 return pull ? -EINVAL : 0;
738 ctrl->pull_calc_reg(bank, pin_num, ®, &bit);
740 switch (ctrl->type) {
742 spin_lock_irqsave(&bank->slock, flags);
744 data = BIT(bit + 16);
745 if (pull == PIN_CONFIG_BIAS_DISABLE)
749 spin_unlock_irqrestore(&bank->slock, flags);
752 spin_lock_irqsave(&bank->slock, flags);
754 /* enable the write to the equivalent lower bits */
755 data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
758 case PIN_CONFIG_BIAS_DISABLE:
760 case PIN_CONFIG_BIAS_PULL_UP:
763 case PIN_CONFIG_BIAS_PULL_DOWN:
766 case PIN_CONFIG_BIAS_BUS_HOLD:
770 dev_err(info->dev, "unsupported pull setting %d\n",
777 spin_unlock_irqrestore(&bank->slock, flags);
780 dev_err(info->dev, "unsupported pinctrl type\n");
785 DBG_PINCTRL("%s:GPIO%d-%d pull is 0x%x\n", __func__, bank->bank_num, pin_num, data);
791 * Pinconf_ops handling
794 static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
795 enum pin_config_param pull)
797 switch (ctrl->type) {
799 return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
800 pull == PIN_CONFIG_BIAS_DISABLE);
802 return pull ? false : true;
804 return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
810 static int _rockchip_pinconf_get(struct rockchip_pin_bank *bank,
811 int pin_num, unsigned long *config, int config_type, unsigned group)
813 struct rockchip_pinctrl *info = bank->drvdata;
814 struct rockchip_pin_ctrl *ctrl = info->ctrl;
815 struct func_to_reg_offset reg_offset[4];//same name count should be less four
816 struct func_to_reg_offset *func_to_reg;
817 int i = 0, ii = 0, j = 0, jj = 0, num = 0;
826 DBG_PINCTRL("%s:GPIO%d-%d,group=%s, function=%s, type=%d\n", __func__, bank->bank_num, pin_num, info->groups[group].name, info->groups[group].func_name, config_type);
849 func_to_reg = rk3188_func_to_vol_reg_offset;
850 num = ARRAY_SIZE(rk3188_func_to_vol_reg_offset);
851 for(i = 0; i < num; i++)
853 if(!strcmp(info->groups[group].name, func_to_reg[i].group_name))
855 reg_offset[j++] = func_to_reg[i];
856 DBG_PINCTRL("%s:select \"%s\"\n",__func__, func_to_reg[i].group_name);
862 func_to_reg = rk3188_func_to_drv_reg_offset;
863 num = ARRAY_SIZE(rk3188_func_to_drv_reg_offset);
864 for(i = 0; i < num; i++)
866 if(!strcmp(info->groups[group].func_name, func_to_reg[i].func_name))
869 func_to_reg = rk3188_func_to_vol_reg_offset;
870 num = ARRAY_SIZE(rk3188_func_to_vol_reg_offset);
871 for(ii = 0; ii < num; ii++)
873 if(!strcmp(func_to_reg[i].vol_name, func_to_reg[ii].group_name))
875 reg_offset[jj++] = func_to_reg[ii];
876 DBG_PINCTRL("%s:select \"%s\"\n",__func__, func_to_reg[ii].group_name);
893 func_to_reg = rk3188_func_to_drv_reg_offset;
894 num = ARRAY_SIZE(rk3188_func_to_drv_reg_offset);
895 for(i = 0; i < num; i++)
897 if(!strcmp(info->groups[group].func_name, func_to_reg[i].func_name))
899 reg_offset[j++] = func_to_reg[i];
900 DBG_PINCTRL("%s:select \"%s\"\n",__func__, func_to_reg[i].func_name);
922 printk("%s:could find config register for PIN%d-%d,type=%d,num=%d\n",__func__, bank->bank_num, pin_num, config_type, num);
929 reg = info->reg_base + reg_offset[i].reg_offset;
930 spin_lock_irqsave(&bank->slock, flags);
931 data = readl_relaxed(reg) >> reg_offset[i].bit_offset;
932 data &= reg_offset[i].bit_mask;
933 spin_unlock_irqrestore(&bank->slock, flags);
937 DBG_PINCTRL("%s:reg_offset[%d]=0x%x,,bit_offset[%d]=0x%x,data[%d]=0x%x\n",__func__, i, reg_offset[i].reg_offset, i, reg_offset[i].bit_offset, i, data);
946 static int _rockchip_pinconf_set(struct rockchip_pin_bank *bank,
947 int pin_num, int param, int config_type, unsigned group)
949 struct rockchip_pinctrl *info = bank->drvdata;
950 struct rockchip_pin_ctrl *ctrl = info->ctrl;
951 struct func_to_reg_offset reg_offset[4];//same name count should be less four
952 struct func_to_reg_offset *func_to_reg;
953 int i = 0, ii = 0, j = 0, jj = 0, num = 0;
962 DBG_PINCTRL("%s:GPIO%d-%d,group=%s, function=%s, type=%d\n", __func__, bank->bank_num, pin_num, info->groups[group].name, info->groups[group].func_name, config_type);
985 func_to_reg = rk3188_func_to_vol_reg_offset;
986 num = ARRAY_SIZE(rk3188_func_to_vol_reg_offset);
987 for(i = 0; i < num; i++)
989 if(!strcmp(info->groups[group].name, func_to_reg[i].group_name))
991 reg_offset[j++] = func_to_reg[i];
992 DBG_PINCTRL("%s:select \"%s\"\n",__func__, func_to_reg[i].group_name);
998 func_to_reg = rk3188_func_to_drv_reg_offset;
999 num = ARRAY_SIZE(rk3188_func_to_drv_reg_offset);
1000 for(i = 0; i < num; i++)
1002 if(!strcmp(info->groups[group].func_name, func_to_reg[i].func_name))
1005 func_to_reg = rk3188_func_to_vol_reg_offset;
1006 num = ARRAY_SIZE(rk3188_func_to_vol_reg_offset);
1007 for(ii = 0; ii < num; ii++)
1009 if(!strcmp(rk3188_func_to_drv_reg_offset[i].vol_name, func_to_reg[ii].group_name))
1011 reg_offset[jj++] = func_to_reg[ii];
1012 DBG_PINCTRL("%s:select \"%s\"\n",__func__, func_to_reg[ii].group_name);
1029 func_to_reg = rk3188_func_to_drv_reg_offset;
1030 num = ARRAY_SIZE(rk3188_func_to_drv_reg_offset);
1031 for(i = 0; i < num; i++)
1033 if(!strcmp(info->groups[group].func_name, func_to_reg[i].func_name))
1035 reg_offset[j++] = func_to_reg[i];
1036 DBG_PINCTRL("%s:select \"%s\"\n",__func__, func_to_reg[i].func_name);
1058 printk("%s:could find config register for PIN%d-%d,type=%d,num=%d\n",__func__, bank->bank_num, pin_num, config_type, num);
1062 for(i=0; i < j; i++)
1064 reg = info->reg_base + reg_offset[i].reg_offset;
1065 data |= ((param & reg_offset[i].bit_mask) << (16 + reg_offset[i].bit_offset));
1066 data |= ((param & reg_offset[i].bit_mask) << reg_offset[i].bit_offset);
1067 spin_lock_irqsave(&bank->slock, flags);
1068 //writel_relaxed(data, reg);
1069 spin_unlock_irqrestore(&bank->slock, flags);
1071 DBG_PINCTRL("%s:reg_offset[%d]=0x%x,,bit_offset[%d]=0x%x,value[%d]=0x%x\n",__func__, i, reg_offset[i].reg_offset, i, reg_offset[i].bit_offset, i, data);
1082 /* set the pin config settings for a specified pin */
1083 static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
1084 unsigned long configs, unsigned group)
1086 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
1087 struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
1088 enum pin_config_param param;
1093 param = pinconf_to_config_param(configs);
1094 arg = pinconf_to_config_argument(configs);
1097 case PIN_CONFIG_BIAS_DISABLE:
1098 rc = rockchip_set_pull(bank, pin - bank->pin_base,
1103 case PIN_CONFIG_BIAS_PULL_UP:
1104 case PIN_CONFIG_BIAS_PULL_DOWN:
1105 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
1106 case PIN_CONFIG_BIAS_BUS_HOLD:
1107 if (!rockchip_pinconf_pull_valid(info->ctrl, param))
1113 rc = rockchip_set_pull(bank, pin - bank->pin_base,
1119 case PIN_CONFIG_POWER_SOURCE:
1120 rc = _rockchip_pinconf_set(bank, pin - bank->pin_base, param, TYPE_VOL_REG, group);
1125 case PIN_CONFIG_DRIVE_STRENGTH:
1126 rc = _rockchip_pinconf_set(bank, pin - bank->pin_base, param, TYPE_DRV_REG, group);
1130 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
1131 rc = _rockchip_pinconf_set(bank, pin - bank->pin_base, param, TYPE_TRI_REG, group);
1140 DBG_PINCTRL("%s,pin=%d,param=%d\n",__func__,pin, param);
1145 /* get the pin config settings for a specified pin */
1146 static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
1147 unsigned long *config, unsigned group)
1149 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
1150 struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
1151 enum pin_config_param param = pinconf_to_config_param(*config);
1155 case PIN_CONFIG_BIAS_DISABLE:
1156 if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
1161 case PIN_CONFIG_BIAS_PULL_UP:
1162 case PIN_CONFIG_BIAS_PULL_DOWN:
1163 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
1164 case PIN_CONFIG_BIAS_BUS_HOLD:
1165 if (!rockchip_pinconf_pull_valid(info->ctrl, param))
1168 if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
1174 case PIN_CONFIG_POWER_SOURCE:
1175 rc = _rockchip_pinconf_get(bank, pin - bank->pin_base, config, TYPE_VOL_REG, group);
1180 case PIN_CONFIG_DRIVE_STRENGTH:
1181 rc = _rockchip_pinconf_get(bank, pin - bank->pin_base, config, TYPE_DRV_REG, group);
1185 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
1186 rc = _rockchip_pinconf_get(bank, pin - bank->pin_base, config, TYPE_TRI_REG, group);
1197 DBG_PINCTRL("%s:pin=%d, param=%d\n",__func__, pin, param);
1202 /* set the pin config settings for a specified pin group */
1203 static int rockchip_pinconf_group_set(struct pinctrl_dev *pctldev,
1204 unsigned group, unsigned long config)
1206 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
1207 const unsigned int *pins;
1210 DBG_PINCTRL("%s:group[%d]:%s\n",__func__, group, info->groups[group].name);
1211 pins = info->groups[group].pins;
1213 for (cnt = 0; cnt < info->groups[group].npins; cnt++)
1214 rockchip_pinconf_set(pctldev, pins[cnt], config, group);
1219 /* get the pin config settings for a specified pin group */
1220 static int rockchip_pinconf_group_get(struct pinctrl_dev *pctldev,
1221 unsigned int group, unsigned long *config)
1223 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
1224 const unsigned int *pins;
1226 pins = info->groups[group].pins;
1227 rockchip_pinconf_get(pctldev, pins[0], config, group);
1229 DBG_PINCTRL("%s:group[%d]:%s\n",__func__, group, info->groups[group].name);
1233 static void rockchip_pinconf_dbg_show(struct pinctrl_dev *pctldev,
1234 struct seq_file *s, unsigned pin)
1239 static void rockchip_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
1240 struct seq_file *s, unsigned group)
1246 static const struct pinconf_ops rockchip_pinconf_ops = {
1247 .pin_config_group_get = rockchip_pinconf_group_get,
1248 .pin_config_group_set = rockchip_pinconf_group_set,
1249 .pin_config_dbg_show = rockchip_pinconf_dbg_show,
1250 .pin_config_group_dbg_show = rockchip_pinconf_group_dbg_show,
1253 static const struct of_device_id rockchip_bank_match[] = {
1254 { .compatible = "rockchip,gpio-bank" },
1255 { .compatible = "rockchip,rk3188-gpio-bank0" },
1259 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
1260 struct device_node *np)
1262 struct device_node *child;
1264 for_each_child_of_node(np, child) {
1265 if (of_match_node(rockchip_bank_match, child))
1269 info->ngroups += of_get_child_count(child);
1273 static int rockchip_pinctrl_parse_groups(struct device_node *np,
1274 struct rockchip_pin_group *grp,
1275 struct rockchip_pinctrl *info,
1278 struct rockchip_pin_bank *bank;
1282 struct union_mode m;
1284 unsigned long *pinconfig;
1287 DBG_PINCTRL("%s:group(%d): %s\n", __func__, index, np->name);
1289 /* Initialise group */
1290 grp->name = np->name;
1293 * the binding format is rockchip,pins = <mux>,
1294 * do sanity check and calculate pins number
1296 list = of_get_property(np, "rockchip,pins", &size);
1297 /* we do not check return since it's safe node passed down */
1298 size /= sizeof(*list);
1299 if (!size || size % 1) {
1300 dev_err(info->dev, "wrong pins number or pins and configs should be by 1\n");
1304 grp->npins = size / 1;
1306 grp->pins = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
1308 grp->data = devm_kzalloc(info->dev, grp->npins *
1309 sizeof(struct rockchip_pin_config),
1311 if (!grp->pins || !grp->data)
1314 pinconfig = kzalloc(configlen * sizeof(*pinconfig), GFP_KERNEL);
1316 for (i = 0; i < size; i++) {
1317 m.mode = be32_to_cpu(*list++);
1319 bank = bank_num_to_bank(info, m.mux.bank);
1321 return PTR_ERR(bank);
1323 grp->pins[i] = bank->pin_base + (m.mux.goff - 0x0A) * 8 + m.mux.off;
1324 grp->data[i].func = m.mode;
1330 if (of_find_property(np, "rockchip,pull", NULL))
1332 if (of_find_property(np, "rockchip,voltage", NULL))
1334 if (of_find_property(np, "rockchip,drive", NULL))
1336 if (of_find_property(np, "rockchip,tristate", NULL))
1339 pinconfig = kzalloc(configlen * sizeof(*pinconfig), GFP_KERNEL);
1341 if (!of_property_read_u32(np, "allwinner,pull", &val)) {
1342 enum pin_config_param pull = PIN_CONFIG_END;
1344 pull = PIN_CONFIG_BIAS_PULL_UP;
1346 pull = PIN_CONFIG_BIAS_PULL_DOWN;
1348 pinconfig[j++] = pinconf_to_config_packed(pull, 0);
1351 if (!of_property_read_u32(np, "rockchip,voltage", &val)) {
1353 pinconf_to_config_packed(PIN_CONFIG_POWER_SOURCE,
1357 if (!of_property_read_u32(np, "rockchip,drive", &val)) {
1359 pinconf_to_config_packed(PIN_CONFIG_DRIVE_STRENGTH,
1363 if (!of_property_read_u32(np, "rockchip,tristate", &val)) {
1365 pinconf_to_config_packed(PIN_CONFIG_BIAS_HIGH_IMPEDANCE,
1369 grp->data[i].configs = pinconfig;
1370 grp->data[i].nconfigs = configlen;
1378 static int rockchip_pinctrl_parse_functions(struct device_node *np,
1379 struct rockchip_pinctrl *info,
1382 struct device_node *child;
1383 struct rockchip_pmx_func *func;
1384 struct rockchip_pin_group *grp;
1386 static u32 grp_index;
1389 DBG_PINCTRL("%s:parse function(%d): %s\n", __func__, index, np->name);
1391 func = &info->functions[index];
1393 /* Initialise function */
1394 func->name = np->name;
1395 func->ngroups = of_get_child_count(np);
1396 if (func->ngroups <= 0)
1399 func->groups = devm_kzalloc(info->dev,
1400 func->ngroups * sizeof(char *), GFP_KERNEL);
1404 for_each_child_of_node(np, child) {
1405 func->groups[i] = child->name;
1406 grp = &info->groups[grp_index++];
1407 grp->func_name = np->name;
1408 ret = rockchip_pinctrl_parse_groups(child, grp, info, i++);
1412 //DBG_PINCTRL("%s:grp->func_name(%d): %s\n", __func__, grp_index, grp->func_name);
1418 static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
1419 struct rockchip_pinctrl *info)
1421 struct device *dev = &pdev->dev;
1422 struct device_node *np = dev->of_node;
1423 struct device_node *child;
1427 rockchip_pinctrl_child_count(info, np);
1429 dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions);
1430 dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups);
1432 info->functions = devm_kzalloc(dev, info->nfunctions *
1433 sizeof(struct rockchip_pmx_func),
1435 if (!info->functions) {
1436 dev_err(dev, "failed to allocate memory for function list\n");
1440 info->groups = devm_kzalloc(dev, info->ngroups *
1441 sizeof(struct rockchip_pin_group),
1443 if (!info->groups) {
1444 dev_err(dev, "failed allocate memory for ping group list\n");
1450 for_each_child_of_node(np, child) {
1451 if (of_match_node(rockchip_bank_match, child))
1454 ret = rockchip_pinctrl_parse_functions(child, info, i++);
1456 dev_err(&pdev->dev, "failed to parse function\n");
1464 static int rockchip_pinctrl_register(struct platform_device *pdev,
1465 struct rockchip_pinctrl *info)
1467 struct pinctrl_desc *ctrldesc = &info->pctl;
1468 struct pinctrl_pin_desc *pindesc, *pdesc;
1469 struct rockchip_pin_bank *pin_bank;
1473 ctrldesc->name = "rockchip-pinctrl";
1474 ctrldesc->owner = THIS_MODULE;
1475 ctrldesc->pctlops = &rockchip_pctrl_ops;
1476 ctrldesc->pmxops = &rockchip_pmx_ops;
1477 ctrldesc->confops = &rockchip_pinconf_ops;
1479 pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
1480 info->ctrl->nr_pins, GFP_KERNEL);
1482 dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
1485 ctrldesc->pins = pindesc;
1486 ctrldesc->npins = info->ctrl->nr_pins;
1489 for (bank = 0 , k = 0; bank < info->ctrl->nr_banks; bank++) {
1490 pin_bank = &info->ctrl->pin_banks[bank];
1491 for (pin = 0; pin < pin_bank->nr_pins; pin++, k++) {
1493 pdesc->name = kasprintf(GFP_KERNEL, "%s-%d",
1494 pin_bank->name, pin);
1499 info->pctl_dev = pinctrl_register(ctrldesc, &pdev->dev, info);
1500 if (!info->pctl_dev) {
1501 dev_err(&pdev->dev, "could not register pinctrl driver\n");
1505 for (bank = 0; bank < info->ctrl->nr_banks; ++bank) {
1506 pin_bank = &info->ctrl->pin_banks[bank];
1507 pin_bank->grange.name = pin_bank->name;
1508 pin_bank->grange.id = bank;
1509 pin_bank->grange.pin_base = pin_bank->pin_base;
1510 pin_bank->grange.base = pin_bank->gpio_chip.base;
1511 pin_bank->grange.npins = pin_bank->gpio_chip.ngpio;
1512 pin_bank->grange.gc = &pin_bank->gpio_chip;
1513 pinctrl_add_gpio_range(info->pctl_dev, &pin_bank->grange);
1516 ret = rockchip_pinctrl_parse_dt(pdev, info);
1518 pinctrl_unregister(info->pctl_dev);
1529 static int rockchip_gpio_request(struct gpio_chip *chip, unsigned offset)
1531 struct rockchip_pin_bank *bank = gc_to_pin_bank(chip);
1532 struct rockchip_pinctrl *info = bank->drvdata;
1534 if(bank->bank_num == 15)
1536 printk("%s:error bank num %d is out of range\n",__func__, bank->bank_num);
1541 DBG_PINCTRL("%s:GPIO%d-%d\n", __func__, bank->bank_num, offset);
1542 return pinctrl_request_gpio(chip->base + offset);
1545 static void rockchip_gpio_free(struct gpio_chip *chip, unsigned offset)
1547 struct rockchip_pin_bank *bank = gc_to_pin_bank(chip);
1548 struct rockchip_pinctrl *info = bank->drvdata;
1549 if(bank->bank_num == 15)
1551 printk("%s:error bank num %d is out of range\n",__func__, bank->bank_num);
1554 DBG_PINCTRL("%s:GPIO%d-%d\n", __func__, bank->bank_num, offset);
1555 pinctrl_free_gpio(chip->base + offset);
1558 static void rockchip_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
1560 struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
1561 struct rockchip_pinctrl *info = bank->drvdata;
1562 void __iomem *reg = bank->reg_base + GPIO_SWPORT_DR;
1563 unsigned long flags;
1566 spin_lock_irqsave(&bank->slock, flags);
1569 data &= ~BIT(offset);
1571 data |= BIT(offset);
1574 spin_unlock_irqrestore(&bank->slock, flags);
1576 DBG_PINCTRL("%s:GPIO%d-%d level = %d\n", __func__, bank->bank_num, offset, value);
1580 * Returns the level of the pin for input direction and setting of the DR
1581 * register for output gpios.
1583 static int rockchip_gpio_get(struct gpio_chip *gc, unsigned offset)
1585 struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
1586 struct rockchip_pinctrl *info = bank->drvdata;
1589 data = readl(bank->reg_base + GPIO_EXT_PORT);
1593 DBG_PINCTRL("%s:GPIO%d-%d level = %d\n", __func__, bank->bank_num, offset, data);
1598 * gpiolib gpio_direction_input callback function. The setting of the pin
1599 * mux function as 'gpio input' will be handled by the pinctrl susbsystem
1602 static int rockchip_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
1604 struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
1605 struct rockchip_pinctrl *info = bank->drvdata;
1607 if(bank->bank_num == 15)
1609 printk("%s:error bank num %d is out of range\n",__func__, bank->bank_num);
1613 DBG_PINCTRL("%s:GPIO%d-%d\n", __func__, bank->bank_num, offset);
1614 return pinctrl_gpio_direction_input(gc->base + offset);
1618 * gpiolib gpio_direction_output callback function. The setting of the pin
1619 * mux function as 'gpio output' will be handled by the pinctrl susbsystem
1622 static int rockchip_gpio_direction_output(struct gpio_chip *gc,
1623 unsigned offset, int value)
1625 struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
1626 struct rockchip_pinctrl *info = bank->drvdata;
1628 if(bank->bank_num == 15)
1630 printk("%s:error bank num %d is out of range\n",__func__, bank->bank_num);
1634 rockchip_gpio_set(gc, offset, value);
1636 DBG_PINCTRL("%s:set GPIO%d-%d level %d\n", __func__, bank->bank_num, offset, value);
1637 return pinctrl_gpio_direction_output(gc->base + offset);
1641 * gpiolib gpio_to_irq callback function. Creates a mapping between a GPIO pin
1642 * and a virtual IRQ, if not already present.
1644 static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
1646 struct rockchip_pin_bank *bank = gc_to_pin_bank(gc);
1647 struct rockchip_pinctrl *info = bank->drvdata;
1651 if(bank->bank_num == 15)
1653 printk("%s:error bank num %d is out of range\n",__func__, bank->bank_num);
1660 virq = irq_create_mapping(bank->domain, offset);
1662 DBG_PINCTRL("%s:virq=%d, GPIO%d-%d\n", __func__, virq, bank->bank_num, offset);
1664 return (virq) ? : -ENXIO;
1667 static const struct gpio_chip rockchip_gpiolib_chip = {
1668 .request = rockchip_gpio_request,
1669 .free = rockchip_gpio_free,
1670 .set = rockchip_gpio_set,
1671 .get = rockchip_gpio_get,
1672 .direction_input = rockchip_gpio_direction_input,
1673 .direction_output = rockchip_gpio_direction_output,
1674 .to_irq = rockchip_gpio_to_irq,
1675 .owner = THIS_MODULE,
1679 * Interrupt handling
1682 static void rockchip_irq_demux(unsigned int irq, struct irq_desc *desc)
1684 struct irq_chip *chip = irq_get_chip(irq);
1685 struct rockchip_pin_bank *bank = irq_get_handler_data(irq);
1686 struct rockchip_pinctrl *info = bank->drvdata;
1688 u32 polarity = 0, data = 0;
1690 bool edge_changed = false;
1692 dev_dbg(bank->drvdata->dev, "got irq for bank %s\n", bank->name);
1694 chained_irq_enter(chip, desc);
1696 pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS);
1698 if (bank->toggle_edge_mode) {
1699 polarity = readl_relaxed(bank->reg_base +
1701 data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT);
1709 virq = irq_linear_revmap(bank->domain, irq);
1712 dev_err(bank->drvdata->dev, "unmapped irq %d\n", irq);
1716 dev_dbg(bank->drvdata->dev, "handling irq %d\n", irq);
1719 * Triggering IRQ on both rising and falling edge
1720 * needs manual intervention.
1722 if (bank->toggle_edge_mode & BIT(irq)) {
1723 if (data & BIT(irq))
1724 polarity &= ~BIT(irq);
1726 polarity |= BIT(irq);
1728 edge_changed = true;
1731 generic_handle_irq(virq);
1734 DBG_PINCTRL("%s:irq=%d\n",__func__, irq);
1737 if (bank->toggle_edge_mode && edge_changed) {
1738 /* Interrupt params should only be set with ints disabled */
1739 data = readl_relaxed(bank->reg_base + GPIO_INTEN);
1740 writel_relaxed(0, bank->reg_base + GPIO_INTEN);
1741 writel(polarity, bank->reg_base + GPIO_INT_POLARITY);
1742 writel(data, bank->reg_base + GPIO_INTEN);
1745 chained_irq_exit(chip, desc);
1748 static int rockchip_gpio_irq_set_type(struct irq_data *d, unsigned int type)
1750 struct rockchip_pin_bank *bank = irq_data_get_irq_chip_data(d);
1751 struct rockchip_pinctrl *info = bank->drvdata;
1752 u32 mask = BIT(d->hwirq);
1757 unsigned long flags;
1759 DBG_PINCTRL("%s:type=%d,irq=%d,hwirq=%d\n",__func__,type, d->irq, (int)d->hwirq);
1761 /* make sure the pin is configured as gpio input */
1762 mux = (bank->bank_num << 12) | (((d->hwirq / 8) + 0x0A) << 8) | ((d->hwirq % 8)<< 4) | RK_FUNC_GPIO;
1763 rockchip_set_mux(bank, d->hwirq, mux);
1765 data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
1767 writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR);
1769 if (type & IRQ_TYPE_EDGE_BOTH)
1770 __irq_set_handler_locked(d->irq, handle_edge_irq);
1772 __irq_set_handler_locked(d->irq, handle_level_irq);
1774 spin_lock_irqsave(&bank->slock, flags);
1776 level = readl_relaxed(bank->reg_base + GPIO_INTTYPE_LEVEL);
1777 polarity = readl_relaxed(bank->reg_base + GPIO_INT_POLARITY);
1780 case IRQ_TYPE_EDGE_BOTH:
1781 bank->toggle_edge_mode |= mask;
1785 * Determine gpio state. If 1 next interrupt should be falling
1788 data = readl(bank->reg_base + GPIO_EXT_PORT);
1794 case IRQ_TYPE_EDGE_RISING:
1795 bank->toggle_edge_mode &= ~mask;
1799 case IRQ_TYPE_EDGE_FALLING:
1800 bank->toggle_edge_mode &= ~mask;
1804 case IRQ_TYPE_LEVEL_HIGH:
1805 bank->toggle_edge_mode &= ~mask;
1809 case IRQ_TYPE_LEVEL_LOW:
1810 bank->toggle_edge_mode &= ~mask;
1815 //spin_unlock_irqrestore(&bank->slock, flags);
1819 writel_relaxed(level, bank->reg_base + GPIO_INTTYPE_LEVEL);
1820 writel_relaxed(polarity, bank->reg_base + GPIO_INT_POLARITY);
1822 spin_unlock_irqrestore(&bank->slock, flags);
1824 DBG_PINCTRL("%s:type=%d,irq=%d,hwirq=%d,ok\n",__func__,type, d->irq, (int)d->hwirq);
1828 static int rockchip_interrupts_register(struct platform_device *pdev,
1829 struct rockchip_pinctrl *info)
1831 struct rockchip_pin_ctrl *ctrl = info->ctrl;
1832 struct rockchip_pin_bank *bank = ctrl->pin_banks;
1833 unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
1834 struct irq_chip_generic *gc;
1838 for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
1840 dev_warn(&pdev->dev, "bank %s is not valid\n",
1845 bank->domain = irq_domain_add_linear(bank->of_node, 32,
1846 &irq_generic_chip_ops, NULL);
1847 if (!bank->domain) {
1848 dev_warn(&pdev->dev, "could not initialize irq domain for bank %s\n",
1853 ret = irq_alloc_domain_generic_chips(bank->domain, 32, 1,
1854 "rockchip_gpio_irq", handle_level_irq,
1855 clr, 0, IRQ_GC_INIT_MASK_CACHE);
1857 dev_err(&pdev->dev, "could not alloc generic chips for bank %s\n",
1859 irq_domain_remove(bank->domain);
1863 gc = irq_get_domain_generic_chip(bank->domain, 0);
1864 gc->reg_base = bank->reg_base;
1866 gc->chip_types[0].regs.mask = GPIO_INTEN;
1867 gc->chip_types[0].regs.ack = GPIO_PORTS_EOI;
1868 gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit;
1869 gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit;
1870 gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit;
1871 gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake;
1872 gc->chip_types[0].chip.irq_set_type = rockchip_gpio_irq_set_type;
1874 irq_set_handler_data(bank->irq, bank);
1875 irq_set_chained_handler(bank->irq, rockchip_irq_demux);
1882 static inline void rockchip_gpio_bit_op(void __iomem *reg_base, unsigned int offset, u32 bit, unsigned char flag)
1884 u32 val = __raw_readl(reg_base + offset);
1889 __raw_writel(val, reg_base + offset);
1892 static inline unsigned gpio_to_bit(struct rockchip_pin_bank *bank, unsigned gpio)
1894 while (gpio >= (bank->pin_base + bank->nr_pins))
1897 return gpio - bank->pin_base;
1900 static inline unsigned offset_to_bit(unsigned offset)
1902 return 1u << offset;
1905 static void GPIOSetPinLevel(void __iomem *reg_base, unsigned int bit, eGPIOPinLevel_t level)
1907 rockchip_gpio_bit_op(reg_base, GPIO_SWPORT_DDR, bit, 1);
1908 rockchip_gpio_bit_op(reg_base, GPIO_SWPORT_DR, bit, level);
1911 static int GPIOGetPinLevel(void __iomem *reg_base, unsigned int bit)
1913 return ((__raw_readl(reg_base + GPIO_EXT_PORT) & bit) != 0);
1916 static void GPIOSetPinDirection(void __iomem *reg_base, unsigned int bit, eGPIOPinDirection_t direction)
1918 rockchip_gpio_bit_op(reg_base, GPIO_SWPORT_DDR, bit, direction);
1919 /* Enable debounce may halt cpu on wfi, disable it by default */
1920 //rockchip_gpio_bit_op(reg_base, GPIO_DEBOUNCE, bit, 1);
1923 static void GPIOEnableIntr(void __iomem *reg_base, unsigned int bit)
1925 rockchip_gpio_bit_op(reg_base, GPIO_INTEN, bit, 1);
1928 static void GPIODisableIntr(void __iomem *reg_base, unsigned int bit)
1930 rockchip_gpio_bit_op(reg_base, GPIO_INTEN, bit, 0);
1933 static void GPIOAckIntr(void __iomem *reg_base, unsigned int bit)
1935 rockchip_gpio_bit_op(reg_base, GPIO_PORTS_EOI, bit, 1);
1938 static void GPIOSetIntrType(void __iomem *reg_base, unsigned int bit, eGPIOIntType_t type)
1942 rockchip_gpio_bit_op(reg_base, GPIO_INT_POLARITY, bit, 0);
1943 rockchip_gpio_bit_op(reg_base, GPIO_INTTYPE_LEVEL, bit, 0);
1946 rockchip_gpio_bit_op(reg_base, GPIO_INTTYPE_LEVEL, bit, 0);
1947 rockchip_gpio_bit_op(reg_base, GPIO_INT_POLARITY, bit, 1);
1949 case GPIOEdgelFalling:
1950 rockchip_gpio_bit_op(reg_base, GPIO_INTTYPE_LEVEL, bit, 1);
1951 rockchip_gpio_bit_op(reg_base, GPIO_INT_POLARITY, bit, 0);
1953 case GPIOEdgelRising:
1954 rockchip_gpio_bit_op(reg_base, GPIO_INTTYPE_LEVEL, bit, 1);
1955 rockchip_gpio_bit_op(reg_base, GPIO_INT_POLARITY, bit, 1);
1960 static int rockchip_gpio_irq_set_type(struct irq_data *d, unsigned int type)
1962 struct rockchip_pin_bank *bank = irq_data_get_irq_chip_data(d);
1963 u32 bit = gpio_to_bit(irq_to_gpio(d->irq));
1964 eGPIOIntType_t int_type;
1965 unsigned long flags;
1968 case IRQ_TYPE_EDGE_RISING:
1969 int_type = GPIOEdgelRising;
1971 case IRQ_TYPE_EDGE_FALLING:
1972 int_type = GPIOEdgelFalling;
1974 case IRQ_TYPE_LEVEL_HIGH:
1975 int_type = GPIOLevelHigh;
1977 case IRQ_TYPE_LEVEL_LOW:
1978 int_type = GPIOLevelLow;
1984 spin_lock_irqsave(&bank->slock, flags);
1985 //ÉèÖÃΪÖжÏ֮ǰ£¬±ØÐëÏÈÉèÖÃΪÊäÈë״̬
1986 GPIOSetPinDirection(bank->reg_base, bit, 0);
1987 GPIOSetIntrType(bank->reg_base, bit, int_type);
1988 spin_unlock_irqrestore(&bank->slock, flags);
1990 if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
1991 __irq_set_handler_locked(d->irq, handle_level_irq);
1992 else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
1993 __irq_set_handler_locked(d->irq, handle_edge_irq);
1998 static int rockchip_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
2000 struct rockchip_pin_bank *bank = irq_data_get_irq_chip_data(d);
2001 struct rockchip_pinctrl *info = bank->drvdata;
2003 //u32 bit = gpio_to_bit(bank, d->irq);
2005 unsigned long flags;
2007 spin_lock_irqsave(&bank->slock, flags);
2010 bank->suspend_wakeup |= bit;
2012 bank->suspend_wakeup &= ~bit;
2013 spin_unlock_irqrestore(&bank->slock, flags);
2015 DBG_PINCTRL("%s:irq=%d,hwirq=%d,bank->reg_base=0x%x,bit=%d\n",__func__,d->irq, (int)d->hwirq, (int)bank->reg_base,bit);
2019 static void rockchip_gpio_irq_unmask(struct irq_data *d)
2021 struct rockchip_pin_bank *bank = irq_data_get_irq_chip_data(d);
2022 struct rockchip_pinctrl *info = bank->drvdata;
2023 //u32 bit = gpio_to_bit(bank, d->irq);
2025 unsigned long flags;
2027 spin_lock_irqsave(&bank->slock, flags);
2028 GPIOEnableIntr(bank->reg_base, bit);
2029 spin_unlock_irqrestore(&bank->slock, flags);
2031 DBG_PINCTRL("%s:irq=%d,hwirq=%d,bank->reg_base=0x%x,bit=%d\n",__func__,d->irq, (int)d->hwirq, (int)bank->reg_base,bit);
2034 static void rockchip_gpio_irq_mask(struct irq_data *d)
2036 struct rockchip_pin_bank *bank = irq_data_get_irq_chip_data(d);
2037 struct rockchip_pinctrl *info = bank->drvdata;
2038 //u32 bit = gpio_to_bit(bank, d->irq);
2040 unsigned long flags;
2042 spin_lock_irqsave(&bank->slock, flags);
2043 GPIODisableIntr(bank->reg_base, bit);
2044 spin_unlock_irqrestore(&bank->slock, flags);
2046 DBG_PINCTRL("%s:irq=%d,hwirq=%d,bank->reg_base=0x%x,bit=%d\n",__func__,d->irq, (int)d->hwirq, (int)bank->reg_base,bit);
2049 static void rockchip_gpio_irq_ack(struct irq_data *d)
2051 struct rockchip_pin_bank *bank = irq_data_get_irq_chip_data(d);
2052 struct rockchip_pinctrl *info = bank->drvdata;
2053 //u32 bit = gpio_to_bit(bank, d->irq);
2056 GPIOAckIntr(bank->reg_base, bit);
2058 DBG_PINCTRL("%s:irq=%d,hwirq=%d,bank->reg_base=0x%x,bit=%d\n",__func__,d->irq, (int)d->hwirq, (int)bank->reg_base,bit);
2062 static struct irq_chip rockchip_gpio_irq_chip = {
2064 .irq_ack = rockchip_gpio_irq_ack,
2065 .irq_disable = rockchip_gpio_irq_mask,
2066 .irq_mask = rockchip_gpio_irq_mask,
2067 .irq_unmask = rockchip_gpio_irq_unmask,
2068 .irq_set_type = rockchip_gpio_irq_set_type,
2069 .irq_set_wake = rockchip_gpio_irq_set_wake,
2073 static int rockchip_gpio_irq_map(struct irq_domain *d, unsigned int irq,
2074 irq_hw_number_t hwirq)
2076 struct rockchip_pin_bank *bank = d->host_data;
2077 struct rockchip_pinctrl *info = bank->drvdata;
2078 struct irq_data *irq_data = irq_get_irq_data(irq);
2082 printk("%s:bank=0x%p,irq=%d\n",__func__,bank, irq);
2086 irq_set_chip_and_handler(irq, &rockchip_gpio_irq_chip, handle_level_irq);
2087 irq_set_chip_data(irq, bank);
2088 set_irq_flags(irq, IRQF_VALID);
2090 irq_data->hwirq = hwirq;
2091 irq_data->irq = irq;
2093 DBG_PINCTRL("%s:irq=%d\n",__func__,irq);
2097 const struct irq_domain_ops rockchip_gpio_irq_ops = {
2098 .map = rockchip_gpio_irq_map,
2099 .xlate = irq_domain_xlate_twocell,
2103 static int rockchip_interrupts_register(struct platform_device *pdev,
2104 struct rockchip_pinctrl *info)
2106 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2107 struct rockchip_pin_bank *bank = ctrl->pin_banks;
2108 //unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
2111 for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
2113 dev_warn(&pdev->dev, "bank %s is not valid\n",
2118 __raw_writel(0, bank->reg_base + GPIO_INTEN);
2120 bank->drvdata = info;
2121 bank->domain = irq_domain_add_linear(bank->of_node, 32,
2122 &rockchip_gpio_irq_ops, bank);
2123 if (!bank->domain) {
2124 dev_warn(&pdev->dev, "could not initialize irq domain for bank %s\n",
2130 DBG_PINCTRL("%s:bank=%d\n",__func__,i);
2132 irq_set_handler_data(bank->irq, bank);
2133 irq_set_chained_handler(bank->irq, rockchip_irq_demux);
2142 static int rockchip_gpiolib_register(struct platform_device *pdev,
2143 struct rockchip_pinctrl *info)
2145 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2146 struct rockchip_pin_bank *bank = ctrl->pin_banks;
2147 struct gpio_chip *gc;
2151 for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
2153 dev_warn(&pdev->dev, "bank %s is not valid\n",
2158 bank->gpio_chip = rockchip_gpiolib_chip;
2160 gc = &bank->gpio_chip;
2161 gc->base = bank->pin_base;
2162 gc->ngpio = bank->nr_pins;
2163 gc->dev = &pdev->dev;
2164 gc->of_node = bank->of_node;
2165 gc->label = bank->name;
2167 ret = gpiochip_add(gc);
2169 dev_err(&pdev->dev, "failed to register gpio_chip %s, error code: %d\n",
2175 rockchip_interrupts_register(pdev, info);
2180 for (--i, --bank; i >= 0; --i, --bank) {
2184 if (gpiochip_remove(&bank->gpio_chip))
2185 dev_err(&pdev->dev, "gpio chip %s remove failed\n",
2186 bank->gpio_chip.label);
2191 static int rockchip_gpiolib_unregister(struct platform_device *pdev,
2192 struct rockchip_pinctrl *info)
2194 struct rockchip_pin_ctrl *ctrl = info->ctrl;
2195 struct rockchip_pin_bank *bank = ctrl->pin_banks;
2199 for (i = 0; !ret && i < ctrl->nr_banks; ++i, ++bank) {
2203 ret = gpiochip_remove(&bank->gpio_chip);
2207 dev_err(&pdev->dev, "gpio chip remove failed\n");
2212 static int rockchip_get_bank_data(struct rockchip_pin_bank *bank,
2215 struct resource res;
2217 if (of_address_to_resource(bank->of_node, 0, &res)) {
2218 dev_err(dev, "cannot find IO resource for bank\n");
2222 bank->reg_base = devm_ioremap_resource(dev, &res);
2223 if (IS_ERR(bank->reg_base))
2224 return PTR_ERR(bank->reg_base);
2227 * special case, where parts of the pull setting-registers are
2228 * part of the PMU register space
2230 if (of_device_is_compatible(bank->of_node,
2231 "rockchip,rk3188-gpio-bank0")) {
2232 bank->bank_type = RK3188_BANK0;
2234 if (of_address_to_resource(bank->of_node, 1, &res)) {
2235 dev_err(dev, "cannot find IO resource for bank\n");
2239 bank->reg_pull = devm_ioremap_resource(dev, &res);
2240 if (IS_ERR(bank->reg_pull))
2241 return PTR_ERR(bank->reg_pull);
2243 bank->bank_type = COMMON_BANK;
2246 bank->irq = irq_of_parse_and_map(bank->of_node, 0);
2248 bank->clk = of_clk_get(bank->of_node, 0);
2249 //if (IS_ERR(bank->clk))
2250 //return PTR_ERR(bank->clk);
2252 //return clk_prepare_enable(bank->clk);
2255 static const struct of_device_id rockchip_pinctrl_dt_match[];
2257 /* retrieve the soc specific data */
2258 static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
2259 struct rockchip_pinctrl *d,
2260 struct platform_device *pdev)
2262 const struct of_device_id *match;
2263 struct device_node *node = pdev->dev.of_node;
2264 struct device_node *np;
2265 struct rockchip_pin_ctrl *ctrl;
2266 struct rockchip_pin_bank *bank;
2269 match = of_match_node(rockchip_pinctrl_dt_match, node);
2270 ctrl = (struct rockchip_pin_ctrl *)match->data;
2272 for_each_child_of_node(node, np) {
2273 if (!of_find_property(np, "gpio-controller", NULL))
2276 bank = ctrl->pin_banks;
2277 for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
2278 if (!strcmp(bank->name, np->name)) {
2281 if (!rockchip_get_bank_data(bank, &pdev->dev))
2288 bank = ctrl->pin_banks;
2289 for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
2290 spin_lock_init(&bank->slock);
2292 bank->pin_base = ctrl->nr_pins;
2293 ctrl->nr_pins += bank->nr_pins;
2299 static irqreturn_t pinctrl_interrupt_test(int irq, void *dev_id)
2301 printk("%s:line=%d\n",__func__, __LINE__);
2305 static int rockchip_pinctrl_probe(struct platform_device *pdev)
2307 struct rockchip_pinctrl *info;
2308 struct device *dev = &pdev->dev;
2309 struct rockchip_pin_ctrl *ctrl;
2310 struct resource *res;
2313 if (!dev->of_node) {
2314 dev_err(dev, "device tree node not found\n");
2318 info = devm_kzalloc(dev, sizeof(struct rockchip_pinctrl), GFP_KERNEL);
2322 ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
2324 dev_err(dev, "driver data not available\n");
2330 atomic_set(&info->debug_flag, 1);
2332 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2333 info->reg_base = devm_ioremap_resource(&pdev->dev, res);
2334 if (IS_ERR(info->reg_base))
2335 return PTR_ERR(info->reg_base);
2337 /* The RK3188 has its pull registers in a separate place */
2338 if (ctrl->type == RK3188) {
2339 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2340 info->reg_pull = devm_ioremap_resource(&pdev->dev, res);
2341 if (IS_ERR(info->reg_base))
2342 return PTR_ERR(info->reg_base);
2345 ret = rockchip_gpiolib_register(pdev, info);
2349 ret = rockchip_pinctrl_register(pdev, info);
2351 rockchip_gpiolib_unregister(pdev, info);
2355 platform_set_drvdata(pdev, info);
2358 for(i=1; i<32*4; i++)
2362 gpio_request(i, NULL);
2363 gpio_direction_input(i);
2365 ret = request_irq(gpio_to_irq(i), pinctrl_interrupt_test, IRQ_TYPE_EDGE_RISING, "test", info);
2366 disable_irq(gpio_to_irq(i));
2369 printk("%s:init ok\n",__func__);
2373 static struct rockchip_pin_bank rk2928_pin_banks[] = {
2374 PIN_BANK(0, 32, "gpio0"),
2375 PIN_BANK(1, 32, "gpio1"),
2376 PIN_BANK(2, 32, "gpio2"),
2377 PIN_BANK(3, 32, "gpio3"),
2379 PIN_BANK(15, 32, "gpio15"),//virtual bank
2382 static struct rockchip_pin_ctrl rk2928_pin_ctrl = {
2383 .pin_banks = rk2928_pin_banks,
2384 .nr_banks = ARRAY_SIZE(rk2928_pin_banks),
2385 .label = "RK2928-GPIO",
2388 .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
2391 static struct rockchip_pin_bank rk3066a_pin_banks[] = {
2392 PIN_BANK(0, 32, "gpio0"),
2393 PIN_BANK(1, 32, "gpio1"),
2394 PIN_BANK(2, 32, "gpio2"),
2395 PIN_BANK(3, 32, "gpio3"),
2396 PIN_BANK(4, 32, "gpio4"),
2397 PIN_BANK(6, 16, "gpio6"),
2398 PIN_BANK(15, 32, "gpio15"),//virtual bank
2401 static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
2402 .pin_banks = rk3066a_pin_banks,
2403 .nr_banks = ARRAY_SIZE(rk3066a_pin_banks),
2404 .label = "RK3066a-GPIO",
2407 .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
2410 static struct rockchip_pin_bank rk3066b_pin_banks[] = {
2411 PIN_BANK(0, 32, "gpio0"),
2412 PIN_BANK(1, 32, "gpio1"),
2413 PIN_BANK(2, 32, "gpio2"),
2414 PIN_BANK(3, 32, "gpio3"),
2416 PIN_BANK(15, 32, "gpio15"),//virtual bank
2419 static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
2420 .pin_banks = rk3066b_pin_banks,
2421 .nr_banks = ARRAY_SIZE(rk3066b_pin_banks),
2422 .label = "RK3066b-GPIO",
2427 static struct rockchip_pin_bank rk3188_pin_banks[] = {
2428 PIN_BANK(0, 32, "gpio0"),
2429 PIN_BANK(1, 32, "gpio1"),
2430 PIN_BANK(2, 32, "gpio2"),
2431 PIN_BANK(3, 32, "gpio3"),
2433 PIN_BANK(15, 32, "gpio15"),//virtual bank
2436 static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
2437 .pin_banks = rk3188_pin_banks,
2438 .nr_banks = ARRAY_SIZE(rk3188_pin_banks),
2439 .label = "RK3188-GPIO",
2442 .pull_calc_reg = rk3188_calc_pull_reg_and_bit,
2445 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
2446 { .compatible = "rockchip,rk2928-pinctrl",
2447 .data = (void *)&rk2928_pin_ctrl },
2448 { .compatible = "rockchip,rk3066a-pinctrl",
2449 .data = (void *)&rk3066a_pin_ctrl },
2450 { .compatible = "rockchip,rk3066b-pinctrl",
2451 .data = (void *)&rk3066b_pin_ctrl },
2452 { .compatible = "rockchip,rk3188-pinctrl",
2453 .data = (void *)&rk3188_pin_ctrl },
2456 MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);
2458 static struct platform_driver rockchip_pinctrl_driver = {
2459 .probe = rockchip_pinctrl_probe,
2461 .name = "rockchip-pinctrl",
2462 .owner = THIS_MODULE,
2463 .of_match_table = rockchip_pinctrl_dt_match,
2467 static int __init rockchip_pinctrl_drv_register(void)
2469 return platform_driver_register(&rockchip_pinctrl_driver);
2471 postcore_initcall(rockchip_pinctrl_drv_register);
2473 MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
2474 MODULE_DESCRIPTION("Rockchip pinctrl driver");
2475 MODULE_LICENSE("GPL v2");