regulator: simplify regulator_register() error handling
[safe/jmp/linux-2.6] / drivers / regulator / wm8350-regulator.c
index e7b89e7..723cd1f 100644 (file)
@@ -290,6 +290,51 @@ static int wm8350_isink_is_enabled(struct regulator_dev *rdev)
        return -EINVAL;
 }
 
+static int wm8350_isink_enable_time(struct regulator_dev *rdev)
+{
+       struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
+       int isink = rdev_get_id(rdev);
+       int reg;
+
+       switch (isink) {
+       case WM8350_ISINK_A:
+               reg = wm8350_reg_read(wm8350, WM8350_CSA_FLASH_CONTROL);
+               break;
+       case WM8350_ISINK_B:
+               reg = wm8350_reg_read(wm8350, WM8350_CSB_FLASH_CONTROL);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (reg & WM8350_CS1_FLASH_MODE) {
+               switch (reg & WM8350_CS1_ON_RAMP_MASK) {
+               case 0:
+                       return 0;
+               case 1:
+                       return 1950;
+               case 2:
+                       return 3910;
+               case 3:
+                       return 7800;
+               }
+       } else {
+               switch (reg & WM8350_CS1_ON_RAMP_MASK) {
+               case 0:
+                       return 0;
+               case 1:
+                       return 250000;
+               case 2:
+                       return 500000;
+               case 3:
+                       return 1000000;
+               }
+       }
+
+       return -EINVAL;
+}
+
+
 int wm8350_isink_set_flash(struct wm8350 *wm8350, int isink, u16 mode,
                           u16 trigger, u16 duration, u16 on_ramp, u16 off_ramp,
                           u16 drive)
@@ -1221,6 +1266,7 @@ static struct regulator_ops wm8350_isink_ops = {
        .enable = wm8350_isink_enable,
        .disable = wm8350_isink_disable,
        .is_enabled = wm8350_isink_is_enabled,
+       .enable_time = wm8350_isink_enable_time,
 };
 
 static struct regulator_desc wm8350_reg[NUM_WM8350_REGULATORS] = {
@@ -1407,7 +1453,7 @@ static int wm8350_regulator_remove(struct platform_device *pdev)
        struct regulator_dev *rdev = platform_get_drvdata(pdev);
        struct wm8350 *wm8350 = rdev_get_drvdata(rdev);
 
-       wm8350_free_irq(wm8350, wm8350_reg[pdev->id].irq);
+       wm8350_free_irq(wm8350, wm8350_reg[pdev->id].irq, rdev);
 
        regulator_unregister(rdev);