]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
drm: Introduce drm_connector_{get,put}()
authorThierry Reding <treding@nvidia.com>
Tue, 28 Feb 2017 14:46:39 +0000 (15:46 +0100)
committerThierry Reding <treding@nvidia.com>
Tue, 28 Feb 2017 15:15:00 +0000 (16:15 +0100)
For consistency with other reference counting APIs in the kernel, add
drm_connector_get() and drm_connector_put() functions to reference count
connectors.

Compatibility aliases are added to keep existing code working. To help
speed up the transition, all the instances of the old functions in the
DRM core are already replaced in this commit.

The existing semantic patch for mode object reference count conversion
is extended for these new helpers.

Reviewed-by: Sean Paul <seanpaul@chromium.org>
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170228144643.5668-4-thierry.reding@gmail.com
drivers/gpu/drm/drm_atomic.c
drivers/gpu/drm/drm_atomic_helper.c
drivers/gpu/drm/drm_connector.c
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_crtc_helper.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_mode_config.c
include/drm/drm_connector.h
scripts/coccinelle/api/drm-get-put.cocci

index 39e470eb8aeaf9e36469c6a8afe5c36c2a68890b..c5cb56db99f6a16faf220749292b1d2bbd802955 100644 (file)
@@ -150,7 +150,7 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
                                                       state->connectors[i].state);
                state->connectors[i].ptr = NULL;
                state->connectors[i].state = NULL;
-               drm_connector_unreference(connector);
+               drm_connector_put(connector);
        }
 
        for (i = 0; i < config->num_crtc; i++) {
@@ -1030,7 +1030,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
        if (!connector_state)
                return ERR_PTR(-ENOMEM);
 
-       drm_connector_reference(connector);
+       drm_connector_get(connector);
        state->connectors[index].state = connector_state;
        state->connectors[index].old_state = connector->state;
        state->connectors[index].new_state = connector_state;
@@ -1380,7 +1380,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
                crtc_state->connector_mask &=
                        ~(1 << drm_connector_index(conn_state->connector));
 
-               drm_connector_unreference(conn_state->connector);
+               drm_connector_put(conn_state->connector);
                conn_state->crtc = NULL;
        }
 
@@ -1392,7 +1392,7 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
                crtc_state->connector_mask |=
                        1 << drm_connector_index(conn_state->connector);
 
-               drm_connector_reference(conn_state->connector);
+               drm_connector_get(conn_state->connector);
                conn_state->crtc = crtc;
 
                DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n",
index bdfddfa873166a3f08b7d89f071d2349326b91de..6e7d9dfce342e2a74618ec04471b1d70e712a53b 100644 (file)
@@ -3351,7 +3351,7 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
 {
        memcpy(state, connector->state, sizeof(*state));
        if (state->crtc)
-               drm_connector_reference(connector);
+               drm_connector_get(connector);
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
 
@@ -3477,7 +3477,7 @@ void
 __drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
 {
        if (state->crtc)
-               drm_connector_unreference(state->connector);
+               drm_connector_put(state->connector);
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
 
index a48e9a65046d96a05441b71f9d9130c1f25aa669..5a4be752a85e1810fdc12d16e0fae5d79c13ca6d 100644 (file)
@@ -35,8 +35,8 @@
  * als fixed panels or anything else that can display pixels in some form. As
  * opposed to all other KMS objects representing hardware (like CRTC, encoder or
  * plane abstractions) connectors can be hotplugged and unplugged at runtime.
- * Hence they are reference-counted using drm_connector_reference() and
- * drm_connector_unreference().
+ * Hence they are reference-counted using drm_connector_get() and
+ * drm_connector_put().
  *
  * KMS driver must create, initialize, register and attach at a &struct
  * drm_connector for each such sink. The instance is created as other KMS
@@ -557,7 +557,7 @@ drm_connector_list_iter_next(struct drm_connector_list_iter *iter)
        spin_unlock_irqrestore(&config->connector_list_lock, flags);
 
        if (old_conn)
-               drm_connector_unreference(old_conn);
+               drm_connector_put(old_conn);
 
        return iter->conn;
 }
@@ -576,7 +576,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter)
 {
        iter->dev = NULL;
        if (iter->conn)
-               drm_connector_unreference(iter->conn);
+               drm_connector_put(iter->conn);
        lock_release(&connector_list_iter_dep_map, 0, _RET_IP_);
 }
 EXPORT_SYMBOL(drm_connector_list_iter_put);
