aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2013-02-12 12:15:33 -0500
committerSimon Horman <horms+renesas@verge.net.au>2013-03-18 08:27:02 -0400
commit626a645eb75415255aad3162f4da3f6988f0c8ec (patch)
treed98f1d01a511909c8be616d38455576cc095312f
parent3a5eed5f9e0734c4d3b5b42f7db443a33e2ba665 (diff)
ARM: shmobile: streamline mackerel SD and MMC devices
This patch fixes the following issues with SD and MMC interfaces on mackerel: 1. replace custom card-detection functions with standard GPIO CD API 2. resources don't have to be numbered 3. add SDHI interrupt names 4. remove OCR masks, where regulators are used 5. only specify SDHI CD interrupts on interfaces where a CD pin is present - SDHI0 6. don't instantiate an MMCIF device and initialise MMCIF pins if SDHI1 is selected Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
-rw-r--r--arch/arm/mach-shmobile/board-mackerel.c113
1 files changed, 57 insertions, 56 deletions
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c
index 336ccb4a0f2a..fb058c763a7d 100644
--- a/arch/arm/mach-shmobile/board-mackerel.c
+++ b/arch/arm/mach-shmobile/board-mackerel.c
@@ -963,15 +963,6 @@ static struct platform_device nand_flash_device = {
963 }, 963 },
964}; 964};
965 965
966/*
967 * The card detect pin of the top SD/MMC slot (CN7) is active low and is
968 * connected to GPIO A22 of SH7372 (GPIO 41).
969 */
970static int slot_cn7_get_cd(struct platform_device *pdev)
971{
972 return !gpio_get_value(41);
973}
974
975/* SDHI0 */ 966/* SDHI0 */
976static struct sh_mobile_sdhi_info sdhi0_info = { 967static struct sh_mobile_sdhi_info sdhi0_info = {
977 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, 968 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
@@ -982,21 +973,21 @@ static struct sh_mobile_sdhi_info sdhi0_info = {
982}; 973};
983 974
984static struct resource sdhi0_resources[] = { 975static struct resource sdhi0_resources[] = {
985 [0] = { 976 {
986 .name = "SDHI0", 977 .name = "SDHI0",
987 .start = 0xe6850000, 978 .start = 0xe6850000,
988 .end = 0xe68500ff, 979 .end = 0xe68500ff,
989 .flags = IORESOURCE_MEM, 980 .flags = IORESOURCE_MEM,
990 }, 981 }, {
991 [1] = { 982 .name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
992 .start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */, 983 .start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */,
993 .flags = IORESOURCE_IRQ, 984 .flags = IORESOURCE_IRQ,
994 }, 985 }, {
995 [2] = { 986 .name = SH_MOBILE_SDHI_IRQ_SDCARD,
996 .start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */, 987 .start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */,
997 .flags = IORESOURCE_IRQ, 988 .flags = IORESOURCE_IRQ,
998 }, 989 }, {
999 [3] = { 990 .name = SH_MOBILE_SDHI_IRQ_SDIO,
1000 .start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */, 991 .start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */,
1001 .flags = IORESOURCE_IRQ, 992 .flags = IORESOURCE_IRQ,
1002 }, 993 },
@@ -1014,34 +1005,28 @@ static struct platform_device sdhi0_device = {
1014 1005
1015#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 1006#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1016/* SDHI1 */ 1007/* SDHI1 */
1008
1009/* GPIO_PORT41 can trigger IRQ8, but it is used by USBHS1, we have to poll */
1017static struct sh_mobile_sdhi_info sdhi1_info = { 1010static struct sh_mobile_sdhi_info sdhi1_info = {
1018 .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX, 1011 .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
1019 .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX, 1012 .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
1020 .tmio_ocr_mask = MMC_VDD_165_195, 1013 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_USE_GPIO_CD,
1021 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
1022 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | 1014 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
1023 MMC_CAP_NEEDS_POLL, 1015 MMC_CAP_NEEDS_POLL,
1024 .get_cd = slot_cn7_get_cd, 1016 .cd_gpio = GPIO_PORT41,
1025}; 1017};
1026 1018
1027static struct resource sdhi1_resources[] = { 1019static struct resource sdhi1_resources[] = {
1028 [0] = { 1020 {
1029 .name = "SDHI1", 1021 .name = "SDHI1",
1030 .start = 0xe6860000, 1022 .start = 0xe6860000,
1031 .end = 0xe68600ff, 1023 .end = 0xe68600ff,
1032 .flags = IORESOURCE_MEM, 1024 .flags = IORESOURCE_MEM,
1033 }, 1025 }, {
1034 [1] = {
1035 .name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
1036 .start = evt2irq(0x0e80), /* SDHI1_SDHI1I0 */
1037 .flags = IORESOURCE_IRQ,
1038 },
1039 [2] = {
1040 .name = SH_MOBILE_SDHI_IRQ_SDCARD, 1026 .name = SH_MOBILE_SDHI_IRQ_SDCARD,
1041 .start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */ 1027 .start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */
1042 .flags = IORESOURCE_IRQ, 1028 .flags = IORESOURCE_IRQ,
1043 }, 1029 }, {
1044 [3] = {
1045 .name = SH_MOBILE_SDHI_IRQ_SDIO, 1030 .name = SH_MOBILE_SDHI_IRQ_SDIO,
1046 .start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */ 1031 .start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */
1047 .flags = IORESOURCE_IRQ, 1032 .flags = IORESOURCE_IRQ,
@@ -1059,43 +1044,32 @@ static struct platform_device sdhi1_device = {
1059}; 1044};
1060#endif 1045#endif
1061 1046
1047/* SDHI2 */
1048
1062/* 1049/*
1063 * The card detect pin of the top SD/MMC slot (CN23) is active low and is 1050 * The card detect pin of the top SD/MMC slot (CN23) is active low and is
1064 * connected to GPIO SCIFB_SCK of SH7372 (162). 1051 * connected to GPIO SCIFB_SCK of SH7372 (GPIO_PORT162).
1065 */ 1052 */
1066static int slot_cn23_get_cd(struct platform_device *pdev)
1067{
1068 return !gpio_get_value(162);
1069}
1070
1071/* SDHI2 */
1072static struct sh_mobile_sdhi_info sdhi2_info = { 1053static struct sh_mobile_sdhi_info sdhi2_info = {
1073 .dma_slave_tx = SHDMA_SLAVE_SDHI2_TX, 1054 .dma_slave_tx = SHDMA_SLAVE_SDHI2_TX,
1074 .dma_slave_rx = SHDMA_SLAVE_SDHI2_RX, 1055 .dma_slave_rx = SHDMA_SLAVE_SDHI2_RX,
1075 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE, 1056 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_USE_GPIO_CD,
1076 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ | 1057 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
1077 MMC_CAP_NEEDS_POLL, 1058 MMC_CAP_NEEDS_POLL,
1078 .get_cd = slot_cn23_get_cd, 1059 .cd_gpio = GPIO_PORT162,
1079}; 1060};
1080 1061
1081static struct resource sdhi2_resources[] = { 1062static struct resource sdhi2_resources[] = {
1082 [0] = { 1063 {
1083 .name = "SDHI2", 1064 .name = "SDHI2",
1084 .start = 0xe6870000, 1065 .start = 0xe6870000,
1085 .end = 0xe68700ff, 1066 .end = 0xe68700ff,
1086 .flags = IORESOURCE_MEM, 1067 .flags = IORESOURCE_MEM,
1087 }, 1068 }, {
1088 [1] = {
1089 .name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
1090 .start = evt2irq(0x1200), /* SDHI2_SDHI2I0 */
1091 .flags = IORESOURCE_IRQ,
1092 },
1093 [2] = {
1094 .name = SH_MOBILE_SDHI_IRQ_SDCARD, 1069 .name = SH_MOBILE_SDHI_IRQ_SDCARD,
1095 .start = evt2irq(0x1220), /* SDHI2_SDHI2I1 */ 1070 .start = evt2irq(0x1220), /* SDHI2_SDHI2I1 */
1096 .flags = IORESOURCE_IRQ, 1071 .flags = IORESOURCE_IRQ,
1097 }, 1072 }, {
1098 [3] = {
1099 .name = SH_MOBILE_SDHI_IRQ_SDIO, 1073 .name = SH_MOBILE_SDHI_IRQ_SDIO,
1100 .start = evt2irq(0x1240), /* SDHI2_SDHI2I2 */ 1074 .start = evt2irq(0x1240), /* SDHI2_SDHI2I2 */
1101 .flags = IORESOURCE_IRQ, 1075 .flags = IORESOURCE_IRQ,
@@ -1134,11 +1108,12 @@ static struct resource sh_mmcif_resources[] = {
1134 1108
1135static struct sh_mmcif_plat_data sh_mmcif_plat = { 1109static struct sh_mmcif_plat_data sh_mmcif_plat = {
1136 .sup_pclk = 0, 1110 .sup_pclk = 0,
1137 .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
1138 .caps = MMC_CAP_4_BIT_DATA | 1111 .caps = MMC_CAP_4_BIT_DATA |
1139 MMC_CAP_8_BIT_DATA | 1112 MMC_CAP_8_BIT_DATA |
1140 MMC_CAP_NEEDS_POLL, 1113 MMC_CAP_NEEDS_POLL,
1141 .get_cd = slot_cn7_get_cd, 1114 .use_cd_gpio = true,
1115 /* card detect pin for SD/MMC slot (CN7) */
1116 .cd_gpio = GPIO_PORT41,
1142 .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, 1117 .slave_id_tx = SHDMA_SLAVE_MMCIF_TX,
1143 .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, 1118 .slave_id_rx = SHDMA_SLAVE_MMCIF_RX,
1144}; 1119};
@@ -1263,9 +1238,10 @@ static struct platform_device *mackerel_devices[] __initdata = {
1263 &sdhi0_device, 1238 &sdhi0_device,
1264#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 1239#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1265 &sdhi1_device, 1240 &sdhi1_device,
1241#else
1242 &sh_mmcif_device,
1266#endif 1243#endif
1267 &sdhi2_device, 1244 &sdhi2_device,
1268 &sh_mmcif_device,
1269 &ceu_device, 1245 &ceu_device,
1270 &mackerel_camera, 1246 &mackerel_camera,
1271 &hdmi_device, 1247 &hdmi_device,
@@ -1372,10 +1348,11 @@ static void __init mackerel_init(void)
1372 { "A3SP", &usbhs0_device, }, 1348 { "A3SP", &usbhs0_device, },
1373 { "A3SP", &usbhs1_device, }, 1349 { "A3SP", &usbhs1_device, },
1374 { "A3SP", &nand_flash_device, }, 1350 { "A3SP", &nand_flash_device, },
1375 { "A3SP", &sh_mmcif_device, },
1376 { "A3SP", &sdhi0_device, }, 1351 { "A3SP", &sdhi0_device, },
1377#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 1352#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1378 { "A3SP", &sdhi1_device, }, 1353 { "A3SP", &sdhi1_device, },
1354#else
1355 { "A3SP", &sh_mmcif_device, },
1379#endif 1356#endif
1380 { "A3SP", &sdhi2_device, }, 1357 { "A3SP", &sdhi2_device, },
1381 { "A4R", &ceu_device, }, 1358 { "A4R", &ceu_device, },
@@ -1486,11 +1463,35 @@ static void __init mackerel_init(void)
1486 /* SDHI0 PORT172 card-detect IRQ26 */ 1463 /* SDHI0 PORT172 card-detect IRQ26 */
1487 gpio_request(GPIO_FN_IRQ26_172, NULL); 1464 gpio_request(GPIO_FN_IRQ26_172, NULL);
1488 1465
1489 /* card detect pin for MMC slot (CN7) */ 1466#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
1490 gpio_request_one(41, GPIOF_IN, NULL); 1467 /* enable SDHI1 */
1468 gpio_request(GPIO_FN_SDHICMD1, NULL);
1469 gpio_request(GPIO_FN_SDHICLK1, NULL);
1470 gpio_request(GPIO_FN_SDHID1_3, NULL);
1471 gpio_request(GPIO_FN_SDHID1_2, NULL);
1472 gpio_request(GPIO_FN_SDHID1_1, NULL);
1473 gpio_request(GPIO_FN_SDHID1_0, NULL);
1474#else
1475 /* MMCIF */
1476 gpio_request(GPIO_FN_MMCD0_0, NULL);
1477 gpio_request(GPIO_FN_MMCD0_1, NULL);
1478 gpio_request(GPIO_FN_MMCD0_2, NULL);
1479 gpio_request(GPIO_FN_MMCD0_3, NULL);
1480 gpio_request(GPIO_FN_MMCD0_4, NULL);
1481 gpio_request(GPIO_FN_MMCD0_5, NULL);
1482 gpio_request(GPIO_FN_MMCD0_6, NULL);
1483 gpio_request(GPIO_FN_MMCD0_7, NULL);
1484 gpio_request(GPIO_FN_MMCCMD0, NULL);
1485 gpio_request(GPIO_FN_MMCCLK0, NULL);
1486#endif
1491 1487
1492 /* card detect pin for microSD slot (CN23) */ 1488 /* enable SDHI2 */
1493 gpio_request_one(162, GPIOF_IN, NULL); 1489 gpio_request(GPIO_FN_SDHICMD2, NULL);
1490 gpio_request(GPIO_FN_SDHICLK2, NULL);
1491 gpio_request(GPIO_FN_SDHID2_3, NULL);
1492 gpio_request(GPIO_FN_SDHID2_2, NULL);
1493 gpio_request(GPIO_FN_SDHID2_1, NULL);
1494 gpio_request(GPIO_FN_SDHID2_0, NULL);
1494 1495
1495 /* FLCTL */ 1496 /* FLCTL */
1496 gpio_request(GPIO_FN_D0_NAF0, NULL); 1497 gpio_request(GPIO_FN_D0_NAF0, NULL);