lima_devfreq_profile.initial_freq = cur_freq;
        dev_pm_opp_put(opp);
  
+       /*
+        * Setup default thresholds for the simple_ondemand governor.
+        * The values are chosen based on experiments.
+        */
+       ldevfreq->gov_data.upthreshold = 30;
+       ldevfreq->gov_data.downdifferential = 5;
+ 
        devfreq = devm_devfreq_add_device(dev, &lima_devfreq_profile,
-                                         DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
+                                         DEVFREQ_GOV_SIMPLE_ONDEMAND,
+                                         &ldevfreq->gov_data);
        if (IS_ERR(devfreq)) {
                dev_err(dev, "Couldn't initialize GPU devfreq\n");
 -              ret = PTR_ERR(devfreq);
 -              goto err_fini;
 +              return PTR_ERR(devfreq);
        }
  
        ldevfreq->devfreq = devfreq;
 
  
  struct lima_devfreq {
        struct devfreq *devfreq;
 -      struct opp_table *clkname_opp_table;
 -      struct opp_table *regulators_opp_table;
        struct thermal_cooling_device *cooling;
+       struct devfreq_simple_ondemand_data gov_data;
  
        ktime_t busy_time;
        ktime_t idle_time;
 
        panfrost_devfreq_profile.initial_freq = cur_freq;
        dev_pm_opp_put(opp);
  
+       /*
+        * Setup default thresholds for the simple_ondemand governor.
+        * The values are chosen based on experiments.
+        */
+       pfdevfreq->gov_data.upthreshold = 45;
+       pfdevfreq->gov_data.downdifferential = 5;
+ 
        devfreq = devm_devfreq_add_device(dev, &panfrost_devfreq_profile,
-                                         DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
+                                         DEVFREQ_GOV_SIMPLE_ONDEMAND,
+                                         &pfdevfreq->gov_data);
        if (IS_ERR(devfreq)) {
                DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
 -              ret = PTR_ERR(devfreq);
 -              goto err_fini;
 +              return PTR_ERR(devfreq);
        }
        pfdevfreq->devfreq = devfreq;
  
 
  
  struct panfrost_devfreq {
        struct devfreq *devfreq;
 -      struct opp_table *regulators_opp_table;
        struct thermal_cooling_device *cooling;
+       struct devfreq_simple_ondemand_data gov_data;
        bool opp_of_table_added;
  
        ktime_t busy_time;
 
        BUG_ON(ret != 0);
  
        vmw_bo_fence_single(bo, NULL);
 +      ttm_bo_unpin(bo);
        ttm_bo_unreserve(bo);
  
+       ttm_bo_unpin(batch->otable_bo);
        ttm_bo_put(batch->otable_bo);
        batch->otable_bo = NULL;
  }
 
   *       Implements a "recursive vsnprintf".
   *       Do not use this feature without some mechanism to verify the
   *       correctness of the format string and va_list arguments.
 - * - 'K' For a kernel pointer that should be hidden from unprivileged users
 + * - 'K' For a kernel pointer that should be hidden from unprivileged users.
 + *       Use only for procfs, sysfs and similar files, not printk(); please
 + *       read the documentation (path below) first.
   * - 'NF' For a netdev_features_t
+  * - '4cc' V4L2 or DRM FourCC code, with endianness and raw numerical value.
   * - 'h[CDN]' For a variable-length buffer, it prints it as a hex string with
   *            a certain separator (' ' by default):
   *              C colon