Merge tag 'v4.9.141' into khadas-vim3-4.9.y
authorNick <nick@khadas.com>
Tue, 21 May 2019 09:08:18 +0000 (17:08 +0800)
committerNick <nick@khadas.com>
Tue, 21 May 2019 09:08:18 +0000 (17:08 +0800)
This is the 4.9.141 stable release

1  2 
Makefile
arch/arm64/include/asm/percpu.h
drivers/block/zram/zram_drv.c
drivers/gpu/drm/drm_edid.c
drivers/hid/uhid.c
drivers/usb/core/quirks.c
net/netfilter/xt_IDLETIMER.c

diff --cc Makefile
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -226,57 -112,26 +226,73 @@@ static void idletimer_tg_expired(unsign
        struct idletimer_tg *timer = (struct idletimer_tg *) data;
  
        pr_debug("timer %s expired\n", timer->attr.attr.name);
 -
 +      spin_lock_bh(&timestamp_lock);
 +      timer->active = false;
 +      timer->work_pending = true;
        schedule_work(&timer->work);
 +      spin_unlock_bh(&timestamp_lock);
 +}
 +
 +static int idletimer_resume(struct notifier_block *notifier,
 +              unsigned long pm_event, void *unused)
 +{
 +      struct timespec ts;
 +      unsigned long time_diff, now = jiffies;
 +      struct idletimer_tg *timer = container_of(notifier,
 +                      struct idletimer_tg, pm_nb);
 +      if (!timer)
 +              return NOTIFY_DONE;
 +      switch (pm_event) {
 +      case PM_SUSPEND_PREPARE:
 +              get_monotonic_boottime(&timer->last_suspend_time);
 +              break;
 +      case PM_POST_SUSPEND:
 +              spin_lock_bh(&timestamp_lock);
 +              if (!timer->active) {
 +                      spin_unlock_bh(&timestamp_lock);
 +                      break;
 +              }
 +              /* since jiffies are not updated when suspended now represents
 +               * the time it would have suspended */
 +              if (time_after(timer->timer.expires, now)) {
 +                      get_monotonic_boottime(&ts);
 +                      ts = timespec_sub(ts, timer->last_suspend_time);
 +                      time_diff = timespec_to_jiffies(&ts);
 +                      if (timer->timer.expires > (time_diff + now)) {
 +                              mod_timer_pending(&timer->timer,
 +                                              (timer->timer.expires - time_diff));
 +                      } else {
 +                              del_timer(&timer->timer);
 +                              timer->timer.expires = 0;
 +                              timer->active = false;
 +                              timer->work_pending = true;
 +                              schedule_work(&timer->work);
 +                      }
 +              }
 +              spin_unlock_bh(&timestamp_lock);
 +              break;
 +      default:
 +              break;
 +      }
 +      return NOTIFY_DONE;
  }
  
+ static int idletimer_check_sysfs_name(const char *name, unsigned int size)
+ {
+       int ret;
+       ret = xt_check_proc_name(name, size);
+       if (ret < 0)
+               return ret;
+       if (!strcmp(name, "power") ||
+           !strcmp(name, "subsystem") ||
+           !strcmp(name, "uevent"))
+               return -EINVAL;
+       return 0;
+ }
  static int idletimer_tg_create(struct idletimer_tg_info *info)
  {
        int ret;