xref: /linux/drivers/gpu/drm/sitronix/st7571.h (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
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