2 * rcar_du_kms.c -- R-Car Display Unit Mode Setting
4 * Copyright (C) 2013-2014 Renesas Electronics Corporation
6 * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
15 #include <drm/drm_atomic.h>
16 #include <drm/drm_atomic_helper.h>
17 #include <drm/drm_crtc.h>
18 #include <drm/drm_crtc_helper.h>
19 #include <drm/drm_fb_cma_helper.h>
20 #include <drm/drm_gem_cma_helper.h>
22 #include <linux/of_graph.h>
23 #include <linux/wait.h>
25 #include "rcar_du_crtc.h"
26 #include "rcar_du_drv.h"
27 #include "rcar_du_encoder.h"
28 #include "rcar_du_kms.h"
29 #include "rcar_du_lvdsenc.h"
30 #include "rcar_du_regs.h"
32 /* -----------------------------------------------------------------------------
36 static const struct rcar_du_format_info rcar_du_format_infos
[] = {
38 .fourcc
= DRM_FORMAT_RGB565
,
41 .pnmr
= PnMR_SPIM_TP
| PnMR_DDDF_16BPP
,
42 .edf
= PnDDCR4_EDF_NONE
,
44 .fourcc
= DRM_FORMAT_ARGB1555
,
47 .pnmr
= PnMR_SPIM_ALP
| PnMR_DDDF_ARGB
,
48 .edf
= PnDDCR4_EDF_NONE
,
50 .fourcc
= DRM_FORMAT_XRGB1555
,
53 .pnmr
= PnMR_SPIM_ALP
| PnMR_DDDF_ARGB
,
54 .edf
= PnDDCR4_EDF_NONE
,
56 .fourcc
= DRM_FORMAT_XRGB8888
,
59 .pnmr
= PnMR_SPIM_TP
| PnMR_DDDF_16BPP
,
60 .edf
= PnDDCR4_EDF_RGB888
,
62 .fourcc
= DRM_FORMAT_ARGB8888
,
65 .pnmr
= PnMR_SPIM_ALP
| PnMR_DDDF_16BPP
,
66 .edf
= PnDDCR4_EDF_ARGB8888
,
68 .fourcc
= DRM_FORMAT_UYVY
,
71 .pnmr
= PnMR_SPIM_TP_OFF
| PnMR_DDDF_YC
,
72 .edf
= PnDDCR4_EDF_NONE
,
74 .fourcc
= DRM_FORMAT_YUYV
,
77 .pnmr
= PnMR_SPIM_TP_OFF
| PnMR_DDDF_YC
,
78 .edf
= PnDDCR4_EDF_NONE
,
80 .fourcc
= DRM_FORMAT_NV12
,
83 .pnmr
= PnMR_SPIM_TP_OFF
| PnMR_DDDF_YC
,
84 .edf
= PnDDCR4_EDF_NONE
,
86 .fourcc
= DRM_FORMAT_NV21
,
89 .pnmr
= PnMR_SPIM_TP_OFF
| PnMR_DDDF_YC
,
90 .edf
= PnDDCR4_EDF_NONE
,
92 /* In YUV 4:2:2, only NV16 is supported (NV61 isn't) */
93 .fourcc
= DRM_FORMAT_NV16
,
96 .pnmr
= PnMR_SPIM_TP_OFF
| PnMR_DDDF_YC
,
97 .edf
= PnDDCR4_EDF_NONE
,
101 const struct rcar_du_format_info
*rcar_du_format_info(u32 fourcc
)
105 for (i
= 0; i
< ARRAY_SIZE(rcar_du_format_infos
); ++i
) {
106 if (rcar_du_format_infos
[i
].fourcc
== fourcc
)
107 return &rcar_du_format_infos
[i
];
113 /* -----------------------------------------------------------------------------
117 int rcar_du_dumb_create(struct drm_file
*file
, struct drm_device
*dev
,
118 struct drm_mode_create_dumb
*args
)
120 struct rcar_du_device
*rcdu
= dev
->dev_private
;
121 unsigned int min_pitch
= DIV_ROUND_UP(args
->width
* args
->bpp
, 8);
124 /* The R8A7779 DU requires a 16 pixels pitch alignment as documented,
125 * but the R8A7790 DU seems to require a 128 bytes pitch alignment.
127 if (rcar_du_needs(rcdu
, RCAR_DU_QUIRK_ALIGN_128B
))
130 align
= 16 * args
->bpp
/ 8;
132 args
->pitch
= roundup(min_pitch
, align
);
134 return drm_gem_cma_dumb_create_internal(file
, dev
, args
);
137 static struct drm_framebuffer
*
138 rcar_du_fb_create(struct drm_device
*dev
, struct drm_file
*file_priv
,
139 struct drm_mode_fb_cmd2
*mode_cmd
)
141 struct rcar_du_device
*rcdu
= dev
->dev_private
;
142 const struct rcar_du_format_info
*format
;
143 unsigned int max_pitch
;
147 format
= rcar_du_format_info(mode_cmd
->pixel_format
);
148 if (format
== NULL
) {
149 dev_dbg(dev
->dev
, "unsupported pixel format %08x\n",
150 mode_cmd
->pixel_format
);
151 return ERR_PTR(-EINVAL
);
155 * The pitch and alignment constraints are expressed in pixels on the
156 * hardware side and in bytes in the DRM API.
158 bpp
= format
->planes
== 2 ? 1 : format
->bpp
/ 8;
159 max_pitch
= 4096 * bpp
;
161 if (rcar_du_needs(rcdu
, RCAR_DU_QUIRK_ALIGN_128B
))
166 if (mode_cmd
->pitches
[0] & (align
- 1) ||
167 mode_cmd
->pitches
[0] >= max_pitch
) {
168 dev_dbg(dev
->dev
, "invalid pitch value %u\n",
169 mode_cmd
->pitches
[0]);
170 return ERR_PTR(-EINVAL
);
173 if (format
->planes
== 2) {
174 if (mode_cmd
->pitches
[1] != mode_cmd
->pitches
[0]) {
176 "luma and chroma pitches do not match\n");
177 return ERR_PTR(-EINVAL
);
181 return drm_fb_cma_create(dev
, file_priv
, mode_cmd
);
184 static void rcar_du_output_poll_changed(struct drm_device
*dev
)
186 struct rcar_du_device
*rcdu
= dev
->dev_private
;
188 drm_fbdev_cma_hotplug_event(rcdu
->fbdev
);
191 /* -----------------------------------------------------------------------------
192 * Atomic Check and Update
196 * Atomic hardware plane allocator
198 * The hardware plane allocator is solely based on the atomic plane states
199 * without keeping any external state to avoid races between .atomic_check()
200 * and .atomic_commit().
202 * The core idea is to avoid using a free planes bitmask that would need to be
203 * shared between check and commit handlers with a collective knowledge based on
204 * the allocated hardware plane(s) for each KMS plane. The allocator then loops
205 * over all plane states to compute the free planes bitmask, allocates hardware
206 * planes based on that bitmask, and stores the result back in the plane states.
208 * For this to work we need to access the current state of planes not touched by
209 * the atomic update. To ensure that it won't be modified, we need to lock all
210 * planes using drm_atomic_get_plane_state(). This effectively serializes atomic
211 * updates from .atomic_check() up to completion (when swapping the states if
212 * the check step has succeeded) or rollback (when freeing the states if the
213 * check step has failed).
215 * Allocation is performed in the .atomic_check() handler and applied
216 * automatically when the core swaps the old and new states.
219 static bool rcar_du_plane_needs_realloc(struct rcar_du_plane
*plane
,
220 struct rcar_du_plane_state
*state
)
222 const struct rcar_du_format_info
*cur_format
;
224 cur_format
= to_rcar_plane_state(plane
->plane
.state
)->format
;
226 /* Lowering the number of planes doesn't strictly require reallocation
227 * as the extra hardware plane will be freed when committing, but doing
228 * so could lead to more fragmentation.
230 return !cur_format
|| cur_format
->planes
!= state
->format
->planes
;
233 static unsigned int rcar_du_plane_hwmask(struct rcar_du_plane_state
*state
)
237 if (state
->hwindex
== -1)
240 mask
= 1 << state
->hwindex
;
241 if (state
->format
->planes
== 2)
242 mask
|= 1 << ((state
->hwindex
+ 1) % 8);
247 static int rcar_du_plane_hwalloc(unsigned int num_planes
, unsigned int free
)
251 for (i
= 0; i
< RCAR_DU_NUM_HW_PLANES
; ++i
) {
252 if (!(free
& (1 << i
)))
255 if (num_planes
== 1 || free
& (1 << ((i
+ 1) % 8)))
259 return i
== RCAR_DU_NUM_HW_PLANES
? -EBUSY
: i
;
262 static int rcar_du_atomic_check(struct drm_device
*dev
,
263 struct drm_atomic_state
*state
)
265 struct rcar_du_device
*rcdu
= dev
->dev_private
;
266 unsigned int group_freed_planes
[RCAR_DU_MAX_GROUPS
] = { 0, };
267 unsigned int group_free_planes
[RCAR_DU_MAX_GROUPS
] = { 0, };
268 bool needs_realloc
= false;
269 unsigned int groups
= 0;
273 ret
= drm_atomic_helper_check(dev
, state
);
277 /* Check if hardware planes need to be reallocated. */
278 for (i
= 0; i
< dev
->mode_config
.num_total_plane
; ++i
) {
279 struct rcar_du_plane_state
*plane_state
;
280 struct rcar_du_plane
*plane
;
283 if (!state
->planes
[i
])
286 plane
= to_rcar_plane(state
->planes
[i
]);
287 plane_state
= to_rcar_plane_state(state
->plane_states
[i
]);
289 dev_dbg(rcdu
->dev
, "%s: checking plane (%u,%u)\n", __func__
,
290 plane
->group
->index
, plane
- plane
->group
->planes
);
292 /* If the plane is being disabled we don't need to go through
293 * the full reallocation procedure. Just mark the hardware
296 if (!plane_state
->format
) {
297 dev_dbg(rcdu
->dev
, "%s: plane is being disabled\n",
299 index
= plane
- plane
->group
->planes
;
300 group_freed_planes
[plane
->group
->index
] |= 1 << index
;
301 plane_state
->hwindex
= -1;
305 /* If the plane needs to be reallocated mark it as such, and
306 * mark the hardware plane(s) as free.
308 if (rcar_du_plane_needs_realloc(plane
, plane_state
)) {
309 dev_dbg(rcdu
->dev
, "%s: plane needs reallocation\n",
311 groups
|= 1 << plane
->group
->index
;
312 needs_realloc
= true;
314 index
= plane
- plane
->group
->planes
;
315 group_freed_planes
[plane
->group
->index
] |= 1 << index
;
316 plane_state
->hwindex
= -1;
323 /* Grab all plane states for the groups that need reallocation to ensure
324 * locking and avoid racy updates. This serializes the update operation,
325 * but there's not much we can do about it as that's the hardware
328 * Compute the used planes mask for each group at the same time to avoid
329 * looping over the planes separately later.
332 unsigned int index
= ffs(groups
) - 1;
333 struct rcar_du_group
*group
= &rcdu
->groups
[index
];
334 unsigned int used_planes
= 0;
336 dev_dbg(rcdu
->dev
, "%s: finding free planes for group %u\n",
339 for (i
= 0; i
< group
->num_planes
; ++i
) {
340 struct rcar_du_plane
*plane
= &group
->planes
[i
];
341 struct rcar_du_plane_state
*plane_state
;
342 struct drm_plane_state
*s
;
344 s
= drm_atomic_get_plane_state(state
, &plane
->plane
);
348 /* If the plane has been freed in the above loop its
349 * hardware planes must not be added to the used planes
350 * bitmask. However, the current state doesn't reflect
351 * the free state yet, as we've modified the new state
352 * above. Use the local freed planes list to check for
353 * that condition instead.
355 if (group_freed_planes
[index
] & (1 << i
)) {
357 "%s: plane (%u,%u) has been freed, skipping\n",
358 __func__
, plane
->group
->index
,
359 plane
- plane
->group
->planes
);
363 plane_state
= to_rcar_plane_state(plane
->plane
.state
);
364 used_planes
|= rcar_du_plane_hwmask(plane_state
);
367 "%s: plane (%u,%u) uses %u hwplanes (index %d)\n",
368 __func__
, plane
->group
->index
,
369 plane
- plane
->group
->planes
,
370 plane_state
->format
?
371 plane_state
->format
->planes
: 0,
372 plane_state
->hwindex
);
375 group_free_planes
[index
] = 0xff & ~used_planes
;
376 groups
&= ~(1 << index
);
378 dev_dbg(rcdu
->dev
, "%s: group %u free planes mask 0x%02x\n",
379 __func__
, index
, group_free_planes
[index
]);
382 /* Reallocate hardware planes for each plane that needs it. */
383 for (i
= 0; i
< dev
->mode_config
.num_total_plane
; ++i
) {
384 struct rcar_du_plane_state
*plane_state
;
385 struct rcar_du_plane
*plane
;
386 unsigned int crtc_planes
;
390 if (!state
->planes
[i
])
393 plane
= to_rcar_plane(state
->planes
[i
]);
394 plane_state
= to_rcar_plane_state(state
->plane_states
[i
]);
396 dev_dbg(rcdu
->dev
, "%s: allocating plane (%u,%u)\n", __func__
,
397 plane
->group
->index
, plane
- plane
->group
->planes
);
399 /* Skip planes that are being disabled or don't need to be
402 if (!plane_state
->format
||
403 !rcar_du_plane_needs_realloc(plane
, plane_state
))
406 /* Try to allocate the plane from the free planes currently
407 * associated with the target CRTC to avoid restarting the CRTC
408 * group and thus minimize flicker. If it fails fall back to
409 * allocating from all free planes.
411 crtc_planes
= to_rcar_crtc(plane_state
->state
.crtc
)->index
% 2
412 ? plane
->group
->dptsr_planes
413 : ~plane
->group
->dptsr_planes
;
414 free
= group_free_planes
[plane
->group
->index
];
416 idx
= rcar_du_plane_hwalloc(plane_state
->format
->planes
,
419 idx
= rcar_du_plane_hwalloc(plane_state
->format
->planes
,
422 dev_dbg(rcdu
->dev
, "%s: no available hardware plane\n",
427 dev_dbg(rcdu
->dev
, "%s: allocated %u hwplanes (index %u)\n",
428 __func__
, plane_state
->format
->planes
, idx
);
430 plane_state
->hwindex
= idx
;
432 group_free_planes
[plane
->group
->index
] &=
433 ~rcar_du_plane_hwmask(plane_state
);
435 dev_dbg(rcdu
->dev
, "%s: group %u free planes mask 0x%02x\n",
436 __func__
, plane
->group
->index
,
437 group_free_planes
[plane
->group
->index
]);
443 struct rcar_du_commit
{
444 struct work_struct work
;
445 struct drm_device
*dev
;
446 struct drm_atomic_state
*state
;
450 static void rcar_du_atomic_complete(struct rcar_du_commit
*commit
)
452 struct drm_device
*dev
= commit
->dev
;
453 struct rcar_du_device
*rcdu
= dev
->dev_private
;
454 struct drm_atomic_state
*old_state
= commit
->state
;
456 /* Apply the atomic update. */
457 drm_atomic_helper_commit_modeset_disables(dev
, old_state
);
458 drm_atomic_helper_commit_modeset_enables(dev
, old_state
);
459 drm_atomic_helper_commit_planes(dev
, old_state
, false);
461 drm_atomic_helper_wait_for_vblanks(dev
, old_state
);
463 drm_atomic_helper_cleanup_planes(dev
, old_state
);
465 drm_atomic_state_free(old_state
);
467 /* Complete the commit, wake up any waiter. */
468 spin_lock(&rcdu
->commit
.wait
.lock
);
469 rcdu
->commit
.pending
&= ~commit
->crtcs
;
470 wake_up_all_locked(&rcdu
->commit
.wait
);
471 spin_unlock(&rcdu
->commit
.wait
.lock
);
476 static void rcar_du_atomic_work(struct work_struct
*work
)
478 struct rcar_du_commit
*commit
=
479 container_of(work
, struct rcar_du_commit
, work
);
481 rcar_du_atomic_complete(commit
);
484 static int rcar_du_atomic_commit(struct drm_device
*dev
,
485 struct drm_atomic_state
*state
, bool async
)
487 struct rcar_du_device
*rcdu
= dev
->dev_private
;
488 struct rcar_du_commit
*commit
;
492 ret
= drm_atomic_helper_prepare_planes(dev
, state
);
496 /* Allocate the commit object. */
497 commit
= kzalloc(sizeof(*commit
), GFP_KERNEL
);
498 if (commit
== NULL
) {
503 INIT_WORK(&commit
->work
, rcar_du_atomic_work
);
505 commit
->state
= state
;
507 /* Wait until all affected CRTCs have completed previous commits and
508 * mark them as pending.
510 for (i
= 0; i
< dev
->mode_config
.num_crtc
; ++i
) {
512 commit
->crtcs
|= 1 << drm_crtc_index(state
->crtcs
[i
]);
515 spin_lock(&rcdu
->commit
.wait
.lock
);
516 ret
= wait_event_interruptible_locked(rcdu
->commit
.wait
,
517 !(rcdu
->commit
.pending
& commit
->crtcs
));
519 rcdu
->commit
.pending
|= commit
->crtcs
;
520 spin_unlock(&rcdu
->commit
.wait
.lock
);
527 /* Swap the state, this is the point of no return. */
528 drm_atomic_helper_swap_state(dev
, state
);
531 schedule_work(&commit
->work
);
533 rcar_du_atomic_complete(commit
);
538 drm_atomic_helper_cleanup_planes(dev
, state
);
542 /* -----------------------------------------------------------------------------
546 static const struct drm_mode_config_funcs rcar_du_mode_config_funcs
= {
547 .fb_create
= rcar_du_fb_create
,
548 .output_poll_changed
= rcar_du_output_poll_changed
,
549 .atomic_check
= rcar_du_atomic_check
,
550 .atomic_commit
= rcar_du_atomic_commit
,
553 static int rcar_du_encoders_init_one(struct rcar_du_device
*rcdu
,
554 enum rcar_du_output output
,
555 struct of_endpoint
*ep
)
557 static const struct {
558 const char *compatible
;
559 enum rcar_du_encoder_type type
;
561 { "adi,adv7123", RCAR_DU_ENCODER_VGA
},
562 { "adi,adv7511w", RCAR_DU_ENCODER_HDMI
},
563 { "thine,thc63lvdm83d", RCAR_DU_ENCODER_LVDS
},
566 enum rcar_du_encoder_type enc_type
= RCAR_DU_ENCODER_NONE
;
567 struct device_node
*connector
= NULL
;
568 struct device_node
*encoder
= NULL
;
569 struct device_node
*ep_node
= NULL
;
570 struct device_node
*entity_ep_node
;
571 struct device_node
*entity
;
575 * Locate the connected entity and infer its type from the number of
578 entity
= of_graph_get_remote_port_parent(ep
->local_node
);
580 dev_dbg(rcdu
->dev
, "unconnected endpoint %s, skipping\n",
581 ep
->local_node
->full_name
);
585 entity_ep_node
= of_parse_phandle(ep
->local_node
, "remote-endpoint", 0);
587 for_each_endpoint_of_node(entity
, ep_node
) {
588 if (ep_node
== entity_ep_node
)
592 * We've found one endpoint other than the input, this must
593 * be an encoder. Locate the connector.
596 connector
= of_graph_get_remote_port_parent(ep_node
);
597 of_node_put(ep_node
);
601 "no connector for encoder %s, skipping\n",
603 of_node_put(entity_ep_node
);
604 of_node_put(encoder
);
611 of_node_put(entity_ep_node
);
615 * If an encoder has been found, get its type based on its
620 for (i
= 0; i
< ARRAY_SIZE(encoders
); ++i
) {
621 if (of_device_is_compatible(encoder
,
622 encoders
[i
].compatible
)) {
623 enc_type
= encoders
[i
].type
;
628 if (i
== ARRAY_SIZE(encoders
)) {
630 "unknown encoder type for %s, skipping\n",
632 of_node_put(encoder
);
633 of_node_put(connector
);
638 * If no encoder has been found the entity must be the
644 ret
= rcar_du_encoder_init(rcdu
, enc_type
, output
, encoder
, connector
);
645 of_node_put(encoder
);
646 of_node_put(connector
);
648 if (ret
&& ret
!= -EPROBE_DEFER
)
650 "failed to initialize encoder %s (%d), skipping\n",
651 encoder
->full_name
, ret
);
656 static int rcar_du_encoders_init(struct rcar_du_device
*rcdu
)
658 struct device_node
*np
= rcdu
->dev
->of_node
;
659 struct device_node
*ep_node
;
660 unsigned int num_encoders
= 0;
663 * Iterate over the endpoints and create one encoder for each output
666 for_each_endpoint_of_node(np
, ep_node
) {
667 enum rcar_du_output output
;
668 struct of_endpoint ep
;
672 ret
= of_graph_parse_endpoint(ep_node
, &ep
);
674 of_node_put(ep_node
);
678 /* Find the output route corresponding to the port number. */
679 for (i
= 0; i
< RCAR_DU_OUTPUT_MAX
; ++i
) {
680 if (rcdu
->info
->routes
[i
].possible_crtcs
&&
681 rcdu
->info
->routes
[i
].port
== ep
.port
) {
687 if (i
== RCAR_DU_OUTPUT_MAX
) {
689 "port %u references unexisting output, skipping\n",
694 /* Process the output pipeline. */
695 ret
= rcar_du_encoders_init_one(rcdu
, output
, &ep
);
697 if (ret
== -EPROBE_DEFER
) {
698 of_node_put(ep_node
);
711 static int rcar_du_properties_init(struct rcar_du_device
*rcdu
)
714 drm_property_create_range(rcdu
->ddev
, 0, "alpha", 0, 255);
715 if (rcdu
->props
.alpha
== NULL
)
718 /* The color key is expressed as an RGB888 triplet stored in a 32-bit
719 * integer in XRGB8888 format. Bit 24 is used as a flag to disable (0)
720 * or enable source color keying (1).
722 rcdu
->props
.colorkey
=
723 drm_property_create_range(rcdu
->ddev
, 0, "colorkey",
725 if (rcdu
->props
.colorkey
== NULL
)
729 drm_property_create_range(rcdu
->ddev
, 0, "zpos", 1, 7);
730 if (rcdu
->props
.zpos
== NULL
)
736 int rcar_du_modeset_init(struct rcar_du_device
*rcdu
)
738 static const unsigned int mmio_offsets
[] = {
739 DU0_REG_OFFSET
, DU2_REG_OFFSET
742 struct drm_device
*dev
= rcdu
->ddev
;
743 struct drm_encoder
*encoder
;
744 struct drm_fbdev_cma
*fbdev
;
745 unsigned int num_encoders
;
746 unsigned int num_groups
;
750 drm_mode_config_init(dev
);
752 dev
->mode_config
.min_width
= 0;
753 dev
->mode_config
.min_height
= 0;
754 dev
->mode_config
.max_width
= 4095;
755 dev
->mode_config
.max_height
= 2047;
756 dev
->mode_config
.funcs
= &rcar_du_mode_config_funcs
;
758 rcdu
->num_crtcs
= rcdu
->info
->num_crtcs
;
760 ret
= rcar_du_properties_init(rcdu
);
764 /* Initialize the groups. */
765 num_groups
= DIV_ROUND_UP(rcdu
->num_crtcs
, 2);
767 for (i
= 0; i
< num_groups
; ++i
) {
768 struct rcar_du_group
*rgrp
= &rcdu
->groups
[i
];
770 mutex_init(&rgrp
->lock
);
773 rgrp
->mmio_offset
= mmio_offsets
[i
];
775 rgrp
->num_crtcs
= min(rcdu
->num_crtcs
- 2 * i
, 2U);
777 /* If we have more than one CRTCs in this group pre-associate
778 * planes 0-3 with CRTC 0 and planes 4-7 with CRTC 1 to minimize
779 * flicker occurring when the association is changed.
781 rgrp
->dptsr_planes
= rgrp
->num_crtcs
> 1 ? 0xf0 : 0;
783 ret
= rcar_du_planes_init(rgrp
);
788 /* Create the CRTCs. */
789 for (i
= 0; i
< rcdu
->num_crtcs
; ++i
) {
790 struct rcar_du_group
*rgrp
= &rcdu
->groups
[i
/ 2];
792 ret
= rcar_du_crtc_create(rgrp
, i
);
797 /* Initialize the encoders. */
798 ret
= rcar_du_lvdsenc_init(rcdu
);
802 ret
= rcar_du_encoders_init(rcdu
);
807 dev_err(rcdu
->dev
, "error: no encoder could be initialized\n");
813 /* Set the possible CRTCs and possible clones. There's always at least
814 * one way for all encoders to clone each other, set all bits in the
815 * possible clones field.
817 list_for_each_entry(encoder
, &dev
->mode_config
.encoder_list
, head
) {
818 struct rcar_du_encoder
*renc
= to_rcar_encoder(encoder
);
819 const struct rcar_du_output_routing
*route
=
820 &rcdu
->info
->routes
[renc
->output
];
822 encoder
->possible_crtcs
= route
->possible_crtcs
;
823 encoder
->possible_clones
= (1 << num_encoders
) - 1;
826 drm_mode_config_reset(dev
);
828 drm_kms_helper_poll_init(dev
);
830 if (dev
->mode_config
.num_connector
) {
831 fbdev
= drm_fbdev_cma_init(dev
, 32, dev
->mode_config
.num_crtc
,
832 dev
->mode_config
.num_connector
);
834 return PTR_ERR(fbdev
);
839 "no connector found, disabling fbdev emulation\n");