drm/nouveau/drm: store full dcb gpio function data in connector
authorBen Skeggs <bskeggs@redhat.com>
Sun, 3 Feb 2013 10:29:53 +0000 (20:29 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 20 Feb 2013 06:00:49 +0000 (16:00 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_connector.h
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_dp.c

index 2f3e40e..a64e877 100644 (file)
@@ -111,8 +111,8 @@ nouveau_connector_destroy(struct drm_connector *connector)
        drm  = nouveau_drm(dev);
        gpio = nouveau_gpio(drm->device);
 
-       if (gpio && nv_connector->hpd != DCB_GPIO_UNUSED) {
-               gpio->isr_del(gpio, 0, nv_connector->hpd, 0xff,
+       if (gpio && nv_connector->hpd.func != DCB_GPIO_UNUSED) {
+               gpio->isr_del(gpio, 0, nv_connector->hpd.func, 0xff,
                              nouveau_connector_hotplug, connector);
        }
 
@@ -976,8 +976,10 @@ nouveau_connector_create(struct drm_device *dev, int index)
                if (olddcb_conntab(dev)[3] >= 4)
                        entry |= (u32)ROM16(nv_connector->dcb[2]) << 16;
 
-               nv_connector->hpd = ffs((entry & 0x07033000) >> 12);
-               nv_connector->hpd = hpd[nv_connector->hpd];
+               ret = gpio->find(gpio, 0, hpd[ffs((entry & 0x07033000) >> 12)],
+                                DCB_GPIO_UNUSED, &nv_connector->hpd);
+               if (ret)
+                       nv_connector->hpd.func = DCB_GPIO_UNUSED;
 
                nv_connector->type = nv_connector->dcb[0];
                if (drm_conntype_from_dcb(nv_connector->type) ==
@@ -1000,7 +1002,7 @@ nouveau_connector_create(struct drm_device *dev, int index)
                }
        } else {
                nv_connector->type = DCB_CONNECTOR_NONE;
-               nv_connector->hpd = DCB_GPIO_UNUSED;
+               nv_connector->hpd.func = DCB_GPIO_UNUSED;
        }
 
        /* no vbios data, or an unknown dcb connector type - attempt to
@@ -1127,8 +1129,8 @@ nouveau_connector_create(struct drm_device *dev, int index)
        }
 
        connector->polled = DRM_CONNECTOR_POLL_CONNECT;
-       if (gpio && nv_connector->hpd != DCB_GPIO_UNUSED) {
-               ret = gpio->isr_add(gpio, 0, nv_connector->hpd, 0xff,
+       if (gpio && nv_connector->hpd.func != DCB_GPIO_UNUSED) {
+               ret = gpio->isr_add(gpio, 0, nv_connector->hpd.func, 0xff,
                                    nouveau_connector_hotplug, connector);
                if (ret == 0)
                        connector->polled = DRM_CONNECTOR_POLL_HPD;
index 20eb84c..f37250c 100644 (file)
@@ -30,6 +30,9 @@
 #include <drm/drm_edid.h>
 #include "nouveau_crtc.h"
 
+#include <subdev/bios.h>
+#include <subdev/bios/gpio.h>
+
 struct nouveau_i2c_port;
 
 enum nouveau_underscan_type {
@@ -59,9 +62,9 @@ enum nouveau_dithering_depth {
 struct nouveau_connector {
        struct drm_connector base;
        enum dcb_connector_type type;
+       struct dcb_gpio_func hpd;
        u8 index;
        u8 *dcb;
-       u8 hpd;
 
        int dithering_mode;
        int dithering_depth;
index 9f84803..a698e79 100644 (file)
@@ -234,7 +234,7 @@ nouveau_display_init(struct drm_device *dev)
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct nouveau_connector *conn = nouveau_connector(connector);
                if (gpio)
-                       gpio->irq(gpio, 0, conn->hpd, 0xff, true);
+                       gpio->irq(gpio, 0, conn->hpd.func, 0xff, true);
        }
 
        return ret;
@@ -252,7 +252,7 @@ nouveau_display_fini(struct drm_device *dev)
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct nouveau_connector *conn = nouveau_connector(connector);
                if (gpio)
-                       gpio->irq(gpio, 0, conn->hpd, 0xff, false);
+                       gpio->irq(gpio, 0, conn->hpd.func, 0xff, false);
        }
 
        drm_kms_helper_poll_disable(dev);
index 5983865..c273c2a 100644 (file)
@@ -260,7 +260,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder, u32 datarate,
         * we take during link training (DP_SET_POWER is one), we need
         * to ignore them for the moment to avoid races.
         */
-       gpio->irq(gpio, 0, nv_connector->hpd, 0xff, false);
+       gpio->irq(gpio, 0, nv_connector->hpd.func, 0xff, false);
 
        /* enable down-spreading and execute pre-train script from vbios */
        dp_link_train_init(dev, &dp, nv_encoder->dp.dpcd[3] & 1);
@@ -300,7 +300,7 @@ nouveau_dp_link_train(struct drm_encoder *encoder, u32 datarate,
        dp_link_train_fini(dev, &dp);
 
        /* re-enable hotplug detect */
-       gpio->irq(gpio, 0, nv_connector->hpd, 0xff, true);
+       gpio->irq(gpio, 0, nv_connector->hpd.func, 0xff, true);
        return true;
 }