18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * ARC PGU DRM driver. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com) 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <drm/drm_bridge.h> 98c2ecf20Sopenharmony_ci#include <drm/drm_crtc.h> 108c2ecf20Sopenharmony_ci#include <drm/drm_encoder.h> 118c2ecf20Sopenharmony_ci#include <drm/drm_device.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "arcpgu.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic struct drm_encoder_funcs arcpgu_drm_encoder_funcs = { 168c2ecf20Sopenharmony_ci .destroy = drm_encoder_cleanup, 178c2ecf20Sopenharmony_ci}; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciint arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci struct drm_encoder *encoder; 228c2ecf20Sopenharmony_ci struct drm_bridge *bridge; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci int ret = 0; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL); 278c2ecf20Sopenharmony_ci if (encoder == NULL) 288c2ecf20Sopenharmony_ci return -ENOMEM; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci /* Locate drm bridge from the hdmi encoder DT node */ 318c2ecf20Sopenharmony_ci bridge = of_drm_find_bridge(np); 328c2ecf20Sopenharmony_ci if (!bridge) 338c2ecf20Sopenharmony_ci return -EPROBE_DEFER; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci encoder->possible_crtcs = 1; 368c2ecf20Sopenharmony_ci encoder->possible_clones = 0; 378c2ecf20Sopenharmony_ci ret = drm_encoder_init(drm, encoder, &arcpgu_drm_encoder_funcs, 388c2ecf20Sopenharmony_ci DRM_MODE_ENCODER_TMDS, NULL); 398c2ecf20Sopenharmony_ci if (ret) 408c2ecf20Sopenharmony_ci return ret; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci /* Link drm_bridge to encoder */ 438c2ecf20Sopenharmony_ci ret = drm_bridge_attach(encoder, bridge, NULL, 0); 448c2ecf20Sopenharmony_ci if (ret) 458c2ecf20Sopenharmony_ci drm_encoder_cleanup(encoder); 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci return ret; 488c2ecf20Sopenharmony_ci} 49