提交 ea2db495 编写于 作者: R Rafał Miłecki 提交者: John W. Linville

ssb: Look for SPROM at different offset on higher rev CC

Our offset handling becomes even a little more hackish now. For some reason I
do not understand all offsets as inrelative. It assumes base offset is 0x1000
but it will work for now as we make offsets relative anyway by removing base
0x1000. Should be cleaner however.
Signed-off-by: NRafał Miłecki <zajec5@gmail.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 d53cdbb9
...@@ -167,7 +167,7 @@ int ssb_pci_xtal(struct ssb_bus *bus, u32 what, int turn_on) ...@@ -167,7 +167,7 @@ int ssb_pci_xtal(struct ssb_bus *bus, u32 what, int turn_on)
} }
/* Get the word-offset for a SSB_SPROM_XXX define. */ /* Get the word-offset for a SSB_SPROM_XXX define. */
#define SPOFF(offset) (((offset) - SSB_SPROM_BASE) / sizeof(u16)) #define SPOFF(offset) (((offset) - SSB_SPROM_BASE1) / sizeof(u16))
/* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */ /* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */
#define SPEX16(_outvar, _offset, _mask, _shift) \ #define SPEX16(_outvar, _offset, _mask, _shift) \
out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift))
...@@ -253,7 +253,7 @@ static int sprom_do_read(struct ssb_bus *bus, u16 *sprom) ...@@ -253,7 +253,7 @@ static int sprom_do_read(struct ssb_bus *bus, u16 *sprom)
int i; int i;
for (i = 0; i < bus->sprom_size; i++) for (i = 0; i < bus->sprom_size; i++)
sprom[i] = ioread16(bus->mmio + SSB_SPROM_BASE + (i * 2)); sprom[i] = ioread16(bus->mmio + bus->sprom_offset + (i * 2));
return 0; return 0;
} }
...@@ -284,7 +284,7 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom) ...@@ -284,7 +284,7 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)
ssb_printk("75%%"); ssb_printk("75%%");
else if (i % 2) else if (i % 2)
ssb_printk("."); ssb_printk(".");
writew(sprom[i], bus->mmio + SSB_SPROM_BASE + (i * 2)); writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2));
mmiowb(); mmiowb();
msleep(20); msleep(20);
} }
...@@ -625,6 +625,9 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, ...@@ -625,6 +625,9 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
return -ENODEV; return -ENODEV;
} }
bus->sprom_offset = (bus->chipco.dev->id.revision < 31) ?
SSB_SPROM_BASE1 : SSB_SPROM_BASE31;
buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
if (!buf) if (!buf)
goto out; goto out;
......
...@@ -305,6 +305,7 @@ struct ssb_bus { ...@@ -305,6 +305,7 @@ struct ssb_bus {
/* ID information about the Chip. */ /* ID information about the Chip. */
u16 chip_id; u16 chip_id;
u16 chip_rev; u16 chip_rev;
u16 sprom_offset;
u16 sprom_size; /* number of words in sprom */ u16 sprom_size; /* number of words in sprom */
u8 chip_package; u8 chip_package;
......
...@@ -170,7 +170,8 @@ ...@@ -170,7 +170,8 @@
#define SSB_SPROMSIZE_WORDS_R4 220 #define SSB_SPROMSIZE_WORDS_R4 220
#define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16))
#define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16))
#define SSB_SPROM_BASE 0x1000 #define SSB_SPROM_BASE1 0x1000
#define SSB_SPROM_BASE31 0x0800
#define SSB_SPROM_REVISION 0x107E #define SSB_SPROM_REVISION 0x107E
#define SSB_SPROM_REVISION_REV 0x00FF /* SPROM Revision number */ #define SSB_SPROM_REVISION_REV 0x00FF /* SPROM Revision number */
#define SSB_SPROM_REVISION_CRC 0xFF00 /* SPROM CRC8 value */ #define SSB_SPROM_REVISION_CRC 0xFF00 /* SPROM CRC8 value */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册