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     |  9 ++++++---
 drivers/gpu/drm/nouveau/nouveau_connector.c | 25 ++++++++++++++-----------
 drivers/gpu/drm/nouveau/nouveau_connector.h |  3 ++-
 3 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c 
b/drivers/gpu/drm/nouveau/dispnv50/disp.c
index e91130f93db6..39a23d0e9be5 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c
@@ -1246,11 +1246,11 @@ nv50_mstc_destroy(struct drm_connector *connector)
        kfree(mstc);
 }
 
 static const struct drm_connector_funcs
 nv50_mstc = {
-       .reset = nouveau_conn_reset,
+       .atomic_create_state = nouveau_conn_atomic_create_state,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .destroy = nv50_mstc_destroy,
        .atomic_duplicate_state = nouveau_conn_atomic_duplicate_state,
        .atomic_destroy_state = nouveau_conn_atomic_destroy_state,
        .atomic_set_property = nouveau_conn_atomic_set_property,
@@ -1279,12 +1279,15 @@ nv50_mstc_new(struct nv50_mstm *mstm, struct 
drm_dp_mst_port *port,
                return ret;
        }
 
        drm_connector_helper_add(&mstc->connector, &nv50_mstc_help);
 
-       mstc->connector.funcs->reset(&mstc->connector);
-       nouveau_conn_attach_properties(&mstc->connector);
+       mstc->connector.state = 
mstc->connector.funcs->atomic_create_state(&mstc->connector);
+       if (IS_ERR(mstc->connector.state)) {
+               drm_connector_cleanup(&mstc->connector);
+               return PTR_ERR(mstc->connector.state);
+       }
 
        drm_for_each_crtc(crtc, dev) {
                if (!(mstm->outp->dcb->heads & drm_crtc_mask(crtc)))
                        continue;
 
diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c 
b/drivers/gpu/drm/nouveau/nouveau_connector.c
index cc3caf8de64b..59c8091c6796 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -240,25 +240,21 @@ nouveau_conn_atomic_duplicate_state(struct drm_connector 
*connector)
        asyc->procamp = armc->procamp;
        asyc->set.mask = 0;
        return &asyc->state;
 }
 
-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);
        struct nouveau_conn_atom *asyc;
 
        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;
        }
 
        asyc->dither.mode = DITHERING_MODE_AUTO;
@@ -276,10 +272,12 @@ nouveau_conn_reset(struct drm_connector *connector)
                        break;
                default:
                        break;
                }
        }
+
+       return &asyc->state;
 }
 
 void
 nouveau_conn_attach_properties(struct drm_connector *connector)
 {
@@ -1228,11 +1226,11 @@ nouveau_connector_helper_funcs = {
 };
 
 static const struct drm_connector_funcs
 nouveau_connector_funcs = {
        .dpms = drm_helper_connector_dpms,
-       .reset = nouveau_conn_reset,
+       .atomic_create_state = nouveau_conn_atomic_create_state,
        .detect = nouveau_connector_detect,
        .force = nouveau_connector_force,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .set_property = nouveau_connector_set_property,
        .destroy = nouveau_connector_destroy,
@@ -1245,11 +1243,11 @@ nouveau_connector_funcs = {
 };
 
 static const struct drm_connector_funcs
 nouveau_connector_funcs_lvds = {
        .dpms = drm_helper_connector_dpms,
-       .reset = nouveau_conn_reset,
+       .atomic_create_state = nouveau_conn_atomic_create_state,
        .detect = nouveau_connector_detect_lvds,
        .force = nouveau_connector_force,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .set_property = nouveau_connector_set_property,
        .destroy = nouveau_connector_destroy,
@@ -1519,11 +1517,16 @@ nouveau_connector_create(struct drm_device *dev, int 
index)
                                goto drm_conn_err;
                        }
                }
        }
 
-       connector->funcs->reset(connector);
+       connector->state = connector->funcs->atomic_create_state(connector);
+       if (IS_ERR(connector->state)) {
+               ret = PTR_ERR(connector->state);
+               goto drm_conn_err;
+       }
+
        nouveau_conn_attach_properties(connector);
 
        /* Default scaling mode */
        switch (nv_connector->type) {
        case DCB_CONNECTOR_LVDS:
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
@@ -214,11 +214,12 @@ extern int nouveau_tv_disable;
 extern int nouveau_ignorelid;
 extern int nouveau_duallink;
 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 *);
 void nouveau_conn_atomic_destroy_state(struct drm_connector *,
                                       struct drm_connector_state *);
 int nouveau_conn_atomic_set_property(struct drm_connector *,

-- 
2.55.0

Reply via email to