usb: xhci: Increase timeout for HC halt
[linux-2.6-microblaze.git] / drivers / pwm / pwm-ab8500.c
index 58c6c0f..e2a26d9 100644 (file)
@@ -24,23 +24,37 @@ struct ab8500_pwm_chip {
        struct pwm_chip chip;
 };
 
-static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
-                            int duty_ns, int period_ns)
+static int ab8500_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+                           const struct pwm_state *state)
 {
-       int ret = 0;
-       unsigned int higher_val, lower_val;
+       int ret;
        u8 reg;
+       unsigned int higher_val, lower_val;
+
+       if (state->polarity != PWM_POLARITY_NORMAL)
+               return -EINVAL;
+
+       if (!state->enabled) {
+               ret = abx500_mask_and_set_register_interruptible(chip->dev,
+                                       AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
+                                       1 << (chip->base - 1), 0);
+
+               if (ret < 0)
+                       dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
+                                                               pwm->label, ret);
+               return ret;
+       }
 
        /*
         * get the first 8 bits that are be written to
         * AB8500_PWM_OUT_CTRL1_REG[0:7]
         */
-       lower_val = duty_ns & 0x00FF;
+       lower_val = state->duty_cycle & 0x00FF;
        /*
         * get bits [9:10] that are to be written to
         * AB8500_PWM_OUT_CTRL2_REG[0:1]
         */
-       higher_val = ((duty_ns & 0x0300) >> 8);
+       higher_val = ((state->duty_cycle & 0x0300) >> 8);
 
        reg = AB8500_PWM_OUT_CTRL1_REG + ((chip->base - 1) * 2);
 
@@ -48,15 +62,11 @@ static int ab8500_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
                        reg, (u8)lower_val);
        if (ret < 0)
                return ret;
+
        ret = abx500_set_register_interruptible(chip->dev, AB8500_MISC,
                        (reg + 1), (u8)higher_val);
-
-       return ret;
-}
-
-static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       int ret;
+       if (ret < 0)
+               return ret;
 
        ret = abx500_mask_and_set_register_interruptible(chip->dev,
                                AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
@@ -64,25 +74,12 @@ static int ab8500_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
        if (ret < 0)
                dev_err(chip->dev, "%s: Failed to enable PWM, Error %d\n",
                                                        pwm->label, ret);
-       return ret;
-}
 
-static void ab8500_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
-{
-       int ret;
-
-       ret = abx500_mask_and_set_register_interruptible(chip->dev,
-                               AB8500_MISC, AB8500_PWM_OUT_CTRL7_REG,
-                               1 << (chip->base - 1), 0);
-       if (ret < 0)
-               dev_err(chip->dev, "%s: Failed to disable PWM, Error %d\n",
-                                                       pwm->label, ret);
+       return ret;
 }
 
 static const struct pwm_ops ab8500_pwm_ops = {
-       .config = ab8500_pwm_config,
-       .enable = ab8500_pwm_enable,
-       .disable = ab8500_pwm_disable,
+       .apply = ab8500_pwm_apply,
        .owner = THIS_MODULE,
 };
 
@@ -101,7 +98,6 @@ static int ab8500_pwm_probe(struct platform_device *pdev)
 
        ab8500->chip.dev = &pdev->dev;
        ab8500->chip.ops = &ab8500_pwm_ops;
-       ab8500->chip.base = -1;
        ab8500->chip.npwm = 1;
 
        err = pwmchip_add(&ab8500->chip);