From cc4febd1c22bdb0ff4c57135d7da7767554e0ad9 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 24 Jun 2015 12:07:10 +0200 Subject: [PATCH] sd_card: SDHCI quirk for 136-bit responses --- repos/os/src/drivers/sd_card/rpi/sdhci.h | 36 ++++++++++++++++++------ 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/repos/os/src/drivers/sd_card/rpi/sdhci.h b/repos/os/src/drivers/sd_card/rpi/sdhci.h index 801327ede..915d779fd 100644 --- a/repos/os/src/drivers/sd_card/rpi/sdhci.h +++ b/repos/os/src/drivers/sd_card/rpi/sdhci.h @@ -42,6 +42,26 @@ struct Sdhci : Genode::Mmio struct Resp2 : Register<0x18, 32> { }; struct Resp3 : Register<0x1c, 32> { }; + /* + * Handle the SDHCI quirk that responses of 136-bit requests are shifted + * by 8 bits. + */ + template + struct Cmdresp_tpl : Register + { + struct Resp_8_24 : Register::template Bitfield<0, 24> { }; + struct Resp_0_8 : Register::template Bitfield<24, 8> { }; + }; + struct Cmdresp0 : Cmdresp_tpl<0x10> { }; + struct Cmdresp1 : Cmdresp_tpl<0x14> { }; + struct Cmdresp2 : Cmdresp_tpl<0x18> { }; + struct Cmdresp3 : Cmdresp_tpl<0x1c> { }; + + struct Resp0_136 : Genode::Bitset_2 { }; + struct Resp1_136 : Genode::Bitset_2 { }; + struct Resp2_136 : Genode::Bitset_2 { }; + struct Resp3_136 : Genode::Bitset_2 { }; + struct Data : Register<0x20, 32> { }; struct Control0 : Register<0x28, 32> @@ -355,20 +375,20 @@ struct Sdhci_controller : private Sdhci, public Sd_card::Host_controller Sd_card::Cid _read_cid() { Sd_card::Cid cid; - cid.raw_0 = read(); - cid.raw_1 = read(); - cid.raw_2 = read(); - cid.raw_3 = read(); + cid.raw_0 = read(); + cid.raw_1 = read(); + cid.raw_2 = read(); + cid.raw_3 = read(); return cid; } Sd_card::Csd _read_csd() { Sd_card::Csd csd; - csd.csd0 = read(); - csd.csd1 = read(); - csd.csd2 = read(); - csd.csd3 = read(); + csd.csd0 = read(); + csd.csd1 = read(); + csd.csd2 = read(); + csd.csd3 = read(); return csd; }