linux/drivers/pinctrl/pinctrl-oxnas.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Oxford Semiconductor OXNAS SoC Family pinctrl driver
   4 *
   5 * Copyright (C) 2016 Neil Armstrong <narmstrong@baylibre.com>
   6 *
   7 * Based on pinctrl-pic32.c
   8 * Joshua Henderson, <joshua.henderson@microchip.com>
   9 * Copyright (C) 2015 Microchip Technology Inc.  All rights reserved.
  10 */
  11#include <linux/gpio/driver.h>
  12#include <linux/interrupt.h>
  13#include <linux/io.h>
  14#include <linux/irq.h>
  15#include <linux/of.h>
  16#include <linux/of_device.h>
  17#include <linux/pinctrl/pinconf.h>
  18#include <linux/pinctrl/pinconf-generic.h>
  19#include <linux/pinctrl/pinctrl.h>
  20#include <linux/pinctrl/pinmux.h>
  21#include <linux/platform_device.h>
  22#include <linux/slab.h>
  23#include <linux/regmap.h>
  24#include <linux/mfd/syscon.h>
  25
  26#include "pinctrl-utils.h"
  27
  28#define PINS_PER_BANK           32
  29
  30#define GPIO_BANK_START(bank)           ((bank) * PINS_PER_BANK)
  31
  32/* OX810 Regmap Offsets */
  33#define PINMUX_810_PRIMARY_SEL0         0x0c
  34#define PINMUX_810_SECONDARY_SEL0       0x14
  35#define PINMUX_810_TERTIARY_SEL0        0x8c
  36#define PINMUX_810_PRIMARY_SEL1         0x10
  37#define PINMUX_810_SECONDARY_SEL1       0x18
  38#define PINMUX_810_TERTIARY_SEL1        0x90
  39#define PINMUX_810_PULLUP_CTRL0         0xac
  40#define PINMUX_810_PULLUP_CTRL1         0xb0
  41
  42/* OX820 Regmap Offsets */
  43#define PINMUX_820_BANK_OFFSET          0x100000
  44#define PINMUX_820_SECONDARY_SEL        0x14
  45#define PINMUX_820_TERTIARY_SEL         0x8c
  46#define PINMUX_820_QUATERNARY_SEL       0x94
  47#define PINMUX_820_DEBUG_SEL            0x9c
  48#define PINMUX_820_ALTERNATIVE_SEL      0xa4
  49#define PINMUX_820_PULLUP_CTRL          0xac
  50
  51/* GPIO Registers */
  52#define INPUT_VALUE     0x00
  53#define OUTPUT_EN       0x04
  54#define IRQ_PENDING     0x0c
  55#define OUTPUT_SET      0x14
  56#define OUTPUT_CLEAR    0x18
  57#define OUTPUT_EN_SET   0x1c
  58#define OUTPUT_EN_CLEAR 0x20
  59#define RE_IRQ_ENABLE   0x28
  60#define FE_IRQ_ENABLE   0x2c
  61
  62struct oxnas_function {
  63        const char *name;
  64        const char * const *groups;
  65        unsigned int ngroups;
  66};
  67
  68struct oxnas_pin_group {
  69        const char *name;
  70        unsigned int pin;
  71        unsigned int bank;
  72        struct oxnas_desc_function *functions;
  73};
  74
  75struct oxnas_desc_function {
  76        const char *name;
  77        unsigned int fct;
  78};
  79
  80struct oxnas_gpio_bank {
  81        void __iomem *reg_base;
  82        struct gpio_chip gpio_chip;
  83        struct irq_chip irq_chip;
  84        unsigned int id;
  85};
  86
  87struct oxnas_pinctrl {
  88        struct regmap *regmap;
  89        struct device *dev;
  90        struct pinctrl_dev *pctldev;
  91        const struct oxnas_function *functions;
  92        unsigned int nfunctions;
  93        const struct oxnas_pin_group *groups;
  94        unsigned int ngroups;
  95        struct oxnas_gpio_bank *gpio_banks;
  96        unsigned int nbanks;
  97};
  98
  99struct oxnas_pinctrl_data {
 100        struct pinctrl_desc *desc;
 101        struct oxnas_pinctrl *pctl;
 102};
 103
 104static const struct pinctrl_pin_desc oxnas_ox810se_pins[] = {
 105        PINCTRL_PIN(0, "gpio0"),
 106        PINCTRL_PIN(1, "gpio1"),
 107        PINCTRL_PIN(2, "gpio2"),
 108        PINCTRL_PIN(3, "gpio3"),
 109        PINCTRL_PIN(4, "gpio4"),
 110        PINCTRL_PIN(5, "gpio5"),
 111        PINCTRL_PIN(6, "gpio6"),
 112        PINCTRL_PIN(7, "gpio7"),
 113        PINCTRL_PIN(8, "gpio8"),
 114        PINCTRL_PIN(9, "gpio9"),
 115        PINCTRL_PIN(10, "gpio10"),
 116        PINCTRL_PIN(11, "gpio11"),
 117        PINCTRL_PIN(12, "gpio12"),
 118        PINCTRL_PIN(13, "gpio13"),
 119        PINCTRL_PIN(14, "gpio14"),
 120        PINCTRL_PIN(15, "gpio15"),
 121        PINCTRL_PIN(16, "gpio16"),
 122        PINCTRL_PIN(17, "gpio17"),
 123        PINCTRL_PIN(18, "gpio18"),
 124        PINCTRL_PIN(19, "gpio19"),
 125        PINCTRL_PIN(20, "gpio20"),
 126        PINCTRL_PIN(21, "gpio21"),
 127        PINCTRL_PIN(22, "gpio22"),
 128        PINCTRL_PIN(23, "gpio23"),
 129        PINCTRL_PIN(24, "gpio24"),
 130        PINCTRL_PIN(25, "gpio25"),
 131        PINCTRL_PIN(26, "gpio26"),
 132        PINCTRL_PIN(27, "gpio27"),
 133        PINCTRL_PIN(28, "gpio28"),
 134        PINCTRL_PIN(29, "gpio29"),
 135        PINCTRL_PIN(30, "gpio30"),
 136        PINCTRL_PIN(31, "gpio31"),
 137        PINCTRL_PIN(32, "gpio32"),
 138        PINCTRL_PIN(33, "gpio33"),
 139        PINCTRL_PIN(34, "gpio34"),
 140};
 141
 142static const struct pinctrl_pin_desc oxnas_ox820_pins[] = {
 143        PINCTRL_PIN(0, "gpio0"),
 144        PINCTRL_PIN(1, "gpio1"),
 145        PINCTRL_PIN(2, "gpio2"),
 146        PINCTRL_PIN(3, "gpio3"),
 147        PINCTRL_PIN(4, "gpio4"),
 148        PINCTRL_PIN(5, "gpio5"),
 149        PINCTRL_PIN(6, "gpio6"),
 150        PINCTRL_PIN(7, "gpio7"),
 151        PINCTRL_PIN(8, "gpio8"),
 152        PINCTRL_PIN(9, "gpio9"),
 153        PINCTRL_PIN(10, "gpio10"),
 154        PINCTRL_PIN(11, "gpio11"),
 155        PINCTRL_PIN(12, "gpio12"),
 156        PINCTRL_PIN(13, "gpio13"),
 157        PINCTRL_PIN(14, "gpio14"),
 158        PINCTRL_PIN(15, "gpio15"),
 159        PINCTRL_PIN(16, "gpio16"),
 160        PINCTRL_PIN(17, "gpio17"),
 161        PINCTRL_PIN(18, "gpio18"),
 162        PINCTRL_PIN(19, "gpio19"),
 163        PINCTRL_PIN(20, "gpio20"),
 164        PINCTRL_PIN(21, "gpio21"),
 165        PINCTRL_PIN(22, "gpio22"),
 166        PINCTRL_PIN(23, "gpio23"),
 167        PINCTRL_PIN(24, "gpio24"),
 168        PINCTRL_PIN(25, "gpio25"),
 169        PINCTRL_PIN(26, "gpio26"),
 170        PINCTRL_PIN(27, "gpio27"),
 171        PINCTRL_PIN(28, "gpio28"),
 172        PINCTRL_PIN(29, "gpio29"),
 173        PINCTRL_PIN(30, "gpio30"),
 174        PINCTRL_PIN(31, "gpio31"),
 175        PINCTRL_PIN(32, "gpio32"),
 176        PINCTRL_PIN(33, "gpio33"),
 177        PINCTRL_PIN(34, "gpio34"),
 178        PINCTRL_PIN(35, "gpio35"),
 179        PINCTRL_PIN(36, "gpio36"),
 180        PINCTRL_PIN(37, "gpio37"),
 181        PINCTRL_PIN(38, "gpio38"),
 182        PINCTRL_PIN(39, "gpio39"),
 183        PINCTRL_PIN(40, "gpio40"),
 184        PINCTRL_PIN(41, "gpio41"),
 185        PINCTRL_PIN(42, "gpio42"),
 186        PINCTRL_PIN(43, "gpio43"),
 187        PINCTRL_PIN(44, "gpio44"),
 188        PINCTRL_PIN(45, "gpio45"),
 189        PINCTRL_PIN(46, "gpio46"),
 190        PINCTRL_PIN(47, "gpio47"),
 191        PINCTRL_PIN(48, "gpio48"),
 192        PINCTRL_PIN(49, "gpio49"),
 193};
 194
 195static const char * const oxnas_ox810se_fct0_group[] = {
 196        "gpio0",  "gpio1",  "gpio2",  "gpio3",
 197        "gpio4",  "gpio5",  "gpio6",  "gpio7",
 198        "gpio8",  "gpio9",  "gpio10", "gpio11",
 199        "gpio12", "gpio13", "gpio14", "gpio15",
 200        "gpio16", "gpio17", "gpio18", "gpio19",
 201        "gpio20", "gpio21", "gpio22", "gpio23",
 202        "gpio24", "gpio25", "gpio26", "gpio27",
 203        "gpio28", "gpio29", "gpio30", "gpio31",
 204        "gpio32", "gpio33", "gpio34"
 205};
 206
 207static const char * const oxnas_ox810se_fct3_group[] = {
 208        "gpio0",  "gpio1",  "gpio2",  "gpio3",
 209        "gpio4",  "gpio5",  "gpio6",  "gpio7",
 210        "gpio8",  "gpio9",
 211        "gpio20",
 212        "gpio22", "gpio23", "gpio24", "gpio25",
 213        "gpio26", "gpio27", "gpio28", "gpio29",
 214        "gpio30", "gpio31", "gpio32", "gpio33",
 215        "gpio34"
 216};
 217
 218static const char * const oxnas_ox820_fct0_group[] = {
 219        "gpio0",  "gpio1",  "gpio2",  "gpio3",
 220        "gpio4",  "gpio5",  "gpio6",  "gpio7",
 221        "gpio8",  "gpio9",  "gpio10", "gpio11",
 222        "gpio12", "gpio13", "gpio14", "gpio15",
 223        "gpio16", "gpio17", "gpio18", "gpio19",
 224        "gpio20", "gpio21", "gpio22", "gpio23",
 225        "gpio24", "gpio25", "gpio26", "gpio27",
 226        "gpio28", "gpio29", "gpio30", "gpio31",
 227        "gpio32", "gpio33", "gpio34", "gpio35",
 228        "gpio36", "gpio37", "gpio38", "gpio39",
 229        "gpio40", "gpio41", "gpio42", "gpio43",
 230        "gpio44", "gpio45", "gpio46", "gpio47",
 231        "gpio48", "gpio49"
 232};
 233
 234static const char * const oxnas_ox820_fct1_group[] = {
 235        "gpio3", "gpio4",
 236        "gpio12", "gpio13", "gpio14", "gpio15",
 237        "gpio16", "gpio17", "gpio18", "gpio19",
 238        "gpio20", "gpio21", "gpio22", "gpio23",
 239        "gpio24"
 240};
 241
 242static const char * const oxnas_ox820_fct4_group[] = {
 243        "gpio5", "gpio6", "gpio7", "gpio8",
 244        "gpio24", "gpio25", "gpio26", "gpio27",
 245        "gpio40", "gpio41", "gpio42", "gpio43"
 246};
 247
 248static const char * const oxnas_ox820_fct5_group[] = {
 249        "gpio28", "gpio29", "gpio30", "gpio31"
 250};
 251
 252#define FUNCTION(_name, _gr)                                    \
 253        {                                                       \
 254                .name = #_name,                                 \
 255                .groups = oxnas_##_gr##_group,                  \
 256                .ngroups = ARRAY_SIZE(oxnas_##_gr##_group),     \
 257        }
 258
 259static const struct oxnas_function oxnas_ox810se_functions[] = {
 260        FUNCTION(gpio, ox810se_fct0),
 261        FUNCTION(fct3, ox810se_fct3),
 262};
 263
 264static const struct oxnas_function oxnas_ox820_functions[] = {
 265        FUNCTION(gpio, ox820_fct0),
 266        FUNCTION(fct1, ox820_fct1),
 267        FUNCTION(fct4, ox820_fct4),
 268        FUNCTION(fct5, ox820_fct5),
 269};
 270
 271#define OXNAS_PINCTRL_GROUP(_pin, _name, ...)                           \
 272        {                                                               \
 273                .name = #_name,                                         \
 274                .pin = _pin,                                            \
 275                .bank = _pin / PINS_PER_BANK,                           \
 276                .functions = (struct oxnas_desc_function[]){            \
 277                        __VA_ARGS__, { } },                             \
 278        }
 279
 280#define OXNAS_PINCTRL_FUNCTION(_name, _fct)             \
 281        {                                               \
 282                .name = #_name,                         \
 283                .fct = _fct,                            \
 284        }
 285
 286static const struct oxnas_pin_group oxnas_ox810se_groups[] = {
 287        OXNAS_PINCTRL_GROUP(0, gpio0,
 288                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 289                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 290        OXNAS_PINCTRL_GROUP(1, gpio1,
 291                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 292                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 293        OXNAS_PINCTRL_GROUP(2, gpio2,
 294                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 295                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 296        OXNAS_PINCTRL_GROUP(3, gpio3,
 297                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 298                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 299        OXNAS_PINCTRL_GROUP(4, gpio4,
 300                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 301                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 302        OXNAS_PINCTRL_GROUP(5, gpio5,
 303                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 304                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 305        OXNAS_PINCTRL_GROUP(6, gpio6,
 306                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 307                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 308        OXNAS_PINCTRL_GROUP(7, gpio7,
 309                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 310                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 311        OXNAS_PINCTRL_GROUP(8, gpio8,
 312                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 313                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 314        OXNAS_PINCTRL_GROUP(9, gpio9,
 315                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 316                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 317        OXNAS_PINCTRL_GROUP(10, gpio10,
 318                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 319        OXNAS_PINCTRL_GROUP(11, gpio11,
 320                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 321        OXNAS_PINCTRL_GROUP(12, gpio12,
 322                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 323        OXNAS_PINCTRL_GROUP(13, gpio13,
 324                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 325        OXNAS_PINCTRL_GROUP(14, gpio14,
 326                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 327        OXNAS_PINCTRL_GROUP(15, gpio15,
 328                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 329        OXNAS_PINCTRL_GROUP(16, gpio16,
 330                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 331        OXNAS_PINCTRL_GROUP(17, gpio17,
 332                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 333        OXNAS_PINCTRL_GROUP(18, gpio18,
 334                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 335        OXNAS_PINCTRL_GROUP(19, gpio19,
 336                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 337        OXNAS_PINCTRL_GROUP(20, gpio20,
 338                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 339                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 340        OXNAS_PINCTRL_GROUP(21, gpio21,
 341                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 342        OXNAS_PINCTRL_GROUP(22, gpio22,
 343                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 344                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 345        OXNAS_PINCTRL_GROUP(23, gpio23,
 346                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 347                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 348        OXNAS_PINCTRL_GROUP(24, gpio24,
 349                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 350                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 351        OXNAS_PINCTRL_GROUP(25, gpio25,
 352                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 353                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 354        OXNAS_PINCTRL_GROUP(26, gpio26,
 355                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 356                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 357        OXNAS_PINCTRL_GROUP(27, gpio27,
 358                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 359                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 360        OXNAS_PINCTRL_GROUP(28, gpio28,
 361                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 362                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 363        OXNAS_PINCTRL_GROUP(29, gpio29,
 364                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 365                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 366        OXNAS_PINCTRL_GROUP(30, gpio30,
 367                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 368                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 369        OXNAS_PINCTRL_GROUP(31, gpio31,
 370                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 371                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 372        OXNAS_PINCTRL_GROUP(32, gpio32,
 373                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 374                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 375        OXNAS_PINCTRL_GROUP(33, gpio33,
 376                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 377                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 378        OXNAS_PINCTRL_GROUP(34, gpio34,
 379                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 380                        OXNAS_PINCTRL_FUNCTION(fct3, 3)),
 381};
 382
 383static const struct oxnas_pin_group oxnas_ox820_groups[] = {
 384        OXNAS_PINCTRL_GROUP(0, gpio0,
 385                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 386        OXNAS_PINCTRL_GROUP(1, gpio1,
 387                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 388        OXNAS_PINCTRL_GROUP(2, gpio2,
 389                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 390        OXNAS_PINCTRL_GROUP(3, gpio3,
 391                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 392                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 393        OXNAS_PINCTRL_GROUP(4, gpio4,
 394                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 395                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 396        OXNAS_PINCTRL_GROUP(5, gpio5,
 397                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 398                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 399        OXNAS_PINCTRL_GROUP(6, gpio6,
 400                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 401                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 402        OXNAS_PINCTRL_GROUP(7, gpio7,
 403                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 404                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 405        OXNAS_PINCTRL_GROUP(8, gpio8,
 406                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 407                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 408        OXNAS_PINCTRL_GROUP(9, gpio9,
 409                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 410        OXNAS_PINCTRL_GROUP(10, gpio10,
 411                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 412        OXNAS_PINCTRL_GROUP(11, gpio11,
 413                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 414        OXNAS_PINCTRL_GROUP(12, gpio12,
 415                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 416                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 417        OXNAS_PINCTRL_GROUP(13, gpio13,
 418                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 419                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 420        OXNAS_PINCTRL_GROUP(14, gpio14,
 421                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 422                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 423        OXNAS_PINCTRL_GROUP(15, gpio15,
 424                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 425                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 426        OXNAS_PINCTRL_GROUP(16, gpio16,
 427                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 428                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 429        OXNAS_PINCTRL_GROUP(17, gpio17,
 430                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 431                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 432        OXNAS_PINCTRL_GROUP(18, gpio18,
 433                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 434                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 435        OXNAS_PINCTRL_GROUP(19, gpio19,
 436                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 437                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 438        OXNAS_PINCTRL_GROUP(20, gpio20,
 439                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 440                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 441        OXNAS_PINCTRL_GROUP(21, gpio21,
 442                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 443                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 444        OXNAS_PINCTRL_GROUP(22, gpio22,
 445                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 446                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 447        OXNAS_PINCTRL_GROUP(23, gpio23,
 448                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 449                        OXNAS_PINCTRL_FUNCTION(fct1, 1)),
 450        OXNAS_PINCTRL_GROUP(24, gpio24,
 451                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 452                        OXNAS_PINCTRL_FUNCTION(fct1, 1),
 453                        OXNAS_PINCTRL_FUNCTION(fct4, 5)),
 454        OXNAS_PINCTRL_GROUP(25, gpio25,
 455                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 456                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 457        OXNAS_PINCTRL_GROUP(26, gpio26,
 458                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 459                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 460        OXNAS_PINCTRL_GROUP(27, gpio27,
 461                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 462                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 463        OXNAS_PINCTRL_GROUP(28, gpio28,
 464                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 465                        OXNAS_PINCTRL_FUNCTION(fct5, 5)),
 466        OXNAS_PINCTRL_GROUP(29, gpio29,
 467                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 468                        OXNAS_PINCTRL_FUNCTION(fct5, 5)),
 469        OXNAS_PINCTRL_GROUP(30, gpio30,
 470                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 471                        OXNAS_PINCTRL_FUNCTION(fct5, 5)),
 472        OXNAS_PINCTRL_GROUP(31, gpio31,
 473                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 474                        OXNAS_PINCTRL_FUNCTION(fct5, 5)),
 475        OXNAS_PINCTRL_GROUP(32, gpio32,
 476                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 477        OXNAS_PINCTRL_GROUP(33, gpio33,
 478                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 479        OXNAS_PINCTRL_GROUP(34, gpio34,
 480                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 481        OXNAS_PINCTRL_GROUP(35, gpio35,
 482                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 483        OXNAS_PINCTRL_GROUP(36, gpio36,
 484                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 485        OXNAS_PINCTRL_GROUP(37, gpio37,
 486                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 487        OXNAS_PINCTRL_GROUP(38, gpio38,
 488                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 489        OXNAS_PINCTRL_GROUP(39, gpio39,
 490                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 491        OXNAS_PINCTRL_GROUP(40, gpio40,
 492                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 493                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 494        OXNAS_PINCTRL_GROUP(41, gpio41,
 495                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 496                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 497        OXNAS_PINCTRL_GROUP(42, gpio42,
 498                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 499                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 500        OXNAS_PINCTRL_GROUP(43, gpio43,
 501                        OXNAS_PINCTRL_FUNCTION(gpio, 0),
 502                        OXNAS_PINCTRL_FUNCTION(fct4, 4)),
 503        OXNAS_PINCTRL_GROUP(44, gpio44,
 504                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 505        OXNAS_PINCTRL_GROUP(45, gpio45,
 506                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 507        OXNAS_PINCTRL_GROUP(46, gpio46,
 508                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 509        OXNAS_PINCTRL_GROUP(47, gpio47,
 510                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 511        OXNAS_PINCTRL_GROUP(48, gpio48,
 512                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 513        OXNAS_PINCTRL_GROUP(49, gpio49,
 514                        OXNAS_PINCTRL_FUNCTION(gpio, 0)),
 515};
 516
 517static inline struct oxnas_gpio_bank *pctl_to_bank(struct oxnas_pinctrl *pctl,
 518                                                   unsigned int pin)
 519{
 520        return &pctl->gpio_banks[pin / PINS_PER_BANK];
 521}
 522
 523static int oxnas_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
 524{
 525        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 526
 527        return pctl->ngroups;
 528}
 529
 530static const char *oxnas_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
 531                                                unsigned int group)
 532{
 533        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 534
 535        return pctl->groups[group].name;
 536}
 537
 538static int oxnas_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
 539                                        unsigned int group,
 540                                        const unsigned int **pins,
 541                                        unsigned int *num_pins)
 542{
 543        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 544
 545        *pins = &pctl->groups[group].pin;
 546        *num_pins = 1;
 547
 548        return 0;
 549}
 550
 551static const struct pinctrl_ops oxnas_pinctrl_ops = {
 552        .get_groups_count = oxnas_pinctrl_get_groups_count,
 553        .get_group_name = oxnas_pinctrl_get_group_name,
 554        .get_group_pins = oxnas_pinctrl_get_group_pins,
 555        .dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
 556        .dt_free_map = pinctrl_utils_free_map,
 557};
 558
 559static int oxnas_pinmux_get_functions_count(struct pinctrl_dev *pctldev)
 560{
 561        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 562
 563        return pctl->nfunctions;
 564}
 565
 566static const char *
 567oxnas_pinmux_get_function_name(struct pinctrl_dev *pctldev, unsigned int func)
 568{
 569        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 570
 571        return pctl->functions[func].name;
 572}
 573
 574static int oxnas_pinmux_get_function_groups(struct pinctrl_dev *pctldev,
 575                                            unsigned int func,
 576                                            const char * const **groups,
 577                                            unsigned int * const num_groups)
 578{
 579        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 580
 581        *groups = pctl->functions[func].groups;
 582        *num_groups = pctl->functions[func].ngroups;
 583
 584        return 0;
 585}
 586
 587static int oxnas_ox810se_pinmux_enable(struct pinctrl_dev *pctldev,
 588                                       unsigned int func, unsigned int group)
 589{
 590        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 591        const struct oxnas_pin_group *pg = &pctl->groups[group];
 592        const struct oxnas_function *pf = &pctl->functions[func];
 593        const char *fname = pf->name;
 594        struct oxnas_desc_function *functions = pg->functions;
 595        u32 mask = BIT(pg->pin);
 596
 597        while (functions->name) {
 598                if (!strcmp(functions->name, fname)) {
 599                        dev_dbg(pctl->dev,
 600                                "setting function %s bank %d pin %d fct %d mask %x\n",
 601                                fname, pg->bank, pg->pin,
 602                                functions->fct, mask);
 603
 604                        regmap_write_bits(pctl->regmap,
 605                                          (pg->bank ?
 606                                                PINMUX_810_PRIMARY_SEL1 :
 607                                                PINMUX_810_PRIMARY_SEL0),
 608                                          mask,
 609                                          (functions->fct == 1 ?
 610                                                mask : 0));
 611                        regmap_write_bits(pctl->regmap,
 612                                          (pg->bank ?
 613                                                PINMUX_810_SECONDARY_SEL1 :
 614                                                PINMUX_810_SECONDARY_SEL0),
 615                                          mask,
 616                                          (functions->fct == 2 ?
 617                                                mask : 0));
 618                        regmap_write_bits(pctl->regmap,
 619                                          (pg->bank ?
 620                                                PINMUX_810_TERTIARY_SEL1 :
 621                                                PINMUX_810_TERTIARY_SEL0),
 622                                          mask,
 623                                          (functions->fct == 3 ?
 624                                                mask : 0));
 625
 626                        return 0;
 627                }
 628
 629                functions++;
 630        }
 631
 632        dev_err(pctl->dev, "cannot mux pin %u to function %u\n", group, func);
 633
 634        return -EINVAL;
 635}
 636
 637static int oxnas_ox820_pinmux_enable(struct pinctrl_dev *pctldev,
 638                                     unsigned int func, unsigned int group)
 639{
 640        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 641        const struct oxnas_pin_group *pg = &pctl->groups[group];
 642        const struct oxnas_function *pf = &pctl->functions[func];
 643        const char *fname = pf->name;
 644        struct oxnas_desc_function *functions = pg->functions;
 645        unsigned int offset = (pg->bank ? PINMUX_820_BANK_OFFSET : 0);
 646        u32 mask = BIT(pg->pin);
 647
 648        while (functions->name) {
 649                if (!strcmp(functions->name, fname)) {
 650                        dev_dbg(pctl->dev,
 651                                "setting function %s bank %d pin %d fct %d mask %x\n",
 652                                fname, pg->bank, pg->pin,
 653                                functions->fct, mask);
 654
 655                        regmap_write_bits(pctl->regmap,
 656                                          offset + PINMUX_820_SECONDARY_SEL,
 657                                          mask,
 658                                          (functions->fct == 1 ?
 659                                                mask : 0));
 660                        regmap_write_bits(pctl->regmap,
 661                                          offset + PINMUX_820_TERTIARY_SEL,
 662                                          mask,
 663                                          (functions->fct == 2 ?
 664                                                mask : 0));
 665                        regmap_write_bits(pctl->regmap,
 666                                          offset + PINMUX_820_QUATERNARY_SEL,
 667                                          mask,
 668                                          (functions->fct == 3 ?
 669                                                mask : 0));
 670                        regmap_write_bits(pctl->regmap,
 671                                          offset + PINMUX_820_DEBUG_SEL,
 672                                          mask,
 673                                          (functions->fct == 4 ?
 674                                                mask : 0));
 675                        regmap_write_bits(pctl->regmap,
 676                                          offset + PINMUX_820_ALTERNATIVE_SEL,
 677                                          mask,
 678                                          (functions->fct == 5 ?
 679                                                mask : 0));
 680
 681                        return 0;
 682                }
 683
 684                functions++;
 685        }
 686
 687        dev_err(pctl->dev, "cannot mux pin %u to function %u\n", group, func);
 688
 689        return -EINVAL;
 690}
 691
 692static int oxnas_ox810se_gpio_request_enable(struct pinctrl_dev *pctldev,
 693                                             struct pinctrl_gpio_range *range,
 694                                             unsigned int offset)
 695{
 696        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 697        struct oxnas_gpio_bank *bank = gpiochip_get_data(range->gc);
 698        u32 mask = BIT(offset - bank->gpio_chip.base);
 699
 700        dev_dbg(pctl->dev, "requesting gpio %d in bank %d (id %d) with mask 0x%x\n",
 701                offset, bank->gpio_chip.base, bank->id, mask);
 702
 703        regmap_write_bits(pctl->regmap,
 704                          (bank->id ?
 705                                PINMUX_810_PRIMARY_SEL1 :
 706                                PINMUX_810_PRIMARY_SEL0),
 707                          mask, 0);
 708        regmap_write_bits(pctl->regmap,
 709                          (bank->id ?
 710                                PINMUX_810_SECONDARY_SEL1 :
 711                                PINMUX_810_SECONDARY_SEL0),
 712                          mask, 0);
 713        regmap_write_bits(pctl->regmap,
 714                          (bank->id ?
 715                                PINMUX_810_TERTIARY_SEL1 :
 716                                PINMUX_810_TERTIARY_SEL0),
 717                          mask, 0);
 718
 719        return 0;
 720}
 721
 722static int oxnas_ox820_gpio_request_enable(struct pinctrl_dev *pctldev,
 723                                           struct pinctrl_gpio_range *range,
 724                                           unsigned int offset)
 725{
 726        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 727        struct oxnas_gpio_bank *bank = gpiochip_get_data(range->gc);
 728        unsigned int bank_offset = (bank->id ? PINMUX_820_BANK_OFFSET : 0);
 729        u32 mask = BIT(offset - bank->gpio_chip.base);
 730
 731        dev_dbg(pctl->dev, "requesting gpio %d in bank %d (id %d) with mask 0x%x\n",
 732                offset, bank->gpio_chip.base, bank->id, mask);
 733
 734        regmap_write_bits(pctl->regmap,
 735                          bank_offset + PINMUX_820_SECONDARY_SEL,
 736                          mask, 0);
 737        regmap_write_bits(pctl->regmap,
 738                          bank_offset + PINMUX_820_TERTIARY_SEL,
 739                          mask, 0);
 740        regmap_write_bits(pctl->regmap,
 741                          bank_offset + PINMUX_820_QUATERNARY_SEL,
 742                          mask, 0);
 743        regmap_write_bits(pctl->regmap,
 744                          bank_offset + PINMUX_820_DEBUG_SEL,
 745                          mask, 0);
 746        regmap_write_bits(pctl->regmap,
 747                          bank_offset + PINMUX_820_ALTERNATIVE_SEL,
 748                          mask, 0);
 749
 750        return 0;
 751}
 752
 753static int oxnas_gpio_get_direction(struct gpio_chip *chip,
 754                                      unsigned int offset)
 755{
 756        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 757        u32 mask = BIT(offset);
 758
 759        if (readl_relaxed(bank->reg_base + OUTPUT_EN) & mask)
 760                return GPIO_LINE_DIRECTION_OUT;
 761
 762        return GPIO_LINE_DIRECTION_IN;
 763}
 764
 765static int oxnas_gpio_direction_input(struct gpio_chip *chip,
 766                                      unsigned int offset)
 767{
 768        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 769        u32 mask = BIT(offset);
 770
 771        writel_relaxed(mask, bank->reg_base + OUTPUT_EN_CLEAR);
 772
 773        return 0;
 774}
 775
 776static int oxnas_gpio_get(struct gpio_chip *chip, unsigned int offset)
 777{
 778        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 779        u32 mask = BIT(offset);
 780
 781        return (readl_relaxed(bank->reg_base + INPUT_VALUE) & mask) != 0;
 782}
 783
 784static void oxnas_gpio_set(struct gpio_chip *chip, unsigned int offset,
 785                               int value)
 786{
 787        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 788        u32 mask = BIT(offset);
 789
 790        if (value)
 791                writel_relaxed(mask, bank->reg_base + OUTPUT_SET);
 792        else
 793                writel_relaxed(mask, bank->reg_base + OUTPUT_CLEAR);
 794}
 795
 796static int oxnas_gpio_direction_output(struct gpio_chip *chip,
 797                                       unsigned int offset, int value)
 798{
 799        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 800        u32 mask = BIT(offset);
 801
 802        oxnas_gpio_set(chip, offset, value);
 803        writel_relaxed(mask, bank->reg_base + OUTPUT_EN_SET);
 804
 805        return 0;
 806}
 807
 808static int oxnas_gpio_set_direction(struct pinctrl_dev *pctldev,
 809                                    struct pinctrl_gpio_range *range,
 810                                    unsigned int offset, bool input)
 811{
 812        struct gpio_chip *chip = range->gc;
 813
 814        if (input)
 815                oxnas_gpio_direction_input(chip, offset);
 816        else
 817                oxnas_gpio_direction_output(chip, offset, 0);
 818
 819        return 0;
 820}
 821
 822static const struct pinmux_ops oxnas_ox810se_pinmux_ops = {
 823        .get_functions_count = oxnas_pinmux_get_functions_count,
 824        .get_function_name = oxnas_pinmux_get_function_name,
 825        .get_function_groups = oxnas_pinmux_get_function_groups,
 826        .set_mux = oxnas_ox810se_pinmux_enable,
 827        .gpio_request_enable = oxnas_ox810se_gpio_request_enable,
 828        .gpio_set_direction = oxnas_gpio_set_direction,
 829};
 830
 831static const struct pinmux_ops oxnas_ox820_pinmux_ops = {
 832        .get_functions_count = oxnas_pinmux_get_functions_count,
 833        .get_function_name = oxnas_pinmux_get_function_name,
 834        .get_function_groups = oxnas_pinmux_get_function_groups,
 835        .set_mux = oxnas_ox820_pinmux_enable,
 836        .gpio_request_enable = oxnas_ox820_gpio_request_enable,
 837        .gpio_set_direction = oxnas_gpio_set_direction,
 838};
 839
 840static int oxnas_ox810se_pinconf_get(struct pinctrl_dev *pctldev,
 841                                     unsigned int pin, unsigned long *config)
 842{
 843        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 844        struct oxnas_gpio_bank *bank = pctl_to_bank(pctl, pin);
 845        unsigned int param = pinconf_to_config_param(*config);
 846        u32 mask = BIT(pin - bank->gpio_chip.base);
 847        int ret;
 848        u32 arg;
 849
 850        switch (param) {
 851        case PIN_CONFIG_BIAS_PULL_UP:
 852                ret = regmap_read(pctl->regmap,
 853                                  (bank->id ?
 854                                        PINMUX_810_PULLUP_CTRL1 :
 855                                        PINMUX_810_PULLUP_CTRL0),
 856                                  &arg);
 857                if (ret)
 858                        return ret;
 859
 860                arg = !!(arg & mask);
 861                break;
 862        default:
 863                return -ENOTSUPP;
 864        }
 865
 866        *config = pinconf_to_config_packed(param, arg);
 867
 868        return 0;
 869}
 870
 871static int oxnas_ox820_pinconf_get(struct pinctrl_dev *pctldev,
 872                                   unsigned int pin, unsigned long *config)
 873{
 874        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 875        struct oxnas_gpio_bank *bank = pctl_to_bank(pctl, pin);
 876        unsigned int param = pinconf_to_config_param(*config);
 877        unsigned int bank_offset = (bank->id ? PINMUX_820_BANK_OFFSET : 0);
 878        u32 mask = BIT(pin - bank->gpio_chip.base);
 879        int ret;
 880        u32 arg;
 881
 882        switch (param) {
 883        case PIN_CONFIG_BIAS_PULL_UP:
 884                ret = regmap_read(pctl->regmap,
 885                                  bank_offset + PINMUX_820_PULLUP_CTRL,
 886                                  &arg);
 887                if (ret)
 888                        return ret;
 889
 890                arg = !!(arg & mask);
 891                break;
 892        default:
 893                return -ENOTSUPP;
 894        }
 895
 896        *config = pinconf_to_config_packed(param, arg);
 897
 898        return 0;
 899}
 900
 901static int oxnas_ox810se_pinconf_set(struct pinctrl_dev *pctldev,
 902                                     unsigned int pin, unsigned long *configs,
 903                                     unsigned int num_configs)
 904{
 905        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 906        struct oxnas_gpio_bank *bank = pctl_to_bank(pctl, pin);
 907        unsigned int param;
 908        unsigned int i;
 909        u32 offset = pin - bank->gpio_chip.base;
 910        u32 mask = BIT(offset);
 911
 912        dev_dbg(pctl->dev, "setting pin %d bank %d mask 0x%x\n",
 913                pin, bank->gpio_chip.base, mask);
 914
 915        for (i = 0; i < num_configs; i++) {
 916                param = pinconf_to_config_param(configs[i]);
 917
 918                switch (param) {
 919                case PIN_CONFIG_BIAS_PULL_UP:
 920                        dev_dbg(pctl->dev, "   pullup\n");
 921                        regmap_write_bits(pctl->regmap,
 922                                          (bank->id ?
 923                                                PINMUX_810_PULLUP_CTRL1 :
 924                                                PINMUX_810_PULLUP_CTRL0),
 925                                          mask, mask);
 926                        break;
 927                default:
 928                        dev_err(pctl->dev, "Property %u not supported\n",
 929                                param);
 930                        return -ENOTSUPP;
 931                }
 932        }
 933
 934        return 0;
 935}
 936
 937static int oxnas_ox820_pinconf_set(struct pinctrl_dev *pctldev,
 938                                   unsigned int pin, unsigned long *configs,
 939                                   unsigned int num_configs)
 940{
 941        struct oxnas_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
 942        struct oxnas_gpio_bank *bank = pctl_to_bank(pctl, pin);
 943        unsigned int bank_offset = (bank->id ? PINMUX_820_BANK_OFFSET : 0);
 944        unsigned int param;
 945        unsigned int i;
 946        u32 offset = pin - bank->gpio_chip.base;
 947        u32 mask = BIT(offset);
 948
 949        dev_dbg(pctl->dev, "setting pin %d bank %d mask 0x%x\n",
 950                pin, bank->gpio_chip.base, mask);
 951
 952        for (i = 0; i < num_configs; i++) {
 953                param = pinconf_to_config_param(configs[i]);
 954
 955                switch (param) {
 956                case PIN_CONFIG_BIAS_PULL_UP:
 957                        dev_dbg(pctl->dev, "   pullup\n");
 958                        regmap_write_bits(pctl->regmap,
 959                                          bank_offset + PINMUX_820_PULLUP_CTRL,
 960                                          mask, mask);
 961                        break;
 962                default:
 963                        dev_err(pctl->dev, "Property %u not supported\n",
 964                                param);
 965                        return -ENOTSUPP;
 966                }
 967        }
 968
 969        return 0;
 970}
 971
 972static const struct pinconf_ops oxnas_ox810se_pinconf_ops = {
 973        .pin_config_get = oxnas_ox810se_pinconf_get,
 974        .pin_config_set = oxnas_ox810se_pinconf_set,
 975        .is_generic = true,
 976};
 977
 978static const struct pinconf_ops oxnas_ox820_pinconf_ops = {
 979        .pin_config_get = oxnas_ox820_pinconf_get,
 980        .pin_config_set = oxnas_ox820_pinconf_set,
 981        .is_generic = true,
 982};
 983
 984static void oxnas_gpio_irq_ack(struct irq_data *data)
 985{
 986        struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
 987        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 988        u32 mask = BIT(data->hwirq);
 989
 990        writel(mask, bank->reg_base + IRQ_PENDING);
 991}
 992
 993static void oxnas_gpio_irq_mask(struct irq_data *data)
 994{
 995        struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
 996        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
 997        unsigned int type = irqd_get_trigger_type(data);
 998        u32 mask = BIT(data->hwirq);
 999
1000        if (type & IRQ_TYPE_EDGE_RISING)
1001                writel(readl(bank->reg_base + RE_IRQ_ENABLE) & ~mask,
1002                       bank->reg_base + RE_IRQ_ENABLE);
1003
1004        if (type & IRQ_TYPE_EDGE_FALLING)
1005                writel(readl(bank->reg_base + FE_IRQ_ENABLE) & ~mask,
1006                       bank->reg_base + FE_IRQ_ENABLE);
1007}
1008
1009static void oxnas_gpio_irq_unmask(struct irq_data *data)
1010{
1011        struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
1012        struct oxnas_gpio_bank *bank = gpiochip_get_data(chip);
1013        unsigned int type = irqd_get_trigger_type(data);
1014        u32 mask = BIT(data->hwirq);
1015
1016        if (type & IRQ_TYPE_EDGE_RISING)
1017                writel(readl(bank->reg_base + RE_IRQ_ENABLE) | mask,
1018                       bank->reg_base + RE_IRQ_ENABLE);
1019
1020        if (type & IRQ_TYPE_EDGE_FALLING)
1021                writel(readl(bank->reg_base + FE_IRQ_ENABLE) | mask,
1022                       bank->reg_base + FE_IRQ_ENABLE);
1023}
1024
1025static unsigned int oxnas_gpio_irq_startup(struct irq_data *data)
1026{
1027        struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
1028
1029        oxnas_gpio_direction_input(chip, data->hwirq);
1030        oxnas_gpio_irq_unmask(data);
1031
1032        return 0;
1033}
1034
1035static int oxnas_gpio_irq_set_type(struct irq_data *data, unsigned int type)
1036{
1037        if ((type & (IRQ_TYPE_EDGE_RISING|IRQ_TYPE_EDGE_FALLING)) == 0)
1038                return -EINVAL;
1039
1040        irq_set_handler_locked(data, handle_edge_irq);
1041
1042        return 0;
1043}
1044
1045static void oxnas_gpio_irq_handler(struct irq_desc *desc)
1046{
1047        struct gpio_chip *gc = irq_desc_get_handler_data(desc);
1048        struct oxnas_gpio_bank *bank = gpiochip_get_data(gc);
1049        struct irq_chip *chip = irq_desc_get_chip(desc);
1050        unsigned long stat;
1051        unsigned int pin;
1052
1053        chained_irq_enter(chip, desc);
1054
1055        stat = readl(bank->reg_base + IRQ_PENDING);
1056
1057        for_each_set_bit(pin, &stat, BITS_PER_LONG)
1058                generic_handle_domain_irq(gc->irq.domain, pin);
1059
1060        chained_irq_exit(chip, desc);
1061}
1062
1063#define GPIO_BANK(_bank)                                                \
1064        {                                                               \
1065                .gpio_chip = {                                          \
1066                        .label = "GPIO" #_bank,                         \
1067                        .request = gpiochip_generic_request,            \
1068                        .free = gpiochip_generic_free,                  \
1069                        .get_direction = oxnas_gpio_get_direction,      \
1070                        .direction_input = oxnas_gpio_direction_input,  \
1071                        .direction_output = oxnas_gpio_direction_output, \
1072                        .get = oxnas_gpio_get,                          \
1073                        .set = oxnas_gpio_set,                          \
1074                        .ngpio = PINS_PER_BANK,                         \
1075                        .base = GPIO_BANK_START(_bank),                 \
1076                        .owner = THIS_MODULE,                           \
1077                        .can_sleep = 0,                                 \
1078                },                                                      \
1079                .irq_chip = {                                           \
1080                        .name = "GPIO" #_bank,                          \
1081                        .irq_startup = oxnas_gpio_irq_startup,  \
1082                        .irq_ack = oxnas_gpio_irq_ack,          \
1083                        .irq_mask = oxnas_gpio_irq_mask,                \
1084                        .irq_unmask = oxnas_gpio_irq_unmask,            \
1085                        .irq_set_type = oxnas_gpio_irq_set_type,        \
1086                },                                                      \
1087        }
1088
1089static struct oxnas_gpio_bank oxnas_gpio_banks[] = {
1090        GPIO_BANK(0),
1091        GPIO_BANK(1),
1092};
1093
1094static struct oxnas_pinctrl ox810se_pinctrl = {
1095        .functions = oxnas_ox810se_functions,
1096        .nfunctions = ARRAY_SIZE(oxnas_ox810se_functions),
1097        .groups = oxnas_ox810se_groups,
1098        .ngroups = ARRAY_SIZE(oxnas_ox810se_groups),
1099        .gpio_banks = oxnas_gpio_banks,
1100        .nbanks = ARRAY_SIZE(oxnas_gpio_banks),
1101};
1102
1103static struct pinctrl_desc oxnas_ox810se_pinctrl_desc = {
1104        .name = "oxnas-pinctrl",
1105        .pins = oxnas_ox810se_pins,
1106        .npins = ARRAY_SIZE(oxnas_ox810se_pins),
1107        .pctlops = &oxnas_pinctrl_ops,
1108        .pmxops = &oxnas_ox810se_pinmux_ops,
1109        .confops = &oxnas_ox810se_pinconf_ops,
1110        .owner = THIS_MODULE,
1111};
1112
1113static struct oxnas_pinctrl ox820_pinctrl = {
1114        .functions = oxnas_ox820_functions,
1115        .nfunctions = ARRAY_SIZE(oxnas_ox820_functions),
1116        .groups = oxnas_ox820_groups,
1117        .ngroups = ARRAY_SIZE(oxnas_ox820_groups),
1118        .gpio_banks = oxnas_gpio_banks,
1119        .nbanks = ARRAY_SIZE(oxnas_gpio_banks),
1120};
1121
1122static struct pinctrl_desc oxnas_ox820_pinctrl_desc = {
1123        .name = "oxnas-pinctrl",
1124        .pins = oxnas_ox820_pins,
1125        .npins = ARRAY_SIZE(oxnas_ox820_pins),
1126        .pctlops = &oxnas_pinctrl_ops,
1127        .pmxops = &oxnas_ox820_pinmux_ops,
1128        .confops = &oxnas_ox820_pinconf_ops,
1129        .owner = THIS_MODULE,
1130};
1131
1132static struct oxnas_pinctrl_data oxnas_ox810se_pinctrl_data = {
1133        .desc = &oxnas_ox810se_pinctrl_desc,
1134        .pctl = &ox810se_pinctrl,
1135};
1136
1137static struct oxnas_pinctrl_data oxnas_ox820_pinctrl_data = {
1138        .desc = &oxnas_ox820_pinctrl_desc,
1139        .pctl = &ox820_pinctrl,
1140};
1141
1142static const struct of_device_id oxnas_pinctrl_of_match[] = {
1143        { .compatible = "oxsemi,ox810se-pinctrl",
1144          .data = &oxnas_ox810se_pinctrl_data
1145        },
1146        { .compatible = "oxsemi,ox820-pinctrl",
1147          .data = &oxnas_ox820_pinctrl_data,
1148        },
1149        { },
1150};
1151
1152static int oxnas_pinctrl_probe(struct platform_device *pdev)
1153{
1154        const struct of_device_id *id;
1155        const struct oxnas_pinctrl_data *data;
1156        struct oxnas_pinctrl *pctl;
1157
1158        id = of_match_node(oxnas_pinctrl_of_match, pdev->dev.of_node);
1159        if (!id)
1160                return -ENODEV;
1161
1162        data = id->data;
1163        if (!data || !data->pctl || !data->desc)
1164                return -EINVAL;
1165
1166        pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL);
1167        if (!pctl)
1168                return -ENOMEM;
1169        pctl->dev = &pdev->dev;
1170        dev_set_drvdata(&pdev->dev, pctl);
1171
1172        pctl->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1173                                                       "oxsemi,sys-ctrl");
1174        if (IS_ERR(pctl->regmap)) {
1175                dev_err(&pdev->dev, "failed to get sys ctrl regmap\n");
1176                return -ENODEV;
1177        }
1178
1179        pctl->functions = data->pctl->functions;
1180        pctl->nfunctions = data->pctl->nfunctions;
1181        pctl->groups = data->pctl->groups;
1182        pctl->ngroups = data->pctl->ngroups;
1183        pctl->gpio_banks = data->pctl->gpio_banks;
1184        pctl->nbanks = data->pctl->nbanks;
1185
1186        pctl->pctldev = pinctrl_register(data->desc, &pdev->dev, pctl);
1187        if (IS_ERR(pctl->pctldev)) {
1188                dev_err(&pdev->dev, "Failed to register pinctrl device\n");
1189                return PTR_ERR(pctl->pctldev);
1190        }
1191
1192        return 0;
1193}
1194
1195static int oxnas_gpio_probe(struct platform_device *pdev)
1196{
1197        struct device_node *np = pdev->dev.of_node;
1198        struct of_phandle_args pinspec;
1199        struct oxnas_gpio_bank *bank;
1200        unsigned int id, ngpios;
1201        int irq, ret;
1202        struct gpio_irq_chip *girq;
1203
1204        if (of_parse_phandle_with_fixed_args(np, "gpio-ranges",
1205                                             3, 0, &pinspec)) {
1206                dev_err(&pdev->dev, "gpio-ranges property not found\n");
1207                return -EINVAL;
1208        }
1209
1210        id = pinspec.args[1] / PINS_PER_BANK;
1211        ngpios = pinspec.args[2];
1212
1213        if (id >= ARRAY_SIZE(oxnas_gpio_banks)) {
1214                dev_err(&pdev->dev, "invalid gpio-ranges base arg\n");
1215                return -EINVAL;
1216        }
1217
1218        if (ngpios > PINS_PER_BANK) {
1219                dev_err(&pdev->dev, "invalid gpio-ranges count arg\n");
1220                return -EINVAL;
1221        }
1222
1223        bank = &oxnas_gpio_banks[id];
1224
1225        bank->reg_base = devm_platform_ioremap_resource(pdev, 0);
1226        if (IS_ERR(bank->reg_base))
1227                return PTR_ERR(bank->reg_base);
1228
1229        irq = platform_get_irq(pdev, 0);
1230        if (irq < 0)
1231                return irq;
1232
1233        bank->id = id;
1234        bank->gpio_chip.parent = &pdev->dev;
1235        bank->gpio_chip.of_node = np;
1236        bank->gpio_chip.ngpio = ngpios;
1237        girq = &bank->gpio_chip.irq;
1238        girq->chip = &bank->irq_chip;
1239        girq->parent_handler = oxnas_gpio_irq_handler;
1240        girq->num_parents = 1;
1241        girq->parents = devm_kcalloc(&pdev->dev, 1, sizeof(*girq->parents),
1242                                     GFP_KERNEL);
1243        if (!girq->parents)
1244                return -ENOMEM;
1245        girq->parents[0] = irq;
1246        girq->default_type = IRQ_TYPE_NONE;
1247        girq->handler = handle_level_irq;
1248
1249        ret = gpiochip_add_data(&bank->gpio_chip, bank);
1250        if (ret < 0) {
1251                dev_err(&pdev->dev, "Failed to add GPIO chip %u: %d\n",
1252                        id, ret);
1253                return ret;
1254        }
1255
1256        return 0;
1257}
1258
1259static struct platform_driver oxnas_pinctrl_driver = {
1260        .driver = {
1261                .name = "oxnas-pinctrl",
1262                .of_match_table = oxnas_pinctrl_of_match,
1263                .suppress_bind_attrs = true,
1264        },
1265        .probe = oxnas_pinctrl_probe,
1266};
1267
1268static const struct of_device_id oxnas_gpio_of_match[] = {
1269        { .compatible = "oxsemi,ox810se-gpio", },
1270        { .compatible = "oxsemi,ox820-gpio", },
1271        { },
1272};
1273
1274static struct platform_driver oxnas_gpio_driver = {
1275        .driver = {
1276                .name = "oxnas-gpio",
1277                .of_match_table = oxnas_gpio_of_match,
1278                .suppress_bind_attrs = true,
1279        },
1280        .probe = oxnas_gpio_probe,
1281};
1282
1283static int __init oxnas_gpio_register(void)
1284{
1285        return platform_driver_register(&oxnas_gpio_driver);
1286}
1287arch_initcall(oxnas_gpio_register);
1288
1289static int __init oxnas_pinctrl_register(void)
1290{
1291        return platform_driver_register(&oxnas_pinctrl_driver);
1292}
1293arch_initcall(oxnas_pinctrl_register);
1294