1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Header file for:
4 * DRM driver for Solomon SSD130x OLED displays
5 *
6 * Copyright 2022 Red Hat Inc.
7 * Author: Javier Martinez Canillas <javierm@redhat.com>
8 *
9 * Based on drivers/video/fbdev/ssd1307fb.c
10 * Copyright 2012 Free Electrons
11 */
12
13#ifndef __SSD130X_H__
14#define __SSD130X_H__
15
16#include <drm/drm_connector.h>
17#include <drm/drm_crtc.h>
18#include <drm/drm_drv.h>
19#include <drm/drm_encoder.h>
20#include <drm/drm_plane_helper.h>
21
22#include <linux/regmap.h>
23
24#define SSD130X_DATA				0x40
25#define SSD130X_COMMAND				0x80
26
27enum ssd130x_variants {
28	SH1106_ID,
29	SSD1305_ID,
30	SSD1306_ID,
31	SSD1307_ID,
32	SSD1309_ID,
33	NR_SSD130X_VARIANTS
34};
35
36struct ssd130x_deviceinfo {
37	u32 default_vcomh;
38	u32 default_dclk_div;
39	u32 default_dclk_frq;
40	u32 default_width;
41	u32 default_height;
42	u32 page_height;
43	int need_pwm;
44	int need_chargepump;
45	bool page_mode_only;
46};
47
48struct ssd130x_device {
49	struct drm_device drm;
50	struct device *dev;
51	struct drm_display_mode mode;
52	struct drm_plane primary_plane;
53	struct drm_crtc crtc;
54	struct drm_encoder encoder;
55	struct drm_connector connector;
56	struct i2c_client *client;
57
58	struct regmap *regmap;
59
60	const struct ssd130x_deviceinfo *device_info;
61
62	unsigned page_address_mode : 1;
63	unsigned area_color_enable : 1;
64	unsigned com_invdir : 1;
65	unsigned com_lrremap : 1;
66	unsigned com_seq : 1;
67	unsigned lookup_table_set : 1;
68	unsigned low_power : 1;
69	unsigned seg_remap : 1;
70	u32 com_offset;
71	u32 contrast;
72	u32 dclk_div;
73	u32 dclk_frq;
74	u32 height;
75	u8 lookup_table[4];
76	u32 page_offset;
77	u32 col_offset;
78	u32 prechargep1;
79	u32 prechargep2;
80
81	struct backlight_device *bl_dev;
82	struct pwm_device *pwm;
83	struct gpio_desc *reset;
84	struct regulator *vcc_reg;
85	u32 vcomh;
86	u32 width;
87	/* Cached address ranges */
88	u8 col_start;
89	u8 col_end;
90	u8 page_start;
91	u8 page_end;
92};
93
94extern const struct ssd130x_deviceinfo ssd130x_variants[];
95
96struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *regmap);
97void ssd130x_remove(struct ssd130x_device *ssd130x);
98void ssd130x_shutdown(struct ssd130x_device *ssd130x);
99
100#endif /* __SSD130X_H__ */
101