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

Configure Feed

Select the types of activity you want to include in your feed.

at v4.20-rc7 117 lines 3.1 kB view raw
1/* 2 * ARC PGU DRM driver. 3 * 4 * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com) 5 * 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. 9 * 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. 14 * 15 */ 16 17#include <drm/drm_crtc_helper.h> 18#include <drm/drm_atomic_helper.h> 19 20#include "arcpgu.h" 21 22#define XRES_DEF 640 23#define YRES_DEF 480 24 25#define XRES_MAX 8192 26#define YRES_MAX 8192 27 28 29struct arcpgu_drm_connector { 30 struct drm_connector connector; 31}; 32 33static int arcpgu_drm_connector_get_modes(struct drm_connector *connector) 34{ 35 int count; 36 37 count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX); 38 drm_set_preferred_mode(connector, XRES_DEF, YRES_DEF); 39 return count; 40} 41 42static void arcpgu_drm_connector_destroy(struct drm_connector *connector) 43{ 44 drm_connector_unregister(connector); 45 drm_connector_cleanup(connector); 46} 47 48static const struct drm_connector_helper_funcs 49arcpgu_drm_connector_helper_funcs = { 50 .get_modes = arcpgu_drm_connector_get_modes, 51}; 52 53static 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, 60}; 61 62static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = { 63 .destroy = drm_encoder_cleanup, 64}; 65 66int arcpgu_drm_sim_init(struct drm_device *drm, struct device_node *np) 67{ 68 struct arcpgu_drm_connector *arcpgu_connector; 69 struct drm_encoder *encoder; 70 struct drm_connector *connector; 71 int ret; 72 73 encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL); 74 if (encoder == NULL) 75 return -ENOMEM; 76 77 encoder->possible_crtcs = 1; 78 encoder->possible_clones = 0; 79 80 ret = drm_encoder_init(drm, encoder, &arcpgu_drm_encoder_funcs, 81 DRM_MODE_ENCODER_VIRTUAL, NULL); 82 if (ret) 83 return ret; 84 85 arcpgu_connector = devm_kzalloc(drm->dev, sizeof(*arcpgu_connector), 86 GFP_KERNEL); 87 if (!arcpgu_connector) { 88 ret = -ENOMEM; 89 goto error_encoder_cleanup; 90 } 91 92 connector = &arcpgu_connector->connector; 93 drm_connector_helper_add(connector, &arcpgu_drm_connector_helper_funcs); 94 95 ret = drm_connector_init(drm, connector, &arcpgu_drm_connector_funcs, 96 DRM_MODE_CONNECTOR_VIRTUAL); 97 if (ret < 0) { 98 dev_err(drm->dev, "failed to initialize drm connector\n"); 99 goto error_encoder_cleanup; 100 } 101 102 ret = drm_connector_attach_encoder(connector, encoder); 103 if (ret < 0) { 104 dev_err(drm->dev, "could not attach connector to encoder\n"); 105 drm_connector_unregister(connector); 106 goto error_connector_cleanup; 107 } 108 109 return 0; 110 111error_connector_cleanup: 112 drm_connector_cleanup(connector); 113 114error_encoder_cleanup: 115 drm_encoder_cleanup(encoder); 116 return ret; 117}