setup-sdhci-gpio.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /* linux/arch/arm/mach-exynos4/setup-sdhci-gpio.c
  2. *
  3. * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
  4. * http://www.samsung.com
  5. *
  6. * EXYNOS4 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/types.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/io.h>
  17. #include <linux/gpio.h>
  18. #include <linux/mmc/host.h>
  19. #include <linux/mmc/card.h>
  20. #include <plat/gpio-cfg.h>
  21. #include <plat/regs-sdhci.h>
  22. #include <plat/sdhci.h>
  23. void exynos4_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
  24. {
  25. struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
  26. unsigned int gpio;
  27. /* Set all the necessary GPK0[0:1] pins to special-function 2 */
  28. for (gpio = EXYNOS4_GPK0(0); gpio < EXYNOS4_GPK0(2); gpio++) {
  29. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  30. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
  31. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  32. }
  33. switch (width) {
  34. case 8:
  35. for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) {
  36. /* Data pin GPK1[3:6] to special-function 3 */
  37. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));
  38. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
  39. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  40. }
  41. case 4:
  42. for (gpio = EXYNOS4_GPK0(3); gpio <= EXYNOS4_GPK0(6); gpio++) {
  43. /* Data pin GPK0[3:6] to special-function 2 */
  44. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  45. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
  46. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  47. }
  48. default:
  49. break;
  50. }
  51. if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
  52. s3c_gpio_cfgpin(EXYNOS4_GPK0(2), S3C_GPIO_SFN(2));
  53. s3c_gpio_setpull(EXYNOS4_GPK0(2), S3C_GPIO_PULL_UP);
  54. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  55. }
  56. }
  57. void exynos4_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
  58. {
  59. struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
  60. unsigned int gpio;
  61. /* Set all the necessary GPK1[0:1] pins to special-function 2 */
  62. for (gpio = EXYNOS4_GPK1(0); gpio < EXYNOS4_GPK1(2); gpio++) {
  63. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  64. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
  65. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  66. }
  67. for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) {
  68. /* Data pin GPK1[3:6] to special-function 2 */
  69. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  70. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
  71. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  72. }
  73. if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
  74. s3c_gpio_cfgpin(EXYNOS4_GPK1(2), S3C_GPIO_SFN(2));
  75. s3c_gpio_setpull(EXYNOS4_GPK1(2), S3C_GPIO_PULL_UP);
  76. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  77. }
  78. }
  79. void exynos4_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
  80. {
  81. struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
  82. unsigned int gpio;
  83. /* Set all the necessary GPK2[0:1] pins to special-function 2 */
  84. for (gpio = EXYNOS4_GPK2(0); gpio < EXYNOS4_GPK2(2); gpio++) {
  85. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  86. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
  87. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  88. }
  89. switch (width) {
  90. case 8:
  91. for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
  92. /* Data pin GPK3[3:6] to special-function 3 */
  93. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));
  94. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
  95. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  96. }
  97. case 4:
  98. for (gpio = EXYNOS4_GPK2(3); gpio <= EXYNOS4_GPK2(6); gpio++) {
  99. /* Data pin GPK2[3:6] to special-function 2 */
  100. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  101. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
  102. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  103. }
  104. default:
  105. break;
  106. }
  107. if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
  108. s3c_gpio_cfgpin(EXYNOS4_GPK2(2), S3C_GPIO_SFN(2));
  109. s3c_gpio_setpull(EXYNOS4_GPK2(2), S3C_GPIO_PULL_UP);
  110. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  111. }
  112. }
  113. void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width)
  114. {
  115. struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
  116. unsigned int gpio;
  117. /* Set all the necessary GPK3[0:1] pins to special-function 2 */
  118. for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
  119. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  120. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
  121. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  122. }
  123. for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
  124. /* Data pin GPK3[3:6] to special-function 2 */
  125. s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
  126. s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
  127. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  128. }
  129. if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
  130. s3c_gpio_cfgpin(EXYNOS4_GPK3(2), S3C_GPIO_SFN(2));
  131. s3c_gpio_setpull(EXYNOS4_GPK3(2), S3C_GPIO_PULL_UP);
  132. s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
  133. }
  134. }