0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/clk.h>
0013 #include <linux/err.h>
0014 #include <linux/gpio/driver.h>
0015 #include <linux/io.h>
0016 #include <linux/irq.h>
0017 #include <linux/module.h>
0018 #include <linux/of.h>
0019 #include <linux/platform_device.h>
0020 #include <linux/pinctrl/machine.h>
0021 #include <linux/pinctrl/pinctrl.h>
0022 #include <linux/pinctrl/pinmux.h>
0023 #include <linux/pinctrl/pinconf.h>
0024 #include <linux/pinctrl/pinconf-generic.h>
0025 #include <linux/slab.h>
0026 #include <linux/spinlock.h>
0027
0028 #include "../core.h"
0029 #include "../pinctrl-utils.h"
0030 #include "pinctrl-owl.h"
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 struct owl_pinctrl {
0046 struct device *dev;
0047 struct pinctrl_dev *pctrldev;
0048 struct gpio_chip chip;
0049 raw_spinlock_t lock;
0050 struct clk *clk;
0051 const struct owl_pinctrl_soc_data *soc;
0052 void __iomem *base;
0053 struct irq_chip irq_chip;
0054 unsigned int num_irq;
0055 unsigned int *irq;
0056 };
0057
0058 static void owl_update_bits(void __iomem *base, u32 mask, u32 val)
0059 {
0060 u32 reg_val;
0061
0062 reg_val = readl_relaxed(base);
0063
0064 reg_val = (reg_val & ~mask) | (val & mask);
0065
0066 writel_relaxed(reg_val, base);
0067 }
0068
0069 static u32 owl_read_field(struct owl_pinctrl *pctrl, u32 reg,
0070 u32 bit, u32 width)
0071 {
0072 u32 tmp, mask;
0073
0074 tmp = readl_relaxed(pctrl->base + reg);
0075 mask = (1 << width) - 1;
0076
0077 return (tmp >> bit) & mask;
0078 }
0079
0080 static void owl_write_field(struct owl_pinctrl *pctrl, u32 reg, u32 arg,
0081 u32 bit, u32 width)
0082 {
0083 u32 mask;
0084
0085 mask = (1 << width) - 1;
0086 mask = mask << bit;
0087
0088 owl_update_bits(pctrl->base + reg, mask, (arg << bit));
0089 }
0090
0091 static int owl_get_groups_count(struct pinctrl_dev *pctrldev)
0092 {
0093 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0094
0095 return pctrl->soc->ngroups;
0096 }
0097
0098 static const char *owl_get_group_name(struct pinctrl_dev *pctrldev,
0099 unsigned int group)
0100 {
0101 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0102
0103 return pctrl->soc->groups[group].name;
0104 }
0105
0106 static int owl_get_group_pins(struct pinctrl_dev *pctrldev,
0107 unsigned int group,
0108 const unsigned int **pins,
0109 unsigned int *num_pins)
0110 {
0111 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0112
0113 *pins = pctrl->soc->groups[group].pads;
0114 *num_pins = pctrl->soc->groups[group].npads;
0115
0116 return 0;
0117 }
0118
0119 static void owl_pin_dbg_show(struct pinctrl_dev *pctrldev,
0120 struct seq_file *s,
0121 unsigned int offset)
0122 {
0123 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0124
0125 seq_printf(s, "%s", dev_name(pctrl->dev));
0126 }
0127
0128 static const struct pinctrl_ops owl_pinctrl_ops = {
0129 .get_groups_count = owl_get_groups_count,
0130 .get_group_name = owl_get_group_name,
0131 .get_group_pins = owl_get_group_pins,
0132 .pin_dbg_show = owl_pin_dbg_show,
0133 .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
0134 .dt_free_map = pinctrl_utils_free_map,
0135 };
0136
0137 static int owl_get_funcs_count(struct pinctrl_dev *pctrldev)
0138 {
0139 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0140
0141 return pctrl->soc->nfunctions;
0142 }
0143
0144 static const char *owl_get_func_name(struct pinctrl_dev *pctrldev,
0145 unsigned int function)
0146 {
0147 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0148
0149 return pctrl->soc->functions[function].name;
0150 }
0151
0152 static int owl_get_func_groups(struct pinctrl_dev *pctrldev,
0153 unsigned int function,
0154 const char * const **groups,
0155 unsigned int * const num_groups)
0156 {
0157 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0158
0159 *groups = pctrl->soc->functions[function].groups;
0160 *num_groups = pctrl->soc->functions[function].ngroups;
0161
0162 return 0;
0163 }
0164
0165 static inline int get_group_mfp_mask_val(const struct owl_pingroup *g,
0166 int function,
0167 u32 *mask,
0168 u32 *val)
0169 {
0170 int id;
0171 u32 option_num;
0172 u32 option_mask;
0173
0174 for (id = 0; id < g->nfuncs; id++) {
0175 if (g->funcs[id] == function)
0176 break;
0177 }
0178 if (WARN_ON(id == g->nfuncs))
0179 return -EINVAL;
0180
0181 option_num = (1 << g->mfpctl_width);
0182 if (id > option_num)
0183 id -= option_num;
0184
0185 option_mask = option_num - 1;
0186 *mask = (option_mask << g->mfpctl_shift);
0187 *val = (id << g->mfpctl_shift);
0188
0189 return 0;
0190 }
0191
0192 static int owl_set_mux(struct pinctrl_dev *pctrldev,
0193 unsigned int function,
0194 unsigned int group)
0195 {
0196 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0197 const struct owl_pingroup *g;
0198 unsigned long flags;
0199 u32 val, mask;
0200
0201 g = &pctrl->soc->groups[group];
0202
0203 if (get_group_mfp_mask_val(g, function, &mask, &val))
0204 return -EINVAL;
0205
0206 raw_spin_lock_irqsave(&pctrl->lock, flags);
0207
0208 owl_update_bits(pctrl->base + g->mfpctl_reg, mask, val);
0209
0210 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0211
0212 return 0;
0213 }
0214
0215 static const struct pinmux_ops owl_pinmux_ops = {
0216 .get_functions_count = owl_get_funcs_count,
0217 .get_function_name = owl_get_func_name,
0218 .get_function_groups = owl_get_func_groups,
0219 .set_mux = owl_set_mux,
0220 };
0221
0222 static int owl_pad_pinconf_reg(const struct owl_padinfo *info,
0223 unsigned int param,
0224 u32 *reg,
0225 u32 *bit,
0226 u32 *width)
0227 {
0228 switch (param) {
0229 case PIN_CONFIG_BIAS_BUS_HOLD:
0230 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
0231 case PIN_CONFIG_BIAS_PULL_DOWN:
0232 case PIN_CONFIG_BIAS_PULL_UP:
0233 if (!info->pullctl)
0234 return -EINVAL;
0235 *reg = info->pullctl->reg;
0236 *bit = info->pullctl->shift;
0237 *width = info->pullctl->width;
0238 break;
0239 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
0240 if (!info->st)
0241 return -EINVAL;
0242 *reg = info->st->reg;
0243 *bit = info->st->shift;
0244 *width = info->st->width;
0245 break;
0246 default:
0247 return -ENOTSUPP;
0248 }
0249
0250 return 0;
0251 }
0252
0253 static int owl_pin_config_get(struct pinctrl_dev *pctrldev,
0254 unsigned int pin,
0255 unsigned long *config)
0256 {
0257 int ret = 0;
0258 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0259 const struct owl_padinfo *info;
0260 unsigned int param = pinconf_to_config_param(*config);
0261 u32 reg, bit, width, arg;
0262
0263 info = &pctrl->soc->padinfo[pin];
0264
0265 ret = owl_pad_pinconf_reg(info, param, ®, &bit, &width);
0266 if (ret)
0267 return ret;
0268
0269 arg = owl_read_field(pctrl, reg, bit, width);
0270
0271 if (!pctrl->soc->padctl_val2arg)
0272 return -ENOTSUPP;
0273
0274 ret = pctrl->soc->padctl_val2arg(info, param, &arg);
0275 if (ret)
0276 return ret;
0277
0278 *config = pinconf_to_config_packed(param, arg);
0279
0280 return ret;
0281 }
0282
0283 static int owl_pin_config_set(struct pinctrl_dev *pctrldev,
0284 unsigned int pin,
0285 unsigned long *configs,
0286 unsigned int num_configs)
0287 {
0288 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0289 const struct owl_padinfo *info;
0290 unsigned long flags;
0291 unsigned int param;
0292 u32 reg, bit, width, arg;
0293 int ret = 0, i;
0294
0295 info = &pctrl->soc->padinfo[pin];
0296
0297 for (i = 0; i < num_configs; i++) {
0298 param = pinconf_to_config_param(configs[i]);
0299 arg = pinconf_to_config_argument(configs[i]);
0300
0301 ret = owl_pad_pinconf_reg(info, param, ®, &bit, &width);
0302 if (ret)
0303 return ret;
0304
0305 if (!pctrl->soc->padctl_arg2val)
0306 return -ENOTSUPP;
0307
0308 ret = pctrl->soc->padctl_arg2val(info, param, &arg);
0309 if (ret)
0310 return ret;
0311
0312 raw_spin_lock_irqsave(&pctrl->lock, flags);
0313
0314 owl_write_field(pctrl, reg, arg, bit, width);
0315
0316 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0317 }
0318
0319 return ret;
0320 }
0321
0322 static int owl_group_pinconf_reg(const struct owl_pingroup *g,
0323 unsigned int param,
0324 u32 *reg,
0325 u32 *bit,
0326 u32 *width)
0327 {
0328 switch (param) {
0329 case PIN_CONFIG_DRIVE_STRENGTH:
0330 if (g->drv_reg < 0)
0331 return -EINVAL;
0332 *reg = g->drv_reg;
0333 *bit = g->drv_shift;
0334 *width = g->drv_width;
0335 break;
0336 case PIN_CONFIG_SLEW_RATE:
0337 if (g->sr_reg < 0)
0338 return -EINVAL;
0339 *reg = g->sr_reg;
0340 *bit = g->sr_shift;
0341 *width = g->sr_width;
0342 break;
0343 default:
0344 return -ENOTSUPP;
0345 }
0346
0347 return 0;
0348 }
0349
0350 static int owl_group_pinconf_arg2val(const struct owl_pingroup *g,
0351 unsigned int param,
0352 u32 *arg)
0353 {
0354 switch (param) {
0355 case PIN_CONFIG_DRIVE_STRENGTH:
0356 switch (*arg) {
0357 case 2:
0358 *arg = OWL_PINCONF_DRV_2MA;
0359 break;
0360 case 4:
0361 *arg = OWL_PINCONF_DRV_4MA;
0362 break;
0363 case 8:
0364 *arg = OWL_PINCONF_DRV_8MA;
0365 break;
0366 case 12:
0367 *arg = OWL_PINCONF_DRV_12MA;
0368 break;
0369 default:
0370 return -EINVAL;
0371 }
0372 break;
0373 case PIN_CONFIG_SLEW_RATE:
0374 if (*arg)
0375 *arg = OWL_PINCONF_SLEW_FAST;
0376 else
0377 *arg = OWL_PINCONF_SLEW_SLOW;
0378 break;
0379 default:
0380 return -ENOTSUPP;
0381 }
0382
0383 return 0;
0384 }
0385
0386 static int owl_group_pinconf_val2arg(const struct owl_pingroup *g,
0387 unsigned int param,
0388 u32 *arg)
0389 {
0390 switch (param) {
0391 case PIN_CONFIG_DRIVE_STRENGTH:
0392 switch (*arg) {
0393 case OWL_PINCONF_DRV_2MA:
0394 *arg = 2;
0395 break;
0396 case OWL_PINCONF_DRV_4MA:
0397 *arg = 4;
0398 break;
0399 case OWL_PINCONF_DRV_8MA:
0400 *arg = 8;
0401 break;
0402 case OWL_PINCONF_DRV_12MA:
0403 *arg = 12;
0404 break;
0405 default:
0406 return -EINVAL;
0407 }
0408 break;
0409 case PIN_CONFIG_SLEW_RATE:
0410 if (*arg)
0411 *arg = 1;
0412 else
0413 *arg = 0;
0414 break;
0415 default:
0416 return -ENOTSUPP;
0417 }
0418
0419 return 0;
0420 }
0421
0422 static int owl_group_config_get(struct pinctrl_dev *pctrldev,
0423 unsigned int group,
0424 unsigned long *config)
0425 {
0426 const struct owl_pingroup *g;
0427 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0428 unsigned int param = pinconf_to_config_param(*config);
0429 u32 reg, bit, width, arg;
0430 int ret;
0431
0432 g = &pctrl->soc->groups[group];
0433
0434 ret = owl_group_pinconf_reg(g, param, ®, &bit, &width);
0435 if (ret)
0436 return ret;
0437
0438 arg = owl_read_field(pctrl, reg, bit, width);
0439
0440 ret = owl_group_pinconf_val2arg(g, param, &arg);
0441 if (ret)
0442 return ret;
0443
0444 *config = pinconf_to_config_packed(param, arg);
0445
0446 return ret;
0447 }
0448
0449 static int owl_group_config_set(struct pinctrl_dev *pctrldev,
0450 unsigned int group,
0451 unsigned long *configs,
0452 unsigned int num_configs)
0453 {
0454 const struct owl_pingroup *g;
0455 struct owl_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrldev);
0456 unsigned long flags;
0457 unsigned int param;
0458 u32 reg, bit, width, arg;
0459 int ret, i;
0460
0461 g = &pctrl->soc->groups[group];
0462
0463 for (i = 0; i < num_configs; i++) {
0464 param = pinconf_to_config_param(configs[i]);
0465 arg = pinconf_to_config_argument(configs[i]);
0466
0467 ret = owl_group_pinconf_reg(g, param, ®, &bit, &width);
0468 if (ret)
0469 return ret;
0470
0471 ret = owl_group_pinconf_arg2val(g, param, &arg);
0472 if (ret)
0473 return ret;
0474
0475
0476 raw_spin_lock_irqsave(&pctrl->lock, flags);
0477
0478 owl_write_field(pctrl, reg, arg, bit, width);
0479
0480 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0481 }
0482
0483 return 0;
0484 }
0485
0486 static const struct pinconf_ops owl_pinconf_ops = {
0487 .is_generic = true,
0488 .pin_config_get = owl_pin_config_get,
0489 .pin_config_set = owl_pin_config_set,
0490 .pin_config_group_get = owl_group_config_get,
0491 .pin_config_group_set = owl_group_config_set,
0492 };
0493
0494 static struct pinctrl_desc owl_pinctrl_desc = {
0495 .pctlops = &owl_pinctrl_ops,
0496 .pmxops = &owl_pinmux_ops,
0497 .confops = &owl_pinconf_ops,
0498 .owner = THIS_MODULE,
0499 };
0500
0501 static const struct owl_gpio_port *
0502 owl_gpio_get_port(struct owl_pinctrl *pctrl, unsigned int *pin)
0503 {
0504 unsigned int start = 0, i;
0505
0506 for (i = 0; i < pctrl->soc->nports; i++) {
0507 const struct owl_gpio_port *port = &pctrl->soc->ports[i];
0508
0509 if (*pin >= start && *pin < start + port->pins) {
0510 *pin -= start;
0511 return port;
0512 }
0513
0514 start += port->pins;
0515 }
0516
0517 return NULL;
0518 }
0519
0520 static void owl_gpio_update_reg(void __iomem *base, unsigned int pin, int flag)
0521 {
0522 u32 val;
0523
0524 val = readl_relaxed(base);
0525
0526 if (flag)
0527 val |= BIT(pin);
0528 else
0529 val &= ~BIT(pin);
0530
0531 writel_relaxed(val, base);
0532 }
0533
0534 static int owl_gpio_request(struct gpio_chip *chip, unsigned int offset)
0535 {
0536 struct owl_pinctrl *pctrl = gpiochip_get_data(chip);
0537 const struct owl_gpio_port *port;
0538 void __iomem *gpio_base;
0539 unsigned long flags;
0540
0541 port = owl_gpio_get_port(pctrl, &offset);
0542 if (WARN_ON(port == NULL))
0543 return -ENODEV;
0544
0545 gpio_base = pctrl->base + port->offset;
0546
0547
0548
0549
0550
0551 raw_spin_lock_irqsave(&pctrl->lock, flags);
0552 owl_gpio_update_reg(gpio_base + port->outen, offset, true);
0553 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0554
0555 return 0;
0556 }
0557
0558 static void owl_gpio_free(struct gpio_chip *chip, unsigned int offset)
0559 {
0560 struct owl_pinctrl *pctrl = gpiochip_get_data(chip);
0561 const struct owl_gpio_port *port;
0562 void __iomem *gpio_base;
0563 unsigned long flags;
0564
0565 port = owl_gpio_get_port(pctrl, &offset);
0566 if (WARN_ON(port == NULL))
0567 return;
0568
0569 gpio_base = pctrl->base + port->offset;
0570
0571 raw_spin_lock_irqsave(&pctrl->lock, flags);
0572
0573 owl_gpio_update_reg(gpio_base + port->outen, offset, false);
0574
0575
0576 owl_gpio_update_reg(gpio_base + port->inen, offset, false);
0577 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0578 }
0579
0580 static int owl_gpio_get(struct gpio_chip *chip, unsigned int offset)
0581 {
0582 struct owl_pinctrl *pctrl = gpiochip_get_data(chip);
0583 const struct owl_gpio_port *port;
0584 void __iomem *gpio_base;
0585 unsigned long flags;
0586 u32 val;
0587
0588 port = owl_gpio_get_port(pctrl, &offset);
0589 if (WARN_ON(port == NULL))
0590 return -ENODEV;
0591
0592 gpio_base = pctrl->base + port->offset;
0593
0594 raw_spin_lock_irqsave(&pctrl->lock, flags);
0595 val = readl_relaxed(gpio_base + port->dat);
0596 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0597
0598 return !!(val & BIT(offset));
0599 }
0600
0601 static void owl_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
0602 {
0603 struct owl_pinctrl *pctrl = gpiochip_get_data(chip);
0604 const struct owl_gpio_port *port;
0605 void __iomem *gpio_base;
0606 unsigned long flags;
0607
0608 port = owl_gpio_get_port(pctrl, &offset);
0609 if (WARN_ON(port == NULL))
0610 return;
0611
0612 gpio_base = pctrl->base + port->offset;
0613
0614 raw_spin_lock_irqsave(&pctrl->lock, flags);
0615 owl_gpio_update_reg(gpio_base + port->dat, offset, value);
0616 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0617 }
0618
0619 static int owl_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
0620 {
0621 struct owl_pinctrl *pctrl = gpiochip_get_data(chip);
0622 const struct owl_gpio_port *port;
0623 void __iomem *gpio_base;
0624 unsigned long flags;
0625
0626 port = owl_gpio_get_port(pctrl, &offset);
0627 if (WARN_ON(port == NULL))
0628 return -ENODEV;
0629
0630 gpio_base = pctrl->base + port->offset;
0631
0632 raw_spin_lock_irqsave(&pctrl->lock, flags);
0633 owl_gpio_update_reg(gpio_base + port->outen, offset, false);
0634 owl_gpio_update_reg(gpio_base + port->inen, offset, true);
0635 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0636
0637 return 0;
0638 }
0639
0640 static int owl_gpio_direction_output(struct gpio_chip *chip,
0641 unsigned int offset, int value)
0642 {
0643 struct owl_pinctrl *pctrl = gpiochip_get_data(chip);
0644 const struct owl_gpio_port *port;
0645 void __iomem *gpio_base;
0646 unsigned long flags;
0647
0648 port = owl_gpio_get_port(pctrl, &offset);
0649 if (WARN_ON(port == NULL))
0650 return -ENODEV;
0651
0652 gpio_base = pctrl->base + port->offset;
0653
0654 raw_spin_lock_irqsave(&pctrl->lock, flags);
0655 owl_gpio_update_reg(gpio_base + port->inen, offset, false);
0656 owl_gpio_update_reg(gpio_base + port->outen, offset, true);
0657 owl_gpio_update_reg(gpio_base + port->dat, offset, value);
0658 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0659
0660 return 0;
0661 }
0662
0663 static void irq_set_type(struct owl_pinctrl *pctrl, int gpio, unsigned int type)
0664 {
0665 const struct owl_gpio_port *port;
0666 void __iomem *gpio_base;
0667 unsigned long flags;
0668 unsigned int offset, value, irq_type = 0;
0669
0670 switch (type) {
0671 case IRQ_TYPE_EDGE_BOTH:
0672
0673
0674
0675
0676
0677
0678 if (owl_gpio_get(&pctrl->chip, gpio))
0679 irq_type = OWL_GPIO_INT_EDGE_FALLING;
0680 else
0681 irq_type = OWL_GPIO_INT_EDGE_RISING;
0682 break;
0683
0684 case IRQ_TYPE_EDGE_RISING:
0685 irq_type = OWL_GPIO_INT_EDGE_RISING;
0686 break;
0687
0688 case IRQ_TYPE_EDGE_FALLING:
0689 irq_type = OWL_GPIO_INT_EDGE_FALLING;
0690 break;
0691
0692 case IRQ_TYPE_LEVEL_HIGH:
0693 irq_type = OWL_GPIO_INT_LEVEL_HIGH;
0694 break;
0695
0696 case IRQ_TYPE_LEVEL_LOW:
0697 irq_type = OWL_GPIO_INT_LEVEL_LOW;
0698 break;
0699
0700 default:
0701 break;
0702 }
0703
0704 port = owl_gpio_get_port(pctrl, &gpio);
0705 if (WARN_ON(port == NULL))
0706 return;
0707
0708 gpio_base = pctrl->base + port->offset;
0709
0710 raw_spin_lock_irqsave(&pctrl->lock, flags);
0711
0712 offset = (gpio < 16) ? 4 : 0;
0713 value = readl_relaxed(gpio_base + port->intc_type + offset);
0714 value &= ~(OWL_GPIO_INT_MASK << ((gpio % 16) * 2));
0715 value |= irq_type << ((gpio % 16) * 2);
0716 writel_relaxed(value, gpio_base + port->intc_type + offset);
0717
0718 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0719 }
0720
0721 static void owl_gpio_irq_mask(struct irq_data *data)
0722 {
0723 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
0724 struct owl_pinctrl *pctrl = gpiochip_get_data(gc);
0725 const struct owl_gpio_port *port;
0726 void __iomem *gpio_base;
0727 unsigned long flags;
0728 unsigned int gpio = data->hwirq;
0729 u32 val;
0730
0731 port = owl_gpio_get_port(pctrl, &gpio);
0732 if (WARN_ON(port == NULL))
0733 return;
0734
0735 gpio_base = pctrl->base + port->offset;
0736
0737 raw_spin_lock_irqsave(&pctrl->lock, flags);
0738
0739 owl_gpio_update_reg(gpio_base + port->intc_msk, gpio, false);
0740
0741
0742 val = readl_relaxed(gpio_base + port->intc_msk);
0743 if (val == 0)
0744 owl_gpio_update_reg(gpio_base + port->intc_ctl,
0745 OWL_GPIO_CTLR_ENABLE + port->shared_ctl_offset * 5, false);
0746
0747 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0748 }
0749
0750 static void owl_gpio_irq_unmask(struct irq_data *data)
0751 {
0752 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
0753 struct owl_pinctrl *pctrl = gpiochip_get_data(gc);
0754 const struct owl_gpio_port *port;
0755 void __iomem *gpio_base;
0756 unsigned long flags;
0757 unsigned int gpio = data->hwirq;
0758 u32 value;
0759
0760 port = owl_gpio_get_port(pctrl, &gpio);
0761 if (WARN_ON(port == NULL))
0762 return;
0763
0764 gpio_base = pctrl->base + port->offset;
0765 raw_spin_lock_irqsave(&pctrl->lock, flags);
0766
0767
0768 value = readl_relaxed(gpio_base + port->intc_ctl);
0769 value |= ((BIT(OWL_GPIO_CTLR_ENABLE) | BIT(OWL_GPIO_CTLR_SAMPLE_CLK_24M))
0770 << port->shared_ctl_offset * 5);
0771 writel_relaxed(value, gpio_base + port->intc_ctl);
0772
0773
0774 owl_gpio_update_reg(gpio_base + port->intc_msk, gpio, true);
0775
0776 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0777 }
0778
0779 static void owl_gpio_irq_ack(struct irq_data *data)
0780 {
0781 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
0782 struct owl_pinctrl *pctrl = gpiochip_get_data(gc);
0783 const struct owl_gpio_port *port;
0784 void __iomem *gpio_base;
0785 unsigned long flags;
0786 unsigned int gpio = data->hwirq;
0787
0788
0789
0790
0791
0792 if (irqd_get_trigger_type(data) == IRQ_TYPE_EDGE_BOTH) {
0793 if (owl_gpio_get(gc, gpio))
0794 irq_set_type(pctrl, gpio, IRQ_TYPE_EDGE_FALLING);
0795 else
0796 irq_set_type(pctrl, gpio, IRQ_TYPE_EDGE_RISING);
0797 }
0798
0799 port = owl_gpio_get_port(pctrl, &gpio);
0800 if (WARN_ON(port == NULL))
0801 return;
0802
0803 gpio_base = pctrl->base + port->offset;
0804
0805 raw_spin_lock_irqsave(&pctrl->lock, flags);
0806
0807 owl_gpio_update_reg(gpio_base + port->intc_ctl,
0808 OWL_GPIO_CTLR_PENDING + port->shared_ctl_offset * 5, true);
0809
0810 raw_spin_unlock_irqrestore(&pctrl->lock, flags);
0811 }
0812
0813 static int owl_gpio_irq_set_type(struct irq_data *data, unsigned int type)
0814 {
0815 struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
0816 struct owl_pinctrl *pctrl = gpiochip_get_data(gc);
0817
0818 if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
0819 irq_set_handler_locked(data, handle_level_irq);
0820 else
0821 irq_set_handler_locked(data, handle_edge_irq);
0822
0823 irq_set_type(pctrl, data->hwirq, type);
0824
0825 return 0;
0826 }
0827
0828 static void owl_gpio_irq_handler(struct irq_desc *desc)
0829 {
0830 struct owl_pinctrl *pctrl = irq_desc_get_handler_data(desc);
0831 struct irq_chip *chip = irq_desc_get_chip(desc);
0832 struct irq_domain *domain = pctrl->chip.irq.domain;
0833 unsigned int parent = irq_desc_get_irq(desc);
0834 const struct owl_gpio_port *port;
0835 void __iomem *base;
0836 unsigned int pin, offset = 0, i;
0837 unsigned long pending_irq;
0838
0839 chained_irq_enter(chip, desc);
0840
0841 for (i = 0; i < pctrl->soc->nports; i++) {
0842 port = &pctrl->soc->ports[i];
0843 base = pctrl->base + port->offset;
0844
0845
0846 if (parent != pctrl->irq[i])
0847 goto skip;
0848
0849 pending_irq = readl_relaxed(base + port->intc_pd);
0850
0851 for_each_set_bit(pin, &pending_irq, port->pins) {
0852 generic_handle_domain_irq(domain, offset + pin);
0853
0854
0855 owl_gpio_update_reg(base + port->intc_pd, pin, true);
0856 }
0857
0858 skip:
0859 offset += port->pins;
0860 }
0861
0862 chained_irq_exit(chip, desc);
0863 }
0864
0865 static int owl_gpio_init(struct owl_pinctrl *pctrl)
0866 {
0867 struct gpio_chip *chip;
0868 struct gpio_irq_chip *gpio_irq;
0869 int ret, i, j, offset;
0870
0871 chip = &pctrl->chip;
0872 chip->base = -1;
0873 chip->ngpio = pctrl->soc->ngpios;
0874 chip->label = dev_name(pctrl->dev);
0875 chip->parent = pctrl->dev;
0876 chip->owner = THIS_MODULE;
0877
0878 pctrl->irq_chip.name = chip->of_node->name;
0879 pctrl->irq_chip.irq_ack = owl_gpio_irq_ack;
0880 pctrl->irq_chip.irq_mask = owl_gpio_irq_mask;
0881 pctrl->irq_chip.irq_unmask = owl_gpio_irq_unmask;
0882 pctrl->irq_chip.irq_set_type = owl_gpio_irq_set_type;
0883
0884 gpio_irq = &chip->irq;
0885 gpio_irq->chip = &pctrl->irq_chip;
0886 gpio_irq->handler = handle_simple_irq;
0887 gpio_irq->default_type = IRQ_TYPE_NONE;
0888 gpio_irq->parent_handler = owl_gpio_irq_handler;
0889 gpio_irq->parent_handler_data = pctrl;
0890 gpio_irq->num_parents = pctrl->num_irq;
0891 gpio_irq->parents = pctrl->irq;
0892
0893 gpio_irq->map = devm_kcalloc(pctrl->dev, chip->ngpio,
0894 sizeof(*gpio_irq->map), GFP_KERNEL);
0895 if (!gpio_irq->map)
0896 return -ENOMEM;
0897
0898 for (i = 0, offset = 0; i < pctrl->soc->nports; i++) {
0899 const struct owl_gpio_port *port = &pctrl->soc->ports[i];
0900
0901 for (j = 0; j < port->pins; j++)
0902 gpio_irq->map[offset + j] = gpio_irq->parents[i];
0903
0904 offset += port->pins;
0905 }
0906
0907 ret = gpiochip_add_data(&pctrl->chip, pctrl);
0908 if (ret) {
0909 dev_err(pctrl->dev, "failed to register gpiochip\n");
0910 return ret;
0911 }
0912
0913 return 0;
0914 }
0915
0916 int owl_pinctrl_probe(struct platform_device *pdev,
0917 struct owl_pinctrl_soc_data *soc_data)
0918 {
0919 struct owl_pinctrl *pctrl;
0920 int ret, i;
0921
0922 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
0923 if (!pctrl)
0924 return -ENOMEM;
0925
0926 pctrl->base = devm_platform_ioremap_resource(pdev, 0);
0927 if (IS_ERR(pctrl->base))
0928 return PTR_ERR(pctrl->base);
0929
0930
0931 pctrl->clk = devm_clk_get(&pdev->dev, NULL);
0932 if (IS_ERR(pctrl->clk)) {
0933 dev_err(&pdev->dev, "no clock defined\n");
0934 return PTR_ERR(pctrl->clk);
0935 }
0936
0937 ret = clk_prepare_enable(pctrl->clk);
0938 if (ret) {
0939 dev_err(&pdev->dev, "clk enable failed\n");
0940 return ret;
0941 }
0942
0943 raw_spin_lock_init(&pctrl->lock);
0944
0945 owl_pinctrl_desc.name = dev_name(&pdev->dev);
0946 owl_pinctrl_desc.pins = soc_data->pins;
0947 owl_pinctrl_desc.npins = soc_data->npins;
0948
0949 pctrl->chip.direction_input = owl_gpio_direction_input;
0950 pctrl->chip.direction_output = owl_gpio_direction_output;
0951 pctrl->chip.get = owl_gpio_get;
0952 pctrl->chip.set = owl_gpio_set;
0953 pctrl->chip.request = owl_gpio_request;
0954 pctrl->chip.free = owl_gpio_free;
0955
0956 pctrl->soc = soc_data;
0957 pctrl->dev = &pdev->dev;
0958
0959 pctrl->pctrldev = devm_pinctrl_register(&pdev->dev,
0960 &owl_pinctrl_desc, pctrl);
0961 if (IS_ERR(pctrl->pctrldev)) {
0962 dev_err(&pdev->dev, "could not register Actions OWL pinmux driver\n");
0963 ret = PTR_ERR(pctrl->pctrldev);
0964 goto err_exit;
0965 }
0966
0967 ret = platform_irq_count(pdev);
0968 if (ret < 0)
0969 goto err_exit;
0970
0971 pctrl->num_irq = ret;
0972
0973 pctrl->irq = devm_kcalloc(&pdev->dev, pctrl->num_irq,
0974 sizeof(*pctrl->irq), GFP_KERNEL);
0975 if (!pctrl->irq) {
0976 ret = -ENOMEM;
0977 goto err_exit;
0978 }
0979
0980 for (i = 0; i < pctrl->num_irq ; i++) {
0981 ret = platform_get_irq(pdev, i);
0982 if (ret < 0)
0983 goto err_exit;
0984 pctrl->irq[i] = ret;
0985 }
0986
0987 ret = owl_gpio_init(pctrl);
0988 if (ret)
0989 goto err_exit;
0990
0991 platform_set_drvdata(pdev, pctrl);
0992
0993 return 0;
0994
0995 err_exit:
0996 clk_disable_unprepare(pctrl->clk);
0997
0998 return ret;
0999 }