diff options
author | Pritesh Raithatha <praithatha@nvidia.com> | 2013-01-08 02:32:36 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2013-01-18 10:13:52 -0500 |
commit | 348d1bf75c09f854630e9bd161dc2a88aebe2149 (patch) | |
tree | b7f3fd0f286d8191584c8d2f0200a29121e1acf2 /drivers/pinctrl | |
parent | b2083062a3b4035e85349120b426ecef2b6d155f (diff) |
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>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/pinctrl-tegra.c | 14 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-tegra.h | 16 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-tegra20.c | 6 | ||||
-rw-r--r-- | drivers/pinctrl/pinctrl-tegra30.c | 4 |
4 files changed, 40 insertions, 0 deletions
diff --git a/drivers/pinctrl/pinctrl-tegra.c b/drivers/pinctrl/pinctrl-tegra.c index ae1e4bb3259d..f195d77a3572 100644 --- a/drivers/pinctrl/pinctrl-tegra.c +++ b/drivers/pinctrl/pinctrl-tegra.c | |||
@@ -201,6 +201,7 @@ static const struct cfg_param { | |||
201 | {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN}, | 201 | {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN}, |
202 | {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK}, | 202 | {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK}, |
203 | {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET}, | 203 | {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET}, |
204 | {"nvidia,rcv-sel", TEGRA_PINCONF_PARAM_RCV_SEL}, | ||
204 | {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE}, | 205 | {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE}, |
205 | {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT}, | 206 | {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT}, |
206 | {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE}, | 207 | {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE}, |
@@ -208,6 +209,7 @@ static const struct cfg_param { | |||
208 | {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH}, | 209 | {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH}, |
209 | {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING}, | 210 | {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING}, |
210 | {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, | 211 | {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, |
212 | {"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE}, | ||
211 | }; | 213 | }; |
212 | 214 | ||
213 | static int tegra_pinctrl_dt_subnode_to_map(struct device *dev, | 215 | static int tegra_pinctrl_dt_subnode_to_map(struct device *dev, |
@@ -450,6 +452,12 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx, | |||
450 | *bit = g->ioreset_bit; | 452 | *bit = g->ioreset_bit; |
451 | *width = 1; | 453 | *width = 1; |
452 | break; | 454 | break; |
455 | case TEGRA_PINCONF_PARAM_RCV_SEL: | ||
456 | *bank = g->rcv_sel_bank; | ||
457 | *reg = g->rcv_sel_reg; | ||
458 | *bit = g->rcv_sel_bit; | ||
459 | *width = 1; | ||
460 | break; | ||
453 | case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE: | 461 | case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE: |
454 | *bank = g->drv_bank; | 462 | *bank = g->drv_bank; |
455 | *reg = g->drv_reg; | 463 | *reg = g->drv_reg; |
@@ -492,6 +500,12 @@ static int tegra_pinconf_reg(struct tegra_pmx *pmx, | |||
492 | *bit = g->slwr_bit; | 500 | *bit = g->slwr_bit; |
493 | *width = g->slwr_width; | 501 | *width = g->slwr_width; |
494 | break; | 502 | break; |
503 | case TEGRA_PINCONF_PARAM_DRIVE_TYPE: | ||
504 | *bank = g->drvtype_bank; | ||
505 | *reg = g->drvtype_reg; | ||
506 | *bit = g->drvtype_bit; | ||
507 | *width = 2; | ||
508 | break; | ||
495 | default: | 509 | default: |
496 | dev_err(pmx->dev, "Invalid config param %04x\n", param); | 510 | dev_err(pmx->dev, "Invalid config param %04x\n", param); |
497 | return -ENOTSUPP; | 511 | return -ENOTSUPP; |
diff --git a/drivers/pinctrl/pinctrl-tegra.h b/drivers/pinctrl/pinctrl-tegra.h index 62e380965c68..817f7061dc4c 100644 --- a/drivers/pinctrl/pinctrl-tegra.h +++ b/drivers/pinctrl/pinctrl-tegra.h | |||
@@ -30,6 +30,8 @@ enum tegra_pinconf_param { | |||
30 | /* argument: Boolean */ | 30 | /* argument: Boolean */ |
31 | TEGRA_PINCONF_PARAM_IORESET, | 31 | TEGRA_PINCONF_PARAM_IORESET, |
32 | /* argument: Boolean */ | 32 | /* argument: Boolean */ |
33 | TEGRA_PINCONF_PARAM_RCV_SEL, | ||
34 | /* argument: Boolean */ | ||
33 | TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE, | 35 | TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE, |
34 | /* argument: Boolean */ | 36 | /* argument: Boolean */ |
35 | TEGRA_PINCONF_PARAM_SCHMITT, | 37 | TEGRA_PINCONF_PARAM_SCHMITT, |
@@ -43,6 +45,8 @@ enum tegra_pinconf_param { | |||
43 | TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING, | 45 | TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING, |
44 | /* argument: Integer, range is HW-dependant */ | 46 | /* argument: Integer, range is HW-dependant */ |
45 | TEGRA_PINCONF_PARAM_SLEW_RATE_RISING, | 47 | TEGRA_PINCONF_PARAM_SLEW_RATE_RISING, |
48 | /* argument: Integer, range is HW-dependant */ | ||
49 | TEGRA_PINCONF_PARAM_DRIVE_TYPE, | ||
46 | }; | 50 | }; |
47 | 51 | ||
48 | enum tegra_pinconf_pull { | 52 | enum tegra_pinconf_pull { |
@@ -95,6 +99,9 @@ struct tegra_function { | |||
95 | * @ioreset_reg: IO reset register offset. -1 if unsupported. | 99 | * @ioreset_reg: IO reset register offset. -1 if unsupported. |
96 | * @ioreset_bank: IO reset register bank. 0 if unsupported. | 100 | * @ioreset_bank: IO reset register bank. 0 if unsupported. |
97 | * @ioreset_bit: IO reset register bit. 0 if unsupported. | 101 | * @ioreset_bit: IO reset register bit. 0 if unsupported. |
102 | * @rcv_sel_reg: Receiver select offset. -1 if unsupported. | ||
103 | * @rcv_sel_bank: Receiver select bank. 0 if unsupported. | ||
104 | * @rcv_sel_bit: Receiver select bit. 0 if unsupported. | ||
98 | * @drv_reg: Drive fields register offset. -1 if unsupported. | 105 | * @drv_reg: Drive fields register offset. -1 if unsupported. |
99 | * This register contains the hsm, schmitt, lpmd, drvdn, | 106 | * This register contains the hsm, schmitt, lpmd, drvdn, |
100 | * drvup, slwr, and slwf parameters. | 107 | * drvup, slwr, and slwf parameters. |
@@ -110,6 +117,9 @@ struct tegra_function { | |||
110 | * @slwr_width: Slew Rising field width. 0 if unsupported. | 117 | * @slwr_width: Slew Rising field width. 0 if unsupported. |
111 | * @slwf_bit: Slew Falling register bit. 0 if unsupported. | 118 | * @slwf_bit: Slew Falling register bit. 0 if unsupported. |
112 | * @slwf_width: Slew Falling field width. 0 if unsupported. | 119 | * @slwf_width: Slew Falling field width. 0 if unsupported. |
120 | * @drvtype_reg: Drive type fields register offset. -1 if unsupported. | ||
121 | * @drvtype_bank: Drive type fields register bank. 0 if unsupported. | ||
122 | * @drvtype_bit: Drive type register bit. 0 if unsupported. | ||
113 | * | 123 | * |
114 | * A representation of a group of pins (possibly just one pin) in the Tegra | 124 | * A representation of a group of pins (possibly just one pin) in the Tegra |
115 | * pin controller. Each group allows some parameter or parameters to be | 125 | * pin controller. Each group allows some parameter or parameters to be |
@@ -131,15 +141,19 @@ struct tegra_pingroup { | |||
131 | s16 odrain_reg; | 141 | s16 odrain_reg; |
132 | s16 lock_reg; | 142 | s16 lock_reg; |
133 | s16 ioreset_reg; | 143 | s16 ioreset_reg; |
144 | s16 rcv_sel_reg; | ||
134 | s16 drv_reg; | 145 | s16 drv_reg; |
146 | s16 drvtype_reg; | ||
135 | u32 mux_bank:2; | 147 | u32 mux_bank:2; |
136 | u32 pupd_bank:2; | 148 | u32 pupd_bank:2; |
137 | u32 tri_bank:2; | 149 | u32 tri_bank:2; |
138 | u32 einput_bank:2; | 150 | u32 einput_bank:2; |
139 | u32 odrain_bank:2; | 151 | u32 odrain_bank:2; |
140 | u32 ioreset_bank:2; | 152 | u32 ioreset_bank:2; |
153 | u32 rcv_sel_bank:2; | ||
141 | u32 lock_bank:2; | 154 | u32 lock_bank:2; |
142 | u32 drv_bank:2; | 155 | u32 drv_bank:2; |
156 | u32 drvtype_bank:2; | ||
143 | u32 mux_bit:5; | 157 | u32 mux_bit:5; |
144 | u32 pupd_bit:5; | 158 | u32 pupd_bit:5; |
145 | u32 tri_bit:5; | 159 | u32 tri_bit:5; |
@@ -147,6 +161,7 @@ struct tegra_pingroup { | |||
147 | u32 odrain_bit:5; | 161 | u32 odrain_bit:5; |
148 | u32 lock_bit:5; | 162 | u32 lock_bit:5; |
149 | u32 ioreset_bit:5; | 163 | u32 ioreset_bit:5; |
164 | u32 rcv_sel_bit:5; | ||
150 | u32 hsm_bit:5; | 165 | u32 hsm_bit:5; |
151 | u32 schmitt_bit:5; | 166 | u32 schmitt_bit:5; |
152 | u32 lpmd_bit:5; | 167 | u32 lpmd_bit:5; |
@@ -154,6 +169,7 @@ struct tegra_pingroup { | |||
154 | u32 drvup_bit:5; | 169 | u32 drvup_bit:5; |
155 | u32 slwr_bit:5; | 170 | u32 slwr_bit:5; |
156 | u32 slwf_bit:5; | 171 | u32 slwf_bit:5; |
172 | u32 drvtype_bit:5; | ||
157 | u32 drvdn_width:6; | 173 | u32 drvdn_width:6; |
158 | u32 drvup_width:6; | 174 | u32 drvup_width:6; |
159 | u32 slwr_width:6; | 175 | u32 slwr_width:6; |
diff --git a/drivers/pinctrl/pinctrl-tegra20.c b/drivers/pinctrl/pinctrl-tegra20.c index e848189038f0..fcfb7d012c5b 100644 --- a/drivers/pinctrl/pinctrl-tegra20.c +++ b/drivers/pinctrl/pinctrl-tegra20.c | |||
@@ -2624,7 +2624,9 @@ static const struct tegra_function tegra20_functions[] = { | |||
2624 | .odrain_reg = -1, \ | 2624 | .odrain_reg = -1, \ |
2625 | .lock_reg = -1, \ | 2625 | .lock_reg = -1, \ |
2626 | .ioreset_reg = -1, \ | 2626 | .ioreset_reg = -1, \ |
2627 | .rcv_sel_reg = -1, \ | ||
2627 | .drv_reg = -1, \ | 2628 | .drv_reg = -1, \ |
2629 | .drvtype_reg = -1, \ | ||
2628 | } | 2630 | } |
2629 | 2631 | ||
2630 | /* Pin groups with only pull up and pull down control */ | 2632 | /* Pin groups with only pull up and pull down control */ |
@@ -2642,7 +2644,9 @@ static const struct tegra_function tegra20_functions[] = { | |||
2642 | .odrain_reg = -1, \ | 2644 | .odrain_reg = -1, \ |
2643 | .lock_reg = -1, \ | 2645 | .lock_reg = -1, \ |
2644 | .ioreset_reg = -1, \ | 2646 | .ioreset_reg = -1, \ |
2647 | .rcv_sel_reg = -1, \ | ||
2645 | .drv_reg = -1, \ | 2648 | .drv_reg = -1, \ |
2649 | .drvtype_reg = -1, \ | ||
2646 | } | 2650 | } |
2647 | 2651 | ||
2648 | /* Pin groups for drive strength registers (configurable version) */ | 2652 | /* Pin groups for drive strength registers (configurable version) */ |
@@ -2660,6 +2664,7 @@ static const struct tegra_function tegra20_functions[] = { | |||
2660 | .odrain_reg = -1, \ | 2664 | .odrain_reg = -1, \ |
2661 | .lock_reg = -1, \ | 2665 | .lock_reg = -1, \ |
2662 | .ioreset_reg = -1, \ | 2666 | .ioreset_reg = -1, \ |
2667 | .rcv_sel_reg = -1, \ | ||
2663 | .drv_reg = ((r) - PINGROUP_REG_A), \ | 2668 | .drv_reg = ((r) - PINGROUP_REG_A), \ |
2664 | .drv_bank = 3, \ | 2669 | .drv_bank = 3, \ |
2665 | .hsm_bit = hsm_b, \ | 2670 | .hsm_bit = hsm_b, \ |
@@ -2673,6 +2678,7 @@ static const struct tegra_function tegra20_functions[] = { | |||
2673 | .slwr_width = slwr_w, \ | 2678 | .slwr_width = slwr_w, \ |
2674 | .slwf_bit = slwf_b, \ | 2679 | .slwf_bit = slwf_b, \ |
2675 | .slwf_width = slwf_w, \ | 2680 | .slwf_width = slwf_w, \ |
2681 | .drvtype_reg = -1, \ | ||
2676 | } | 2682 | } |
2677 | 2683 | ||
2678 | /* Pin groups for drive strength registers (simple version) */ | 2684 | /* Pin groups for drive strength registers (simple version) */ |
diff --git a/drivers/pinctrl/pinctrl-tegra30.c b/drivers/pinctrl/pinctrl-tegra30.c index 9ad87ea735d4..2300deba25bd 100644 --- a/drivers/pinctrl/pinctrl-tegra30.c +++ b/drivers/pinctrl/pinctrl-tegra30.c | |||
@@ -3384,7 +3384,9 @@ static const struct tegra_function tegra30_functions[] = { | |||
3384 | .ioreset_reg = PINGROUP_REG_##ior(r), \ | 3384 | .ioreset_reg = PINGROUP_REG_##ior(r), \ |
3385 | .ioreset_bank = 1, \ | 3385 | .ioreset_bank = 1, \ |
3386 | .ioreset_bit = 8, \ | 3386 | .ioreset_bit = 8, \ |
3387 | .rcv_sel_reg = -1, \ | ||
3387 | .drv_reg = -1, \ | 3388 | .drv_reg = -1, \ |
3389 | .drvtype_reg = -1, \ | ||
3388 | } | 3390 | } |
3389 | 3391 | ||
3390 | #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b, \ | 3392 | #define DRV_PINGROUP(pg_name, r, hsm_b, schmitt_b, lpmd_b, \ |
@@ -3401,6 +3403,7 @@ static const struct tegra_function tegra30_functions[] = { | |||
3401 | .odrain_reg = -1, \ | 3403 | .odrain_reg = -1, \ |
3402 | .lock_reg = -1, \ | 3404 | .lock_reg = -1, \ |
3403 | .ioreset_reg = -1, \ | 3405 | .ioreset_reg = -1, \ |
3406 | .rcv_sel_reg = -1, \ | ||
3404 | .drv_reg = ((r) - DRV_PINGROUP_REG_A), \ | 3407 | .drv_reg = ((r) - DRV_PINGROUP_REG_A), \ |
3405 | .drv_bank = 0, \ | 3408 | .drv_bank = 0, \ |
3406 | .hsm_bit = hsm_b, \ | 3409 | .hsm_bit = hsm_b, \ |
@@ -3414,6 +3417,7 @@ static const struct tegra_function tegra30_functions[] = { | |||
3414 | .slwr_width = slwr_w, \ | 3417 | .slwr_width = slwr_w, \ |
3415 | .slwf_bit = slwf_b, \ | 3418 | .slwf_bit = slwf_b, \ |
3416 | .slwf_width = slwf_w, \ | 3419 | .slwf_width = slwf_w, \ |
3420 | .drvtype_reg = -1, \ | ||
3417 | } | 3421 | } |
3418 | 3422 | ||
3419 | static const struct tegra_pingroup tegra30_groups[] = { | 3423 | static const struct tegra_pingroup tegra30_groups[] = { |