aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Armstrong <narmstrong@baylibre.com>2018-07-04 11:08:17 -0400
committerLee Jones <lee.jones@linaro.org>2018-07-13 03:44:22 -0400
commit9c229127aee2d7e80858b5d52a9a7049355b621c (patch)
treedab32cad4fce7ec3d81567f26e5deb6a93f8b857
parent7a78c1e116d2a786fcd541c8828472d462c8821f (diff)
drm/i915: hdmi: add CEC notifier to intel_hdmi
This patchs adds the cec_notifier feature to the intel_hdmi part of the i915 DRM driver. It uses the HDMI DRM connector name to differentiate between each HDMI ports. The changes will allow the i915 HDMI code to notify EDID and HPD changes to an eventual CEC adapter. Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Reviewed-by: Hans Verkuil <hans.verkuil@cisco.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Acked-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
-rw-r--r--drivers/gpu/drm/i915/Kconfig1
-rw-r--r--drivers/gpu/drm/i915/intel_display.h24
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c13
4 files changed, 40 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig
index dfd95889f4b7..2d65d567d5d1 100644
--- a/drivers/gpu/drm/i915/Kconfig
+++ b/drivers/gpu/drm/i915/Kconfig
@@ -23,6 +23,7 @@ config DRM_I915
23 select SYNC_FILE 23 select SYNC_FILE
24 select IOSF_MBI 24 select IOSF_MBI
25 select CRC32 25 select CRC32
26 select CEC_CORE if CEC_NOTIFIER
26 help 27 help
27 Choose this option if you have a system that has "Intel Graphics 28 Choose this option if you have a system that has "Intel Graphics
28 Media Accelerator" or "HD Graphics" integrated graphics, 29 Media Accelerator" or "HD Graphics" integrated graphics,
diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h
index 2ef31617614a..1f176a71e081 100644
--- a/drivers/gpu/drm/i915/intel_display.h
+++ b/drivers/gpu/drm/i915/intel_display.h
@@ -126,6 +126,30 @@ enum port {
126 126
127#define port_name(p) ((p) + 'A') 127#define port_name(p) ((p) + 'A')
128 128
129/*
130 * Ports identifier referenced from other drivers.
131 * Expected to remain stable over time
132 */
133static inline const char *port_identifier(enum port port)
134{
135 switch (port) {
136 case PORT_A:
137 return "Port A";
138 case PORT_B:
139 return "Port B";
140 case PORT_C:
141 return "Port C";
142 case PORT_D:
143 return "Port D";
144 case PORT_E:
145 return "Port E";
146 case PORT_F:
147 return "Port F";
148 default:
149 return "<invalid>";
150 }
151}
152
129enum dpio_channel { 153enum dpio_channel {
130 DPIO_CH0, 154 DPIO_CH0,
131 DPIO_CH1 155 DPIO_CH1
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 0361130500a6..cfbeee16ee4a 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -39,6 +39,7 @@
39#include <drm/drm_dp_mst_helper.h> 39#include <drm/drm_dp_mst_helper.h>
40#include <drm/drm_rect.h> 40#include <drm/drm_rect.h>
41#include <drm/drm_atomic.h> 41#include <drm/drm_atomic.h>
42#include <media/cec-notifier.h>
42 43
43/** 44/**
44 * __wait_for - magic wait macro 45 * __wait_for - magic wait macro
@@ -1017,6 +1018,7 @@ struct intel_hdmi {
1017 bool has_audio; 1018 bool has_audio;
1018 bool rgb_quant_range_selectable; 1019 bool rgb_quant_range_selectable;
1019 struct intel_connector *attached_connector; 1020 struct intel_connector *attached_connector;
1021 struct cec_notifier *cec_notifier;
1020}; 1022};
1021 1023
1022struct intel_dp_mst_encoder; 1024struct intel_dp_mst_encoder;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index ee929f31f7db..c21b7ddeabeb 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1868,6 +1868,8 @@ intel_hdmi_set_edid(struct drm_connector *connector)
1868 connected = true; 1868 connected = true;
1869 } 1869 }
1870 1870
1871 cec_notifier_set_phys_addr_from_edid(intel_hdmi->cec_notifier, edid);
1872
1871 return connected; 1873 return connected;
1872} 1874}
1873 1875
@@ -1876,6 +1878,7 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
1876{ 1878{
1877 enum drm_connector_status status; 1879 enum drm_connector_status status;
1878 struct drm_i915_private *dev_priv = to_i915(connector->dev); 1880 struct drm_i915_private *dev_priv = to_i915(connector->dev);
1881 struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1879 1882
1880 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 1883 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
1881 connector->base.id, connector->name); 1884 connector->base.id, connector->name);
@@ -1891,6 +1894,9 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
1891 1894
1892 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); 1895 intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
1893 1896
1897 if (status != connector_status_connected)
1898 cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier);
1899
1894 return status; 1900 return status;
1895} 1901}
1896 1902
@@ -2031,6 +2037,8 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
2031 2037
2032static void intel_hdmi_destroy(struct drm_connector *connector) 2038static void intel_hdmi_destroy(struct drm_connector *connector)
2033{ 2039{
2040 if (intel_attached_hdmi(connector)->cec_notifier)
2041 cec_notifier_put(intel_attached_hdmi(connector)->cec_notifier);
2034 kfree(to_intel_connector(connector)->detect_edid); 2042 kfree(to_intel_connector(connector)->detect_edid);
2035 drm_connector_cleanup(connector); 2043 drm_connector_cleanup(connector);
2036 kfree(connector); 2044 kfree(connector);
@@ -2350,6 +2358,11 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
2350 u32 temp = I915_READ(PEG_BAND_GAP_DATA); 2358 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
2351 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); 2359 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
2352 } 2360 }
2361
2362 intel_hdmi->cec_notifier = cec_notifier_get_conn(dev->dev,
2363 port_identifier(port));
2364 if (!intel_hdmi->cec_notifier)
2365 DRM_DEBUG_KMS("CEC notifier get failed\n");
2353} 2366}
2354 2367
2355void intel_hdmi_init(struct drm_i915_private *dev_priv, 2368void intel_hdmi_init(struct drm_i915_private *dev_priv,