diff options
author | David-John Willis <John.Willis@Distant-earth.com> | 2009-11-17 11:50:09 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-11-18 17:09:24 -0500 |
commit | c95cf3d09adc9afe7816a13a920b6df36062a3fe (patch) | |
tree | 6f7b922526c4ae4fa1d593d8bcd89738d37a2784 | |
parent | 7010193ad8e64dfbc006b167c2ee712d4441292c (diff) |
wl1251: add NVS in EEPROM support
wl1251 supports also that NVS is stored in a separate EEPROM, add support
for that.
kvalo: use platform data instead Kconfig and use kernel style
Signed-off-by: David-John Willis <John.Willis@Distant-earth.com>
Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1251.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1251_boot.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1251_reg.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1251_spi.c | 2 | ||||
-rw-r--r-- | include/linux/spi/wl12xx.h | 1 |
5 files changed, 23 insertions, 7 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1251.h b/drivers/net/wireless/wl12xx/wl1251.h index a839466664f..054533f7a12 100644 --- a/drivers/net/wireless/wl12xx/wl1251.h +++ b/drivers/net/wireless/wl12xx/wl1251.h | |||
@@ -269,6 +269,7 @@ struct wl1251 { | |||
269 | 269 | ||
270 | void (*set_power)(bool enable); | 270 | void (*set_power)(bool enable); |
271 | int irq; | 271 | int irq; |
272 | bool use_eeprom; | ||
272 | 273 | ||
273 | enum wl1251_state state; | 274 | enum wl1251_state state; |
274 | struct mutex mutex; | 275 | struct mutex mutex; |
diff --git a/drivers/net/wireless/wl12xx/wl1251_boot.c b/drivers/net/wireless/wl12xx/wl1251_boot.c index 5094f24ad03..2e733e7bdfd 100644 --- a/drivers/net/wireless/wl12xx/wl1251_boot.c +++ b/drivers/net/wireless/wl12xx/wl1251_boot.c | |||
@@ -494,13 +494,19 @@ int wl1251_boot(struct wl1251 *wl) | |||
494 | goto out; | 494 | goto out; |
495 | 495 | ||
496 | /* 2. start processing NVS file */ | 496 | /* 2. start processing NVS file */ |
497 | ret = wl1251_boot_upload_nvs(wl); | 497 | if (wl->use_eeprom) { |
498 | if (ret < 0) | 498 | wl1251_reg_write32(wl, ACX_REG_EE_START, START_EEPROM_MGR); |
499 | goto out; | 499 | msleep(4000); |
500 | 500 | wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, USE_EEPROM); | |
501 | /* write firmware's last address (ie. it's length) to | 501 | } else { |
502 | * ACX_EEPROMLESS_IND_REG */ | 502 | ret = wl1251_boot_upload_nvs(wl); |
503 | wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, wl->fw_len); | 503 | if (ret < 0) |
504 | goto out; | ||
505 | |||
506 | /* write firmware's last address (ie. it's length) to | ||
507 | * ACX_EEPROMLESS_IND_REG */ | ||
508 | wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, wl->fw_len); | ||
509 | } | ||
504 | 510 | ||
505 | /* 6. read the EEPROM parameters */ | 511 | /* 6. read the EEPROM parameters */ |
506 | tmp = wl1251_reg_read32(wl, SCR_PAD2); | 512 | tmp = wl1251_reg_read32(wl, SCR_PAD2); |
diff --git a/drivers/net/wireless/wl12xx/wl1251_reg.h b/drivers/net/wireless/wl12xx/wl1251_reg.h index 06e1bd94a73..0ca3b432605 100644 --- a/drivers/net/wireless/wl12xx/wl1251_reg.h +++ b/drivers/net/wireless/wl12xx/wl1251_reg.h | |||
@@ -370,6 +370,7 @@ enum wl12xx_acx_int_reg { | |||
370 | EEPROM location specified in the EE_ADDR register. | 370 | EEPROM location specified in the EE_ADDR register. |
371 | The Wlan hardware hardware clears this bit automatically. | 371 | The Wlan hardware hardware clears this bit automatically. |
372 | *===============================================*/ | 372 | *===============================================*/ |
373 | #define EE_CTL (REGISTERS_BASE + 0x2000) | ||
373 | #define ACX_EE_CTL_REG EE_CTL | 374 | #define ACX_EE_CTL_REG EE_CTL |
374 | #define EE_WRITE 0x00000001ul | 375 | #define EE_WRITE 0x00000001ul |
375 | #define EE_READ 0x00000002ul | 376 | #define EE_READ 0x00000002ul |
@@ -380,6 +381,7 @@ enum wl12xx_acx_int_reg { | |||
380 | This register specifies the address | 381 | This register specifies the address |
381 | within the EEPROM from/to which to read/write data. | 382 | within the EEPROM from/to which to read/write data. |
382 | ===============================================*/ | 383 | ===============================================*/ |
384 | #define EE_ADDR (REGISTERS_BASE + 0x2008) | ||
383 | #define ACX_EE_ADDR_REG EE_ADDR | 385 | #define ACX_EE_ADDR_REG EE_ADDR |
384 | 386 | ||
385 | /*=============================================== | 387 | /*=============================================== |
@@ -389,8 +391,12 @@ enum wl12xx_acx_int_reg { | |||
389 | data from the EEPROM or the write data | 391 | data from the EEPROM or the write data |
390 | to be written to the EEPROM. | 392 | to be written to the EEPROM. |
391 | ===============================================*/ | 393 | ===============================================*/ |
394 | #define EE_DATA (REGISTERS_BASE + 0x2004) | ||
392 | #define ACX_EE_DATA_REG EE_DATA | 395 | #define ACX_EE_DATA_REG EE_DATA |
393 | 396 | ||
397 | #define EEPROM_ACCESS_TO 10000 /* timeout counter */ | ||
398 | #define START_EEPROM_MGR 0x00000001 | ||
399 | |||
394 | /*=============================================== | 400 | /*=============================================== |
395 | EEPROM Base Address - 32bit RW | 401 | EEPROM Base Address - 32bit RW |
396 | ------------------------------------------ | 402 | ------------------------------------------ |
diff --git a/drivers/net/wireless/wl12xx/wl1251_spi.c b/drivers/net/wireless/wl12xx/wl1251_spi.c index 2cf8a2169d4..9cc8c323830 100644 --- a/drivers/net/wireless/wl12xx/wl1251_spi.c +++ b/drivers/net/wireless/wl12xx/wl1251_spi.c | |||
@@ -270,6 +270,8 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi) | |||
270 | return -ENODEV; | 270 | return -ENODEV; |
271 | } | 271 | } |
272 | 272 | ||
273 | wl->use_eeprom = pdata->use_eeprom; | ||
274 | |||
273 | ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl); | 275 | ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl); |
274 | if (ret < 0) { | 276 | if (ret < 0) { |
275 | wl1251_error("request_irq() failed: %d", ret); | 277 | wl1251_error("request_irq() failed: %d", ret); |
diff --git a/include/linux/spi/wl12xx.h b/include/linux/spi/wl12xx.h index 11430cab2aa..aed64ed3dc8 100644 --- a/include/linux/spi/wl12xx.h +++ b/include/linux/spi/wl12xx.h | |||
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | struct wl12xx_platform_data { | 27 | struct wl12xx_platform_data { |
28 | void (*set_power)(bool enable); | 28 | void (*set_power)(bool enable); |
29 | bool use_eeprom; | ||
29 | }; | 30 | }; |
30 | 31 | ||
31 | #endif | 32 | #endif |