Commit da9df3cd043a8edf6c6412a47ec54a7c1ca0320d

Authored by Ye Li
1 parent 3d64768b1b

MLK-18945-1 video: Add mipi dsi bridge driver

Add a mipi dsi bridge driver to abstract mipi dsi interfaces for
mipi panel and display controller drivers.
So for panel and display conntroller drivers, they can use same functions
to access mipi dsi controller.

Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit 4bb9c1168a9b2796a1360d5e93420e4737fc3ba3)
(cherry picked from commit 2880a49732e3ecfd048a324df18975b79aa7a8e2)

Showing 4 changed files with 205 additions and 0 deletions Side-by-side Diff

drivers/video/Kconfig
... ... @@ -584,6 +584,11 @@
584 584 help
585 585 Support for HDMI i.MX8 processors.
586 586  
  587 +config IMX_MIPI_DSI_BRIDGE
  588 + bool
  589 + help
  590 + Enable MIPI DSI bridge interface for display controller.
  591 +
587 592 config MXC_EPDC
588 593 bool "i.MX EPDC support"
589 594 depends on LCD && (MX7 || MX6)
drivers/video/Makefile
... ... @@ -69,6 +69,7 @@
69 69 obj-$(CONFIG_VIDEO_PXP) += mxc_pxp.o
70 70 obj-$(CONFIG_VIDEO_GIS) += mxc_gis.o
71 71 obj-$(CONFIG_MXC_MIPI_DSI_NORTHWEST) += mipi_dsi_northwest.o
  72 +obj-$(CONFIG_IMX_MIPI_DSI_BRIDGE) += imx_mipi_dsi_bridge.o
72 73 obj-$(CONFIG_HX8363) += hx8363_wvga.o
73 74  
74 75 obj-y += bridge/
drivers/video/imx_mipi_dsi_bridge.c
  1 +/*
  2 + * Copyright 2018 NXP
  3 + *
  4 + * SPDX-License-Identifier: GPL-2.0+
  5 + */
  6 +
  7 +#include <common.h>
  8 +#include <dm.h>
  9 +#include <asm/io.h>
  10 +#include <linux/errno.h>
  11 +#include <imx_mipi_dsi_bridge.h>
  12 +
  13 +static struct mipi_dsi_bridge_driver *registered_driver = NULL;
  14 +
  15 +int imx_mipi_dsi_bridge_attach(struct mipi_dsi_client_dev *dsi_dev)
  16 +{
  17 + int ret = 0;
  18 +
  19 + if (!registered_driver)
  20 + return -EPERM;
  21 +
  22 + if (registered_driver->attach)
  23 + ret = registered_driver->attach(registered_driver, dsi_dev);
  24 +
  25 + return ret;
  26 +}
  27 +
  28 +int imx_mipi_dsi_bridge_mode_set(struct fb_videomode *pvmode)
  29 +{
  30 + int ret = 0;
  31 +
  32 + if (!registered_driver)
  33 + return -EPERM;
  34 +
  35 + if (registered_driver->mode_set)
  36 + ret = registered_driver->mode_set(registered_driver, pvmode);
  37 +
  38 + return ret;
  39 +}
  40 +
  41 +int imx_mipi_dsi_bridge_enable(void)
  42 +{
  43 + int ret = 0;
  44 +
  45 + if (!registered_driver)
  46 + return -EPERM;
  47 +
  48 + if (registered_driver->enable)
  49 + ret = registered_driver->enable(registered_driver);
  50 +
  51 + return ret;
  52 +}
  53 +
  54 +int imx_mipi_dsi_bridge_disable(void)
  55 +{
  56 + int ret = 0;
  57 +
  58 + if (!registered_driver)
  59 + return -EPERM;
  60 +
  61 + if (registered_driver->disable)
  62 + ret = registered_driver->disable(registered_driver);
  63 +
  64 + return ret;
  65 +}
  66 +
  67 +int imx_mipi_dsi_bridge_pkt_write(u8 data_type, const u8 *buf, int len)
  68 +{
  69 + int ret = 0;
  70 +
  71 + if (!registered_driver)
  72 + return -EPERM;
  73 +
  74 + if (registered_driver->pkt_write)
  75 + ret = registered_driver->pkt_write(registered_driver, data_type, buf, len);
  76 +
  77 + return ret;
  78 +}
  79 +
  80 +int imx_mipi_dsi_bridge_add_client_driver(struct mipi_dsi_client_driver *client_driver)
  81 +{
  82 + int ret = 0;
  83 +
  84 + if (!registered_driver)
  85 + return -EPERM;
  86 +
  87 + if (registered_driver->add_client_driver)
  88 + ret = registered_driver->add_client_driver(registered_driver, client_driver);
  89 +
  90 + return ret;
  91 +}
  92 +
  93 +int imx_mipi_dsi_bridge_register_driver(struct mipi_dsi_bridge_driver *driver)
  94 +{
  95 + if (!driver)
  96 + return -EINVAL;
  97 +
  98 + if (registered_driver)
  99 + return -EBUSY;
  100 +
  101 + registered_driver = driver;
  102 +
  103 + return 0;
  104 +}
