1 /* 2 * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> 3 * Copyright (c) 2007, 2010 Intel Corporation 4 * Jesse Barnes <jesse.barnes@intel.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the next 14 * paragraph) shall be included in all copies or substantial portions of the 15 * Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 * DEALINGS IN THE SOFTWARE. 24 * 25 * $FreeBSD: head/sys/dev/drm2/i915/intel_modes.c 249041 2013-04-03 08:27:35Z dumbbell $ 26 */ 27 28 #include <dev/drm/drmP.h> 29 #include <dev/drm/drm.h> 30 #include "i915_drm.h" 31 #include "i915_drv.h" 32 #include "intel_drv.h" 33 #include <dev/drm/drm_edid.h> 34 #include <bus/iicbus/iiconf.h> 35 36 /** 37 * intel_ddc_probe 38 * 39 */ 40 bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus) 41 { 42 struct drm_i915_private *dev_priv = intel_encoder->base.dev->dev_private; 43 u8 out_buf[] = { 0x0, 0x0}; 44 u8 buf[2]; 45 struct iic_msg msgs[] = { 46 { 47 .slave = DDC_ADDR << 1, 48 .flags = IIC_M_WR, 49 .len = 1, 50 .buf = out_buf, 51 }, 52 { 53 .slave = DDC_ADDR << 1, 54 .flags = IIC_M_RD, 55 .len = 1, 56 .buf = buf, 57 } 58 }; 59 60 return (iicbus_transfer(dev_priv->gmbus[ddc_bus], msgs, 2) 61 == 0/* XXXKIB 2*/); 62 } 63 64 /** 65 * intel_ddc_get_modes - get modelist from monitor 66 * @connector: DRM connector device to use 67 * @adapter: i2c adapter 68 * 69 * Fetch the EDID information from @connector using the DDC bus. 70 */ 71 int 72 intel_ddc_get_modes(struct drm_connector *connector, device_t adapter) 73 { 74 struct edid *edid; 75 int ret = 0; 76 77 edid = drm_get_edid(connector, adapter); 78 if (edid) { 79 drm_mode_connector_update_edid_property(connector, edid); 80 ret = drm_add_edid_modes(connector, edid); 81 drm_edid_to_eld(connector, edid); 82 connector->display_info.raw_edid = NULL; 83 drm_free(edid, DRM_MEM_KMS); 84 } 85 86 return ret; 87 } 88 89 static const struct drm_prop_enum_list force_audio_names[] = { 90 { HDMI_AUDIO_OFF_DVI, "force-dvi" }, 91 { HDMI_AUDIO_OFF, "off" }, 92 { HDMI_AUDIO_AUTO, "auto" }, 93 { HDMI_AUDIO_ON, "on" }, 94 }; 95 96 void 97 intel_attach_force_audio_property(struct drm_connector *connector) 98 { 99 struct drm_device *dev = connector->dev; 100 struct drm_i915_private *dev_priv = dev->dev_private; 101 struct drm_property *prop; 102 103 prop = dev_priv->force_audio_property; 104 if (prop == NULL) { 105 prop = drm_property_create_enum(dev, 0, 106 "audio", 107 force_audio_names, 108 DRM_ARRAY_SIZE(force_audio_names)); 109 if (prop == NULL) 110 return; 111 112 dev_priv->force_audio_property = prop; 113 } 114 drm_connector_attach_property(connector, prop, 0); 115 } 116 117 static const struct drm_prop_enum_list broadcast_rgb_names[] = { 118 { 0, "Full" }, 119 { 1, "Limited 16:235" }, 120 }; 121 122 void 123 intel_attach_broadcast_rgb_property(struct drm_connector *connector) 124 { 125 struct drm_device *dev = connector->dev; 126 struct drm_i915_private *dev_priv = dev->dev_private; 127 struct drm_property *prop; 128 129 prop = dev_priv->broadcast_rgb_property; 130 if (prop == NULL) { 131 prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, 132 "Broadcast RGB", 133 broadcast_rgb_names, 134 DRM_ARRAY_SIZE(broadcast_rgb_names)); 135 if (prop == NULL) 136 return; 137 138 dev_priv->broadcast_rgb_property = prop; 139 } 140 141 drm_connector_attach_property(connector, prop, 0); 142 } 143