Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/exynos: remove struct exynos_drm_manager

exynos_drm_manager was just a redundant struct to represent the crtc as
well. In this commit we merge exynos_drm_manager into exynos_drm_crtc to
remove an unnecessary level of indirection easing the understand of the
flow on exynos.

Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: Inki Dae <inki.dae@samsung.com>

authored by

Gustavo Padovan and committed by
Inki Dae
93bca243 eb88e422

+211 -244
+32 -35
drivers/gpu/drm/exynos/exynos_drm_crtc.c
··· 23 23 static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode) 24 24 { 25 25 struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 26 - struct exynos_drm_manager *manager = exynos_crtc->manager; 27 26 28 27 DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode); 29 28 ··· 40 41 drm_crtc_vblank_off(crtc); 41 42 } 42 43 43 - if (manager->ops->dpms) 44 - manager->ops->dpms(manager, mode); 44 + if (exynos_crtc->ops->dpms) 45 + exynos_crtc->ops->dpms(exynos_crtc, mode); 45 46 46 47 exynos_crtc->dpms = mode; 47 48 ··· 57 58 static void exynos_drm_crtc_commit(struct drm_crtc *crtc) 58 59 { 59 60 struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 60 - struct exynos_drm_manager *manager = exynos_crtc->manager; 61 61 struct exynos_drm_plane *exynos_plane = to_exynos_plane(crtc->primary); 62 62 63 63 exynos_drm_crtc_dpms(crtc, DRM_MODE_DPMS_ON); 64 64 65 - if (manager->ops->win_commit) 66 - manager->ops->win_commit(manager, exynos_plane->zpos); 65 + if (exynos_crtc->ops->win_commit) 66 + exynos_crtc->ops->win_commit(exynos_crtc, exynos_plane->zpos); 67 67 68 - if (manager->ops->commit) 69 - manager->ops->commit(manager); 68 + if (exynos_crtc->ops->commit) 69 + exynos_crtc->ops->commit(exynos_crtc); 70 70 71 71 exynos_plane_dpms(crtc->primary, DRM_MODE_DPMS_ON); 72 72 } ··· 76 78 struct drm_display_mode *adjusted_mode) 77 79 { 78 80 struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 79 - struct exynos_drm_manager *manager = exynos_crtc->manager; 80 81 81 - if (manager->ops->mode_fixup) 82 - return manager->ops->mode_fixup(manager, mode, adjusted_mode); 82 + if (exynos_crtc->ops->mode_fixup) 83 + return exynos_crtc->ops->mode_fixup(exynos_crtc, mode, 84 + adjusted_mode); 83 85 84 86 return true; 85 87 } ··· 90 92 struct drm_framebuffer *old_fb) 91 93 { 92 94 struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 93 - struct exynos_drm_manager *manager = exynos_crtc->manager; 94 95 struct drm_framebuffer *fb = crtc->primary->fb; 95 96 unsigned int crtc_w; 96 97 unsigned int crtc_h; ··· 103 106 crtc_w = fb->width - x; 104 107 crtc_h = fb->height - y; 105 108 106 - if (manager->ops->mode_set) 107 - manager->ops->mode_set(manager, &crtc->mode); 109 + if (exynos_crtc->ops->mode_set) 110 + exynos_crtc->ops->mode_set(exynos_crtc, &crtc->mode); 108 111 109 112 return exynos_plane_mode_set(crtc->primary, crtc, fb, 0, 0, 110 113 crtc_w, crtc_h, x, y, crtc_w, crtc_h); ··· 296 299 drm_object_attach_property(&crtc->base, prop, 0); 297 300 } 298 301 299 - int exynos_drm_crtc_create(struct exynos_drm_manager *manager, 300 - struct drm_device *drm_dev, int pipe, 301 - enum exynos_drm_output_type type) 302 + struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev, 303 + int pipe, 304 + enum exynos_drm_output_type type, 305 + struct exynos_drm_crtc_ops *ops, 306 + void *ctx) 302 307 { 303 308 struct exynos_drm_crtc *exynos_crtc; 304 309 struct drm_plane *plane; ··· 310 311 311 312 exynos_crtc = kzalloc(sizeof(*exynos_crtc), GFP_KERNEL); 312 313 if (!exynos_crtc) 313 - return -ENOMEM; 314 + return ERR_PTR(-ENOMEM); 314 315 315 316 init_waitqueue_head(&exynos_crtc->pending_flip_queue); 316 317 atomic_set(&exynos_crtc->pending_flip, 0); 317 318 318 319 exynos_crtc->dpms = DRM_MODE_DPMS_OFF; 319 - exynos_crtc->manager = manager; 320 320 exynos_crtc->pipe = pipe; 321 321 exynos_crtc->type = type; 322 + exynos_crtc->ops = ops; 323 + exynos_crtc->ctx = ctx; 322 324 plane = exynos_plane_init(drm_dev, 1 << pipe, 323 325 DRM_PLANE_TYPE_PRIMARY); 324 326 if (IS_ERR(plane)) { ··· 327 327 goto err_plane; 328 328 } 329 329 330 - manager->crtc = &exynos_crtc->base; 331 330 crtc = &exynos_crtc->base; 332 331 333 332 private->crtc[pipe] = crtc; ··· 340 341 341 342 exynos_drm_crtc_attach_mode_property(crtc); 342 343 343 - return 0; 344 + return exynos_crtc; 344 345 345 346 err_crtc: 346 347 plane->funcs->destroy(plane); 347 348 err_plane: 348 349 kfree(exynos_crtc); 349 - return ret; 350 + return ERR_PTR(ret); 350 351 } 351 352 352 353 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe) ··· 354 355 struct exynos_drm_private *private = dev->dev_private; 355 356 struct exynos_drm_crtc *exynos_crtc = 356 357 to_exynos_crtc(private->crtc[pipe]); 357 - struct exynos_drm_manager *manager = exynos_crtc->manager; 358 358 359 359 if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) 360 360 return -EPERM; 361 361 362 - if (manager->ops->enable_vblank) 363 - manager->ops->enable_vblank(manager); 362 + if (exynos_crtc->ops->enable_vblank) 363 + exynos_crtc->ops->enable_vblank(exynos_crtc); 364 364 365 365 return 0; 366 366 } ··· 369 371 struct exynos_drm_private *private = dev->dev_private; 370 372 struct exynos_drm_crtc *exynos_crtc = 371 373 to_exynos_crtc(private->crtc[pipe]); 372 - struct exynos_drm_manager *manager = exynos_crtc->manager; 373 374 374 375 if (exynos_crtc->dpms != DRM_MODE_DPMS_ON) 375 376 return; 376 377 377 - if (manager->ops->disable_vblank) 378 - manager->ops->disable_vblank(manager); 378 + if (exynos_crtc->ops->disable_vblank) 379 + exynos_crtc->ops->disable_vblank(exynos_crtc); 379 380 } 380 381 381 382 void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int pipe) ··· 405 408 406 409 void exynos_drm_crtc_complete_scanout(struct drm_framebuffer *fb) 407 410 { 408 - struct exynos_drm_manager *manager; 411 + struct exynos_drm_crtc *exynos_crtc; 409 412 struct drm_device *dev = fb->dev; 410 413 struct drm_crtc *crtc; 411 414 ··· 414 417 * for all encoders. 415 418 */ 416 419 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 417 - manager = to_exynos_crtc(crtc)->manager; 420 + exynos_crtc = to_exynos_crtc(crtc); 418 421 419 422 /* 420 423 * wait for vblank interrupt 421 424 * - this makes sure that overlay data are updated to 422 425 * real hardware. 423 426 */ 424 - if (manager->ops->wait_for_vblank) 425 - manager->ops->wait_for_vblank(manager); 427 + if (exynos_crtc->ops->wait_for_vblank) 428 + exynos_crtc->ops->wait_for_vblank(exynos_crtc); 426 429 } 427 430 } 428 431 ··· 444 447 445 448 void exynos_drm_crtc_te_handler(struct drm_crtc *crtc) 446 449 { 447 - struct exynos_drm_manager *manager = to_exynos_crtc(crtc)->manager; 450 + struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 448 451 449 - if (manager->ops->te_handler) 450 - manager->ops->te_handler(manager); 452 + if (exynos_crtc->ops->te_handler) 453 + exynos_crtc->ops->te_handler(exynos_crtc); 451 454 }
+5 -3
drivers/gpu/drm/exynos/exynos_drm_crtc.h
··· 17 17 18 18 #include "exynos_drm_drv.h" 19 19 20 - int exynos_drm_crtc_create(struct exynos_drm_manager *manager, 21 - struct drm_device *drm_dev, int pipe, 22 - enum exynos_drm_output_type type); 20 + struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev, 21 + int pipe, 22 + enum exynos_drm_output_type type, 23 + struct exynos_drm_crtc_ops *ops, 24 + void *context); 23 25 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe); 24 26 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe); 25 27 void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int pipe);
+19 -32
drivers/gpu/drm/exynos/exynos_drm_drv.h
··· 163 163 }; 164 164 165 165 /* 166 - * Exynos drm manager ops 166 + * Exynos drm crtc ops 167 167 * 168 168 * @dpms: control device power. 169 169 * @mode_fixup: fix mode data before applying it ··· 180 180 * @te_handler: trigger to transfer video image at the tearing effect 181 181 * synchronization signal if there is a page flip request. 182 182 */ 183 - struct exynos_drm_manager; 184 - struct exynos_drm_manager_ops { 185 - void (*dpms)(struct exynos_drm_manager *mgr, int mode); 186 - bool (*mode_fixup)(struct exynos_drm_manager *mgr, 183 + struct exynos_drm_crtc; 184 + struct exynos_drm_crtc_ops { 185 + void (*dpms)(struct exynos_drm_crtc *crtc, int mode); 186 + bool (*mode_fixup)(struct exynos_drm_crtc *crtc, 187 187 const struct drm_display_mode *mode, 188 188 struct drm_display_mode *adjusted_mode); 189 - void (*mode_set)(struct exynos_drm_manager *mgr, 189 + void (*mode_set)(struct exynos_drm_crtc *crtc, 190 190 const struct drm_display_mode *mode); 191 - void (*commit)(struct exynos_drm_manager *mgr); 192 - int (*enable_vblank)(struct exynos_drm_manager *mgr); 193 - void (*disable_vblank)(struct exynos_drm_manager *mgr); 194 - void (*wait_for_vblank)(struct exynos_drm_manager *mgr); 195 - void (*win_mode_set)(struct exynos_drm_manager *mgr, 191 + void (*commit)(struct exynos_drm_crtc *crtc); 192 + int (*enable_vblank)(struct exynos_drm_crtc *crtc); 193 + void (*disable_vblank)(struct exynos_drm_crtc *crtc); 194 + void (*wait_for_vblank)(struct exynos_drm_crtc *crtc); 195 + void (*win_mode_set)(struct exynos_drm_crtc *crtc, 196 196 struct exynos_drm_plane *plane); 197 - void (*win_commit)(struct exynos_drm_manager *mgr, int zpos); 198 - void (*win_enable)(struct exynos_drm_manager *mgr, int zpos); 199 - void (*win_disable)(struct exynos_drm_manager *mgr, int zpos); 200 - void (*te_handler)(struct exynos_drm_manager *mgr); 201 - }; 202 - 203 - /* 204 - * Exynos drm common manager structure, maps 1:1 with a crtc 205 - * 206 - * @list: the list entry for this manager 207 - * @drm_dev: pointer to the drm device 208 - * @crtc: crtc object. 209 - * @ops: pointer to callbacks for exynos drm specific functionality 210 - * @ctx: A pointer to the manager's implementation specific context 211 - */ 212 - struct exynos_drm_manager { 213 - struct list_head list; 214 - struct drm_crtc *crtc; 215 - struct exynos_drm_manager_ops *ops; 197 + void (*win_commit)(struct exynos_drm_crtc *crtc, int zpos); 198 + void (*win_enable)(struct exynos_drm_crtc *crtc, int zpos); 199 + void (*win_disable)(struct exynos_drm_crtc *crtc, int zpos); 200 + void (*te_handler)(struct exynos_drm_crtc *crtc); 216 201 }; 217 202 218 203 enum exynos_crtc_mode { ··· 209 224 * Exynos specific crtc structure. 210 225 * 211 226 * @base: crtc object. 212 - * @manager: the manager associated with this crtc 213 227 * @type: one of EXYNOS_DISPLAY_TYPE_LCD and HDMI. 214 228 * @pipe: a crtc index created at load() with a new crtc object creation 215 229 * and the crtc object would be set to private->crtc array ··· 219 235 * this pipe value. 220 236 * @dpms: store the crtc dpms value 221 237 * @mode: store the crtc mode value 238 + * @ops: pointer to callbacks for exynos drm specific functionality 239 + * @ctx: A pointer to the crtc's implementation specific context 222 240 */ 223 241 struct exynos_drm_crtc { 224 242 struct drm_crtc base; 225 - struct exynos_drm_manager *manager; 226 243 enum exynos_drm_output_type type; 227 244 unsigned int pipe; 228 245 unsigned int dpms; 229 246 enum exynos_crtc_mode mode; 230 247 wait_queue_head_t pending_flip_queue; 231 248 atomic_t pending_flip; 249 + struct exynos_drm_crtc_ops *ops; 250 + void *ctx; 232 251 }; 233 252 234 253 struct exynos_drm_g2d_private {
+58 -63
drivers/gpu/drm/exynos/exynos_drm_fimd.c
··· 157 157 }; 158 158 159 159 struct fimd_context { 160 - struct exynos_drm_manager manager; 161 160 struct device *dev; 162 161 struct drm_device *drm_dev; 162 + struct exynos_drm_crtc *crtc; 163 163 struct clk *bus_clk; 164 164 struct clk *lcd_clk; 165 165 void __iomem *regs; ··· 185 185 struct exynos_drm_display *display; 186 186 }; 187 187 188 - static inline struct fimd_context *mgr_to_fimd(struct exynos_drm_manager *mgr) 189 - { 190 - return container_of(mgr, struct fimd_context, manager); 191 - } 192 - 193 188 static const struct of_device_id fimd_driver_dt_match[] = { 194 189 { .compatible = "samsung,s3c6400-fimd", 195 190 .data = &s3c64xx_fimd_driver_data }, ··· 209 214 return (struct fimd_driver_data *)of_id->data; 210 215 } 211 216 212 - static void fimd_wait_for_vblank(struct exynos_drm_manager *mgr) 217 + static void fimd_wait_for_vblank(struct exynos_drm_crtc *crtc) 213 218 { 214 - struct fimd_context *ctx = mgr_to_fimd(mgr); 219 + struct fimd_context *ctx = crtc->ctx; 215 220 216 221 if (ctx->suspended) 217 222 return; ··· 254 259 writel(val, ctx->regs + SHADOWCON); 255 260 } 256 261 257 - static void fimd_clear_channel(struct exynos_drm_manager *mgr) 262 + static void fimd_clear_channel(struct exynos_drm_crtc *crtc) 258 263 { 259 - struct fimd_context *ctx = mgr_to_fimd(mgr); 264 + struct fimd_context *ctx = crtc->ctx; 260 265 int win, ch_enabled = 0; 261 266 262 267 DRM_DEBUG_KMS("%s\n", __FILE__); ··· 281 286 unsigned int state = ctx->suspended; 282 287 283 288 ctx->suspended = 0; 284 - fimd_wait_for_vblank(mgr); 289 + fimd_wait_for_vblank(crtc); 285 290 ctx->suspended = state; 286 291 } 287 292 } 288 293 289 - static int fimd_mgr_initialize(struct exynos_drm_manager *mgr, 294 + static int fimd_ctx_initialize(struct fimd_context *ctx, 290 295 struct drm_device *drm_dev) 291 296 { 292 - struct fimd_context *ctx = mgr_to_fimd(mgr); 293 297 struct exynos_drm_private *priv; 294 298 priv = drm_dev->dev_private; 295 299 ··· 301 307 * If any channel is already active, iommu will throw 302 308 * a PAGE FAULT when enabled. So clear any channel if enabled. 303 309 */ 304 - fimd_clear_channel(mgr); 310 + fimd_clear_channel(ctx->crtc); 305 311 drm_iommu_attach_device(ctx->drm_dev, ctx->dev); 306 312 } 307 313 308 314 return 0; 309 315 } 310 316 311 - static void fimd_mgr_remove(struct exynos_drm_manager *mgr) 317 + static void fimd_ctx_remove(struct fimd_context *ctx) 312 318 { 313 - struct fimd_context *ctx = mgr_to_fimd(mgr); 314 - 315 319 /* detach this sub driver from iommu mapping if supported. */ 316 320 if (is_drm_iommu_supported(ctx->drm_dev)) 317 321 drm_iommu_detach_device(ctx->drm_dev, ctx->dev); ··· 335 343 return (clkdiv < 0x100) ? clkdiv : 0xff; 336 344 } 337 345 338 - static bool fimd_mode_fixup(struct exynos_drm_manager *mgr, 346 + static bool fimd_mode_fixup(struct exynos_drm_crtc *crtc, 339 347 const struct drm_display_mode *mode, 340 348 struct drm_display_mode *adjusted_mode) 341 349 { ··· 345 353 return true; 346 354 } 347 355 348 - static void fimd_mode_set(struct exynos_drm_manager *mgr, 356 + static void fimd_mode_set(struct exynos_drm_crtc *crtc, 349 357 const struct drm_display_mode *in_mode) 350 358 { 351 - struct fimd_context *ctx = mgr_to_fimd(mgr); 359 + struct fimd_context *ctx = crtc->ctx; 352 360 353 361 drm_mode_copy(&ctx->mode, in_mode); 354 362 } 355 363 356 - static void fimd_commit(struct exynos_drm_manager *mgr) 364 + static void fimd_commit(struct exynos_drm_crtc *crtc) 357 365 { 358 - struct fimd_context *ctx = mgr_to_fimd(mgr); 366 + struct fimd_context *ctx = crtc->ctx; 359 367 struct drm_display_mode *mode = &ctx->mode; 360 368 struct fimd_driver_data *driver_data = ctx->driver_data; 361 369 void *timing_base = ctx->regs + driver_data->timing_base; ··· 453 461 writel(val, ctx->regs + VIDCON0); 454 462 } 455 463 456 - static int fimd_enable_vblank(struct exynos_drm_manager *mgr) 464 + static int fimd_enable_vblank(struct exynos_drm_crtc *crtc) 457 465 { 458 - struct fimd_context *ctx = mgr_to_fimd(mgr); 466 + struct fimd_context *ctx = crtc->ctx; 459 467 u32 val; 460 468 461 469 if (ctx->suspended) ··· 485 493 return 0; 486 494 } 487 495 488 - static void fimd_disable_vblank(struct exynos_drm_manager *mgr) 496 + static void fimd_disable_vblank(struct exynos_drm_crtc *crtc) 489 497 { 490 - struct fimd_context *ctx = mgr_to_fimd(mgr); 498 + struct fimd_context *ctx = crtc->ctx; 491 499 u32 val; 492 500 493 501 if (ctx->suspended) ··· 509 517 } 510 518 } 511 519 512 - static void fimd_win_mode_set(struct exynos_drm_manager *mgr, 520 + static void fimd_win_mode_set(struct exynos_drm_crtc *crtc, 513 521 struct exynos_drm_plane *plane) 514 522 { 515 - struct fimd_context *ctx = mgr_to_fimd(mgr); 523 + struct fimd_context *ctx = crtc->ctx; 516 524 struct fimd_win_data *win_data; 517 525 int win; 518 526 unsigned long offset; ··· 668 676 writel(val, ctx->regs + reg); 669 677 } 670 678 671 - static void fimd_win_commit(struct exynos_drm_manager *mgr, int zpos) 679 + static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos) 672 680 { 673 - struct fimd_context *ctx = mgr_to_fimd(mgr); 681 + struct fimd_context *ctx = crtc->ctx; 674 682 struct fimd_win_data *win_data; 675 683 int win = zpos; 676 684 unsigned long val, alpha, size; ··· 791 799 atomic_set(&ctx->win_updated, 1); 792 800 } 793 801 794 - static void fimd_win_disable(struct exynos_drm_manager *mgr, int zpos) 802 + static void fimd_win_disable(struct exynos_drm_crtc *crtc, int zpos) 795 803 { 796 - struct fimd_context *ctx = mgr_to_fimd(mgr); 804 + struct fimd_context *ctx = crtc->ctx; 797 805 struct fimd_win_data *win_data; 798 806 int win = zpos; 799 807 ··· 825 833 win_data->enabled = false; 826 834 } 827 835 828 - static void fimd_window_suspend(struct exynos_drm_manager *mgr) 836 + static void fimd_window_suspend(struct exynos_drm_crtc *crtc) 829 837 { 830 - struct fimd_context *ctx = mgr_to_fimd(mgr); 838 + struct fimd_context *ctx = crtc->ctx; 831 839 struct fimd_win_data *win_data; 832 840 int i; 833 841 ··· 835 843 win_data = &ctx->win_data[i]; 836 844 win_data->resume = win_data->enabled; 837 845 if (win_data->enabled) 838 - fimd_win_disable(mgr, i); 846 + fimd_win_disable(crtc, i); 839 847 } 840 848 } 841 849 842 - static void fimd_window_resume(struct exynos_drm_manager *mgr) 850 + static void fimd_window_resume(struct exynos_drm_crtc *crtc) 843 851 { 844 - struct fimd_context *ctx = mgr_to_fimd(mgr); 852 + struct fimd_context *ctx = crtc->ctx; 845 853 struct fimd_win_data *win_data; 846 854 int i; 847 855 ··· 852 860 } 853 861 } 854 862 855 - static void fimd_apply(struct exynos_drm_manager *mgr) 863 + static void fimd_apply(struct exynos_drm_crtc *crtc) 856 864 { 857 - struct fimd_context *ctx = mgr_to_fimd(mgr); 865 + struct fimd_context *ctx = crtc->ctx; 858 866 struct fimd_win_data *win_data; 859 867 int i; 860 868 861 869 for (i = 0; i < WINDOWS_NR; i++) { 862 870 win_data = &ctx->win_data[i]; 863 871 if (win_data->enabled) 864 - fimd_win_commit(mgr, i); 872 + fimd_win_commit(crtc, i); 865 873 else 866 - fimd_win_disable(mgr, i); 874 + fimd_win_disable(crtc, i); 867 875 } 868 876 869 - fimd_commit(mgr); 877 + fimd_commit(crtc); 870 878 } 871 879 872 - static int fimd_poweron(struct exynos_drm_manager *mgr) 880 + static int fimd_poweron(struct exynos_drm_crtc *crtc) 873 881 { 874 - struct fimd_context *ctx = mgr_to_fimd(mgr); 882 + struct fimd_context *ctx = crtc->ctx; 875 883 int ret; 876 884 877 885 if (!ctx->suspended) ··· 895 903 896 904 /* if vblank was enabled status, enable it again. */ 897 905 if (test_and_clear_bit(0, &ctx->irq_flags)) { 898 - ret = fimd_enable_vblank(mgr); 906 + ret = fimd_enable_vblank(crtc); 899 907 if (ret) { 900 908 DRM_ERROR("Failed to re-enable vblank [%d]\n", ret); 901 909 goto enable_vblank_err; 902 910 } 903 911 } 904 912 905 - fimd_window_resume(mgr); 913 + fimd_window_resume(crtc); 906 914 907 - fimd_apply(mgr); 915 + fimd_apply(crtc); 908 916 909 917 return 0; 910 918 ··· 917 925 return ret; 918 926 } 919 927 920 - static int fimd_poweroff(struct exynos_drm_manager *mgr) 928 + static int fimd_poweroff(struct exynos_drm_crtc *crtc) 921 929 { 922 - struct fimd_context *ctx = mgr_to_fimd(mgr); 930 + struct fimd_context *ctx = crtc->ctx; 923 931 924 932 if (ctx->suspended) 925 933 return 0; ··· 929 937 * suspend that connector. Otherwise we might try to scan from 930 938 * a destroyed buffer later. 931 939 */ 932 - fimd_window_suspend(mgr); 940 + fimd_window_suspend(crtc); 933 941 934 942 clk_disable_unprepare(ctx->lcd_clk); 935 943 clk_disable_unprepare(ctx->bus_clk); ··· 940 948 return 0; 941 949 } 942 950 943 - static void fimd_dpms(struct exynos_drm_manager *mgr, int mode) 951 + static void fimd_dpms(struct exynos_drm_crtc *crtc, int mode) 944 952 { 945 953 DRM_DEBUG_KMS("%s, %d\n", __FILE__, mode); 946 954 947 955 switch (mode) { 948 956 case DRM_MODE_DPMS_ON: 949 - fimd_poweron(mgr); 957 + fimd_poweron(crtc); 950 958 break; 951 959 case DRM_MODE_DPMS_STANDBY: 952 960 case DRM_MODE_DPMS_SUSPEND: 953 961 case DRM_MODE_DPMS_OFF: 954 - fimd_poweroff(mgr); 962 + fimd_poweroff(crtc); 955 963 break; 956 964 default: 957 965 DRM_DEBUG_KMS("unspecified mode %d\n", mode); ··· 988 996 atomic_set(&ctx->triggering, 0); 989 997 } 990 998 991 - static void fimd_te_handler(struct exynos_drm_manager *mgr) 999 + static void fimd_te_handler(struct exynos_drm_crtc *crtc) 992 1000 { 993 - struct fimd_context *ctx = mgr_to_fimd(mgr); 1001 + struct fimd_context *ctx = crtc->ctx; 994 1002 995 1003 /* Checks the crtc is detached already from encoder */ 996 1004 if (ctx->pipe < 0 || !ctx->drm_dev) ··· 1013 1021 drm_handle_vblank(ctx->drm_dev, ctx->pipe); 1014 1022 } 1015 1023 1016 - static struct exynos_drm_manager_ops fimd_manager_ops = { 1024 + static struct exynos_drm_crtc_ops fimd_crtc_ops = { 1017 1025 .dpms = fimd_dpms, 1018 1026 .mode_fixup = fimd_mode_fixup, 1019 1027 .mode_set = fimd_mode_set, ··· 1067 1075 struct fimd_context *ctx = dev_get_drvdata(dev); 1068 1076 struct drm_device *drm_dev = data; 1069 1077 1070 - fimd_mgr_initialize(&ctx->manager, drm_dev); 1071 - exynos_drm_crtc_create(&ctx->manager, drm_dev, ctx->pipe, 1072 - EXYNOS_DISPLAY_TYPE_LCD); 1078 + ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe, 1079 + EXYNOS_DISPLAY_TYPE_LCD, 1080 + &fimd_crtc_ops, ctx); 1081 + if (IS_ERR(ctx->crtc)) 1082 + return PTR_ERR(ctx->crtc); 1083 + 1084 + fimd_ctx_initialize(ctx, drm_dev); 1085 + 1073 1086 if (ctx->display) 1074 1087 exynos_drm_create_enc_conn(drm_dev, ctx->display); 1075 1088 ··· 1087 1090 { 1088 1091 struct fimd_context *ctx = dev_get_drvdata(dev); 1089 1092 1090 - fimd_dpms(&ctx->manager, DRM_MODE_DPMS_OFF); 1093 + fimd_dpms(ctx->crtc, DRM_MODE_DPMS_OFF); 1091 1094 1092 1095 if (ctx->display) 1093 1096 exynos_dpi_remove(ctx->display); 1094 1097 1095 - fimd_mgr_remove(&ctx->manager); 1098 + fimd_ctx_remove(ctx); 1096 1099 } 1097 1100 1098 1101 static const struct component_ops fimd_component_ops = { ··· 1114 1117 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); 1115 1118 if (!ctx) 1116 1119 return -ENOMEM; 1117 - 1118 - ctx->manager.ops = &fimd_manager_ops; 1119 1120 1120 1121 ret = exynos_drm_component_add(dev, EXYNOS_DEVICE_TYPE_CRTC, 1121 1122 EXYNOS_DISPLAY_TYPE_LCD);
+13 -13
drivers/gpu/drm/exynos/exynos_drm_plane.c
··· 68 68 uint32_t src_w, uint32_t src_h) 69 69 { 70 70 struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane); 71 - struct exynos_drm_manager *manager = to_exynos_crtc(crtc)->manager; 71 + struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 72 72 unsigned int actual_w; 73 73 unsigned int actual_h; 74 74 int nr; ··· 133 133 134 134 plane->crtc = crtc; 135 135 136 - if (manager->ops->win_mode_set) 137 - manager->ops->win_mode_set(manager, exynos_plane); 136 + if (exynos_crtc->ops->win_mode_set) 137 + exynos_crtc->ops->win_mode_set(exynos_crtc, exynos_plane); 138 138 139 139 return 0; 140 140 } ··· 142 142 void exynos_plane_dpms(struct drm_plane *plane, int mode) 143 143 { 144 144 struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane); 145 - struct exynos_drm_manager *manager; 145 + struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(plane->crtc); 146 146 147 147 if (mode == DRM_MODE_DPMS_ON) { 148 148 if (exynos_plane->enabled) 149 149 return; 150 150 151 - manager = to_exynos_crtc(plane->crtc)->manager; 152 - if (manager->ops->win_enable) 153 - manager->ops->win_enable(manager, exynos_plane->zpos); 151 + if (exynos_crtc->ops->win_enable) 152 + exynos_crtc->ops->win_enable(exynos_crtc, 153 + exynos_plane->zpos); 154 154 155 155 exynos_plane->enabled = true; 156 156 } else { 157 157 if (!exynos_plane->enabled) 158 158 return; 159 159 160 - manager = to_exynos_crtc(plane->crtc)->manager; 161 - if (manager->ops->win_disable) 162 - manager->ops->win_disable(manager, exynos_plane->zpos); 160 + if (exynos_crtc->ops->win_disable) 161 + exynos_crtc->ops->win_disable(exynos_crtc, 162 + exynos_plane->zpos); 163 163 164 164 exynos_plane->enabled = false; 165 165 } ··· 173 173 uint32_t src_w, uint32_t src_h) 174 174 { 175 175 176 - struct exynos_drm_manager *manager = to_exynos_crtc(crtc)->manager; 176 + struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); 177 177 struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane); 178 178 int ret; 179 179 ··· 183 183 if (ret < 0) 184 184 return ret; 185 185 186 - if (manager->ops->win_commit) 187 - manager->ops->win_commit(manager, exynos_plane->zpos); 186 + if (exynos_crtc->ops->win_commit) 187 + exynos_crtc->ops->win_commit(exynos_crtc, exynos_plane->zpos); 188 188 189 189 return 0; 190 190 }
+35 -44
drivers/gpu/drm/exynos/exynos_drm_vidi.c
··· 47 47 }; 48 48 49 49 struct vidi_context { 50 - struct exynos_drm_manager manager; 51 50 struct exynos_drm_display display; 52 51 struct platform_device *pdev; 53 52 struct drm_device *drm_dev; 54 - struct drm_crtc *crtc; 53 + struct exynos_drm_crtc *crtc; 55 54 struct drm_encoder *encoder; 56 55 struct drm_connector connector; 57 56 struct vidi_win_data win_data[WINDOWS_NR]; ··· 66 67 struct mutex lock; 67 68 int pipe; 68 69 }; 69 - 70 - static inline struct vidi_context *manager_to_vidi(struct exynos_drm_manager *m) 71 - { 72 - return container_of(m, struct vidi_context, manager); 73 - } 74 70 75 71 static inline struct vidi_context *display_to_vidi(struct exynos_drm_display *d) 76 72 { ··· 97 103 0x00, 0x00, 0x00, 0x06 98 104 }; 99 105 100 - static void vidi_apply(struct exynos_drm_manager *mgr) 106 + static void vidi_apply(struct exynos_drm_crtc *crtc) 101 107 { 102 - struct vidi_context *ctx = manager_to_vidi(mgr); 103 - struct exynos_drm_manager_ops *mgr_ops = mgr->ops; 108 + struct vidi_context *ctx = crtc->ctx; 109 + struct exynos_drm_crtc_ops *crtc_ops = crtc->ops; 104 110 struct vidi_win_data *win_data; 105 111 int i; 106 112 107 113 for (i = 0; i < WINDOWS_NR; i++) { 108 114 win_data = &ctx->win_data[i]; 109 - if (win_data->enabled && (mgr_ops && mgr_ops->win_commit)) 110 - mgr_ops->win_commit(mgr, i); 115 + if (win_data->enabled && (crtc_ops && crtc_ops->win_commit)) 116 + crtc_ops->win_commit(crtc, i); 111 117 } 112 118 } 113 119 114 - static int vidi_enable_vblank(struct exynos_drm_manager *mgr) 120 + static int vidi_enable_vblank(struct exynos_drm_crtc *crtc) 115 121 { 116 - struct vidi_context *ctx = manager_to_vidi(mgr); 122 + struct vidi_context *ctx = crtc->ctx; 117 123 118 124 if (ctx->suspended) 119 125 return -EPERM; ··· 126 132 /* 127 133 * in case of page flip request, vidi_finish_pageflip function 128 134 * will not be called because direct_vblank is true and then 129 - * that function will be called by manager_ops->win_commit callback 135 + * that function will be called by crtc_ops->win_commit callback 130 136 */ 131 137 schedule_work(&ctx->work); 132 138 133 139 return 0; 134 140 } 135 141 136 - static void vidi_disable_vblank(struct exynos_drm_manager *mgr) 142 + static void vidi_disable_vblank(struct exynos_drm_crtc *crtc) 137 143 { 138 - struct vidi_context *ctx = manager_to_vidi(mgr); 144 + struct vidi_context *ctx = crtc->ctx; 139 145 140 146 if (ctx->suspended) 141 147 return; ··· 144 150 ctx->vblank_on = false; 145 151 } 146 152 147 - static void vidi_win_mode_set(struct exynos_drm_manager *mgr, 153 + static void vidi_win_mode_set(struct exynos_drm_crtc *crtc, 148 154 struct exynos_drm_plane *plane) 149 155 { 150 - struct vidi_context *ctx = manager_to_vidi(mgr); 156 + struct vidi_context *ctx = crtc->ctx; 151 157 struct vidi_win_data *win_data; 152 158 int win; 153 159 unsigned long offset; ··· 197 203 plane->fb_width, plane->crtc_width); 198 204 } 199 205 200 - static void vidi_win_commit(struct exynos_drm_manager *mgr, int zpos) 206 + static void vidi_win_commit(struct exynos_drm_crtc *crtc, int zpos) 201 207 { 202 - struct vidi_context *ctx = manager_to_vidi(mgr); 208 + struct vidi_context *ctx = crtc->ctx; 203 209 struct vidi_win_data *win_data; 204 210 int win = zpos; 205 211 ··· 222 228 schedule_work(&ctx->work); 223 229 } 224 230 225 - static void vidi_win_disable(struct exynos_drm_manager *mgr, int zpos) 231 + static void vidi_win_disable(struct exynos_drm_crtc *crtc, int zpos) 226 232 { 227 - struct vidi_context *ctx = manager_to_vidi(mgr); 233 + struct vidi_context *ctx = crtc->ctx; 228 234 struct vidi_win_data *win_data; 229 235 int win = zpos; 230 236 ··· 240 246 /* TODO. */ 241 247 } 242 248 243 - static int vidi_power_on(struct exynos_drm_manager *mgr, bool enable) 249 + static int vidi_power_on(struct exynos_drm_crtc *crtc, bool enable) 244 250 { 245 - struct vidi_context *ctx = manager_to_vidi(mgr); 251 + struct vidi_context *ctx = crtc->ctx; 246 252 247 253 DRM_DEBUG_KMS("%s\n", __FILE__); 248 254 ··· 254 260 255 261 /* if vblank was enabled status, enable it again. */ 256 262 if (test_and_clear_bit(0, &ctx->irq_flags)) 257 - vidi_enable_vblank(mgr); 263 + vidi_enable_vblank(crtc); 258 264 259 - vidi_apply(mgr); 265 + vidi_apply(crtc); 260 266 } else { 261 267 ctx->suspended = true; 262 268 } ··· 264 270 return 0; 265 271 } 266 272 267 - static void vidi_dpms(struct exynos_drm_manager *mgr, int mode) 273 + static void vidi_dpms(struct exynos_drm_crtc *crtc, int mode) 268 274 { 269 - struct vidi_context *ctx = manager_to_vidi(mgr); 275 + struct vidi_context *ctx = crtc->ctx; 270 276 271 277 DRM_DEBUG_KMS("%d\n", mode); 272 278 ··· 274 280 275 281 switch (mode) { 276 282 case DRM_MODE_DPMS_ON: 277 - vidi_power_on(mgr, true); 283 + vidi_power_on(crtc, true); 278 284 break; 279 285 case DRM_MODE_DPMS_STANDBY: 280 286 case DRM_MODE_DPMS_SUSPEND: 281 287 case DRM_MODE_DPMS_OFF: 282 - vidi_power_on(mgr, false); 288 + vidi_power_on(crtc, false); 283 289 break; 284 290 default: 285 291 DRM_DEBUG_KMS("unspecified mode %d\n", mode); ··· 289 295 mutex_unlock(&ctx->lock); 290 296 } 291 297 292 - static int vidi_mgr_initialize(struct exynos_drm_manager *mgr, 298 + static int vidi_ctx_initialize(struct vidi_context *ctx, 293 299 struct drm_device *drm_dev) 294 300 { 295 - struct vidi_context *ctx = manager_to_vidi(mgr); 296 301 struct exynos_drm_private *priv = drm_dev->dev_private; 297 302 298 303 ctx->drm_dev = drm_dev; ··· 300 307 return 0; 301 308 } 302 309 303 - static struct exynos_drm_manager_ops vidi_manager_ops = { 310 + static struct exynos_drm_crtc_ops vidi_crtc_ops = { 304 311 .dpms = vidi_dpms, 305 312 .enable_vblank = vidi_enable_vblank, 306 313 .disable_vblank = vidi_disable_vblank, ··· 546 553 { 547 554 struct vidi_context *ctx = dev_get_drvdata(dev); 548 555 struct drm_device *drm_dev = data; 549 - struct drm_crtc *crtc = ctx->crtc; 550 556 int ret; 551 557 552 - vidi_mgr_initialize(&ctx->manager, drm_dev); 553 - 554 - ret = exynos_drm_crtc_create(&ctx->manager, drm_dev, ctx->pipe, 555 - EXYNOS_DISPLAY_TYPE_VIDI); 556 - if (ret) { 558 + ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe, 559 + EXYNOS_DISPLAY_TYPE_VIDI, 560 + &vidi_crtc_ops, ctx); 561 + if (IS_ERR(ctx->crtc)) { 557 562 DRM_ERROR("failed to create crtc.\n"); 558 - return ret; 563 + return PTR_ERR(ctx->crtc); 559 564 } 565 + 566 + vidi_ctx_initialize(ctx, drm_dev); 560 567 561 568 ret = exynos_drm_create_enc_conn(drm_dev, &ctx->display); 562 569 if (ret) { 563 - crtc->funcs->destroy(crtc); 564 - DRM_ERROR("failed to create encoder and connector.\n"); 570 + ctx->crtc->base.funcs->destroy(&ctx->crtc->base); 565 571 return ret; 566 572 } 567 573 ··· 586 594 if (!ctx) 587 595 return -ENOMEM; 588 596 589 - ctx->manager.ops = &vidi_manager_ops; 590 597 ctx->display.type = EXYNOS_DISPLAY_TYPE_VIDI; 591 598 ctx->display.ops = &vidi_display_ops; 592 599 ctx->default_win = 0;
+49 -54
drivers/gpu/drm/exynos/exynos_mixer.c
··· 84 84 }; 85 85 86 86 struct mixer_context { 87 - struct exynos_drm_manager manager; 88 87 struct platform_device *pdev; 89 88 struct device *dev; 90 89 struct drm_device *drm_dev; 90 + struct exynos_drm_crtc *crtc; 91 91 int pipe; 92 92 bool interlace; 93 93 bool powered; ··· 102 102 wait_queue_head_t wait_vsync_queue; 103 103 atomic_t wait_vsync_event; 104 104 }; 105 - 106 - static inline struct mixer_context *mgr_to_mixer(struct exynos_drm_manager *mgr) 107 - { 108 - return container_of(mgr, struct mixer_context, manager); 109 - } 110 105 111 106 struct mixer_drv_data { 112 107 enum mixer_version_id version; ··· 849 854 return 0; 850 855 } 851 856 852 - static int mixer_initialize(struct exynos_drm_manager *mgr, 857 + static int mixer_initialize(struct mixer_context *mixer_ctx, 853 858 struct drm_device *drm_dev) 854 859 { 855 860 int ret; 856 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 857 861 struct exynos_drm_private *priv; 858 862 priv = drm_dev->dev_private; 859 863 ··· 881 887 return drm_iommu_attach_device(mixer_ctx->drm_dev, mixer_ctx->dev); 882 888 } 883 889 884 - static void mixer_mgr_remove(struct exynos_drm_manager *mgr) 890 + static void mixer_ctx_remove(struct mixer_context *mixer_ctx) 885 891 { 886 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 887 - 888 892 if (is_drm_iommu_supported(mixer_ctx->drm_dev)) 889 893 drm_iommu_detach_device(mixer_ctx->drm_dev, mixer_ctx->dev); 890 894 } 891 895 892 - static int mixer_enable_vblank(struct exynos_drm_manager *mgr) 896 + static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) 893 897 { 894 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 898 + struct mixer_context *mixer_ctx = crtc->ctx; 895 899 struct mixer_resources *res = &mixer_ctx->mixer_res; 896 900 897 901 if (!mixer_ctx->powered) { ··· 904 912 return 0; 905 913 } 906 914 907 - static void mixer_disable_vblank(struct exynos_drm_manager *mgr) 915 + static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) 908 916 { 909 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 917 + struct mixer_context *mixer_ctx = crtc->ctx; 910 918 struct mixer_resources *res = &mixer_ctx->mixer_res; 911 919 912 920 /* disable vsync interrupt */ 913 921 mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC); 914 922 } 915 923 916 - static void mixer_win_mode_set(struct exynos_drm_manager *mgr, 924 + static void mixer_win_mode_set(struct exynos_drm_crtc *crtc, 917 925 struct exynos_drm_plane *plane) 918 926 { 919 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 927 + struct mixer_context *mixer_ctx = crtc->ctx; 920 928 struct hdmi_win_data *win_data; 921 929 int win; 922 930 ··· 965 973 win_data->scan_flags = plane->scan_flag; 966 974 } 967 975 968 - static void mixer_win_commit(struct exynos_drm_manager *mgr, int zpos) 976 + static void mixer_win_commit(struct exynos_drm_crtc *crtc, int zpos) 969 977 { 970 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 978 + struct mixer_context *mixer_ctx = crtc->ctx; 971 979 int win = zpos == DEFAULT_ZPOS ? MIXER_DEFAULT_WIN : zpos; 972 980 973 981 DRM_DEBUG_KMS("win: %d\n", win); ··· 987 995 mixer_ctx->win_data[win].enabled = true; 988 996 } 989 997 990 - static void mixer_win_disable(struct exynos_drm_manager *mgr, int zpos) 998 + static void mixer_win_disable(struct exynos_drm_crtc *crtc, int zpos) 991 999 { 992 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 1000 + struct mixer_context *mixer_ctx = crtc->ctx; 993 1001 struct mixer_resources *res = &mixer_ctx->mixer_res; 994 1002 int win = zpos == DEFAULT_ZPOS ? MIXER_DEFAULT_WIN : zpos; 995 1003 unsigned long flags; ··· 1015 1023 mixer_ctx->win_data[win].enabled = false; 1016 1024 } 1017 1025 1018 - static void mixer_wait_for_vblank(struct exynos_drm_manager *mgr) 1026 + static void mixer_wait_for_vblank(struct exynos_drm_crtc *crtc) 1019 1027 { 1020 - struct mixer_context *mixer_ctx = mgr_to_mixer(mgr); 1028 + struct mixer_context *mixer_ctx = crtc->ctx; 1021 1029 int err; 1022 1030 1023 1031 mutex_lock(&mixer_ctx->mixer_mutex); ··· 1027 1035 } 1028 1036 mutex_unlock(&mixer_ctx->mixer_mutex); 1029 1037 1030 - err = drm_vblank_get(mgr->crtc->dev, mixer_ctx->pipe); 1038 + err = drm_vblank_get(mixer_ctx->drm_dev, mixer_ctx->pipe); 1031 1039 if (err < 0) { 1032 1040 DRM_DEBUG_KMS("failed to acquire vblank counter\n"); 1033 1041 return; ··· 1044 1052 HZ/20)) 1045 1053 DRM_DEBUG_KMS("vblank wait timed out.\n"); 1046 1054 1047 - drm_vblank_put(mgr->crtc->dev, mixer_ctx->pipe); 1055 + drm_vblank_put(mixer_ctx->drm_dev, mixer_ctx->pipe); 1048 1056 } 1049 1057 1050 - static void mixer_window_suspend(struct exynos_drm_manager *mgr) 1058 + static void mixer_window_suspend(struct exynos_drm_crtc *crtc) 1051 1059 { 1052 - struct mixer_context *ctx = mgr_to_mixer(mgr); 1060 + struct mixer_context *ctx = crtc->ctx; 1053 1061 struct hdmi_win_data *win_data; 1054 1062 int i; 1055 1063 1056 1064 for (i = 0; i < MIXER_WIN_NR; i++) { 1057 1065 win_data = &ctx->win_data[i]; 1058 1066 win_data->resume = win_data->enabled; 1059 - mixer_win_disable(mgr, i); 1067 + mixer_win_disable(crtc, i); 1060 1068 } 1061 - mixer_wait_for_vblank(mgr); 1069 + mixer_wait_for_vblank(crtc); 1062 1070 } 1063 1071 1064 - static void mixer_window_resume(struct exynos_drm_manager *mgr) 1072 + static void mixer_window_resume(struct exynos_drm_crtc *crtc) 1065 1073 { 1066 - struct mixer_context *ctx = mgr_to_mixer(mgr); 1074 + struct mixer_context *ctx = crtc->ctx; 1067 1075 struct hdmi_win_data *win_data; 1068 1076 int i; 1069 1077 ··· 1072 1080 win_data->enabled = win_data->resume; 1073 1081 win_data->resume = false; 1074 1082 if (win_data->enabled) 1075 - mixer_win_commit(mgr, i); 1083 + mixer_win_commit(crtc, i); 1076 1084 } 1077 1085 } 1078 1086 1079 - static void mixer_poweron(struct exynos_drm_manager *mgr) 1087 + static void mixer_poweron(struct exynos_drm_crtc *crtc) 1080 1088 { 1081 - struct mixer_context *ctx = mgr_to_mixer(mgr); 1089 + struct mixer_context *ctx = crtc->ctx; 1082 1090 struct mixer_resources *res = &ctx->mixer_res; 1083 1091 1084 1092 mutex_lock(&ctx->mixer_mutex); ··· 1107 1115 mixer_reg_write(res, MXR_INT_EN, ctx->int_en); 1108 1116 mixer_win_reset(ctx); 1109 1117 1110 - mixer_window_resume(mgr); 1118 + mixer_window_resume(crtc); 1111 1119 } 1112 1120 1113 - static void mixer_poweroff(struct exynos_drm_manager *mgr) 1121 + static void mixer_poweroff(struct exynos_drm_crtc *crtc) 1114 1122 { 1115 - struct mixer_context *ctx = mgr_to_mixer(mgr); 1123 + struct mixer_context *ctx = crtc->ctx; 1116 1124 struct mixer_resources *res = &ctx->mixer_res; 1117 1125 1118 1126 mutex_lock(&ctx->mixer_mutex); ··· 1123 1131 mutex_unlock(&ctx->mixer_mutex); 1124 1132 1125 1133 mixer_stop(ctx); 1126 - mixer_window_suspend(mgr); 1134 + mixer_window_suspend(crtc); 1127 1135 1128 1136 ctx->int_en = mixer_reg_read(res, MXR_INT_EN); 1129 1137 ··· 1141 1149 pm_runtime_put_sync(ctx->dev); 1142 1150 } 1143 1151 1144 - static void mixer_dpms(struct exynos_drm_manager *mgr, int mode) 1152 + static void mixer_dpms(struct exynos_drm_crtc *crtc, int mode) 1145 1153 { 1146 1154 switch (mode) { 1147 1155 case DRM_MODE_DPMS_ON: 1148 - mixer_poweron(mgr); 1156 + mixer_poweron(crtc); 1149 1157 break; 1150 1158 case DRM_MODE_DPMS_STANDBY: 1151 1159 case DRM_MODE_DPMS_SUSPEND: 1152 1160 case DRM_MODE_DPMS_OFF: 1153 - mixer_poweroff(mgr); 1161 + mixer_poweroff(crtc); 1154 1162 break; 1155 1163 default: 1156 1164 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode); ··· 1178 1186 return -EINVAL; 1179 1187 } 1180 1188 1181 - static struct exynos_drm_manager_ops mixer_manager_ops = { 1189 + static struct exynos_drm_crtc_ops mixer_crtc_ops = { 1182 1190 .dpms = mixer_dpms, 1183 1191 .enable_vblank = mixer_enable_vblank, 1184 1192 .disable_vblank = mixer_disable_vblank, ··· 1249 1257 struct drm_device *drm_dev = data; 1250 1258 int ret; 1251 1259 1252 - ret = mixer_initialize(&ctx->manager, drm_dev); 1253 - if (ret) 1254 - return ret; 1255 - 1256 - ret = exynos_drm_crtc_create(&ctx->manager, drm_dev, ctx->pipe, 1257 - EXYNOS_DISPLAY_TYPE_HDMI); 1258 - if (ret) { 1259 - mixer_mgr_remove(&ctx->manager); 1260 - return ret; 1260 + ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe, 1261 + EXYNOS_DISPLAY_TYPE_HDMI, 1262 + &mixer_crtc_ops, ctx); 1263 + if (IS_ERR(ctx->crtc)) { 1264 + ret = PTR_ERR(ctx->crtc); 1265 + goto free_ctx; 1261 1266 } 1262 1267 1268 + ret = mixer_initialize(ctx, drm_dev); 1269 + if (ret) 1270 + goto free_ctx; 1271 + 1263 1272 return 0; 1273 + 1274 + free_ctx: 1275 + devm_kfree(dev, ctx); 1276 + return ret; 1264 1277 } 1265 1278 1266 1279 static void mixer_unbind(struct device *dev, struct device *master, void *data) 1267 1280 { 1268 1281 struct mixer_context *ctx = dev_get_drvdata(dev); 1269 1282 1270 - mixer_mgr_remove(&ctx->manager); 1283 + mixer_ctx_remove(ctx); 1271 1284 } 1272 1285 1273 1286 static const struct component_ops mixer_component_ops = { ··· 1294 1297 } 1295 1298 1296 1299 mutex_init(&ctx->mixer_mutex); 1297 - 1298 - ctx->manager.ops = &mixer_manager_ops; 1299 1300 1300 1301 if (dev->of_node) { 1301 1302 const struct of_device_id *match;