@@ -1309,7 +1309,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 out:
        mutex_unlock(&dev->mode_config.mutex);
 out_unref:
-       drm_connector_unreference(connector);
+       drm_connector_put(connector);
 
        return ret;
 }
index e2284539f82cac696f5d0580b908ca3591cebdb5..9594c623799b449f2960886f96f3918ca7d25484 100644 (file)
@@ -685,7 +685,7 @@ out:
        if (connector_set) {
                for (i = 0; i < crtc_req->count_connectors; i++) {
                        if (connector_set[i])
-                               drm_connector_unreference(connector_set[i]);
+                               drm_connector_put(connector_set[i]);
                }
        }
        kfree(connector_set);
index 44ba0e990d6c9125f4b71c65de62035bb2559c3c..536051c627d81319205e25d35a08f84730e0460f 100644 (file)
@@ -465,7 +465,7 @@ drm_crtc_helper_disable(struct drm_crtc *crtc)
                        connector->dpms = DRM_MODE_DPMS_OFF;
 
                        /* we keep a reference while the encoder is bound */
-                       drm_connector_unreference(connector);
+                       drm_connector_put(connector);
                }
                drm_connector_list_iter_put(&conn_iter);
        }
@@ -623,7 +623,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
        for (ro = 0; ro < set->num_connectors; ro++) {
                if (set->connectors[ro]->encoder)
                        continue;
-               drm_connector_reference(set->connectors[ro]);
+               drm_connector_get(set->connectors[ro]);
        }
 
        /* a) traverse passed in connector list and get encoders for them */
@@ -772,7 +772,7 @@ fail:
        for (ro = 0; ro < set->num_connectors; ro++) {
                if (set->connectors[ro]->encoder)
                        continue;
-               drm_connector_unreference(set->connectors[ro]);
+               drm_connector_put(set->connectors[ro]);
        }
 
        /* Try to restore the config */
index 1b068e6264d523007d15fb27c074efce0184d485..b243fdbdbb0823789024eb75ebb557ff25e02ad9 100644 (file)
@@ -148,7 +148,7 @@ fail:
                struct drm_fb_helper_connector *fb_helper_connector =
                        fb_helper->connector_info[i];
 
-               drm_connector_unreference(fb_helper_connector->connector);
+               drm_connector_put(fb_helper_connector->connector);
 
                kfree(fb_helper_connector);
                fb_helper->connector_info[i] = NULL;
@@ -185,7 +185,7 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_
        if (!fb_helper_connector)
                return -ENOMEM;
 
-       drm_connector_reference(connector);
+       drm_connector_get(connector);
        fb_helper_connector->connector = connector;
        fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector;
        return 0;
@@ -211,7 +211,7 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
        if (i == fb_helper->connector_count)
                return -EINVAL;
        fb_helper_connector = fb_helper->connector_info[i];
