Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
[sfrench/cifs-2.6.git] / drivers / mfd / wm8350-core.c
index b457a05b28d9621b61352f68969c043c603175f1..c2be3088e2e1dd0c2e9936e020fc42e1d7209586 100644 (file)
@@ -1111,7 +1111,7 @@ int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref)
        do {
                schedule_timeout_interruptible(1);
                reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
-       } while (--tries && (reg & WM8350_AUXADC_POLL));
+       } while ((reg & WM8350_AUXADC_POLL) && --tries);
 
        if (!tries)
                dev_err(wm8350->dev, "adc chn %d read timeout\n", channel);
@@ -1238,7 +1238,7 @@ static int wm8350_create_cache(struct wm8350 *wm8350, int type, int mode)
        }
 
        wm8350->reg_cache =
-           kzalloc(sizeof(u16) * (WM8350_MAX_REGISTER + 1), GFP_KERNEL);
+               kmalloc(sizeof(u16) * (WM8350_MAX_REGISTER + 1), GFP_KERNEL);
        if (wm8350->reg_cache == NULL)
                return -ENOMEM;
 
@@ -1246,17 +1246,20 @@ static int wm8350_create_cache(struct wm8350 *wm8350, int type, int mode)
         * a PMIC so the device many not be in a virgin state and we
         * can't rely on the silicon values.
         */
+       ret = wm8350->read_dev(wm8350, 0,
+                              sizeof(u16) * (WM8350_MAX_REGISTER + 1),
+                              wm8350->reg_cache);
+       if (ret < 0) {
+               dev_err(wm8350->dev,
+                       "failed to read initial cache values\n");
+               goto out;
+       }
+
+       /* Mask out uncacheable/unreadable bits and the audio. */
        for (i = 0; i < WM8350_MAX_REGISTER; i++) {
-               /* audio register range */
                if (wm8350_reg_io_map[i].readable &&
                    (i < WM8350_CLOCK_CONTROL_1 || i > WM8350_AIF_TEST)) {
-                       ret = wm8350->read_dev(wm8350, i, 2, (char *)&value);
-                       if (ret < 0) {
-                               dev_err(wm8350->dev,
-                                      "failed to read initial cache value\n");
-                               goto out;
-                       }
-                       value = be16_to_cpu(value);
+                       value = be16_to_cpu(wm8350->reg_cache[i]);
                        value &= wm8350_reg_io_map[i].readable;
                        value &= ~wm8350_reg_io_map[i].vol;
                        wm8350->reg_cache[i] = value;
@@ -1435,7 +1438,21 @@ int wm8350_device_init(struct wm8350 *wm8350, int irq,
        mutex_init(&wm8350->irq_mutex);
        INIT_WORK(&wm8350->irq_work, wm8350_irq_worker);
        if (irq) {
-               ret = request_irq(irq, wm8350_irq, 0,
+               int flags = 0;
+
+               if (pdata && pdata->irq_high) {
+                       flags |= IRQF_TRIGGER_HIGH;
+
+                       wm8350_set_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
+                                       WM8350_IRQ_POL);
+               } else {
+                       flags |= IRQF_TRIGGER_LOW;
+
+                       wm8350_clear_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
+                                         WM8350_IRQ_POL);
+               }
+
+               ret = request_irq(irq, wm8350_irq, flags,
                                  "wm8350", wm8350);
                if (ret != 0) {
                        dev_err(wm8350->dev, "Failed to request IRQ: %d\n",