<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl.xml"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
    <title>Changes in push-switch.c</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2015</copyright>
    <generator>Java</generator><item>
        <title>e70140ba - Get rid of &apos;remove_new&apos; relic from platform driver struct</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#e70140ba</link>
        <description>Get rid of &apos;remove_new&apos; relic from platform driver structThe continual trickle of small conversion patches is grating on me, andis really not helping.  Just get rid of the &apos;remove_new&apos; memberfunction, which is just an alias for the plain &apos;remove&apos;, and had acomment to that effect:  /*   * .remove_new() is a relic from a prototype conversion of .remove().   * New drivers are supposed to implement .remove(). Once all drivers are   * converted to not use .remove_new any more, it will be dropped.   */This was just a tree-wide &apos;sed&apos; script that replaced &apos;.remove_new&apos; with&apos;.remove&apos;, with some care taken to turn a subsequent tab into two tabsto make things line up.I did do some minimal manual whitespace adjustment for places that usedspaces to line things up.Then I just removed the old (sic) .remove_new member function, and thisis the end result.  No more unnecessary conversion noise.Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Sun, 01 Dec 2024 23:12:43 +0000</pubDate>
        <dc:creator>Linus Torvalds &lt;torvalds@linux-foundation.org&gt;</dc:creator>
    </item>
<item>
        <title>8fe76a1c - sh: push-switch: Add missing MODULE_DESCRIPTION() macro</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#8fe76a1c</link>
        <description>sh: push-switch: Add missing MODULE_DESCRIPTION() macroFixes the following warning when building allmodconfig with W=1 C=1:WARNING: modpost: missing MODULE_DESCRIPTION() in arch/sh/drivers/push-switch.oSigned-off-by: Jeff Johnson &lt;quic_jjohnson@quicinc.com&gt;Reviewed-by: John Paul Adrian Glaubitz &lt;glaubitz@physik.fu-berlin.de&gt;Link: https://lore.kernel.org/r/20240702-md-sh-arch-sh-drivers-v1-1-2c5d439a5479@quicinc.comSigned-off-by: John Paul Adrian Glaubitz &lt;glaubitz@physik.fu-berlin.de&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Tue, 02 Jul 2024 19:29:38 +0000</pubDate>
        <dc:creator>Jeff Johnson &lt;quic_jjohnson@quicinc.com&gt;</dc:creator>
    </item>
<item>
        <title>5019cd61 - sh: push-switch: Convert to platform remove callback returning void</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#5019cd61</link>
        <description>sh: push-switch: Convert to platform remove callback returning voidThe .remove() callback for a platform driver returns an int which makesmany driver authors wrongly assume it&apos;s possible to do error handling byreturning an error code. However the value returned is ignored (apartfrom emitting a warning) and this typically results in resource leaks.To improve here there is a quest to make the remove callback returnvoid. In the first step of this quest all drivers are converted to.remove_new(), which already returns void. Eventually after all driversare converted, .remove_new() will be renamed to .remove().Trivially convert this driver from always returning zero in the removecallback to the void returning variant.Signed-off-by: Uwe Kleine-K&#246;nig &lt;u.kleine-koenig@pengutronix.de&gt;Reviewed-by: Geert Uytterhoeven &lt;geert+renesas@glider.be&gt;Reviewed-by: John Paul Adrian Glaubitz &lt;glaubitz@physik.fu-berlin.de&gt;Link: https://lore.kernel.org/r/20240306211947.97103-2-u.kleine-koenig@pengutronix.deSigned-off-by: John Paul Adrian Glaubitz &lt;glaubitz@physik.fu-berlin.de&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Wed, 06 Mar 2024 21:19:47 +0000</pubDate>
        <dc:creator>Uwe Kleine-K&#246;nig &lt;u.kleine-koenig@pengutronix.de&gt;</dc:creator>
    </item>
<item>
        <title>246f80a0 - sh: push-switch: Reorder cleanup operations to avoid use-after-free bug</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#246f80a0</link>
        <description>sh: push-switch: Reorder cleanup operations to avoid use-after-free bugThe original code puts flush_work() before timer_shutdown_sync()in switch_drv_remove(). Although we use flush_work() to stopthe worker, it could be rescheduled in switch_timer(). As a result,a use-after-free bug can occur. The details are shown below:      (cpu 0)                    |      (cpu 1)switch_drv_remove()              | flush_work()                    |  ...                            |  switch_timer // timer                                 |   schedule_work(&amp;psw-&gt;work) timer_shutdown_sync()           | ...                             |  switch_work_handler // worker kfree(psw) // free              |                                 |   psw-&gt;state = 0 // useThis patch puts timer_shutdown_sync() before flush_work() tomitigate the bugs. As a result, the worker and timer will bestopped safely before the deallocate operations.Fixes: 9f5e8eee5cfe (&quot;sh: generic push-switch framework.&quot;)Signed-off-by: Duoming Zhou &lt;duoming@zju.edu.cn&gt;Reviewed-by: Geert Uytterhoeven &lt;geert+renesas@glider.be&gt;Reviewed-by: John Paul Adrian Glaubitz &lt;glaubitz@physik.fu-berlin.de&gt;Link: https://lore.kernel.org/r/20230802033737.9738-1-duoming@zju.edu.cnSigned-off-by: John Paul Adrian Glaubitz &lt;glaubitz@physik.fu-berlin.de&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Wed, 02 Aug 2023 03:37:37 +0000</pubDate>
        <dc:creator>Duoming Zhou &lt;duoming@zju.edu.cn&gt;</dc:creator>
    </item>
