mt_gpio_debug.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. /******************************************************************************
  2. * mt_gpio_debug.c - MTKLinux GPIO Device Driver
  3. *
  4. * Copyright 2008-2009 MediaTek Co.,Ltd.
  5. *
  6. * DESCRIPTION:
  7. * This file provid the other drivers GPIO debug functions
  8. *
  9. ******************************************************************************/
  10. #include <linux/slab.h>
  11. #include <6735_gpio.h>
  12. #include <mt-plat/mt_gpio.h>
  13. #include <mt-plat/mt_gpio_core.h>
  14. /*----------------------------------------------------------------------------*/
  15. typedef struct { /*FIXME: check GPIO spec */
  16. unsigned int no:16;
  17. unsigned int mode:3;
  18. unsigned int pullsel:1;
  19. unsigned int din:1;
  20. unsigned int dout:1;
  21. unsigned int pullen:1;
  22. unsigned int dir:1;
  23. /* unsigned int dinv : 1;*/
  24. unsigned int ies:1;
  25. unsigned int _align:7;
  26. } GPIO_CFG;
  27. /* #define MAX_GPIO_REG_BITS 16 */
  28. /* #define MAX_GPIO_MODE_PER_REG 5 */
  29. /* #define GPIO_MODE_BITS 3 */
  30. /******************************************************************************
  31. *clock out module
  32. *******************************************************************************/
  33. int mt_set_clock_output(unsigned long num, unsigned long src, unsigned long div)
  34. {
  35. GPIOERR("GPIO CLKM module not be implement any more!\n");
  36. return RSUCCESS;
  37. }
  38. int mt_get_clock_output(unsigned long num, unsigned long *src, unsigned long *div)
  39. {
  40. GPIOERR("GPIO CLKM module not be implement any more!\n");
  41. return RSUCCESS;
  42. }
  43. /*****************************************************************************/
  44. /* sysfs operation */
  45. /*****************************************************************************/
  46. void mt_gpio_self_test(void)
  47. {
  48. int i, val;
  49. s32 res = 0;
  50. s32 old;
  51. for (i = 0; i < MT_GPIO_EXT_MAX; i++) {
  52. GPIOMSG("GPIO-%3d test\n", i);
  53. /*direction test */
  54. old = mt_get_gpio_dir(i);
  55. if (old == 0 || old == 1) {
  56. GPIOLOG(" dir old = %d\n", old);
  57. } else {
  58. GPIOERR(" test dir fail: %d\n", old);
  59. break;
  60. }
  61. if (mt_set_gpio_dir(i, GPIO_DIR_OUT) != RSUCCESS) {
  62. GPIOERR(" set dir out fail: %d\n", res);
  63. break;
  64. } else if (mt_get_gpio_dir(i) != GPIO_DIR_OUT) {
  65. GPIOERR(" get dir out fail: %d\n", res);
  66. break;
  67. }
  68. if (mt_set_gpio_dir(i, GPIO_DIR_IN) != RSUCCESS) {
  69. GPIOERR(" set dir in fail: %d\n", res);
  70. break;
  71. } else if (mt_get_gpio_dir(i) != GPIO_DIR_IN) {
  72. GPIOERR(" get dir in fail: %d\n", res);
  73. break;
  74. }
  75. if (mt_set_gpio_dir(i, old) != RSUCCESS) {
  76. GPIOERR(" restore dir fail: %d\n", res);
  77. break;
  78. }
  79. for (val = 0; val < GPIO_PULL_EN_MAX; val++) {
  80. if (mt_set_gpio_pull_enable(i, val) != RSUCCESS) {
  81. GPIOERR(" set pullen[%d] fail: %d\n", val, res);
  82. break;
  83. } else if (mt_get_gpio_pull_enable(i) != val) {
  84. GPIOERR(" get pullen[%d] fail: %d\n", val, res);
  85. break;
  86. }
  87. }
  88. if (mt_set_gpio_pull_enable(i, old) != RSUCCESS) {
  89. GPIOERR(" restore pullen fail: %d\n", res);
  90. break;
  91. }
  92. /*pull select test */
  93. old = mt_get_gpio_pull_select(i);
  94. if (old == 0 || old == 1)
  95. GPIOLOG(" pullsel old = %d\n", old);
  96. else {
  97. GPIOERR(" pullsel fail: %d\n", old);
  98. break;
  99. }
  100. for (val = 0; val < GPIO_PULL_MAX; val++) {
  101. if (mt_set_gpio_pull_select(i, val) != RSUCCESS) {
  102. GPIOERR(" set pullsel[%d] fail: %d\n", val, res);
  103. break;
  104. } else if (mt_get_gpio_pull_select(i) != val) {
  105. GPIOERR(" get pullsel[%d] fail: %d\n", val, res);
  106. break;
  107. }
  108. }
  109. if (mt_set_gpio_pull_select(i, old) != RSUCCESS) {
  110. GPIOERR(" restore pullsel fail: %d\n", res);
  111. break;
  112. }
  113. /*data inversion */
  114. old = mt_get_gpio_inversion(i);
  115. if (old == 0 || old == 1)
  116. GPIOLOG(" inv old = %d\n", old);
  117. else {
  118. GPIOERR(" inv fail: %d\n", old);
  119. break;
  120. }
  121. for (val = 0; val < GPIO_DATA_INV_MAX; val++) {
  122. if (mt_set_gpio_inversion(i, val) != RSUCCESS) {
  123. GPIOERR(" set inv[%d] fail: %d\n", val, res);
  124. break;
  125. } else if (mt_get_gpio_inversion(i) != val) {
  126. GPIOERR(" get inv[%d] fail: %d\n", val, res);
  127. break;
  128. }
  129. }
  130. if (mt_set_gpio_inversion(i, old) != RSUCCESS) {
  131. GPIOERR(" restore inv fail: %d\n", res);
  132. break;
  133. }
  134. /*mode control */
  135. /* if((i<=GPIOEXT6) || (i >= GPIOEXT9)){ */
  136. old = mt_get_gpio_mode(i);
  137. if ((old >= GPIO_MODE_00) && (val < GPIO_MODE_MAX)) {
  138. GPIOLOG(" mode old = %d\n", old);
  139. } else {
  140. GPIOERR(" get mode fail: %d\n", old);
  141. break;
  142. }
  143. for (val = 0; val < GPIO_MODE_MAX; val++) {
  144. if (mt_set_gpio_mode(i, val) != RSUCCESS) {
  145. GPIOERR("set mode[%d] fail: %d\n", val, res);
  146. break;
  147. } else if (mt_get_gpio_mode(i) != val) {
  148. GPIOERR("get mode[%d] fail: %d\n", val, res);
  149. break;
  150. }
  151. }
  152. if ((res == mt_set_gpio_mode(i, old)) != RSUCCESS) {
  153. GPIOERR(" restore mode fail: %d\n", res);
  154. break;
  155. }
  156. /* } */
  157. }
  158. GPIOLOG("GPIO test done\n");
  159. }
  160. /*----------------------------------------------------------------------------
  161. void mt_gpio_load_ext(GPIOEXT_REGS *regs)
  162. {
  163. GPIOEXT_REGS *pReg = (GPIOEXT_REGS*)(GPIOEXT_BASE);
  164. int idx;
  165. if (!regs)
  166. GPIOERR("%s: null pointer\n", __func__);
  167. memset(regs, 0x00, sizeof(*regs));
  168. for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++)
  169. regs->dir[idx].val = GPIOEXT_RD(&pReg->dir[idx]);
  170. for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++)
  171. regs->pullen[idx].val = GPIOEXT_RD(&pReg->pullen[idx]);
  172. for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++)
  173. regs->pullsel[idx].val =GPIOEXT_RD(&pReg->pullsel[idx]);
  174. for (idx = 0; idx < sizeof(pReg->dinv)/sizeof(pReg->dinv[0]); idx++)
  175. regs->dinv[idx].val =GPIOEXT_RD(&pReg->dinv[idx]);
  176. for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++)
  177. regs->dout[idx].val = GPIOEXT_RD(&pReg->dout[idx]);
  178. for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++)
  179. regs->mode[idx].val = GPIOEXT_RD(&pReg->mode[idx]);
  180. for (idx = 0; idx < sizeof(pReg->din)/sizeof(pReg->din[0]); idx++)
  181. regs->din[idx].val = GPIOEXT_RD(&pReg->din[idx]);
  182. }
  183. EXPORT_SYMBOL(mt_gpio_load_ext);
  184. ----------------------------------------------------------------------------*/
  185. void mt_gpio_load_base(GPIO_REGS *regs)
  186. {
  187. GPIO_REGS *pReg = (GPIO_REGS *) (GPIO_BASE);
  188. int idx;
  189. if (!regs)
  190. GPIOERR("%s: null pointer\n", __func__);
  191. memset(regs, 0x00, sizeof(*regs));
  192. for (idx = 0; idx < sizeof(pReg->dir) / sizeof(pReg->dir[0]); idx++)
  193. regs->dir[idx].val = __raw_readl(&pReg->dir[idx]);
  194. /* for (idx = 0; idx < sizeof(pReg->ies)/sizeof(pReg->ies[0]); idx++) */
  195. /* regs->ies[idx].val = __raw_readl(&pReg->ies[idx]); */
  196. /* for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++) */
  197. /* regs->pullen[idx].val = __raw_readl(&pReg->pullen[idx]); */
  198. /* for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++) */
  199. /* regs->pullsel[idx].val =__raw_readl(&pReg->pullsel[idx]); */
  200. /* for (idx = 0; idx < sizeof(pReg->dinv)/sizeof(pReg->dinv[0]); idx++) */
  201. /* regs->dinv[idx].val =__raw_readl(&pReg->dinv[idx]); */
  202. for (idx = 0; idx < sizeof(pReg->dout) / sizeof(pReg->dout[0]); idx++)
  203. regs->dout[idx].val = __raw_readl(&pReg->dout[idx]);
  204. for (idx = 0; idx < sizeof(pReg->mode) / sizeof(pReg->mode[0]); idx++)
  205. regs->mode[idx].val = __raw_readl(&pReg->mode[idx]);
  206. for (idx = 0; idx < sizeof(pReg->din) / sizeof(pReg->din[0]); idx++)
  207. regs->din[idx].val = __raw_readl(&pReg->din[idx]);
  208. }
  209. /* EXPORT_SYMBOL(mt_gpio_load_base); */
  210. /*----------------------------------------------------------------------------
  211. void mt_gpio_dump_ext( GPIOEXT_REGS *regs)
  212. {
  213. GPIOEXT_REGS *cur = NULL ;
  214. int idx;
  215. GPIOMSG("%s\n", __func__);
  216. //if arg is null, load & dump; otherwise, dump only
  217. if (regs == NULL) {
  218. cur = kzalloc(sizeof(*cur), GFP_KERNEL);
  219. if (cur == NULL) {
  220. GPIOERR("GPIO extend null pointer\n");
  221. return;
  222. }
  223. regs = cur;
  224. mt_gpio_load_ext(cur);
  225. GPIOMSG("dump current: %p\n", regs);
  226. } else {
  227. GPIOMSG("dump %p ...\n", regs);
  228. }
  229. GPIOMSG("\nGPIO extend-------------------------------------------------------------------\n");
  230. GPIOMSG("---# dir #-----------------------------------------------------------------\n");
  231. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->dir[0])-(void *)regs);
  232. for (idx = 0; idx < sizeof(regs->dir)/sizeof(regs->dir[0]); idx++) {
  233. GPIOMSG("0x%04X ", regs->dir[idx].val);
  234. if (7 == (idx % 8)) GPIOMSG("\n");
  235. }
  236. //GPIOMSG("\n---# ies #-----------------------------------------------------------------\n");
  237. //GPIOMSG("Offset 0x%04X\n",(void *)(&regs->ies[0]);
  238. //for (idx = 0; idx < sizeof(regs->ies)/sizeof(regs->ies[0]); idx++) {
  239. // GPIOMSG("0x%04X ", regs->ies[idx].val);
  240. // if (7 == (idx % 8)) GPIOMSG("\n");
  241. //}
  242. GPIOMSG("\n---# pullen #--------------------------------------------------------------\n");
  243. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->pullen[0])-(void *)regs);
  244. for (idx = 0; idx < sizeof(regs->pullen)/sizeof(regs->pullen[0]); idx++) {
  245. GPIOMSG("0x%04X ", regs->pullen[idx].val);
  246. if (7 == (idx % 8)) GPIOMSG("\n");
  247. }
  248. GPIOMSG("\n---# pullsel #-------------------------------------------------------------\n");
  249. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->pullsel[0])-(void *)regs);
  250. for (idx = 0; idx < sizeof(regs->pullsel)/sizeof(regs->pullsel[0]); idx++) {
  251. GPIOMSG("0x%04X ", regs->pullsel[idx].val);
  252. if (7 == (idx % 8)) GPIOMSG("\n");
  253. }
  254. GPIOMSG("\n---# dinv #----------------------------------------------------------------\n");
  255. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->dinv[0])-(void *)regs);
  256. for (idx = 0; idx < sizeof(regs->dinv)/sizeof(regs->dinv[0]); idx++) {
  257. GPIOMSG("0x%04X ", regs->dinv[idx].val);
  258. if (7 == (idx % 8)) GPIOMSG("\n");
  259. }
  260. GPIOMSG("\n---# dout #----------------------------------------------------------------\n");
  261. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->dout[0])-(void *)regs);
  262. for (idx = 0; idx < sizeof(regs->dout)/sizeof(regs->dout[0]); idx++) {
  263. GPIOMSG("0x%04X ", regs->dout[idx].val);
  264. if (7 == (idx % 8)) GPIOMSG("\n");
  265. }
  266. GPIOMSG("\n---# din #----------------------------------------------------------------\n");
  267. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->din[0])-(void *)regs);
  268. for (idx = 0; idx < sizeof(regs->din)/sizeof(regs->din[0]); idx++) {
  269. GPIOMSG("0x%04X ", regs->din[idx].val);
  270. if (7 == (idx % 8)) GPIOMSG("\n");
  271. }
  272. GPIOMSG("\n---# mode #----------------------------------------------------------------\n");
  273. GPIOMSG("Offset 0x%04X\n",(void *)(&regs->mode[0])-(void *)regs);
  274. for (idx = 0; idx < sizeof(regs->mode)/sizeof(regs->mode[0]); idx++) {
  275. GPIOMSG("0x%04X ", regs->mode[idx].val);
  276. if (7 == (idx % 8)) GPIOMSG("\n");
  277. }
  278. GPIOMSG("\n---------------------------------------------------------------------------\n");
  279. if (cur != NULL) {
  280. kfree(cur);
  281. }
  282. }
  283. ----------------------------------------------------------------------------*/
  284. void mt_gpio_dump_base(GPIO_REGS *regs)
  285. {
  286. GPIO_REGS *cur = NULL;
  287. int idx;
  288. GPIOMSG("%s\n", __func__);
  289. if (regs == NULL) { /*if arg is null, load & dump; otherwise, dump only */
  290. cur = kzalloc(sizeof(*cur), GFP_KERNEL);
  291. if (cur == NULL) {
  292. GPIOERR("null pointer\n");
  293. return;
  294. }
  295. regs = cur;
  296. mt_gpio_load_base(regs);
  297. GPIOMSG("dump current: %p\n", regs);
  298. } else {
  299. GPIOMSG("dump %p ...\n", regs);
  300. }
  301. GPIOMSG("---# dir #-----------------------------------------------------------------\n");
  302. #ifdef CONFIG_64BIT
  303. GPIOMSG("Offset 0x%lx\n", (void *)(&regs->dir[0]) - (void *)regs);
  304. #else
  305. GPIOMSG("Offset 0x%04X\n", (void *)(&regs->dir[0]) - (void *)regs);
  306. #endif
  307. for (idx = 0; idx < sizeof(regs->dir) / sizeof(regs->dir[0]); idx++) {
  308. GPIOMSG("0x%04X ", regs->dir[idx].val);
  309. if (7 == (idx % 8))
  310. GPIOMSG("\n");
  311. }
  312. /* GPIOMSG("\n---# ies #-----------------------------------------------------------------\n"); */
  313. /* GPIOMSG("Offset 0x%04X\n",(void *)(&regs->ies[0])-(void *)regs); */
  314. /* for (idx = 0; idx < sizeof(regs->ies)/sizeof(regs->ies[0]); idx++) { */
  315. /* GPIOMSG("0x%04X ", regs->ies[idx].val); */
  316. /* if (7 == (idx % 8)) GPIOMSG("\n"); */
  317. /* } */
  318. /* GPIOMSG("\n---# pullen #--------------------------------------------------------------\n"); */
  319. /* GPIOMSG("Offset 0x%04X\n",(void *)(&regs->pullen[0])-(void *)regs); */
  320. /* for (idx = 0; idx < sizeof(regs->pullen)/sizeof(regs->pullen[0]); idx++) { */
  321. /* GPIOMSG("0x%04X ", regs->pullen[idx].val); */
  322. /* if (7 == (idx % 8)) GPIOMSG("\n"); */
  323. /* } */
  324. /* GPIOMSG("\n---# pullsel #-------------------------------------------------------------\n"); */
  325. /* GPIOMSG("Offset 0x%04X\n",(void *)(&regs->pullsel[0])-(void *)regs); */
  326. /* for (idx = 0; idx < sizeof(regs->pullsel)/sizeof(regs->pullsel[0]); idx++) { */
  327. /* GPIOMSG("0x%04X ", regs->pullsel[idx].val); */
  328. /* if (7 == (idx % 8)) GPIOMSG("\n"); */
  329. /* } */
  330. /* GPIOMSG("\n---# dinv #----------------------------------------------------------------\n"); */
  331. /* GPIOMSG("Offset 0x%04X\n",(void *)(&regs->dinv[0])-(void *)regs); */
  332. /* for (idx = 0; idx < sizeof(regs->dinv)/sizeof(regs->dinv[0]); idx++) { */
  333. /* GPIOMSG("0x%04X ", regs->dinv[idx].val); */
  334. /* if (7 == (idx % 8)) GPIOMSG("\n"); */
  335. /* } */
  336. GPIOMSG("\n---# dout #----------------------------------------------------------------\n");
  337. #ifdef CONFIG_64BIT
  338. GPIOMSG("Offset 0x%lx\n", (void *)(&regs->dout[0]) - (void *)regs);
  339. #else
  340. GPIOMSG("Offset 0x%04X\n", (void *)(&regs->dout[0]) - (void *)regs);
  341. #endif
  342. for (idx = 0; idx < sizeof(regs->dout) / sizeof(regs->dout[0]); idx++) {
  343. GPIOMSG("0x%04X ", regs->dout[idx].val);
  344. if (7 == (idx % 8))
  345. GPIOMSG("\n");
  346. }
  347. GPIOMSG("\n---# din #----------------------------------------------------------------\n");
  348. #ifdef CONFIG_64BIT
  349. GPIOMSG("Offset 0x%lx\n", (void *)(&regs->din[0]) - (void *)regs);
  350. #else
  351. GPIOMSG("Offset 0x%04X\n", (void *)(&regs->din[0]) - (void *)regs);
  352. #endif
  353. for (idx = 0; idx < sizeof(regs->din) / sizeof(regs->din[0]); idx++) {
  354. GPIOMSG("0x%04X ", regs->din[idx].val);
  355. if (7 == (idx % 8))
  356. GPIOMSG("\n");
  357. }
  358. GPIOMSG("\n---# mode #----------------------------------------------------------------\n");
  359. #ifdef CONFIG_64BIT
  360. GPIOMSG("Offset 0x%lx\n", (void *)(&regs->mode[0]) - (void *)regs);
  361. #else
  362. GPIOMSG("Offset 0x%04X\n", (void *)(&regs->mode[0]) - (void *)regs);
  363. #endif
  364. for (idx = 0; idx < sizeof(regs->mode) / sizeof(regs->mode[0]); idx++) {
  365. GPIOMSG("0x%04X ", regs->mode[idx].val);
  366. if (7 == (idx % 8))
  367. GPIOMSG("\n");
  368. }
  369. GPIOMSG("\n---------------------------------------------------------------------------\n");
  370. if (cur != NULL)
  371. kfree(cur);
  372. }
  373. /*----------------------------------------------------------------------------*/
  374. void mt_gpio_dump(void)
  375. {
  376. mt_gpio_dump_base(NULL);
  377. /* mt_gpio_dump_ext(NULL); */
  378. }
  379. /*----------------------------------------------------------------------------*/
  380. void gpio_dump_regs(void)
  381. {
  382. int idx = 0;
  383. GPIOMSG("PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [IES]\n");
  384. for (idx = MT_GPIO_BASE_START; idx < MT_GPIO_BASE_MAX; idx++) {
  385. GPIOMSG("idx = %3d: %d %d %d %d %d %d %d\n",
  386. idx, mt_get_gpio_mode_base(idx), mt_get_gpio_pull_select_base(idx),
  387. mt_get_gpio_in_base(idx), mt_get_gpio_out_base(idx),
  388. mt_get_gpio_pull_enable_base(idx), mt_get_gpio_dir_base(idx),
  389. mt_get_gpio_ies_base(idx));
  390. }
  391. }
  392. /* EXPORT_SYMBOL(gpio_dump_regs); */
  393. /*----------------------------------------------------------------------------*/
  394. /*
  395. static ssize_t mt_gpio_dump_regs(char *buf, ssize_t bufLen)
  396. {
  397. int idx = 0, len = 0;
  398. char tmp[]="PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [INV] [IES]\n";
  399. len += snprintf(buf+len, bufLen-len, "%s",tmp);
  400. for (idx = 0; idx < MT_GPIO_MAX_PIN; idx++) {
  401. len += snprintf(buf+len, bufLen-len, "%3d:%d%d%d%d%d%d%d%d\n",
  402. idx,mt_get_gpio_mode(idx), mt_get_gpio_pull_select(idx), mt_get_gpio_in(idx),mt_get_gpio_out(idx),
  403. mt_get_gpio_pull_enable(idx),mt_get_gpio_dir(idx),mt_get_gpio_inversion(idx),mt_get_gpio_ies(idx));
  404. }
  405. return len;
  406. }
  407. */
  408. /*---------------------------------------------------------------------------*/
  409. static void mt_gpio_read_pin_base(GPIO_CFG *cfg, int method)
  410. {
  411. if (method == 0) {
  412. GPIO_REGS *cur = (GPIO_REGS *) GPIO_BASE;
  413. u32 mask = (1L << GPIO_MODE_BITS) - 1;
  414. int num, bit;
  415. num = cfg->no / MAX_GPIO_REG_BITS;
  416. bit = cfg->no % MAX_GPIO_REG_BITS;
  417. if (cfg->no < MT_GPIO_BASE_MAX) {
  418. /* cfg->pullsel= (cur->pullsel[num].val & (1L << bit)) ? (1) : (0); */
  419. cfg->din = (cur->din[num].val & (1L << bit)) ? (1) : (0);
  420. cfg->dout = (cur->dout[num].val & (1L << bit)) ? (1) : (0);
  421. /* cfg->pullen = (cur->pullen[num].val & (1L << bit)) ? (1) : (0); */
  422. cfg->dir = (cur->dir[num].val & (1L << bit)) ? (1) : (0);
  423. /* cfg->dinv = (cur->dinv[num].val & (1L << bit)) ? (1) : (0); */
  424. num = cfg->no / MAX_GPIO_MODE_PER_REG;
  425. bit = cfg->no % MAX_GPIO_MODE_PER_REG;
  426. cfg->mode = (cur->mode[num].val >> (GPIO_MODE_BITS * bit)) & mask;
  427. }
  428. } else if (method == 1) {
  429. /* cfg->pullsel= mt_get_gpio_pull_select(cfg->no); */
  430. cfg->din = mt_get_gpio_in(cfg->no);
  431. cfg->dout = mt_get_gpio_out(cfg->no);
  432. /* cfg->pullen = mt_get_gpio_pull_enable(cfg->no); */
  433. cfg->dir = mt_get_gpio_dir(cfg->no);
  434. /* cfg->dinv = mt_get_gpio_inversion(cfg->no); */
  435. /* cfg->ies = mt_get_gpio_ies(cfg->no); */
  436. cfg->mode = mt_get_gpio_mode(cfg->no);
  437. }
  438. }
  439. static ssize_t mt_gpio_dump_addr_base(void)
  440. {
  441. int idx;
  442. GPIO_REGS *reg = (GPIO_REGS *) GPIO_BASE;
  443. GPIOMSG("# direction\n");
  444. for (idx = 0; idx < sizeof(reg->dir) / sizeof(reg->dir[0]); idx++)
  445. GPIOMSG("val[%2d] %p\nset[%2d] %p\nrst[%2d] %p\n", idx, &reg->dir[idx].val, idx,
  446. &reg->dir[idx].set, idx, &reg->dir[idx].rst);
  447. GPIOMSG("# data output\n");
  448. for (idx = 0; idx < sizeof(reg->dout) / sizeof(reg->dout[0]); idx++)
  449. GPIOMSG("val[%2d] %p\nset[%2d] %p\nrst[%2d] %p\n", idx, &reg->dout[idx].val, idx,
  450. &reg->dout[idx].set, idx, &reg->dout[idx].rst);
  451. GPIOMSG("# data input\n");
  452. for (idx = 0; idx < sizeof(reg->din) / sizeof(reg->din[0]); idx++)
  453. GPIOMSG("val[%2d] %p\n", idx, &reg->din[idx].val);
  454. GPIOMSG("# mode\n");
  455. for (idx = 0; idx < sizeof(reg->mode) / sizeof(reg->mode[0]); idx++)
  456. GPIOMSG("val[%2d] %p\nset[%2d] %p\nrst[%2d] %p\n", idx, &reg->mode[idx].val, idx,
  457. &reg->mode[idx].set, idx, &reg->mode[idx].rst);
  458. return 0;
  459. }
  460. /*---------------------------------------------------------------------------
  461. static void mt_gpio_compare_ext(void)
  462. {
  463. int idx;
  464. GPIOEXT_REGS *reg = (GPIOEXT_REGS*)GPIOEXT_BASE;
  465. GPIOEXT_REGS *cur = kzalloc(sizeof(*cur), GFP_KERNEL);
  466. if (!cur)
  467. return;
  468. mt_gpio_load_ext(cur);
  469. for (idx = 0; idx < sizeof(reg->dir)/sizeof(reg->dir[0]); idx++)
  470. if (reg->dir[idx].val != cur->dir[idx].val)
  471. GPIOERR("GPIOEXT mismatch dir[%2d]: %x <> %x\n", idx, reg->dir[idx].val, cur->dir[idx].val);
  472. for (idx = 0; idx < sizeof(reg->pullen)/sizeof(reg->pullen[0]); idx++)
  473. if (reg->pullen[idx].val != cur->pullen[idx].val)
  474. GPIOERR("GPIOEXT mismatch pullen[%2d]: %x <> %x\n", idx, reg->pullen[idx].val, cur->pullen[idx].val);
  475. for (idx = 0; idx < sizeof(reg->pullsel)/sizeof(reg->pullsel[0]); idx++)
  476. if (reg->pullsel[idx].val != cur->pullsel[idx].val)
  477. GPIOERR("GPIOEXT mismatch pullsel[%2d]: %x <> %x\n", idx, reg->pullsel[idx].val, cur->pullsel[idx].val);
  478. for (idx = 0; idx < sizeof(reg->dinv)/sizeof(reg->dinv[0]); idx++)
  479. if (reg->dinv[idx].val != cur->dinv[idx].val)
  480. GPIOERR("GPIOEXT mismatch dinv[%2d]: %x <> %x\n", idx, reg->dinv[idx].val, cur->dinv[idx].val);
  481. for (idx = 0; idx < sizeof(reg->dout)/sizeof(reg->dout[0]); idx++)
  482. if (reg->dout[idx].val != cur->dout[idx].val)
  483. GPIOERR("GPIOEXT mismatch dout[%2d]: %x <> %x\n", idx, reg->dout[idx].val, cur->dout[idx].val);
  484. for (idx = 0; idx < sizeof(reg->din)/sizeof(reg->din[0]); idx++)
  485. if (reg->din[idx].val != cur->din[idx].val)
  486. GPIOERR("GPIOEXT mismatch din[%2d]: %x <> %x\n", idx, reg->din[idx].val, cur->din[idx].val);
  487. for (idx = 0; idx < sizeof(reg->mode)/sizeof(reg->mode[0]); idx++)
  488. if (reg->mode[idx].val != cur->mode[idx].val)
  489. GPIOERR("GPIOEXT mismatch mode[%2d]: %x <> %x\n", idx, reg->mode[idx].val, cur->mode[idx].val);
  490. kfree(cur);
  491. return;
  492. }*/
  493. static ssize_t mt_gpio_compare_base(void)
  494. {
  495. int idx;
  496. GPIO_REGS *reg = (GPIO_REGS *) GPIO_BASE;
  497. GPIO_REGS *cur = kzalloc(sizeof(*cur), GFP_KERNEL);
  498. if (!cur)
  499. return 0;
  500. mt_gpio_load_base(cur);
  501. for (idx = 0; idx < sizeof(reg->dir) / sizeof(reg->dir[0]); idx++)
  502. if (reg->dir[idx].val != cur->dir[idx].val)
  503. GPIOERR("mismatch dir[%2d]: %x <> %x\n", idx, reg->dir[idx].val,
  504. cur->dir[idx].val);
  505. /* for (idx = 0; idx < sizeof(reg->pullen)/sizeof(reg->pullen[0]); idx++) */
  506. /* if (reg->pullen[idx].val != cur->pullen[idx].val) */
  507. /* GPIOERR("mismatch pullen[%2d]: %x <> %x\n", idx, reg->pullen[idx].val, cur->pullen[idx].val); */
  508. /* for (idx = 0; idx < sizeof(reg->pullsel)/sizeof(reg->pullsel[0]); idx++) */
  509. /* if (reg->pullsel[idx].val != cur->pullsel[idx].val) */
  510. /* GPIOERR("mismatch pullsel[%2d]: %x <> %x\n", idx, reg->pullsel[idx].val, cur->pullsel[idx].val); */
  511. /* for (idx = 0; idx < sizeof(reg->dinv)/sizeof(reg->dinv[0]); idx++) */
  512. /* if (reg->dinv[idx].val != cur->dinv[idx].val) */
  513. /* GPIOERR("mismatch dinv[%2d]: %x <> %x\n", idx, reg->dinv[idx].val, cur->dinv[idx].val); */
  514. for (idx = 0; idx < sizeof(reg->dout) / sizeof(reg->dout[0]); idx++)
  515. if (reg->dout[idx].val != cur->dout[idx].val)
  516. GPIOERR("mismatch dout[%2d]: %x <> %x\n", idx, reg->dout[idx].val,
  517. cur->dout[idx].val);
  518. for (idx = 0; idx < sizeof(reg->din) / sizeof(reg->din[0]); idx++)
  519. if (reg->din[idx].val != cur->din[idx].val)
  520. GPIOERR("mismatch din[%2d]: %x <> %x\n", idx, reg->din[idx].val,
  521. cur->din[idx].val);
  522. for (idx = 0; idx < sizeof(reg->mode) / sizeof(reg->mode[0]); idx++)
  523. if (reg->mode[idx].val != cur->mode[idx].val)
  524. GPIOERR("mismatch mode[%2d]: %x <> %x\n", idx, reg->mode[idx].val,
  525. cur->mode[idx].val);
  526. kfree(cur);
  527. return 0;
  528. }
  529. static ssize_t mt_gpio_dump_regs(char *buf, ssize_t bufLen)
  530. {
  531. int idx = 0, len = 0;
  532. #ifdef CONFIG_MTK_FPGA
  533. char tmp[] = "PIN: [DIN] [DOUT] [DIR]\n";
  534. len += snprintf(buf + len, bufLen - len, "%s", tmp);
  535. for (idx = MT_GPIO_BASE_START; idx < MT_GPIO_BASE_MAX; idx++) {
  536. len += snprintf(buf + len, bufLen - len, "%3d:%d%d%d\n",
  537. idx, mt_get_gpio_in_base(idx), mt_get_gpio_out_base(idx),
  538. mt_get_gpio_dir_base(idx));
  539. }
  540. #else
  541. /*char tmp[]="PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [INV] [IES]\n"; */
  542. char tmp[] = "PIN: [MODE] [PULL_SEL] [DIN] [DOUT] [PULL EN] [DIR] [IES] [SMT]\n";
  543. len += snprintf(buf + len, bufLen - len, "%s", tmp);
  544. for (idx = MT_GPIO_BASE_START; idx < MT_GPIO_BASE_MAX; idx++) {
  545. len += snprintf(buf + len, bufLen - len, "%3d:%d%d%d%d%d%d%d%d\n",
  546. idx, mt_get_gpio_mode_base(idx), mt_get_gpio_pull_select_base(idx),
  547. mt_get_gpio_in_base(idx), mt_get_gpio_out_base(idx),
  548. mt_get_gpio_pull_enable_base(idx), mt_get_gpio_dir_base(idx),
  549. mt_get_gpio_ies_base(idx), mt_get_gpio_smt_base(idx));
  550. }
  551. #endif
  552. return len;
  553. }
  554. /*---------------------------------------------------------------------------*/
  555. ssize_t mt_gpio_show_pin(struct device *dev, struct device_attribute *attr, char *buf)
  556. {
  557. return mt_gpio_dump_regs(buf, PAGE_SIZE);
  558. }
  559. ssize_t mt_gpio_store_pin(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  560. {
  561. int pin;
  562. int ret;
  563. #ifdef MTK_MT6306_SUPPORT
  564. int group, on;
  565. #endif
  566. int mode, pullsel, dout, pullen, dir, ies, smt;
  567. u32 num, src, div;
  568. char md_str[128] = "GPIO_MD_TEST";
  569. /* struct mt_gpio_obj *obj = (struct mt_gpio_obj*)dev_get_drvdata(dev); */
  570. if (!strncmp(buf, "-h", 2)) {
  571. GPIOMSG("cat pin #show all pin setting\n");
  572. GPIOMSG("echo -wmode num x > pin #num:pin,x:the mode 0~7\n");
  573. GPIOMSG("echo -wpsel num x > pin #x: 1,pull-up; 0,pull-down\n");
  574. GPIOMSG("echo -wdout num x > pin #x: 1,high; 0, low\n");
  575. GPIOMSG("echo -wpen num x > pin #x: 1,pull enable; 0 pull disable\n");
  576. GPIOMSG("echo -wies num x > pin #x: 1,ies enable; 0 ies disable\n");
  577. GPIOMSG("echo -wdir num x > pin #x: 1, output; 0, input\n");
  578. /*GPIOMSG("echo -wdinv num x > pin #x: 1, inversion enable; 0, disable\n"); */
  579. GPIOMSG("echo -w=num x x x x x x > pin #set all property one time\n");
  580. GPIOMSG("PIN: [MODE] [PSEL] [DIN] [DOUT] [PEN] [DIR] [IES]\n");
  581. } else if (!strncmp(buf, "-r0", 3) && (1 == sscanf(buf + 3, "%d", &pin))) {
  582. GPIO_CFG cfg = {.no = pin };
  583. /*if pmic */
  584. mt_gpio_read_pin_base(&cfg, 0);
  585. GPIOMSG("%3d: %d %d %d %d %d %d\n", cfg.no, cfg.mode, cfg.pullsel,
  586. cfg.din, cfg.dout, cfg.pullen, cfg.dir);
  587. } else if (!strncmp(buf, "-r1", 3) && (1 == sscanf(buf + 3, "%d", &pin))) {
  588. GPIO_CFG cfg = {.no = pin };
  589. mt_gpio_read_pin_base(&cfg, 1);
  590. GPIOMSG("%3d: %d %d %d %d %d %d %d\n", cfg.no, cfg.mode, cfg.pullsel,
  591. cfg.din, cfg.dout, cfg.pullen, cfg.dir, cfg.ies);
  592. } else if (!strncmp(buf, "-w", 2)) {
  593. buf += 2;
  594. if (!strncmp(buf, "mode", 4) && (2 == sscanf(buf + 4, "%d %d", &pin, &mode)))
  595. GPIOMSG("set mode(%3d, %d)=%d\n", pin, mode, mt_set_gpio_mode(pin, mode));
  596. else if (!strncmp(buf, "psel", 4)
  597. && (2 == sscanf(buf + 4, "%d %d", &pin, &pullsel)))
  598. GPIOMSG("set psel(%3d, %d)=%d\n", pin, pullsel,
  599. mt_set_gpio_pull_select(pin, pullsel));
  600. else if (!strncmp(buf, "dout", 4) && (2 == sscanf(buf + 4, "%d %d", &pin, &dout)))
  601. GPIOMSG("set dout(%3d, %d)=%d\n", pin, dout, mt_set_gpio_out(pin, dout));
  602. else if (!strncmp(buf, "pen", 3) && (2 == sscanf(buf + 3, "%d %d", &pin, &pullen)))
  603. GPIOMSG("set pen (%3d, %d)=%d\n", pin, pullen,
  604. mt_set_gpio_pull_enable(pin, pullen));
  605. else if (!strncmp(buf, "ies", 3) && (2 == sscanf(buf + 3, "%d %d", &pin, &ies)))
  606. GPIOMSG("set ies (%3d, %d)=%d\n", pin, ies, mt_set_gpio_ies(pin, ies));
  607. else if (!strncmp(buf, "dir", 3) && (2 == sscanf(buf + 3, "%d %d", &pin, &dir)))
  608. GPIOMSG("set dir (%3d, %d)=%d\n", pin, dir, mt_set_gpio_dir(pin, dir));
  609. /* else if (!strncmp(buf, "dinv", 4) && (2 == sscanf(buf+4, "%d %d", &pin, &dinv))) */
  610. /* GPIOMSG("set dinv(%3d, %d)=%d\n", pin, dinv, mt_set_gpio_inversion(pin, dinv)); */
  611. #ifdef CONFIG_MTK_FPGA
  612. else if (3 == sscanf(buf, "=%d:%d %d", &pin, &dout, &dir)) {
  613. GPIOMSG("set dout(%3d, %d)=%d\n", pin, dout, mt_set_gpio_out(pin, dout));
  614. GPIOMSG("set dir (%3d, %d)=%d\n", pin, dir, mt_set_gpio_dir(pin, dir));
  615. #else
  616. else if (8 == sscanf(buf, "=%d:%d %d %d %d %d %d %d", &pin, &mode, &pullsel, &dout,
  617. &pullen, &dir, &ies, &smt)) {
  618. GPIOMSG("set mode(%3d, %d)=%d\n", pin, mode, mt_set_gpio_mode(pin, mode));
  619. GPIOMSG("set psel(%3d, %d)=%d\n", pin, pullsel,
  620. mt_set_gpio_pull_select(pin, pullsel));
  621. GPIOMSG("set dout(%3d, %d)=%d\n", pin, dout, mt_set_gpio_out(pin, dout));
  622. GPIOMSG("set pen (%3d, %d)=%d\n", pin, pullen,
  623. mt_set_gpio_pull_enable(pin, pullen));
  624. GPIOMSG("set dir (%3d, %d)=%d\n", pin, dir, mt_set_gpio_dir(pin, dir));
  625. /* GPIOMSG("set dinv(%3d, %d)=%d\n", pin, dinv, mt_set_gpio_inversion(pin, dinv)); */
  626. GPIOMSG("set ies (%3d, %d)=%d\n", pin, ies, mt_set_gpio_ies(pin, ies));
  627. GPIOMSG("set smt (%3d, %d)=%d\n", pin, smt, mt_set_gpio_smt(pin, smt));
  628. #endif
  629. } else
  630. GPIOMSG("invalid format: '%s'", buf);
  631. } else if (!strncmp(buf, "ww", 2)) {
  632. /*
  633. //MT6306 GPIO
  634. buf += 2;
  635. if (3 == sscanf(buf, "=%d:%d %d", &pin, &dout, &dir)) {
  636. GPIOMSG("[MT6306] set dout(%3d, %d)=%d\n", pin, dout, mt6306_set_gpio_out(pin, dout));
  637. GPIOMSG("[MT6306] set dir (%3d, %d)=%d\n", pin, dir, mt6306_set_gpio_dir(pin, dir));
  638. } else
  639. GPIOMSG("invalid format: '%s'", buf);
  640. */
  641. #ifdef MTK_MT6306_SUPPORT
  642. } else if (!strncmp(buf, "wy", 2)) {
  643. /* MT6306 GPIO */
  644. buf += 2;
  645. if (2 == sscanf(buf, "=%d:%d", &group, &on)) {
  646. GPIOMSG("[MT6306] set pin group vccen (%3d, %d)=%d\n", group, on,
  647. mt6306_set_GPIO_pin_group_power(group, on));
  648. GPIOMSG("[MT6306] set pin group vccen (%3d, %d)=%d\n", group, on,
  649. mt6306_set_GPIO_pin_group_power(group, on));
  650. } else
  651. GPIOMSG("invalid format: '%s'", buf);
  652. #endif
  653. } else if (!strncmp(buf, "-t", 2)) {
  654. mt_gpio_self_test();
  655. } else if (!strncmp(buf, "-c", 2)) {
  656. mt_gpio_compare_base();
  657. /* mt_gpio_compare_ext(); */
  658. } else if (!strncmp(buf, "-da", 3)) {
  659. mt_gpio_dump_addr_base();
  660. /* mt_gpio_dump_addr_ext(); */
  661. } else if (!strncmp(buf, "-dp", 3)) {
  662. gpio_dump_regs();
  663. } else if (!strncmp(buf, "-d", 2)) {
  664. mt_gpio_dump();
  665. } else if (!strncmp(buf, "tt", 2)) {
  666. /* GPIOMSG("gpio reg test for next chip!\n"); */
  667. /* mt_reg_test(); */
  668. } else if (!strncmp(buf, "-md", 3)) {
  669. buf += 3;
  670. ret = sscanf(buf, "%s", md_str);
  671. mt_get_md_gpio_debug(md_str);
  672. } else if (!strncmp(buf, "-k", 2)) {
  673. buf += 2;
  674. if (!strncmp(buf, "s", 1) && (3 == sscanf(buf + 1, "%d %d %d", &num, &src, &div)))
  675. GPIOMSG("set num(%d, %d, %d)=%d\n", num, src, div,
  676. mt_set_clock_output(num, src, div));
  677. } else if (!strncmp(buf, "g", 1) && (1 == sscanf(buf + 1, "%d", &num))) {
  678. /* ret = mt_get_clock_output(num, &src,&div); */
  679. /* GPIOMSG("get num(%ld, %ld, %ld)=%d\n", num, src, div,ret); */
  680. } else if (!strncmp(buf, "-ut", 3)) {
  681. /* ret = mt_get_clock_output(num, &src,&div); */
  682. } else {
  683. GPIOMSG("invalid format: '%s'", buf);
  684. }
  685. return count;
  686. }
  687. /******************************************************************************
  688. *MD convert gpio-name to gpio-number
  689. *******************************************************************************/
  690. struct mt_gpio_modem_info {
  691. char name[40];
  692. int num;
  693. };
  694. static struct mt_gpio_modem_info mt_gpio_info[] = {
  695. {"GPIO_MD_TEST", 800},
  696. #ifdef GPIO_AST_CS_PIN
  697. {"GPIO_AST_HIF_CS", GPIO_AST_CS_PIN},
  698. #endif
  699. #ifdef GPIO_AST_CS_PIN_NCE
  700. {"GPIO_AST_HIF_CS_ID", GPIO_AST_CS_PIN_NCE},
  701. #endif
  702. #ifdef GPIO_AST_RST_PIN
  703. {"GPIO_AST_Reset", GPIO_AST_RST_PIN},
  704. #endif
  705. #ifdef GPIO_AST_CLK32K_PIN
  706. {"GPIO_AST_CLK_32K", GPIO_AST_CLK32K_PIN},
  707. #endif
  708. #ifdef GPIO_AST_CLK32K_PIN_CLK
  709. {"GPIO_AST_CLK_32K_CLKM", GPIO_AST_CLK32K_PIN_CLK},
  710. #endif
  711. #ifdef GPIO_AST_WAKEUP_PIN
  712. {"GPIO_AST_Wakeup", GPIO_AST_WAKEUP_PIN},
  713. #endif
  714. #ifdef GPIO_AST_INTR_PIN
  715. {"GPIO_AST_INT", GPIO_AST_INTR_PIN},
  716. #endif
  717. #ifdef GPIO_AST_WAKEUP_INTR_PIN
  718. {"GPIO_AST_WAKEUP_INT", GPIO_AST_WAKEUP_INTR_PIN},
  719. #endif
  720. #ifdef GPIO_AST_AFC_SWITCH_PIN
  721. {"GPIO_AST_AFC_Switch", GPIO_AST_AFC_SWITCH_PIN},
  722. #endif
  723. #ifdef GPIO_FDD_BAND_SUPPORT_DETECT_1ST_PIN
  724. {"GPIO_FDD_Band_Support_Detection_1", GPIO_FDD_BAND_SUPPORT_DETECT_1ST_PIN},
  725. #endif
  726. #ifdef GPIO_FDD_BAND_SUPPORT_DETECT_2ND_PIN
  727. {"GPIO_FDD_Band_Support_Detection_2", GPIO_FDD_BAND_SUPPORT_DETECT_2ND_PIN},
  728. #endif
  729. #ifdef GPIO_FDD_BAND_SUPPORT_DETECT_3RD_PIN
  730. {"GPIO_FDD_Band_Support_Detection_3", GPIO_FDD_BAND_SUPPORT_DETECT_3RD_PIN},
  731. #endif
  732. #ifdef GPIO_SIM_SWITCH_CLK_PIN
  733. {"GPIO_SIM_SWITCH_CLK", GPIO_SIM_SWITCH_CLK_PIN},
  734. #endif
  735. #ifdef GPIO_SIM_SWITCH_DAT_PIN
  736. {"GPIO_SIM_SWITCH_DAT", GPIO_SIM_SWITCH_DAT_PIN},
  737. #endif
  738. /*if you have new GPIO pin add bellow*/
  739. };
  740. int mt_get_md_gpio(char *gpio_name, int len)
  741. {
  742. unsigned int i;
  743. unsigned long number;
  744. for (i = 0; i < ARRAY_SIZE(mt_gpio_info); i++) {
  745. if (!strncmp(gpio_name, mt_gpio_info[i].name, len)) {
  746. number = mt_gpio_info[i].num;
  747. GPIOMSG("Modern get number=%d, name:%s\n", mt_gpio_info[i].num, gpio_name);
  748. mt_gpio_pin_decrypt(&number);
  749. return number;
  750. }
  751. }
  752. GPIOERR("Modem gpio name can't match!!!\n");
  753. return -1;
  754. }
  755. void mt_get_md_gpio_debug(char *str)
  756. {
  757. if (strcmp(str, "ALL") == 0) {
  758. int i;
  759. for (i = 0; i < ARRAY_SIZE(mt_gpio_info); i++)
  760. GPIOMSG("GPIO number=%d,%s\n", mt_gpio_info[i].num, mt_gpio_info[i].name);
  761. } else {
  762. GPIOMSG("GPIO number=%d,%s\n", mt_get_md_gpio(str, strlen(str)), str);
  763. }
  764. }