drm/nouveau: Clean up the nv17-nv4x load detection code a bit.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
parent
e55ca7e68e
commit
02076da97a
@ -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 *);
|
||||||
|
@ -212,16 +212,15 @@ out:
|
|||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return connector_status_disconnected;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
@ -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 = {
|
||||||
|
Loading…
Reference in New Issue
Block a user