<item>
        <title>292a089d - treewide: Convert del_timer*() to timer_shutdown*()</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#292a089d</link>
        <description>treewide: Convert del_timer*() to timer_shutdown*()Due to several bugs caused by timers being re-armed after they areshutdown and just before they are freed, a new state of timers was addedcalled &quot;shutdown&quot;.  After a timer is set to this state, then it can nolonger be re-armed.The following script was run to find all the trivial locations wheredel_timer() or del_timer_sync() is called in the same function that theobject holding the timer is freed.  It also ignores any locations wherethe timer-&gt;function is modified between the del_timer*() and the free(),as that is not considered a &quot;trivial&quot; case.This was created by using a coccinelle script and the followingcommands:    $ cat timer.cocci    @@    expression ptr, slab;    identifier timer, rfield;    @@    (    -       del_timer(&amp;ptr-&gt;timer);    +       timer_shutdown(&amp;ptr-&gt;timer);    |    -       del_timer_sync(&amp;ptr-&gt;timer);    +       timer_shutdown_sync(&amp;ptr-&gt;timer);    )      ... when strict          when != ptr-&gt;timer    (            kfree_rcu(ptr, rfield);    |            kmem_cache_free(slab, ptr);    |            kfree(ptr);    )    $ spatch timer.cocci . &gt; /tmp/t.patch    $ patch -p1 &lt; /tmp/t.patchLink: https://lore.kernel.org/lkml/20221123201306.823305113@linutronix.de/Signed-off-by: Steven Rostedt (Google) &lt;rostedt@goodmis.org&gt;Acked-by: Pavel Machek &lt;pavel@ucw.cz&gt; [ LED ]Acked-by: Kalle Valo &lt;kvalo@kernel.org&gt; [ wireless ]Acked-by: Paolo Abeni &lt;pabeni@redhat.com&gt; [ networking ]Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Tue, 20 Dec 2022 18:45:19 +0000</pubDate>
        <dc:creator>Steven Rostedt (Google) &lt;rostedt@goodmis.org&gt;</dc:creator>
    </item>
<item>
        <title>ff4a7481 - sh: drivers: convert to SPDX identifiers</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#ff4a7481</link>
        <description>sh: drivers: convert to SPDX identifiersUpdate license to use SPDX-License-Identifier instead of verbose licensetext.As original license mentioned, it is GPL-2.0 in SPDX.Then, MODULE_LICENSE() should be &quot;GPL v2&quot; instead of &quot;GPL&quot;.See ${LINUX}/include/linux/module.h	&quot;GPL&quot;		[GNU Public License v2 or later]	&quot;GPL v2&quot;	[GNU Public License v2]Link: http://lkml.kernel.org/r/87h8fsct0a.wl-kuninori.morimoto.gx@renesas.comSigned-off-by: Kuninori Morimoto &lt;kuninori.morimoto.gx@renesas.com&gt;Reviewed-by: Simon Horman &lt;horms+renesas@verge.net.au&gt;Cc: Rich Felker &lt;dalias@libc.org&gt;Cc: Yoshinori Sato &lt;ysato@users.sourceforge.jp&gt;Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Fri, 28 Dec 2018 08:31:49 +0000</pubDate>
        <dc:creator>Kuninori Morimoto &lt;kuninori.morimoto.gx@renesas.com&gt;</dc:creator>
    </item>
