The nouveau connector reset implementation creates a custom state
subclass, but only initializes a pristine state and sets
driver-specific defaults without resetting any hardware. This is
equivalent to what atomic_create_state expects. Convert to it.

Signed-off-by: Maxime Ripard <[email protected]>
---
Cc: Danilo Krummrich <[email protected]>
Cc: Lyude Paul <[email protected]>
Cc: [email protected]
---
 drivers/gpu/drm/nouveau/dispnv50/disp.c     | 11 +++++++++--
 drivers/gpu/drm/nouveau/nouveau_connector.c | 27 ++++++++++++++++-----------
 drivers/gpu/drm/nouveau/nouveau_connector.h |  3 ++-
 3 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c 
b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index e91130f93db6..947d0ff4ba02 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -1249,7 +1249,7 @@ nv50_mstc_destroy(struct drm_connector *connector)
 static const struct drm_connector_funcs
 nv50_mstc = {
-       .reset = nouveau_conn_reset,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .destroy = nv50_mstc_destroy,
+       .atomic_create_state = nouveau_conn_atomic_create_state,
        .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state,
        .atomic_destroy_state = nouveau_conn_atomic_destroy_state,
@@ -1263,4 +1263,5 @@ nv50_mstc_new(struct nv50_mstm *mstm, struct 
drm_dp_mst_port *port,
 {
        struct drm_device *dev = mstm->outp->base.base.dev;
+       struct drm_connector_state *conn_state;
        struct drm_crtc *crtc;
        struct nv50_mstc *mstc;
@@ -1282,5 +1283,11 @@ nv50_mstc_new(struct nv50_mstm *mstm, struct 
drm_dp_mst_port *port,
        drm_connector_helper_add(&mstc->connector, &nv50_mstc_help);
 
-       mstc->connector.funcs->reset(&mstc->connector);
+       conn_state = 
mstc->connector.funcs->atomic_create_state(&mstc->connector);
+       if (IS_ERR(conn_state)) {
+               drm_connector_cleanup(&mstc->connector);
+               return PTR_ERR(conn_state);
+       }
+       mstc->connector.state = conn_state;
+
        nouveau_conn_attach_properties(&mstc->connector);
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c 
b/drivers/gpu/drm/nouveau/nouveau_connector.c
index cc3caf8de64b..e4ab9849de4d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -243,6 +243,6 @@ nouveau_conn_atomic_duplicate_state(struct drm_connector 
*connector)
 }
 
-void
-nouveau_conn_reset(struct drm_connector *connector)
+struct drm_connector_state *
+nouveau_conn_atomic_create_state(struct drm_connector *connector)
 {
        struct nouveau_connector *nv_connector = nouveau_connector(connector);
@@ -251,11 +251,7 @@ nouveau_conn_reset(struct drm_connector *connector)
        if (drm_drv_uses_atomic_modeset(connector->dev)) {
                if (WARN_ON(!(asyc = kzalloc_obj(*asyc))))
-                       return;
+                       return ERR_PTR(-ENOMEM);
 
-               if (connector->state)
-                       nouveau_conn_atomic_destroy_state(connector,
-                                                         connector->state);
-
-               __drm_atomic_helper_connector_reset(connector, &asyc->state);
+               __drm_atomic_helper_connector_state_init(&asyc->state, 
connector);
        } else {
                asyc = &nv_connector->properties_state;
@@ -279,4 +275,6 @@ nouveau_conn_reset(struct drm_connector *connector)
                }
        }
+
+       return &asyc->state;
 }
 
@@ -1231,5 +1229,4 @@ static const struct drm_connector_funcs
 nouveau_connector_funcs = {
        .dpms = drm_helper_connector_dpms,
-       .reset = nouveau_conn_reset,
        .detect = nouveau_connector_detect,
        .force = nouveau_connector_force,
@@ -1237,4 +1234,5 @@ nouveau_connector_funcs = {
        .set_property = nouveau_connector_set_property,
        .destroy = nouveau_connector_destroy,
+       .atomic_create_state = nouveau_conn_atomic_create_state,
        .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state,
        .atomic_destroy_state = nouveau_conn_atomic_destroy_state,
@@ -1248,5 +1246,4 @@ static const struct drm_connector_funcs
 nouveau_connector_funcs_lvds = {
        .dpms = drm_helper_connector_dpms,
-       .reset = nouveau_conn_reset,
        .detect = nouveau_connector_detect_lvds,
        .force = nouveau_connector_force,
@@ -1254,4 +1251,5 @@ nouveau_connector_funcs_lvds = {
        .set_property = nouveau_connector_set_property,
        .destroy = nouveau_connector_destroy,
+       .atomic_create_state = nouveau_conn_atomic_create_state,
        .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state,
        .atomic_destroy_state = nouveau_conn_atomic_destroy_state,
@@ -1362,4 +1360,5 @@ nouveau_connector_create(struct drm_device *dev, int 
index)
        struct nouveau_display *disp = nouveau_display(dev);
        struct nouveau_connector *nv_connector = NULL;
+       struct drm_connector_state *conn_state;
        struct drm_connector *connector;
        struct drm_connector_list_iter conn_iter;
@@ -1522,5 +1521,11 @@ nouveau_connector_create(struct drm_device *dev, int 
index)
        }
 
-       connector->funcs->reset(connector);
+       conn_state = connector->funcs->atomic_create_state(connector);
+       if (IS_ERR(conn_state)) {
+               ret = PTR_ERR(conn_state);
+               goto drm_conn_err;
+       }
+       connector->state = conn_state;
+
        nouveau_conn_attach_properties(connector);
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.h 
b/drivers/gpu/drm/nouveau/nouveau_connector.h
index eb292d2ba4bc..02f843648eb8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.h
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.h
@@ -217,5 +217,6 @@ extern int nouveau_hdmimhz;
 
 void nouveau_conn_attach_properties(struct drm_connector *);
-void nouveau_conn_reset(struct drm_connector *);
+struct drm_connector_state *
+nouveau_conn_atomic_create_state(struct drm_connector *);
 struct drm_connector_state *
 nouveau_conn_atomic_duplicate_state(struct drm_connector *);

-- 
2.55.0

Reply via email to