wl12xx: Add Support for Low Power DRPw (LPD) Mode
authorShahar Levi <shahar_levi@ti.com>
Sun, 12 Jun 2011 07:34:43 +0000 (10:34 +0300)
committerLuciano Coelho <coelho@ti.com>
Mon, 27 Jun 2011 09:50:33 +0000 (12:50 +0300)
The Low Power DRPw (LPD) mode contains several optimizations
that designed to reduce power consumption. The purpose
is to save current consumption in RX and Listen mode.

LPD setting apply only for wl127x AP mode (not wl128x)

Signed-off-by: Shahar Levi <shahar_levi@ti.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/boot.c
drivers/net/wireless/wl12xx/cmd.c
drivers/net/wireless/wl12xx/ini.h
drivers/net/wireless/wl12xx/main.c
drivers/net/wireless/wl12xx/wl12xx.h

index 7ccec07a600cb59b97847ef79d7043b74bd965bc..9dcfc6d1e865ae80a2d69ca1fa4932cc513967fb 100644 (file)
@@ -749,6 +749,9 @@ int wl1271_load_firmware(struct wl1271 *wl)
                clk |= (wl->ref_clock << 1) << 4;
        }
 
+       if (wl->quirks & WL12XX_QUIRK_LPD_MODE)
+               clk |= SCRATCH_ENABLE_LPD;
+
        wl1271_write32(wl, DRPW_SCRATCH_START, clk);
 
        wl1271_set_partition(wl, &part_table[PART_WORK]);
index b3a4f58249b0ddeaf7334e794ffcab0ffd9f1368..cdcb324093a5e3f8fca286f7e4f733a368c0cf45 100644 (file)
@@ -134,6 +134,11 @@ int wl1271_cmd_general_parms(struct wl1271 *wl)
        /* Override the REF CLK from the NVS with the one from platform data */
        gen_parms->general_params.ref_clock = wl->ref_clock;
 
+       /* LPD mode enable (bits 6-7) in WL1271 AP mode only */
+       if (wl->quirks & WL12XX_QUIRK_LPD_MODE)
+               gen_parms->general_params.general_settings |=
+                       GENERAL_SETTINGS_DRPW_LPD;
+
        ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), answer);
        if (ret < 0) {
                wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed");
index 1420c842b8f1585ac0146071fa88cb63d263cf09..4cf9ecc56212322b54ae70d414bcebbc93b96715 100644 (file)
@@ -24,6 +24,9 @@
 #ifndef __INI_H__
 #define __INI_H__
 
+#define GENERAL_SETTINGS_DRPW_LPD 0xc0
+#define SCRATCH_ENABLE_LPD        BIT(25)
+
 #define WL1271_INI_MAX_SMART_REFLEX_PARAM 16
 
 struct wl1271_ini_general_params {
index f19bf0ba4388b99e1dc0b0cfc69561a049186715..1b55803de883de9ba29cecdf47a932e1de760f94 100644 (file)
@@ -1191,9 +1191,13 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
                wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
                             wl->chip.id);
 
-               /* end-of-transaction flag should be set in wl127x AP mode */
+               /*
+                * 'end-of-transaction flag' and 'LPD mode flag'
+                * should be set in wl127x AP mode only
+                */
                if (wl->bss_type == BSS_TYPE_AP_BSS)
-                       wl->quirks |= WL12XX_QUIRK_END_OF_TRANSACTION;
+                       wl->quirks |= (WL12XX_QUIRK_END_OF_TRANSACTION |
+                                      WL12XX_QUIRK_LPD_MODE);
 
                ret = wl1271_setup(wl);
                if (ret < 0)
@@ -1206,6 +1210,7 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
                ret = wl1271_setup(wl);
                if (ret < 0)
                        goto out;
+
                if (wl1271_set_block_size(wl))
                        wl->quirks |= WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT;
                break;
index 4bc22d8b66f578374c589ba46c504cdc50972574..8d6c8f2584136903e9769a201ba0ef9a509df2fe 100644 (file)
@@ -645,4 +645,10 @@ int wl1271_recalc_rx_streaming(struct wl1271 *wl);
 /* WL128X requires aggregated packets to be aligned to the SDIO block size */
 #define WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT       BIT(2)
 
+/*
+ * WL127X AP mode requires Low Power DRPw (LPD) enable to reduce power
+ * consumption
+ */
+#define WL12XX_QUIRK_LPD_MODE                   BIT(3)
+
 #endif