1
2
3
4#ifndef __LINUX_FBTFT_H
5#define __LINUX_FBTFT_H
6
7#include <linux/fb.h>
8#include <linux/spinlock.h>
9#include <linux/spi/spi.h>
10#include <linux/platform_device.h>
11
12#define FBTFT_ONBOARD_BACKLIGHT 2
13
14#define FBTFT_GPIO_NO_MATCH 0xFFFF
15#define FBTFT_GPIO_NAME_SIZE 32
16#define FBTFT_MAX_INIT_SEQUENCE 512
17#define FBTFT_GAMMA_MAX_VALUES_TOTAL 128
18
19#define FBTFT_OF_INIT_CMD BIT(24)
20#define FBTFT_OF_INIT_DELAY BIT(25)
21
22
23
24
25
26
27
28struct fbtft_gpio {
29 char name[FBTFT_GPIO_NAME_SIZE];
30 unsigned int gpio;
31};
32
33struct fbtft_par;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60struct fbtft_ops {
61 int (*write)(struct fbtft_par *par, void *buf, size_t len);
62 int (*read)(struct fbtft_par *par, void *buf, size_t len);
63 int (*write_vmem)(struct fbtft_par *par, size_t offset, size_t len);
64 void (*write_register)(struct fbtft_par *par, int len, ...);
65
66 void (*set_addr_win)(struct fbtft_par *par,
67 int xs, int ys, int xe, int ye);
68 void (*reset)(struct fbtft_par *par);
69 void (*mkdirty)(struct fb_info *info, int from, int to);
70 void (*update_display)(struct fbtft_par *par,
71 unsigned int start_line, unsigned int end_line);
72 int (*init_display)(struct fbtft_par *par);
73 int (*blank)(struct fbtft_par *par, bool on);
74
75 unsigned long (*request_gpios_match)(struct fbtft_par *par,
76 const struct fbtft_gpio *gpio);
77 int (*request_gpios)(struct fbtft_par *par);
78 int (*verify_gpios)(struct fbtft_par *par);
79
80 void (*register_backlight)(struct fbtft_par *par);
81 void (*unregister_backlight)(struct fbtft_par *par);
82
83 int (*set_var)(struct fbtft_par *par);
84 int (*set_gamma)(struct fbtft_par *par, u32 *curves);
85};
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106struct fbtft_display {
107 unsigned int width;
108 unsigned int height;
109 unsigned int regwidth;
110 unsigned int buswidth;
111 unsigned int backlight;
112 struct fbtft_ops fbtftops;
113 unsigned int bpp;
114 unsigned int fps;
115 int txbuflen;
116 const s16 *init_sequence;
117 char *gamma;
118 int gamma_num;
119 int gamma_len;
120 unsigned long debug;
121};
122
123
124
125
126
127
128
129
130
131
132
133
134
135struct fbtft_platform_data {
136 struct fbtft_display display;
137 const struct fbtft_gpio *gpios;
138 unsigned int rotate;
139 bool bgr;
140 unsigned int fps;
141 int txbuflen;
142 u8 startbyte;
143 char *gamma;
144 void *extra;
145};
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192struct fbtft_par {
193 struct spi_device *spi;
194 struct platform_device *pdev;
195 struct fb_info *info;
196 struct fbtft_platform_data *pdata;
197 u16 *ssbuf;
198 u32 pseudo_palette[16];
199 struct {
200 void *buf;
201 size_t len;
202 } txbuf;
203 u8 *buf;
204 u8 startbyte;
205 struct fbtft_ops fbtftops;
206 spinlock_t dirty_lock;
207 unsigned int dirty_lines_start;
208 unsigned int dirty_lines_end;
209 struct {
210 int reset;
211 int dc;
212 int rd;
213 int wr;
214 int latch;
215 int cs;
216 int db[16];
217 int led[16];
218 int aux[16];
219 } gpio;
220 const s16 *init_sequence;
221 struct {
222 struct mutex lock;
223 u32 *curves;
224 int num_values;
225 int num_curves;
226 } gamma;
227 unsigned long debug;
228 bool first_update_done;
229 ktime_t update_time;
230 bool bgr;
231 void *extra;
232 bool polarity;
233};
234
235#define NUMARGS(...) (sizeof((int[]){__VA_ARGS__})/sizeof(int))
236
237#define write_reg(par, ...) \
238 ((par)->fbtftops.write_register(par, NUMARGS(__VA_ARGS__), __VA_ARGS__))
239
240
241int fbtft_write_buf_dc(struct fbtft_par *par, void *buf, size_t len, int dc);
242void fbtft_dbg_hex(const struct device *dev, int groupsize,
243 void *buf, size_t len, const char *fmt, ...);
244struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display,
245 struct device *dev,
246 struct fbtft_platform_data *pdata);
247void fbtft_framebuffer_release(struct fb_info *info);
248int fbtft_register_framebuffer(struct fb_info *fb_info);
249int fbtft_unregister_framebuffer(struct fb_info *fb_info);
250void fbtft_register_backlight(struct fbtft_par *par);
251void fbtft_unregister_backlight(struct fbtft_par *par);
252int fbtft_init_display(struct fbtft_par *par);
253int fbtft_probe_common(struct fbtft_display *display, struct spi_device *sdev,
254 struct platform_device *pdev);
255int fbtft_remove_common(struct device *dev, struct fb_info *info);
256
257
258int fbtft_write_spi(struct fbtft_par *par, void *buf, size_t len);
259int fbtft_write_spi_emulate_9(struct fbtft_par *par, void *buf, size_t len);
260int fbtft_read_spi(struct fbtft_par *par, void *buf, size_t len);
261int fbtft_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len);
262int fbtft_write_gpio16_wr(struct fbtft_par *par, void *buf, size_t len);
263int fbtft_write_gpio16_wr_latched(struct fbtft_par *par, void *buf, size_t len);
264
265
266int fbtft_write_vmem8_bus8(struct fbtft_par *par, size_t offset, size_t len);
267int fbtft_write_vmem16_bus16(struct fbtft_par *par, size_t offset, size_t len);
268int fbtft_write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len);
269int fbtft_write_vmem16_bus9(struct fbtft_par *par, size_t offset, size_t len);
270void fbtft_write_reg8_bus8(struct fbtft_par *par, int len, ...);
271void fbtft_write_reg8_bus9(struct fbtft_par *par, int len, ...);
272void fbtft_write_reg16_bus8(struct fbtft_par *par, int len, ...);
273void fbtft_write_reg16_bus16(struct fbtft_par *par, int len, ...);
274
275#define FBTFT_REGISTER_DRIVER(_name, _compatible, _display) \
276 \
277static int fbtft_driver_probe_spi(struct spi_device *spi) \
278{ \
279 return fbtft_probe_common(_display, spi, NULL); \
280} \
281 \
282static int fbtft_driver_remove_spi(struct spi_device *spi) \
283{ \
284 struct fb_info *info = spi_get_drvdata(spi); \
285 \
286 return fbtft_remove_common(&spi->dev, info); \
287} \
288 \
289static int fbtft_driver_probe_pdev(struct platform_device *pdev) \
290{ \
291 return fbtft_probe_common(_display, NULL, pdev); \
292} \
293 \
294static int fbtft_driver_remove_pdev(struct platform_device *pdev) \
295{ \
296 struct fb_info *info = platform_get_drvdata(pdev); \
297 \
298 return fbtft_remove_common(&pdev->dev, info); \
299} \
300 \
301static const struct of_device_id dt_ids[] = { \
302 { .compatible = _compatible }, \
303 {}, \
304}; \
305 \
306MODULE_DEVICE_TABLE(of, dt_ids); \
307 \
308 \
309static struct spi_driver fbtft_driver_spi_driver = { \
310 .driver = { \
311 .name = _name, \
312 .of_match_table = of_match_ptr(dt_ids), \
313 }, \
314 .probe = fbtft_driver_probe_spi, \
315 .remove = fbtft_driver_remove_spi, \
316}; \
317 \
318static struct platform_driver fbtft_driver_platform_driver = { \
319 .driver = { \
320 .name = _name, \
321 .owner = THIS_MODULE, \
322 .of_match_table = of_match_ptr(dt_ids), \
323 }, \
324 .probe = fbtft_driver_probe_pdev, \
325 .remove = fbtft_driver_remove_pdev, \
326}; \
327 \
328static int __init fbtft_driver_module_init(void) \
329{ \
330 int ret; \
331 \
332 ret = spi_register_driver(&fbtft_driver_spi_driver); \
333 if (ret < 0) \
334 return ret; \
335 return platform_driver_register(&fbtft_driver_platform_driver); \
336} \
337 \
338static void __exit fbtft_driver_module_exit(void) \
339{ \
340 spi_unregister_driver(&fbtft_driver_spi_driver); \
341 platform_driver_unregister(&fbtft_driver_platform_driver); \
342} \
343 \
344module_init(fbtft_driver_module_init); \
345module_exit(fbtft_driver_module_exit);
346
347
348
349
350#define DEBUG_LEVEL_1 DEBUG_REQUEST_GPIOS
351#define DEBUG_LEVEL_2 (DEBUG_LEVEL_1 | DEBUG_DRIVER_INIT_FUNCTIONS | DEBUG_TIME_FIRST_UPDATE)
352#define DEBUG_LEVEL_3 (DEBUG_LEVEL_2 | DEBUG_RESET | DEBUG_INIT_DISPLAY | DEBUG_BLANK | DEBUG_REQUEST_GPIOS | DEBUG_FREE_GPIOS | DEBUG_VERIFY_GPIOS | DEBUG_BACKLIGHT | DEBUG_SYSFS)
353#define DEBUG_LEVEL_4 (DEBUG_LEVEL_2 | DEBUG_FB_READ | DEBUG_FB_WRITE | DEBUG_FB_FILLRECT | DEBUG_FB_COPYAREA | DEBUG_FB_IMAGEBLIT | DEBUG_FB_BLANK)
354#define DEBUG_LEVEL_5 (DEBUG_LEVEL_3 | DEBUG_UPDATE_DISPLAY)
355#define DEBUG_LEVEL_6 (DEBUG_LEVEL_4 | DEBUG_LEVEL_5)
356#define DEBUG_LEVEL_7 0xFFFFFFFF
357
358#define DEBUG_DRIVER_INIT_FUNCTIONS (1<<3)
359#define DEBUG_TIME_FIRST_UPDATE (1<<4)
360#define DEBUG_TIME_EACH_UPDATE (1<<5)
361#define DEBUG_DEFERRED_IO (1<<6)
362#define DEBUG_FBTFT_INIT_FUNCTIONS (1<<7)
363
364
365#define DEBUG_FB_READ (1<<8)
366#define DEBUG_FB_WRITE (1<<9)
367#define DEBUG_FB_FILLRECT (1<<10)
368#define DEBUG_FB_COPYAREA (1<<11)
369#define DEBUG_FB_IMAGEBLIT (1<<12)
370#define DEBUG_FB_SETCOLREG (1<<13)
371#define DEBUG_FB_BLANK (1<<14)
372
373#define DEBUG_SYSFS (1<<16)
374
375
376#define DEBUG_BACKLIGHT (1<<17)
377#define DEBUG_READ (1<<18)
378#define DEBUG_WRITE (1<<19)
379#define DEBUG_WRITE_VMEM (1<<20)
380#define DEBUG_WRITE_REGISTER (1<<21)
381#define DEBUG_SET_ADDR_WIN (1<<22)
382#define DEBUG_RESET (1<<23)
383#define DEBUG_MKDIRTY (1<<24)
384#define DEBUG_UPDATE_DISPLAY (1<<25)
385#define DEBUG_INIT_DISPLAY (1<<26)
386#define DEBUG_BLANK (1<<27)
387#define DEBUG_REQUEST_GPIOS (1<<28)
388#define DEBUG_FREE_GPIOS (1<<29)
389#define DEBUG_REQUEST_GPIOS_MATCH (1<<30)
390#define DEBUG_VERIFY_GPIOS (1<<31)
391
392#define fbtft_init_dbg(dev, format, arg...) \
393do { \
394 if (unlikely((dev)->platform_data && \
395 (((struct fbtft_platform_data *)(dev)->platform_data)->display.debug & DEBUG_DRIVER_INIT_FUNCTIONS))) \
396 dev_info(dev, format, ##arg); \
397} while (0)
398
399#define fbtft_par_dbg(level, par, format, arg...) \
400do { \
401 if (unlikely(par->debug & level)) \
402 dev_info(par->info->device, format, ##arg); \
403} while (0)
404
405#define fbtft_par_dbg_hex(level, par, dev, type, buf, num, format, arg...) \
406do { \
407 if (unlikely((par)->debug & (level))) \
408 fbtft_dbg_hex(dev, sizeof(type), buf,\
409 (num) * sizeof(type), format, ##arg); \
410} while (0)
411
412#endif
413