4 * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
17 #include <drm/drm_crtc_helper.h>
18 #include <drm/drm_encoder_slave.h>
19 #include <drm/drm_atomic_helper.h>
30 struct arcpgu_drm_connector
{
31 struct drm_connector connector
;
32 struct drm_encoder_slave
*encoder_slave
;
35 static int arcpgu_drm_connector_get_modes(struct drm_connector
*connector
)
39 count
= drm_add_modes_noedid(connector
, XRES_MAX
, YRES_MAX
);
40 drm_set_preferred_mode(connector
, XRES_DEF
, YRES_DEF
);
44 static void arcpgu_drm_connector_destroy(struct drm_connector
*connector
)
46 drm_connector_unregister(connector
);
47 drm_connector_cleanup(connector
);
50 static const struct drm_connector_helper_funcs
51 arcpgu_drm_connector_helper_funcs
= {
52 .get_modes
= arcpgu_drm_connector_get_modes
,
55 static const struct drm_connector_funcs arcpgu_drm_connector_funcs
= {
56 .dpms
= drm_helper_connector_dpms
,
57 .reset
= drm_atomic_helper_connector_reset
,
58 .fill_modes
= drm_helper_probe_single_connector_modes
,
59 .destroy
= arcpgu_drm_connector_destroy
,
60 .atomic_duplicate_state
= drm_atomic_helper_connector_duplicate_state
,
61 .atomic_destroy_state
= drm_atomic_helper_connector_destroy_state
,
64 static struct drm_encoder_funcs arcpgu_drm_encoder_funcs
= {
65 .destroy
= drm_encoder_cleanup
,
68 int arcpgu_drm_sim_init(struct drm_device
*drm
, struct device_node
*np
)
70 struct arcpgu_drm_connector
*arcpgu_connector
;
71 struct drm_encoder_slave
*encoder
;
72 struct drm_connector
*connector
;
75 encoder
= devm_kzalloc(drm
->dev
, sizeof(*encoder
), GFP_KERNEL
);
79 encoder
->base
.possible_crtcs
= 1;
80 encoder
->base
.possible_clones
= 0;
82 ret
= drm_encoder_init(drm
, &encoder
->base
, &arcpgu_drm_encoder_funcs
,
83 DRM_MODE_ENCODER_VIRTUAL
, NULL
);
87 arcpgu_connector
= devm_kzalloc(drm
->dev
, sizeof(*arcpgu_connector
),
89 if (!arcpgu_connector
) {
91 goto error_encoder_cleanup
;
94 connector
= &arcpgu_connector
->connector
;
95 drm_connector_helper_add(connector
, &arcpgu_drm_connector_helper_funcs
);
97 ret
= drm_connector_init(drm
, connector
, &arcpgu_drm_connector_funcs
,
98 DRM_MODE_CONNECTOR_VIRTUAL
);
100 dev_err(drm
->dev
, "failed to initialize drm connector\n");
101 goto error_encoder_cleanup
;
104 ret
= drm_mode_connector_attach_encoder(connector
, &encoder
->base
);
106 dev_err(drm
->dev
, "could not attach connector to encoder\n");
107 drm_connector_unregister(connector
);
108 goto error_connector_cleanup
;
111 arcpgu_connector
->encoder_slave
= encoder
;
115 error_connector_cleanup
:
116 drm_connector_cleanup(connector
);
118 error_encoder_cleanup
:
119 drm_encoder_cleanup(&encoder
->base
);