]> Git Repo - linux.git/commitdiff
Merge tag 'drm-misc-next-2023-07-21' of ssh://git.freedesktop.org/git/drm/drm-misc...
authorDaniel Vetter <[email protected]>
Thu, 27 Jul 2023 08:49:56 +0000 (10:49 +0200)
committerDaniel Vetter <[email protected]>
Thu, 27 Jul 2023 08:49:57 +0000 (10:49 +0200)
drm-misc-next for 6.6:

UAPI Changes:
  - syncobj: New DRM_IOCTL_SYNCOBJ_EVENTFD ioctl

Cross-subsystem Changes:
  - Converge to use of_device_uevent()

Core Changes:
  - GPU VA Manager
  - improvements to make it clearer that drm_minor_type is uAPI

Driver Changes:
  - ssd130x: Improve intermediate buffer size computation
  - bridges:
    - adv7511: Fix low refresh rate
    - anx7625: Switch to macros instead of hardcoded values
  - panel:
    - ld9040: Backlight support, magic improved

Signed-off-by: Daniel Vetter <[email protected]>
From: Maxime Ripard <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/urs7omo5xnhglztxgwgsslws7duqfj4jhzrtppaenuvdh2lwuz@4htm4iiqhkep
1  2 
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_mipi_dsi.c
drivers/gpu/drm/drm_syncobj.c
drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/rockchip/inno_hdmi.c
drivers/gpu/drm/tegra/sor.c

index 9a3db5234a0e06ec3492d5187ab7d1df2aa4ec6e,977f3a544d4d6339d4decf6fb5d70959f550a2e5..b23214b0c49648d87e9a7d26f23235fb36fd6209
@@@ -14,7 -14,7 +14,7 @@@
  #include <linux/irq.h>
  #include <linux/module.h>
  #include <linux/mutex.h>
- #include <linux/of_device.h>
+ #include <linux/of.h>
  #include <linux/pinctrl/consumer.h>
  #include <linux/regmap.h>
  #include <linux/dma-mapping.h>
@@@ -1412,9 -1412,9 +1412,9 @@@ void dw_hdmi_set_high_tmds_clock_ratio(
        /* Control for TMDS Bit Period/TMDS Clock-Period Ratio */
        if (dw_hdmi_support_scdc(hdmi, display)) {
                if (mtmdsclock > HDMI14_MAX_TMDSCLK)
 -                      drm_scdc_set_high_tmds_clock_ratio(&hdmi->connector, 1);
 +                      drm_scdc_set_high_tmds_clock_ratio(hdmi->curr_conn, 1);
                else
 -                      drm_scdc_set_high_tmds_clock_ratio(&hdmi->connector, 0);
 +                      drm_scdc_set_high_tmds_clock_ratio(hdmi->curr_conn, 0);
        }
  }
  EXPORT_SYMBOL_GPL(dw_hdmi_set_high_tmds_clock_ratio);
