mt_gpio_init.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /******************************************************************************
  2. * gpio_init.c - MT6516 Linux GPIO Device Driver
  3. *
  4. * Copyright 2008-2009 MediaTek Co.,Ltd.
  5. *
  6. * DESCRIPTION:
  7. * default GPIO init
  8. *
  9. ******************************************************************************/
  10. #include <platform/mt_gpio.h>
  11. #if !defined(MACH_FPGA)
  12. //#include <cust_power.h>
  13. #include <cust_gpio_boot.h>
  14. #endif
  15. #include <platform/mt_reg_base.h>
  16. #include <debug.h>
  17. #define GPIO_INIT_DEBUG 1
  18. /*----------------------------------------------------------------------------*/
  19. #define GPIOTAG "[GPIO] "
  20. #define GPIODBG(fmt, arg...) dprintf(INFO, GPIOTAG "%s: " fmt, __FUNCTION__ ,##arg)
  21. #define GPIOERR(fmt, arg...) dprintf(INFO, GPIOTAG "%s: " fmt, __FUNCTION__ ,##arg)
  22. #define GPIOVER(fmt, arg...) dprintf(INFO, GPIOTAG "%s: " fmt, __FUNCTION__ ,##arg)
  23. #define GPIO_WR32(addr, data) DRV_WriteReg32(addr,data)
  24. #define GPIO_RD32(addr) DRV_Reg32(addr)
  25. #define ADDR_BIT 0
  26. #define VAL_BIT 1
  27. #define MASK_BIT 2
  28. /*----------------------------------------------------------------------------*/
  29. #if defined(MACH_FPGA)
  30. void mt_gpio_set_default(void)
  31. {
  32. return;
  33. }
  34. #else
  35. #include <platform/gpio_init.h>
  36. #if defined(GPIO_INIT_DEBUG)
  37. //static GPIO_REGS saved;
  38. #endif
  39. void mt_gpio_set_default_chip(void)
  40. {
  41. u32 idx;
  42. u32 val;
  43. u32 mask;
  44. for (idx = 0; idx < sizeof(gpio_init_value)/((sizeof(UINT32))*(MASK_BIT+1)); idx++){
  45. mask = gpio_init_value[idx][MASK_BIT];
  46. val = GPIO_RD32(gpio_init_value[idx][ADDR_BIT]);
  47. val &= ~(mask);
  48. val |= ((gpio_init_value[idx][VAL_BIT])&mask);
  49. GPIO_WR32(gpio_init_value[idx][ADDR_BIT],val);
  50. }
  51. //GPIOVER("mt_gpio_set_default() done\n");
  52. }
  53. void mt_gpio_set_driving(void)
  54. {
  55. #if 0
  56. u32 val;
  57. u32 mask;
  58. /* [MT6571] for MD BSI request */
  59. mask = 0x3000;
  60. val = GPIO_RD32(IO_CFG_T_BASE+0xF0);
  61. val &= ~(mask);
  62. val |= (0x0000 & mask);
  63. GPIO_WR32(IO_CFG_T_BASE+0xF0, val);
  64. /* [MT6571] end */
  65. /* [MT6571] for desense request (AUD IO) */
  66. mask = 0x30;
  67. val = GPIO_RD32(IO_CFG_L_BASE+0xA0);
  68. val &= ~(mask);
  69. val |= (0x00 & mask);
  70. GPIO_WR32(IO_CFG_L_BASE+0xA0, val);
  71. /* [MT6571] end */
  72. #endif
  73. }
  74. void mt_gpio_set_power(void)
  75. {
  76. #if 0
  77. u32 val;
  78. val = GPIO_RD32(GPIO_BASE+0x510);
  79. if(((val & 0x100)>>8) == 1){
  80. GPIO_WR32(IO_CFG_L_BASE+0x48, 0x8000);
  81. }
  82. if(((val & 0x200)>>9) == 1){
  83. GPIO_WR32(IO_CFG_L_BASE+0x48, 0x10000);
  84. }
  85. #endif
  86. }
  87. void mt_gpio_set_avoid_leakage(void)
  88. {
  89. #if 0
  90. #ifdef MTK_EMMC_SUPPORT
  91. GPIO_WR32(IO_CFG_B_BASE+0x58, 0x220000);
  92. #endif
  93. #endif
  94. }
  95. void mt_gpio_set_default(void)
  96. {
  97. //mt_gpio_set_avoid_leakage();
  98. mt_gpio_set_default_chip();
  99. //mt_gpio_set_driving();
  100. //mt_gpio_set_power();
  101. mutex_init(&gpio_mutex);
  102. return;
  103. }
  104. /*----------------------------------------------------------------------------*/
  105. //EXPORT_SYMBOL(mt_gpio_set_default);
  106. /*----------------------------------------------------------------------------*/
  107. #if 0
  108. void mt_gpio_checkpoint_save(void)
  109. {
  110. #if defined(GPIO_INIT_DEBUG)
  111. GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE);
  112. GPIO_REGS *cur = &saved;
  113. int idx;
  114. memset(cur, 0x00, sizeof(*cur));
  115. for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++)
  116. cur->dir[idx].val = GPIO_RD32(&pReg->dir[idx]);
  117. for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++)
  118. cur->pullen[idx].val = GPIO_RD32(&pReg->pullen[idx]);
  119. for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++)
  120. cur->pullsel[idx].val =GPIO_RD32(&pReg->pullsel[idx]);
  121. /* for (idx = 0; idx < sizeof(pReg->dinv)/sizeof(pReg->dinv[0]); idx++)
  122. cur->dinv[idx].val =GPIO_RD32(&pReg->dinv[idx]);*/
  123. for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++)
  124. cur->dout[idx].val = GPIO_RD32(&pReg->dout[idx]);
  125. for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++)
  126. cur->mode[idx].val = GPIO_RD32(&pReg->mode[idx]);
  127. #endif
  128. }
  129. /*----------------------------------------------------------------------------*/
  130. EXPORT_SYMBOL(mt_gpio_checkpoint_save);
  131. /*----------------------------------------------------------------------------*/
  132. void mt_gpio_dump_diff(GPIO_REGS* pre, GPIO_REGS* cur)
  133. {
  134. #if defined(GPIO_INIT_DEBUG)
  135. GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE);
  136. int idx;
  137. unsigned char* p = (unsigned char*)pre;
  138. unsigned char* q = (unsigned char*)cur;
  139. GPIOVER("------ dumping difference between %p and %p ------\n", pre, cur);
  140. for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++) {
  141. if (pre->dir[idx].val != cur->dir[idx].val)
  142. GPIOVER("diff: dir[%2d] : 0x%08X <=> 0x%08X\n", idx, pre->dir[idx].val, cur->dir[idx].val);
  143. }
  144. for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++) {
  145. if (pre->pullen[idx].val != cur->pullen[idx].val)
  146. GPIOVER("diff: pullen[%2d] : 0x%08X <=> 0x%08X\n", idx, pre->pullen[idx].val, cur->pullen[idx].val);
  147. }
  148. for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++) {
  149. if (pre->pullsel[idx].val != cur->pullsel[idx].val)
  150. GPIOVER("diff: pullsel[%2d]: 0x%08X <=> 0x%08X\n", idx, pre->pullsel[idx].val, cur->pullsel[idx].val);
  151. }
  152. for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++) {
  153. if (pre->dout[idx].val != cur->dout[idx].val)
  154. GPIOVER("diff: dout[%2d] : 0x%08X <=> 0x%08X\n", idx, pre->dout[idx].val, cur->dout[idx].val);
  155. }
  156. for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++) {
  157. if (pre->mode[idx].val != cur->mode[idx].val)
  158. GPIOVER("diff: mode[%2d] : 0x%08X <=> 0x%08X\n", idx, pre->mode[idx].val, cur->mode[idx].val);
  159. }
  160. for (idx = 0; idx < sizeof(*pre); idx++) {
  161. if (p[idx] != q[idx])
  162. GPIOVER("diff: raw[%2d]: 0x%02X <=> 0x%02X\n", idx, p[idx], q[idx]);
  163. }
  164. GPIOVER("memcmp(%p, %p, %d) = %d\n", p, q, sizeof(*pre), memcmp(p, q, sizeof(*pre)));
  165. GPIOVER("------ dumping difference end --------------------------------\n");
  166. #endif
  167. }
  168. /*----------------------------------------------------------------------------*/
  169. void mt_gpio_checkpoint_compare(void)
  170. {
  171. #if defined(GPIO_INIT_DEBUG)
  172. GPIO_REGS *pReg = (GPIO_REGS*)(GPIO_BASE);
  173. GPIO_REGS latest;
  174. GPIO_REGS *cur = &latest;
  175. int idx;
  176. memset(cur, 0x00, sizeof(*cur));
  177. for (idx = 0; idx < sizeof(pReg->dir)/sizeof(pReg->dir[0]); idx++)
  178. cur->dir[idx].val = GPIO_RD32(&pReg->dir[idx]);
  179. for (idx = 0; idx < sizeof(pReg->pullen)/sizeof(pReg->pullen[0]); idx++)
  180. cur->pullen[idx].val = GPIO_RD32(&pReg->pullen[idx]);
  181. for (idx = 0; idx < sizeof(pReg->pullsel)/sizeof(pReg->pullsel[0]); idx++)
  182. cur->pullsel[idx].val =GPIO_RD32(&pReg->pullsel[idx]);
  183. /* for (idx = 0; idx < sizeof(pReg->dinv)/sizeof(pReg->dinv[0]); idx++)
  184. cur->dinv[idx].val =GPIO_RD32(&pReg->dinv[idx]);*/
  185. for (idx = 0; idx < sizeof(pReg->dout)/sizeof(pReg->dout[0]); idx++)
  186. cur->dout[idx].val = GPIO_RD32(&pReg->dout[idx]);
  187. for (idx = 0; idx < sizeof(pReg->mode)/sizeof(pReg->mode[0]); idx++)
  188. cur->mode[idx].val = GPIO_RD32(&pReg->mode[idx]);
  189. //mt_gpio_dump_diff(&latest, &saved);
  190. //GPIODBG("memcmp(%p, %p, %d) = %d\n", &latest, &saved, sizeof(GPIO_REGS), memcmp(&latest, &saved, sizeof(GPIO_REGS)));
  191. if (memcmp(&latest, &saved, sizeof(GPIO_REGS))) {
  192. GPIODBG("checkpoint compare fail!!\n");
  193. GPIODBG("dump checkpoint....\n");
  194. //mt_gpio_dump(&saved);
  195. GPIODBG("\n\n");
  196. GPIODBG("dump current state\n");
  197. //mt_gpio_dump(&latest);
  198. GPIODBG("\n\n");
  199. mt_gpio_dump_diff(&saved, &latest);
  200. //WARN_ON(1);
  201. } else {
  202. GPIODBG("checkpoint compare success!!\n");
  203. }
  204. #endif
  205. }
  206. /*----------------------------------------------------------------------------*/
  207. EXPORT_SYMBOL(mt_gpio_checkpoint_compare);
  208. /*----------------------------------------------------------------------------*/
  209. #endif
  210. #endif