include/imx_mipi_dsi_bridge.h
  1 +/*
  2 + * Copyright 2018 NXP
  3 + *
  4 + * SPDX-License-Identifier: GPL-2.0+
  5 + */
  6 +
  7 +#ifndef __IMX_MIPI_DSIM_BRIDGE_H__
  8 +#define __IMX_MIPI_DSIM_BRIDGE_H__
  9 +
  10 +#include <linux/fb.h>
  11 +
  12 +/* video mode */
  13 +#define MIPI_DSI_MODE_VIDEO BIT(0)
  14 +/* video burst mode */
  15 +#define MIPI_DSI_MODE_VIDEO_BURST BIT(1)
  16 +/* video pulse mode */
  17 +#define MIPI_DSI_MODE_VIDEO_SYNC_PULSE BIT(2)
  18 +/* enable auto vertical count mode */
  19 +#define MIPI_DSI_MODE_VIDEO_AUTO_VERT BIT(3)
  20 +/* enable hsync-end packets in vsync-pulse and v-porch area */
  21 +#define MIPI_DSI_MODE_VIDEO_HSE BIT(4)
  22 +/* disable hfront-porch area */
  23 +#define MIPI_DSI_MODE_VIDEO_HFP BIT(5)
  24 +/* disable hback-porch area */
  25 +#define MIPI_DSI_MODE_VIDEO_HBP BIT(6)
  26 +/* disable hsync-active area */
  27 +#define MIPI_DSI_MODE_VIDEO_HSA BIT(7)
  28 +/* flush display FIFO on vsync pulse */
  29 +#define MIPI_DSI_MODE_VSYNC_FLUSH BIT(8)
  30 +/* disable EoT packets in HS mode */
  31 +#define MIPI_DSI_MODE_EOT_PACKET BIT(9)
  32 +/* device supports non-continuous clock behavior (DSI spec 5.6.1) */
  33 +#define MIPI_DSI_CLOCK_NON_CONTINUOUS BIT(10)
  34 +/* transmit data in low power */
  35 +#define MIPI_DSI_MODE_LPM BIT(11)
  36 +
  37 +#define DSI_CMD_BUF_MAXSIZE (128)
  38 +
  39 +enum mipi_dsi_pixel_format {
  40 + MIPI_DSI_FMT_RGB888,
  41 + MIPI_DSI_FMT_RGB666,
  42 + MIPI_DSI_FMT_RGB666_PACKED,
  43 + MIPI_DSI_FMT_RGB565,
  44 +};
  45 +
  46 +struct mipi_dsi_client_dev {
  47 + unsigned int channel;
  48 + unsigned int lanes;
  49 + enum mipi_dsi_pixel_format format;
  50 + unsigned long mode_flags;
  51 + const char *name;
  52 +};
  53 +
  54 +struct mipi_dsi_client_driver {
  55 + int (*dsi_client_setup)(struct mipi_dsi_client_dev *panel_dev);
  56 + const char *name;
  57 +};
  58 +
  59 +struct mipi_dsi_bridge_driver {
  60 + int (*attach)(struct mipi_dsi_bridge_driver *bridge_driver, struct mipi_dsi_client_dev *dsi_dev);
  61 + int (*enable)(struct mipi_dsi_bridge_driver *bridge_driver);
  62 + int (*disable)(struct mipi_dsi_bridge_driver *bridge_driver);
  63 + int (*mode_set)(struct mipi_dsi_bridge_driver *bridge_driver, struct fb_videomode *pvmode);
  64 + int (*pkt_write)(struct mipi_dsi_bridge_driver *bridge_driver, u8 data_type, const u8 *buf, int len);
  65 + int (*add_client_driver)(struct mipi_dsi_bridge_driver *bridge_driver, struct mipi_dsi_client_driver *client_driver);
  66 + const char *name;
  67 + void *driver_private;
  68 +};
  69 +
  70 +static inline int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)
  71 +{
  72 + switch (fmt) {
  73 + case MIPI_DSI_FMT_RGB888:
  74 + case MIPI_DSI_FMT_RGB666:
  75 + return 24;
  76 +
  77 + case MIPI_DSI_FMT_RGB666_PACKED:
  78 + return 18;
  79 +
  80 + case MIPI_DSI_FMT_RGB565:
  81 + return 16;
  82 + }
  83 +
  84 + return -EINVAL;
  85 +}
  86 +
  87 +int imx_mipi_dsi_bridge_attach(struct mipi_dsi_client_dev *dsi_dev);
  88 +int imx_mipi_dsi_bridge_mode_set(struct fb_videomode *pvmode);
  89 +int imx_mipi_dsi_bridge_enable(void);
  90 +int imx_mipi_dsi_bridge_disable(void);
  91 +int imx_mipi_dsi_bridge_pkt_write(u8 data_type, const u8 *buf, int len);
  92 +int imx_mipi_dsi_bridge_add_client_driver(struct mipi_dsi_client_driver *client_driver);
  93 +int imx_mipi_dsi_bridge_register_driver(struct mipi_dsi_bridge_driver *driver);
  94 +
  95 +#endif