sdhci.c (1829d5da5355930d5cfa8ec8add8ff47dc0bebab) | sdhci.c (831f5dcf121a581b913177d44adfca7c77680e73) |
---|---|
1/*- 2 * Copyright (c) 2008 Alexander Motin <mav@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31#include <sys/bus.h> 32#include <sys/conf.h> 33#include <sys/kernel.h> 34#include <sys/lock.h> 35#include <sys/module.h> 36#include <sys/mutex.h> 37#include <sys/resource.h> 38#include <sys/rman.h> | 1/*- 2 * Copyright (c) 2008 Alexander Motin <mav@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31#include <sys/bus.h> 32#include <sys/conf.h> 33#include <sys/kernel.h> 34#include <sys/lock.h> 35#include <sys/module.h> 36#include <sys/mutex.h> 37#include <sys/resource.h> 38#include <sys/rman.h> |
39#include <sys/sysctl.h> | |
40#include <sys/taskqueue.h> 41 42#include <dev/pci/pcireg.h> 43#include <dev/pci/pcivar.h> 44 45#include <machine/bus.h> 46#include <machine/resource.h> 47#include <machine/stdarg.h> --- 99 unchanged lines hidden (view full) --- 147 struct resource *irq_res; /* IRQ resource */ 148 int irq_rid; 149 void *intrhand; /* Interrupt handle */ 150 151 int num_slots; /* Number of slots on this controller */ 152 struct sdhci_slot slots[6]; 153}; 154 | 39#include <sys/taskqueue.h> 40 41#include <dev/pci/pcireg.h> 42#include <dev/pci/pcivar.h> 43 44#include <machine/bus.h> 45#include <machine/resource.h> 46#include <machine/stdarg.h> --- 99 unchanged lines hidden (view full) --- 146 struct resource *irq_res; /* IRQ resource */ 147 int irq_rid; 148 void *intrhand; /* Interrupt handle */ 149 150 int num_slots; /* Number of slots on this controller */ 151 struct sdhci_slot slots[6]; 152}; 153 |
155SYSCTL_NODE(_hw, OID_AUTO, sdhci, CTLFLAG_RD, 0, "sdhci driver"); 156 157int sdhci_debug; 158TUNABLE_INT("hw.sdhci.debug", &sdhci_debug); 159SYSCTL_INT(_hw_sdhci, OID_AUTO, debug, CTLFLAG_RW, &sdhci_debug, 0, "Debug level"); 160 | |
161static inline uint8_t 162RD1(struct sdhci_slot *slot, bus_size_t off) 163{ 164 bus_barrier(slot->mem_res, 0, 0xFF, 165 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 166 return bus_read_1(slot->mem_res, off); 167} 168 --- 134 unchanged lines hidden (view full) --- 303 /* This is to force an update */ 304 clock = slot->clock; 305 slot->clock = 0; 306 sdhci_set_clock(slot, clock); 307 } 308 309 WR1(slot, SDHCI_SOFTWARE_RESET, mask); 310 | 154static inline uint8_t 155RD1(struct sdhci_slot *slot, bus_size_t off) 156{ 157 bus_barrier(slot->mem_res, 0, 0xFF, 158 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); 159 return bus_read_1(slot->mem_res, off); 160} 161 --- 134 unchanged lines hidden (view full) --- 296 /* This is to force an update */ 297 clock = slot->clock; 298 slot->clock = 0; 299 sdhci_set_clock(slot, clock); 300 } 301 302 WR1(slot, SDHCI_SOFTWARE_RESET, mask); 303 |
311 if (mask & SDHCI_RESET_ALL) { | 304 if (mask & SDHCI_RESET_ALL) |
312 slot->clock = 0; | 305 slot->clock = 0; |
313 slot->power = 0; 314 } | |
315 316 /* Wait max 100 ms */ 317 timeout = 100; 318 /* Controller clears the bits when it's done */ 319 while ((res = RD1(slot, SDHCI_SOFTWARE_RESET)) & mask) { 320 if (timeout == 0) { 321 slot_printf(slot, 322 "Reset 0x%x never completed - 0x%x.\n", --- 413 unchanged lines hidden (view full) --- 736 subclass == PCIS_BASEPERIPH_SDHC && 737 progif != PCI_SDHCI_IFDMA) 738 slot->opt &= ~SDHCI_HAVE_DMA; 739 if (sc->quirks & SDHCI_QUIRK_BROKEN_DMA) 740 slot->opt &= ~SDHCI_HAVE_DMA; 741 if (sc->quirks & SDHCI_QUIRK_FORCE_DMA) 742 slot->opt |= SDHCI_HAVE_DMA; 743 | 306 307 /* Wait max 100 ms */ 308 timeout = 100; 309 /* Controller clears the bits when it's done */ 310 while ((res = RD1(slot, SDHCI_SOFTWARE_RESET)) & mask) { 311 if (timeout == 0) { 312 slot_printf(slot, 313 "Reset 0x%x never completed - 0x%x.\n", --- 413 unchanged lines hidden (view full) --- 727 subclass == PCIS_BASEPERIPH_SDHC && 728 progif != PCI_SDHCI_IFDMA) 729 slot->opt &= ~SDHCI_HAVE_DMA; 730 if (sc->quirks & SDHCI_QUIRK_BROKEN_DMA) 731 slot->opt &= ~SDHCI_HAVE_DMA; 732 if (sc->quirks & SDHCI_QUIRK_FORCE_DMA) 733 slot->opt |= SDHCI_HAVE_DMA; 734 |
744 if (bootverbose || sdhci_debug) { | 735 if (bootverbose) { |
745 slot_printf(slot, "%uMHz%s 4bits%s%s%s %s\n", 746 slot->max_clk / 1000000, 747 (caps & SDHCI_CAN_DO_HISPD) ? " HS" : "", 748 (caps & SDHCI_CAN_VDD_330) ? " 3.3V" : "", 749 (caps & SDHCI_CAN_VDD_300) ? " 3.0V" : "", 750 (caps & SDHCI_CAN_VDD_180) ? " 1.8V" : "", 751 (slot->opt & SDHCI_HAVE_DMA) ? "DMA" : "PIO"); 752 sdhci_dumpregs(slot); --- 53 unchanged lines hidden (view full) --- 806 bus_release_resource(dev, SYS_RES_MEMORY, 807 slot->mem_rid, slot->mem_res); 808 SDHCI_LOCK_DESTROY(slot); 809 } 810 return (0); 811} 812 813static int | 736 slot_printf(slot, "%uMHz%s 4bits%s%s%s %s\n", 737 slot->max_clk / 1000000, 738 (caps & SDHCI_CAN_DO_HISPD) ? " HS" : "", 739 (caps & SDHCI_CAN_VDD_330) ? " 3.3V" : "", 740 (caps & SDHCI_CAN_VDD_300) ? " 3.0V" : "", 741 (caps & SDHCI_CAN_VDD_180) ? " 1.8V" : "", 742 (slot->opt & SDHCI_HAVE_DMA) ? "DMA" : "PIO"); 743 sdhci_dumpregs(slot); --- 53 unchanged lines hidden (view full) --- 797 bus_release_resource(dev, SYS_RES_MEMORY, 798 slot->mem_rid, slot->mem_res); 799 SDHCI_LOCK_DESTROY(slot); 800 } 801 return (0); 802} 803 804static int |
814sdhci_suspend(device_t dev) 815{ 816 struct sdhci_softc *sc = device_get_softc(dev); 817 int i, err; 818 819 err = bus_generic_suspend(dev); 820 if (err) 821 return (err); 822 for (i = 0; i < sc->num_slots; i++) 823 sdhci_reset(&sc->slots[i], SDHCI_RESET_ALL); 824 return (0); 825} 826 827static int 828sdhci_resume(device_t dev) 829{ 830 struct sdhci_softc *sc = device_get_softc(dev); 831 int i; 832 833 for (i = 0; i < sc->num_slots; i++) 834 sdhci_init(&sc->slots[i]); 835 return (bus_generic_resume(dev)); 836} 837 838static int | |
839sdhci_update_ios(device_t brdev, device_t reqdev) 840{ 841 struct sdhci_slot *slot = device_get_ivars(reqdev); 842 struct mmc_ios *ios = &slot->host.ios; 843 844 SDHCI_LOCK(slot); 845 /* Do full reset on bus power down to clear from any state. */ 846 if (ios->power_mode == power_off) { --- 61 unchanged lines hidden (view full) --- 908 slot->req = NULL; 909 slot->curcmd = NULL; 910 req->done(req); 911 return; 912 } 913 914 /* Read controller present state. */ 915 state = RD4(slot, SDHCI_PRESENT_STATE); | 805sdhci_update_ios(device_t brdev, device_t reqdev) 806{ 807 struct sdhci_slot *slot = device_get_ivars(reqdev); 808 struct mmc_ios *ios = &slot->host.ios; 809 810 SDHCI_LOCK(slot); 811 /* Do full reset on bus power down to clear from any state. */ 812 if (ios->power_mode == power_off) { --- 61 unchanged lines hidden (view full) --- 874 slot->req = NULL; 875 slot->curcmd = NULL; 876 req->done(req); 877 return; 878 } 879 880 /* Read controller present state. */ 881 state = RD4(slot, SDHCI_PRESENT_STATE); |
916 /* Do not issue command if there is no card, clock or power. 917 * Controller will not detect timeout without clock active. */ 918 if ((state & SDHCI_CARD_PRESENT) == 0 || 919 slot->power == 0 || 920 slot->clock == 0) { | 882 /* Do not issue command if there is no card. */ 883 if ((state & SDHCI_CARD_PRESENT) == 0) { |
921 cmd->error = MMC_ERR_FAILED; 922 slot->req = NULL; 923 slot->curcmd = NULL; 924 req->done(req); 925 return; 926 } 927 /* Always wait for free CMD bus. */ 928 mask = SDHCI_CMD_INHIBIT; --- 219 unchanged lines hidden (view full) --- 1148 } 1149/* We don't need this until using Auto-CMD12 feature 1150 if (!(slot->flags & STOP_STARTED) && req->stop) { 1151 slot->flags |= STOP_STARTED; 1152 sdhci_start_command(slot, req->stop); 1153 return; 1154 } 1155*/ | 884 cmd->error = MMC_ERR_FAILED; 885 slot->req = NULL; 886 slot->curcmd = NULL; 887 req->done(req); 888 return; 889 } 890 /* Always wait for free CMD bus. */ 891 mask = SDHCI_CMD_INHIBIT; --- 219 unchanged lines hidden (view full) --- 1111 } 1112/* We don't need this until using Auto-CMD12 feature 1113 if (!(slot->flags & STOP_STARTED) && req->stop) { 1114 slot->flags |= STOP_STARTED; 1115 sdhci_start_command(slot, req->stop); 1116 return; 1117 } 1118*/ |
1156 if (sdhci_debug > 1) 1157 slot_printf(slot, "result: %d\n", req->cmd->error); 1158 if (!req->cmd->error && 1159 (slot->sc->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST)) { | 1119 if (req->cmd->error) { 1120 if (bootverbose) { 1121 slot_printf(slot, 1122 "Command error %d (opcode %u arg %u flags %u " 1123 "dlen %u dflags %u)\n", 1124 req->cmd->error, req->cmd->opcode, req->cmd->arg, 1125 req->cmd->flags, 1126 (req->cmd->data)?(u_int)req->cmd->data->len:0, 1127 (req->cmd->data)?(u_int)req->cmd->data->flags:0); 1128 } 1129 } else if (slot->sc->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST) { |
1160 sdhci_reset(slot, SDHCI_RESET_CMD); 1161 sdhci_reset(slot, SDHCI_RESET_DATA); 1162 } 1163 1164 /* We must be done -- bad idea to do this while locked? */ 1165 slot->req = NULL; 1166 slot->curcmd = NULL; 1167 req->done(req); --- 4 unchanged lines hidden (view full) --- 1172{ 1173 struct sdhci_slot *slot = device_get_ivars(reqdev); 1174 1175 SDHCI_LOCK(slot); 1176 if (slot->req != NULL) { 1177 SDHCI_UNLOCK(slot); 1178 return (EBUSY); 1179 } | 1130 sdhci_reset(slot, SDHCI_RESET_CMD); 1131 sdhci_reset(slot, SDHCI_RESET_DATA); 1132 } 1133 1134 /* We must be done -- bad idea to do this while locked? */ 1135 slot->req = NULL; 1136 slot->curcmd = NULL; 1137 req->done(req); --- 4 unchanged lines hidden (view full) --- 1142{ 1143 struct sdhci_slot *slot = device_get_ivars(reqdev); 1144 1145 SDHCI_LOCK(slot); 1146 if (slot->req != NULL) { 1147 SDHCI_UNLOCK(slot); 1148 return (EBUSY); 1149 } |
1180 if (sdhci_debug > 1) { 1181 slot_printf(slot, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n", 1182 req->cmd->opcode, req->cmd->arg, req->cmd->flags, 1183 (req->cmd->data)?(u_int)req->cmd->data->len:0, 1184 (req->cmd->data)?req->cmd->data->flags:0); 1185 } | 1150/* printf("%s cmd op %u arg %u flags %u data %ju\n", __func__, 1151 req->cmd->opcode, req->cmd->arg, req->cmd->flags, 1152 (req->cmd->data)?req->cmd->data->len:0); */ |
1186 slot->req = req; 1187 slot->flags = 0; 1188 sdhci_start(slot); 1189 SDHCI_UNLOCK(slot); | 1153 slot->req = req; 1154 slot->flags = 0; 1155 sdhci_start(slot); 1156 SDHCI_UNLOCK(slot); |
1190 if (dumping) { 1191 while (slot->req != NULL) { 1192 sdhci_intr(slot->sc); 1193 DELAY(10); 1194 } 1195 } | |
1196 return (0); 1197} 1198 1199static int 1200sdhci_get_ro(device_t brdev, device_t reqdev) 1201{ 1202 struct sdhci_slot *slot = device_get_ivars(reqdev); 1203 uint32_t val; --- 7 unchanged lines hidden (view full) --- 1211static int 1212sdhci_acquire_host(device_t brdev, device_t reqdev) 1213{ 1214 struct sdhci_slot *slot = device_get_ivars(reqdev); 1215 int err = 0; 1216 1217 SDHCI_LOCK(slot); 1218 while (slot->bus_busy) | 1157 return (0); 1158} 1159 1160static int 1161sdhci_get_ro(device_t brdev, device_t reqdev) 1162{ 1163 struct sdhci_slot *slot = device_get_ivars(reqdev); 1164 uint32_t val; --- 7 unchanged lines hidden (view full) --- 1172static int 1173sdhci_acquire_host(device_t brdev, device_t reqdev) 1174{ 1175 struct sdhci_slot *slot = device_get_ivars(reqdev); 1176 int err = 0; 1177 1178 SDHCI_LOCK(slot); 1179 while (slot->bus_busy) |
1219 msleep(slot, &slot->mtx, 0, "sdhciah", 0); | 1180 msleep(slot, &slot->mtx, PZERO, "sdhciah", hz / 5); |
1220 slot->bus_busy++; 1221 /* Activate led. */ 1222 WR1(slot, SDHCI_HOST_CONTROL, slot->hostctrl |= SDHCI_CTRL_LED); 1223 SDHCI_UNLOCK(slot); 1224 return (err); 1225} 1226 1227static int 1228sdhci_release_host(device_t brdev, device_t reqdev) 1229{ 1230 struct sdhci_slot *slot = device_get_ivars(reqdev); 1231 1232 SDHCI_LOCK(slot); 1233 /* Deactivate led. */ 1234 WR1(slot, SDHCI_HOST_CONTROL, slot->hostctrl &= ~SDHCI_CTRL_LED); 1235 slot->bus_busy--; | 1181 slot->bus_busy++; 1182 /* Activate led. */ 1183 WR1(slot, SDHCI_HOST_CONTROL, slot->hostctrl |= SDHCI_CTRL_LED); 1184 SDHCI_UNLOCK(slot); 1185 return (err); 1186} 1187 1188static int 1189sdhci_release_host(device_t brdev, device_t reqdev) 1190{ 1191 struct sdhci_slot *slot = device_get_ivars(reqdev); 1192 1193 SDHCI_LOCK(slot); 1194 /* Deactivate led. */ 1195 WR1(slot, SDHCI_HOST_CONTROL, slot->hostctrl &= ~SDHCI_CTRL_LED); 1196 slot->bus_busy--; |
1236 SDHCI_UNLOCK(slot); | |
1237 wakeup(slot); | 1197 wakeup(slot); |
1198 SDHCI_UNLOCK(slot); |
|
1238 return (0); 1239} 1240 1241static void 1242sdhci_cmd_irq(struct sdhci_slot *slot, uint32_t intmask) 1243{ 1244 1245 if (!slot->curcmd) { --- 121 unchanged lines hidden (view full) --- 1367 1368 SDHCI_LOCK(slot); 1369 /* Read slot interrupt status. */ 1370 intmask = RD4(slot, SDHCI_INT_STATUS); 1371 if (intmask == 0 || intmask == 0xffffffff) { 1372 SDHCI_UNLOCK(slot); 1373 continue; 1374 } | 1199 return (0); 1200} 1201 1202static void 1203sdhci_cmd_irq(struct sdhci_slot *slot, uint32_t intmask) 1204{ 1205 1206 if (!slot->curcmd) { --- 121 unchanged lines hidden (view full) --- 1328 1329 SDHCI_LOCK(slot); 1330 /* Read slot interrupt status. */ 1331 intmask = RD4(slot, SDHCI_INT_STATUS); 1332 if (intmask == 0 || intmask == 0xffffffff) { 1333 SDHCI_UNLOCK(slot); 1334 continue; 1335 } |
1375 if (sdhci_debug > 2) 1376 slot_printf(slot, "Interrupt %#x\n", intmask); 1377 | 1336/* 1337 slot_printf(slot, "got interrupt %x\n", intmask); 1338*/ |
1378 /* Handle card presence interrupts. */ 1379 if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { 1380 WR4(slot, SDHCI_INT_STATUS, intmask & 1381 (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)); 1382 1383 if (intmask & SDHCI_INT_CARD_REMOVE) { | 1339 /* Handle card presence interrupts. */ 1340 if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { 1341 WR4(slot, SDHCI_INT_STATUS, intmask & 1342 (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)); 1343 1344 if (intmask & SDHCI_INT_CARD_REMOVE) { |
1384 if (bootverbose || sdhci_debug) | 1345 if (bootverbose) |
1385 slot_printf(slot, "Card removed\n"); 1386 callout_stop(&slot->card_callout); 1387 taskqueue_enqueue(taskqueue_swi_giant, 1388 &slot->card_task); 1389 } 1390 if (intmask & SDHCI_INT_CARD_INSERT) { | 1346 slot_printf(slot, "Card removed\n"); 1347 callout_stop(&slot->card_callout); 1348 taskqueue_enqueue(taskqueue_swi_giant, 1349 &slot->card_task); 1350 } 1351 if (intmask & SDHCI_INT_CARD_INSERT) { |
1391 if (bootverbose || sdhci_debug) | 1352 if (bootverbose) |
1392 slot_printf(slot, "Card inserted\n"); 1393 callout_reset(&slot->card_callout, hz / 2, 1394 sdhci_card_delay, slot); 1395 } 1396 intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); 1397 } 1398 /* Handle command interrupts. */ 1399 if (intmask & SDHCI_INT_CMD_MASK) { --- 28 unchanged lines hidden (view full) --- 1428 sdhci_dumpregs(slot); 1429 } 1430 1431 SDHCI_UNLOCK(slot); 1432 } 1433} 1434 1435static int | 1353 slot_printf(slot, "Card inserted\n"); 1354 callout_reset(&slot->card_callout, hz / 2, 1355 sdhci_card_delay, slot); 1356 } 1357 intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); 1358 } 1359 /* Handle command interrupts. */ 1360 if (intmask & SDHCI_INT_CMD_MASK) { --- 28 unchanged lines hidden (view full) --- 1389 sdhci_dumpregs(slot); 1390 } 1391 1392 SDHCI_UNLOCK(slot); 1393 } 1394} 1395 1396static int |
1436sdhci_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) | 1397sdhci_read_ivar(device_t bus, device_t child, int which, u_char *result) |
1437{ 1438 struct sdhci_slot *slot = device_get_ivars(child); 1439 1440 switch (which) { 1441 default: 1442 return (EINVAL); 1443 case MMCBR_IVAR_BUS_MODE: 1444 *(int *)result = slot->host.ios.bus_mode; --- 29 unchanged lines hidden (view full) --- 1474 *(int *)result = slot->host.ios.vdd; 1475 break; 1476 case MMCBR_IVAR_CAPS: 1477 *(int *)result = slot->host.caps; 1478 break; 1479 case MMCBR_IVAR_TIMING: 1480 *(int *)result = slot->host.ios.timing; 1481 break; | 1398{ 1399 struct sdhci_slot *slot = device_get_ivars(child); 1400 1401 switch (which) { 1402 default: 1403 return (EINVAL); 1404 case MMCBR_IVAR_BUS_MODE: 1405 *(int *)result = slot->host.ios.bus_mode; --- 29 unchanged lines hidden (view full) --- 1435 *(int *)result = slot->host.ios.vdd; 1436 break; 1437 case MMCBR_IVAR_CAPS: 1438 *(int *)result = slot->host.caps; 1439 break; 1440 case MMCBR_IVAR_TIMING: 1441 *(int *)result = slot->host.ios.timing; 1442 break; |
1482 case MMCBR_IVAR_MAX_DATA: 1483 *(int *)result = 65535; 1484 break; | |
1485 } 1486 return (0); 1487} 1488 1489static int 1490sdhci_write_ivar(device_t bus, device_t child, int which, uintptr_t value) 1491{ 1492 struct sdhci_slot *slot = device_get_ivars(child); --- 38 unchanged lines hidden (view full) --- 1531 break; 1532 case MMCBR_IVAR_TIMING: 1533 slot->host.ios.timing = value; 1534 break; 1535 case MMCBR_IVAR_CAPS: 1536 case MMCBR_IVAR_HOST_OCR: 1537 case MMCBR_IVAR_F_MIN: 1538 case MMCBR_IVAR_F_MAX: | 1443 } 1444 return (0); 1445} 1446 1447static int 1448sdhci_write_ivar(device_t bus, device_t child, int which, uintptr_t value) 1449{ 1450 struct sdhci_slot *slot = device_get_ivars(child); --- 38 unchanged lines hidden (view full) --- 1489 break; 1490 case MMCBR_IVAR_TIMING: 1491 slot->host.ios.timing = value; 1492 break; 1493 case MMCBR_IVAR_CAPS: 1494 case MMCBR_IVAR_HOST_OCR: 1495 case MMCBR_IVAR_F_MIN: 1496 case MMCBR_IVAR_F_MAX: |
1539 case MMCBR_IVAR_MAX_DATA: | |
1540 return (EINVAL); 1541 } 1542 return (0); 1543} 1544 1545static device_method_t sdhci_methods[] = { 1546 /* device_if */ 1547 DEVMETHOD(device_probe, sdhci_probe), 1548 DEVMETHOD(device_attach, sdhci_attach), 1549 DEVMETHOD(device_detach, sdhci_detach), | 1497 return (EINVAL); 1498 } 1499 return (0); 1500} 1501 1502static device_method_t sdhci_methods[] = { 1503 /* device_if */ 1504 DEVMETHOD(device_probe, sdhci_probe), 1505 DEVMETHOD(device_attach, sdhci_attach), 1506 DEVMETHOD(device_detach, sdhci_detach), |
1550 DEVMETHOD(device_suspend, sdhci_suspend), 1551 DEVMETHOD(device_resume, sdhci_resume), | |
1552 1553 /* Bus interface */ 1554 DEVMETHOD(bus_read_ivar, sdhci_read_ivar), 1555 DEVMETHOD(bus_write_ivar, sdhci_write_ivar), 1556 1557 /* mmcbr_if */ 1558 DEVMETHOD(mmcbr_update_ios, sdhci_update_ios), 1559 DEVMETHOD(mmcbr_request, sdhci_request), --- 16 unchanged lines hidden --- | 1507 1508 /* Bus interface */ 1509 DEVMETHOD(bus_read_ivar, sdhci_read_ivar), 1510 DEVMETHOD(bus_write_ivar, sdhci_write_ivar), 1511 1512 /* mmcbr_if */ 1513 DEVMETHOD(mmcbr_update_ios, sdhci_update_ios), 1514 DEVMETHOD(mmcbr_request, sdhci_request), --- 16 unchanged lines hidden --- |