Hi Boris, On Monday, May 16, 2016 8:45 PM Boris Brezillon <boris.brezillon@xxxxxxxxxxxxxxxxxx> wrote: > > Hi Meng, > > On Sun, 15 May 2016 16:34:44 +0800 > Meng Yi <meng.yi@xxxxxxx> 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@xxxxxxx> > > Signed-off-by: Xiubo Li <lixiubo@xxxxxxxxxxxxxxxxxxxx> > > Signed-off-by: Jianwei Wang <jianwei.wang.chn@xxxxxxxxx> > > Signed-off-by: Meng Yi <meng.yi@xxxxxxx> > > --- > > 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel