| From ea2db495f92ad2cf3301623e60cb95b4062bc484 Mon Sep 17 00:00:00 2001 |
| From: Rafał Miłecki <zajec5@gmail.com> |
| Date: Wed, 31 Mar 2010 21:59:21 +0200 |
| Subject: ssb: Look for SPROM at different offset on higher rev CC |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Rafał Miłecki <zajec5@gmail.com> |
| |
| commit ea2db495f92ad2cf3301623e60cb95b4062bc484 upstream. |
| |
| 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: Rafał Miłecki <zajec5@gmail.com> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Cc: Larry Finger <Larry.Finger@lwfinger.net> |
| Cc: Ben Hutchings <ben@decadent.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| |
| --- |
| drivers/ssb/pci.c | 9 ++++++--- |
| include/linux/ssb/ssb.h | 1 + |
| include/linux/ssb/ssb_regs.h | 3 ++- |
| 3 files changed, 9 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/ssb/pci.c |
| +++ b/drivers/ssb/pci.c |
| @@ -168,7 +168,7 @@ err_pci: |
| } |
| |
| /* 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. */ |
| #define SPEX16(_outvar, _offset, _mask, _shift) \ |
| out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) |
| @@ -254,7 +254,7 @@ static int sprom_do_read(struct ssb_bus |
| int 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; |
| } |
| @@ -285,7 +285,7 @@ static int sprom_do_write(struct ssb_bus |
| ssb_printk("75%%"); |
| else if (i % 2) |
| ssb_printk("."); |
| - writew(sprom[i], bus->mmio + SSB_SPROM_BASE + (i * 2)); |
| + writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2)); |
| mmiowb(); |
| msleep(20); |
| } |
| @@ -626,6 +626,9 @@ static int ssb_pci_sprom_get(struct ssb_ |
| 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); |
| if (!buf) |
| goto out; |
| --- a/include/linux/ssb/ssb.h |
| +++ b/include/linux/ssb/ssb.h |
| @@ -305,6 +305,7 @@ struct ssb_bus { |
| /* ID information about the Chip. */ |
| u16 chip_id; |
| u16 chip_rev; |
| + u16 sprom_offset; |
| u16 sprom_size; /* number of words in sprom */ |
| u8 chip_package; |
| |
| --- a/include/linux/ssb/ssb_regs.h |
| +++ b/include/linux/ssb/ssb_regs.h |
| @@ -170,7 +170,8 @@ |
| #define SSB_SPROMSIZE_WORDS_R4 220 |
| #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * 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_REV 0x00FF /* SPROM Revision number */ |
| #define SSB_SPROM_REVISION_CRC 0xFF00 /* SPROM CRC8 value */ |