Commit Graph

135 Commits

Author SHA1 Message Date
Marek Belisko
b388f15fd1 pwm: pwm-tiehrpwm: Use clk_enable/disable instead clk_prepare/unprepare.
This was found when using pwm-led on am33xx and enable
heartbeat trigger.

[  808.624876] =================================
[  808.629443] [ INFO: inconsistent lock state ]
[  808.634021] 3.9.0 #2 Not tainted
[  808.637415] ---------------------------------
[  808.641981] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
[  808.648288] swapper/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
[  808.653494]  (prepare_lock){+.?.+.}, at: [<c027c211>] clk_unprepare+0x15/0x24
[  808.661040] {SOFTIRQ-ON-W} state was registered at:
[  808.666155]   [<c004ec4d>] __lock_acquire+0x411/0x824
[  808.671465]   [<c004f359>] lock_acquire+0x41/0x50
[  808.676412]   [<c039ee9d>] mutex_lock_nested+0x31/0x1d8
[  808.681912]   [<c027c275>] clk_prepare+0x15/0x28
[  808.686764]   [<c0590c6b>] _init+0x117/0x1e0
[  808.691256]   [<c0019ef9>] omap_hwmod_for_each+0x29/0x3c
[  808.696842]   [<c0591107>] __omap_hwmod_setup_all+0x17/0x2c
[  808.702696]   [<c0008653>] do_one_initcall+0xc3/0x10c
[  808.708017]   [<c058a627>] kernel_init_freeable+0xa7/0x134
[  808.713778]   [<c039a543>] kernel_init+0x7/0x98
[  808.718544]   [<c000cd95>] ret_from_fork+0x11/0x3c
[  808.723583] irq event stamp: 1379172
[  808.727328] hardirqs last  enabled at (1379172): [<c03a0759>] _raw_spin_unlock_irqrestore+0x21/0x30
[  808.736828] hardirqs last disabled at (1379171): [<c03a03c3>] _raw_spin_lock_irqsave+0x13/0x38
[  808.745876] softirqs last  enabled at (1379164): [<c002ae5d>] irq_enter+0x49/0x4c
[  808.753747] softirqs last disabled at (1379165): [<c002aec3>] irq_exit+0x63/0x88
[  808.761518]
[  808.761518] other info that might help us debug this:
[  808.768373]  Possible unsafe locking scenario:
[  808.768373]
[  808.774578]        CPU0
[  808.777141]        ----
[  808.779705]   lock(prepare_lock);
[  808.783186]   <Interrupt>
[  808.785929]     lock(prepare_lock);
[  808.789595]
[  808.789595]  *** DEADLOCK ***
[  808.789595]
[  808.795805] 1 lock held by swapper/0:
[  808.799643]  #0:  (((&heartbeat_data->timer))){+.-...}, at: [<c002e204>] call_timer_fn+0x0/0x90
[  808.808814]
[  808.808814] stack backtrace:
[  808.813402] [<c000ff19>] (unwind_backtrace+0x1/0x98) from [<c039bd75>] (print_usage_bug.part.25+0x16d/0x1cc)
[  808.823721] [<c039bd75>] (print_usage_bug.part.25+0x16d/0x1cc) from [<c004e595>] (mark_lock+0x18d/0x434)
[  808.833669] [<c004e595>] (mark_lock+0x18d/0x434) from [<c004ec1d>] (__lock_acquire+0x3e1/0x824)
[  808.842803] [<c004ec1d>] (__lock_acquire+0x3e1/0x824) from [<c004f359>] (lock_acquire+0x41/0x50)
[  808.852031] [<c004f359>] (lock_acquire+0x41/0x50) from [<c039ee9d>] (mutex_lock_nested+0x31/0x1d8)
[  808.861433] [<c039ee9d>] (mutex_lock_nested+0x31/0x1d8) from [<c027c211>] (clk_unprepare+0x15/0x24)
[  808.870930] [<c027c211>] (clk_unprepare+0x15/0x24) from [<c019f7bf>] (ehrpwm_pwm_disable+0x5f/0x80)
[  808.880431] [<c019f7bf>] (ehrpwm_pwm_disable+0x5f/0x80) from [<c019f29f>] (pwm_disable+0x27/0x28)
[  808.889751] [<c019f29f>] (pwm_disable+0x27/0x28) from [<c026f8f3>] (led_heartbeat_function+0x3f/0xb0)
[  808.899431] [<c026f8f3>] (led_heartbeat_function+0x3f/0xb0) from [<c002e249>] (call_timer_fn+0x45/0x90)
[  808.909288] [<c002e249>] (call_timer_fn+0x45/0x90) from [<c002e399>] (run_timer_softirq+0x105/0x17c)
[  808.918884] [<c002e399>] (run_timer_softirq+0x105/0x17c) from [<c002abc5>] (__do_softirq+0xa5/0x150)
[  808.928486] [<c002abc5>] (__do_softirq+0xa5/0x150) from [<c002aec3>] (irq_exit+0x63/0x88)
[  808.937098] [<c002aec3>] (irq_exit+0x63/0x88) from [<c000d599>] (handle_IRQ+0x21/0x54)
[  808.945415] [<c000d599>] (handle_IRQ+0x21/0x54) from [<c0008495>] (omap3_intc_handle_irq+0x5d/0x68)
[  808.954900] [<c0008495>] (omap3_intc_handle_irq+0x5d/0x68) from [<c000c7ff>] (__irq_svc+0x3f/0x64)
[  808.964287] Exception stack(0xc05b1f68 to 0xc05b1fb0)
[  808.969587] 1f60:                   00000001 00000001 00000000 00000000 c05b0000 c0619748
[  808.978158] 1f80: c05b0000 c05b0000 c0619748 413fc082 00000000 00000000 01000000 c05b1fb0
[  808.986719] 1fa0: c004f989 c000d6f0 400f0033 ffffffff
[  808.992024] [<c000c7ff>] (__irq_svc+0x3f/0x64) from [<c000d6f0>] (cpu_idle+0x60/0x98)
[  809.000250] [<c000d6f0>] (cpu_idle+0x60/0x98) from [<c058a535>] (start_kernel+0x1e9/0x234)

