aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorPeter De Schrijver <pdeschrijver@nvidia.com>2011-12-14 10:03:22 -0500
committerOlof Johansson <olof@lixom.net>2011-12-17 23:15:28 -0500
commit6996e0858cd5e7b57bf7297b641c4b6a5bd59be6 (patch)
tree96d47bd8c48ce4f88e15f9d6633df4f58c2ef0b1 /arch/arm
parent57be3bdb402afbf71b0490ccf229c3b9cf784ce1 (diff)
arm/tegra: prepare pinmux code for multiple tegra variants
This patch modifies the pinmux code to be useable for multiple tegra variants. Some tegra20 specific constants will be replaced by variables which will be initialized to the appropriate value at runtime. Signed-off-by: Peter De Schrijver <pdeschrijver@nvidia.com> Acked-by: Stephen Warren <swarren@nvidia.com> Acked-by: Colin Cross <ccross@android.com> Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-tegra/board-harmony-pcie.c1
-rw-r--r--arch/arm/mach-tegra/board-harmony-pinmux.c1
-rw-r--r--arch/arm/mach-tegra/board-paz00-pinmux.c1
-rw-r--r--arch/arm/mach-tegra/board-trimslice-pinmux.c1
-rw-r--r--arch/arm/mach-tegra/include/mach/pinmux.h25
-rw-r--r--arch/arm/mach-tegra/pinmux-tegra20-tables.c15
-rw-r--r--arch/arm/mach-tegra/pinmux.c105
7 files changed, 86 insertions, 63 deletions
diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c
index 6db7d699ef1c..bd402d0d5d06 100644
--- a/arch/arm/mach-tegra/board-harmony-pcie.c
+++ b/arch/arm/mach-tegra/board-harmony-pcie.c
@@ -23,6 +23,7 @@
23#include <asm/mach-types.h> 23#include <asm/mach-types.h>
24 24
25#include <mach/pinmux.h> 25#include <mach/pinmux.h>
26#include <mach/pinmux-tegra20.h>
26#include "board.h" 27#include "board.h"
27#include "board-harmony.h" 28#include "board-harmony.h"
28 29
diff --git a/arch/arm/mach-tegra/board-harmony-pinmux.c b/arch/arm/mach-tegra/board-harmony-pinmux.c
index 7a4a26d5174c..b8a2485e3cb9 100644
--- a/arch/arm/mach-tegra/board-harmony-pinmux.c
+++ b/arch/arm/mach-tegra/board-harmony-pinmux.c
@@ -19,6 +19,7 @@
19#include <linux/of.h> 19#include <linux/of.h>
20 20
21#include <mach/pinmux.h> 21#include <mach/pinmux.h>
22#include <mach/pinmux-tegra20.h>
22 23
23#include "gpio-names.h" 24#include "gpio-names.h"
24#include "board-harmony.h" 25#include "board-harmony.h"
diff --git a/arch/arm/mach-tegra/board-paz00-pinmux.c b/arch/arm/mach-tegra/board-paz00-pinmux.c
index be30e215f4b7..bc1fe58c26fb 100644
--- a/arch/arm/mach-tegra/board-paz00-pinmux.c
+++ b/arch/arm/mach-tegra/board-paz00-pinmux.c
@@ -19,6 +19,7 @@
19#include <linux/of.h> 19#include <linux/of.h>
20 20
21#include <mach/pinmux.h> 21#include <mach/pinmux.h>
22#include <mach/pinmux-tegra20.h>
22 23
23#include "gpio-names.h" 24#include "gpio-names.h"
24#include "board-paz00.h" 25#include "board-paz00.h"
diff --git a/arch/arm/mach-tegra/board-trimslice-pinmux.c b/arch/arm/mach-tegra/board-trimslice-pinmux.c
index 7ab719d46da0..7331e15b73cc 100644
--- a/arch/arm/mach-tegra/board-trimslice-pinmux.c
+++ b/arch/arm/mach-tegra/board-trimslice-pinmux.c
@@ -19,6 +19,7 @@
19#include <linux/of.h> 19#include <linux/of.h>
20 20
21#include <mach/pinmux.h> 21#include <mach/pinmux.h>
22#include <mach/pinmux-tegra20.h>
22 23
23#include "gpio-names.h" 24#include "gpio-names.h"
24#include "board-trimslice.h" 25#include "board-trimslice.h"
diff --git a/arch/arm/mach-tegra/include/mach/pinmux.h b/arch/arm/mach-tegra/include/mach/pinmux.h
index b93df9e31349..35999ce7c9b2 100644
--- a/arch/arm/mach-tegra/include/mach/pinmux.h
+++ b/arch/arm/mach-tegra/include/mach/pinmux.h
@@ -17,12 +17,6 @@
17#ifndef __MACH_TEGRA_PINMUX_H 17#ifndef __MACH_TEGRA_PINMUX_H
18#define __MACH_TEGRA_PINMUX_H 18#define __MACH_TEGRA_PINMUX_H
19 19
20#if defined(CONFIG_ARCH_TEGRA_2x_SOC)
21#include "pinmux-tegra20.h"
22#else
23#error "Undefined Tegra architecture"
24#endif
25
26enum tegra_mux_func { 20enum tegra_mux_func {
27 TEGRA_MUX_RSVD = 0x8000, 21 TEGRA_MUX_RSVD = 0x8000,
28 TEGRA_MUX_RSVD1 = 0x8000, 22 TEGRA_MUX_RSVD1 = 0x8000,
@@ -118,7 +112,7 @@ enum tegra_vddio {
118}; 112};
119 113
120struct tegra_pingroup_config { 114struct tegra_pingroup_config {
121 enum tegra_pingroup pingroup; 115 int pingroup;
122 enum tegra_mux_func func; 116 enum tegra_mux_func func;
123 enum tegra_pullupdown pupd; 117 enum tegra_pullupdown pupd;
124 enum tegra_tristate tristate; 118 enum tegra_tristate tristate;
@@ -187,7 +181,7 @@ enum tegra_schmitt {
187}; 181};
188 182
189struct tegra_drive_pingroup_config { 183struct tegra_drive_pingroup_config {
190 enum tegra_drive_pingroup pingroup; 184 int pingroup;
191 enum tegra_hsm hsm; 185 enum tegra_hsm hsm;
192 enum tegra_schmitt schmitt; 186 enum tegra_schmitt schmitt;
193 enum tegra_drive drive; 187 enum tegra_drive drive;
@@ -219,13 +213,15 @@ struct tegra_pingroup_desc {
219 s8 pupd_bit; /* offset into the PULL_UPDOWN_REG_* register bit */ 213 s8 pupd_bit; /* offset into the PULL_UPDOWN_REG_* register bit */
220}; 214};
221 215
222extern const struct tegra_pingroup_desc tegra_soc_pingroups[]; 216typedef void (*pinmux_init) (const struct tegra_pingroup_desc **pg,
223extern const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[]; 217 int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive,
218 int *pgdrive_max);
224 219
225int tegra_pinmux_set_tristate(enum tegra_pingroup pg, 220void tegra20_pinmux_init(const struct tegra_pingroup_desc **pg, int *pg_max,
226 enum tegra_tristate tristate); 221 const struct tegra_drive_pingroup_desc **pgdrive, int *pgdrive_max);
227int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg, 222
228 enum tegra_pullupdown pupd); 223int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate);
224int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd);
229 225
230void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, 226void tegra_pinmux_config_table(const struct tegra_pingroup_config *config,
231 int len); 227 int len);
@@ -241,4 +237,3 @@ void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *conf
241void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config, 237void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config,
242 int len, enum tegra_pullupdown pupd); 238 int len, enum tegra_pullupdown pupd);
243#endif 239#endif
244
diff --git a/arch/arm/mach-tegra/pinmux-tegra20-tables.c b/arch/arm/mach-tegra/pinmux-tegra20-tables.c
index 88642a54e3aa..efe6aeeea474 100644
--- a/arch/arm/mach-tegra/pinmux-tegra20-tables.c
+++ b/arch/arm/mach-tegra/pinmux-tegra20-tables.c
@@ -44,7 +44,7 @@
44 .reg = ((r) - PINGROUP_REG_A) \ 44 .reg = ((r) - PINGROUP_REG_A) \
45 } 45 }
46 46
47const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = { 47static const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = {
48 DRIVE_PINGROUP(AO1, 0x868), 48 DRIVE_PINGROUP(AO1, 0x868),
49 DRIVE_PINGROUP(AO2, 0x86c), 49 DRIVE_PINGROUP(AO2, 0x86c),
50 DRIVE_PINGROUP(AT1, 0x870), 50 DRIVE_PINGROUP(AT1, 0x870),
@@ -108,7 +108,7 @@ const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE
108 .pupd_bit = pupd_b, \ 108 .pupd_bit = pupd_b, \
109 } 109 }
110 110
111const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { 111static const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = {
112 PINGROUP(ATA, NAND, IDE, NAND, GMI, RSVD, IDE, 0x14, 0, 0x80, 24, 0xA0, 0), 112 PINGROUP(ATA, NAND, IDE, NAND, GMI, RSVD, IDE, 0x14, 0, 0x80, 24, 0xA0, 0),
113 PINGROUP(ATB, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 1, 0x80, 16, 0xA0, 2), 113 PINGROUP(ATB, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 1, 0x80, 16, 0xA0, 2),
114 PINGROUP(ATC, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 2, 0x80, 22, 0xA0, 4), 114 PINGROUP(ATC, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 2, 0x80, 22, 0xA0, 4),
@@ -227,3 +227,14 @@ const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = {
227 PINGROUP(XM2C, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 30), 227 PINGROUP(XM2C, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 30),
228 PINGROUP(XM2D, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 28), 228 PINGROUP(XM2D, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 28),
229}; 229};
230
231void __init tegra20_pinmux_init(const struct tegra_pingroup_desc **pg,
232 int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive,
233 int *pgdrive_max)
234{
235 *pg = tegra_soc_pingroups;
236 *pg_max = TEGRA_MAX_PINGROUP;
237 *pgdrive = tegra_soc_drive_pingroups;
238 *pgdrive_max = TEGRA_MAX_DRIVE_PINGROUP;
239}
240
diff --git a/arch/arm/mach-tegra/pinmux.c b/arch/arm/mach-tegra/pinmux.c
index 1d201650d7a4..45ebd8ceccca 100644
--- a/arch/arm/mach-tegra/pinmux.c
+++ b/arch/arm/mach-tegra/pinmux.c
@@ -21,6 +21,7 @@
21#include <linux/spinlock.h> 21#include <linux/spinlock.h>
22#include <linux/io.h> 22#include <linux/io.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24#include <linux/of_device.h>
24 25
25#include <mach/iomap.h> 26#include <mach/iomap.h>
26#include <mach/pinmux.h> 27#include <mach/pinmux.h>
@@ -33,8 +34,10 @@
33#define SLWR(reg) (((reg) >> 28) & 0x3) 34#define SLWR(reg) (((reg) >> 28) & 0x3)
34#define SLWF(reg) (((reg) >> 30) & 0x3) 35#define SLWF(reg) (((reg) >> 30) & 0x3)
35 36
36static const struct tegra_pingroup_desc *const pingroups = tegra_soc_pingroups; 37static const struct tegra_pingroup_desc *pingroups;
37static const struct tegra_drive_pingroup_desc *const drive_pingroups = tegra_soc_drive_pingroups; 38static const struct tegra_drive_pingroup_desc *drive_pingroups;
39static int pingroup_max;
40static int drive_max;
38 41
39static char *tegra_mux_names[TEGRA_MAX_MUX] = { 42static char *tegra_mux_names[TEGRA_MAX_MUX] = {
40 [TEGRA_MUX_AHB_CLK] = "AHB_CLK", 43 [TEGRA_MUX_AHB_CLK] = "AHB_CLK",
@@ -116,9 +119,9 @@ static const char *tegra_slew_names[TEGRA_MAX_SLEW] = {
116 119
117static DEFINE_SPINLOCK(mux_lock); 120static DEFINE_SPINLOCK(mux_lock);
118 121
119static const char *pingroup_name(enum tegra_pingroup pg) 122static const char *pingroup_name(int pg)
120{ 123{
121 if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) 124 if (pg < 0 || pg >= pingroup_max)
122 return "<UNKNOWN>"; 125 return "<UNKNOWN>";
123 126
124 return pingroups[pg].name; 127 return pingroups[pg].name;
@@ -189,10 +192,10 @@ static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config)
189 int i; 192 int i;
190 unsigned long reg; 193 unsigned long reg;
191 unsigned long flags; 194 unsigned long flags;
192 enum tegra_pingroup pg = config->pingroup; 195 int pg = config->pingroup;
193 enum tegra_mux_func func = config->func; 196 enum tegra_mux_func func = config->func;
194 197
195 if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) 198 if (pg < 0 || pg >= pingroup_max)
196 return -ERANGE; 199 return -ERANGE;
197 200
198 if (pingroups[pg].mux_reg < 0) 201 if (pingroups[pg].mux_reg < 0)
@@ -230,13 +233,12 @@ static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config)
230 return 0; 233 return 0;
231} 234}
232 235
233int tegra_pinmux_set_tristate(enum tegra_pingroup pg, 236int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate)
234 enum tegra_tristate tristate)
235{ 237{
236 unsigned long reg; 238 unsigned long reg;
237 unsigned long flags; 239 unsigned long flags;
238 240
239 if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) 241 if (pg < 0 || pg >= pingroup_max)
240 return -ERANGE; 242 return -ERANGE;
241 243
242 if (pingroups[pg].tri_reg < 0) 244 if (pingroups[pg].tri_reg < 0)
@@ -255,13 +257,12 @@ int tegra_pinmux_set_tristate(enum tegra_pingroup pg,
255 return 0; 257 return 0;
256} 258}
257 259
258int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg, 260int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd)
259 enum tegra_pullupdown pupd)
260{ 261{
261 unsigned long reg; 262 unsigned long reg;
262 unsigned long flags; 263 unsigned long flags;
263 264
264 if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) 265 if (pg < 0 || pg >= pingroup_max)
265 return -ERANGE; 266 return -ERANGE;
266 267
267 if (pingroups[pg].pupd_reg < 0) 268 if (pingroups[pg].pupd_reg < 0)
@@ -287,7 +288,7 @@ int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg,
287 288
288static void tegra_pinmux_config_pingroup(const struct tegra_pingroup_config *config) 289static void tegra_pinmux_config_pingroup(const struct tegra_pingroup_config *config)
289{ 290{
290 enum tegra_pingroup pingroup = config->pingroup; 291 int pingroup = config->pingroup;
291 enum tegra_mux_func func = config->func; 292 enum tegra_mux_func func = config->func;
292 enum tegra_pullupdown pupd = config->pupd; 293 enum tegra_pullupdown pupd = config->pupd;
293 enum tegra_tristate tristate = config->tristate; 294 enum tegra_tristate tristate = config->tristate;
@@ -323,9 +324,9 @@ void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, int l
323 tegra_pinmux_config_pingroup(&config[i]); 324 tegra_pinmux_config_pingroup(&config[i]);
324} 325}
325 326
326static const char *drive_pinmux_name(enum tegra_drive_pingroup pg) 327static const char *drive_pinmux_name(int pg)
327{ 328{
328 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 329 if (pg < 0 || pg >= drive_max)
329 return "<UNKNOWN>"; 330 return "<UNKNOWN>";
330 331
331 return drive_pingroups[pg].name; 332 return drive_pingroups[pg].name;
@@ -352,12 +353,11 @@ static const char *slew_name(unsigned long val)
352 return tegra_slew_names[val]; 353 return tegra_slew_names[val];
353} 354}
354 355
355static int tegra_drive_pinmux_set_hsm(enum tegra_drive_pingroup pg, 356static int tegra_drive_pinmux_set_hsm(int pg, enum tegra_hsm hsm)
356 enum tegra_hsm hsm)
357{ 357{
358 unsigned long flags; 358 unsigned long flags;
359 u32 reg; 359 u32 reg;
360 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 360 if (pg < 0 || pg >= drive_max)
361 return -ERANGE; 361 return -ERANGE;
362 362
363 if (hsm != TEGRA_HSM_ENABLE && hsm != TEGRA_HSM_DISABLE) 363 if (hsm != TEGRA_HSM_ENABLE && hsm != TEGRA_HSM_DISABLE)
@@ -377,12 +377,11 @@ static int tegra_drive_pinmux_set_hsm(enum tegra_drive_pingroup pg,
377 return 0; 377 return 0;
378} 378}
379 379
380static int tegra_drive_pinmux_set_schmitt(enum tegra_drive_pingroup pg, 380static int tegra_drive_pinmux_set_schmitt(int pg, enum tegra_schmitt schmitt)
381 enum tegra_schmitt schmitt)
382{ 381{
383 unsigned long flags; 382 unsigned long flags;
384 u32 reg; 383 u32 reg;
385 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 384 if (pg < 0 || pg >= drive_max)
386 return -ERANGE; 385 return -ERANGE;
387 386
388 if (schmitt != TEGRA_SCHMITT_ENABLE && schmitt != TEGRA_SCHMITT_DISABLE) 387 if (schmitt != TEGRA_SCHMITT_ENABLE && schmitt != TEGRA_SCHMITT_DISABLE)
@@ -402,12 +401,11 @@ static int tegra_drive_pinmux_set_schmitt(enum tegra_drive_pingroup pg,
402 return 0; 401 return 0;
403} 402}
404 403
405static int tegra_drive_pinmux_set_drive(enum tegra_drive_pingroup pg, 404static int tegra_drive_pinmux_set_drive(int pg, enum tegra_drive drive)
406 enum tegra_drive drive)
407{ 405{
408 unsigned long flags; 406 unsigned long flags;
409 u32 reg; 407 u32 reg;
410 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 408 if (pg < 0 || pg >= drive_max)
411 return -ERANGE; 409 return -ERANGE;
412 410
413 if (drive < 0 || drive >= TEGRA_MAX_DRIVE) 411 if (drive < 0 || drive >= TEGRA_MAX_DRIVE)
@@ -425,12 +423,12 @@ static int tegra_drive_pinmux_set_drive(enum tegra_drive_pingroup pg,
425 return 0; 423 return 0;
426} 424}
427 425
428static int tegra_drive_pinmux_set_pull_down(enum tegra_drive_pingroup pg, 426static int tegra_drive_pinmux_set_pull_down(int pg,
429 enum tegra_pull_strength pull_down) 427 enum tegra_pull_strength pull_down)
430{ 428{
431 unsigned long flags; 429 unsigned long flags;
432 u32 reg; 430 u32 reg;
433 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 431 if (pg < 0 || pg >= drive_max)
434 return -ERANGE; 432 return -ERANGE;
435 433
436 if (pull_down < 0 || pull_down >= TEGRA_MAX_PULL) 434 if (pull_down < 0 || pull_down >= TEGRA_MAX_PULL)
@@ -448,12 +446,12 @@ static int tegra_drive_pinmux_set_pull_down(enum tegra_drive_pingroup pg,
448 return 0; 446 return 0;
449} 447}
450 448
451static int tegra_drive_pinmux_set_pull_up(enum tegra_drive_pingroup pg, 449static int tegra_drive_pinmux_set_pull_up(int pg,
452 enum tegra_pull_strength pull_up) 450 enum tegra_pull_strength pull_up)
453{ 451{
454 unsigned long flags; 452 unsigned long flags;
455 u32 reg; 453 u32 reg;
456 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 454 if (pg < 0 || pg >= drive_max)
457 return -ERANGE; 455 return -ERANGE;
458 456
459 if (pull_up < 0 || pull_up >= TEGRA_MAX_PULL) 457 if (pull_up < 0 || pull_up >= TEGRA_MAX_PULL)
@@ -471,12 +469,12 @@ static int tegra_drive_pinmux_set_pull_up(enum tegra_drive_pingroup pg,
471 return 0; 469 return 0;
472} 470}
473 471
474static int tegra_drive_pinmux_set_slew_rising(enum tegra_drive_pingroup pg, 472static int tegra_drive_pinmux_set_slew_rising(int pg,
475 enum tegra_slew slew_rising) 473 enum tegra_slew slew_rising)
476{ 474{
477 unsigned long flags; 475 unsigned long flags;
478 u32 reg; 476 u32 reg;
479 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 477 if (pg < 0 || pg >= drive_max)
480 return -ERANGE; 478 return -ERANGE;
481 479
482 if (slew_rising < 0 || slew_rising >= TEGRA_MAX_SLEW) 480 if (slew_rising < 0 || slew_rising >= TEGRA_MAX_SLEW)
@@ -494,12 +492,12 @@ static int tegra_drive_pinmux_set_slew_rising(enum tegra_drive_pingroup pg,
494 return 0; 492 return 0;
495} 493}
496 494
497static int tegra_drive_pinmux_set_slew_falling(enum tegra_drive_pingroup pg, 495static int tegra_drive_pinmux_set_slew_falling(int pg,
498 enum tegra_slew slew_falling) 496 enum tegra_slew slew_falling)
499{ 497{
500 unsigned long flags; 498 unsigned long flags;
501 u32 reg; 499 u32 reg;
502 if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) 500 if (pg < 0 || pg >= drive_max)
503 return -ERANGE; 501 return -ERANGE;
504 502
505 if (slew_falling < 0 || slew_falling >= TEGRA_MAX_SLEW) 503 if (slew_falling < 0 || slew_falling >= TEGRA_MAX_SLEW)
@@ -517,7 +515,7 @@ static int tegra_drive_pinmux_set_slew_falling(enum tegra_drive_pingroup pg,
517 return 0; 515 return 0;
518} 516}
519 517
520static void tegra_drive_pinmux_config_pingroup(enum tegra_drive_pingroup pingroup, 518static void tegra_drive_pinmux_config_pingroup(int pingroup,
521 enum tegra_hsm hsm, 519 enum tegra_hsm hsm,
522 enum tegra_schmitt schmitt, 520 enum tegra_schmitt schmitt,
523 enum tegra_drive drive, 521 enum tegra_drive drive,
@@ -596,7 +594,7 @@ void tegra_pinmux_set_safe_pinmux_table(const struct tegra_pingroup_config *conf
596 for (i = 0; i < len; i++) { 594 for (i = 0; i < len; i++) {
597 int err; 595 int err;
598 c = config[i]; 596 c = config[i];
599 if (c.pingroup < 0 || c.pingroup >= TEGRA_MAX_PINGROUP) { 597 if (c.pingroup < 0 || c.pingroup >= pingroup_max) {
600 WARN_ON(1); 598 WARN_ON(1);
601 continue; 599 continue;
602 } 600 }
@@ -617,7 +615,7 @@ void tegra_pinmux_config_pinmux_table(const struct tegra_pingroup_config *config
617 for (i = 0; i < len; i++) { 615 for (i = 0; i < len; i++) {
618 int err; 616 int err;
619 if (config[i].pingroup < 0 || 617 if (config[i].pingroup < 0 ||
620 config[i].pingroup >= TEGRA_MAX_PINGROUP) { 618 config[i].pingroup >= pingroup_max) {
621 WARN_ON(1); 619 WARN_ON(1);
622 continue; 620 continue;
623 } 621 }
@@ -635,7 +633,7 @@ void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *conf
635{ 633{
636 int i; 634 int i;
637 int err; 635 int err;
638 enum tegra_pingroup pingroup; 636 int pingroup;
639 637
640 for (i = 0; i < len; i++) { 638 for (i = 0; i < len; i++) {
641 pingroup = config[i].pingroup; 639 pingroup = config[i].pingroup;
@@ -654,7 +652,7 @@ void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *co
654{ 652{
655 int i; 653 int i;
656 int err; 654 int err;
657 enum tegra_pingroup pingroup; 655 int pingroup;
658 656
659 for (i = 0; i < len; i++) { 657 for (i = 0; i < len; i++) {
660 pingroup = config[i].pingroup; 658 pingroup = config[i].pingroup;
@@ -668,11 +666,31 @@ void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *co
668 } 666 }
669} 667}
670 668
669static struct of_device_id tegra_pinmux_of_match[] __devinitdata = {
670 { .compatible = "nvidia,tegra20-pinmux", tegra20_pinmux_init },
671 { },
672};
673
671static int __devinit tegra_pinmux_probe(struct platform_device *pdev) 674static int __devinit tegra_pinmux_probe(struct platform_device *pdev)
672{ 675{
673 struct resource *res; 676 struct resource *res;
674 int i; 677 int i;
675 int config_bad = 0; 678 int config_bad = 0;
679 const struct of_device_id *match;
680
681 match = of_match_device(tegra_pinmux_of_match, &pdev->dev);
682
683 if (match)
684 ((pinmux_init)(match->data))(&pingroups, &pingroup_max,
685 &drive_pingroups, &drive_max);
686#ifdef CONFIG_ARCH_TEGRA_2x_SOC
687 else
688 /* no device tree available, so we must be on tegra20 */
689 tegra20_pinmux_init(&pingroups, &pingroup_max,
690 &drive_pingroups, &drive_max);
691#else
692 pr_warn("non Tegra20 platform requires pinmux devicetree node\n");
693#endif
676 694
677 for (i = 0; ; i++) { 695 for (i = 0; ; i++) {
678 res = platform_get_resource(pdev, IORESOURCE_MEM, i); 696 res = platform_get_resource(pdev, IORESOURCE_MEM, i);
@@ -681,7 +699,7 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev)
681 } 699 }
682 nbanks = i; 700 nbanks = i;
683 701
684 for (i = 0; i < TEGRA_MAX_PINGROUP; i++) { 702 for (i = 0; i < pingroup_max; i++) {
685 if (pingroups[i].tri_bank >= nbanks) { 703 if (pingroups[i].tri_bank >= nbanks) {
686 dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i); 704 dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i);
687 config_bad = 1; 705 config_bad = 1;
@@ -698,7 +716,7 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev)
698 } 716 }
699 } 717 }
700 718
701 for (i = 0; i < TEGRA_MAX_DRIVE_PINGROUP; i++) { 719 for (i = 0; i < drive_max; i++) {
702 if (drive_pingroups[i].reg_bank >= nbanks) { 720 if (drive_pingroups[i].reg_bank >= nbanks) {
703 dev_err(&pdev->dev, 721 dev_err(&pdev->dev,
704 "drive pingroup %d: bad reg_bank\n", i); 722 "drive pingroup %d: bad reg_bank\n", i);
@@ -741,11 +759,6 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev)
741 return 0; 759 return 0;
742} 760}
743 761
744static struct of_device_id tegra_pinmux_of_match[] __devinitdata = {
745 { .compatible = "nvidia,tegra20-pinmux", },
746 { },
747};
748
749static struct platform_driver tegra_pinmux_driver = { 762static struct platform_driver tegra_pinmux_driver = {
750 .driver = { 763 .driver = {
751 .name = "tegra-pinmux", 764 .name = "tegra-pinmux",
@@ -779,7 +792,7 @@ static int dbg_pinmux_show(struct seq_file *s, void *unused)
779 int i; 792 int i;
780 int len; 793 int len;
781 794
782 for (i = 0; i < TEGRA_MAX_PINGROUP; i++) { 795 for (i = 0; i < pingroup_max; i++) {
783 unsigned long reg; 796 unsigned long reg;
784 unsigned long tri; 797 unsigned long tri;
785 unsigned long mux; 798 unsigned long mux;
@@ -850,7 +863,7 @@ static int dbg_drive_pinmux_show(struct seq_file *s, void *unused)
850 int i; 863 int i;
851 int len; 864 int len;
852 865
853 for (i = 0; i < TEGRA_MAX_DRIVE_PINGROUP; i++) { 866 for (i = 0; i < drive_max; i++) {
854 u32 reg; 867 u32 reg;
855 868
856 seq_printf(s, "\t{TEGRA_DRIVE_PINGROUP_%s", 869 seq_printf(s, "\t{TEGRA_DRIVE_PINGROUP_%s",