There is a requirement to add another mode: CLOCK_EVT_MODE_ONESHOT_STOPPED (lkml.org/lkml/2014/5/9/508) to clockevent devices and clockevent-drivers may or maynot support it. Drivers that don't support it can return failure codes on a call to ->set_mode(), which has a return type of 'void' currently.
Following steps are suggested (by tglx) to get this fixed: 1. Add another callback ->set_dev_mode(), with return type 'int'. 2. Covert clockevent drivers to use ->set_dev_mode() instead of ->set_mode(). 3. Once all are converted, remove support for ->set_mode().
Part 1 and 2 are already implemented by earlier patches and this one targets part 3.
There are no more references to ->set_mode() and so it can be removed safely without breaking any platform.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org --- include/linux/clockchips.h | 3 --- kernel/time/clockevents.c | 22 +++++++--------------- kernel/time/timer_list.c | 9 ++------- 3 files changed, 9 insertions(+), 25 deletions(-)
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index bf902bf..afdda4b 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -82,7 +82,6 @@ enum clock_event_mode { * @features: features * @retries: number of forced programming retries * @set_dev_mode: set dev mode function - * @set_mode: set mode function (deprecated, use set_dev_mode instead) * @broadcast: function to broadcast events * @min_delta_ticks: minimum delta value in ticks stored for reconfiguration * @max_delta_ticks: maximum delta value in ticks stored for reconfiguration @@ -112,8 +111,6 @@ struct clock_event_device { void (*broadcast)(const struct cpumask *mask); int (*set_dev_mode)(enum clock_event_mode mode, struct clock_event_device *); - void (*set_mode)(enum clock_event_mode mode, - struct clock_event_device *); void (*suspend)(struct clock_event_device *); void (*resume)(struct clock_event_device *); unsigned long min_delta_ticks; diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 087a5aa..7b1abd9 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c @@ -105,15 +105,11 @@ int clockevents_set_mode(struct clock_event_device *dev, enum clock_event_mode mode) { if (dev->mode != mode) { - if (dev->set_dev_mode) { - int ret = dev->set_dev_mode(mode, dev); - - /* Currently available modes are not allowed to fail */ - if (WARN_ON(ret)) - return ret; - } else { - dev->set_mode(mode, dev); - } + int ret = dev->set_dev_mode(mode, dev); + + /* Currently available modes are not allowed to fail */ + if (WARN_ON(ret)) + return ret;
dev->mode = mode;
@@ -460,12 +456,8 @@ int __clockevents_update_freq(struct clock_event_device *dev, u32 freq) return clockevents_program_event(dev, dev->next_event, false);
if (dev->mode == CLOCK_EVT_MODE_PERIODIC) { - if (dev->set_dev_mode) { - ret = dev->set_dev_mode(CLOCK_EVT_MODE_PERIODIC, dev); - WARN_ON(ret); - } else { - dev->set_mode(CLOCK_EVT_MODE_PERIODIC, dev); - } + ret = dev->set_dev_mode(CLOCK_EVT_MODE_PERIODIC, dev); + WARN_ON(ret); }
return ret; diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c index 3d854aa..26748bb 100644 --- a/kernel/time/timer_list.c +++ b/kernel/time/timer_list.c @@ -228,13 +228,8 @@ print_tickdevice(struct seq_file *m, struct tick_device *td, int cpu) print_name_offset(m, dev->set_next_event); SEQ_printf(m, "\n");
- if (dev->set_dev_mode) { - SEQ_printf(m, " set_dev_mode: "); - print_name_offset(m, dev->set_dev_mode); - } else { - SEQ_printf(m, " set_mode: "); - print_name_offset(m, dev->set_mode); - } + SEQ_printf(m, " set_dev_mode: "); + print_name_offset(m, dev->set_dev_mode); SEQ_printf(m, "\n");
SEQ_printf(m, " event_handler: ");