<item>
        <title>c828a892 - treewide: Use DEVICE_ATTR_RO</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#c828a892</link>
        <description>treewide: Use DEVICE_ATTR_ROConvert DEVICE_ATTR uses to DEVICE_ATTR_RO where possible.Done with perl script:$ git grep -w --name-only DEVICE_ATTR | \  xargs perl -i -e &apos;local $/; while (&lt;&gt;) { s/\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?(?:\s*S_IRUGO\s*|\s*0444\s*)\)?\s*,\s*\1_show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(\1)/g; print;}&apos;Signed-off-by: Joe Perches &lt;joe@perches.com&gt;Acked-by: Rafael J. Wysocki &lt;rafael.j.wysocki@intel.com&gt;Acked-by: Robert Jarzmik &lt;robert.jarzmik@free.fr&gt;Acked-by: Sagi Grimberg &lt;sagi@grimberg.me&gt;Acked-by: Zhang Rui &lt;rui.zhang@intel.com&gt;Acked-by: Harald Freudenberger &lt;freude@linux.vnet.ibm.com&gt;Acked-by: Jani Nikula &lt;jani.nikula@intel.com&gt;Acked-by: Corey Minyard &lt;cminyard@mvista.com&gt;Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Tue, 19 Dec 2017 18:15:08 +0000</pubDate>
        <dc:creator>Joe Perches &lt;joe@perches.com&gt;</dc:creator>
    </item>
