pinmux.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. /*
  2. * linux/arch/arm/mach-tegra/pinmux.c
  3. *
  4. * Copyright (C) 2010 Google, Inc.
  5. *
  6. * This software is licensed under the terms of the GNU General Public
  7. * License version 2, as published by the Free Software Foundation, and
  8. * may be copied, distributed, and modified under those terms.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. */
  16. #include <linux/init.h>
  17. #include <linux/module.h>
  18. #include <linux/kernel.h>
  19. #include <linux/errno.h>
  20. #include <linux/spinlock.h>
  21. #include <linux/io.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/of_device.h>
  24. #include <mach/iomap.h>
  25. #include <mach/pinmux.h>
  26. #define HSM_EN(reg) (((reg) >> 2) & 0x1)
  27. #define SCHMT_EN(reg) (((reg) >> 3) & 0x1)
  28. #define LPMD(reg) (((reg) >> 4) & 0x3)
  29. #define DRVDN(reg) (((reg) >> 12) & 0x1f)
  30. #define DRVUP(reg) (((reg) >> 20) & 0x1f)
  31. #define SLWR(reg) (((reg) >> 28) & 0x3)
  32. #define SLWF(reg) (((reg) >> 30) & 0x3)
  33. static const struct tegra_pingroup_desc *pingroups;
  34. static const struct tegra_drive_pingroup_desc *drive_pingroups;
  35. static int pingroup_max;
  36. static int drive_max;
  37. static char *tegra_mux_names[TEGRA_MAX_MUX] = {
  38. [TEGRA_MUX_AHB_CLK] = "AHB_CLK",
  39. [TEGRA_MUX_APB_CLK] = "APB_CLK",
  40. [TEGRA_MUX_AUDIO_SYNC] = "AUDIO_SYNC",
  41. [TEGRA_MUX_CRT] = "CRT",
  42. [TEGRA_MUX_DAP1] = "DAP1",
  43. [TEGRA_MUX_DAP2] = "DAP2",
  44. [TEGRA_MUX_DAP3] = "DAP3",
  45. [TEGRA_MUX_DAP4] = "DAP4",
  46. [TEGRA_MUX_DAP5] = "DAP5",
  47. [TEGRA_MUX_DISPLAYA] = "DISPLAYA",
  48. [TEGRA_MUX_DISPLAYB] = "DISPLAYB",
  49. [TEGRA_MUX_EMC_TEST0_DLL] = "EMC_TEST0_DLL",
  50. [TEGRA_MUX_EMC_TEST1_DLL] = "EMC_TEST1_DLL",
  51. [TEGRA_MUX_GMI] = "GMI",
  52. [TEGRA_MUX_GMI_INT] = "GMI_INT",
  53. [TEGRA_MUX_HDMI] = "HDMI",
  54. [TEGRA_MUX_I2C] = "I2C",
  55. [TEGRA_MUX_I2C2] = "I2C2",
  56. [TEGRA_MUX_I2C3] = "I2C3",
  57. [TEGRA_MUX_IDE] = "IDE",
  58. [TEGRA_MUX_IRDA] = "IRDA",
  59. [TEGRA_MUX_KBC] = "KBC",
  60. [TEGRA_MUX_MIO] = "MIO",
  61. [TEGRA_MUX_MIPI_HS] = "MIPI_HS",
  62. [TEGRA_MUX_NAND] = "NAND",
  63. [TEGRA_MUX_OSC] = "OSC",
  64. [TEGRA_MUX_OWR] = "OWR",
  65. [TEGRA_MUX_PCIE] = "PCIE",
  66. [TEGRA_MUX_PLLA_OUT] = "PLLA_OUT",
  67. [TEGRA_MUX_PLLC_OUT1] = "PLLC_OUT1",
  68. [TEGRA_MUX_PLLM_OUT1] = "PLLM_OUT1",
  69. [TEGRA_MUX_PLLP_OUT2] = "PLLP_OUT2",
  70. [TEGRA_MUX_PLLP_OUT3] = "PLLP_OUT3",
  71. [TEGRA_MUX_PLLP_OUT4] = "PLLP_OUT4",
  72. [TEGRA_MUX_PWM] = "PWM",
  73. [TEGRA_MUX_PWR_INTR] = "PWR_INTR",
  74. [TEGRA_MUX_PWR_ON] = "PWR_ON",
  75. [TEGRA_MUX_RTCK] = "RTCK",
  76. [TEGRA_MUX_SDIO1] = "SDIO1",
  77. [TEGRA_MUX_SDIO2] = "SDIO2",
  78. [TEGRA_MUX_SDIO3] = "SDIO3",
  79. [TEGRA_MUX_SDIO4] = "SDIO4",
  80. [TEGRA_MUX_SFLASH] = "SFLASH",
  81. [TEGRA_MUX_SPDIF] = "SPDIF",
  82. [TEGRA_MUX_SPI1] = "SPI1",
  83. [TEGRA_MUX_SPI2] = "SPI2",
  84. [TEGRA_MUX_SPI2_ALT] = "SPI2_ALT",
  85. [TEGRA_MUX_SPI3] = "SPI3",
  86. [TEGRA_MUX_SPI4] = "SPI4",
  87. [TEGRA_MUX_TRACE] = "TRACE",
  88. [TEGRA_MUX_TWC] = "TWC",
  89. [TEGRA_MUX_UARTA] = "UARTA",
  90. [TEGRA_MUX_UARTB] = "UARTB",
  91. [TEGRA_MUX_UARTC] = "UARTC",
  92. [TEGRA_MUX_UARTD] = "UARTD",
  93. [TEGRA_MUX_UARTE] = "UARTE",
  94. [TEGRA_MUX_ULPI] = "ULPI",
  95. [TEGRA_MUX_VI] = "VI",
  96. [TEGRA_MUX_VI_SENSOR_CLK] = "VI_SENSOR_CLK",
  97. [TEGRA_MUX_XIO] = "XIO",
  98. [TEGRA_MUX_SAFE] = "<safe>",
  99. };
  100. static const char *tegra_drive_names[TEGRA_MAX_DRIVE] = {
  101. [TEGRA_DRIVE_DIV_8] = "DIV_8",
  102. [TEGRA_DRIVE_DIV_4] = "DIV_4",
  103. [TEGRA_DRIVE_DIV_2] = "DIV_2",
  104. [TEGRA_DRIVE_DIV_1] = "DIV_1",
  105. };
  106. static const char *tegra_slew_names[TEGRA_MAX_SLEW] = {
  107. [TEGRA_SLEW_FASTEST] = "FASTEST",
  108. [TEGRA_SLEW_FAST] = "FAST",
  109. [TEGRA_SLEW_SLOW] = "SLOW",
  110. [TEGRA_SLEW_SLOWEST] = "SLOWEST",
  111. };
  112. static DEFINE_SPINLOCK(mux_lock);
  113. static const char *pingroup_name(int pg)
  114. {
  115. if (pg < 0 || pg >= pingroup_max)
  116. return "<UNKNOWN>";
  117. return pingroups[pg].name;
  118. }
  119. static const char *func_name(enum tegra_mux_func func)
  120. {
  121. if (func == TEGRA_MUX_RSVD1)
  122. return "RSVD1";
  123. if (func == TEGRA_MUX_RSVD2)
  124. return "RSVD2";
  125. if (func == TEGRA_MUX_RSVD3)
  126. return "RSVD3";
  127. if (func == TEGRA_MUX_RSVD4)
  128. return "RSVD4";
  129. if (func == TEGRA_MUX_NONE)
  130. return "NONE";
  131. if (func < 0 || func >= TEGRA_MAX_MUX)
  132. return "<UNKNOWN>";
  133. return tegra_mux_names[func];
  134. }
  135. static const char *tri_name(unsigned long val)
  136. {
  137. return val ? "TRISTATE" : "NORMAL";
  138. }
  139. static const char *pupd_name(unsigned long val)
  140. {
  141. switch (val) {
  142. case 0:
  143. return "NORMAL";
  144. case 1:
  145. return "PULL_DOWN";
  146. case 2:
  147. return "PULL_UP";
  148. default:
  149. return "RSVD";
  150. }
  151. }
  152. static int nbanks;
  153. static void __iomem **regs;
  154. static inline u32 pg_readl(u32 bank, u32 reg)
  155. {
  156. return readl(regs[bank] + reg);
  157. }
  158. static inline void pg_writel(u32 val, u32 bank, u32 reg)
  159. {
  160. writel(val, regs[bank] + reg);
  161. }
  162. static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config)
  163. {
  164. int mux = -1;
  165. int i;
  166. unsigned long reg;
  167. unsigned long flags;
  168. int pg = config->pingroup;
  169. enum tegra_mux_func func = config->func;
  170. if (pg < 0 || pg >= pingroup_max)
  171. return -ERANGE;
  172. if (pingroups[pg].mux_reg < 0)
  173. return -EINVAL;
  174. if (func < 0)
  175. return -ERANGE;
  176. if (func == TEGRA_MUX_SAFE)
  177. func = pingroups[pg].func_safe;
  178. if (func & TEGRA_MUX_RSVD) {
  179. mux = func & 0x3;
  180. } else {
  181. for (i = 0; i < 4; i++) {
  182. if (pingroups[pg].funcs[i] == func) {
  183. mux = i;
  184. break;
  185. }
  186. }
  187. }
  188. if (mux < 0)
  189. return -EINVAL;
  190. spin_lock_irqsave(&mux_lock, flags);
  191. reg = pg_readl(pingroups[pg].mux_bank, pingroups[pg].mux_reg);
  192. reg &= ~(0x3 << pingroups[pg].mux_bit);
  193. reg |= mux << pingroups[pg].mux_bit;
  194. pg_writel(reg, pingroups[pg].mux_bank, pingroups[pg].mux_reg);
  195. spin_unlock_irqrestore(&mux_lock, flags);
  196. return 0;
  197. }
  198. int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate)
  199. {
  200. unsigned long reg;
  201. unsigned long flags;
  202. if (pg < 0 || pg >= pingroup_max)
  203. return -ERANGE;
  204. if (pingroups[pg].tri_reg < 0)
  205. return -EINVAL;
  206. spin_lock_irqsave(&mux_lock, flags);
  207. reg = pg_readl(pingroups[pg].tri_bank, pingroups[pg].tri_reg);
  208. reg &= ~(0x1 << pingroups[pg].tri_bit);
  209. if (tristate)
  210. reg |= 1 << pingroups[pg].tri_bit;
  211. pg_writel(reg, pingroups[pg].tri_bank, pingroups[pg].tri_reg);
  212. spin_unlock_irqrestore(&mux_lock, flags);
  213. return 0;
  214. }
  215. int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd)
  216. {
  217. unsigned long reg;
  218. unsigned long flags;
  219. if (pg < 0 || pg >= pingroup_max)
  220. return -ERANGE;
  221. if (pingroups[pg].pupd_reg < 0)
  222. return -EINVAL;
  223. if (pupd != TEGRA_PUPD_NORMAL &&
  224. pupd != TEGRA_PUPD_PULL_DOWN &&
  225. pupd != TEGRA_PUPD_PULL_UP)
  226. return -EINVAL;
  227. spin_lock_irqsave(&mux_lock, flags);
  228. reg = pg_readl(pingroups[pg].pupd_bank, pingroups[pg].pupd_reg);
  229. reg &= ~(0x3 << pingroups[pg].pupd_bit);
  230. reg |= pupd << pingroups[pg].pupd_bit;
  231. pg_writel(reg, pingroups[pg].pupd_bank, pingroups[pg].pupd_reg);
  232. spin_unlock_irqrestore(&mux_lock, flags);
  233. return 0;
  234. }
  235. static void tegra_pinmux_config_pingroup(const struct tegra_pingroup_config *config)
  236. {
  237. int pingroup = config->pingroup;
  238. enum tegra_mux_func func = config->func;
  239. enum tegra_pullupdown pupd = config->pupd;
  240. enum tegra_tristate tristate = config->tristate;
  241. int err;
  242. if (pingroups[pingroup].mux_reg >= 0) {
  243. err = tegra_pinmux_set_func(config);
  244. if (err < 0)
  245. pr_err("pinmux: can't set pingroup %s func to %s: %d\n",
  246. pingroup_name(pingroup), func_name(func), err);
  247. }
  248. if (pingroups[pingroup].pupd_reg >= 0) {
  249. err = tegra_pinmux_set_pullupdown(pingroup, pupd);
  250. if (err < 0)
  251. pr_err("pinmux: can't set pingroup %s pullupdown to %s: %d\n",
  252. pingroup_name(pingroup), pupd_name(pupd), err);
  253. }
  254. if (pingroups[pingroup].tri_reg >= 0) {
  255. err = tegra_pinmux_set_tristate(pingroup, tristate);
  256. if (err < 0)
  257. pr_err("pinmux: can't set pingroup %s tristate to %s: %d\n",
  258. pingroup_name(pingroup), tri_name(func), err);
  259. }
  260. }
  261. void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, int len)
  262. {
  263. int i;
  264. for (i = 0; i < len; i++)
  265. tegra_pinmux_config_pingroup(&config[i]);
  266. }
  267. static const char *drive_pinmux_name(int pg)
  268. {
  269. if (pg < 0 || pg >= drive_max)
  270. return "<UNKNOWN>";
  271. return drive_pingroups[pg].name;
  272. }
  273. static const char *enable_name(unsigned long val)
  274. {
  275. return val ? "ENABLE" : "DISABLE";
  276. }
  277. static const char *drive_name(unsigned long val)
  278. {
  279. if (val >= TEGRA_MAX_DRIVE)
  280. return "<UNKNOWN>";
  281. return tegra_drive_names[val];
  282. }
  283. static const char *slew_name(unsigned long val)
  284. {
  285. if (val >= TEGRA_MAX_SLEW)
  286. return "<UNKNOWN>";
  287. return tegra_slew_names[val];
  288. }
  289. static int tegra_drive_pinmux_set_hsm(int pg, enum tegra_hsm hsm)
  290. {
  291. unsigned long flags;
  292. u32 reg;
  293. if (pg < 0 || pg >= drive_max)
  294. return -ERANGE;
  295. if (hsm != TEGRA_HSM_ENABLE && hsm != TEGRA_HSM_DISABLE)
  296. return -EINVAL;
  297. spin_lock_irqsave(&mux_lock, flags);
  298. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  299. if (hsm == TEGRA_HSM_ENABLE)
  300. reg |= (1 << 2);
  301. else
  302. reg &= ~(1 << 2);
  303. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  304. spin_unlock_irqrestore(&mux_lock, flags);
  305. return 0;
  306. }
  307. static int tegra_drive_pinmux_set_schmitt(int pg, enum tegra_schmitt schmitt)
  308. {
  309. unsigned long flags;
  310. u32 reg;
  311. if (pg < 0 || pg >= drive_max)
  312. return -ERANGE;
  313. if (schmitt != TEGRA_SCHMITT_ENABLE && schmitt != TEGRA_SCHMITT_DISABLE)
  314. return -EINVAL;
  315. spin_lock_irqsave(&mux_lock, flags);
  316. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  317. if (schmitt == TEGRA_SCHMITT_ENABLE)
  318. reg |= (1 << 3);
  319. else
  320. reg &= ~(1 << 3);
  321. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  322. spin_unlock_irqrestore(&mux_lock, flags);
  323. return 0;
  324. }
  325. static int tegra_drive_pinmux_set_drive(int pg, enum tegra_drive drive)
  326. {
  327. unsigned long flags;
  328. u32 reg;
  329. if (pg < 0 || pg >= drive_max)
  330. return -ERANGE;
  331. if (drive < 0 || drive >= TEGRA_MAX_DRIVE)
  332. return -EINVAL;
  333. spin_lock_irqsave(&mux_lock, flags);
  334. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  335. reg &= ~(0x3 << 4);
  336. reg |= drive << 4;
  337. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  338. spin_unlock_irqrestore(&mux_lock, flags);
  339. return 0;
  340. }
  341. static int tegra_drive_pinmux_set_pull_down(int pg,
  342. enum tegra_pull_strength pull_down)
  343. {
  344. unsigned long flags;
  345. u32 reg;
  346. if (pg < 0 || pg >= drive_max)
  347. return -ERANGE;
  348. if (pull_down < 0 || pull_down >= TEGRA_MAX_PULL)
  349. return -EINVAL;
  350. spin_lock_irqsave(&mux_lock, flags);
  351. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  352. reg &= ~(0x1f << 12);
  353. reg |= pull_down << 12;
  354. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  355. spin_unlock_irqrestore(&mux_lock, flags);
  356. return 0;
  357. }
  358. static int tegra_drive_pinmux_set_pull_up(int pg,
  359. enum tegra_pull_strength pull_up)
  360. {
  361. unsigned long flags;
  362. u32 reg;
  363. if (pg < 0 || pg >= drive_max)
  364. return -ERANGE;
  365. if (pull_up < 0 || pull_up >= TEGRA_MAX_PULL)
  366. return -EINVAL;
  367. spin_lock_irqsave(&mux_lock, flags);
  368. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  369. reg &= ~(0x1f << 12);
  370. reg |= pull_up << 12;
  371. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  372. spin_unlock_irqrestore(&mux_lock, flags);
  373. return 0;
  374. }
  375. static int tegra_drive_pinmux_set_slew_rising(int pg,
  376. enum tegra_slew slew_rising)
  377. {
  378. unsigned long flags;
  379. u32 reg;
  380. if (pg < 0 || pg >= drive_max)
  381. return -ERANGE;
  382. if (slew_rising < 0 || slew_rising >= TEGRA_MAX_SLEW)
  383. return -EINVAL;
  384. spin_lock_irqsave(&mux_lock, flags);
  385. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  386. reg &= ~(0x3 << 28);
  387. reg |= slew_rising << 28;
  388. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  389. spin_unlock_irqrestore(&mux_lock, flags);
  390. return 0;
  391. }
  392. static int tegra_drive_pinmux_set_slew_falling(int pg,
  393. enum tegra_slew slew_falling)
  394. {
  395. unsigned long flags;
  396. u32 reg;
  397. if (pg < 0 || pg >= drive_max)
  398. return -ERANGE;
  399. if (slew_falling < 0 || slew_falling >= TEGRA_MAX_SLEW)
  400. return -EINVAL;
  401. spin_lock_irqsave(&mux_lock, flags);
  402. reg = pg_readl(drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  403. reg &= ~(0x3 << 30);
  404. reg |= slew_falling << 30;
  405. pg_writel(reg, drive_pingroups[pg].reg_bank, drive_pingroups[pg].reg);
  406. spin_unlock_irqrestore(&mux_lock, flags);
  407. return 0;
  408. }
  409. static void tegra_drive_pinmux_config_pingroup(int pingroup,
  410. enum tegra_hsm hsm,
  411. enum tegra_schmitt schmitt,
  412. enum tegra_drive drive,
  413. enum tegra_pull_strength pull_down,
  414. enum tegra_pull_strength pull_up,
  415. enum tegra_slew slew_rising,
  416. enum tegra_slew slew_falling)
  417. {
  418. int err;
  419. err = tegra_drive_pinmux_set_hsm(pingroup, hsm);
  420. if (err < 0)
  421. pr_err("pinmux: can't set pingroup %s hsm to %s: %d\n",
  422. drive_pinmux_name(pingroup),
  423. enable_name(hsm), err);
  424. err = tegra_drive_pinmux_set_schmitt(pingroup, schmitt);
  425. if (err < 0)
  426. pr_err("pinmux: can't set pingroup %s schmitt to %s: %d\n",
  427. drive_pinmux_name(pingroup),
  428. enable_name(schmitt), err);
  429. err = tegra_drive_pinmux_set_drive(pingroup, drive);
  430. if (err < 0)
  431. pr_err("pinmux: can't set pingroup %s drive to %s: %d\n",
  432. drive_pinmux_name(pingroup),
  433. drive_name(drive), err);
  434. err = tegra_drive_pinmux_set_pull_down(pingroup, pull_down);
  435. if (err < 0)
  436. pr_err("pinmux: can't set pingroup %s pull down to %d: %d\n",
  437. drive_pinmux_name(pingroup),
  438. pull_down, err);
  439. err = tegra_drive_pinmux_set_pull_up(pingroup, pull_up);
  440. if (err < 0)
  441. pr_err("pinmux: can't set pingroup %s pull up to %d: %d\n",
  442. drive_pinmux_name(pingroup),
  443. pull_up, err);
  444. err = tegra_drive_pinmux_set_slew_rising(pingroup, slew_rising);
  445. if (err < 0)
  446. pr_err("pinmux: can't set pingroup %s rising slew to %s: %d\n",
  447. drive_pinmux_name(pingroup),
  448. slew_name(slew_rising), err);
  449. err = tegra_drive_pinmux_set_slew_falling(pingroup, slew_falling);
  450. if (err < 0)
  451. pr_err("pinmux: can't set pingroup %s falling slew to %s: %d\n",
  452. drive_pinmux_name(pingroup),
  453. slew_name(slew_falling), err);
  454. }
  455. void tegra_drive_pinmux_config_table(struct tegra_drive_pingroup_config *config,
  456. int len)
  457. {
  458. int i;
  459. for (i = 0; i < len; i++)
  460. tegra_drive_pinmux_config_pingroup(config[i].pingroup,
  461. config[i].hsm,
  462. config[i].schmitt,
  463. config[i].drive,
  464. config[i].pull_down,
  465. config[i].pull_up,
  466. config[i].slew_rising,
  467. config[i].slew_falling);
  468. }
  469. void tegra_pinmux_set_safe_pinmux_table(const struct tegra_pingroup_config *config,
  470. int len)
  471. {
  472. int i;
  473. struct tegra_pingroup_config c;
  474. for (i = 0; i < len; i++) {
  475. int err;
  476. c = config[i];
  477. if (c.pingroup < 0 || c.pingroup >= pingroup_max) {
  478. WARN_ON(1);
  479. continue;
  480. }
  481. c.func = pingroups[c.pingroup].func_safe;
  482. err = tegra_pinmux_set_func(&c);
  483. if (err < 0)
  484. pr_err("%s: tegra_pinmux_set_func returned %d setting "
  485. "%s to %s\n", __func__, err,
  486. pingroup_name(c.pingroup), func_name(c.func));
  487. }
  488. }
  489. void tegra_pinmux_config_pinmux_table(const struct tegra_pingroup_config *config,
  490. int len)
  491. {
  492. int i;
  493. for (i = 0; i < len; i++) {
  494. int err;
  495. if (config[i].pingroup < 0 ||
  496. config[i].pingroup >= pingroup_max) {
  497. WARN_ON(1);
  498. continue;
  499. }
  500. err = tegra_pinmux_set_func(&config[i]);
  501. if (err < 0)
  502. pr_err("%s: tegra_pinmux_set_func returned %d setting "
  503. "%s to %s\n", __func__, err,
  504. pingroup_name(config[i].pingroup),
  505. func_name(config[i].func));
  506. }
  507. }
  508. void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *config,
  509. int len, enum tegra_tristate tristate)
  510. {
  511. int i;
  512. int err;
  513. int pingroup;
  514. for (i = 0; i < len; i++) {
  515. pingroup = config[i].pingroup;
  516. if (pingroups[pingroup].tri_reg >= 0) {
  517. err = tegra_pinmux_set_tristate(pingroup, tristate);
  518. if (err < 0)
  519. pr_err("pinmux: can't set pingroup %s tristate"
  520. " to %s: %d\n", pingroup_name(pingroup),
  521. tri_name(tristate), err);
  522. }
  523. }
  524. }
  525. void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config,
  526. int len, enum tegra_pullupdown pupd)
  527. {
  528. int i;
  529. int err;
  530. int pingroup;
  531. for (i = 0; i < len; i++) {
  532. pingroup = config[i].pingroup;
  533. if (pingroups[pingroup].pupd_reg >= 0) {
  534. err = tegra_pinmux_set_pullupdown(pingroup, pupd);
  535. if (err < 0)
  536. pr_err("pinmux: can't set pingroup %s pullupdown"
  537. " to %s: %d\n", pingroup_name(pingroup),
  538. pupd_name(pupd), err);
  539. }
  540. }
  541. }
  542. static struct of_device_id tegra_pinmux_of_match[] __devinitdata = {
  543. { .compatible = "nvidia,tegra20-pinmux", tegra20_pinmux_init },
  544. { },
  545. };
  546. static int __devinit tegra_pinmux_probe(struct platform_device *pdev)
  547. {
  548. struct resource *res;
  549. int i;
  550. int config_bad = 0;
  551. const struct of_device_id *match;
  552. match = of_match_device(tegra_pinmux_of_match, &pdev->dev);
  553. if (match)
  554. ((pinmux_init)(match->data))(&pingroups, &pingroup_max,
  555. &drive_pingroups, &drive_max);
  556. #ifdef CONFIG_ARCH_TEGRA_2x_SOC
  557. else
  558. /* no device tree available, so we must be on tegra20 */
  559. tegra20_pinmux_init(&pingroups, &pingroup_max,
  560. &drive_pingroups, &drive_max);
  561. #else
  562. pr_warn("non Tegra20 platform requires pinmux devicetree node\n");
  563. #endif
  564. for (i = 0; ; i++) {
  565. res = platform_get_resource(pdev, IORESOURCE_MEM, i);
  566. if (!res)
  567. break;
  568. }
  569. nbanks = i;
  570. for (i = 0; i < pingroup_max; i++) {
  571. if (pingroups[i].tri_bank >= nbanks) {
  572. dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i);
  573. config_bad = 1;
  574. }
  575. if (pingroups[i].mux_bank >= nbanks) {
  576. dev_err(&pdev->dev, "pingroup %d: bad mux_bank\n", i);
  577. config_bad = 1;
  578. }
  579. if (pingroups[i].pupd_bank >= nbanks) {
  580. dev_err(&pdev->dev, "pingroup %d: bad pupd_bank\n", i);
  581. config_bad = 1;
  582. }
  583. }
  584. for (i = 0; i < drive_max; i++) {
  585. if (drive_pingroups[i].reg_bank >= nbanks) {
  586. dev_err(&pdev->dev,
  587. "drive pingroup %d: bad reg_bank\n", i);
  588. config_bad = 1;
  589. }
  590. }
  591. if (config_bad)
  592. return -ENODEV;
  593. regs = devm_kzalloc(&pdev->dev, nbanks * sizeof(*regs), GFP_KERNEL);
  594. if (!regs) {
  595. dev_err(&pdev->dev, "Can't alloc regs pointer\n");
  596. return -ENODEV;
  597. }
  598. for (i = 0; i < nbanks; i++) {
  599. res = platform_get_resource(pdev, IORESOURCE_MEM, i);
  600. if (!res) {
  601. dev_err(&pdev->dev, "Missing MEM resource\n");
  602. return -ENODEV;
  603. }
  604. if (!devm_request_mem_region(&pdev->dev, res->start,
  605. resource_size(res),
  606. dev_name(&pdev->dev))) {
  607. dev_err(&pdev->dev,
  608. "Couldn't request MEM resource %d\n", i);
  609. return -ENODEV;
  610. }
  611. regs[i] = devm_ioremap(&pdev->dev, res->start,
  612. resource_size(res));
  613. if (!regs) {
  614. dev_err(&pdev->dev, "Couldn't ioremap regs %d\n", i);
  615. return -ENODEV;
  616. }
  617. }
  618. return 0;
  619. }
  620. static struct platform_driver tegra_pinmux_driver = {
  621. .driver = {
  622. .name = "tegra-pinmux",
  623. .owner = THIS_MODULE,
  624. .of_match_table = tegra_pinmux_of_match,
  625. },
  626. .probe = tegra_pinmux_probe,
  627. };
  628. static int __init tegra_pinmux_init(void)
  629. {
  630. return platform_driver_register(&tegra_pinmux_driver);
  631. }
  632. postcore_initcall(tegra_pinmux_init);
  633. #ifdef CONFIG_DEBUG_FS
  634. #include <linux/debugfs.h>
  635. #include <linux/seq_file.h>
  636. static void dbg_pad_field(struct seq_file *s, int len)
  637. {
  638. seq_putc(s, ',');
  639. while (len-- > -1)
  640. seq_putc(s, ' ');
  641. }
  642. static int dbg_pinmux_show(struct seq_file *s, void *unused)
  643. {
  644. int i;
  645. int len;
  646. for (i = 0; i < pingroup_max; i++) {
  647. unsigned long reg;
  648. unsigned long tri;
  649. unsigned long mux;
  650. unsigned long pupd;
  651. seq_printf(s, "\t{TEGRA_PINGROUP_%s", pingroups[i].name);
  652. len = strlen(pingroups[i].name);
  653. dbg_pad_field(s, 5 - len);
  654. if (pingroups[i].mux_reg < 0) {
  655. seq_printf(s, "TEGRA_MUX_NONE");
  656. len = strlen("NONE");
  657. } else {
  658. reg = pg_readl(pingroups[i].mux_bank,
  659. pingroups[i].mux_reg);
  660. mux = (reg >> pingroups[i].mux_bit) & 0x3;
  661. if (pingroups[i].funcs[mux] == TEGRA_MUX_RSVD) {
  662. seq_printf(s, "TEGRA_MUX_RSVD%1lu", mux+1);
  663. len = 5;
  664. } else {
  665. seq_printf(s, "TEGRA_MUX_%s",
  666. tegra_mux_names[pingroups[i].funcs[mux]]);
  667. len = strlen(tegra_mux_names[pingroups[i].funcs[mux]]);
  668. }
  669. }
  670. dbg_pad_field(s, 13-len);
  671. if (pingroups[i].pupd_reg < 0) {
  672. seq_printf(s, "TEGRA_PUPD_NORMAL");
  673. len = strlen("NORMAL");
  674. } else {
  675. reg = pg_readl(pingroups[i].pupd_bank,
  676. pingroups[i].pupd_reg);
  677. pupd = (reg >> pingroups[i].pupd_bit) & 0x3;
  678. seq_printf(s, "TEGRA_PUPD_%s", pupd_name(pupd));
  679. len = strlen(pupd_name(pupd));
  680. }
  681. dbg_pad_field(s, 9 - len);
  682. if (pingroups[i].tri_reg < 0) {
  683. seq_printf(s, "TEGRA_TRI_NORMAL");
  684. } else {
  685. reg = pg_readl(pingroups[i].tri_bank,
  686. pingroups[i].tri_reg);
  687. tri = (reg >> pingroups[i].tri_bit) & 0x1;
  688. seq_printf(s, "TEGRA_TRI_%s", tri_name(tri));
  689. }
  690. seq_printf(s, "},\n");
  691. }
  692. return 0;
  693. }
  694. static int dbg_pinmux_open(struct inode *inode, struct file *file)
  695. {
  696. return single_open(file, dbg_pinmux_show, &inode->i_private);
  697. }
  698. static const struct file_operations debug_fops = {
  699. .open = dbg_pinmux_open,
  700. .read = seq_read,
  701. .llseek = seq_lseek,
  702. .release = single_release,
  703. };
  704. static int dbg_drive_pinmux_show(struct seq_file *s, void *unused)
  705. {
  706. int i;
  707. int len;
  708. for (i = 0; i < drive_max; i++) {
  709. u32 reg;
  710. seq_printf(s, "\t{TEGRA_DRIVE_PINGROUP_%s",
  711. drive_pingroups[i].name);
  712. len = strlen(drive_pingroups[i].name);
  713. dbg_pad_field(s, 7 - len);
  714. reg = pg_readl(drive_pingroups[i].reg_bank,
  715. drive_pingroups[i].reg);
  716. if (HSM_EN(reg)) {
  717. seq_printf(s, "TEGRA_HSM_ENABLE");
  718. len = 16;
  719. } else {
  720. seq_printf(s, "TEGRA_HSM_DISABLE");
  721. len = 17;
  722. }
  723. dbg_pad_field(s, 17 - len);
  724. if (SCHMT_EN(reg)) {
  725. seq_printf(s, "TEGRA_SCHMITT_ENABLE");
  726. len = 21;
  727. } else {
  728. seq_printf(s, "TEGRA_SCHMITT_DISABLE");
  729. len = 22;
  730. }
  731. dbg_pad_field(s, 22 - len);
  732. seq_printf(s, "TEGRA_DRIVE_%s", drive_name(LPMD(reg)));
  733. len = strlen(drive_name(LPMD(reg)));
  734. dbg_pad_field(s, 5 - len);
  735. seq_printf(s, "TEGRA_PULL_%d", DRVDN(reg));
  736. len = DRVDN(reg) < 10 ? 1 : 2;
  737. dbg_pad_field(s, 2 - len);
  738. seq_printf(s, "TEGRA_PULL_%d", DRVUP(reg));
  739. len = DRVUP(reg) < 10 ? 1 : 2;
  740. dbg_pad_field(s, 2 - len);
  741. seq_printf(s, "TEGRA_SLEW_%s", slew_name(SLWR(reg)));
  742. len = strlen(slew_name(SLWR(reg)));
  743. dbg_pad_field(s, 7 - len);
  744. seq_printf(s, "TEGRA_SLEW_%s", slew_name(SLWF(reg)));
  745. seq_printf(s, "},\n");
  746. }
  747. return 0;
  748. }
  749. static int dbg_drive_pinmux_open(struct inode *inode, struct file *file)
  750. {
  751. return single_open(file, dbg_drive_pinmux_show, &inode->i_private);
  752. }
  753. static const struct file_operations debug_drive_fops = {
  754. .open = dbg_drive_pinmux_open,
  755. .read = seq_read,
  756. .llseek = seq_lseek,
  757. .release = single_release,
  758. };
  759. static int __init tegra_pinmux_debuginit(void)
  760. {
  761. (void) debugfs_create_file("tegra_pinmux", S_IRUGO,
  762. NULL, NULL, &debug_fops);
  763. (void) debugfs_create_file("tegra_pinmux_drive", S_IRUGO,
  764. NULL, NULL, &debug_drive_fops);
  765. return 0;
  766. }
  767. late_initcall(tegra_pinmux_debuginit);
  768. #endif