PageRenderTime 53ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/mmc/host/sunxi-mmc-debug.c

https://gitlab.com/pine64-android/linux-3.10
C | 392 lines | 240 code | 75 blank | 77 comment | 33 complexity | d47ad364076756d940d43a1af0461438 MD5 | raw file
  1. #include <linux/clk.h>
  2. #include <linux/clk/sunxi.h>
  3. #include <linux/gpio.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/spinlock.h>
  6. #include <linux/scatterlist.h>
  7. #include <linux/dma-mapping.h>
  8. #include <linux/slab.h>
  9. #include <linux/reset.h>
  10. #include <linux/of_address.h>
  11. #include <linux/of_gpio.h>
  12. #include <linux/of_platform.h>
  13. #include <linux/stat.h>
  14. #include <linux/mmc/host.h>
  15. #include "sunxi-mmc.h"
  16. #include "sunxi-mmc-debug.h"
  17. #include "sunxi-mmc-export.h"
  18. #include "sunxi-mmc-sun50iw1p1-2.h"
  19. #define GPIO_BASE_ADDR 0x1c20800
  20. #define CCMU_BASE_ADDR 0x1c20000
  21. static struct device_attribute dump_register[3];
  22. void sunxi_mmc_dumphex32(struct sunxi_mmc_host* host, char* name, char* base, int len)
  23. {
  24. u32 i;
  25. printk("dump %s registers:", name);
  26. for (i=0; i<len; i+=4) {
  27. if (!(i&0xf))
  28. printk("\n0x%p : ", base + i);
  29. printk("0x%08x ",__raw_readl(host->reg_base+i));
  30. }
  31. printk("\n");
  32. }
  33. void sunxi_mmc_dump_des(struct sunxi_mmc_host* host, char* base, int len)
  34. {
  35. u32 i;
  36. printk("dump des mem\n");
  37. for (i=0; i<len; i+=4) {
  38. if (!(i&0xf))
  39. printk("\n0x%p : ", base + i);
  40. printk("0x%08x ",*(u32 *)(base+i));
  41. }
  42. printk("\n");
  43. }
  44. static ssize_t maual_insert_show(struct device *dev, struct device_attribute *attr,
  45. char *buf)
  46. {
  47. int ret;
  48. ret = snprintf(buf, PAGE_SIZE, "Usage: \"echo 1 > insert\" to scan card\n");
  49. return ret;
  50. }
  51. static ssize_t maual_insert_store(struct device *dev, struct device_attribute *attr,
  52. const char *buf, size_t count)
  53. {
  54. int ret;
  55. char *end;
  56. unsigned long insert = simple_strtoul(buf, &end, 0);
  57. struct platform_device *pdev = to_platform_device(dev);
  58. struct mmc_host *mmc = platform_get_drvdata(pdev);
  59. if (end == buf) {
  60. ret = -EINVAL;
  61. return ret;
  62. }
  63. dev_info(dev, "insert %ld\n", insert);
  64. if(insert)
  65. mmc_detect_change(mmc,0);
  66. else
  67. dev_info(dev, "no detect change\n");
  68. //sunxi_mmc_rescan_card(0);
  69. ret = count;
  70. return ret;
  71. }
  72. void dump_reg(struct sunxi_mmc_host *host)
  73. {
  74. int i = 0;
  75. void __iomem *gpio_ptr = ioremap(GPIO_BASE_ADDR, 0x300);
  76. void __iomem *ccmu_ptr = ioremap(CCMU_BASE_ADDR, 0x400);
  77. printk("Dump sdmmc regs:\n");
  78. for (i=0; i<0x180; i+=4) {
  79. if (!(i&0xf))
  80. printk("\n0x%08llx : ", (u64)(host->reg_base + i));
  81. printk("%08x ", readl(host->reg_base + i));
  82. }
  83. printk("\n");
  84. printk("Dump gpio regs:\n");
  85. for (i=0; i<0x120; i+=4) {
  86. if (!(i&0xf))
  87. printk("\n0x%08llx : ", (u64)(gpio_ptr + i));
  88. printk("%08x ", readl(gpio_ptr + i));
  89. }
  90. printk("\n");
  91. printk("Dump gpio irqc regs:\n");
  92. for (i=0x200; i<0x260; i+=4) {
  93. if (!(i&0xf))
  94. printk("\n0x%08llx : ", (u64)(gpio_ptr + i));
  95. printk("%08x ", readl(gpio_ptr + i));
  96. }
  97. printk("\n");
  98. printk("Dump ccmu regs:gating\n");
  99. for (i=0x60; i<=0x80; i+=4) {
  100. if (!(i&0xf))
  101. printk("\n0x%08llx : ", (u64)(ccmu_ptr + i));
  102. printk("%08x ", readl(ccmu_ptr + i));
  103. }
  104. printk("\n");
  105. printk("Dump ccmu regs:module clk\n");
  106. for (i=0x80; i<=0x100; i+=4) {
  107. if (!(i&0xf))
  108. printk("\n0x%08llx : ", (u64)(ccmu_ptr + i));
  109. printk("%08x ", readl(ccmu_ptr + i));
  110. }
  111. printk("\n");
  112. printk("Dump ccmu regs:reset\n");
  113. for (i=0x2c0; i<=0x2e0; i+=4) {
  114. if (!(i&0xf))
  115. printk("\n0x%08llx : ", (u64)(ccmu_ptr + i));
  116. printk("%08x ", readl(ccmu_ptr + i));
  117. }
  118. printk("\n");
  119. iounmap(gpio_ptr);
  120. iounmap(ccmu_ptr);
  121. }
  122. /*
  123. static ssize_t dump_register_show(struct device *dev, struct device_attribute *attr,
  124. char *buf)
  125. {
  126. char *p = buf;
  127. int i = 0;
  128. struct platform_device *pdev = to_platform_device(dev);
  129. struct mmc_host *mmc = platform_get_drvdata(pdev);
  130. struct sunxi_mmc_host *host = mmc_priv(mmc);
  131. void __iomem *gpio_ptr = ioremap(GPIO_BASE_ADDR, 0x300);
  132. void __iomem *ccmu_ptr = ioremap(CCMU_BASE_ADDR, 0x400);
  133. p += sprintf(p, "Dump sdmmc regs:\n");
  134. for (i=0; i<0x180; i+=4) {
  135. if (!(i&0xf))
  136. p += sprintf(p, "\n0x%08llx : ", (u64)(host->reg_base + i));
  137. p += sprintf(p, "%08x ", readl(host->reg_base + i));
  138. }
  139. p += sprintf(p, "\n");
  140. p += sprintf(p, "Dump gpio regs:\n");
  141. for (i=0; i<0x120; i+=4) {
  142. if (!(i&0xf))
  143. p += sprintf(p, "\n0x%08llx : ", (u64)(gpio_ptr + i));
  144. p += sprintf(p, "%08x ", readl(gpio_ptr + i));
  145. }
  146. p += sprintf(p, "\n");
  147. p += sprintf(p, "Dump gpio irqc regs:\n");
  148. for (i=0x200; i<0x260; i+=4) {
  149. if (!(i&0xf))
  150. p += sprintf(p, "\n0x%08llx : ", (u64)(gpio_ptr + i));
  151. p += sprintf(p, "%08x ", readl(gpio_ptr + i));
  152. }
  153. p += sprintf(p, "\n");
  154. p += sprintf(p, "Dump ccmu regs:gating\n");
  155. for (i=0x60; i<=0x80; i+=4) {
  156. if (!(i&0xf))
  157. p += sprintf(p, "\n0x%08llx : ", (u64)(ccmu_ptr + i));
  158. p += sprintf(p, "%08x ", readl(ccmu_ptr + i));
  159. }
  160. p += sprintf(p, "\n");
  161. p += sprintf(p, "Dump ccmu regs:module clk\n");
  162. for (i=0x80; i<=0x100; i+=4) {
  163. if (!(i&0xf))
  164. p += sprintf(p, "\n0x%08llx : ", (u64)(ccmu_ptr + i));
  165. p += sprintf(p, "%08x ", readl(ccmu_ptr + i));
  166. }
  167. p += sprintf(p, "\n");
  168. p += sprintf(p, "Dump ccmu regs:reset\n");
  169. for (i=0x2c0; i<=0x2e0; i+=4) {
  170. if (!(i&0xf))
  171. p += sprintf(p, "\n0x%08llx : ", (u64)(ccmu_ptr + i));
  172. p += sprintf(p, "%08x ", readl(ccmu_ptr + i));
  173. }
  174. p += sprintf(p, "\n");
  175. iounmap(gpio_ptr);
  176. iounmap(ccmu_ptr);
  177. //dump_reg(host);
  178. return p-buf;
  179. }
  180. */
  181. static ssize_t dump_host_reg_show(struct device *dev, struct device_attribute *attr,
  182. char *buf)
  183. {
  184. char *p = buf;
  185. int i = 0;
  186. struct platform_device *pdev = to_platform_device(dev);
  187. struct mmc_host *mmc = platform_get_drvdata(pdev);
  188. struct sunxi_mmc_host *host = mmc_priv(mmc);
  189. p += sprintf(p, "Dump sdmmc regs:\n");
  190. for (i=0; i<0x180; i+=4) {
  191. if (!(i&0xf))
  192. p += sprintf(p, "\n0x%08llx : ", (u64)(host->reg_base + i));
  193. p += sprintf(p, "%08x ", readl(host->reg_base + i));
  194. }
  195. p += sprintf(p, "\n");
  196. return p-buf;
  197. }
  198. static ssize_t dump_gpio_reg_show(struct device *dev, struct device_attribute *attr,
  199. char *buf)
  200. {
  201. char *p = buf;
  202. int i = 0;
  203. void __iomem *gpio_ptr = ioremap(GPIO_BASE_ADDR, 0x300);
  204. p += sprintf(p, "Dump gpio regs:\n");
  205. for (i=0; i<0x120; i+=4) {
  206. if (!(i&0xf))
  207. p += sprintf(p, "\n0x%08llx : ", (u64)(gpio_ptr + i));
  208. p += sprintf(p, "%08x ", readl(gpio_ptr + i));
  209. }
  210. p += sprintf(p, "\n");
  211. p += sprintf(p, "Dump gpio irqc regs:\n");
  212. for (i=0x200; i<0x260; i+=4) {
  213. if (!(i&0xf))
  214. p += sprintf(p, "\n0x%08llx : ", (u64)(gpio_ptr + i));
  215. p += sprintf(p, "%08x ", readl(gpio_ptr + i));
  216. }
  217. p += sprintf(p, "\n");
  218. iounmap(gpio_ptr);
  219. return p-buf;
  220. }
  221. static ssize_t dump_ccmu_reg_show(struct device *dev, struct device_attribute *attr,
  222. char *buf)
  223. {
  224. char *p = buf;
  225. int i = 0;
  226. void __iomem *ccmu_ptr = ioremap(CCMU_BASE_ADDR, 0x400);
  227. p += sprintf(p, "Dump ccmu\n");
  228. for (i=0x0; i<=0x400; i+=4) {
  229. if (!(i&0xf))
  230. p += sprintf(p, "\n0x%08llx : ", (u64)(ccmu_ptr + i));
  231. p += sprintf(p, "%08x ", readl(ccmu_ptr + i));
  232. }
  233. p += sprintf(p, "\n");
  234. iounmap(ccmu_ptr);
  235. //dump_reg(host);
  236. return p-buf;
  237. }
  238. static ssize_t dump_clk_dly_show(struct device *dev, struct device_attribute *attr,
  239. char *buf)
  240. {
  241. char *p = buf;
  242. struct platform_device *pdev = to_platform_device(dev);
  243. struct mmc_host *mmc = platform_get_drvdata(pdev);
  244. struct sunxi_mmc_host *host = mmc_priv(mmc);
  245. if(host->sunxi_mmc_dump_dly_table){
  246. host->sunxi_mmc_dump_dly_table(host);
  247. }else{
  248. dev_warn(mmc_dev(mmc),"not found the dump dly table\n");
  249. }
  250. return p-buf;
  251. }
  252. int mmc_create_sys_fs(struct sunxi_mmc_host* host,struct platform_device *pdev)
  253. {
  254. int ret;
  255. host->maual_insert.show = maual_insert_show;
  256. host->maual_insert.store = maual_insert_store;
  257. sysfs_attr_init(host->maual_insert.attr);
  258. host->maual_insert.attr.name = "sunxi_insert";
  259. host->maual_insert.attr.mode = S_IRUGO | S_IWUSR;
  260. ret = device_create_file(&pdev->dev, &host->maual_insert);
  261. if(ret)
  262. return ret;
  263. host->dump_register = dump_register;
  264. host->dump_register[0].show = dump_host_reg_show;
  265. sysfs_attr_init(host->dump_register[0].attr);
  266. host->dump_register[0].attr.name = "sunxi_dump_host_regster";
  267. host->dump_register[0].attr.mode = S_IRUGO;
  268. ret = device_create_file(&pdev->dev, &host->dump_register[0]);
  269. if(ret)
  270. return ret;
  271. host->dump_register[1].show = dump_gpio_reg_show;
  272. sysfs_attr_init(host->dump_register[1].attr);
  273. host->dump_register[1].attr.name = "sunxi_dump_gpio_regster";
  274. host->dump_register[1].attr.mode = S_IRUGO;
  275. ret = device_create_file(&pdev->dev, &host->dump_register[1]);
  276. if(ret)
  277. return ret;
  278. host->dump_register[2].show = dump_ccmu_reg_show;
  279. sysfs_attr_init(host->dump_register[2].attr);
  280. host->dump_register[2].attr.name = "sunxi_dump_ccmu_regster";
  281. host->dump_register[2].attr.mode = S_IRUGO;
  282. ret = device_create_file(&pdev->dev, &host->dump_register[2]);
  283. if(ret)
  284. return ret;
  285. host->dump_clk_dly.show = dump_clk_dly_show;
  286. sysfs_attr_init(host->dump_clk_dly.attr);
  287. host->dump_clk_dly.attr.name = "sunxi_dump_clk_dly";
  288. host->dump_clk_dly.attr.mode = S_IRUGO;
  289. ret = device_create_file(&pdev->dev, &host->dump_clk_dly);
  290. if(ret)
  291. return ret;
  292. return ret;
  293. }
  294. void mmc_remove_sys_fs(struct sunxi_mmc_host* host,struct platform_device *pdev)
  295. {
  296. device_remove_file(&pdev->dev, &host->maual_insert);
  297. device_remove_file(&pdev->dev, &host->dump_register[0]);
  298. device_remove_file(&pdev->dev, &host->dump_register[1]);
  299. device_remove_file(&pdev->dev, &host->dump_register[2]);
  300. device_remove_file(&pdev->dev, &host->dump_clk_dly);
  301. }