Remove non atomic clk api calls and use only atomic for enable/disable because
can be called from atomic context (led_heartbeat_function is timer callback).

Signed-off-by: Marek Belisko <marek.belisko@streamunlimited.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-26 23:23:54 +02:00
Axel Lin
fed1bf8dc7 pwm: pca9685: Fix wrong argument to set MODE1_SLEEP bit
Current code actually does not set MODE1_SLEEP bit because the new value for
bitmask (0x1) is wrong. To set MODE1_SLEEP bit, we should pass MODE1_SLEEP
as the new value for bitmask.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Reviewed-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-26 23:23:54 +02:00
Axel Lin
71077bc8db pwm: renesas-tpu: Add MODULE_ALIAS to make module auto loading work
This driver can be built as module, add MODULE_ALIAS to make module auto loading
work.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-26 11:48:26 +02:00
Wei Yongjun
00cf99ee00 pwm: renesas-tpu: fix return value check in tpu_probe()
In case of error, the function devm_ioremap_resource() returns ERR_PTR()
and never returns NULL. The NULL test in the return value check should
be replaced with IS_ERR().

Signed-off-by: Wei Yongjun <yongjun_wei@trendmicro.com.cn>
Reviewed-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-25 12:20:06 +02:00
Laurent Pinchart
99b82abb0a pwm: Add Renesas TPU PWM driver
The Timer Pulse Unit (TPU) is a 4-channels 16-bit timer used to generate
waveforms. This driver exposes PWM functions through the PWM API for
other drivers to use.

