Commit 02076da9 authored by Francisco Jerez's avatar Francisco Jerez Committed by Dave Airlie
Browse files

drm/nouveau: Clean up the nv17-nv4x load detection code a bit.

parent e55ca7e6
Loading
Loading
Loading
Loading
+1 −5
Original line number Original line Diff line number Diff line
@@ -1074,8 +1074,7 @@ extern long nouveau_compat_ioctl(struct file *file, unsigned int cmd,


/* nv04_dac.c */
/* nv04_dac.c */
extern int nv04_dac_create(struct drm_device *dev, struct dcb_entry *entry);
extern int nv04_dac_create(struct drm_device *dev, struct dcb_entry *entry);
extern enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder,
extern uint32_t nv17_dac_sample_load(struct drm_encoder *encoder);
						 struct drm_connector *connector);
extern int nv04_dac_output_offset(struct drm_encoder *encoder);
extern int nv04_dac_output_offset(struct drm_encoder *encoder);
extern void nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable);
extern void nv04_dac_update_dacclk(struct drm_encoder *encoder, bool enable);


@@ -1093,9 +1092,6 @@ extern int nv04_tv_create(struct drm_device *dev, struct dcb_entry *entry);


/* nv17_tv.c */
/* nv17_tv.c */
extern int nv17_tv_create(struct drm_device *dev, struct dcb_entry *entry);
extern int nv17_tv_create(struct drm_device *dev, struct dcb_entry *entry);
extern enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder,
						struct drm_connector *connector,
						uint32_t pin_mask);


/* nv04_display.c */
/* nv04_display.c */
extern int nv04_display_create(struct drm_device *);
extern int nv04_display_create(struct drm_device *);
+19 −16
Original line number Original line Diff line number Diff line
@@ -212,16 +212,15 @@ static enum drm_connector_status nv04_dac_detect(struct drm_encoder *encoder,
	return connector_status_disconnected;
	return connector_status_disconnected;
}
}


enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder,
uint32_t nv17_dac_sample_load(struct drm_encoder *encoder)
					  struct drm_connector *connector)
{
{
	struct drm_device *dev = encoder->dev;
	struct drm_device *dev = encoder->dev;
	struct drm_nouveau_private *dev_priv = dev->dev_private;
	struct drm_nouveau_private *dev_priv = dev->dev_private;
	struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb;
	struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb;
	uint32_t testval, regoffset = nv04_dac_output_offset(encoder);
	uint32_t sample, testval, regoffset = nv04_dac_output_offset(encoder);
	uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput,
	uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput,
		saved_rtest_ctrl, saved_gpio0, saved_gpio1, temp, routput;
		saved_rtest_ctrl, saved_gpio0, saved_gpio1, temp, routput;
	int head, present = 0;
	int head;


#define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20)
#define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20)
	if (dcb->type == OUTPUT_TV) {
	if (dcb->type == OUTPUT_TV) {
@@ -287,13 +286,7 @@ enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder,
		      temp | NV_PRAMDAC_TEST_CONTROL_TP_INS_EN_ASSERTED);
		      temp | NV_PRAMDAC_TEST_CONTROL_TP_INS_EN_ASSERTED);
	msleep(5);
	msleep(5);


	temp = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset);
	sample = NVReadRAMDAC(dev, 0, NV_PRAMDAC_TEST_CONTROL + regoffset);

	if (dcb->type == OUTPUT_TV)
		present = (nv17_tv_detect(encoder, connector, temp)
			   == connector_status_connected);
	else
		present = temp & NV_PRAMDAC_TEST_CONTROL_SENSEB_ALLHI;


	temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL);
	temp = NVReadRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL);
	NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL,
	NVWriteRAMDAC(dev, head, NV_PRAMDAC_TEST_CONTROL,
@@ -310,14 +303,24 @@ enum drm_connector_status nv17_dac_detect(struct drm_encoder *encoder,
	nv17_gpio_set(dev, DCB_GPIO_TVDAC1, saved_gpio1);
	nv17_gpio_set(dev, DCB_GPIO_TVDAC1, saved_gpio1);
	nv17_gpio_set(dev, DCB_GPIO_TVDAC0, saved_gpio0);
	nv17_gpio_set(dev, DCB_GPIO_TVDAC0, saved_gpio0);


	if (present) {
	return sample;
		NV_INFO(dev, "Load detected on output %c\n", '@' + ffs(dcb->or));
		return connector_status_connected;
}
}


static enum drm_connector_status
nv17_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
{
	struct drm_device *dev = encoder->dev;
	struct dcb_entry *dcb = nouveau_encoder(encoder)->dcb;
	uint32_t sample = nv17_dac_sample_load(encoder);

	if (sample & NV_PRAMDAC_TEST_CONTROL_SENSEB_ALLHI) {
		NV_INFO(dev, "Load detected on output %c\n",
			'@' + ffs(dcb->or));
		return connector_status_connected;
	} else {
		return connector_status_disconnected;
		return connector_status_disconnected;
	}
	}

}


static bool nv04_dac_mode_fixup(struct drm_encoder *encoder,
static bool nv04_dac_mode_fixup(struct drm_encoder *encoder,
				struct drm_display_mode *mode,
				struct drm_display_mode *mode,
+17 −10
Original line number Original line Diff line number Diff line
@@ -33,13 +33,15 @@
#include "nouveau_hw.h"
#include "nouveau_hw.h"
#include "nv17_tv.h"
#include "nv17_tv.h"


enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder,
static enum drm_connector_status
					 struct drm_connector *connector,
nv17_tv_detect(struct drm_encoder *encoder, struct drm_connector *connector)
					 uint32_t pin_mask)
{
{
	struct drm_device *dev = encoder->dev;
	struct drm_mode_config *conf = &dev->mode_config;
	struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder);
	struct nv17_tv_encoder *tv_enc = to_tv_enc(encoder);
	struct dcb_entry *dcb = tv_enc->base.dcb;


	tv_enc->pin_mask = pin_mask >> 28 & 0xe;
	tv_enc->pin_mask = nv17_dac_sample_load(encoder) >> 28 & 0xe;


	switch (tv_enc->pin_mask) {
	switch (tv_enc->pin_mask) {
	case 0x2:
	case 0x2:
@@ -50,7 +52,7 @@ enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder,
		tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO;
		tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SVIDEO;
		break;
		break;
	case 0xe:
	case 0xe:
		if (nouveau_encoder(encoder)->dcb->tvconf.has_component_output)
		if (dcb->tvconf.has_component_output)
			tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_Component;
			tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_Component;
		else
		else
			tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SCART;
			tv_enc->subconnector = DRM_MODE_SUBCONNECTOR_SCART;
@@ -61,11 +63,16 @@ enum drm_connector_status nv17_tv_detect(struct drm_encoder *encoder,
	}
	}


	drm_connector_property_set_value(connector,
	drm_connector_property_set_value(connector,
			encoder->dev->mode_config.tv_subconnector_property,
					 conf->tv_subconnector_property,
					 tv_enc->subconnector);
					 tv_enc->subconnector);


	return tv_enc->subconnector ? connector_status_connected :
	if (tv_enc->subconnector) {
					connector_status_disconnected;
		NV_INFO(dev, "Load detected on output %c\n",
			'@' + ffs(dcb->or));
		return connector_status_connected;
	} else {
		return connector_status_disconnected;
	}
}
}


static const struct {
static const struct {
@@ -633,7 +640,7 @@ static struct drm_encoder_helper_funcs nv17_tv_helper_funcs = {
	.prepare = nv17_tv_prepare,
	.prepare = nv17_tv_prepare,
	.commit = nv17_tv_commit,
	.commit = nv17_tv_commit,
	.mode_set = nv17_tv_mode_set,
	.mode_set = nv17_tv_mode_set,
	.detect = nv17_dac_detect,
	.detect = nv17_tv_detect,
};
};


static struct drm_encoder_slave_funcs nv17_tv_slave_funcs = {
static struct drm_encoder_slave_funcs nv17_tv_slave_funcs = {