0001
0002
0003
0004
0005
0006 #include <linux/list.h>
0007 #include <linux/mfd/syscon.h>
0008 #include <linux/of.h>
0009 #include <linux/pinctrl/pinconf.h>
0010 #include <linux/pinctrl/pinconf-generic.h>
0011 #include <linux/pinctrl/pinctrl.h>
0012 #include <linux/pinctrl/pinmux.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/regmap.h>
0015
0016 #include "../core.h"
0017 #include "../pinctrl-utils.h"
0018 #include "pinctrl-uniphier.h"
0019
0020 #define UNIPHIER_PINCTRL_PINMUX_BASE 0x1000
0021 #define UNIPHIER_PINCTRL_LOAD_PINMUX 0x1700
0022 #define UNIPHIER_PINCTRL_DRVCTRL_BASE 0x1800
0023 #define UNIPHIER_PINCTRL_DRV2CTRL_BASE 0x1900
0024 #define UNIPHIER_PINCTRL_DRV3CTRL_BASE 0x1980
0025 #define UNIPHIER_PINCTRL_PUPDCTRL_BASE 0x1a00
0026 #define UNIPHIER_PINCTRL_IECTRL_BASE 0x1d00
0027
0028 struct uniphier_pinctrl_reg_region {
0029 struct list_head node;
0030 unsigned int base;
0031 unsigned int nregs;
0032 u32 vals[];
0033 };
0034
0035 struct uniphier_pinctrl_priv {
0036 struct pinctrl_desc pctldesc;
0037 struct pinctrl_dev *pctldev;
0038 struct regmap *regmap;
0039 const struct uniphier_pinctrl_socdata *socdata;
0040 struct list_head reg_regions;
0041 };
0042
0043 static int uniphier_pctl_get_groups_count(struct pinctrl_dev *pctldev)
0044 {
0045 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0046
0047 return priv->socdata->groups_count;
0048 }
0049
0050 static const char *uniphier_pctl_get_group_name(struct pinctrl_dev *pctldev,
0051 unsigned selector)
0052 {
0053 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0054
0055 return priv->socdata->groups[selector].name;
0056 }
0057
0058 static int uniphier_pctl_get_group_pins(struct pinctrl_dev *pctldev,
0059 unsigned selector,
0060 const unsigned **pins,
0061 unsigned *num_pins)
0062 {
0063 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0064
0065 *pins = priv->socdata->groups[selector].pins;
0066 *num_pins = priv->socdata->groups[selector].num_pins;
0067
0068 return 0;
0069 }
0070
0071 #ifdef CONFIG_DEBUG_FS
0072 static void uniphier_pctl_pin_dbg_show(struct pinctrl_dev *pctldev,
0073 struct seq_file *s, unsigned offset)
0074 {
0075 const struct pin_desc *desc = pin_desc_get(pctldev, offset);
0076 const char *pull_dir, *drv_type;
0077
0078 switch (uniphier_pin_get_pull_dir(desc->drv_data)) {
0079 case UNIPHIER_PIN_PULL_UP:
0080 pull_dir = "UP";
0081 break;
0082 case UNIPHIER_PIN_PULL_DOWN:
0083 pull_dir = "DOWN";
0084 break;
0085 case UNIPHIER_PIN_PULL_UP_FIXED:
0086 pull_dir = "UP(FIXED)";
0087 break;
0088 case UNIPHIER_PIN_PULL_DOWN_FIXED:
0089 pull_dir = "DOWN(FIXED)";
0090 break;
0091 case UNIPHIER_PIN_PULL_NONE:
0092 pull_dir = "NONE";
0093 break;
0094 default:
0095 BUG();
0096 }
0097
0098 switch (uniphier_pin_get_drv_type(desc->drv_data)) {
0099 case UNIPHIER_PIN_DRV_1BIT:
0100 drv_type = "4/8(mA)";
0101 break;
0102 case UNIPHIER_PIN_DRV_2BIT:
0103 drv_type = "8/12/16/20(mA)";
0104 break;
0105 case UNIPHIER_PIN_DRV_3BIT:
0106 drv_type = "4/5/7/9/11/12/14/16(mA)";
0107 break;
0108 case UNIPHIER_PIN_DRV_FIXED4:
0109 drv_type = "4(mA)";
0110 break;
0111 case UNIPHIER_PIN_DRV_FIXED5:
0112 drv_type = "5(mA)";
0113 break;
0114 case UNIPHIER_PIN_DRV_FIXED8:
0115 drv_type = "8(mA)";
0116 break;
0117 case UNIPHIER_PIN_DRV_NONE:
0118 drv_type = "NONE";
0119 break;
0120 default:
0121 BUG();
0122 }
0123
0124 seq_printf(s, " PULL_DIR=%s DRV_TYPE=%s", pull_dir, drv_type);
0125 }
0126 #endif
0127
0128 static const struct pinctrl_ops uniphier_pctlops = {
0129 .get_groups_count = uniphier_pctl_get_groups_count,
0130 .get_group_name = uniphier_pctl_get_group_name,
0131 .get_group_pins = uniphier_pctl_get_group_pins,
0132 #ifdef CONFIG_DEBUG_FS
0133 .pin_dbg_show = uniphier_pctl_pin_dbg_show,
0134 #endif
0135 .dt_node_to_map = pinconf_generic_dt_node_to_map_all,
0136 .dt_free_map = pinctrl_utils_free_map,
0137 };
0138
0139 static const unsigned int uniphier_conf_drv_strengths_1bit[] = {4, 8};
0140 static const unsigned int uniphier_conf_drv_strengths_2bit[] = {8, 12, 16, 20};
0141 static const unsigned int uniphier_conf_drv_strengths_3bit[] = {4, 5, 7, 9, 11,
0142 12, 14, 16};
0143 static const unsigned int uniphier_conf_drv_strengths_fixed4[] = {4};
0144 static const unsigned int uniphier_conf_drv_strengths_fixed5[] = {5};
0145 static const unsigned int uniphier_conf_drv_strengths_fixed8[] = {8};
0146
0147 static int uniphier_conf_get_drvctrl_data(struct pinctrl_dev *pctldev,
0148 unsigned int pin, unsigned int *reg,
0149 unsigned int *shift,
0150 unsigned int *mask,
0151 const unsigned int **strengths)
0152 {
0153 const struct pin_desc *desc = pin_desc_get(pctldev, pin);
0154 enum uniphier_pin_drv_type type =
0155 uniphier_pin_get_drv_type(desc->drv_data);
0156 unsigned int base = 0;
0157 unsigned int stride = 0;
0158 unsigned int width = 0;
0159 unsigned int drvctrl;
0160
0161 switch (type) {
0162 case UNIPHIER_PIN_DRV_1BIT:
0163 *strengths = uniphier_conf_drv_strengths_1bit;
0164 base = UNIPHIER_PINCTRL_DRVCTRL_BASE;
0165 stride = 1;
0166 width = 1;
0167 break;
0168 case UNIPHIER_PIN_DRV_2BIT:
0169 *strengths = uniphier_conf_drv_strengths_2bit;
0170 base = UNIPHIER_PINCTRL_DRV2CTRL_BASE;
0171 stride = 2;
0172 width = 2;
0173 break;
0174 case UNIPHIER_PIN_DRV_3BIT:
0175 *strengths = uniphier_conf_drv_strengths_3bit;
0176 base = UNIPHIER_PINCTRL_DRV3CTRL_BASE;
0177 stride = 4;
0178 width = 3;
0179 break;
0180 case UNIPHIER_PIN_DRV_FIXED4:
0181 *strengths = uniphier_conf_drv_strengths_fixed4;
0182 break;
0183 case UNIPHIER_PIN_DRV_FIXED5:
0184 *strengths = uniphier_conf_drv_strengths_fixed5;
0185 break;
0186 case UNIPHIER_PIN_DRV_FIXED8:
0187 *strengths = uniphier_conf_drv_strengths_fixed8;
0188 break;
0189 default:
0190
0191 return -EINVAL;
0192 }
0193
0194 drvctrl = uniphier_pin_get_drvctrl(desc->drv_data);
0195 drvctrl *= stride;
0196
0197 *reg = base + drvctrl / 32 * 4;
0198 *shift = drvctrl % 32;
0199 *mask = (1U << width) - 1;
0200
0201 return 0;
0202 }
0203
0204 static int uniphier_conf_pin_bias_get(struct pinctrl_dev *pctldev,
0205 unsigned int pin,
0206 enum pin_config_param param)
0207 {
0208 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0209 const struct pin_desc *desc = pin_desc_get(pctldev, pin);
0210 enum uniphier_pin_pull_dir pull_dir =
0211 uniphier_pin_get_pull_dir(desc->drv_data);
0212 unsigned int pupdctrl, reg, shift, val;
0213 unsigned int expected = 1;
0214 int ret;
0215
0216 switch (param) {
0217 case PIN_CONFIG_BIAS_DISABLE:
0218 if (pull_dir == UNIPHIER_PIN_PULL_NONE)
0219 return 0;
0220 if (pull_dir == UNIPHIER_PIN_PULL_UP_FIXED ||
0221 pull_dir == UNIPHIER_PIN_PULL_DOWN_FIXED)
0222 return -EINVAL;
0223 expected = 0;
0224 break;
0225 case PIN_CONFIG_BIAS_PULL_UP:
0226 if (pull_dir == UNIPHIER_PIN_PULL_UP_FIXED)
0227 return 0;
0228 if (pull_dir != UNIPHIER_PIN_PULL_UP)
0229 return -EINVAL;
0230 break;
0231 case PIN_CONFIG_BIAS_PULL_DOWN:
0232 if (pull_dir == UNIPHIER_PIN_PULL_DOWN_FIXED)
0233 return 0;
0234 if (pull_dir != UNIPHIER_PIN_PULL_DOWN)
0235 return -EINVAL;
0236 break;
0237 default:
0238 BUG();
0239 }
0240
0241 pupdctrl = uniphier_pin_get_pupdctrl(desc->drv_data);
0242
0243 reg = UNIPHIER_PINCTRL_PUPDCTRL_BASE + pupdctrl / 32 * 4;
0244 shift = pupdctrl % 32;
0245
0246 ret = regmap_read(priv->regmap, reg, &val);
0247 if (ret)
0248 return ret;
0249
0250 val = (val >> shift) & 1;
0251
0252 return (val == expected) ? 0 : -EINVAL;
0253 }
0254
0255 static int uniphier_conf_pin_drive_get(struct pinctrl_dev *pctldev,
0256 unsigned int pin, u32 *strength)
0257 {
0258 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0259 unsigned int reg, shift, mask, val;
0260 const unsigned int *strengths;
0261 int ret;
0262
0263 ret = uniphier_conf_get_drvctrl_data(pctldev, pin, ®, &shift,
0264 &mask, &strengths);
0265 if (ret)
0266 return ret;
0267
0268 if (mask) {
0269 ret = regmap_read(priv->regmap, reg, &val);
0270 if (ret)
0271 return ret;
0272 } else {
0273 val = 0;
0274 }
0275
0276 *strength = strengths[(val >> shift) & mask];
0277
0278 return 0;
0279 }
0280
0281 static int uniphier_conf_pin_input_enable_get(struct pinctrl_dev *pctldev,
0282 unsigned int pin)
0283 {
0284 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0285 const struct pin_desc *desc = pin_desc_get(pctldev, pin);
0286 unsigned int iectrl = uniphier_pin_get_iectrl(desc->drv_data);
0287 unsigned int reg, mask, val;
0288 int ret;
0289
0290 if (iectrl == UNIPHIER_PIN_IECTRL_NONE)
0291
0292 return 0;
0293
0294 if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL)
0295 iectrl = pin;
0296
0297 reg = UNIPHIER_PINCTRL_IECTRL_BASE + iectrl / 32 * 4;
0298 mask = BIT(iectrl % 32);
0299
0300 ret = regmap_read(priv->regmap, reg, &val);
0301 if (ret)
0302 return ret;
0303
0304 return val & mask ? 0 : -EINVAL;
0305 }
0306
0307 static int uniphier_conf_pin_config_get(struct pinctrl_dev *pctldev,
0308 unsigned pin,
0309 unsigned long *configs)
0310 {
0311 enum pin_config_param param = pinconf_to_config_param(*configs);
0312 bool has_arg = false;
0313 u32 arg;
0314 int ret;
0315
0316 switch (param) {
0317 case PIN_CONFIG_BIAS_DISABLE:
0318 case PIN_CONFIG_BIAS_PULL_UP:
0319 case PIN_CONFIG_BIAS_PULL_DOWN:
0320 ret = uniphier_conf_pin_bias_get(pctldev, pin, param);
0321 break;
0322 case PIN_CONFIG_DRIVE_STRENGTH:
0323 ret = uniphier_conf_pin_drive_get(pctldev, pin, &arg);
0324 has_arg = true;
0325 break;
0326 case PIN_CONFIG_INPUT_ENABLE:
0327 ret = uniphier_conf_pin_input_enable_get(pctldev, pin);
0328 break;
0329 default:
0330
0331 ret = -EINVAL;
0332 break;
0333 }
0334
0335 if (ret == 0 && has_arg)
0336 *configs = pinconf_to_config_packed(param, arg);
0337
0338 return ret;
0339 }
0340
0341 static int uniphier_conf_pin_bias_set(struct pinctrl_dev *pctldev,
0342 unsigned int pin,
0343 enum pin_config_param param, u32 arg)
0344 {
0345 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0346 const struct pin_desc *desc = pin_desc_get(pctldev, pin);
0347 enum uniphier_pin_pull_dir pull_dir =
0348 uniphier_pin_get_pull_dir(desc->drv_data);
0349 unsigned int pupdctrl, reg, shift;
0350 unsigned int val = 1;
0351
0352 switch (param) {
0353 case PIN_CONFIG_BIAS_DISABLE:
0354 if (pull_dir == UNIPHIER_PIN_PULL_NONE)
0355 return 0;
0356 if (pull_dir == UNIPHIER_PIN_PULL_UP_FIXED ||
0357 pull_dir == UNIPHIER_PIN_PULL_DOWN_FIXED) {
0358 dev_err(pctldev->dev,
0359 "can not disable pull register for pin %s\n",
0360 desc->name);
0361 return -EINVAL;
0362 }
0363 val = 0;
0364 break;
0365 case PIN_CONFIG_BIAS_PULL_UP:
0366 if (pull_dir == UNIPHIER_PIN_PULL_UP_FIXED && arg != 0)
0367 return 0;
0368 if (pull_dir != UNIPHIER_PIN_PULL_UP) {
0369 dev_err(pctldev->dev,
0370 "pull-up is unsupported for pin %s\n",
0371 desc->name);
0372 return -EINVAL;
0373 }
0374 if (arg == 0) {
0375 dev_err(pctldev->dev, "pull-up can not be total\n");
0376 return -EINVAL;
0377 }
0378 break;
0379 case PIN_CONFIG_BIAS_PULL_DOWN:
0380 if (pull_dir == UNIPHIER_PIN_PULL_DOWN_FIXED && arg != 0)
0381 return 0;
0382 if (pull_dir != UNIPHIER_PIN_PULL_DOWN) {
0383 dev_err(pctldev->dev,
0384 "pull-down is unsupported for pin %s\n",
0385 desc->name);
0386 return -EINVAL;
0387 }
0388 if (arg == 0) {
0389 dev_err(pctldev->dev, "pull-down can not be total\n");
0390 return -EINVAL;
0391 }
0392 break;
0393 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
0394 if (pull_dir == UNIPHIER_PIN_PULL_NONE) {
0395 dev_err(pctldev->dev,
0396 "pull-up/down is unsupported for pin %s\n",
0397 desc->name);
0398 return -EINVAL;
0399 }
0400
0401 if (arg == 0)
0402 return 0;
0403 break;
0404 default:
0405 BUG();
0406 }
0407
0408 pupdctrl = uniphier_pin_get_pupdctrl(desc->drv_data);
0409
0410 reg = UNIPHIER_PINCTRL_PUPDCTRL_BASE + pupdctrl / 32 * 4;
0411 shift = pupdctrl % 32;
0412
0413 return regmap_update_bits(priv->regmap, reg, 1 << shift, val << shift);
0414 }
0415
0416 static int uniphier_conf_pin_drive_set(struct pinctrl_dev *pctldev,
0417 unsigned int pin, u32 strength)
0418 {
0419 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0420 const struct pin_desc *desc = pin_desc_get(pctldev, pin);
0421 unsigned int reg, shift, mask, val;
0422 const unsigned int *strengths;
0423 int ret;
0424
0425 ret = uniphier_conf_get_drvctrl_data(pctldev, pin, ®, &shift,
0426 &mask, &strengths);
0427 if (ret) {
0428 dev_err(pctldev->dev, "cannot set drive strength for pin %s\n",
0429 desc->name);
0430 return ret;
0431 }
0432
0433 for (val = 0; val <= mask; val++) {
0434 if (strengths[val] > strength)
0435 break;
0436 }
0437
0438 if (val == 0) {
0439 dev_err(pctldev->dev,
0440 "unsupported drive strength %u mA for pin %s\n",
0441 strength, desc->name);
0442 return -EINVAL;
0443 }
0444
0445 if (!mask)
0446 return 0;
0447
0448 val--;
0449
0450 return regmap_update_bits(priv->regmap, reg,
0451 mask << shift, val << shift);
0452 }
0453
0454 static int uniphier_conf_pin_input_enable(struct pinctrl_dev *pctldev,
0455 unsigned int pin, u32 enable)
0456 {
0457 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0458 const struct pin_desc *desc = pin_desc_get(pctldev, pin);
0459 unsigned int iectrl = uniphier_pin_get_iectrl(desc->drv_data);
0460 unsigned int reg, mask;
0461
0462
0463
0464
0465
0466 if (!(priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL) &&
0467 !enable)
0468 return -EINVAL;
0469
0470
0471 if (iectrl == UNIPHIER_PIN_IECTRL_NONE)
0472 return enable ? 0 : -EINVAL;
0473
0474 if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL)
0475 iectrl = pin;
0476
0477 reg = UNIPHIER_PINCTRL_IECTRL_BASE + iectrl / 32 * 4;
0478 mask = BIT(iectrl % 32);
0479
0480 return regmap_update_bits(priv->regmap, reg, mask, enable ? mask : 0);
0481 }
0482
0483 static int uniphier_conf_pin_config_set(struct pinctrl_dev *pctldev,
0484 unsigned pin,
0485 unsigned long *configs,
0486 unsigned num_configs)
0487 {
0488 int i, ret;
0489
0490 for (i = 0; i < num_configs; i++) {
0491 enum pin_config_param param =
0492 pinconf_to_config_param(configs[i]);
0493 u32 arg = pinconf_to_config_argument(configs[i]);
0494
0495 switch (param) {
0496 case PIN_CONFIG_BIAS_DISABLE:
0497 case PIN_CONFIG_BIAS_PULL_UP:
0498 case PIN_CONFIG_BIAS_PULL_DOWN:
0499 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
0500 ret = uniphier_conf_pin_bias_set(pctldev, pin,
0501 param, arg);
0502 break;
0503 case PIN_CONFIG_DRIVE_STRENGTH:
0504 ret = uniphier_conf_pin_drive_set(pctldev, pin, arg);
0505 break;
0506 case PIN_CONFIG_INPUT_ENABLE:
0507 ret = uniphier_conf_pin_input_enable(pctldev, pin, arg);
0508 break;
0509 default:
0510 dev_err(pctldev->dev,
0511 "unsupported configuration parameter %u\n",
0512 param);
0513 return -EINVAL;
0514 }
0515
0516 if (ret)
0517 return ret;
0518 }
0519
0520 return 0;
0521 }
0522
0523 static int uniphier_conf_pin_config_group_set(struct pinctrl_dev *pctldev,
0524 unsigned selector,
0525 unsigned long *configs,
0526 unsigned num_configs)
0527 {
0528 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0529 const unsigned *pins = priv->socdata->groups[selector].pins;
0530 unsigned num_pins = priv->socdata->groups[selector].num_pins;
0531 int i, ret;
0532
0533 for (i = 0; i < num_pins; i++) {
0534 ret = uniphier_conf_pin_config_set(pctldev, pins[i],
0535 configs, num_configs);
0536 if (ret)
0537 return ret;
0538 }
0539
0540 return 0;
0541 }
0542
0543 static const struct pinconf_ops uniphier_confops = {
0544 .is_generic = true,
0545 .pin_config_get = uniphier_conf_pin_config_get,
0546 .pin_config_set = uniphier_conf_pin_config_set,
0547 .pin_config_group_set = uniphier_conf_pin_config_group_set,
0548 };
0549
0550 static int uniphier_pmx_get_functions_count(struct pinctrl_dev *pctldev)
0551 {
0552 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0553
0554 return priv->socdata->functions_count;
0555 }
0556
0557 static const char *uniphier_pmx_get_function_name(struct pinctrl_dev *pctldev,
0558 unsigned selector)
0559 {
0560 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0561
0562 return priv->socdata->functions[selector].name;
0563 }
0564
0565 static int uniphier_pmx_get_function_groups(struct pinctrl_dev *pctldev,
0566 unsigned selector,
0567 const char * const **groups,
0568 unsigned *num_groups)
0569 {
0570 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0571
0572 *groups = priv->socdata->functions[selector].groups;
0573 *num_groups = priv->socdata->functions[selector].num_groups;
0574
0575 return 0;
0576 }
0577
0578 static int uniphier_pmx_set_one_mux(struct pinctrl_dev *pctldev, unsigned pin,
0579 int muxval)
0580 {
0581 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0582 unsigned int mux_bits, reg_stride, reg, reg_end, shift, mask;
0583 bool load_pinctrl;
0584 int ret;
0585
0586
0587 ret = uniphier_conf_pin_input_enable(pctldev, pin, 1);
0588 if (ret)
0589 return ret;
0590
0591 if (muxval < 0)
0592 return 0;
0593
0594 if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE) {
0595
0596
0597
0598
0599
0600 mux_bits = 4;
0601 reg_stride = 8;
0602 load_pinctrl = true;
0603 } else {
0604
0605
0606
0607
0608
0609 mux_bits = 8;
0610 reg_stride = 4;
0611 load_pinctrl = false;
0612 }
0613
0614 reg = UNIPHIER_PINCTRL_PINMUX_BASE + pin * mux_bits / 32 * reg_stride;
0615 reg_end = reg + reg_stride;
0616 shift = pin * mux_bits % 32;
0617 mask = (1U << mux_bits) - 1;
0618
0619
0620
0621
0622
0623 for (; reg < reg_end; reg += 4) {
0624 ret = regmap_update_bits(priv->regmap, reg,
0625 mask << shift, muxval << shift);
0626 if (ret)
0627 return ret;
0628 muxval >>= mux_bits;
0629 }
0630
0631 if (load_pinctrl) {
0632 ret = regmap_write(priv->regmap,
0633 UNIPHIER_PINCTRL_LOAD_PINMUX, 1);
0634 if (ret)
0635 return ret;
0636 }
0637
0638 return 0;
0639 }
0640
0641 static int uniphier_pmx_set_mux(struct pinctrl_dev *pctldev,
0642 unsigned func_selector,
0643 unsigned group_selector)
0644 {
0645 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0646 const struct uniphier_pinctrl_group *grp =
0647 &priv->socdata->groups[group_selector];
0648 int i;
0649 int ret;
0650
0651 for (i = 0; i < grp->num_pins; i++) {
0652 ret = uniphier_pmx_set_one_mux(pctldev, grp->pins[i],
0653 grp->muxvals[i]);
0654 if (ret)
0655 return ret;
0656 }
0657
0658 return 0;
0659 }
0660
0661 static int uniphier_pmx_gpio_request_enable(struct pinctrl_dev *pctldev,
0662 struct pinctrl_gpio_range *range,
0663 unsigned offset)
0664 {
0665 struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
0666 unsigned int gpio_offset;
0667 int muxval, i;
0668
0669 if (range->pins) {
0670 for (i = 0; i < range->npins; i++)
0671 if (range->pins[i] == offset)
0672 break;
0673
0674 if (WARN_ON(i == range->npins))
0675 return -EINVAL;
0676
0677 gpio_offset = i;
0678 } else {
0679 gpio_offset = offset - range->pin_base;
0680 }
0681
0682 gpio_offset += range->id;
0683
0684 muxval = priv->socdata->get_gpio_muxval(offset, gpio_offset);
0685
0686 return uniphier_pmx_set_one_mux(pctldev, offset, muxval);
0687 }
0688
0689 static const struct pinmux_ops uniphier_pmxops = {
0690 .get_functions_count = uniphier_pmx_get_functions_count,
0691 .get_function_name = uniphier_pmx_get_function_name,
0692 .get_function_groups = uniphier_pmx_get_function_groups,
0693 .set_mux = uniphier_pmx_set_mux,
0694 .gpio_request_enable = uniphier_pmx_gpio_request_enable,
0695 .strict = true,
0696 };
0697
0698 #ifdef CONFIG_PM_SLEEP
0699 static int uniphier_pinctrl_suspend(struct device *dev)
0700 {
0701 struct uniphier_pinctrl_priv *priv = dev_get_drvdata(dev);
0702 struct uniphier_pinctrl_reg_region *r;
0703 int ret;
0704
0705 list_for_each_entry(r, &priv->reg_regions, node) {
0706 ret = regmap_bulk_read(priv->regmap, r->base, r->vals,
0707 r->nregs);
0708 if (ret)
0709 return ret;
0710 }
0711
0712 return 0;
0713 }
0714
0715 static int uniphier_pinctrl_resume(struct device *dev)
0716 {
0717 struct uniphier_pinctrl_priv *priv = dev_get_drvdata(dev);
0718 struct uniphier_pinctrl_reg_region *r;
0719 int ret;
0720
0721 list_for_each_entry(r, &priv->reg_regions, node) {
0722 ret = regmap_bulk_write(priv->regmap, r->base, r->vals,
0723 r->nregs);
0724 if (ret)
0725 return ret;
0726 }
0727
0728 if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE) {
0729 ret = regmap_write(priv->regmap,
0730 UNIPHIER_PINCTRL_LOAD_PINMUX, 1);
0731 if (ret)
0732 return ret;
0733 }
0734
0735 return 0;
0736 }
0737
0738 static int uniphier_pinctrl_add_reg_region(struct device *dev,
0739 struct uniphier_pinctrl_priv *priv,
0740 unsigned int base,
0741 unsigned int count,
0742 unsigned int width)
0743 {
0744 struct uniphier_pinctrl_reg_region *region;
0745 unsigned int nregs;
0746
0747 if (!count)
0748 return 0;
0749
0750 nregs = DIV_ROUND_UP(count * width, 32);
0751
0752 region = devm_kzalloc(dev, struct_size(region, vals, nregs),
0753 GFP_KERNEL);
0754 if (!region)
0755 return -ENOMEM;
0756
0757 region->base = base;
0758 region->nregs = nregs;
0759
0760 list_add_tail(®ion->node, &priv->reg_regions);
0761
0762 return 0;
0763 }
0764 #endif
0765
0766 static int uniphier_pinctrl_pm_init(struct device *dev,
0767 struct uniphier_pinctrl_priv *priv)
0768 {
0769 #ifdef CONFIG_PM_SLEEP
0770 const struct uniphier_pinctrl_socdata *socdata = priv->socdata;
0771 unsigned int num_drvctrl = 0;
0772 unsigned int num_drv2ctrl = 0;
0773 unsigned int num_drv3ctrl = 0;
0774 unsigned int num_pupdctrl = 0;
0775 unsigned int num_iectrl = 0;
0776 unsigned int iectrl, drvctrl, pupdctrl;
0777 enum uniphier_pin_drv_type drv_type;
0778 enum uniphier_pin_pull_dir pull_dir;
0779 int i, ret;
0780
0781 for (i = 0; i < socdata->npins; i++) {
0782 void *drv_data = socdata->pins[i].drv_data;
0783
0784 drvctrl = uniphier_pin_get_drvctrl(drv_data);
0785 drv_type = uniphier_pin_get_drv_type(drv_data);
0786 pupdctrl = uniphier_pin_get_pupdctrl(drv_data);
0787 pull_dir = uniphier_pin_get_pull_dir(drv_data);
0788 iectrl = uniphier_pin_get_iectrl(drv_data);
0789
0790 switch (drv_type) {
0791 case UNIPHIER_PIN_DRV_1BIT:
0792 num_drvctrl = max(num_drvctrl, drvctrl + 1);
0793 break;
0794 case UNIPHIER_PIN_DRV_2BIT:
0795 num_drv2ctrl = max(num_drv2ctrl, drvctrl + 1);
0796 break;
0797 case UNIPHIER_PIN_DRV_3BIT:
0798 num_drv3ctrl = max(num_drv3ctrl, drvctrl + 1);
0799 break;
0800 default:
0801 break;
0802 }
0803
0804 if (pull_dir == UNIPHIER_PIN_PULL_UP ||
0805 pull_dir == UNIPHIER_PIN_PULL_DOWN)
0806 num_pupdctrl = max(num_pupdctrl, pupdctrl + 1);
0807
0808 if (iectrl != UNIPHIER_PIN_IECTRL_NONE) {
0809 if (socdata->caps & UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL)
0810 iectrl = i;
0811 num_iectrl = max(num_iectrl, iectrl + 1);
0812 }
0813 }
0814
0815 INIT_LIST_HEAD(&priv->reg_regions);
0816
0817 ret = uniphier_pinctrl_add_reg_region(dev, priv,
0818 UNIPHIER_PINCTRL_PINMUX_BASE,
0819 socdata->npins, 8);
0820 if (ret)
0821 return ret;
0822
0823 ret = uniphier_pinctrl_add_reg_region(dev, priv,
0824 UNIPHIER_PINCTRL_DRVCTRL_BASE,
0825 num_drvctrl, 1);
0826 if (ret)
0827 return ret;
0828
0829 ret = uniphier_pinctrl_add_reg_region(dev, priv,
0830 UNIPHIER_PINCTRL_DRV2CTRL_BASE,
0831 num_drv2ctrl, 2);
0832 if (ret)
0833 return ret;
0834
0835 ret = uniphier_pinctrl_add_reg_region(dev, priv,
0836 UNIPHIER_PINCTRL_DRV3CTRL_BASE,
0837 num_drv3ctrl, 3);
0838 if (ret)
0839 return ret;
0840
0841 ret = uniphier_pinctrl_add_reg_region(dev, priv,
0842 UNIPHIER_PINCTRL_PUPDCTRL_BASE,
0843 num_pupdctrl, 1);
0844 if (ret)
0845 return ret;
0846
0847 ret = uniphier_pinctrl_add_reg_region(dev, priv,
0848 UNIPHIER_PINCTRL_IECTRL_BASE,
0849 num_iectrl, 1);
0850 if (ret)
0851 return ret;
0852 #endif
0853 return 0;
0854 }
0855
0856 const struct dev_pm_ops uniphier_pinctrl_pm_ops = {
0857 SET_LATE_SYSTEM_SLEEP_PM_OPS(uniphier_pinctrl_suspend,
0858 uniphier_pinctrl_resume)
0859 };
0860
0861 int uniphier_pinctrl_probe(struct platform_device *pdev,
0862 const struct uniphier_pinctrl_socdata *socdata)
0863 {
0864 struct device *dev = &pdev->dev;
0865 struct uniphier_pinctrl_priv *priv;
0866 struct device_node *parent;
0867 int ret;
0868
0869 if (!socdata ||
0870 !socdata->pins || !socdata->npins ||
0871 !socdata->groups || !socdata->groups_count ||
0872 !socdata->functions || !socdata->functions_count) {
0873 dev_err(dev, "pinctrl socdata lacks necessary members\n");
0874 return -EINVAL;
0875 }
0876
0877 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
0878 if (!priv)
0879 return -ENOMEM;
0880
0881 parent = of_get_parent(dev->of_node);
0882 priv->regmap = syscon_node_to_regmap(parent);
0883 of_node_put(parent);
0884
0885 if (IS_ERR(priv->regmap)) {
0886 dev_err(dev, "failed to get regmap\n");
0887 return PTR_ERR(priv->regmap);
0888 }
0889
0890 priv->socdata = socdata;
0891 priv->pctldesc.name = dev->driver->name;
0892 priv->pctldesc.pins = socdata->pins;
0893 priv->pctldesc.npins = socdata->npins;
0894 priv->pctldesc.pctlops = &uniphier_pctlops;
0895 priv->pctldesc.pmxops = &uniphier_pmxops;
0896 priv->pctldesc.confops = &uniphier_confops;
0897 priv->pctldesc.owner = dev->driver->owner;
0898
0899 ret = uniphier_pinctrl_pm_init(dev, priv);
0900 if (ret)
0901 return ret;
0902
0903 priv->pctldev = devm_pinctrl_register(dev, &priv->pctldesc, priv);
0904 if (IS_ERR(priv->pctldev)) {
0905 dev_err(dev, "failed to register UniPhier pinctrl driver\n");
0906 return PTR_ERR(priv->pctldev);
0907 }
0908
0909 platform_set_drvdata(pdev, priv);
0910
0911 return 0;
0912 }