1 /* 2 * Copyright (c) 2014 Samsung Electronics Co., Ltd 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sub license, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the 12 * next paragraph) shall be included in all copies or substantial portions 13 * of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24 #include <linux/err.h> 25 #include <linux/module.h> 26 #include <linux/mutex.h> 27 28 #include <drm/drm_bridge.h> 29 #include <drm/drm_encoder.h> 30 31 #include "drm_crtc_internal.h" 32 33 /** 34 * DOC: overview 35 * 36 * &struct drm_bridge represents a device that hangs on to an encoder. These are 37 * handy when a regular &drm_encoder entity isn't enough to represent the entire 38 * encoder chain. 39 * 40 * A bridge is always attached to a single &drm_encoder at a time, but can be 41 * either connected to it directly, or through an intermediate bridge:: 42 * 43 * encoder ---> bridge B ---> bridge A 44 * 45 * Here, the output of the encoder feeds to bridge B, and that furthers feeds to 46 * bridge A. 47 * 48 * The driver using the bridge is responsible to make the associations between 49 * the encoder and bridges. Once these links are made, the bridges will 50 * participate along with encoder functions to perform mode_set/enable/disable 51 * through the ops provided in &drm_bridge_funcs. 52 * 53 * drm_bridge, like drm_panel, aren't drm_mode_object entities like planes, 54 * CRTCs, encoders or connectors and hence are not visible to userspace. They 55 * just provide additional hooks to get the desired output at the end of the 56 * encoder chain. 57 * 58 * Bridges can also be chained up using the &drm_bridge.next pointer. 59 * 60 * Both legacy CRTC helpers and the new atomic modeset helpers support bridges. 61 */ 62 63 static DEFINE_MUTEX(bridge_lock); 64 static LIST_HEAD(bridge_list); 65 66 /** 67 * drm_bridge_add - add the given bridge to the global bridge list 68 * 69 * @bridge: bridge control structure 70 * 71 * RETURNS: 72 * Unconditionally returns Zero. 73 */ 74 int drm_bridge_add(struct drm_bridge *bridge) 75 { 76 mutex_lock(&bridge_lock); 77 list_add_tail(&bridge->list, &bridge_list); 78 mutex_unlock(&bridge_lock); 79 80 return 0; 81 } 82 EXPORT_SYMBOL(drm_bridge_add); 83 84 /** 85 * drm_bridge_remove - remove the given bridge from the global bridge list 86 * 87 * @bridge: bridge control structure 88 */ 89 void drm_bridge_remove(struct drm_bridge *bridge) 90 { 91 mutex_lock(&bridge_lock); 92 list_del_init(&bridge->list); 93 mutex_unlock(&bridge_lock); 94 } 95 EXPORT_SYMBOL(drm_bridge_remove); 96 97 /** 98 * drm_bridge_attach - attach the bridge to an encoder's chain 99 * 100 * @encoder: DRM encoder 101 * @bridge: bridge to attach 102 * @previous: previous bridge in the chain (optional) 103 * 104 * Called by a kms driver to link the bridge to an encoder's chain. The previous 105 * argument specifies the previous bridge in the chain. If NULL, the bridge is 106 * linked directly at the encoder's output. Otherwise it is linked at the 107 * previous bridge's output. 108 * 109 * If non-NULL the previous bridge must be already attached by a call to this 110 * function. 111 * 112 * RETURNS: 113 * Zero on success, error code on failure 114 */ 115 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, 116 struct drm_bridge *previous) 117 { 118 int ret; 119 120 if (!encoder || !bridge) 121 return -EINVAL; 122 123 if (previous && (!previous->dev || previous->encoder != encoder)) 124 return -EINVAL; 125 126 if (bridge->dev) 127 return -EBUSY; 128 129 bridge->dev = encoder->dev; 130 bridge->encoder = encoder; 131 132 if (bridge->funcs->attach) { 133 ret = bridge->funcs->attach(bridge); 134 if (ret < 0) { 135 bridge->dev = NULL; 136 bridge->encoder = NULL; 137 return ret; 138 } 139 } 140 141 if (previous) 142 previous->next = bridge; 143 else 144 encoder->bridge = bridge; 145 146 return 0; 147 } 148 EXPORT_SYMBOL(drm_bridge_attach); 149 150 void drm_bridge_detach(struct drm_bridge *bridge) 151 { 152 if (WARN_ON(!bridge)) 153 return; 154 155 if (WARN_ON(!bridge->dev)) 156 return; 157 158 if (bridge->funcs->detach) 159 bridge->funcs->detach(bridge); 160 161 bridge->dev = NULL; 162 } 163 164 /** 165 * DOC: bridge callbacks 166 * 167 * The &drm_bridge_funcs ops are populated by the bridge driver. The DRM 168 * internals (atomic and CRTC helpers) use the helpers defined in drm_bridge.c 169 * These helpers call a specific &drm_bridge_funcs op for all the bridges 170 * during encoder configuration. 171 * 172 * For detailed specification of the bridge callbacks see &drm_bridge_funcs. 173 */ 174 175 /** 176 * drm_bridge_mode_fixup - fixup proposed mode for all bridges in the 177 * encoder chain 178 * @bridge: bridge control structure 179 * @mode: desired mode to be set for the bridge 180 * @adjusted_mode: updated mode that works for this bridge 181 * 182 * Calls &drm_bridge_funcs.mode_fixup for all the bridges in the 183 * encoder chain, starting from the first bridge to the last. 184 * 185 * Note: the bridge passed should be the one closest to the encoder 186 * 187 * RETURNS: 188 * true on success, false on failure 189 */ 190 bool drm_bridge_mode_fixup(struct drm_bridge *bridge, 191 const struct drm_display_mode *mode, 192 struct drm_display_mode *adjusted_mode) 193 { 194 bool ret = true; 195 196 if (!bridge) 197 return true; 198 199 if (bridge->funcs->mode_fixup) 200 ret = bridge->funcs->mode_fixup(bridge, mode, adjusted_mode); 201 202 ret = ret && drm_bridge_mode_fixup(bridge->next, mode, adjusted_mode); 203 204 return ret; 205 } 206 EXPORT_SYMBOL(drm_bridge_mode_fixup); 207 208 /** 209 * drm_bridge_mode_valid - validate the mode against all bridges in the 210 * encoder chain. 211 * @bridge: bridge control structure 212 * @mode: desired mode to be validated 213 * 214 * Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder 215 * chain, starting from the first bridge to the last. If at least one bridge 216 * does not accept the mode the function returns the error code. 217 * 218 * Note: the bridge passed should be the one closest to the encoder. 219 * 220 * RETURNS: 221 * MODE_OK on success, drm_mode_status Enum error code on failure 222 */ 223 enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge, 224 const struct drm_display_mode *mode) 225 { 226 enum drm_mode_status ret = MODE_OK; 227 228 if (!bridge) 229 return ret; 230 231 if (bridge->funcs->mode_valid) 232 ret = bridge->funcs->mode_valid(bridge, mode); 233 234 if (ret != MODE_OK) 235 return ret; 236 237 return drm_bridge_mode_valid(bridge->next, mode); 238 } 239 EXPORT_SYMBOL(drm_bridge_mode_valid); 240 241 /** 242 * drm_bridge_disable - disables all bridges in the encoder chain 243 * @bridge: bridge control structure 244 * 245 * Calls &drm_bridge_funcs.disable op for all the bridges in the encoder 246 * chain, starting from the last bridge to the first. These are called before 247 * calling the encoder's prepare op. 248 * 249 * Note: the bridge passed should be the one closest to the encoder 250 */ 251 void drm_bridge_disable(struct drm_bridge *bridge) 252 { 253 if (!bridge) 254 return; 255 256 drm_bridge_disable(bridge->next); 257 258 if (bridge->funcs->disable) 259 bridge->funcs->disable(bridge); 260 } 261 EXPORT_SYMBOL(drm_bridge_disable); 262 263 /** 264 * drm_bridge_post_disable - cleans up after disabling all bridges in the encoder chain 265 * @bridge: bridge control structure 266 * 267 * Calls &drm_bridge_funcs.post_disable op for all the bridges in the 268 * encoder chain, starting from the first bridge to the last. These are called 269 * after completing the encoder's prepare op. 270 * 271 * Note: the bridge passed should be the one closest to the encoder 272 */ 273 void drm_bridge_post_disable(struct drm_bridge *bridge) 274 { 275 if (!bridge) 276 return; 277 278 if (bridge->funcs->post_disable) 279 bridge->funcs->post_disable(bridge); 280 281 drm_bridge_post_disable(bridge->next); 282 } 283 EXPORT_SYMBOL(drm_bridge_post_disable); 284 285 /** 286 * drm_bridge_mode_set - set proposed mode for all bridges in the 287 * encoder chain 288 * @bridge: bridge control structure 289 * @mode: desired mode to be set for the bridge 290 * @adjusted_mode: updated mode that works for this bridge 291 * 292 * Calls &drm_bridge_funcs.mode_set op for all the bridges in the 293 * encoder chain, starting from the first bridge to the last. 294 * 295 * Note: the bridge passed should be the one closest to the encoder 296 */ 297 void drm_bridge_mode_set(struct drm_bridge *bridge, 298 struct drm_display_mode *mode, 299 struct drm_display_mode *adjusted_mode) 300 { 301 if (!bridge) 302 return; 303 304 if (bridge->funcs->mode_set) 305 bridge->funcs->mode_set(bridge, mode, adjusted_mode); 306 307 drm_bridge_mode_set(bridge->next, mode, adjusted_mode); 308 } 309 EXPORT_SYMBOL(drm_bridge_mode_set); 310 311 /** 312 * drm_bridge_pre_enable - prepares for enabling all 313 * bridges in the encoder chain 314 * @bridge: bridge control structure 315 * 316 * Calls &drm_bridge_funcs.pre_enable op for all the bridges in the encoder 317 * chain, starting from the last bridge to the first. These are called 318 * before calling the encoder's commit op. 319 * 320 * Note: the bridge passed should be the one closest to the encoder 321 */ 322 void drm_bridge_pre_enable(struct drm_bridge *bridge) 323 { 324 if (!bridge) 325 return; 326 327 drm_bridge_pre_enable(bridge->next); 328 329 if (bridge->funcs->pre_enable) 330 bridge->funcs->pre_enable(bridge); 331 } 332 EXPORT_SYMBOL(drm_bridge_pre_enable); 333 334 /** 335 * drm_bridge_enable - enables all bridges in the encoder chain 336 * @bridge: bridge control structure 337 * 338 * Calls &drm_bridge_funcs.enable op for all the bridges in the encoder 339 * chain, starting from the first bridge to the last. These are called 340 * after completing the encoder's commit op. 341 * 342 * Note that the bridge passed should be the one closest to the encoder 343 */ 344 void drm_bridge_enable(struct drm_bridge *bridge) 345 { 346 if (!bridge) 347 return; 348 349 if (bridge->funcs->enable) 350 bridge->funcs->enable(bridge); 351 352 drm_bridge_enable(bridge->next); 353 } 354 EXPORT_SYMBOL(drm_bridge_enable); 355 356 #ifdef CONFIG_OF 357 /** 358 * of_drm_find_bridge - find the bridge corresponding to the device node in 359 * the global bridge list 360 * 361 * @np: device node 362 * 363 * RETURNS: 364 * drm_bridge control struct on success, NULL on failure 365 */ 366 struct drm_bridge *of_drm_find_bridge(struct device_node *np) 367 { 368 struct drm_bridge *bridge; 369 370 mutex_lock(&bridge_lock); 371 372 list_for_each_entry(bridge, &bridge_list, list) { 373 if (bridge->of_node == np) { 374 mutex_unlock(&bridge_lock); 375 return bridge; 376 } 377 } 378 379 mutex_unlock(&bridge_lock); 380 return NULL; 381 } 382 EXPORT_SYMBOL(of_drm_find_bridge); 383 #endif 384 385 MODULE_AUTHOR("Ajay Kumar <ajaykumar.rs@samsung.com>"); 386 MODULE_DESCRIPTION("DRM bridge infrastructure"); 387 MODULE_LICENSE("GPL and additional rights"); 388