diff options
author | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-05-16 01:23:55 +0000 |
---|---|---|
committer | Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> | 2009-05-16 01:23:55 +0000 |
commit | 6ca891fa724407aad3a1ece0957a41686619f1e9 (patch) | |
tree | 7e77126eedcc62dbf83c65cb365d597b7cbb1d03 /internal.c | |
parent | d3b8270a7f20c63e63fc1f6e49c18f9f18b45bde (diff) | |
download | flashrom-6ca891fa724407aad3a1ece0957a41686619f1e9.zip flashrom-6ca891fa724407aad3a1ece0957a41686619f1e9.tar.gz |
Add generic 16 bit and 32 bit chip read/write emulation to the external flasher infrastructure
The emulation works by splitting 32 bit accesses into 16 bit accesses and 16
bit accesses into to 8 bit accesses. That way, external flashers can mix and
match the amount of emulation they need.
Corresponding to flashrom svn r517.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>
Diffstat (limited to 'internal.c')
-rw-r--r-- | internal.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -168,3 +168,34 @@ uint32_t internal_chip_readl(const volatile void *addr) return *(volatile uint32_t *) addr; } +/* Little-endian fallback for drivers not supporting 16 bit accesses */ +void fallback_chip_writew(uint16_t val, volatile void *addr) +{ + chip_writeb(val & 0xff, addr); + chip_writeb((val >> 8) & 0xff, addr + 1); +} + +/* Little-endian fallback for drivers not supporting 16 bit accesses */ +uint16_t fallback_chip_readw(const volatile void *addr) +{ + uint16_t val; + val = chip_readb(addr); + val |= chip_readb(addr + 1) << 8; + return val; +} + +/* Little-endian fallback for drivers not supporting 32 bit accesses */ +void fallback_chip_writel(uint32_t val, volatile void *addr) +{ + chip_writew(val & 0xffff, addr); + chip_writew((val >> 16) & 0xffff, addr + 2); +} + +/* Little-endian fallback for drivers not supporting 32 bit accesses */ +uint32_t fallback_chip_readl(const volatile void *addr) +{ + uint32_t val; + val = chip_readw(addr); + val |= chip_readw(addr + 2) << 16; + return val; +} |