[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