mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 19:56:18 +00:00
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>
This commit is contained in:
parent
7010193ad8
commit
c95cf3d09a
5 changed files with 22 additions and 6 deletions
|
@ -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,13 +494,19 @@ int wl1251_boot(struct wl1251 *wl)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* 2. start processing NVS file */
|
/* 2. start processing NVS file */
|
||||||
ret = wl1251_boot_upload_nvs(wl);
|
if (wl->use_eeprom) {
|
||||||
if (ret < 0)
|
wl1251_reg_write32(wl, ACX_REG_EE_START, START_EEPROM_MGR);
|
||||||
goto out;
|
msleep(4000);
|
||||||
|
wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, USE_EEPROM);
|
||||||
|
} else {
|
||||||
|
ret = wl1251_boot_upload_nvs(wl);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* 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 {
|
||||||
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 {
|
||||||
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 {
|
||||||
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)
|
||||||
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 @@
|
||||||
|
|
||||||
struct wl12xx_platform_data {
|
struct wl12xx_platform_data {
|
||||||
void (*set_power)(bool enable);
|
void (*set_power)(bool enable);
|
||||||
|
bool use_eeprom;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue