1d93a4354SMarcus Folkesson /* SPDX-License-Identifier: GPL-2.0-or-later */ 2d93a4354SMarcus Folkesson /* 3d93a4354SMarcus Folkesson * Header file for: 4d93a4354SMarcus Folkesson * Driver for Sitronix ST7571, a 4 level gray scale dot matrix LCD controller 5d93a4354SMarcus Folkesson * 6d93a4354SMarcus Folkesson * Copyright (C) 2025 Marcus Folkesson <marcus.folkesson@gmail.com> 7d93a4354SMarcus Folkesson */ 8d93a4354SMarcus Folkesson 9d93a4354SMarcus Folkesson #ifndef __ST7571_H__ 10d93a4354SMarcus Folkesson #define __ST7571_H__ 11d93a4354SMarcus Folkesson 12d93a4354SMarcus Folkesson #include <drm/drm_connector.h> 13d93a4354SMarcus Folkesson #include <drm/drm_crtc.h> 14d93a4354SMarcus Folkesson #include <drm/drm_drv.h> 15d93a4354SMarcus Folkesson #include <drm/drm_encoder.h> 16b0c20d82SMarcus Folkesson #include <drm/drm_format_helper.h> 17d93a4354SMarcus Folkesson 18d93a4354SMarcus Folkesson #include <linux/regmap.h> 19d93a4354SMarcus Folkesson 20d93a4354SMarcus Folkesson enum st7571_color_mode { 21d93a4354SMarcus Folkesson ST7571_COLOR_MODE_GRAY = 0, 22d93a4354SMarcus Folkesson ST7571_COLOR_MODE_BLACKWHITE = 1, 23d93a4354SMarcus Folkesson }; 24d93a4354SMarcus Folkesson 25d93a4354SMarcus Folkesson struct st7571_device; 26d93a4354SMarcus Folkesson 27d93a4354SMarcus Folkesson struct st7571_panel_constraints { 28d93a4354SMarcus Folkesson u32 min_nlines; 29d93a4354SMarcus Folkesson u32 max_nlines; 30d93a4354SMarcus Folkesson u32 min_ncols; 31d93a4354SMarcus Folkesson u32 max_ncols; 32d93a4354SMarcus Folkesson bool support_grayscale; 33d93a4354SMarcus Folkesson }; 34d93a4354SMarcus Folkesson 35d93a4354SMarcus Folkesson struct st7571_panel_data { 36d93a4354SMarcus Folkesson int (*init)(struct st7571_device *st7571); 37d93a4354SMarcus Folkesson int (*parse_dt)(struct st7571_device *st7571); 38d93a4354SMarcus Folkesson struct st7571_panel_constraints constraints; 39d93a4354SMarcus Folkesson }; 40d93a4354SMarcus Folkesson 41d93a4354SMarcus Folkesson struct st7571_panel_format { 42d93a4354SMarcus Folkesson void (*prepare_buffer)(struct st7571_device *st7571, 43d93a4354SMarcus Folkesson const struct iosys_map *vmap, 44d93a4354SMarcus Folkesson struct drm_framebuffer *fb, 45d93a4354SMarcus Folkesson struct drm_rect *rect, 46d93a4354SMarcus Folkesson struct drm_format_conv_state *fmtcnv_state); 47d93a4354SMarcus Folkesson int (*update_rect)(struct drm_framebuffer *fb, struct drm_rect *rect); 48d93a4354SMarcus Folkesson enum st7571_color_mode mode; 49d93a4354SMarcus Folkesson const u8 nformats; 50d93a4354SMarcus Folkesson const u32 formats[]; 51d93a4354SMarcus Folkesson }; 52d93a4354SMarcus Folkesson 53d93a4354SMarcus Folkesson struct st7571_device { 54d93a4354SMarcus Folkesson struct drm_device drm; 55d93a4354SMarcus Folkesson struct device *dev; 56d93a4354SMarcus Folkesson 57d93a4354SMarcus Folkesson struct drm_plane primary_plane; 58d93a4354SMarcus Folkesson struct drm_crtc crtc; 59d93a4354SMarcus Folkesson struct drm_encoder encoder; 60d93a4354SMarcus Folkesson struct drm_connector connector; 61d93a4354SMarcus Folkesson 62d93a4354SMarcus Folkesson struct drm_display_mode mode; 63d93a4354SMarcus Folkesson 64d93a4354SMarcus Folkesson const struct st7571_panel_format *pformat; 65d93a4354SMarcus Folkesson const struct st7571_panel_data *pdata; 66d93a4354SMarcus Folkesson struct gpio_desc *reset; 67d93a4354SMarcus Folkesson struct regmap *regmap; 68d93a4354SMarcus Folkesson 69d93a4354SMarcus Folkesson bool grayscale; 70d93a4354SMarcus Folkesson bool inverted; 71d93a4354SMarcus Folkesson u32 height_mm; 72d93a4354SMarcus Folkesson u32 width_mm; 73d93a4354SMarcus Folkesson u32 startline; 74d93a4354SMarcus Folkesson u32 nlines; 75d93a4354SMarcus Folkesson u32 ncols; 76d93a4354SMarcus Folkesson u32 bpp; 77d93a4354SMarcus Folkesson 78d93a4354SMarcus Folkesson /* Intermediate buffer in LCD friendly format */ 79d93a4354SMarcus Folkesson u8 *hwbuf; 80d93a4354SMarcus Folkesson 81d93a4354SMarcus Folkesson /* Row of (transformed) pixels ready to be written to the display */ 82d93a4354SMarcus Folkesson u8 *row; 83d93a4354SMarcus Folkesson }; 84d93a4354SMarcus Folkesson 85*b362de16SMarcus Folkesson extern const struct st7571_panel_data st7567_config; 86*b362de16SMarcus Folkesson extern const struct st7571_panel_data st7571_config; 87*b362de16SMarcus Folkesson 88*b362de16SMarcus Folkesson struct st7571_device *st7571_probe(struct device *dev, struct regmap *regmap); 89*b362de16SMarcus Folkesson void st7571_remove(struct st7571_device *st7571); 90*b362de16SMarcus Folkesson 91d93a4354SMarcus Folkesson #endif /* __ST7571_H__ */ 92