<item>
        <title>e99e88a9 - treewide: setup_timer() -&gt; timer_setup()</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#e99e88a9</link>
        <description>treewide: setup_timer() -&gt; timer_setup()This converts all remaining cases of the old setup_timer() API into usingtimer_setup(), where the callback argument is the structure alreadyholding the struct timer_list. These should have no behavioral changes,since they just change which pointer is passed into the callback withthe same available pointers after conversion. It handles the followingexamples, in addition to some other variations.Casting from unsigned long:    void my_callback(unsigned long data)    {        struct something *ptr = (struct something *)data;    ...    }    ...    setup_timer(&amp;ptr-&gt;my_timer, my_callback, ptr);and forced object casts:    void my_callback(struct something *ptr)    {    ...    }    ...    setup_timer(&amp;ptr-&gt;my_timer, my_callback, (unsigned long)ptr);become:    void my_callback(struct timer_list *t)    {        struct something *ptr = from_timer(ptr, t, my_timer);    ...    }    ...    timer_setup(&amp;ptr-&gt;my_timer, my_callback, 0);Direct function assignments:    void my_callback(unsigned long data)    {        struct something *ptr = (struct something *)data;    ...    }    ...    ptr-&gt;my_timer.function = my_callback;have a temporary cast added, along with converting the args:    void my_callback(struct timer_list *t)    {        struct something *ptr = from_timer(ptr, t, my_timer);    ...    }    ...    ptr-&gt;my_timer.function = (TIMER_FUNC_TYPE)my_callback;And finally, callbacks without a data assignment:    void my_callback(unsigned long data)    {    ...    }    ...    setup_timer(&amp;ptr-&gt;my_timer, my_callback, 0);have their argument renamed to verify they&apos;re unused during conversion:    void my_callback(struct timer_list *unused)    {    ...    }    ...    timer_setup(&amp;ptr-&gt;my_timer, my_callback, 0);The conversion is done with the following Coccinelle script:spatch --very-quiet --all-includes --include-headers \	-I ./arch/x86/include -I ./arch/x86/include/generated \	-I ./include -I ./arch/x86/include/uapi \	-I ./arch/x86/include/generated/uapi -I ./include/uapi \	-I ./include/generated/uapi --include ./include/linux/kconfig.h \	--dir . \	--cocci-file ~/src/data/timer_setup.cocci@fix_address_of@expression e;@@ setup_timer(-&amp;(e)+&amp;e , ...)// Update any raw setup_timer() usages that have a NULL callback, but// would otherwise match change_timer_function_usage, since the latter// will update all function assignments done in the face of a NULL// function initialization in setup_timer().@change_timer_function_usage_NULL@expression _E;identifier _timer;type _cast_data;@@(-setup_timer(&amp;_E-&gt;_timer, NULL, _E);+timer_setup(&amp;_E-&gt;_timer, NULL, 0);|-setup_timer(&amp;_E-&gt;_timer, NULL, (_cast_data)_E);+timer_setup(&amp;_E-&gt;_timer, NULL, 0);|-setup_timer(&amp;_E._timer, NULL, &amp;_E);+timer_setup(&amp;_E._timer, NULL, 0);|-setup_timer(&amp;_E._timer, NULL, (_cast_data)&amp;_E);+timer_setup(&amp;_E._timer, NULL, 0);)@change_timer_function_usage@expression _E;identifier _timer;struct timer_list _stl;identifier _callback;type _cast_func, _cast_data;@@(-setup_timer(&amp;_E-&gt;_timer, _callback, _E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, &amp;_callback, _E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, _callback, (_cast_data)_E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, &amp;_callback, (_cast_data)_E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, (_cast_func)_callback, _E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, (_cast_func)&amp;_callback, _E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, (_cast_func)_callback, (_cast_data)_E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, (_cast_func)&amp;_callback, (_cast_data)_E);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E._timer, _callback, (_cast_data)_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, _callback, (_cast_data)&amp;_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, &amp;_callback, (_cast_data)_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, &amp;_callback, (_cast_data)&amp;_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, (_cast_func)_callback, (_cast_data)_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, (_cast_func)_callback, (_cast_data)&amp;_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, (_cast_func)&amp;_callback, (_cast_data)_E);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, (_cast_func)&amp;_callback, (_cast_data)&amp;_E);+timer_setup(&amp;_E._timer, _callback, 0);| _E-&gt;_timer@_stl.function = _callback;| _E-&gt;_timer@_stl.function = &amp;_callback;| _E-&gt;_timer@_stl.function = (_cast_func)_callback;| _E-&gt;_timer@_stl.function = (_cast_func)&amp;_callback;| _E._timer@_stl.function = _callback;| _E._timer@_stl.function = &amp;_callback;| _E._timer@_stl.function = (_cast_func)_callback;| _E._timer@_stl.function = (_cast_func)&amp;_callback;)// callback(unsigned long arg)@change_callback_handle_cast depends on change_timer_function_usage@identifier change_timer_function_usage._callback;identifier change_timer_function_usage._timer;type _origtype;identifier _origarg;type _handletype;identifier _handle;@@ void _callback(-_origtype _origarg+struct timer_list *t ) {(	... when != _origarg	_handletype *_handle =-(_handletype *)_origarg;+from_timer(_handle, t, _timer);	... when != _origarg|	... when != _origarg	_handletype *_handle =-(void *)_origarg;+from_timer(_handle, t, _timer);	... when != _origarg|	... when != _origarg	_handletype *_handle;	... when != _handle	_handle =-(_handletype *)_origarg;+from_timer(_handle, t, _timer);	... when != _origarg|	... when != _origarg	_handletype *_handle;	... when != _handle	_handle =-(void *)_origarg;+from_timer(_handle, t, _timer);	... when != _origarg) }// callback(unsigned long arg) without existing variable@change_callback_handle_cast_no_arg depends on change_timer_function_usage &amp;&amp;                     !change_callback_handle_cast@identifier change_timer_function_usage._callback;identifier change_timer_function_usage._timer;type _origtype;identifier _origarg;type _handletype;@@ void _callback(-_origtype _origarg+struct timer_list *t ) {+	_handletype *_origarg = from_timer(_origarg, t, _timer);+	... when != _origarg-	(_handletype *)_origarg+	_origarg	... when != _origarg }// Avoid already converted callbacks.@match_callback_converted depends on change_timer_function_usage &amp;&amp;            !change_callback_handle_cast &amp;&amp;	    !change_callback_handle_cast_no_arg@identifier change_timer_function_usage._callback;identifier t;@@ void _callback(struct timer_list *t) { ... }// callback(struct something *handle)@change_callback_handle_arg depends on change_timer_function_usage &amp;&amp;	    !match_callback_converted &amp;&amp;            !change_callback_handle_cast &amp;&amp;            !change_callback_handle_cast_no_arg@identifier change_timer_function_usage._callback;identifier change_timer_function_usage._timer;type _handletype;identifier _handle;@@ void _callback(-_handletype *_handle+struct timer_list *t ) {+	_handletype *_handle = from_timer(_handle, t, _timer);	... }// If change_callback_handle_arg ran on an empty function, remove// the added handler.@unchange_callback_handle_arg depends on change_timer_function_usage &amp;&amp;	    change_callback_handle_arg@identifier change_timer_function_usage._callback;identifier change_timer_function_usage._timer;type _handletype;identifier _handle;identifier t;@@ void _callback(struct timer_list *t) {-	_handletype *_handle = from_timer(_handle, t, _timer); }// We only want to refactor the setup_timer() data argument if we&apos;ve found// the matching callback. This undoes changes in change_timer_function_usage.@unchange_timer_function_usage depends on change_timer_function_usage &amp;&amp;            !change_callback_handle_cast &amp;&amp;            !change_callback_handle_cast_no_arg &amp;&amp;	    !change_callback_handle_arg@expression change_timer_function_usage._E;identifier change_timer_function_usage._timer;identifier change_timer_function_usage._callback;type change_timer_function_usage._cast_data;@@(-timer_setup(&amp;_E-&gt;_timer, _callback, 0);+setup_timer(&amp;_E-&gt;_timer, _callback, (_cast_data)_E);|-timer_setup(&amp;_E._timer, _callback, 0);+setup_timer(&amp;_E._timer, _callback, (_cast_data)&amp;_E);)// If we fixed a callback from a .function assignment, fix the// assignment cast now.@change_timer_function_assignment depends on change_timer_function_usage &amp;&amp;            (change_callback_handle_cast ||             change_callback_handle_cast_no_arg ||             change_callback_handle_arg)@expression change_timer_function_usage._E;identifier change_timer_function_usage._timer;identifier change_timer_function_usage._callback;type _cast_func;typedef TIMER_FUNC_TYPE;@@( _E-&gt;_timer.function =-_callback+(TIMER_FUNC_TYPE)_callback ;| _E-&gt;_timer.function =-&amp;_callback+(TIMER_FUNC_TYPE)_callback ;| _E-&gt;_timer.function =-(_cast_func)_callback;+(TIMER_FUNC_TYPE)_callback ;| _E-&gt;_timer.function =-(_cast_func)&amp;_callback+(TIMER_FUNC_TYPE)_callback ;| _E._timer.function =-_callback+(TIMER_FUNC_TYPE)_callback ;| _E._timer.function =-&amp;_callback;+(TIMER_FUNC_TYPE)_callback ;| _E._timer.function =-(_cast_func)_callback+(TIMER_FUNC_TYPE)_callback ;| _E._timer.function =-(_cast_func)&amp;_callback+(TIMER_FUNC_TYPE)_callback ;)// Sometimes timer functions are called directly. Replace matched args.@change_timer_function_calls depends on change_timer_function_usage &amp;&amp;            (change_callback_handle_cast ||             change_callback_handle_cast_no_arg ||             change_callback_handle_arg)@expression _E;identifier change_timer_function_usage._timer;identifier change_timer_function_usage._callback;type _cast_data;@@ _callback((-(_cast_data)_E+&amp;_E-&gt;_timer|-(_cast_data)&amp;_E+&amp;_E._timer|-_E+&amp;_E-&gt;_timer) )// If a timer has been configured without a data argument, it can be// converted without regard to the callback argument, since it is unused.@match_timer_function_unused_data@expression _E;identifier _timer;identifier _callback;@@(-setup_timer(&amp;_E-&gt;_timer, _callback, 0);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, _callback, 0L);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E-&gt;_timer, _callback, 0UL);+timer_setup(&amp;_E-&gt;_timer, _callback, 0);|-setup_timer(&amp;_E._timer, _callback, 0);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, _callback, 0L);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_E._timer, _callback, 0UL);+timer_setup(&amp;_E._timer, _callback, 0);|-setup_timer(&amp;_timer, _callback, 0);+timer_setup(&amp;_timer, _callback, 0);|-setup_timer(&amp;_timer, _callback, 0L);+timer_setup(&amp;_timer, _callback, 0);|-setup_timer(&amp;_timer, _callback, 0UL);+timer_setup(&amp;_timer, _callback, 0);|-setup_timer(_timer, _callback, 0);+timer_setup(_timer, _callback, 0);|-setup_timer(_timer, _callback, 0L);+timer_setup(_timer, _callback, 0);|-setup_timer(_timer, _callback, 0UL);+timer_setup(_timer, _callback, 0);)@change_callback_unused_data depends on match_timer_function_unused_data@identifier match_timer_function_unused_data._callback;type _origtype;identifier _origarg;@@ void _callback(-_origtype _origarg+struct timer_list *unused ) {	... when != _origarg }Signed-off-by: Kees Cook &lt;keescook@chromium.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Mon, 16 Oct 2017 21:43:17 +0000</pubDate>
        <dc:creator>Kees Cook &lt;keescook@chromium.org&gt;</dc:creator>
    </item>
