Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ struct wl1251 {

	void (*set_power)(bool enable);
	int irq;
	bool use_eeprom;

	enum wl1251_state state;
	struct mutex mutex;
+13 −7
Original line number Diff line number Diff line
@@ -494,6 +494,11 @@ int wl1251_boot(struct wl1251 *wl)
		goto out;

	/* 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);
		if (ret < 0)
			goto out;
@@ -501,6 +506,7 @@ int wl1251_boot(struct wl1251 *wl)
		/* write firmware's last address (ie. it's length) to
		 * ACX_EEPROMLESS_IND_REG */
		wl1251_reg_write32(wl, ACX_EEPROMLESS_IND_REG, wl->fw_len);
	}

	/* 6. read the EEPROM parameters */
	tmp = wl1251_reg_read32(wl, SCR_PAD2);
+6 −0
Original line number Diff line number Diff line
@@ -370,6 +370,7 @@ enum wl12xx_acx_int_reg {
 EEPROM location specified in the EE_ADDR register.
 The Wlan hardware hardware clears this bit automatically.
*===============================================*/
#define EE_CTL                              (REGISTERS_BASE + 0x2000)
#define ACX_EE_CTL_REG                      EE_CTL
#define EE_WRITE                            0x00000001ul
#define EE_READ                             0x00000002ul
@@ -380,6 +381,7 @@ enum wl12xx_acx_int_reg {
  This register specifies the address
  within the EEPROM from/to which to read/write data.
  ===============================================*/
#define EE_ADDR                             (REGISTERS_BASE + 0x2008)
#define ACX_EE_ADDR_REG                     EE_ADDR

/*===============================================
@@ -389,8 +391,12 @@ enum wl12xx_acx_int_reg {
  data from the EEPROM or the write data
  to be written to the EEPROM.
  ===============================================*/
#define EE_DATA                             (REGISTERS_BASE + 0x2004)
#define ACX_EE_DATA_REG                     EE_DATA

#define EEPROM_ACCESS_TO                    10000   /* timeout counter */
#define START_EEPROM_MGR                    0x00000001

/*===============================================
  EEPROM Base Address  - 32bit RW
  ------------------------------------------
+2 −0
Original line number Diff line number Diff line
@@ -270,6 +270,8 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi)
		return -ENODEV;
	}

	wl->use_eeprom = pdata->use_eeprom;

	ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl);
	if (ret < 0) {
		wl1251_error("request_irq() failed: %d", ret);
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@

struct wl12xx_platform_data {
	void (*set_power)(bool enable);
	bool use_eeprom;
};

#endif