]> git.ipfire.org Git - thirdparty/kernel/linux.git/blobdiff - drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.c
Merge tag 'drm-misc-next-2023-09-27' of git://anongit.freedesktop.org/drm/drm-misc...
[thirdparty/kernel/linux.git] / drivers / gpu / drm / nouveau / nvkm / engine / disp / uconn.c
index 46b057fe1412ece4bd4fabaa9bca136260ef8dfe..ff82bb24849265dda9a470f26f413c8ac6eb598e 100644 (file)
@@ -109,46 +109,6 @@ nvkm_uconn_uevent(struct nvkm_object *object, void *argv, u32 argc, struct nvkm_
                               nvkm_uconn_uevent_gpio);
 }
 
-static int
-nvkm_uconn_mthd_hpd_status(struct nvkm_conn *conn, void *argv, u32 argc)
-{
-       struct nvkm_gpio *gpio = conn->disp->engine.subdev.device->gpio;
-       union nvif_conn_hpd_status_args *args = argv;
-
-       if (argc != sizeof(args->v0) || args->v0.version != 0)
-               return -ENOSYS;
-
-       args->v0.support = gpio && conn->info.hpd != DCB_GPIO_UNUSED;
-       args->v0.present = 0;
-
-       if (args->v0.support) {
-               int ret = nvkm_gpio_get(gpio, 0, DCB_GPIO_UNUSED, conn->info.hpd);
-
-               if (WARN_ON(ret < 0)) {
-                       args->v0.support = false;
-                       return 0;
-               }
-
-               args->v0.present = ret;
-       }
-
-       return 0;
-}
-
-static int
-nvkm_uconn_mthd(struct nvkm_object *object, u32 mthd, void *argv, u32 argc)
-{
-       struct nvkm_conn *conn = nvkm_uconn(object);
-
-       switch (mthd) {
-       case NVIF_CONN_V0_HPD_STATUS: return nvkm_uconn_mthd_hpd_status(conn, argv, argc);
-       default:
-               break;
-       }
-
-       return -EINVAL;
-}
-
 static void *
 nvkm_uconn_dtor(struct nvkm_object *object)
 {
@@ -164,7 +124,6 @@ nvkm_uconn_dtor(struct nvkm_object *object)
 static const struct nvkm_object_func
 nvkm_uconn = {
        .dtor = nvkm_uconn_dtor,
-       .mthd = nvkm_uconn_mthd,
        .uevent = nvkm_uconn_uevent,
 };
 
@@ -192,6 +151,32 @@ nvkm_uconn_new(const struct nvkm_oclass *oclass, void *argv, u32 argc, struct nv
        ret = -EBUSY;
        spin_lock(&disp->client.lock);
        if (!conn->object.func) {
+               switch (conn->info.type) {
+               case DCB_CONNECTOR_VGA      : args->v0.type = NVIF_CONN_V0_VGA; break;
+               case DCB_CONNECTOR_TV_0     :
+               case DCB_CONNECTOR_TV_1     :
+               case DCB_CONNECTOR_TV_3     : args->v0.type = NVIF_CONN_V0_TV; break;
+               case DCB_CONNECTOR_DMS59_0  :
+               case DCB_CONNECTOR_DMS59_1  :
+               case DCB_CONNECTOR_DVI_I    : args->v0.type = NVIF_CONN_V0_DVI_I; break;
+               case DCB_CONNECTOR_DVI_D    : args->v0.type = NVIF_CONN_V0_DVI_D; break;
+               case DCB_CONNECTOR_LVDS     : args->v0.type = NVIF_CONN_V0_LVDS; break;
+               case DCB_CONNECTOR_LVDS_SPWG: args->v0.type = NVIF_CONN_V0_LVDS_SPWG; break;
+               case DCB_CONNECTOR_DMS59_DP0:
+               case DCB_CONNECTOR_DMS59_DP1:
+               case DCB_CONNECTOR_DP       :
+               case DCB_CONNECTOR_mDP      :
+               case DCB_CONNECTOR_USB_C    : args->v0.type = NVIF_CONN_V0_DP; break;
+               case DCB_CONNECTOR_eDP      : args->v0.type = NVIF_CONN_V0_EDP; break;
+               case DCB_CONNECTOR_HDMI_0   :
+               case DCB_CONNECTOR_HDMI_1   :
+               case DCB_CONNECTOR_HDMI_C   : args->v0.type = NVIF_CONN_V0_HDMI; break;
+               default:
+                       WARN_ON(1);
+                       ret = -EINVAL;
+                       break;
+               }
+
                nvkm_object_ctor(&nvkm_uconn, oclass, &conn->object);
                *pobject = &conn->object;
                ret = 0;