1 // SPDX-License-Identifier: GPL-2.0
3 * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
4 * Author: James.Qian.Wang <james.qian.wang@arm.com>
8 #include <linux/spinlock.h>
9 #include <drm/drm_atomic.h>
10 #include <drm/drm_atomic_helper.h>
11 #include <drm/drm_plane_helper.h>
12 #include <drm/drm_crtc_helper.h>
13 #include <linux/pm_runtime.h>
14 #include "komeda_dev.h"
15 #include "komeda_kms.h"
17 struct drm_crtc_helper_funcs komeda_crtc_helper_funcs
= {
20 static const struct drm_crtc_funcs komeda_crtc_funcs
= {
23 int komeda_kms_setup_crtcs(struct komeda_kms_dev
*kms
,
24 struct komeda_dev
*mdev
)
26 struct komeda_crtc
*crtc
;
27 struct komeda_pipeline
*master
;
33 for (i
= 0; i
< mdev
->n_pipelines
; i
++) {
34 crtc
= &kms
->crtcs
[kms
->n_crtcs
];
35 master
= mdev
->pipelines
[i
];
37 crtc
->master
= master
;
41 sprintf(str
, "pipe-%d", crtc
->slave
->id
);
45 DRM_INFO("crtc%d: master(pipe-%d) slave(%s) output: %s.\n",
46 kms
->n_crtcs
, master
->id
, str
,
47 master
->of_output_dev
?
48 master
->of_output_dev
->full_name
: "None");
56 static struct drm_plane
*
57 get_crtc_primary(struct komeda_kms_dev
*kms
, struct komeda_crtc
*crtc
)
59 struct komeda_plane
*kplane
;
60 struct drm_plane
*plane
;
62 drm_for_each_plane(plane
, &kms
->base
) {
63 if (plane
->type
!= DRM_PLANE_TYPE_PRIMARY
)
66 kplane
= to_kplane(plane
);
67 /* only master can be primary */
68 if (kplane
->layer
->base
.pipeline
== crtc
->master
)
75 static int komeda_crtc_add(struct komeda_kms_dev
*kms
,
76 struct komeda_crtc
*kcrtc
)
78 struct drm_crtc
*crtc
= &kcrtc
->base
;
81 err
= drm_crtc_init_with_planes(&kms
->base
, crtc
,
82 get_crtc_primary(kms
, kcrtc
), NULL
,
83 &komeda_crtc_funcs
, NULL
);
87 drm_crtc_helper_add(crtc
, &komeda_crtc_helper_funcs
);
88 drm_crtc_vblank_reset(crtc
);
90 crtc
->port
= kcrtc
->master
->of_output_port
;
95 int komeda_kms_add_crtcs(struct komeda_kms_dev
*kms
, struct komeda_dev
*mdev
)
99 for (i
= 0; i
< kms
->n_crtcs
; i
++) {
100 err
= komeda_crtc_add(kms
, &kms
->crtcs
[i
]);