>From dfdc1422736dd1650c6f1c2501a6acea1842b434 Mon Sep 17 00:00:00 2001
From: Ohad Ben-Cohen <[email protected]>
Date: Thu, 16 Sep 2010 01:31:51 +0200
Subject: [PATCH 07/26] wl1271: make ref_clock configurable by board

The wl1271 device is using a reference clock that may change
between board to board.

Make the ref_clock parameter configurable by board settings
instead of having a hard coded value in the sources.

Signed-off-by: Ohad Ben-Cohen <[email protected]>
Signed-off-by: John W. Linville <[email protected]>
Signed-off-by: Claude Brouat <[email protected]>
---
 drivers/net/wireless/wl12xx/wl1271.h      |    1 +
 drivers/net/wireless/wl12xx/wl1271_boot.c |   11 +++++++----
 drivers/net/wireless/wl12xx/wl1271_boot.h |    1 -
 drivers/net/wireless/wl12xx/wl1271_sdio.c |    1 +
 drivers/net/wireless/wl12xx/wl1271_spi.c  |    2 ++
 include/linux/wl12xx.h                    |    1 +
 6 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/wl12xx/wl1271.h 
b/drivers/net/wireless/wl12xx/wl1271.h
index a21cdb2..595f1a8 100644
--- a/drivers/net/wireless/wl12xx/wl1271.h
+++ b/drivers/net/wireless/wl12xx/wl1271.h
@@ -357,6 +357,7 @@ struct wl1271 {

     void (*set_power)(bool enable);
     int irq;
+    int ref_clock;

     spinlock_t wl_lock;

diff --git a/drivers/net/wireless/wl12xx/wl1271_boot.c 
b/drivers/net/wireless/wl12xx/wl1271_boot.c
index 1a36d8a..23bd8e8 100644
--- a/drivers/net/wireless/wl12xx/wl1271_boot.c
+++ b/drivers/net/wireless/wl12xx/wl1271_boot.c
@@ -455,17 +455,20 @@ int wl1271_boot(struct wl1271 *wl)
 {
     int ret = 0;
     u32 tmp, clk, pause;
+    int ref_clock = wl->ref_clock;

     wl1271_boot_hw_version(wl);

-    if (REF_CLOCK == 0 || REF_CLOCK == 2 || REF_CLOCK == 4)
+    if (ref_clock == 0 || ref_clock == 2 || ref_clock == 4)
           /* ref clk: 19.2/38.4/38.4-XTAL */
           clk = 0x3;
-    else if (REF_CLOCK == 1 || REF_CLOCK == 3)
+    else if (ref_clock == 1 || ref_clock == 3)
           /* ref clk: 26/52 */
           clk = 0x5;
+    else
+          return -EINVAL;

-    if (REF_CLOCK != 0) {
+    if (ref_clock != 0) {
           u16 val;
           /* Set clock type (open drain) */
           val = wl1271_top_reg_read(wl, OCP_REG_CLK_TYPE);
@@ -514,7 +517,7 @@ int wl1271_boot(struct wl1271 *wl)
     wl1271_debug(DEBUG_BOOT, "clk2 0x%x", clk);

     /* 2 */
-    clk |= (REF_CLOCK << 1) << 4;
+    clk |= (ref_clock << 1) << 4;
     wl1271_write32(wl, DRPW_SCRATCH_START, clk);

     wl1271_set_partition(wl, &part_table[PART_WORK]);
diff --git a/drivers/net/wireless/wl12xx/wl1271_boot.h 
b/drivers/net/wireless/wl12xx/wl1271_boot.h
index f829699..f73b0b1 100644
--- a/drivers/net/wireless/wl12xx/wl1271_boot.h
+++ b/drivers/net/wireless/wl12xx/wl1271_boot.h
@@ -46,7 +46,6 @@ struct wl1271_static_data {
 /* delay between retries */
 #define INIT_LOOP_DELAY 50

-#define REF_CLOCK            2
 #define WU_COUNTER_PAUSE_VAL 0x3FF
 #define WELP_ARM_COMMAND_VAL 0x4

diff --git a/drivers/net/wireless/wl12xx/wl1271_sdio.c 
b/drivers/net/wireless/wl12xx/wl1271_sdio.c
index fead6a3..874e25a 100644
--- a/drivers/net/wireless/wl12xx/wl1271_sdio.c
+++ b/drivers/net/wireless/wl12xx/wl1271_sdio.c
@@ -237,6 +237,7 @@ static int __devinit wl1271_probe(struct sdio_func *func,
     }

     wl->irq = wlan_data->irq;
+    wl->ref_clock = wlan_data->board_ref_clock;

     ret = request_irq(wl->irq, wl1271_irq, 0, DRIVER_NAME, wl);
     if (ret < 0) {
diff --git a/drivers/net/wireless/wl12xx/wl1271_spi.c 
b/drivers/net/wireless/wl12xx/wl1271_spi.c
index 3688c3f..745c5f3 100644
--- a/drivers/net/wireless/wl12xx/wl1271_spi.c
+++ b/drivers/net/wireless/wl12xx/wl1271_spi.c
@@ -373,6 +373,8 @@ static int __devinit wl1271_probe(struct spi_device *spi)
           goto out_free;
     }

+    wl->ref_clock = pdata->board_ref_clock;
+
     wl->irq = spi->irq;
     if (wl->irq < 0) {
           wl1271_error("irq missing in platform data");
diff --git a/include/linux/wl12xx.h b/include/linux/wl12xx.h
index bd70563..95deae3 100644
--- a/include/linux/wl12xx.h
+++ b/include/linux/wl12xx.h
@@ -29,6 +29,7 @@ struct wl12xx_platform_data {
     /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */
     int irq;
     bool use_eeprom;
+    int board_ref_clock;
 };

 int wl12xx_set_platform_data(const struct wl12xx_platform_data *data);
--
1.6.3.3




Claude BROUAT
UMG/MIPE/WSIV  System Integrator
Office:    +33 (0)1 72 21 04 54
mailto: mailto:[email protected]

Intel Corp. SAS
134, av du Général Eisenhower
BP 73586
31100 TOULOUSE
France



---------------------------------------------------------------------
Intel Corporation SAS (French simplified joint stock company)
Registered headquarters: "Les Montalets"- 2, rue de Paris, 
92196 Meudon Cedex, France
Registration Number:  302 456 199 R.C.S. NANTERRE
Capital: 4,572,000 Euros

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

Attachment: 0007-wl1271-make-ref_clock-configurable-by-board.patch
Description: 0007-wl1271-make-ref_clock-configurable-by-board.patch

_______________________________________________
Meego-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to