1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/slab.h>
27#include <linux/i2c.h>
28#include <linux/fb.h>
29#include "drmP.h"
30#include "intel_drv.h"
31#include "i915_drv.h"
32
33
34
35
36
37bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus)
38{
39 struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private;
40 u8 out_buf[] = { 0x0, 0x0};
41 u8 buf[2];
42 struct i2c_msg msgs[] = {
43 {
44 .addr = 0x50,
45 .flags = 0,
46 .len = 1,
47 .buf = out_buf,
48 },
49 {
50 .addr = 0x50,
51 .flags = I2C_M_RD,
52 .len = 1,
53 .buf = buf,
54 }
55 };
56
57 return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 2) == 2;
58}
59
60
61
62
63
64
65
66
67int intel_ddc_get_modes(struct drm_connector *connector,
68 struct i2c_adapter *adapter)
69{
70 struct edid *edid;
71 int ret = 0;
72
73 edid = drm_get_edid(connector, adapter);
74 if (edid) {
75 drm_mode_connector_update_edid_property(connector, edid);
76 ret = drm_add_edid_modes(connector, edid);
77 connector->display_info.raw_edid = NULL;
78 kfree(edid);
79 }
80
81 return ret;
82}
83
84static const char *force_audio_names[] = {
85 "off",
86 "auto",
87 "on",
88};
89
90void
91intel_attach_force_audio_property(struct drm_connector *connector)
92{
93 struct drm_device *dev = connector->dev;
94 struct drm_i915_private *dev_priv = dev->dev_private;
95 struct drm_property *prop;
96 int i;
97
98 prop = dev_priv->force_audio_property;
99 if (prop == NULL) {
100 prop = drm_property_create(dev, DRM_MODE_PROP_ENUM,
101 "audio",
102 ARRAY_SIZE(force_audio_names));
103 if (prop == NULL)
104 return;
105
106 for (i = 0; i < ARRAY_SIZE(force_audio_names); i++)
107 drm_property_add_enum(prop, i, i-1, force_audio_names[i]);
108
109 dev_priv->force_audio_property = prop;
110 }
111 drm_connector_attach_property(connector, prop, 0);
112}
113
114static const char *broadcast_rgb_names[] = {
115 "Full",
116 "Limited 16:235",
117};
118
119void
120intel_attach_broadcast_rgb_property(struct drm_connector *connector)
121{
122 struct drm_device *dev = connector->dev;
123 struct drm_i915_private *dev_priv = dev->dev_private;
124 struct drm_property *prop;
125 int i;
126
127 prop = dev_priv->broadcast_rgb_property;
128 if (prop == NULL) {
129 prop = drm_property_create(dev, DRM_MODE_PROP_ENUM,
130 "Broadcast RGB",
131 ARRAY_SIZE(broadcast_rgb_names));
132 if (prop == NULL)
133 return;
134
135 for (i = 0; i < ARRAY_SIZE(broadcast_rgb_names); i++)
136 drm_property_add_enum(prop, i, i, broadcast_rgb_names[i]);
137
138 dev_priv->broadcast_rgb_property = prop;
139 }
140
141 drm_connector_attach_property(connector, prop, 0);
142}
143