<item>
        <title>b9eaf187 - treewide: init_timer() -&gt; setup_timer()</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#b9eaf187</link>
        <description>treewide: init_timer() -&gt; setup_timer()This mechanically converts all remaining cases of ancient open-coded timersetup with the old setup_timer() API, which is the first step in timerconversions. This has no behavioral changes, since it ultimately justchanges the order of assignment to fields of struct timer_list whenfinding variations of:    init_timer(&amp;t);    f.function = timer_callback;    t.data = timer_callback_arg;to be converted into:    setup_timer(&amp;t, timer_callback, timer_callback_arg);The conversion is done with the following Coccinelle script, whichis an improved version of scripts/cocci/api/setup_timer.cocci, in thefollowing ways: - assignments-before-init_timer() cases - limit the .data case removal to the specific struct timer_list instance - handling calls by dereference (timer-&gt;field vs timer.field)spatch --very-quiet --all-includes --include-headers \	-I ./arch/x86/include -I ./arch/x86/include/generated \	-I ./include -I ./arch/x86/include/uapi \	-I ./arch/x86/include/generated/uapi -I ./include/uapi \	-I ./include/generated/uapi --include ./include/linux/kconfig.h \	--dir . \	--cocci-file ~/src/data/setup_timer.cocci@fix_address_of@expression e;@@ init_timer(-&amp;(e)+&amp;e , ...)// Match the common cases first to avoid Coccinelle parsing loops with// &quot;... when&quot; clauses.@match_immediate_function_data_after_init_timer@expression e, func, da;@@-init_timer+setup_timer ( \(&amp;e\|e\)+, func, da );(-\(e.function\|e-&gt;function\) = func;-\(e.data\|e-&gt;data\) = da;|-\(e.data\|e-&gt;data\) = da;-\(e.function\|e-&gt;function\) = func;)@match_immediate_function_data_before_init_timer@expression e, func, da;@@(-\(e.function\|e-&gt;function\) = func;-\(e.data\|e-&gt;data\) = da;|-\(e.data\|e-&gt;data\) = da;-\(e.function\|e-&gt;function\) = func;)-init_timer+setup_timer ( \(&amp;e\|e\)+, func, da );@match_function_and_data_after_init_timer@expression e, e2, e3, e4, e5, func, da;@@-init_timer+setup_timer ( \(&amp;e\|e\)+, func, da ); ... when != func = e2     when != da = e3(-e.function = func;... when != da = e4-e.data = da;|-e-&gt;function = func;... when != da = e4-e-&gt;data = da;|-e.data = da;... when != func = e5-e.function = func;|-e-&gt;data = da;... when != func = e5-e-&gt;function = func;)@match_function_and_data_before_init_timer@expression e, e2, e3, e4, e5, func, da;@@(-e.function = func;... when != da = e4-e.data = da;|-e-&gt;function = func;... when != da = e4-e-&gt;data = da;|-e.data = da;... when != func = e5-e.function = func;|-e-&gt;data = da;... when != func = e5-e-&gt;function = func;)... when != func = e2    when != da = e3-init_timer+setup_timer ( \(&amp;e\|e\)+, func, da );@r1 exists@expression t;identifier f;position p;@@f(...) { ... when any  init_timer@p(\(&amp;t\|t\))  ... when any}@r2 exists@expression r1.t;identifier g != r1.f;expression e8;@@g(...) { ... when any  \(t.data\|t-&gt;data\) = e8  ... when any}// It is dangerous to use setup_timer if data field is initialized// in another function.@script:python depends on r2@p &lt;&lt; r1.p;@@cocci.include_match(False)@r3@expression r1.t, func, e7;position r1.p;@@(-init_timer@p(&amp;t);+setup_timer(&amp;t, func, 0UL);... when != func = e7-t.function = func;|-t.function = func;... when != func = e7-init_timer@p(&amp;t);+setup_timer(&amp;t, func, 0UL);|-init_timer@p(t);+setup_timer(t, func, 0UL);... when != func = e7-t-&gt;function = func;|-t-&gt;function = func;... when != func = e7-init_timer@p(t);+setup_timer(t, func, 0UL);)Signed-off-by: Kees Cook &lt;keescook@chromium.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Mon, 16 Oct 2017 20:15:39 +0000</pubDate>
        <dc:creator>Kees Cook &lt;keescook@chromium.org&gt;</dc:creator>
    </item>
