Messages in this thread | | | Subject | Re: [RFC PATCH 1/7] drivers: base: Add resource managed version of delayed work init | From | Guenter Roeck <> | Date | Sat, 13 Feb 2021 07:27:47 -0800 |
| |
On 2/13/21 7:03 AM, Hans de Goede wrote: [ ... ] > > I think something like this should work: > > static int devm_delayed_work_autocancel(struct device *dev, struct delayed_work *w, > void (*worker)(struct work_struct *work)) { > INIT_DELAYED_WORK(w, worker); > return devm_add_action(dev, (void (*action)(void *))cancel_delayed_work_sync, w); > } > > I'm not sure about the cast, that may need something like this instead: > > typedef void (*devm_action_func)(void *); > > static int devm_delayed_work_autocancel(struct device *dev, struct delayed_work *w, > void (*worker)(struct work_struct *work)) { > INIT_DELAYED_WORK(w, worker); > return devm_add_action(dev, (devm_action_func)cancel_delayed_work_sync, w);
Unfortunately, you can not type cast function pointers in C. It is against the C ABI. I am sure it is done in a few places in the kernel anyway, but those are wrong.
This is the reason why many calls to devm_add_action() point to functions such as
static void visconti_clk_disable_unprepare(void *data) { clk_disable_unprepare(data); }
which could otherwise be handled using typecasts.
Guenter
| |