wm831x:fix wm831x init error
author张昊 <zhanghao@rock-chips.com>
Fri, 18 Nov 2011 11:18:58 +0000 (19:18 +0800)
committer张昊 <zhanghao@rock-chips.com>
Fri, 18 Nov 2011 11:18:58 +0000 (19:18 +0800)
arch/arm/mach-rk29/board-rk29-phonesdk.c
drivers/mfd/wm831x-irq.c

index 509fae12868e735eca2577aa5060cbf4ba1cd7ce..8d5fbf9a47318c2dc4e634ad63626cdf4e5b3cc3 100755 (executable)
 #define WLAN_SECTION_SIZE_3     (PREALLOC_WLAN_BUF_NUM * 1024)
 
 #define WLAN_SKB_BUF_NUM        16
+#define UNLOCK_SECURITY_KEY     ~(0x1<<5)
+#define LOCK_SECURITY_KEY       0x00
 
 static struct sk_buff *wlan_static_skb[WLAN_SKB_BUF_NUM];
 
@@ -712,9 +714,14 @@ int wm831x_pre_init(struct wm831x *parm)
        wm831x_reg_write(parm, WM831X_POWER_STATE, (ret&0xfff8) | 0x04);        
        
        //BATT_FET_ENA = 1
-       wm831x_set_bits(parm, WM831X_RESET_CONTROL,0x1000,0x1000);
-       ret = wm831x_reg_read(parm, WM831X_RESET_CONTROL) & 0xffff;
-       printk("%s:WM831X_RESET_CONTROL=0x%x\n",__FUNCTION__,ret);
+       wm831x_reg_write(parm,WM831X_SECURITY_KEY,0x9716); // unlock security key
+  wm831x_set_bits(parm, WM831X_RESET_CONTROL,0x1000,0x1000);
+  ret = wm831x_reg_read(parm, WM831X_RESET_CONTROL) & 0xffff&UNLOCK_SECURITY_KEY;// enternal reset active in sleep
+  printk("%s:WM831X_RESET_CONTROL=0x%x\n",__FUNCTION__,ret);
+  wm831x_reg_write(parm, WM831X_RESET_CONTROL, ret);
+        
+        
+  wm831x_reg_write(parm,WM831X_SECURITY_KEY,LOCK_SECURITY_KEY); // lock securit
        
 #if 0
        wm831x_set_bits(parm, WM831X_LDO_ENABLE, (1 << 3), 0);
index 04f3a69943b77daddbe1d017cc6b436d59a40a1b..7070c3c916f5f5cf61307272353c1aa38e70e352 100755 (executable)
@@ -407,7 +407,7 @@ static int wm831x_irq_set_type(struct irq_data *data, unsigned int type)
        struct wm831x *wm831x = irq_data_get_irq_chip_data(data);
        int val, irq = 0;
 
-       irq = irq - wm831x->irq_base;
+       irq = data->irq - wm831x->irq_base;
        if (irq < WM831X_IRQ_GPIO_1 || irq > WM831X_IRQ_GPIO_12) {
                /* Ignore internal-only IRQs */
                if (irq >= 0 && irq < WM831X_NUM_IRQS)