@@@ -2102,7 -2102,7 +2102,7 @@@ static void hdmi_av_composer(struct dw_
                                min_t(u8, bytes, SCDC_MIN_SOURCE_VERSION));
  
                        /* Enabled Scrambling in the Sink */
 -                      drm_scdc_set_scrambling(&hdmi->connector, 1);
 +                      drm_scdc_set_scrambling(hdmi->curr_conn, 1);
  
                        /*
                         * To activate the scrambler feature, you must ensure
                        hdmi_writeb(hdmi, 0, HDMI_FC_SCRAMBLER_CTRL);
                        hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ,
                                    HDMI_MC_SWRSTZ);
 -                      drm_scdc_set_scrambling(&hdmi->connector, 0);
 +                      drm_scdc_set_scrambling(hdmi->curr_conn, 0);
                }
        }
  
@@@ -3546,7 -3546,6 +3546,7 @@@ struct dw_hdmi *dw_hdmi_probe(struct pl
        hdmi->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID
                         | DRM_BRIDGE_OP_HPD;
        hdmi->bridge.interlace_allowed = true;
 +      hdmi->bridge.ddc = hdmi->ddc;
  #ifdef CONFIG_OF
        hdmi->bridge.of_node = pdev->dev.of_node;
  #endif
index 75ef26d62c25d8715443fe318d14fac70d1c186c,dfe76c70bcb364930712141a02adb7bfde46e076..6129b89bb36618db7686cec9cc0a7a4c8d9d5410
@@@ -164,6 -164,9 +164,9 @@@ void drm_gem_private_object_init(struc
        if (!obj->resv)
                obj->resv = &obj->_resv;
  
+       if (drm_core_check_feature(dev, DRIVER_GEM_GPUVA))
+               drm_gem_gpuva_init(obj);
        drm_vma_node_reset(&obj->vma_node);
        INIT_LIST_HEAD(&obj->lru_node);
  }
@@@ -496,13 -499,13 +499,13 @@@ int drm_gem_create_mmap_offset(struct d
  EXPORT_SYMBOL(drm_gem_create_mmap_offset);
  
  /*
 - * Move pages to appropriate lru and release the pagevec, decrementing the
 - * ref count of those pages.
 + * Move folios to appropriate lru and release the folios, decrementing the
 + * ref count of those folios.
   */
 -static void drm_gem_check_release_pagevec(struct pagevec *pvec)
 +static void drm_gem_check_release_batch(struct folio_batch *fbatch)
  {
 -      check_move_unevictable_pages(pvec);
 -      __pagevec_release(pvec);
 +      check_move_unevictable_folios(fbatch);
 +      __folio_batch_release(fbatch);
        cond_resched();
  }
  
  struct page **drm_gem_get_pages(struct drm_gem_object *obj)
  {
        struct address_space *mapping;
 -      struct page *p, **pages;
 -      struct pagevec pvec;
 -      int i, npages;
 -
 +      struct page **pages;
 +      struct folio *folio;
 +      struct folio_batch fbatch;
 +      int i, j, npages;
  
        if (WARN_ON(!obj->filp))
                return ERR_PTR(-EINVAL);
  
        mapping_set_unevictable(mapping);
  
 -      for (i = 0; i < npages; i++) {
 -              p = shmem_read_mapping_page(mapping, i);
 -              if (IS_ERR(p))
 +      i = 0;
 +      while (i < npages) {
 +              folio = shmem_read_folio_gfp(mapping, i,
 +                              mapping_gfp_mask(mapping));
 +              if (IS_ERR(folio))
                        goto fail;
 -              pages[i] = p;
 +              for (j = 0; j < folio_nr_pages(folio); j++, i++)
 +                      pages[i] = folio_file_page(folio, i);
  
                /* Make sure shmem keeps __GFP_DMA32 allocated pages in the
                 * correct region during swapin. Note that this requires
                 * so shmem can relocate pages during swapin if required.
                 */
                BUG_ON(mapping_gfp_constraint(mapping, __GFP_DMA32) &&
 -                              (page_to_pfn(p) >= 0x00100000UL));
 +                              (folio_pfn(folio) >= 0x00100000UL));
        }
  
        return pages;
  
  fail:
        mapping_clear_unevictable(mapping);
 -      pagevec_init(&pvec);
 -      while (i--) {
 -              if (!pagevec_add(&pvec, pages[i]))
 -                      drm_gem_check_release_pagevec(&pvec);
 +      folio_batch_init(&fbatch);
 +      j = 0;
 +      while (j < i) {
 +              struct folio *f = page_folio(pages[j]);
 +              if (!folio_batch_add(&fbatch, f))
 +                      drm_gem_check_release_batch(&fbatch);
 +              j += folio_nr_pages(f);
        }
 -      if (pagevec_count(&pvec))
 -              drm_gem_check_release_pagevec(&pvec);
 +      if (fbatch.nr)
 +              drm_gem_check_release_batch(&fbatch);
  
        kvfree(pages);
 -      return ERR_CAST(p);
 +      return ERR_CAST(folio);
  }
  EXPORT_SYMBOL(drm_gem_get_pages);
  
@@@ -609,7 -606,7 +612,7 @@@ void drm_gem_put_pages(struct drm_gem_o
  {
        int i, npages;
        struct address_space *mapping;
 -      struct pagevec pvec;
 +      struct folio_batch fbatch;
  
        mapping = file_inode(obj->filp)->i_mapping;
        mapping_clear_unevictable(mapping);
  
        npages = obj->size >> PAGE_SHIFT;
  
 -      pagevec_init(&pvec);
 +      folio_batch_init(&fbatch);
        for (i = 0; i < npages; i++) {
 +              struct folio *folio;
 +
                if (!pages[i])
                        continue;
 +              folio = page_folio(pages[i]);
  
                if (dirty)
 -                      set_page_dirty(pages[i]);
 +                      folio_mark_dirty(folio);
  
                if (accessed)
 -                      mark_page_accessed(pages[i]);
 +                      folio_mark_accessed(folio);
  
                /* Undo the reference we took when populating the table */
 -              if (!pagevec_add(&pvec, pages[i]))
 -                      drm_gem_check_release_pagevec(&pvec);
 +              if (!folio_batch_add(&fbatch, folio))
 +                      drm_gem_check_release_batch(&fbatch);
 +              i += folio_nr_pages(folio) - 1;
        }
 -      if (pagevec_count(&pvec))
 -              drm_gem_check_release_pagevec(&pvec);
 +      if (folio_batch_count(&fbatch))
 +              drm_gem_check_release_batch(&fbatch);
  
        kvfree(pages);
  }
index 6252ac01e945a65a056e46d397f018b667ed57ea,bc35f1057486ec23907774e3f22ab598f8f4b7c2..14201f73aab1340ac8cc8f050f742a419588e369
@@@ -27,6 -27,7 +27,7 @@@
  
  #include <linux/device.h>
  #include <linux/module.h>
+ #include <linux/of.h>
  #include <linux/of_device.h>
  #include <linux/pm_runtime.h>
  #include <linux/slab.h>
@@@ -223,7 -224,7 +224,7 @@@ mipi_dsi_device_register_full(struct mi
  
        device_set_node(&dsi->dev, of_fwnode_handle(info->node));
        dsi->channel = info->channel;
 -      strlcpy(dsi->name, info->type, sizeof(dsi->name));
 +      strscpy(dsi->name, info->type, sizeof(dsi->name));
  
        ret = mipi_dsi_device_add(dsi);
        if (ret) {
index e592c5da70ceec781240572812a15b40a47eddf5,be3e8787d207c81eb5ae80651da191cdf1392320..f7003d1ec5ef1e080b8ea7e5c2dc22e16ff95d0d
   * requirement is inherited from the wait-before-signal behavior required by
   * the Vulkan timeline semaphore API.
   *
+  * Alternatively, &DRM_IOCTL_SYNCOBJ_EVENTFD can be used to wait without
+  * blocking: an eventfd will be signaled when the syncobj is. This is useful to
+  * integrate the wait in an event loop.
+  *
   *
   * Import/export of syncobjs
   * -------------------------
  
  #include <linux/anon_inodes.h>
  #include <linux/dma-fence-unwrap.h>
+ #include <linux/eventfd.h>
  #include <linux/file.h>
  #include <linux/fs.h>
  #include <linux/sched/signal.h>
@@@ -212,6 -217,20 +217,20 @@@ struct syncobj_wait_entry 
  static void syncobj_wait_syncobj_func(struct drm_syncobj *syncobj,
                                      struct syncobj_wait_entry *wait);
  
+ struct syncobj_eventfd_entry {
+       struct list_head node;
+       struct dma_fence *fence;
+       struct dma_fence_cb fence_cb;
+       struct drm_syncobj *syncobj;
+       struct eventfd_ctx *ev_fd_ctx;
+       u64 point;
+       u32 flags;
+ };
+ static void
+ syncobj_eventfd_entry_func(struct drm_syncobj *syncobj,
+                          struct syncobj_eventfd_entry *entry);
  /**
   * drm_syncobj_find - lookup and reference a sync object.
   * @file_private: drm file private pointer
@@@ -274,6 -293,28 +293,28 @@@ static void drm_syncobj_remove_wait(str
        spin_unlock(&syncobj->lock);
  }
  
+ static void
+ syncobj_eventfd_entry_free(struct syncobj_eventfd_entry *entry)
+ {
+       eventfd_ctx_put(entry->ev_fd_ctx);
+       dma_fence_put(entry->fence);
+       /* This happens either inside the syncobj lock, or after the node has
+        * already been removed from the list.
+        */
+       list_del(&entry->node);
+       kfree(entry);
+ }
+ static void
+ drm_syncobj_add_eventfd(struct drm_syncobj *syncobj,
+                       struct syncobj_eventfd_entry *entry)
+ {
+       spin_lock(&syncobj->lock);
+       list_add_tail(&entry->node, &syncobj->ev_fd_list);
+       syncobj_eventfd_entry_func(syncobj, entry);
+       spin_unlock(&syncobj->lock);
+ }
  /**
   * drm_syncobj_add_point - add new timeline point to the syncobj
   * @syncobj: sync object to add timeline point do
@@@ -288,7 -329,8 +329,8 @@@ void drm_syncobj_add_point(struct drm_s
                           struct dma_fence *fence,
                           uint64_t point)
  {
-       struct syncobj_wait_entry *cur, *tmp;
+       struct syncobj_wait_entry *wait_cur, *wait_tmp;
+       struct syncobj_eventfd_entry *ev_fd_cur, *ev_fd_tmp;
        struct dma_fence *prev;
  
        dma_fence_get(fence);
        dma_fence_chain_init(chain, prev, fence, point);
        rcu_assign_pointer(syncobj->fence, &chain->base);
  
-       list_for_each_entry_safe(cur, tmp, &syncobj->cb_list, node)
-               syncobj_wait_syncobj_func(syncobj, cur);
+       list_for_each_entry_safe(wait_cur, wait_tmp, &syncobj->cb_list, node)
+               syncobj_wait_syncobj_func(syncobj, wait_cur);
+       list_for_each_entry_safe(ev_fd_cur, ev_fd_tmp, &syncobj->ev_fd_list, node)
+               syncobj_eventfd_entry_func(syncobj, ev_fd_cur);
        spin_unlock(&syncobj->lock);
  
        /* Walk the chain once to trigger garbage collection */
@@@ -323,7 -367,8 +367,8 @@@ void drm_syncobj_replace_fence(struct d
                               struct dma_fence *fence)
  {
        struct dma_fence *old_fence;
-       struct syncobj_wait_entry *cur, *tmp;
+       struct syncobj_wait_entry *wait_cur, *wait_tmp;
+       struct syncobj_eventfd_entry *ev_fd_cur, *ev_fd_tmp;
  
        if (fence)
                dma_fence_get(fence);
        rcu_assign_pointer(syncobj->fence, fence);
  
        if (fence != old_fence) {
-               list_for_each_entry_safe(cur, tmp, &syncobj->cb_list, node)
-                       syncobj_wait_syncobj_func(syncobj, cur);
+               list_for_each_entry_safe(wait_cur, wait_tmp, &syncobj->cb_list, node)
+                       syncobj_wait_syncobj_func(syncobj, wait_cur);
+               list_for_each_entry_safe(ev_fd_cur, ev_fd_tmp, &syncobj->ev_fd_list, node)
+                       syncobj_eventfd_entry_func(syncobj, ev_fd_cur);
        }
  
        spin_unlock(&syncobj->lock);
@@@ -353,10 -400,10 +400,10 @@@ EXPORT_SYMBOL(drm_syncobj_replace_fence
   */
  static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)
  {
 -      struct dma_fence *fence = dma_fence_allocate_private_stub();
 +      struct dma_fence *fence = dma_fence_allocate_private_stub(ktime_get());
  
 -      if (IS_ERR(fence))
 -              return PTR_ERR(fence);
 +      if (!fence)
 +              return -ENOMEM;
  
        drm_syncobj_replace_fence(syncobj, fence);
        dma_fence_put(fence);
@@@ -472,7 -519,13 +519,13 @@@ void drm_syncobj_free(struct kref *kref
        struct drm_syncobj *syncobj = container_of(kref,
                                                   struct drm_syncobj,
                                                   refcount);
+       struct syncobj_eventfd_entry *ev_fd_cur, *ev_fd_tmp;
        drm_syncobj_replace_fence(syncobj, NULL);
+       list_for_each_entry_safe(ev_fd_cur, ev_fd_tmp, &syncobj->ev_fd_list, node)
+               syncobj_eventfd_entry_free(ev_fd_cur);
        kfree(syncobj);
  }
  EXPORT_SYMBOL(drm_syncobj_free);
@@@ -501,6 -554,7 +554,7 @@@ int drm_syncobj_create(struct drm_synco
  
        kref_init(&syncobj->refcount);
        INIT_LIST_HEAD(&syncobj->cb_list);
+       INIT_LIST_HEAD(&syncobj->ev_fd_list);
        spin_lock_init(&syncobj->lock);
  
        if (flags & DRM_SYNCOBJ_CREATE_SIGNALED) {
@@@ -1304,6 -1358,88 +1358,88 @@@ drm_syncobj_timeline_wait_ioctl(struct 
        return ret;
  }
  
+ static void syncobj_eventfd_entry_fence_func(struct dma_fence *fence,
+                                            struct dma_fence_cb *cb)
+ {
+       struct syncobj_eventfd_entry *entry =
+               container_of(cb, struct syncobj_eventfd_entry, fence_cb);
+       eventfd_signal(entry->ev_fd_ctx, 1);
+       syncobj_eventfd_entry_free(entry);
+ }
+ static void
+ syncobj_eventfd_entry_func(struct drm_syncobj *syncobj,
+                          struct syncobj_eventfd_entry *entry)
+ {
+       int ret;
+       struct dma_fence *fence;
+       /* This happens inside the syncobj lock */
+       fence = dma_fence_get(rcu_dereference_protected(syncobj->fence, 1));
+       ret = dma_fence_chain_find_seqno(&fence, entry->point);
+       if (ret != 0 || !fence) {
+               dma_fence_put(fence);
+               return;
+       }
+       list_del_init(&entry->node);
+       entry->fence = fence;
+       if (entry->flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE) {
+               eventfd_signal(entry->ev_fd_ctx, 1);
+               syncobj_eventfd_entry_free(entry);
+       } else {
+               ret = dma_fence_add_callback(fence, &entry->fence_cb,
+                                            syncobj_eventfd_entry_fence_func);
+               if (ret == -ENOENT) {
+                       eventfd_signal(entry->ev_fd_ctx, 1);
+                       syncobj_eventfd_entry_free(entry);
+               }
+       }
+ }
+ int
+ drm_syncobj_eventfd_ioctl(struct drm_device *dev, void *data,
+                         struct drm_file *file_private)
+ {
+       struct drm_syncobj_eventfd *args = data;
+       struct drm_syncobj *syncobj;
+       struct eventfd_ctx *ev_fd_ctx;
+       struct syncobj_eventfd_entry *entry;
+       if (!drm_core_check_feature(dev, DRIVER_SYNCOBJ_TIMELINE))
+               return -EOPNOTSUPP;
+       if (args->flags & ~DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE)
+               return -EINVAL;
+       if (args->pad)
+               return -EINVAL;
+       syncobj = drm_syncobj_find(file_private, args->handle);
+       if (!syncobj)
+               return -ENOENT;
+       ev_fd_ctx = eventfd_ctx_fdget(args->fd);
+       if (IS_ERR(ev_fd_ctx))
+               return PTR_ERR(ev_fd_ctx);
+       entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+       if (!entry) {
+               eventfd_ctx_put(ev_fd_ctx);
+               return -ENOMEM;
+       }
+       entry->syncobj = syncobj;
+       entry->ev_fd_ctx = ev_fd_ctx;
+       entry->point = args->point;
+       entry->flags = args->flags;
+       drm_syncobj_add_eventfd(syncobj, entry);
+       drm_syncobj_put(syncobj);
+       return 0;
+ }
  
  int
  drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
index dc276c346fd1a0d982215b6994fb760ac5fe5b80,e60e3488773d0548730fab910ce1a2650702d3ae..5ac926281d2c65e1c6e7b652a29570940a33f017
@@@ -8,7 -8,6 +8,6 @@@
  #include <linux/gpio/consumer.h>
  #include <linux/module.h>
  #include <linux/of.h>
- #include <linux/of_device.h>
  #include <linux/regulator/consumer.h>
  
  #include <drm/drm_connector.h>
@@@ -2139,9 -2138,9 +2138,9 @@@ static const struct panel_desc starry_h
  static const struct drm_display_mode starry_ili9882t_default_mode = {
        .clock = 165280,
        .hdisplay = 1200,
 -      .hsync_start = 1200 + 32,
 -      .hsync_end = 1200 + 32 + 30,
 -      .htotal = 1200 + 32 + 30 + 32,
 +      .hsync_start = 1200 + 72,
 +      .hsync_end = 1200 + 72 + 30,
 +      .htotal = 1200 + 72 + 30 + 72,
        .vdisplay = 1920,
        .vsync_start = 1920 + 68,
        .vsync_end = 1920 + 68 + 2,
index 18dc251749fbd31eb397a722824585db6ece59ee,77cfc606df48e74696de73a506fa52b859aa1b99..4badda6570d5d868da8b5427aeddef38792bcf3c
@@@ -141,7 -141,6 +141,6 @@@ struct panel_simple 
  
        bool prepared;
  
-       ktime_t prepared_time;
        ktime_t unprepared_time;
  
        const struct panel_desc *desc;
@@@ -351,8 -350,6 +350,6 @@@ static int panel_simple_resume(struct d
        if (p->desc->delay.prepare)
                msleep(p->desc->delay.prepare);
  
-       p->prepared_time = ktime_get_boottime();
        return 0;
  }
  
@@@ -566,7 -563,6 +563,6 @@@ static int panel_simple_probe(struct de
                return -ENOMEM;
  
        panel->enabled = false;
-       panel->prepared_time = 0;
        panel->desc = desc;
  
        panel->supply = devm_regulator_get(dev, "power");
@@@ -2178,7 -2174,6 +2174,7 @@@ static const struct panel_desc innolux_
                .height = 54,
        },
        .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
 +      .connector_type = DRM_MODE_CONNECTOR_DPI,
        .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
  };
  
@@@ -3203,7 -3198,6 +3199,7 @@@ static const struct drm_display_mode po
        .vsync_start = 480 + 49,
        .vsync_end = 480 + 49 + 2,
        .vtotal = 480 + 49 + 2 + 22,
 +      .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
  };
  
  static const struct panel_desc powertip_ph800480t013_idf02  = {
index 22999eac6df517b667dd6149be01bf2c132a8a96,fc3c878be1f3017dc88d59af49cacf8fee8d4b7b..6e5b922a121e243c733d7e88032f33d095354f15
  #include <linux/err.h>
  #include <linux/hdmi.h>
  #include <linux/mfd/syscon.h>
+ #include <linux/mod_devicetable.h>
  #include <linux/module.h>
  #include <linux/mutex.h>
- #include <linux/of_device.h>
+ #include <linux/platform_device.h>
  
  #include <drm/drm_atomic_helper.h>
  #include <drm/drm_edid.h>
@@@ -797,7 -798,7 +798,7 @@@ static struct i2c_adapter *inno_hdmi_i2
        adap->dev.parent = hdmi->dev;
        adap->dev.of_node = hdmi->dev->of_node;
        adap->algo = &inno_hdmi_algorithm;
 -      strlcpy(adap->name, "Inno HDMI", sizeof(adap->name));
 +      strscpy(adap->name, "Inno HDMI", sizeof(adap->name));
        i2c_set_adapdata(adap, hdmi);
  
        ret = i2c_add_adapter(adap);
index abd6e3b92293bb0e55d939d239d369378f15db51,899bb280f56e4ad8a5644993d6b0c0831c76f739..93471b70e18066cb2bdf562ee77ed624ea556695
@@@ -8,7 -8,7 +8,7 @@@
  #include <linux/debugfs.h>
  #include <linux/io.h>
  #include <linux/module.h>
- #include <linux/of_device.h>
+ #include <linux/of.h>
  #include <linux/platform_device.h>
  #include <linux/pm_runtime.h>
  #include <linux/regulator/consumer.h>
@@@ -586,7 -586,6 +586,7 @@@ static u8 tegra_clk_sor_pad_get_parent(
  }
  
  static const struct clk_ops tegra_clk_sor_pad_ops = {
 +      .determine_rate = clk_hw_determine_rate_no_reparent,
        .set_parent = tegra_clk_sor_pad_set_parent,
        .get_parent = tegra_clk_sor_pad_get_parent,
  };
This page took 0.156798 seconds and 4 git commands to generate.