root/drivers/pinctrl/qcom/pinctrl-ssbi-mpp.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pm8xxx_mpp_update
  2. pm8xxx_get_groups_count
  3. pm8xxx_get_group_name
  4. pm8xxx_get_group_pins
  5. pm8xxx_get_functions_count
  6. pm8xxx_get_function_name
  7. pm8xxx_get_function_groups
  8. pm8xxx_pinmux_set_mux
  9. pm8xxx_pin_config_get
  10. pm8xxx_pin_config_set
  11. pm8xxx_mpp_direction_input
  12. pm8xxx_mpp_direction_output
  13. pm8xxx_mpp_get
  14. pm8xxx_mpp_set
  15. pm8xxx_mpp_of_xlate
  16. pm8xxx_mpp_to_irq
  17. pm8xxx_mpp_dbg_show_one
  18. pm8xxx_mpp_dbg_show
  19. pm8xxx_pin_populate
  20. pm8xxx_mpp_probe
  21. pm8xxx_mpp_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (c) 2015, Sony Mobile Communications AB.
   4  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
   5  */
   6 
   7 #include <linux/module.h>
   8 #include <linux/platform_device.h>
   9 #include <linux/pinctrl/pinctrl.h>
  10 #include <linux/pinctrl/pinmux.h>
  11 #include <linux/pinctrl/pinconf.h>
  12 #include <linux/pinctrl/pinconf-generic.h>
  13 #include <linux/slab.h>
  14 #include <linux/regmap.h>
  15 #include <linux/gpio/driver.h>
  16 #include <linux/interrupt.h>
  17 #include <linux/of_device.h>
  18 #include <linux/of_irq.h>
  19 
  20 #include <dt-bindings/pinctrl/qcom,pmic-mpp.h>
  21 
  22 #include "../core.h"
  23 #include "../pinctrl-utils.h"
  24 
  25 /* MPP registers */
  26 #define SSBI_REG_ADDR_MPP_BASE          0x50
  27 #define SSBI_REG_ADDR_MPP(n)            (SSBI_REG_ADDR_MPP_BASE + n)
  28 
  29 /* MPP Type: type */
  30 #define PM8XXX_MPP_TYPE_D_INPUT         0
  31 #define PM8XXX_MPP_TYPE_D_OUTPUT        1
  32 #define PM8XXX_MPP_TYPE_D_BI_DIR        2
  33 #define PM8XXX_MPP_TYPE_A_INPUT         3
  34 #define PM8XXX_MPP_TYPE_A_OUTPUT        4
  35 #define PM8XXX_MPP_TYPE_SINK            5
  36 #define PM8XXX_MPP_TYPE_DTEST_SINK      6
  37 #define PM8XXX_MPP_TYPE_DTEST_OUTPUT    7
  38 
  39 /* Digital Input: control */
  40 #define PM8XXX_MPP_DIN_TO_INT           0
  41 #define PM8XXX_MPP_DIN_TO_DBUS1         1
  42 #define PM8XXX_MPP_DIN_TO_DBUS2         2
  43 #define PM8XXX_MPP_DIN_TO_DBUS3         3
  44 
  45 /* Digital Output: control */
  46 #define PM8XXX_MPP_DOUT_CTRL_LOW        0
  47 #define PM8XXX_MPP_DOUT_CTRL_HIGH       1
  48 #define PM8XXX_MPP_DOUT_CTRL_MPP        2
  49 #define PM8XXX_MPP_DOUT_CTRL_INV_MPP    3
  50 
  51 /* Bidirectional: control */
  52 #define PM8XXX_MPP_BI_PULLUP_1KOHM      0
  53 #define PM8XXX_MPP_BI_PULLUP_OPEN       1
  54 #define PM8XXX_MPP_BI_PULLUP_10KOHM     2
  55 #define PM8XXX_MPP_BI_PULLUP_30KOHM     3
  56 
  57 /* Analog Output: control */
  58 #define PM8XXX_MPP_AOUT_CTRL_DISABLE            0
  59 #define PM8XXX_MPP_AOUT_CTRL_ENABLE             1
  60 #define PM8XXX_MPP_AOUT_CTRL_MPP_HIGH_EN        2
  61 #define PM8XXX_MPP_AOUT_CTRL_MPP_LOW_EN         3
  62 
  63 /* Current Sink: control */
  64 #define PM8XXX_MPP_CS_CTRL_DISABLE      0
  65 #define PM8XXX_MPP_CS_CTRL_ENABLE       1
  66 #define PM8XXX_MPP_CS_CTRL_MPP_HIGH_EN  2
  67 #define PM8XXX_MPP_CS_CTRL_MPP_LOW_EN   3
  68 
  69 /* DTEST Current Sink: control */
  70 #define PM8XXX_MPP_DTEST_CS_CTRL_EN1    0
  71 #define PM8XXX_MPP_DTEST_CS_CTRL_EN2    1
  72 #define PM8XXX_MPP_DTEST_CS_CTRL_EN3    2
  73 #define PM8XXX_MPP_DTEST_CS_CTRL_EN4    3
  74 
  75 /* DTEST Digital Output: control */
  76 #define PM8XXX_MPP_DTEST_DBUS1          0
  77 #define PM8XXX_MPP_DTEST_DBUS2          1
  78 #define PM8XXX_MPP_DTEST_DBUS3          2
  79 #define PM8XXX_MPP_DTEST_DBUS4          3
  80 
  81 /* custom pinconf parameters */
  82 #define PM8XXX_CONFIG_AMUX              (PIN_CONFIG_END + 1)
  83 #define PM8XXX_CONFIG_DTEST_SELECTOR    (PIN_CONFIG_END + 2)
  84 #define PM8XXX_CONFIG_ALEVEL            (PIN_CONFIG_END + 3)
  85 #define PM8XXX_CONFIG_PAIRED            (PIN_CONFIG_END + 4)
  86 
  87 /**
  88  * struct pm8xxx_pin_data - dynamic configuration for a pin
  89  * @reg:                address of the control register
  90  * @irq:                IRQ from the PMIC interrupt controller
  91  * @mode:               operating mode for the pin (digital, analog or current sink)
  92  * @input:              pin is input
  93  * @output:             pin is output
  94  * @high_z:             pin is floating
  95  * @paired:             mpp operates in paired mode
  96  * @output_value:       logical output value of the mpp
  97  * @power_source:       selected power source
  98  * @dtest:              DTEST route selector
  99  * @amux:               input muxing in analog mode
 100  * @aout_level:         selector of the output in analog mode
 101  * @drive_strength:     drive strength of the current sink
 102  * @pullup:             pull up value, when in digital bidirectional mode
 103  */
 104 struct pm8xxx_pin_data {
 105         unsigned reg;
 106         int irq;
 107 
 108         u8 mode;
 109 
 110         bool input;
 111         bool output;
 112         bool high_z;
 113         bool paired;
 114         bool output_value;
 115 
 116         u8 power_source;
 117         u8 dtest;
 118         u8 amux;
 119         u8 aout_level;
 120         u8 drive_strength;
 121         unsigned pullup;
 122 };
 123 
 124 struct pm8xxx_mpp {
 125         struct device *dev;
 126         struct regmap *regmap;
 127         struct pinctrl_dev *pctrl;
 128         struct gpio_chip chip;
 129 
 130         struct pinctrl_desc desc;
 131         unsigned npins;
 132 };
 133 
 134 static const struct pinconf_generic_params pm8xxx_mpp_bindings[] = {
 135         {"qcom,amux-route",     PM8XXX_CONFIG_AMUX,             0},
 136         {"qcom,analog-level",   PM8XXX_CONFIG_ALEVEL,           0},
 137         {"qcom,dtest",          PM8XXX_CONFIG_DTEST_SELECTOR,   0},
 138         {"qcom,paired",         PM8XXX_CONFIG_PAIRED,           0},
 139 };
 140 
 141 #ifdef CONFIG_DEBUG_FS
 142 static const struct pin_config_item pm8xxx_conf_items[] = {
 143         PCONFDUMP(PM8XXX_CONFIG_AMUX, "analog mux", NULL, true),
 144         PCONFDUMP(PM8XXX_CONFIG_ALEVEL, "analog level", NULL, true),
 145         PCONFDUMP(PM8XXX_CONFIG_DTEST_SELECTOR, "dtest", NULL, true),
 146         PCONFDUMP(PM8XXX_CONFIG_PAIRED, "paired", NULL, false),
 147 };
 148 #endif
 149 
 150 #define PM8XXX_MAX_MPPS 12
 151 static const char * const pm8xxx_groups[PM8XXX_MAX_MPPS] = {
 152         "mpp1", "mpp2", "mpp3", "mpp4", "mpp5", "mpp6", "mpp7", "mpp8",
 153         "mpp9", "mpp10", "mpp11", "mpp12",
 154 };
 155 
 156 #define PM8XXX_MPP_DIGITAL      0
 157 #define PM8XXX_MPP_ANALOG       1
 158 #define PM8XXX_MPP_SINK         2
 159 
 160 static const char * const pm8xxx_mpp_functions[] = {
 161         "digital", "analog", "sink",
 162 };
 163 
 164 static int pm8xxx_mpp_update(struct pm8xxx_mpp *pctrl,
 165                              struct pm8xxx_pin_data *pin)
 166 {
 167         unsigned level;
 168         unsigned ctrl;
 169         unsigned type;
 170         int ret;
 171         u8 val;
 172 
 173         switch (pin->mode) {
 174         case PM8XXX_MPP_DIGITAL:
 175                 if (pin->dtest) {
 176                         type = PM8XXX_MPP_TYPE_DTEST_OUTPUT;
 177                         ctrl = pin->dtest - 1;
 178                 } else if (pin->input && pin->output) {
 179                         type = PM8XXX_MPP_TYPE_D_BI_DIR;
 180                         if (pin->high_z)
 181                                 ctrl = PM8XXX_MPP_BI_PULLUP_OPEN;
 182                         else if (pin->pullup == 600)
 183                                 ctrl = PM8XXX_MPP_BI_PULLUP_1KOHM;
 184                         else if (pin->pullup == 10000)
 185                                 ctrl = PM8XXX_MPP_BI_PULLUP_10KOHM;
 186                         else
 187                                 ctrl = PM8XXX_MPP_BI_PULLUP_30KOHM;
 188                 } else if (pin->input) {
 189                         type = PM8XXX_MPP_TYPE_D_INPUT;
 190                         if (pin->dtest)
 191                                 ctrl = pin->dtest;
 192                         else
 193                                 ctrl = PM8XXX_MPP_DIN_TO_INT;
 194                 } else {
 195                         type = PM8XXX_MPP_TYPE_D_OUTPUT;
 196                         ctrl = !!pin->output_value;
 197                         if (pin->paired)
 198                                 ctrl |= BIT(1);
 199                 }
 200 
 201                 level = pin->power_source;
 202                 break;
 203         case PM8XXX_MPP_ANALOG:
 204                 if (pin->output) {
 205                         type = PM8XXX_MPP_TYPE_A_OUTPUT;
 206                         level = pin->aout_level;
 207                         ctrl = pin->output_value;
 208                         if (pin->paired)
 209                                 ctrl |= BIT(1);
 210                 } else {
 211                         type = PM8XXX_MPP_TYPE_A_INPUT;
 212                         level = pin->amux;
 213                         ctrl = 0;
 214                 }
 215                 break;
 216         case PM8XXX_MPP_SINK:
 217                 level = (pin->drive_strength / 5) - 1;
 218                 if (pin->dtest) {
 219                         type = PM8XXX_MPP_TYPE_DTEST_SINK;
 220                         ctrl = pin->dtest - 1;
 221                 } else {
 222                         type = PM8XXX_MPP_TYPE_SINK;
 223                         ctrl = pin->output_value;
 224                         if (pin->paired)
 225                                 ctrl |= BIT(1);
 226                 }
 227                 break;
 228         default:
 229                 return -EINVAL;
 230         }
 231 
 232         val = type << 5 | level << 2 | ctrl;
 233         ret = regmap_write(pctrl->regmap, pin->reg, val);
 234         if (ret)
 235                 dev_err(pctrl->dev, "failed to write register\n");
 236 
 237         return ret;
 238 }
 239 
 240 static int pm8xxx_get_groups_count(struct pinctrl_dev *pctldev)
 241 {
 242         struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
 243 
 244         return pctrl->npins;
 245 }
 246 
 247 static const char *pm8xxx_get_group_name(struct pinctrl_dev *pctldev,
 248                                          unsigned group)
 249 {
 250         return pm8xxx_groups[group];
 251 }
 252 
 253 
 254 static int pm8xxx_get_group_pins(struct pinctrl_dev *pctldev,
 255                                  unsigned group,
 256                                  const unsigned **pins,
 257                                  unsigned *num_pins)
 258 {
 259         struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
 260 
 261         *pins = &pctrl->desc.pins[group].number;
 262         *num_pins = 1;
 263 
 264         return 0;
 265 }
 266 
 267 static const struct pinctrl_ops pm8xxx_pinctrl_ops = {
 268         .get_groups_count       = pm8xxx_get_groups_count,
 269         .get_group_name         = pm8xxx_get_group_name,
 270         .get_group_pins         = pm8xxx_get_group_pins,
 271         .dt_node_to_map         = pinconf_generic_dt_node_to_map_group,
 272         .dt_free_map            = pinctrl_utils_free_map,
 273 };
 274 
 275 static int pm8xxx_get_functions_count(struct pinctrl_dev *pctldev)
 276 {
 277         return ARRAY_SIZE(pm8xxx_mpp_functions);
 278 }
 279 
 280 static const char *pm8xxx_get_function_name(struct pinctrl_dev *pctldev,
 281                                             unsigned function)
 282 {
 283         return pm8xxx_mpp_functions[function];
 284 }
 285 
 286 static int pm8xxx_get_function_groups(struct pinctrl_dev *pctldev,
 287                                       unsigned function,
 288                                       const char * const **groups,
 289                                       unsigned * const num_groups)
 290 {
 291         struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
 292 
 293         *groups = pm8xxx_groups;
 294         *num_groups = pctrl->npins;
 295         return 0;
 296 }
 297 
 298 static int pm8xxx_pinmux_set_mux(struct pinctrl_dev *pctldev,
 299                                  unsigned function,
 300                                  unsigned group)
 301 {
 302         struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
 303         struct pm8xxx_pin_data *pin = pctrl->desc.pins[group].drv_data;
 304 
 305         pin->mode = function;
 306         pm8xxx_mpp_update(pctrl, pin);
 307 
 308         return 0;
 309 }
 310 
 311 static const struct pinmux_ops pm8xxx_pinmux_ops = {
 312         .get_functions_count    = pm8xxx_get_functions_count,
 313         .get_function_name      = pm8xxx_get_function_name,
 314         .get_function_groups    = pm8xxx_get_function_groups,
 315         .set_mux                = pm8xxx_pinmux_set_mux,
 316 };
 317 
 318 static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
 319                                  unsigned int offset,
 320                                  unsigned long *config)
 321 {
 322         struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
 323         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 324         unsigned param = pinconf_to_config_param(*config);
 325         unsigned arg;
 326 
 327         switch (param) {
 328         case PIN_CONFIG_BIAS_PULL_UP:
 329                 arg = pin->pullup;
 330                 break;
 331         case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
 332                 arg = pin->high_z;
 333                 break;
 334         case PIN_CONFIG_INPUT_ENABLE:
 335                 arg = pin->input;
 336                 break;
 337         case PIN_CONFIG_OUTPUT:
 338                 arg = pin->output_value;
 339                 break;
 340         case PIN_CONFIG_POWER_SOURCE:
 341                 arg = pin->power_source;
 342                 break;
 343         case PIN_CONFIG_DRIVE_STRENGTH:
 344                 arg = pin->drive_strength;
 345                 break;
 346         case PM8XXX_CONFIG_DTEST_SELECTOR:
 347                 arg = pin->dtest;
 348                 break;
 349         case PM8XXX_CONFIG_AMUX:
 350                 arg = pin->amux;
 351                 break;
 352         case PM8XXX_CONFIG_ALEVEL:
 353                 arg = pin->aout_level;
 354                 break;
 355         case PM8XXX_CONFIG_PAIRED:
 356                 arg = pin->paired;
 357                 break;
 358         default:
 359                 return -EINVAL;
 360         }
 361 
 362         *config = pinconf_to_config_packed(param, arg);
 363 
 364         return 0;
 365 }
 366 
 367 static int pm8xxx_pin_config_set(struct pinctrl_dev *pctldev,
 368                                  unsigned int offset,
 369                                  unsigned long *configs,
 370                                  unsigned num_configs)
 371 {
 372         struct pm8xxx_mpp *pctrl = pinctrl_dev_get_drvdata(pctldev);
 373         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 374         unsigned param;
 375         unsigned arg;
 376         unsigned i;
 377 
 378         for (i = 0; i < num_configs; i++) {
 379                 param = pinconf_to_config_param(configs[i]);
 380                 arg = pinconf_to_config_argument(configs[i]);
 381 
 382                 switch (param) {
 383                 case PIN_CONFIG_BIAS_PULL_UP:
 384                         pin->pullup = arg;
 385                         break;
 386                 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
 387                         pin->high_z = true;
 388                         break;
 389                 case PIN_CONFIG_INPUT_ENABLE:
 390                         pin->input = true;
 391                         break;
 392                 case PIN_CONFIG_OUTPUT:
 393                         pin->output = true;
 394                         pin->output_value = !!arg;
 395                         break;
 396                 case PIN_CONFIG_POWER_SOURCE:
 397                         pin->power_source = arg;
 398                         break;
 399                 case PIN_CONFIG_DRIVE_STRENGTH:
 400                         pin->drive_strength = arg;
 401                         break;
 402                 case PM8XXX_CONFIG_DTEST_SELECTOR:
 403                         pin->dtest = arg;
 404                         break;
 405                 case PM8XXX_CONFIG_AMUX:
 406                         pin->amux = arg;
 407                         break;
 408                 case PM8XXX_CONFIG_ALEVEL:
 409                         pin->aout_level = arg;
 410                         break;
 411                 case PM8XXX_CONFIG_PAIRED:
 412                         pin->paired = !!arg;
 413                         break;
 414                 default:
 415                         dev_err(pctrl->dev,
 416                                 "unsupported config parameter: %x\n",
 417                                 param);
 418                         return -EINVAL;
 419                 }
 420         }
 421 
 422         pm8xxx_mpp_update(pctrl, pin);
 423 
 424         return 0;
 425 }
 426 
 427 static const struct pinconf_ops pm8xxx_pinconf_ops = {
 428         .is_generic = true,
 429         .pin_config_group_get = pm8xxx_pin_config_get,
 430         .pin_config_group_set = pm8xxx_pin_config_set,
 431 };
 432 
 433 static struct pinctrl_desc pm8xxx_pinctrl_desc = {
 434         .name = "pm8xxx_mpp",
 435         .pctlops = &pm8xxx_pinctrl_ops,
 436         .pmxops = &pm8xxx_pinmux_ops,
 437         .confops = &pm8xxx_pinconf_ops,
 438         .owner = THIS_MODULE,
 439 };
 440 
 441 static int pm8xxx_mpp_direction_input(struct gpio_chip *chip,
 442                                        unsigned offset)
 443 {
 444         struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
 445         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 446 
 447         switch (pin->mode) {
 448         case PM8XXX_MPP_DIGITAL:
 449                 pin->input = true;
 450                 break;
 451         case PM8XXX_MPP_ANALOG:
 452                 pin->input = true;
 453                 pin->output = true;
 454                 break;
 455         case PM8XXX_MPP_SINK:
 456                 return -EINVAL;
 457         }
 458 
 459         pm8xxx_mpp_update(pctrl, pin);
 460 
 461         return 0;
 462 }
 463 
 464 static int pm8xxx_mpp_direction_output(struct gpio_chip *chip,
 465                                         unsigned offset,
 466                                         int value)
 467 {
 468         struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
 469         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 470 
 471         switch (pin->mode) {
 472         case PM8XXX_MPP_DIGITAL:
 473                 pin->output = true;
 474                 break;
 475         case PM8XXX_MPP_ANALOG:
 476                 pin->input = false;
 477                 pin->output = true;
 478                 break;
 479         case PM8XXX_MPP_SINK:
 480                 pin->input = false;
 481                 pin->output = true;
 482                 break;
 483         }
 484 
 485         pm8xxx_mpp_update(pctrl, pin);
 486 
 487         return 0;
 488 }
 489 
 490 static int pm8xxx_mpp_get(struct gpio_chip *chip, unsigned offset)
 491 {
 492         struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
 493         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 494         bool state;
 495         int ret;
 496 
 497         if (!pin->input)
 498                 return !!pin->output_value;
 499 
 500         ret = irq_get_irqchip_state(pin->irq, IRQCHIP_STATE_LINE_LEVEL, &state);
 501         if (!ret)
 502                 ret = !!state;
 503 
 504         return ret;
 505 }
 506 
 507 static void pm8xxx_mpp_set(struct gpio_chip *chip, unsigned offset, int value)
 508 {
 509         struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
 510         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 511 
 512         pin->output_value = !!value;
 513 
 514         pm8xxx_mpp_update(pctrl, pin);
 515 }
 516 
 517 static int pm8xxx_mpp_of_xlate(struct gpio_chip *chip,
 518                                 const struct of_phandle_args *gpio_desc,
 519                                 u32 *flags)
 520 {
 521         if (chip->of_gpio_n_cells < 2)
 522                 return -EINVAL;
 523 
 524         if (flags)
 525                 *flags = gpio_desc->args[1];
 526 
 527         return gpio_desc->args[0] - 1;
 528 }
 529 
 530 
 531 static int pm8xxx_mpp_to_irq(struct gpio_chip *chip, unsigned offset)
 532 {
 533         struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
 534         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 535 
 536         return pin->irq;
 537 }
 538 
 539 #ifdef CONFIG_DEBUG_FS
 540 #include <linux/seq_file.h>
 541 
 542 static void pm8xxx_mpp_dbg_show_one(struct seq_file *s,
 543                                   struct pinctrl_dev *pctldev,
 544                                   struct gpio_chip *chip,
 545                                   unsigned offset,
 546                                   unsigned gpio)
 547 {
 548         struct pm8xxx_mpp *pctrl = gpiochip_get_data(chip);
 549         struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
 550 
 551         static const char * const aout_lvls[] = {
 552                 "1v25", "1v25_2", "0v625", "0v3125", "mpp", "abus1", "abus2",
 553                 "abus3"
 554         };
 555 
 556         static const char * const amuxs[] = {
 557                 "amux5", "amux6", "amux7", "amux8", "amux9", "abus1", "abus2",
 558                 "abus3",
 559         };
 560 
 561         seq_printf(s, " mpp%-2d:", offset + 1);
 562 
 563         switch (pin->mode) {
 564         case PM8XXX_MPP_DIGITAL:
 565                 seq_puts(s, " digital ");
 566                 if (pin->dtest) {
 567                         seq_printf(s, "dtest%d\n", pin->dtest);
 568                 } else if (pin->input && pin->output) {
 569                         if (pin->high_z)
 570                                 seq_puts(s, "bi-dir high-z");
 571                         else
 572                                 seq_printf(s, "bi-dir %dOhm", pin->pullup);
 573                 } else if (pin->input) {
 574                         if (pin->dtest)
 575                                 seq_printf(s, "in dtest%d", pin->dtest);
 576                         else
 577                                 seq_puts(s, "in gpio");
 578                 } else if (pin->output) {
 579                         seq_puts(s, "out ");
 580 
 581                         if (!pin->paired) {
 582                                 seq_puts(s, pin->output_value ?
 583                                          "high" : "low");
 584                         } else {
 585                                 seq_puts(s, pin->output_value ?
 586                                          "inverted" : "follow");
 587                         }
 588                 }
 589                 break;
 590         case PM8XXX_MPP_ANALOG:
 591                 seq_puts(s, " analog ");
 592                 if (pin->output) {
 593                         seq_printf(s, "out %s ", aout_lvls[pin->aout_level]);
 594                         if (!pin->paired) {
 595                                 seq_puts(s, pin->output_value ?
 596                                          "high" : "low");
 597                         } else {
 598                                 seq_puts(s, pin->output_value ?
 599                                          "inverted" : "follow");
 600                         }
 601                 } else {
 602                         seq_printf(s, "input mux %s", amuxs[pin->amux]);
 603                 }
 604                 break;
 605         case PM8XXX_MPP_SINK:
 606                 seq_printf(s, " sink %dmA ", pin->drive_strength);
 607                 if (pin->dtest) {
 608                         seq_printf(s, "dtest%d", pin->dtest);
 609                 } else {
 610                         if (!pin->paired) {
 611                                 seq_puts(s, pin->output_value ?
 612                                          "high" : "low");
 613                         } else {
 614                                 seq_puts(s, pin->output_value ?
 615                                          "inverted" : "follow");
 616                         }
 617                 }
 618                 break;
 619         }
 620 
 621 }
 622 
 623 static void pm8xxx_mpp_dbg_show(struct seq_file *s, struct gpio_chip *chip)
 624 {
 625         unsigned gpio = chip->base;
 626         unsigned i;
 627 
 628         for (i = 0; i < chip->ngpio; i++, gpio++) {
 629                 pm8xxx_mpp_dbg_show_one(s, NULL, chip, i, gpio);
 630                 seq_puts(s, "\n");
 631         }
 632 }
 633 
 634 #else
 635 #define pm8xxx_mpp_dbg_show NULL
 636 #endif
 637 
 638 static const struct gpio_chip pm8xxx_mpp_template = {
 639         .direction_input = pm8xxx_mpp_direction_input,
 640         .direction_output = pm8xxx_mpp_direction_output,
 641         .get = pm8xxx_mpp_get,
 642         .set = pm8xxx_mpp_set,
 643         .of_xlate = pm8xxx_mpp_of_xlate,
 644         .to_irq = pm8xxx_mpp_to_irq,
 645         .dbg_show = pm8xxx_mpp_dbg_show,
 646         .owner = THIS_MODULE,
 647 };
 648 
 649 static int pm8xxx_pin_populate(struct pm8xxx_mpp *pctrl,
 650                                struct pm8xxx_pin_data *pin)
 651 {
 652         unsigned int val;
 653         unsigned level;
 654         unsigned ctrl;
 655         unsigned type;
 656         int ret;
 657 
 658         ret = regmap_read(pctrl->regmap, pin->reg, &val);
 659         if (ret) {
 660                 dev_err(pctrl->dev, "failed to read register\n");
 661                 return ret;
 662         }
 663 
 664         type = (val >> 5) & 7;
 665         level = (val >> 2) & 7;
 666         ctrl = (val) & 3;
 667 
 668         switch (type) {
 669         case PM8XXX_MPP_TYPE_D_INPUT:
 670                 pin->mode = PM8XXX_MPP_DIGITAL;
 671                 pin->input = true;
 672                 pin->power_source = level;
 673                 pin->dtest = ctrl;
 674                 break;
 675         case PM8XXX_MPP_TYPE_D_OUTPUT:
 676                 pin->mode = PM8XXX_MPP_DIGITAL;
 677                 pin->output = true;
 678                 pin->power_source = level;
 679                 pin->output_value = !!(ctrl & BIT(0));
 680                 pin->paired = !!(ctrl & BIT(1));
 681                 break;
 682         case PM8XXX_MPP_TYPE_D_BI_DIR:
 683                 pin->mode = PM8XXX_MPP_DIGITAL;
 684                 pin->input = true;
 685                 pin->output = true;
 686                 pin->power_source = level;
 687                 switch (ctrl) {
 688                 case PM8XXX_MPP_BI_PULLUP_1KOHM:
 689                         pin->pullup = 600;
 690                         break;
 691                 case PM8XXX_MPP_BI_PULLUP_OPEN:
 692                         pin->high_z = true;
 693                         break;
 694                 case PM8XXX_MPP_BI_PULLUP_10KOHM:
 695                         pin->pullup = 10000;
 696                         break;
 697                 case PM8XXX_MPP_BI_PULLUP_30KOHM:
 698                         pin->pullup = 30000;
 699                         break;
 700                 }
 701                 break;
 702         case PM8XXX_MPP_TYPE_A_INPUT:
 703                 pin->mode = PM8XXX_MPP_ANALOG;
 704                 pin->input = true;
 705                 pin->amux = level;
 706                 break;
 707         case PM8XXX_MPP_TYPE_A_OUTPUT:
 708                 pin->mode = PM8XXX_MPP_ANALOG;
 709                 pin->output = true;
 710                 pin->aout_level = level;
 711                 pin->output_value = !!(ctrl & BIT(0));
 712                 pin->paired = !!(ctrl & BIT(1));
 713                 break;
 714         case PM8XXX_MPP_TYPE_SINK:
 715                 pin->mode = PM8XXX_MPP_SINK;
 716                 pin->drive_strength = 5 * (level + 1);
 717                 pin->output_value = !!(ctrl & BIT(0));
 718                 pin->paired = !!(ctrl & BIT(1));
 719                 break;
 720         case PM8XXX_MPP_TYPE_DTEST_SINK:
 721                 pin->mode = PM8XXX_MPP_SINK;
 722                 pin->dtest = ctrl + 1;
 723                 pin->drive_strength = 5 * (level + 1);
 724                 break;
 725         case PM8XXX_MPP_TYPE_DTEST_OUTPUT:
 726                 pin->mode = PM8XXX_MPP_DIGITAL;
 727                 pin->power_source = level;
 728                 if (ctrl >= 1)
 729                         pin->dtest = ctrl;
 730                 break;
 731         }
 732 
 733         return 0;
 734 }
 735 
 736 static const struct of_device_id pm8xxx_mpp_of_match[] = {
 737         { .compatible = "qcom,pm8018-mpp" },
 738         { .compatible = "qcom,pm8038-mpp" },
 739         { .compatible = "qcom,pm8058-mpp" },
 740         { .compatible = "qcom,pm8917-mpp" },
 741         { .compatible = "qcom,pm8821-mpp" },
 742         { .compatible = "qcom,pm8921-mpp" },
 743         { .compatible = "qcom,ssbi-mpp" },
 744         { },
 745 };
 746 MODULE_DEVICE_TABLE(of, pm8xxx_mpp_of_match);
 747 
 748 static int pm8xxx_mpp_probe(struct platform_device *pdev)
 749 {
 750         struct pm8xxx_pin_data *pin_data;
 751         struct pinctrl_pin_desc *pins;
 752         struct pm8xxx_mpp *pctrl;
 753         int ret;
 754         int i, npins;
 755 
 756         pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
 757         if (!pctrl)
 758                 return -ENOMEM;
 759 
 760         pctrl->dev = &pdev->dev;
 761         npins = platform_irq_count(pdev);
 762         if (!npins)
 763                 return -EINVAL;
 764         if (npins < 0)
 765                 return npins;
 766         pctrl->npins = npins;
 767 
 768         pctrl->regmap = dev_get_regmap(pdev->dev.parent, NULL);
 769         if (!pctrl->regmap) {
 770                 dev_err(&pdev->dev, "parent regmap unavailable\n");
 771                 return -ENXIO;
 772         }
 773 
 774         pctrl->desc = pm8xxx_pinctrl_desc;
 775         pctrl->desc.npins = pctrl->npins;
 776 
 777         pins = devm_kcalloc(&pdev->dev,
 778                             pctrl->desc.npins,
 779                             sizeof(struct pinctrl_pin_desc),
 780                             GFP_KERNEL);
 781         if (!pins)
 782                 return -ENOMEM;
 783 
 784         pin_data = devm_kcalloc(&pdev->dev,
 785                                 pctrl->desc.npins,
 786                                 sizeof(struct pm8xxx_pin_data),
 787                                 GFP_KERNEL);
 788         if (!pin_data)
 789                 return -ENOMEM;
 790 
 791         for (i = 0; i < pctrl->desc.npins; i++) {
 792                 pin_data[i].reg = SSBI_REG_ADDR_MPP(i);
 793                 pin_data[i].irq = platform_get_irq(pdev, i);
 794                 if (pin_data[i].irq < 0)
 795                         return pin_data[i].irq;
 796 
 797                 ret = pm8xxx_pin_populate(pctrl, &pin_data[i]);
 798                 if (ret)
 799                         return ret;
 800 
 801                 pins[i].number = i;
 802                 pins[i].name = pm8xxx_groups[i];
 803                 pins[i].drv_data = &pin_data[i];
 804         }
 805         pctrl->desc.pins = pins;
 806 
 807         pctrl->desc.num_custom_params = ARRAY_SIZE(pm8xxx_mpp_bindings);
 808         pctrl->desc.custom_params = pm8xxx_mpp_bindings;
 809 #ifdef CONFIG_DEBUG_FS
 810         pctrl->desc.custom_conf_items = pm8xxx_conf_items;
 811 #endif
 812 
 813         pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &pctrl->desc, pctrl);
 814         if (IS_ERR(pctrl->pctrl)) {
 815                 dev_err(&pdev->dev, "couldn't register pm8xxx mpp driver\n");
 816                 return PTR_ERR(pctrl->pctrl);
 817         }
 818 
 819         pctrl->chip = pm8xxx_mpp_template;
 820         pctrl->chip.base = -1;
 821         pctrl->chip.parent = &pdev->dev;
 822         pctrl->chip.of_node = pdev->dev.of_node;
 823         pctrl->chip.of_gpio_n_cells = 2;
 824         pctrl->chip.label = dev_name(pctrl->dev);
 825         pctrl->chip.ngpio = pctrl->npins;
 826         ret = gpiochip_add_data(&pctrl->chip, pctrl);
 827         if (ret) {
 828                 dev_err(&pdev->dev, "failed register gpiochip\n");
 829                 return ret;
 830         }
 831 
 832         ret = gpiochip_add_pin_range(&pctrl->chip,
 833                                      dev_name(pctrl->dev),
 834                                      0, 0, pctrl->chip.ngpio);
 835         if (ret) {
 836                 dev_err(pctrl->dev, "failed to add pin range\n");
 837                 goto unregister_gpiochip;
 838         }
 839 
 840         platform_set_drvdata(pdev, pctrl);
 841 
 842         dev_dbg(&pdev->dev, "Qualcomm pm8xxx mpp driver probed\n");
 843 
 844         return 0;
 845 
 846 unregister_gpiochip:
 847         gpiochip_remove(&pctrl->chip);
 848 
 849         return ret;
 850 }
 851 
 852 static int pm8xxx_mpp_remove(struct platform_device *pdev)
 853 {
 854         struct pm8xxx_mpp *pctrl = platform_get_drvdata(pdev);
 855 
 856         gpiochip_remove(&pctrl->chip);
 857 
 858         return 0;
 859 }
 860 
 861 static struct platform_driver pm8xxx_mpp_driver = {
 862         .driver = {
 863                 .name = "qcom-ssbi-mpp",
 864                 .of_match_table = pm8xxx_mpp_of_match,
 865         },
 866         .probe = pm8xxx_mpp_probe,
 867         .remove = pm8xxx_mpp_remove,
 868 };
 869 
 870 module_platform_driver(pm8xxx_mpp_driver);
 871 
 872 MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
 873 MODULE_DESCRIPTION("Qualcomm PM8xxx MPP driver");
 874 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */