Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: tegra: add support for rcv-sel and drive type

NVIDIA's Tegra114 added two more configuration parameter in pinmux i.e.
rcv-sel and drive type.

rcv-sel: Select between High and Normal VIL/VIH receivers.
RCVR_SEL=1: High VIL/VIH
RCVR_SEL=0: Normal VIL/VIH

drv_type: Ouptput drive type:
33-50 ohm driver: 0x1
66-100ohm driver: 0x0

Add support of these parameters to be configure from DTS file.

Tegra20 and Tegra30 does not support this configuration and hence initialize their
pinmux structure with reg = -1.

Originally written by Pritesh Raithatha.
Changes by ldewangan:
- remove drvtype_width as it is always 2.
- Better describe the change.

Signed-off-by: Pritesh Raithatha <praithatha@nvidia.com>
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Pritesh Raithatha and committed by
Linus Walleij
348d1bf7 b2083062

+40
+14
drivers/pinctrl/pinctrl-tegra.c
··· 201 201 {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN}, 202 202 {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK}, 203 203 {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET}, 204 + {"nvidia,rcv-sel", TEGRA_PINCONF_PARAM_RCV_SEL}, 204 205 {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE}, 205 206 {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT}, 206 207 {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE}, ··· 209 208 {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH}, 210 209 {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING}, 211 210 {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, 211 + {"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE}, 212 212 }; 213 213 214 214 static int tegra_pinctrl_dt_subnode_to_map(struct device *dev, ··· 452 450 *bit = g->ioreset_bit; 453 451 *width = 1; 454 452 break; 453 + case TEGRA_PINCONF_PARAM_RCV_SEL: 454 + *bank = g->rcv_sel_bank; 455 + *reg = g->rcv_sel_reg; 456 + *bit = g->rcv_sel_bit; 457 + *width = 1; 458 + break; 455 459 case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE: 456 460 *bank = g->drv_bank; 457 461 *reg = g->drv_reg; ··· 499 491 *reg = g->drv_reg; 500 492 *bit = g->slwr_bit; 501 493 *width = g->slwr_width; 494 + break; 495 + case TEGRA_PINCONF_PARAM_DRIVE_TYPE: 496 + *bank = g->drvtype_bank; 497 + *reg = g->drvtype_reg; 498 + *bit = g->drvtype_bit; 499 + *width = 2; 502 500 break; 503 501 default: 504 502 dev_err(pmx->dev, "Invalid config param %04x\n", param);
+16
drivers/pinctrl/pinctrl-tegra.h
··· 30 30 /* argument: Boolean */ 31 31 TEGRA_PINCONF_PARAM_IORESET, 32 32 /* argument: Boolean */ 33 + TEGRA_PINCONF_PARAM_RCV_SEL, 34 + /* argument: Boolean */ 33 35 TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE, 34 36 /* argument: Boolean */ 35 37 TEGRA_PINCONF_PARAM_SCHMITT, ··· 45 43 TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING, 46 44 /* argument: Integer, range is HW-dependant */ 47 45 TEGRA_PINCONF_PARAM_SLEW_RATE_RISING, 46 + /* argument: Integer, range is HW-dependant */ 47 + TEGRA_PINCONF_PARAM_DRIVE_TYPE, 48 48 }; 49 49 50 50 enum tegra_pinconf_pull { ··· 99 95 * @ioreset_reg: IO reset register offset. -1 if unsupported. 100 96 * @ioreset_bank: IO reset register bank. 0 if unsupported. 101 97 * @ioreset_bit: IO reset register bit. 0 if unsupported. 98 + * @rcv_sel_reg: Receiver select offset. -1 if unsupported. 99 + * @rcv_sel_bank: Receiver select bank. 0 if unsupported. 100 + * @rcv_sel_bit: Receiver select bit. 0 if unsupported. 102 101 * @drv_reg: Drive fields register offset. -1 if unsupported. 103 102 * This register contains the hsm, schmitt, lpmd, drvdn, 104 103 * drvup, slwr, and slwf parameters. ··· 117 110 * @slwr_width: Slew Rising field width. 0 if unsupported. 118 111 * @slwf_bit: Slew Falling register bit. 0 if unsupported. 119 112 * @slwf_width: Slew Falling field width. 0 if unsupported. 113 + * @drvtype_reg: Drive type fields register offset. -1 if unsupported. 114 + * @drvtype_bank: Drive type fields register bank. 0 if unsupported. 115 + * @drvtype_bit: Drive type register bit. 0 if unsupported. 120 116 * 121 117 * A representation of a group of pins (possibly just one pin) in the Tegra 122 118 * pin controller. Each group allows some parameter or parameters to be ··· 141 131 s16 odrain_reg; 142 132 s16 lock_reg; 143 133 s16 ioreset_reg; 134 + s16 rcv_sel_reg; 144 135 s16 drv_reg; 136 + s16 drvtype_reg; 145 137 u32 mux_bank:2; 146 138 u32 pupd_bank:2; 147 139 u32 tri_bank:2; 148 140 u32 einput_bank:2; 149 141 u32 odrain_bank:2; 150 142 u32 ioreset_bank:2; 143 + u32 rcv_sel_bank:2; 151 144 u32 lock_bank:2; 152 145 u32 drv_bank:2; 146 + u32 drvtype_bank:2; 153 147 u32 mux_bit:5; 154 148 u32 pupd_bit:5; 155 149 u32 tri_bit:5; ··· 161 147 u32 odrain_bit:5; 162 148 u32 lock_bit:5; 163 149 u32 ioreset_bit:5; 150 + u32 rcv_sel_bit:5; 164 151 u32 hsm_bit:5; 165 152 u32 schmitt_bit:5; 166 153 u32 lpmd_bit:5; ··· 169 154 u32 drvup_bit:5; 170 155 u32 slwr_bit:5; 171 156 u32 slwf_bit:5; 157 + u32 drvtype_bit:5; 172 158 u32 drvdn_width:6; 173 159 u32 drvup_width:6; 174 160 u32 slwr_width:6;
+6
drivers/pinctrl/pinctrl-tegra20.c
··· 2624 2624 .odrain_reg = -1, \ 2625 2625 .lock_reg = -1, \ 2626 2626 .ioreset_reg = -1, \ 2627 + .rcv_sel_reg = -1, \ 2627 2628 .drv_reg = -1, \ 2629 + .drvtype_reg = -1, \ 2628 2630 } 2629 2631 2630 2632 /* Pin groups with only pull up and pull down control */ ··· 2644 2642 .odrain_reg = -1, \ 2645 2643 .lock_reg = -1, \ 2646 2644 .ioreset_reg = -1, \ 2645 + .rcv_sel_reg = -1, \ 2647 2646 .drv_reg = -1, \ 2647 + .drvtype_reg = -1, \ 2648 2648 } 2649 2649 2650 2650 /* Pin groups for drive strength registers (configurable version) */ ··· 2664 2660 .odrain_reg = -1, \ 2665 2661 .lock_reg = -1, \ 2666 2662 .ioreset_reg = -1, \ 2663 + .rcv_sel_reg = -1, \ 2667 2664 .drv_reg = ((r) - PINGROUP_REG_A), \ 2668 2665 .drv_bank = 3, \ 2669 2666 .hsm_bit = hsm_b, \ ··· 2678 2673 .slwr_width = slwr_w, \ 2679 2674 .slwf_bit = slwf_b, \ 2680 2675 .slwf_width = slwf_w, \ 2676 + .drvtype_reg = -1, \ 2681 2677 } 2682 2678 2683 2679 /* Pin groups for drive strength registers (simple version) */
+4
drivers/pinctrl/pinctrl-tegra30.c
··· 3384 3384 .ioreset_reg = PINGROUP_REG_##ior(r), \ 3385 3385 .ioreset_bank = 1, \ 3386 3386 .ioreset_bit = 8, \ 3387 + .rcv_sel_reg = -1, \ 3387 3388 .drv_reg = -1, \ 3389 + .drvtype_reg = -1, \ 3388 3390 } 3389 3391 3390 3392 #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b, \ ··· 3403 3401 .odrain_reg = -1, \ 3404 3402 .lock_reg = -1, \ 3405 3403 .ioreset_reg = -1, \ 3404 + .rcv_sel_reg = -1, \ 3406 3405 .drv_reg = ((r) - DRV_PINGROUP_REG_A), \ 3407 3406 .drv_bank = 0, \ 3408 3407 .hsm_bit = hsm_b, \ ··· 3417 3414 .slwr_width = slwr_w, \ 3418 3415 .slwf_bit = slwf_b, \ 3419 3416 .slwf_width = slwf_w, \ 3417 + .drvtype_reg = -1, \ 3420 3418 } 3421 3419 3422 3420 static const struct tegra_pingroup tegra30_groups[] = {