mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
3bb80f2495
Instead of linking encoders and bridges in every driver (and getting it wrong half of the time, as many drivers forget to set the drm_bridge encoder pointer), do so in core code. The drm_bridge_attach() function needs the encoder and optional previous bridge to perform that task, update all the callers. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Acked-by: Stefan Agner <stefan@agner.ch> # For DCU Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> # For atmel-hlcdc Acked-by: Vincent Abriou <vincent.abriou@st.com> # For STI Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> # For sun4i Acked-by: Xinliang Liu <z.liuxinliang@hisilicon.com> # For hisilicon Acked-by: Jyri Sarha <jsarha@ti.com> # For tilcdc Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Archit Taneja <architt@codeaurora.org> Link: http://patchwork.freedesktop.org/patch/msgid/1481709550-29226-4-git-send-email-laurent.pinchart+renesas@ideasonboard.com
56 lines
1.4 KiB
C
56 lines
1.4 KiB
C
/*
|
|
* ARC PGU DRM driver.
|
|
*
|
|
* Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
|
|
#include <drm/drm_crtc.h>
|
|
#include <drm/drm_encoder_slave.h>
|
|
|
|
#include "arcpgu.h"
|
|
|
|
static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = {
|
|
.destroy = drm_encoder_cleanup,
|
|
};
|
|
|
|
int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
|
|
{
|
|
struct drm_encoder *encoder;
|
|
struct drm_bridge *bridge;
|
|
|
|
int ret = 0;
|
|
|
|
encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL);
|
|
if (encoder == NULL)
|
|
return -ENOMEM;
|
|
|
|
/* Locate drm bridge from the hdmi encoder DT node */
|
|
bridge = of_drm_find_bridge(np);
|
|
if (!bridge)
|
|
return -EPROBE_DEFER;
|
|
|
|
encoder->possible_crtcs = 1;
|
|
encoder->possible_clones = 0;
|
|
ret = drm_encoder_init(drm, encoder, &arcpgu_drm_encoder_funcs,
|
|
DRM_MODE_ENCODER_TMDS, NULL);
|
|
if (ret)
|
|
return ret;
|
|
|
|
/* Link drm_bridge to encoder */
|
|
ret = drm_bridge_attach(encoder, bridge, NULL);
|
|
if (ret)
|
|
drm_encoder_cleanup(encoder);
|
|
|
|
return ret;
|
|
}
|