[PATCH 1/2] drm/fsl-dcu: Add HDMI driver for freescale DCU

Meng Yi meng.yi at nxp.com
Mon May 16 13:56:43 UTC 2016


Hi Boris,

On Monday, May 16, 2016 8:45 PM 
Boris Brezillon <boris.brezillon at free-electrons.com> wrote:
> 
> Hi Meng,
> 
> On Sun, 15 May 2016 16:34:44 +0800
> Meng Yi <meng.yi at nxp.com> wrote:
> 
> > This driver add the basic functions for Encoder, and link the Encoder
> > to appropriate DRM bridge.
> > This driver is depend on sii9022 driver(drm_bridge approach),which is
> > sent by Boris Brezillon to community but not merged.
> > https://patchwork.kernel.org/patch/8600921/
> 
> Not sure I understand why it depends on the sii902x driver I posted.
> The code I see here seems capable of interfacing with any kind of drm_bridge,
> not only the sii9022 one.
> 
Yes,  The code here is capable of interfacing with any kind of drm_bridge, now we are using 
Ls1021a-twr(using sii9022a as transmitter) to test the code, maybe I should change the comments.

> >
> > Signed-off-by: Alison Wang <alison.wang at nxp.com>
> > Signed-off-by: Xiubo Li <lixiubo at cmss.chinamobile.com>
> > Signed-off-by: Jianwei Wang <jianwei.wang.chn at gmail.com>
> > Signed-off-by: Meng Yi <meng.yi at nxp.com>
> > ---
> >  drivers/gpu/drm/fsl-dcu/Makefile             |   1 +
> >  drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_hdmi.c   | 194
> +++++++++++++++++++++++++++
> >  drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.c    |  29 ++++
> >  drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_output.h |   4 +
> >  4 files changed, 228 insertions(+)
> >  create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_hdmi.c
> >
> > diff --git a/drivers/gpu/drm/fsl-dcu/Makefile
> > b/drivers/gpu/drm/fsl-dcu/Makefile
> > index b35a292..12e2245 100644
> > --- a/drivers/gpu/drm/fsl-dcu/Makefile
> > +++ b/drivers/gpu/drm/fsl-dcu/Makefile
> > @@ -1,6 +1,7 @@
> >  fsl-dcu-drm-y := fsl_dcu_drm_drv.o \
> >  		 fsl_dcu_drm_kms.o \
> >  		 fsl_dcu_drm_rgb.o \
> > +		 fsl_dcu_drm_hdmi.o \
> >  		 fsl_dcu_drm_plane.o \
> >  		 fsl_dcu_drm_crtc.o \
> >  		 fsl_dcu_drm_fbdev.o \
> > diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_hdmi.c
> > b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_hdmi.c
> > new file mode 100644
> > index 0000000..76441c7
> > --- /dev/null
> > +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_hdmi.c
> > @@ -0,0 +1,194 @@
> > +/*
> > + * Copyright 2015 Freescale Semiconductor, Inc.
> > + *
> > + * Freescale DCU drm device driver
> > + *
> > + * This program is free software; you can redistribute it and/or
> > +modify
> > + * it under the terms of the GNU General Public License as published
> > +by
> > + * the Free Software Foundation; either version 2 of the License, or
> > + * (at your option) any later version.
> > + */
> > +
> > +#include <linux/console.h>
> > +#include <linux/delay.h>
> > +#include <linux/errno.h>
> > +#include <linux/fb.h>
> > +#include <linux/fsl_devices.h>
> > +#include <linux/i2c.h>
> > +#include <linux/init.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/of_device.h>
> > +#include <linux/backlight.h>
> > +#include <linux/of_graph.h>
> > +#include <video/videomode.h>
> > +#include <video/of_display_timing.h>
> > +
> > +#include <drm/drmP.h>
> > +#include <drm/drm_atomic_helper.h>
> > +#include <drm/drm_encoder_slave.h>
> > +#include <drm/drm_crtc_helper.h>
> > +#include <drm/drm_edid.h>
> > +
> > +#include "fsl_dcu_drm_drv.h"
> > +#include "fsl_dcu_drm_output.h"
> > +
> > +static void
> > +fsl_dcu_drm_hdmienc_mode_set(struct drm_encoder *encoder,
> > +					 struct drm_display_mode *mode,
> > +					 struct drm_display_mode
> *adjusted_mode) { }
> > +
> > +static int
> > +fsl_dcu_drm_hdmienc_atomic_check(struct drm_encoder *encoder,
> > +				 struct drm_crtc_state *crtc_state,
> > +				 struct drm_connector_state *conn_state) {
> > +	return 0;
> > +}
> > +
> > +static void
> > +fsl_dcu_drm_hdmienc_disable(struct drm_encoder *encoder) { }
> > +
> > +static void
> > +fsl_dcu_drm_hdmienc_enable(struct drm_encoder *encoder) { }
> > +
> > +static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
> > +	.atomic_check = fsl_dcu_drm_hdmienc_atomic_check,
> > +	.disable = fsl_dcu_drm_hdmienc_disable,
> > +	.enable = fsl_dcu_drm_hdmienc_enable,
> > +	.mode_set = fsl_dcu_drm_hdmienc_mode_set, };
> > +
> > +static void fsl_dcu_drm_hdmienc_destroy(struct drm_encoder *encoder)
> > +{
> > +	drm_encoder_cleanup(encoder);
> > +}
> > +
> > +void fsl_dcu_drm_hdmienc_reset(struct drm_encoder *encoder) { }
> > +
> > +static const struct drm_encoder_funcs encoder_funcs = {
> > +	.reset = fsl_dcu_drm_hdmienc_reset,
> > +	.destroy = fsl_dcu_drm_hdmienc_destroy, };
> > +
> > +int fsl_dcu_drm_hdmienc_create(struct fsl_dcu_drm_device *fsl_dev,
> > +			       struct drm_crtc *crtc)
> > +{
> > +	struct drm_encoder *encoder;
> > +	int ret;
> > +
> > +	do {
> > +		encoder = devm_kzalloc(fsl_dev->dev,
> > +					sizeof(struct drm_encoder),
> GFP_KERNEL);
> > +		encoder->possible_crtcs = 1;
> > +		ret = drm_encoder_init(fsl_dev->drm, encoder,
> &encoder_funcs,
> > +				       DRM_MODE_ENCODER_TMDS, NULL);
> 
> Just sharing my understanding of the DRM bridge infrastructure, and I'll let
> Daniel (and other experimented DRM/KMS developers) correct me if I'm
> wrong.
> 
> The Sil9022 is a bridge taking its pixel stream from an RGB encoder (also known
> as ENCODER_NONE), and converting it into a TDMS (HDMI or
> DVI) stream. So, your encoder on the fsl-dcu side is not an HDMI encoder but
> an RGB (ENCODER_NONE) encoder.
> Switching to this approach will let you support any kind of bridge (RGB->DVI,
> RGB->TDMS, RGB->LVDS, ...) without having to add boilerplate code for each of
> them.
Thanks for your sharing. I had read your article < The DRM/KMS subsystem from a newbie's point of view>, it helped me a lot when I was starting to develop DRM/KMS.

Best Regards,
Meng Yi


More information about the dri-devel mailing list