Commit c95cf3d0 authored by David-John Willis's avatar David-John Willis Committed by John W. Linville

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: default avatarDavid-John Willis <John.Willis@Distant-earth.com>
Signed-off-by: default avatarKalle Valo <kalle.valo@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7010193a
...@@ -269,6 +269,7 @@ struct wl1251 { ...@@ -269,6 +269,7 @@ struct wl1251 {
void (*set_power)(bool enable); void (*set_power)(bool enable);
int irq; int irq;
bool use_eeprom;
enum wl1251_state state; enum wl1251_state state;
struct mutex mutex; struct mutex mutex;
......
...@@ -494,6 +494,11 @@ int wl1251_boot(struct wl1251 *wl) ...@@ -494,6 +494,11 @@ int wl1251_boot(struct wl1251 *wl)
goto out; goto out;
/* 2. start processing NVS file */ /* 2. start processing NVS file */
if (wl->use_eeprom) {
wl1251_reg_write32(wl, ACX_REG_EE_START, START_EEPROM_MGR);
msleep(4000);
wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, USE_EEPROM);
} else {
ret = wl1251_boot_upload_nvs(wl); ret = wl1251_boot_upload_nvs(wl);
if (ret < 0) if (ret < 0)
goto out; goto out;
...@@ -501,6 +506,7 @@ int wl1251_boot(struct wl1251 *wl) ...@@ -501,6 +506,7 @@ int wl1251_boot(struct wl1251 *wl)
/* write firmware's last address (ie. it's length) to /* write firmware's last address (ie. it's length) to
* ACX_EEPROMLESS_IND_REG */ * ACX_EEPROMLESS_IND_REG */
wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, wl->fw_len); wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, wl->fw_len);
}
/* 6. read the EEPROM parameters */ /* 6. read the EEPROM parameters */
tmp = wl1251_reg_read32(wl, SCR_PAD2); tmp = wl1251_reg_read32(wl, SCR_PAD2);
......
...@@ -370,6 +370,7 @@ enum wl12xx_acx_int_reg { ...@@ -370,6 +370,7 @@ enum wl12xx_acx_int_reg {
EEPROM location specified in the EE_ADDR register. EEPROM location specified in the EE_ADDR register.
The Wlan hardware hardware clears this bit automatically. The Wlan hardware hardware clears this bit automatically.
*===============================================*/ *===============================================*/
#define EE_CTL (REGISTERS_BASE + 0x2000)
#define ACX_EE_CTL_REG EE_CTL #define ACX_EE_CTL_REG EE_CTL
#define EE_WRITE 0x00000001ul #define EE_WRITE 0x00000001ul
#define EE_READ 0x00000002ul #define EE_READ 0x00000002ul
...@@ -380,6 +381,7 @@ enum wl12xx_acx_int_reg { ...@@ -380,6 +381,7 @@ enum wl12xx_acx_int_reg {
This register specifies the address This register specifies the address
within the EEPROM from/to which to read/write data. within the EEPROM from/to which to read/write data.
===============================================*/ ===============================================*/
#define EE_ADDR (REGISTERS_BASE + 0x2008)
#define ACX_EE_ADDR_REG EE_ADDR #define ACX_EE_ADDR_REG EE_ADDR
/*=============================================== /*===============================================
...@@ -389,8 +391,12 @@ enum wl12xx_acx_int_reg { ...@@ -389,8 +391,12 @@ enum wl12xx_acx_int_reg {
data from the EEPROM or the write data data from the EEPROM or the write data
to be written to the EEPROM. to be written to the EEPROM.
===============================================*/ ===============================================*/
#define EE_DATA (REGISTERS_BASE + 0x2004)
#define ACX_EE_DATA_REG EE_DATA #define ACX_EE_DATA_REG EE_DATA
#define EEPROM_ACCESS_TO 10000 /* timeout counter */
#define START_EEPROM_MGR 0x00000001
/*=============================================== /*===============================================
EEPROM Base Address - 32bit RW EEPROM Base Address - 32bit RW
------------------------------------------ ------------------------------------------
......
...@@ -270,6 +270,8 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi) ...@@ -270,6 +270,8 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi)
return -ENODEV; return -ENODEV;
} }
wl->use_eeprom = pdata->use_eeprom;
ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl); ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl);
if (ret < 0) { if (ret < 0) {
wl1251_error("request_irq() failed: %d", ret); wl1251_error("request_irq() failed: %d", ret);
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
struct wl12xx_platform_data { struct wl12xx_platform_data {
void (*set_power)(bool enable); void (*set_power)(bool enable);
bool use_eeprom;
}; };
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment