@@ -196,7 +196,8 @@ static int mi0283qt_probe(struct spi_device *spi)
device_property_read_u32(dev, "rotation", &rotation);
ret = mipi_dbi_spi_init(spi, mipi, dc, &mi0283qt_pipe_funcs,
- &mi0283qt_driver, &mi0283qt_mode, rotation);
+ &mi0283qt_driver, &mi0283qt_mode,
+ MIPI_DCS_PIXEL_FMT_16BIT, rotation);
if (ret)
return ret;
@@ -336,6 +336,7 @@ static const uint32_t mipi_dbi_formats[] = {
* @pipe_funcs: Display pipe functions
* @driver: DRM driver
* @mode: Display mode
+ * @pixel_fmt: The display memory's pixel format
* @rotation: Initial rotation in degrees Counter Clock Wise
*
* This function initializes a &mipi_dbi structure and it's underlying
@@ -352,15 +353,26 @@ static const uint32_t mipi_dbi_formats[] = {
int mipi_dbi_init(struct device *dev, struct mipi_dbi *mipi,
const struct drm_simple_display_pipe_funcs *pipe_funcs,
struct drm_driver *driver,
- const struct drm_display_mode *mode, unsigned int rotation)
+ const struct drm_display_mode *mode,
+ enum mipi_dcs_pixel_format pixel_fmt, unsigned int rotation)
{
- size_t bufsize = mode->vdisplay * mode->hdisplay * sizeof(u16);
struct tinydrm_device *tdev = &mipi->tinydrm;
+ size_t bufsize;
int ret;
if (!mipi->command)
return -EINVAL;
+ switch (pixel_fmt) {
+ case MIPI_DCS_PIXEL_FMT_16BIT:
+ bufsize = mode->vdisplay * mode->hdisplay * sizeof(u16);
+ break;
+ default:
+ DRM_ERROR("Pixel format is not supported\n");
+ return -EINVAL;
+ }
+ mipi->pixel_fmt = pixel_fmt;
+
mutex_init(&mipi->cmdlock);
mipi->tx_buf = devm_kmalloc(dev, bufsize, GFP_KERNEL);
@@ -781,6 +793,7 @@ static int mipi_dbi_typec3_command(struct mipi_dbi *mipi, u8 cmd,
* @pipe_funcs: Display pipe functions
* @driver: DRM driver
* @mode: Display mode
+ * @pixel_fmt: The display memory's pixel format
* @rotation: Initial rotation in degrees Counter Clock Wise
*
* This function sets &mipi_dbi->command, enables &mipi->read_commands for the
@@ -803,6 +816,7 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi,
const struct drm_simple_display_pipe_funcs *pipe_funcs,
struct drm_driver *driver,
const struct drm_display_mode *mode,
+ enum mipi_dcs_pixel_format pixel_fmt,
unsigned int rotation)
{
size_t tx_size = tinydrm_spi_max_transfer_size(spi, 0);
@@ -849,7 +863,8 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi,
return -ENOMEM;
}
- return mipi_dbi_init(dev, mipi, pipe_funcs, driver, mode, rotation);
+ return mipi_dbi_init(dev, mipi, pipe_funcs, driver, mode, pixel_fmt,
+ rotation);
}
EXPORT_SYMBOL(mipi_dbi_spi_init);
@@ -13,6 +13,7 @@
#define __LINUX_MIPI_DBI_H
#include <drm/tinydrm/tinydrm.h>
+#include <video/mipi_display.h>
struct spi_device;
struct gpio_desc;
@@ -33,6 +34,7 @@ struct regulator;
* @tx_buf9_len: Size of tx_buf9.
* @swap_bytes: Swap bytes in buffer before transfer
* @reset: Optional reset gpio
+ * @pixel_fmt: The display memory's pixel format
* @rotation: initial rotation in degrees Counter Clock Wise
* @backlight: backlight device (optional)
* @regulator: power regulator (optional)
@@ -50,6 +52,7 @@ struct mipi_dbi {
size_t tx_buf9_len;
bool swap_bytes;
struct gpio_desc *reset;
+ enum mipi_dcs_pixel_format pixel_fmt;
unsigned int rotation;
struct backlight_device *backlight;
struct regulator *regulator;
@@ -66,11 +69,13 @@ int mipi_dbi_spi_init(struct spi_device *spi, struct mipi_dbi *mipi,
const struct drm_simple_display_pipe_funcs *pipe_funcs,
struct drm_driver *driver,
const struct drm_display_mode *mode,
+ enum mipi_dcs_pixel_format pixel_fmt,
unsigned int rotation);
int mipi_dbi_init(struct device *dev, struct mipi_dbi *mipi,
const struct drm_simple_display_pipe_funcs *pipe_funcs,
struct drm_driver *driver,
- const struct drm_display_mode *mode, unsigned int rotation);
+ const struct drm_display_mode *mode,
+ enum mipi_dcs_pixel_format pixel_fmt, unsigned int rotation);
void mipi_dbi_pipe_enable(struct drm_simple_display_pipe *pipe,
struct drm_crtc_state *crtc_state);
void mipi_dbi_pipe_disable(struct drm_simple_display_pipe *pipe);
@@ -128,11 +128,13 @@ enum {
};
/* MIPI DCS pixel formats */
-#define MIPI_DCS_PIXEL_FMT_24BIT 7
-#define MIPI_DCS_PIXEL_FMT_18BIT 6
-#define MIPI_DCS_PIXEL_FMT_16BIT 5
-#define MIPI_DCS_PIXEL_FMT_12BIT 3
-#define MIPI_DCS_PIXEL_FMT_8BIT 2
-#define MIPI_DCS_PIXEL_FMT_3BIT 1
+enum mipi_dcs_pixel_format {
+ MIPI_DCS_PIXEL_FMT_24BIT = 7,
+ MIPI_DCS_PIXEL_FMT_18BIT = 6,
+ MIPI_DCS_PIXEL_FMT_16BIT = 5,
+ MIPI_DCS_PIXEL_FMT_12BIT = 3,
+ MIPI_DCS_PIXEL_FMT_8BIT = 2,
+ MIPI_DCS_PIXEL_FMT_3BIT = 1,
+};
#endif
This adds a parameter for MIPI DCS pixel format to mipi_dbi_init(). This is in preparation for supporting displays that don't use a 16bpp memory layout. Signed-off-by: David Lechner <david@lechnology.com> --- drivers/gpu/drm/tinydrm/mi0283qt.c | 3 ++- drivers/gpu/drm/tinydrm/mipi-dbi.c | 21 ++++++++++++++++++--- include/drm/tinydrm/mipi-dbi.h | 7 ++++++- include/video/mipi_display.h | 14 ++++++++------ 4 files changed, 34 insertions(+), 11 deletions(-)