The code is loosely based on the leds-renesas-tpu driver by Magnus Damm
and the TPU PWM driver shipped in the Armadillo EVA 800 kernel sources.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Tested-by: Simon Horman <horms@verge.net.au>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-21 11:33:28 +02:00
H Hartley Sweeten
76abbdde2d pwm: Add sysfs interface
Add a simple sysfs interface to the generic PWM framework.

  /sys/class/pwm/
  `-- pwmchipN/           for each PWM chip
      |-- export          (w/o) ask the kernel to export a PWM channel
      |-- npwm            (r/o) number of PWM channels in this PWM chip
      |-- pwmX/           for each exported PWM channel
      |   |-- duty_cycle  (r/w) duty cycle (in nanoseconds)
      |   |-- enable      (r/w) enable/disable PWM
      |   |-- period      (r/w) period (in nanoseconds)
      |   `-- polarity    (r/w) polarity of PWM (normal/inversed)
      `-- unexport        (w/o) return a PWM channel to the kernel

Based on work by Lars Poeschel.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Lars Poeschel <poeschel@lemonage.de>
Cc: Ryan Mallon <rmallon@gmail.com>
Cc: Rob Landley <rob@landley.net>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-21 11:32:51 +02:00
Thierry Reding
3dd0a90947 pwm: Fill in missing .owner fields
Some drivers don't set the .owner fields of the struct device_driver or
struct pwm_ops, which causes the module usage count to become wrong.

Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-12 13:18:29 +02:00
Steffen Trumtrar
88b613e623 pwm: add pca9685 driver
Add pwm driver for the NXP pca9685 16 channel pwm-led controller.

The driver is really barebones at this stage. E.g. the OE' pin and
therefore the corresponding registers are not supported.
The driver was tested on a HW where this pin is tied to GND.

Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
[thierry.reding@gmail.com: style and whitespace cleanups]
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-12 13:13:18 +02:00
Boris BREZILLON
8796f9c565 pwm: atmel-tcb: prepare clk before calling enable
Replace clk_enable/disable with clk_prepare_enable/disable_unprepare to
avoid common clk framework warnings.

Signed-off-by: Boris BREZILLON <b.brezillon@overkiz.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-12 12:51:44 +02:00
Wolfram Sang
77f0b9d2ff pwm: devm: alloc correct pointer size
The allocated object should be the size of what the pointer is pointing
to and not the size of the pointer itself.

Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-06-10 12:50:10 +02:00
Fabio Estevam
e7927141ed pwm: mxs: Let device core handle pinctrl
Since commit ab78029 (drivers/pinctrl: grab default handles from device core),
we can rely on device core for handling pinctrl.

So remove devm_pinctrl_get_select_default() from the driver.

Cc: Thierry Reding <thierry.reding@avionic-design.de>
Cc: <linux-kernel@vger.kernel.org>
Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
2013-05-27 17:48:33 +02:00
Wolfram Sang
362e9cd2f5 drivers/pwm: don't check resource with devm_ioremap_resource
devm_ioremap_resource does sanity checks on the given resource. No need to
duplicate this in the driver.

Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Acked-by: Stephen Warren <swarren@nvidia.com>
2013-05-18 11:55:58 +02:00
Axel Lin
affb923df9 pwm: lpc32xx: Don't change PWM_ENABLE bit in lpc32xx_pwm_config
lpc32xx_pwm_config() is supposed to set duty_ns and period_ns,
it should not change PWM_ENABLE bit.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Tested-by: Roland Stigge <stigge@antcom.de>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-23 10:58:47 +02:00
Axel Lin
08ee77b5a5 pwm: lpc32xx: Properly set PWM_ENABLE bit in lpc32xx_pwm_[enable|disable]
According to the LPC32x0 User Manual [1]:

For both PWM1 and PWM2 Control Registers:
BIT 31:
This bit gates the PWM_CLK signal and enables the external output pin
to the PWM_PIN_STATE logical level.

0 = PWM disabled. (Default)
1 = PWM enabled

So in lpc32xx_pwm_enable(), we should set PWM_ENABLE bit.
In lpc32xx_pwm_disable(), we should just clear PWM_ENABLE bit rather than
write 0 to the register which will also clear PWMx_RELOADV and PWMx_DUTY bits.

[1] http://www.nxp.com/documents/user_manual/UM10326.pdf

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Tested-by: Roland Stigge <stigge@antcom.de>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-23 10:58:35 +02:00
Thierry Reding
f1a8870aeb pwm: Constify OF match tables
A few drivers already annotate this properly. Make the same change for
all other OF supporting drivers.

Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Acked-by: Alexandre Pereira da Silva <aletes.xgr@gmail.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
2013-04-23 07:42:20 +02:00
Axel Lin
a46ef4d572 pwm: puv3: Remove unused enabled filed from struct puv3_pwm_chip
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:40:18 +02:00
Axel Lin
22976a5dad pwm: pxa: Remove PWM_ID_BASE macro
PWM_ID_BASE() is not used after convert to PWM framework, remove it.
Also update driver_data field of struct platform_device_id accordingly.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Eric Miao <eric.y.miao@gmail.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:40:17 +02:00
Axel Lin
b3fef7f100 pwm: spear: Remove unused *dev from struct spear_pwm_chip
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Shiraz Hashim <shiraz.hashim@st.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:40:00 +02:00
Axel Lin
4e61573df8 pwm: mxs: Remove unused *dev from struct mxs_pwm_chip
Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:33:05 +02:00
Axel Lin
c8e4df3109 pwm: twl: Return proper error if twl6030_pwm_enable() fails
Return proper error instead of 0 if twl6030_pwm_enable() fails.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:32:14 +02:00
Axel Lin
b014a30c59 pwm: pxa: Remove clk_enabled field from struct pxa_pwm_chip
clk_enable/clk_disable maintain an enable_count, clk_prepare and clk_unprepare
also maintain a prepare_count. These APIs will do prepare/enable when the first
user calling these APIs, and do disable/unprepare when the corresponding counter
reach 0. Thus We don't need to maintain a clk_enabled counter here.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Eric Miao <eric.y.miao@gmail.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:31:37 +02:00
Axel Lin
72da70e77f pwm: imx: Remove enabled field from struct imx_chip
We can test PWMF_ENABLED bit to know if pwm is enabled or not.
Thus remove enabled field from struct imx_chip.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:30:57 +02:00
Axel Lin
d5714e8b9d pwm: twl: Add .owner to struct pwm_ops
Add missing .owner of struct pwm_ops. This prevents the module from being
removed from underneath its users.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:30:18 +02:00
Axel Lin
7fa25314d5 pwm: twl-led: Add .owner to struct pwm_ops
Add missing .owner of struct pwm_ops. This prevents the module from being
removed from underneath its users.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:29:57 +02:00
Axel Lin
83c80dc535 pwm: atmel-tcb: Add .owner to struct pwm_ops
Add missing .owner of struct pwm_ops. This prevents the module from being
removed from underneath its users.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
2013-04-02 11:29:22 +02:00