revert between 56095 -> 55830 in arch
[AROS.git] / rom / devs / sdcard / sdcard_mmcunit.c
blob888b578fa9059e1c64b5fd5f8a39efab2328900d
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
7 #include <aros/debug.h>
9 #include <hardware/mmc.h>
10 #include <hardware/sdhc.h>
12 #include "sdcard_base.h"
13 #include "sdcard_unit.h"
15 ULONG FNAME_SDCUNIT(MMCSwitch)(UBYTE offset, UBYTE value, struct sdcard_Unit *sdcUnit)
17 struct TagItem sdcSwitchTags[] =
19 {SDCARD_TAG_CMD, MMC_CMD_SWITCH},
20 {SDCARD_TAG_ARG, 0},
21 {SDCARD_TAG_RSPTYPE, MMC_RSP_R1b},
22 {SDCARD_TAG_RSP, 0},
23 {TAG_DONE, 0}
25 ULONG retVal;
27 D(bug("[SDCard%02ld] %s()\n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__));
29 sdcSwitchTags[1].ti_Data = (MMC_SWITCH_WRITE_BYTE << 24) | (offset << 16) | (value << 8);
31 if ((retVal = FNAME_SDCBUS(SendCmd)(sdcSwitchTags, sdcUnit->sdcu_Bus)) != -1)
33 if ((retVal = FNAME_SDCBUS(WaitCmd)(SDHCI_PS_CMD_INHIBIT|SDHCI_PS_DATA_INHIBIT, 1000, sdcUnit->sdcu_Bus)) != -1)
35 /* Wait for units ready status */
36 FNAME_SDCUNIT(WaitStatus)(1000, sdcUnit);
39 return retVal;
42 ULONG FNAME_SDCUNIT(MMCChangeFrequency)(struct sdcard_Unit *sdcUnit)
44 UBYTE sdcRespBuf[512];
45 UBYTE sdcCardType;
46 struct TagItem sdcChFreqTags[] =
48 {SDCARD_TAG_CMD, MMC_CMD_SEND_EXT_CSD},
49 {SDCARD_TAG_ARG, 0},
50 {SDCARD_TAG_RSPTYPE, MMC_RSP_R1},
51 {SDCARD_TAG_RSP, 0},
52 {SDCARD_TAG_DATA, (IPTR)sdcRespBuf},
53 {SDCARD_TAG_DATALEN, 512},
54 {SDCARD_TAG_DATAFLAGS, MMC_DATA_READ},
55 {TAG_DONE, 0}
58 D(bug("[SDCard%02ld] %s()\n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__));
60 if (sdcUnit->sdcu_Bus->sdcb_BusFlags & AF_Bus_SPI)
61 return 0;
63 D(bug("[SDCard%02ld] %s: Querying Ext_CSD ... \n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__));
64 if ((FNAME_SDCBUS(SendCmd)(sdcChFreqTags, sdcUnit->sdcu_Bus) == -1) || (FNAME_SDCBUS(WaitCmd)(SDHCI_PS_CMD_INHIBIT|SDHCI_PS_DATA_INHIBIT, 1000, sdcUnit->sdcu_Bus) == -1))
66 D(bug("[SDCard%02ld] %s: Query Failed\n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__));
67 return 0;
69 D(bug("[SDCard%02ld] %s: Query Response = %08x\n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__, sdcChFreqTags[3].ti_Data));
71 sdcCardType = sdcRespBuf[0xC4] & 0xF;
73 D(bug("[SDCard%02ld] %s: CardType = %d\n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__, sdcCardType));
75 if (FNAME_SDCUNIT(MMCSwitch)(EXT_CSD_HS_TIMING, 1, sdcUnit) != -1)
77 D(bug("[SDCard%02ld] %s: Switch failed\n", sdcUnit->sdcu_UnitNum, __PRETTY_FUNCTION__));
78 return -1;
81 if ((FNAME_SDCBUS(SendCmd)(sdcChFreqTags, sdcUnit->sdcu_Bus) != -1) && (FNAME_SDCBUS(WaitCmd)(SDHCI_PS_CMD_INHIBIT|SDHCI_PS_DATA_INHIBIT, 1000, sdcUnit->sdcu_Bus) != -1))
83 if (sdcRespBuf[0xB9])
85 /* MMC supports 26MHz High-Speed mode .. */
86 sdcUnit->sdcu_Flags |= AF_Card_HighSpeed;
88 /* is 52MHz mode also supported? */
89 if (sdcCardType & MMC_HS_52MHZ)
90 sdcUnit->sdcu_Flags |= AF_Card_HighSpeed52;
93 return 0;