Commit 2880a49732e3ecfd048a324df18975b79aa7a8e2

Authored by Ye Li
1 parent 065c4a2bdd

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)

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

drivers/video/Kconfig
... ... @@ -543,6 +543,11 @@
543 543 help
544 544 Support for HDMI i.MX8 processors.
545 545  
  546 +config IMX_MIPI_DSI_BRIDGE
  547 + bool
  548 + help
  549 + Enable MIPI DSI bridge interface for display controller.
  550 +
546 551 config MXC_EPDC
547 552 bool "i.MX EPDC support"
548 553 depends on LCD && (MX7 || MX6)
drivers/video/Makefile
... ... @@ -64,6 +64,7 @@
64 64 obj-$(CONFIG_VIDEO_PXP) += mxc_pxp.o
65 65 obj-$(CONFIG_VIDEO_GIS) += mxc_gis.o
66 66 obj-$(CONFIG_MXC_MIPI_DSI_NORTHWEST) += mipi_dsi_northwest.o
  67 +obj-$(CONFIG_IMX_MIPI_DSI_BRIDGE) += imx_mipi_dsi_bridge.o
67 68 obj-$(CONFIG_HX8363) += hx8363_wvga.o
68 69  
69 70 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