Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23fc09ee authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/drm: store full dcb gpio function data in connector



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e18c080f
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -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;
+4 −1
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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;
}