<item>
        <title>43829731 - workqueue: deprecate flush[_delayed]_work_sync()</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#43829731</link>
        <description>workqueue: deprecate flush[_delayed]_work_sync()flush[_delayed]_work_sync() are now spurious.  Mark them deprecatedand convert all users to flush[_delayed]_work().If you&apos;re cc&apos;d and wondering what&apos;s going on: Now all workqueues arenon-reentrant and the regular flushes guarantee that the work item isnot pending or running on any CPU on return, so there&apos;s no reason touse the sync flushes at all and they&apos;re going away.This patch doesn&apos;t make any functional difference.Signed-off-by: Tejun Heo &lt;tj@kernel.org&gt;Cc: Russell King &lt;linux@arm.linux.org.uk&gt;Cc: Paul Mundt &lt;lethal@linux-sh.org&gt;Cc: Ian Campbell &lt;ian.campbell@citrix.com&gt;Cc: Jens Axboe &lt;axboe@kernel.dk&gt;Cc: Mattia Dongili &lt;malattia@linux.it&gt;Cc: Kent Yoder &lt;key@linux.vnet.ibm.com&gt;Cc: David Airlie &lt;airlied@linux.ie&gt;Cc: Jiri Kosina &lt;jkosina@suse.cz&gt;Cc: Karsten Keil &lt;isdn@linux-pingi.de&gt;Cc: Bryan Wu &lt;bryan.wu@canonical.com&gt;Cc: Benjamin Herrenschmidt &lt;benh@kernel.crashing.org&gt;Cc: Alasdair Kergon &lt;agk@redhat.com&gt;Cc: Mauro Carvalho Chehab &lt;mchehab@infradead.org&gt;Cc: Florian Tobias Schandinat &lt;FlorianSchandinat@gmx.de&gt;Cc: David Woodhouse &lt;dwmw2@infradead.org&gt;Cc: &quot;David S. Miller&quot; &lt;davem@davemloft.net&gt;Cc: linux-wireless@vger.kernel.orgCc: Anton Vorontsov &lt;cbou@mail.ru&gt;Cc: Sangbeom Kim &lt;sbkim73@samsung.com&gt;Cc: &quot;James E.J. Bottomley&quot; &lt;James.Bottomley@HansenPartnership.com&gt;Cc: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;Cc: Eric Van Hensbergen &lt;ericvh@gmail.com&gt;Cc: Takashi Iwai &lt;tiwai@suse.de&gt;Cc: Steven Whitehouse &lt;swhiteho@redhat.com&gt;Cc: Petr Vandrovec &lt;petr@vandrovec.name&gt;Cc: Mark Fasheh &lt;mfasheh@suse.com&gt;Cc: Christoph Hellwig &lt;hch@infradead.org&gt;Cc: Avi Kivity &lt;avi@redhat.com&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Mon, 20 Aug 2012 21:51:24 +0000</pubDate>
        <dc:creator>Tejun Heo &lt;tj@kernel.org&gt;</dc:creator>
    </item>
