William Breathitt Gray
663d8fb0f8
counter: 104-quad-8: Fix use-after-free by quad8_irq_handler
...
On unbind an irq might be pending which results in quad8_irq_handler()
calling counter_push_event() for a counter that is already unregistered.
This patch fixes that situation by passing the struct counter_device dev
to devm_request_irq() rather than the parent's so that the irq handler
is cleaned before the counter is unregistered.
Fixes: 7aa2ba0df6 ("counter: 104-quad-8: Add IRQ support for the ACCES 104-QUAD-8")
Cc: Syed Nayyar Waris <syednwaris@gmail.com >
Reported-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Link: https://lore.kernel.org/r/20220105093052.258791-1-vilhelm.gray@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2022-01-06 15:51:13 +01:00
Uwe Kleine-König
f2ee4759fb
counter: remove old and now unused registration API
...
Usage of counter_register() yields issues in device lifetime tracking. All
drivers were converted to the new API, so the old one can go away.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-24-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
02758cb20d
counter: ti-eqep: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: f213729f67 ("counter: new TI eQEP driver")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Acked-by: David Lechner <david@lechnology.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-23-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
e75d678d04
counter: stm32-lptimer-cnt: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: 597f55e3f3 ("counter: stm32-lptimer: add counter device")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-22-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
e1717d2ea0
counter: stm32-timer-cnt: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: ad29937e20 ("counter: Add STM32 Timer quadrature encoder")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-21-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
5998ea6214
counter: microchip-tcb-capture: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: 106b104137 ("counter: Add microchip TCB capture counter")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-20-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
b5d6547c8e
counter: ftm-quaddec: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: a3b9a99980 ("counter: add FlexTimer Module Quadrature decoder counter driver")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-19-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
e99dec87a9
counter: intel-qep: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: b711f687a1 ("counter: Add support for Intel Quadrature Encoder Peripheral")
Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com >
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-18-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
aefc7e1797
counter: interrupt-cnt: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: a55ebd47f2 ("counter: add IRQ or GPIO based counter")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-17-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
9e884bb19c
counter: 104-quad-8: Convert to new counter registration
...
This fixes device lifetime issues where it was possible to free a live
struct device.
Fixes: f1d8a071d4 ("counter: 104-quad-8: Add Generic Counter interface support")
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-16-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:07 +01:00
Uwe Kleine-König
c18e276030
counter: Provide alternative counter registration functions
...
The current implementation gets device lifetime tracking wrong. The
problem is that allocation of struct counter_device is controlled by the
individual drivers but this structure contains a struct device that
might have to live longer than a driver is bound. As a result a command
sequence like:
{ sleep 5; echo bang; } > /dev/counter0 &
sleep 1;
echo 40000000.timer:counter > /sys/bus/platform/drivers/stm32-timer-counter/unbind
can keep a reference to the struct device and unbinding results in
freeing the memory occupied by this device resulting in an oops.
This commit provides two new functions (plus some helpers):
- counter_alloc() to allocate a struct counter_device that is
automatically freed once the embedded struct device is released
- counter_add() to register such a device.
Note that this commit doesn't fix any issues, all drivers have to be
converted to these new functions to correct the lifetime problems.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-14-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
e152833b2c
counter: stm32-timer-cnt: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-13-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
e98ea385f8
counter: stm32-lptimer-cnt: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-12-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
8817c2d03a
counter: ti-eqep: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Acked-by: David Lechner <david@lechnology.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-11-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
1f1b40c057
counter: ftm-quaddec: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-10-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
53ada09552
counter: intel-qep: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-9-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
a49ede8208
counter: microchip-tcb-capture: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-8-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
63f0e2b6c0
counter: interrupt-cnt: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-7-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
aea8334b24
counter: 104-quad-8: Convert to counter_priv() wrapper
...
This is a straight forward conversion to the new counter_priv() wrapper.
Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-6-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
5207fb2f31
counter: Provide a wrapper to access device private data
...
For now this just wraps accessing struct counter_device::priv. However
this is about to change and converting drivers to this helper
individually makes fixing device lifetime issues result in easier to
review patches.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-5-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
0880603c84
counter: microchip-tcb-capture: Drop unused platform_set_drvdata()
...
The driver doesn't ever use platform_get_drvdata, so drop this unused
call.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-4-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:06 +01:00
Uwe Kleine-König
8b2bc10ca2
counter: ftm-quaddec: Drop unused platform_set_drvdata()
...
The driver doesn't ever use platform_get_drvdata, so drop this unused
call.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-3-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:05 +01:00
Uwe Kleine-König
b56346ddbd
counter: Use container_of instead of drvdata to track counter_device
...
The counter core uses drvdata to find a struct counter_device from a
struct device. However as the device is a member of struct counter_device,
the lookup can be done faster (and a bit type safe) using container_of.
There are no other users of drvdata, so the call to dev_set_drvdata can
go away, too.
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com >
Acked-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Link: https://lore.kernel.org/r/20211230150300.72196-2-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-30 17:44:05 +01:00
William Breathitt Gray
c95cc0d957
counter: 104-quad-8: Fix persistent enabled events bug
...
A bug exists if the user executes a COUNTER_ADD_WATCH_IOCTL ioctl call,
and then executes a COUNTER_DISABLE_EVENTS_IOCTL ioctl call. Disabling
the events should disable the 104-QUAD-8 interrupts, but because of this
bug the interrupts are not disabling.
The reason this bug is occurring is because quad8_events_configure() is
called when COUNTER_DISABLE_EVENTS_IOCTL is handled, but the
next_irq_trigger[] array has not been cleared before it is checked in
the loop.
This patch fixes the bug by removing the next_irq_trigger array and
instead utilizing a different algorithm of walking the events_list list
for the current requested events. When a COUNTER_DISABLE_EVENTS_IOCTL is
handled, events_list will be empty and thus all device channels end up
with interrupts disabled.
Fixes: 7aa2ba0df6 ("counter: 104-quad-8: Add IRQ support for the ACCES 104-QUAD-8")
Cc: Syed Nayyar Waris <syednwaris@gmail.com >
Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Link: https://lore.kernel.org/r/5fd5731cec1c251acee30eefb7c19160d03c9d39.1640072891.git.vilhelm.gray@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-21 10:32:08 +01:00
Uwe Kleine-König
60f07e74f8
counter: ti-eqep: Use container_of instead of struct counter_device::priv
...
Using counter->priv is a memory read and so more expensive than
container_of which is only an addition. (In this case even a noop
because the offset is 0.)
So container_of is expected to be a tad faster, it's type-safe, and
produces smaller code (ARCH=arm allmodconfig):
$ source/scripts/bloat-o-meter drivers/counter/ti-eqep.o-pre drivers/counter/ti-eqep.o
add/remove: 0/0 grow/shrink: 0/9 up/down: 0/-108 (-108)
Function old new delta
ti_eqep_position_enable_write 132 120 -12
ti_eqep_position_enable_read 260 248 -12
ti_eqep_position_ceiling_write 132 120 -12
ti_eqep_position_ceiling_read 236 224 -12
ti_eqep_function_write 220 208 -12
ti_eqep_function_read 372 360 -12
ti_eqep_count_write 312 300 -12
ti_eqep_count_read 236 224 -12
ti_eqep_action_read 664 652 -12
Total: Before=4598, After=4490, chg -2.35%
Acked-by: David Lechner <david@lechnology.com >
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de >
Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com >
Link: https://lore.kernel.org/r/4bde7cbd9e43a5909208102094444219d3154466.1640072891.git.vilhelm.gray@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2021-12-21 10:32:08 +01:00