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_atomic_helper.h>
29 struct arcpgu_drm_connector
{
30 struct drm_connector connector
;
33 static int arcpgu_drm_connector_get_modes(struct drm_connector
*connector
)
37 count
= drm_add_modes_noedid(connector
, XRES_MAX
, YRES_MAX
);
38 drm_set_preferred_mode(connector
, XRES_DEF
, YRES_DEF
);
42 static void arcpgu_drm_connector_destroy(struct drm_connector
*connector
)
44 drm_connector_unregister(connector
);
45 drm_connector_cleanup(connector
);
48 static const struct drm_connector_helper_funcs
49 arcpgu_drm_connector_helper_funcs
= {
50 .get_modes
= arcpgu_drm_connector_get_modes
,
53 static const struct drm_connector_funcs arcpgu_drm_connector_funcs
= {
54 .dpms
= drm_helper_connector_dpms
,
55 .reset
= drm_atomic_helper_connector_reset
,
56 .fill_modes
= drm_helper_probe_single_connector_modes
,
57 .destroy
= arcpgu_drm_connector_destroy
,
58 .atomic_duplicate_state
= drm_atomic_helper_connector_duplicate_state
,
59 .atomic_destroy_state
= drm_atomic_helper_connector_destroy_state
,
62 static struct drm_encoder_funcs arcpgu_drm_encoder_funcs
= {
63 .destroy
= drm_encoder_cleanup
,
66 int arcpgu_drm_sim_init(struct drm_device
*drm
, struct device_node
*np
)
68 struct arcpgu_drm_connector
*arcpgu_connector
;
69 struct drm_encoder
*encoder
;
70 struct drm_connector
*connector
;
73 encoder
= devm_kzalloc(drm
->dev
, sizeof(*encoder
), GFP_KERNEL
);
77 encoder
->possible_crtcs
= 1;
78 encoder
->possible_clones
= 0;
80 ret
= drm_encoder_init(drm
, encoder
, &arcpgu_drm_encoder_funcs
,
81 DRM_MODE_ENCODER_VIRTUAL
, NULL
);
85 arcpgu_connector
= devm_kzalloc(drm
->dev
, sizeof(*arcpgu_connector
),
87 if (!arcpgu_connector
) {
89 goto error_encoder_cleanup
;
92 connector
= &arcpgu_connector
->connector
;
93 drm_connector_helper_add(connector
, &arcpgu_drm_connector_helper_funcs
);
95 ret
= drm_connector_init(drm
, connector
, &arcpgu_drm_connector_funcs
,
96 DRM_MODE_CONNECTOR_VIRTUAL
);
98 dev_err(drm
->dev
, "failed to initialize drm connector\n");
99 goto error_encoder_cleanup
;
102 ret
= drm_connector_attach_encoder(connector
, encoder
);
104 dev_err(drm
->dev
, "could not attach connector to encoder\n");
105 drm_connector_unregister(connector
);
106 goto error_connector_cleanup
;
111 error_connector_cleanup
:
112 drm_connector_cleanup(connector
);
114 error_encoder_cleanup
:
115 drm_encoder_cleanup(encoder
);