diff options
author | Thierry Reding <thierry.reding@gmail.com> | 2017-02-10 09:15:54 -0500 |
---|---|---|
committer | Thierry Reding <thierry.reding@gmail.com> | 2017-02-10 09:15:54 -0500 |
commit | 652f319667383f2b2c62dda7841265bedd89c5a3 (patch) | |
tree | 33bc36f29bee3acf277fded5b5d30513d16bfd53 | |
parent | 0c744ea4f77d72b3dcebb7a8f2684633ec79be88 (diff) | |
parent | b526a314263ea217b8fa9758dca5dc245fd49997 (diff) |
Merge branch 'for-4.11/core' into for-next
-rw-r--r-- | drivers/leds/leds-pwm.c | 16 | ||||
-rw-r--r-- | drivers/pwm/core.c | 70 | ||||
-rw-r--r-- | drivers/pwm/pwm-atmel-hlcdc.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-atmel.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-bcm-kona.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-berlin.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-brcmstb.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-fsl-ftm.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-imx.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-lp3943.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-mxs.c | 2 | ||||
-rw-r--r-- | drivers/pwm/pwm-pca9685.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-sti.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-sun4i.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-twl-led.c | 1 | ||||
-rw-r--r-- | drivers/pwm/pwm-twl.c | 1 | ||||
-rw-r--r-- | drivers/staging/greybus/pwm.c | 1 | ||||
-rw-r--r-- | include/linux/pwm.h | 33 |
18 files changed, 55 insertions, 80 deletions
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index a9145aa7f36a..8d456dc6c5bf 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c | |||
@@ -29,7 +29,6 @@ struct led_pwm_data { | |||
29 | unsigned int active_low; | 29 | unsigned int active_low; |
30 | unsigned int period; | 30 | unsigned int period; |
31 | int duty; | 31 | int duty; |
32 | bool can_sleep; | ||
33 | }; | 32 | }; |
34 | 33 | ||
35 | struct led_pwm_priv { | 34 | struct led_pwm_priv { |
@@ -49,8 +48,8 @@ static void __led_pwm_set(struct led_pwm_data *led_dat) | |||
49 | pwm_enable(led_dat->pwm); | 48 | pwm_enable(led_dat->pwm); |
50 | } | 49 | } |
51 | 50 | ||
52 | static void led_pwm_set(struct led_classdev *led_cdev, | 51 | static int led_pwm_set(struct led_classdev *led_cdev, |
53 | enum led_brightness brightness) | 52 | enum led_brightness brightness) |
54 | { | 53 | { |
55 | struct led_pwm_data *led_dat = | 54 | struct led_pwm_data *led_dat = |
56 | container_of(led_cdev, struct led_pwm_data, cdev); | 55 | container_of(led_cdev, struct led_pwm_data, cdev); |
@@ -66,12 +65,7 @@ static void led_pwm_set(struct led_classdev *led_cdev, | |||
66 | led_dat->duty = duty; | 65 | led_dat->duty = duty; |
67 | 66 | ||
68 | __led_pwm_set(led_dat); | 67 | __led_pwm_set(led_dat); |
69 | } | ||
70 | 68 | ||
71 | static int led_pwm_set_blocking(struct led_classdev *led_cdev, | ||
72 | enum led_brightness brightness) | ||
73 | { | ||
74 | led_pwm_set(led_cdev, brightness); | ||
75 | return 0; | 69 | return 0; |
76 | } | 70 | } |
77 | 71 | ||
@@ -112,11 +106,7 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv, | |||
112 | return ret; | 106 | return ret; |
113 | } | 107 | } |
114 | 108 | ||
115 | led_data->can_sleep = pwm_can_sleep(led_data->pwm); | 109 | led_data->cdev.brightness_set_blocking = led_pwm_set; |
116 | if (!led_data->can_sleep) | ||
117 | led_data->cdev.brightness_set = led_pwm_set; | ||
118 | else | ||
119 | led_data->cdev.brightness_set_blocking = led_pwm_set_blocking; | ||
120 | 110 | ||
121 | /* | 111 | /* |
122 | * FIXME: pwm_apply_args() should be removed when switching to the | 112 | * FIXME: pwm_apply_args() should be removed when switching to the |
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 172ef8245811..a0860b30bd93 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c | |||
@@ -137,9 +137,14 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args) | |||
137 | { | 137 | { |
138 | struct pwm_device *pwm; | 138 | struct pwm_device *pwm; |
139 | 139 | ||
140 | /* check, whether the driver supports a third cell for flags */ | ||
140 | if (pc->of_pwm_n_cells < 3) | 141 | if (pc->of_pwm_n_cells < 3) |
141 | return ERR_PTR(-EINVAL); | 142 | return ERR_PTR(-EINVAL); |
142 | 143 | ||
144 | /* flags in the third cell are optional */ | ||
145 | if (args->args_count < 2) | ||
146 | return ERR_PTR(-EINVAL); | ||
147 | |||
143 | if (args->args[0] >= pc->npwm) | 148 | if (args->args[0] >= pc->npwm) |
144 | return ERR_PTR(-EINVAL); | 149 | return ERR_PTR(-EINVAL); |
145 | 150 | ||
@@ -148,11 +153,10 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args) | |||
148 | return pwm; | 153 | return pwm; |
149 | 154 | ||
150 | pwm->args.period = args->args[1]; | 155 | pwm->args.period = args->args[1]; |
156 | pwm->args.polarity = PWM_POLARITY_NORMAL; | ||
151 | 157 | ||
152 | if (args->args[2] & PWM_POLARITY_INVERTED) | 158 | if (args->args_count > 2 && args->args[2] & PWM_POLARITY_INVERTED) |
153 | pwm->args.polarity = PWM_POLARITY_INVERSED; | 159 | pwm->args.polarity = PWM_POLARITY_INVERSED; |
154 | else | ||
155 | pwm->args.polarity = PWM_POLARITY_NORMAL; | ||
156 | 160 | ||
157 | return pwm; | 161 | return pwm; |
158 | } | 162 | } |
@@ -163,9 +167,14 @@ of_pwm_simple_xlate(struct pwm_chip *pc, const struct of_phandle_args *args) | |||
163 | { | 167 | { |
164 | struct pwm_device *pwm; | 168 | struct pwm_device *pwm; |
165 | 169 | ||
170 | /* sanity check driver support */ | ||
166 | if (pc->of_pwm_n_cells < 2) | 171 | if (pc->of_pwm_n_cells < 2) |
167 | return ERR_PTR(-EINVAL); | 172 | return ERR_PTR(-EINVAL); |
168 | 173 | ||
174 | /* all cells are required */ | ||
175 | if (args->args_count != pc->of_pwm_n_cells) | ||
176 | return ERR_PTR(-EINVAL); | ||
177 | |||
169 | if (args->args[0] >= pc->npwm) | 178 | if (args->args[0] >= pc->npwm) |
170 | return ERR_PTR(-EINVAL); | 179 | return ERR_PTR(-EINVAL); |
171 | 180 | ||
@@ -663,24 +672,17 @@ struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id) | |||
663 | err = of_parse_phandle_with_args(np, "pwms", "#pwm-cells", index, | 672 | err = of_parse_phandle_with_args(np, "pwms", "#pwm-cells", index, |
664 | &args); | 673 | &args); |
665 | if (err) { | 674 | if (err) { |
666 | pr_debug("%s(): can't parse \"pwms\" property\n", __func__); | 675 | pr_err("%s(): can't parse \"pwms\" property\n", __func__); |
667 | return ERR_PTR(err); | 676 | return ERR_PTR(err); |
668 | } | 677 | } |
669 | 678 | ||
670 | pc = of_node_to_pwmchip(args.np); | 679 | pc = of_node_to_pwmchip(args.np); |
671 | if (IS_ERR(pc)) { | 680 | if (IS_ERR(pc)) { |
672 | pr_debug("%s(): PWM chip not found\n", __func__); | 681 | pr_err("%s(): PWM chip not found\n", __func__); |
673 | pwm = ERR_CAST(pc); | 682 | pwm = ERR_CAST(pc); |
674 | goto put; | 683 | goto put; |
675 | } | 684 | } |
676 | 685 | ||
677 | if (args.args_count != pc->of_pwm_n_cells) { | ||
678 | pr_debug("%s: wrong #pwm-cells for %s\n", np->full_name, | ||
679 | args.np->full_name); | ||
680 | pwm = ERR_PTR(-EINVAL); | ||
681 | goto put; | ||
682 | } | ||
683 | |||
684 | pwm = pc->of_xlate(pc, &args); | 686 | pwm = pc->of_xlate(pc, &args); |
685 | if (IS_ERR(pwm)) | 687 | if (IS_ERR(pwm)) |
686 | goto put; | 688 | goto put; |
@@ -757,12 +759,13 @@ void pwm_remove_table(struct pwm_lookup *table, size_t num) | |||
757 | */ | 759 | */ |
758 | struct pwm_device *pwm_get(struct device *dev, const char *con_id) | 760 | struct pwm_device *pwm_get(struct device *dev, const char *con_id) |
759 | { | 761 | { |
760 | struct pwm_device *pwm = ERR_PTR(-EPROBE_DEFER); | ||
761 | const char *dev_id = dev ? dev_name(dev) : NULL; | 762 | const char *dev_id = dev ? dev_name(dev) : NULL; |
762 | struct pwm_chip *chip = NULL; | 763 | struct pwm_device *pwm; |
764 | struct pwm_chip *chip; | ||
763 | unsigned int best = 0; | 765 | unsigned int best = 0; |
764 | struct pwm_lookup *p, *chosen = NULL; | 766 | struct pwm_lookup *p, *chosen = NULL; |
765 | unsigned int match; | 767 | unsigned int match; |
768 | int err; | ||
766 | 769 | ||
767 | /* look up via DT first */ | 770 | /* look up via DT first */ |
768 | if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) | 771 | if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) |
@@ -817,24 +820,35 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id) | |||
817 | } | 820 | } |
818 | } | 821 | } |
819 | 822 | ||
820 | if (!chosen) { | 823 | mutex_unlock(&pwm_lookup_lock); |
821 | pwm = ERR_PTR(-ENODEV); | 824 | |
822 | goto out; | 825 | if (!chosen) |
823 | } | 826 | return ERR_PTR(-ENODEV); |
824 | 827 | ||
825 | chip = pwmchip_find_by_name(chosen->provider); | 828 | chip = pwmchip_find_by_name(chosen->provider); |
829 | |||
830 | /* | ||
831 | * If the lookup entry specifies a module, load the module and retry | ||
832 | * the PWM chip lookup. This can be used to work around driver load | ||
833 | * ordering issues if driver's can't be made to properly support the | ||
834 | * deferred probe mechanism. | ||
835 | */ | ||
836 | if (!chip && chosen->module) { | ||
837 | err = request_module(chosen->module); | ||
838 | if (err == 0) | ||
839 | chip = pwmchip_find_by_name(chosen->provider); | ||
840 | } | ||
841 | |||
826 | if (!chip) | 842 | if (!chip) |
827 | goto out; | 843 | return ERR_PTR(-EPROBE_DEFER); |
828 | 844 | ||
829 | pwm = pwm_request_from_chip(chip, chosen->index, con_id ?: dev_id); | 845 | pwm = pwm_request_from_chip(chip, chosen->index, con_id ?: dev_id); |
830 | if (IS_ERR(pwm)) | 846 | if (IS_ERR(pwm)) |
831 | goto out; | 847 | return pwm; |
832 | 848 | ||
833 | pwm->args.period = chosen->period; | 849 | pwm->args.period = chosen->period; |
834 | pwm->args.polarity = chosen->polarity; | 850 | pwm->args.polarity = chosen->polarity; |
835 | 851 | ||
836 | out: | ||
837 | mutex_unlock(&pwm_lookup_lock); | ||
838 | return pwm; | 852 | return pwm; |
839 | } | 853 | } |
840 | EXPORT_SYMBOL_GPL(pwm_get); | 854 | EXPORT_SYMBOL_GPL(pwm_get); |
@@ -960,18 +974,6 @@ void devm_pwm_put(struct device *dev, struct pwm_device *pwm) | |||
960 | } | 974 | } |
961 | EXPORT_SYMBOL_GPL(devm_pwm_put); | 975 | EXPORT_SYMBOL_GPL(devm_pwm_put); |
962 | 976 | ||
963 | /** | ||
964 | * pwm_can_sleep() - report whether PWM access will sleep | ||
965 | * @pwm: PWM device | ||
966 | * | ||
967 | * Returns: True if accessing the PWM can sleep, false otherwise. | ||
968 | */ | ||
969 | bool pwm_can_sleep(struct pwm_device *pwm) | ||
970 | { | ||
971 | return true; | ||
972 | } | ||
973 | EXPORT_SYMBOL_GPL(pwm_can_sleep); | ||
974 | |||
975 | #ifdef CONFIG_DEBUG_FS | 977 | #ifdef CONFIG_DEBUG_FS |
976 | static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) | 978 | static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) |
977 | { | 979 | { |
diff --git a/drivers/pwm/pwm-atmel-hlcdc.c b/drivers/pwm/pwm-atmel-hlcdc.c index 14fc011faa32..999187277ea5 100644 --- a/drivers/pwm/pwm-atmel-hlcdc.c +++ b/drivers/pwm/pwm-atmel-hlcdc.c | |||
@@ -270,7 +270,6 @@ static int atmel_hlcdc_pwm_probe(struct platform_device *pdev) | |||
270 | chip->chip.npwm = 1; | 270 | chip->chip.npwm = 1; |
271 | chip->chip.of_xlate = of_pwm_xlate_with_flags; | 271 | chip->chip.of_xlate = of_pwm_xlate_with_flags; |
272 | chip->chip.of_pwm_n_cells = 3; | 272 | chip->chip.of_pwm_n_cells = 3; |
273 | chip->chip.can_sleep = 1; | ||
274 | 273 | ||
275 | ret = pwmchip_add_with_polarity(&chip->chip, PWM_POLARITY_INVERSED); | 274 | ret = pwmchip_add_with_polarity(&chip->chip, PWM_POLARITY_INVERSED); |
276 | if (ret) { | 275 | if (ret) { |
diff --git a/drivers/pwm/pwm-atmel.c b/drivers/pwm/pwm-atmel.c index e6b8b1b7e6ba..67a7023be5c2 100644 --- a/drivers/pwm/pwm-atmel.c +++ b/drivers/pwm/pwm-atmel.c | |||
@@ -385,7 +385,6 @@ static int atmel_pwm_probe(struct platform_device *pdev) | |||
385 | 385 | ||
386 | atmel_pwm->chip.base = -1; | 386 | atmel_pwm->chip.base = -1; |
387 | atmel_pwm->chip.npwm = 4; | 387 | atmel_pwm->chip.npwm = 4; |
388 | atmel_pwm->chip.can_sleep = true; | ||
389 | atmel_pwm->config = data->config; | 388 | atmel_pwm->config = data->config; |
390 | atmel_pwm->updated_pwms = 0; | 389 | atmel_pwm->updated_pwms = 0; |
391 | mutex_init(&atmel_pwm->isr_lock); | 390 | mutex_init(&atmel_pwm->isr_lock); |
diff --git a/drivers/pwm/pwm-bcm-kona.c b/drivers/pwm/pwm-bcm-kona.c index c63418322023..09a95aeb3a70 100644 --- a/drivers/pwm/pwm-bcm-kona.c +++ b/drivers/pwm/pwm-bcm-kona.c | |||
@@ -276,7 +276,6 @@ static int kona_pwmc_probe(struct platform_device *pdev) | |||
276 | kp->chip.npwm = 6; | 276 | kp->chip.npwm = 6; |
277 | kp->chip.of_xlate = of_pwm_xlate_with_flags; | 277 | kp->chip.of_xlate = of_pwm_xlate_with_flags; |
278 | kp->chip.of_pwm_n_cells = 3; | 278 | kp->chip.of_pwm_n_cells = 3; |
279 | kp->chip.can_sleep = true; | ||
280 | 279 | ||
281 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 280 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
282 | kp->base = devm_ioremap_resource(&pdev->dev, res); | 281 | kp->base = devm_ioremap_resource(&pdev->dev, res); |
diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c index 01339c152ab0..771859aca4be 100644 --- a/drivers/pwm/pwm-berlin.c +++ b/drivers/pwm/pwm-berlin.c | |||
@@ -206,7 +206,6 @@ static int berlin_pwm_probe(struct platform_device *pdev) | |||
206 | pwm->chip.ops = &berlin_pwm_ops; | 206 | pwm->chip.ops = &berlin_pwm_ops; |
207 | pwm->chip.base = -1; | 207 | pwm->chip.base = -1; |
208 | pwm->chip.npwm = 4; | 208 | pwm->chip.npwm = 4; |
209 | pwm->chip.can_sleep = true; | ||
210 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; | 209 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; |
211 | pwm->chip.of_pwm_n_cells = 3; | 210 | pwm->chip.of_pwm_n_cells = 3; |
212 | 211 | ||
diff --git a/drivers/pwm/pwm-brcmstb.c b/drivers/pwm/pwm-brcmstb.c index 5d5adee16886..8063cffa1c96 100644 --- a/drivers/pwm/pwm-brcmstb.c +++ b/drivers/pwm/pwm-brcmstb.c | |||
@@ -270,7 +270,6 @@ static int brcmstb_pwm_probe(struct platform_device *pdev) | |||
270 | p->chip.ops = &brcmstb_pwm_ops; | 270 | p->chip.ops = &brcmstb_pwm_ops; |
271 | p->chip.base = -1; | 271 | p->chip.base = -1; |
272 | p->chip.npwm = 2; | 272 | p->chip.npwm = 2; |
273 | p->chip.can_sleep = true; | ||
274 | 273 | ||
275 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 274 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
276 | p->base = devm_ioremap_resource(&pdev->dev, res); | 275 | p->base = devm_ioremap_resource(&pdev->dev, res); |
diff --git a/drivers/pwm/pwm-fsl-ftm.c b/drivers/pwm/pwm-fsl-ftm.c index fad968eb75f6..557b4ea16796 100644 --- a/drivers/pwm/pwm-fsl-ftm.c +++ b/drivers/pwm/pwm-fsl-ftm.c | |||
@@ -446,7 +446,6 @@ static int fsl_pwm_probe(struct platform_device *pdev) | |||
446 | fpc->chip.of_pwm_n_cells = 3; | 446 | fpc->chip.of_pwm_n_cells = 3; |
447 | fpc->chip.base = -1; | 447 | fpc->chip.base = -1; |
448 | fpc->chip.npwm = 8; | 448 | fpc->chip.npwm = 8; |
449 | fpc->chip.can_sleep = true; | ||
450 | 449 | ||
451 | ret = pwmchip_add(&fpc->chip); | 450 | ret = pwmchip_add(&fpc->chip); |
452 | if (ret < 0) { | 451 | if (ret < 0) { |
diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c index d600fd5cd4ba..1223187ad354 100644 --- a/drivers/pwm/pwm-imx.c +++ b/drivers/pwm/pwm-imx.c | |||
@@ -304,7 +304,6 @@ static int imx_pwm_probe(struct platform_device *pdev) | |||
304 | imx->chip.dev = &pdev->dev; | 304 | imx->chip.dev = &pdev->dev; |
305 | imx->chip.base = -1; | 305 | imx->chip.base = -1; |
306 | imx->chip.npwm = 1; | 306 | imx->chip.npwm = 1; |
307 | imx->chip.can_sleep = true; | ||
308 | 307 | ||
309 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 308 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
310 | imx->mmio_base = devm_ioremap_resource(&pdev->dev, r); | 309 | imx->mmio_base = devm_ioremap_resource(&pdev->dev, r); |
diff --git a/drivers/pwm/pwm-lp3943.c b/drivers/pwm/pwm-lp3943.c index 872ea76a4f19..52584e9962ed 100644 --- a/drivers/pwm/pwm-lp3943.c +++ b/drivers/pwm/pwm-lp3943.c | |||
@@ -278,7 +278,6 @@ static int lp3943_pwm_probe(struct platform_device *pdev) | |||
278 | lp3943_pwm->chip.dev = &pdev->dev; | 278 | lp3943_pwm->chip.dev = &pdev->dev; |
279 | lp3943_pwm->chip.ops = &lp3943_pwm_ops; | 279 | lp3943_pwm->chip.ops = &lp3943_pwm_ops; |
280 | lp3943_pwm->chip.npwm = LP3943_NUM_PWMS; | 280 | lp3943_pwm->chip.npwm = LP3943_NUM_PWMS; |
281 | lp3943_pwm->chip.can_sleep = true; | ||
282 | 281 | ||
283 | platform_set_drvdata(pdev, lp3943_pwm); | 282 | platform_set_drvdata(pdev, lp3943_pwm); |
284 | 283 | ||
diff --git a/drivers/pwm/pwm-mxs.c b/drivers/pwm/pwm-mxs.c index 9a596324ebef..a6017ad9926c 100644 --- a/drivers/pwm/pwm-mxs.c +++ b/drivers/pwm/pwm-mxs.c | |||
@@ -151,7 +151,7 @@ static int mxs_pwm_probe(struct platform_device *pdev) | |||
151 | mxs->chip.dev = &pdev->dev; | 151 | mxs->chip.dev = &pdev->dev; |
152 | mxs->chip.ops = &mxs_pwm_ops; | 152 | mxs->chip.ops = &mxs_pwm_ops; |
153 | mxs->chip.base = -1; | 153 | mxs->chip.base = -1; |
154 | mxs->chip.can_sleep = true; | 154 | |
155 | ret = of_property_read_u32(np, "fsl,pwm-number", &mxs->chip.npwm); | 155 | ret = of_property_read_u32(np, "fsl,pwm-number", &mxs->chip.npwm); |
156 | if (ret < 0) { | 156 | if (ret < 0) { |
157 | dev_err(&pdev->dev, "failed to get pwm number: %d\n", ret); | 157 | dev_err(&pdev->dev, "failed to get pwm number: %d\n", ret); |
diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c index 117fccf7934a..c8282a2650be 100644 --- a/drivers/pwm/pwm-pca9685.c +++ b/drivers/pwm/pwm-pca9685.c | |||
@@ -343,7 +343,6 @@ static int pca9685_pwm_probe(struct i2c_client *client, | |||
343 | 343 | ||
344 | pca->chip.dev = &client->dev; | 344 | pca->chip.dev = &client->dev; |
345 | pca->chip.base = -1; | 345 | pca->chip.base = -1; |
346 | pca->chip.can_sleep = true; | ||
347 | 346 | ||
348 | return pwmchip_add(&pca->chip); | 347 | return pwmchip_add(&pca->chip); |
349 | } | 348 | } |
diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c index dd82dc840af9..2b7c31c9d1ab 100644 --- a/drivers/pwm/pwm-sti.c +++ b/drivers/pwm/pwm-sti.c | |||
@@ -635,7 +635,6 @@ skip_cpt: | |||
635 | pc->chip.ops = &sti_pwm_ops; | 635 | pc->chip.ops = &sti_pwm_ops; |
636 | pc->chip.base = -1; | 636 | pc->chip.base = -1; |
637 | pc->chip.npwm = pc->cdata->pwm_num_devs; | 637 | pc->chip.npwm = pc->cdata->pwm_num_devs; |
638 | pc->chip.can_sleep = true; | ||
639 | 638 | ||
640 | ret = pwmchip_add(&pc->chip); | 639 | ret = pwmchip_add(&pc->chip); |
641 | if (ret < 0) { | 640 | if (ret < 0) { |
diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c index b0803f6c64d9..1284ffa05921 100644 --- a/drivers/pwm/pwm-sun4i.c +++ b/drivers/pwm/pwm-sun4i.c | |||
@@ -340,7 +340,6 @@ static int sun4i_pwm_probe(struct platform_device *pdev) | |||
340 | pwm->chip.ops = &sun4i_pwm_ops; | 340 | pwm->chip.ops = &sun4i_pwm_ops; |
341 | pwm->chip.base = -1; | 341 | pwm->chip.base = -1; |
342 | pwm->chip.npwm = pwm->data->npwm; | 342 | pwm->chip.npwm = pwm->data->npwm; |
343 | pwm->chip.can_sleep = true; | ||
344 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; | 343 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; |
345 | pwm->chip.of_pwm_n_cells = 3; | 344 | pwm->chip.of_pwm_n_cells = 3; |
346 | 345 | ||
diff --git a/drivers/pwm/pwm-twl-led.c b/drivers/pwm/pwm-twl-led.c index b964470025c5..21eff991d0e3 100644 --- a/drivers/pwm/pwm-twl-led.c +++ b/drivers/pwm/pwm-twl-led.c | |||
@@ -303,7 +303,6 @@ static int twl_pwmled_probe(struct platform_device *pdev) | |||
303 | 303 | ||
304 | twl->chip.dev = &pdev->dev; | 304 | twl->chip.dev = &pdev->dev; |
305 | twl->chip.base = -1; | 305 | twl->chip.base = -1; |
306 | twl->chip.can_sleep = true; | ||
307 | 306 | ||
308 | mutex_init(&twl->mutex); | 307 | mutex_init(&twl->mutex); |
309 | 308 | ||
diff --git a/drivers/pwm/pwm-twl.c b/drivers/pwm/pwm-twl.c index 7a993b056638..9de617b76680 100644 --- a/drivers/pwm/pwm-twl.c +++ b/drivers/pwm/pwm-twl.c | |||
@@ -323,7 +323,6 @@ static int twl_pwm_probe(struct platform_device *pdev) | |||
323 | twl->chip.dev = &pdev->dev; | 323 | twl->chip.dev = &pdev->dev; |
324 | twl->chip.base = -1; | 324 | twl->chip.base = -1; |
325 | twl->chip.npwm = 2; | 325 | twl->chip.npwm = 2; |
326 | twl->chip.can_sleep = true; | ||
327 | 326 | ||
328 | mutex_init(&twl->mutex); | 327 | mutex_init(&twl->mutex); |
329 | 328 | ||
diff --git a/drivers/staging/greybus/pwm.c b/drivers/staging/greybus/pwm.c index c4bf3298ba07..f0404bc37123 100644 --- a/drivers/staging/greybus/pwm.c +++ b/drivers/staging/greybus/pwm.c | |||
@@ -284,7 +284,6 @@ static int gb_pwm_probe(struct gbphy_device *gbphy_dev, | |||
284 | pwm->ops = &gb_pwm_ops; | 284 | pwm->ops = &gb_pwm_ops; |
285 | pwm->base = -1; /* Allocate base dynamically */ | 285 | pwm->base = -1; /* Allocate base dynamically */ |
286 | pwm->npwm = pwmc->pwm_max + 1; | 286 | pwm->npwm = pwmc->pwm_max + 1; |
287 | pwm->can_sleep = true; /* FIXME */ | ||
288 | 287 | ||
289 | ret = pwmchip_add(pwm); | 288 | ret = pwmchip_add(pwm); |
290 | if (ret) { | 289 | if (ret) { |
diff --git a/include/linux/pwm.h b/include/linux/pwm.h index 2c6c5114c089..08fad7c6a471 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h | |||
@@ -287,8 +287,6 @@ struct pwm_ops { | |||
287 | * @pwms: array of PWM devices allocated by the framework | 287 | * @pwms: array of PWM devices allocated by the framework |
288 | * @of_xlate: request a PWM device given a device tree PWM specifier | 288 | * @of_xlate: request a PWM device given a device tree PWM specifier |
289 | * @of_pwm_n_cells: number of cells expected in the device tree PWM specifier | 289 | * @of_pwm_n_cells: number of cells expected in the device tree PWM specifier |
290 | * @can_sleep: must be true if the .config(), .enable() or .disable() | ||
291 | * operations may sleep | ||
292 | */ | 290 | */ |
293 | struct pwm_chip { | 291 | struct pwm_chip { |
294 | struct device *dev; | 292 | struct device *dev; |
@@ -302,7 +300,6 @@ struct pwm_chip { | |||
302 | struct pwm_device * (*of_xlate)(struct pwm_chip *pc, | 300 | struct pwm_device * (*of_xlate)(struct pwm_chip *pc, |
303 | const struct of_phandle_args *args); | 301 | const struct of_phandle_args *args); |
304 | unsigned int of_pwm_n_cells; | 302 | unsigned int of_pwm_n_cells; |
305 | bool can_sleep; | ||
306 | }; | 303 | }; |
307 | 304 | ||
308 | /** | 305 | /** |
@@ -451,8 +448,6 @@ struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); | |||
451 | struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, | 448 | struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, |
452 | const char *con_id); | 449 | const char *con_id); |
453 | void devm_pwm_put(struct device *dev, struct pwm_device *pwm); | 450 | void devm_pwm_put(struct device *dev, struct pwm_device *pwm); |
454 | |||
455 | bool pwm_can_sleep(struct pwm_device *pwm); | ||
456 | #else | 451 | #else |
457 | static inline struct pwm_device *pwm_request(int pwm_id, const char *label) | 452 | static inline struct pwm_device *pwm_request(int pwm_id, const char *label) |
458 | { | 453 | { |
@@ -566,11 +561,6 @@ static inline struct pwm_device *devm_of_pwm_get(struct device *dev, | |||
566 | static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm) | 561 | static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm) |
567 | { | 562 | { |
568 | } | 563 | } |
569 | |||
570 | static inline bool pwm_can_sleep(struct pwm_device *pwm) | ||
571 | { | ||
572 | return false; | ||
573 | } | ||
574 | #endif | 564 | #endif |
575 | 565 | ||
576 | static inline void pwm_apply_args(struct pwm_device *pwm) | 566 | static inline void pwm_apply_args(struct pwm_device *pwm) |
@@ -613,18 +603,25 @@ struct pwm_lookup { | |||
613 | const char *con_id; | 603 | const char *con_id; |
614 | unsigned int period; | 604 | unsigned int period; |
615 | enum pwm_polarity polarity; | 605 | enum pwm_polarity polarity; |
606 | const char *module; /* optional, may be NULL */ | ||
616 | }; | 607 | }; |
617 | 608 | ||
618 | #define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \ | 609 | #define PWM_LOOKUP_WITH_MODULE(_provider, _index, _dev_id, _con_id, \ |
619 | { \ | 610 | _period, _polarity, _module) \ |
620 | .provider = _provider, \ | 611 | { \ |
621 | .index = _index, \ | 612 | .provider = _provider, \ |
622 | .dev_id = _dev_id, \ | 613 | .index = _index, \ |
623 | .con_id = _con_id, \ | 614 | .dev_id = _dev_id, \ |
624 | .period = _period, \ | 615 | .con_id = _con_id, \ |
625 | .polarity = _polarity \ | 616 | .period = _period, \ |
617 | .polarity = _polarity, \ | ||
618 | .module = _module, \ | ||
626 | } | 619 | } |
627 | 620 | ||
621 | #define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \ | ||
622 | PWM_LOOKUP_WITH_MODULE(_provider, _index, _dev_id, _con_id, _period, \ | ||
623 | _polarity, NULL) | ||
624 | |||
628 | #if IS_ENABLED(CONFIG_PWM) | 625 | #if IS_ENABLED(CONFIG_PWM) |
629 | void pwm_add_table(struct pwm_lookup *table, size_t num); | 626 | void pwm_add_table(struct pwm_lookup *table, size_t num); |
630 | void pwm_remove_table(struct pwm_lookup *table, size_t num); | 627 | void pwm_remove_table(struct pwm_lookup *table, size_t num); |