-       drm_connector_unreference(fb_helper_connector->connector);
+       drm_connector_put(fb_helper_connector->connector);
 
        for (j = i + 1; j < fb_helper->connector_count; j++) {
                fb_helper->connector_info[j - 1] = fb_helper->connector_info[j];
@@ -633,7 +633,7 @@ static void drm_fb_helper_modeset_release(struct drm_fb_helper *helper,
        int i;
 
        for (i = 0; i < modeset->num_connectors; i++) {
-               drm_connector_unreference(modeset->connectors[i]);
+               drm_connector_put(modeset->connectors[i]);
                modeset->connectors[i] = NULL;
        }
        modeset->num_connectors = 0;
@@ -650,7 +650,7 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
        int i;
 
        for (i = 0; i < helper->connector_count; i++) {
-               drm_connector_unreference(helper->connector_info[i]->connector);
+               drm_connector_put(helper->connector_info[i]->connector);
                kfree(helper->connector_info[i]);
        }
        kfree(helper->connector_info);
@@ -2192,7 +2192,7 @@ static void drm_setup_crtcs(struct drm_fb_helper *fb_helper,
                        fb_crtc->y = offset->y;
                        modeset->mode = drm_mode_duplicate(dev,
                                                           fb_crtc->desired_mode);
-                       drm_connector_reference(connector);
+                       drm_connector_get(connector);
                        modeset->connectors[modeset->num_connectors++] = connector;
                        modeset->fb = fb_helper->fb;
                        modeset->x = offset->x;
index 884cc4d26fb59e8568abac449252c248e253fdc1..20aec165abd7ce67b9535dadac04864f7042a940 100644 (file)
@@ -418,7 +418,7 @@ void drm_mode_config_cleanup(struct drm_device *dev)
                 * current connector itself, which means it is inherently safe
                 * against unreferencing the current connector - but not against
                 * deleting it right away. */
-               drm_connector_unreference(connector);
+               drm_connector_put(connector);
        }
        drm_connector_list_iter_put(&conn_iter);
        if (WARN_ON(!list_empty(&dev->mode_config.connector_list))) {
index f08aa5dfc9d78c9e45eadb1f276b14e7e59f2e20..e0acdb674d85bb27d2b187f47b43ece0d376d6c8 100644 (file)
@@ -812,25 +812,50 @@ static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev,
 }
 
 /**
- * drm_connector_reference - incr the connector refcnt
- * @connector: connector
+ * drm_connector_get - acquire a connector reference
+ * @connector: DRM connector
  *
  * This function increments the connector's refcount.
  */
+static inline void drm_connector_get(struct drm_connector *connector)
+{
+       drm_mode_object_get(&connector->base);
+}
+
+/**
+ * drm_connector_put - release a connector reference
+ * @connector: DRM connector
+ *
+ * This function decrements the connector's reference count and frees the
+ * object if the reference count drops to zero.
+ */
+static inline void drm_connector_put(struct drm_connector *connector)
+{
+       drm_mode_object_put(&connector->base);
+}
+
+/**
+ * drm_connector_reference - acquire a connector reference
+ * @connector: DRM connector
+ *
+ * This is a compatibility alias for drm_connector_get() and should not be
+ * used by new code.
+ */
 static inline void drm_connector_reference(struct drm_connector *connector)
 {
-       drm_mode_object_reference(&connector->base);
+       drm_connector_get(connector);
 }
 
 /**
- * drm_connector_unreference - unref a connector
- * @connector: connector to unref
+ * drm_connector_unreference - release a connector reference
+ * @connector: DRM connector
  *
- * This function decrements the connector's refcount and frees it if it drops to zero.
+ * This is a compatibility alias for drm_connector_put() and should not be
+ * used by new code.
  */
 static inline void drm_connector_unreference(struct drm_connector *connector)
 {
-       drm_mode_object_unreference(&connector->base);
+       drm_connector_put(connector);
 }
 
 const char *drm_get_connector_status_name(enum drm_connector_status status);
@@ -924,7 +949,7 @@ void drm_connector_list_iter_put(struct drm_connector_list_iter *iter);
  *
  * Note that @connector is only valid within the list body, if you want to use
  * @connector after calling drm_connector_list_iter_put() then you need to grab
- * your own reference first using drm_connector_reference().
+ * your own reference first using drm_connector_get().
  */
 #define drm_for_each_connector_iter(connector, iter) \
        while ((connector = drm_connector_list_iter_next(iter)))
index a3742447c9817ee8627ceb989d36c87c7160fb03..8a4c2cb7889eb9fc05f7da37bff703d064e4df5a 100644 (file)
@@ -20,6 +20,12 @@ expression object;
 |
 - drm_mode_object_unreference(object)
 + drm_mode_object_put(object)
+|
+- drm_connector_reference(object)
++ drm_connector_get(object)
+|
+- drm_connector_unreference(object)
++ drm_connector_put(object)
 )
 
 @r depends on report@
@@ -31,6 +37,10 @@ position p;
 drm_mode_object_unreference@p(object)
 |
 drm_mode_object_reference@p(object)
+|
+drm_connector_unreference@p(object)
+|
+drm_connector_reference@p(object)
 )
 
 @script:python depends on report@