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