<item>
        <title>d11584a0 - SH: irq: Remove IRQF_DISABLED</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#d11584a0</link>
        <description>SH: irq: Remove IRQF_DISABLEDSince commit [e58aa3d2: genirq: Run irq handlers with interrupts disabled],We run all interrupt handlers with interrupts disabledand we even check and yell when an interrupt handlerreturns with interrupts enabled (see commit [b738a50a:genirq: Warn when handler enables interrupts]).So now this flag is a NOOP and can be removed.Signed-off-by: Yong Zhang &lt;yong.zhang0@gmail.com&gt;Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Sat, 22 Oct 2011 09:56:28 +0000</pubDate>
        <dc:creator>Yong Zhang &lt;yong.zhang0@gmail.com&gt;</dc:creator>
    </item>
<item>
        <title>539253f6 - sh: don&apos;t use flush_scheduled_work()</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#539253f6</link>
        <description>sh: don&apos;t use flush_scheduled_work()flush_scheduled_work() is deprecated and scheduled to be removed.Directly flush psw-&gt;work on removal instead.Signed-off-by: Tejun Heo &lt;tj@kernel.org&gt;Cc: Paul Mundt &lt;lethal@linux-sh.org&gt;Cc: linux-sh@vger.kernel.org

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Fri, 24 Dec 2010 14:59:06 +0000</pubDate>
        <dc:creator>Tejun Heo &lt;tj@kernel.org&gt;</dc:creator>
    </item>
