aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorPritesh Raithatha <praithatha@nvidia.com>2013-01-08 02:32:36 -0500
committerLinus Walleij <linus.walleij@linaro.org>2013-01-18 10:13:52 -0500
commit348d1bf75c09f854630e9bd161dc2a88aebe2149 (patch)
treeb7f3fd0f286d8191584c8d2f0200a29121e1acf2 /drivers/pinctrl
parentb2083062a3b4035e85349120b426ecef2b6d155f (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.c14
-rw-r--r--drivers/pinctrl/pinctrl-tegra.h16
-rw-r--r--drivers/pinctrl/pinctrl-tegra20.c6
-rw-r--r--drivers/pinctrl/pinctrl-tegra30.c4
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
213static int tegra_pinctrl_dt_subnode_to_map(struct device *dev, 215static 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
48enum tegra_pinconf_pull { 52enum 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
3419static const struct tegra_pingroup tegra30_groups[] = { 3423static const struct tegra_pingroup tegra30_groups[] = {