<item>
        <title>5a0e3ad6 - include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#5a0e3ad6</link>
        <description>include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.hpercpu.h is included by sched.h and module.h and thus ends up beingincluded when building most .c files.  percpu.h includes slab.h whichin turn includes gfp.h making everything defined by the two filesuniversally available and complicating inclusion dependencies.percpu.h -&gt; slab.h dependency is about to be removed.  Prepare forthis change by updating users of gfp and slab facilities include thoseheaders directly instead of assuming availability.  As this conversionneeds to touch large number of source files, the following script isused as the basis of conversion.  http://userweb.kernel.org/~tj/misc/slabh-sweep.pyThe script does the followings.* Scan files for gfp and slab usages and update includes such that  only the necessary includes are there.  ie. if only gfp is used,  gfp.h, if slab is used, slab.h.* When the script inserts a new include, it looks at the include  blocks and try to put the new include such that its order conforms  to its surrounding.  It&apos;s put in the include block which contains  core kernel includes, in the same order that the rest are ordered -  alphabetical, Christmas tree, rev-Xmas-tree or at the end if there  doesn&apos;t seem to be any matching order.* If the script can&apos;t find a place to put a new include (mostly  because the file doesn&apos;t have fitting include block), it prints out  an error message indicating which .h file needs to be added to the  file.The conversion was done in the following steps.1. The initial automatic conversion of all .c files updated slightly   over 4000 files, deleting around 700 includes and adding ~480 gfp.h   and ~3000 slab.h inclusions.  The script emitted errors for ~400   files.2. Each error was manually checked.  Some didn&apos;t need the inclusion,   some needed manual addition while adding it to implementation .h or   embedding .c file was more appropriate for others.  This step added   inclusions to around 150 files.3. The script was run again and the output was compared to the edits   from #2 to make sure no file was left behind.4. Several build tests were done and a couple of problems were fixed.   e.g. lib/decompress_*.c used malloc/free() wrappers around slab   APIs requiring slab.h to be added manually.5. The script was run on all .h files but without automatically   editing them as sprinkling gfp.h and slab.h inclusions around .h   files could easily lead to inclusion dependency hell.  Most gfp.h   inclusion directives were ignored as stuff from gfp.h was usually   wildly available and often used in preprocessor macros.  Each   slab.h inclusion directive was examined and added manually as   necessary.6. percpu.h was updated not to include slab.h.7. Build test were done on the following configurations and failures   were fixed.  CONFIG_GCOV_KERNEL was turned off for all tests (as my   distributed build env didn&apos;t work with gcov compiles) and a few   more options had to be turned off depending on archs to make things   build (like ipr on powerpc/64 which failed due to missing writeq).   * x86 and x86_64 UP and SMP allmodconfig and a custom test config.   * powerpc and powerpc64 SMP allmodconfig   * sparc and sparc64 SMP allmodconfig   * ia64 SMP allmodconfig   * s390 SMP allmodconfig   * alpha SMP allmodconfig   * um on x86_64 SMP allmodconfig8. percpu.h modifications were reverted so that it could be applied as   a separate patch and serve as bisection point.Given the fact that I had only a couple of failures from tests on step6, I&apos;m fairly confident about the coverage of this conversion patch.If there is a breakage, it&apos;s likely to be something in one of the archheaders which should be easily discoverable easily on most builds ofthe specific arch.Signed-off-by: Tejun Heo &lt;tj@kernel.org&gt;Guess-its-ok-by: Christoph Lameter &lt;cl@linux-foundation.org&gt;Cc: Ingo Molnar &lt;mingo@redhat.com&gt;Cc: Lee Schermerhorn &lt;Lee.Schermerhorn@hp.com&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Wed, 24 Mar 2010 08:04:11 +0000</pubDate>
        <dc:creator>Tejun Heo &lt;tj@kernel.org&gt;</dc:creator>
    </item>
<item>
        <title>e71cf2b6 - sh: Revert incorrect license string changes.</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#e71cf2b6</link>
        <description>sh: Revert incorrect license string changes.These were right the first time. Either a thinko orbuilding in the wrong tree. Revert this.Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Mon, 24 Sep 2007 08:49:51 +0000</pubDate>
        <dc:creator>Paul Mundt &lt;lethal@linux-sh.org&gt;</dc:creator>
    </item>
<item>
        <title>2d009328 - sh: More license string silliness.</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#2d009328</link>
        <description>sh: More license string silliness.&apos;GPL v2&apos; vs &apos;GPLv2&apos;.Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Mon, 20 Aug 2007 04:15:51 +0000</pubDate>
        <dc:creator>Paul Mundt &lt;lethal@linux-sh.org&gt;</dc:creator>
    </item>
<item>
        <title>e5e3dfc8 - sh: push-switch: Correct license string.</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#e5e3dfc8</link>
        <description>sh: push-switch: Correct license string.This was accidentally set as &quot;GPLv2&quot;, whereas the kernel expects v2to be written &quot;GPL v2&quot;, this caused complaints regarding the useof the platform device APIs when built as a module.Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Wed, 18 Jul 2007 09:54:09 +0000</pubDate>
        <dc:creator>Paul Mundt &lt;lethal@linux-sh.org&gt;</dc:creator>
    </item>
<item>
        <title>fce3a24e - sh: push-switch fixups for work_struct API damage.</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#fce3a24e</link>
        <description>sh: push-switch fixups for work_struct API damage.INIT_WORK() dropped the data arg, so now we have to stash an extrapointer and backpedal instead.Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Thu, 07 Dec 2006 04:20:58 +0000</pubDate>
        <dc:creator>Paul Mundt &lt;lethal@linux-sh.org&gt;</dc:creator>
    </item>
<item>
        <title>9f5e8eee - sh: generic push-switch framework.</title>
        <link>http://172.16.0.5:8080/history/linux-6.15/arch/sh/drivers/push-switch.c#9f5e8eee</link>
        <description>sh: generic push-switch framework.This adds support for a generic push switch framework. Adaptable forvarious switches, including GPIO switches and the push switches commonlyfound on Renesas debug boards.This allows switch states to be trivially reported through sysfs.Signed-off-by: Paul Mundt &lt;lethal@linux-sh.org&gt;

            List of files:
            /linux-6.15/arch/sh/drivers/push-switch.c</description>
        <pubDate>Fri, 24 Nov 2006 02:22:57 +0000</pubDate>
        <dc:creator>Paul Mundt &lt;lethal@linux-sh.org&gt;</dc:creator>
    </item>
</channel>
</rss>
