xref: /openbmc/linux/drivers/gpu/drm/solomon/ssd130x.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1a61732e8SJavier Martinez Canillas /* SPDX-License-Identifier: GPL-2.0-only */
2a61732e8SJavier Martinez Canillas /*
3a61732e8SJavier Martinez Canillas  * Header file for:
4a61732e8SJavier Martinez Canillas  * DRM driver for Solomon SSD130x OLED displays
5a61732e8SJavier Martinez Canillas  *
6a61732e8SJavier Martinez Canillas  * Copyright 2022 Red Hat Inc.
7a61732e8SJavier Martinez Canillas  * Author: Javier Martinez Canillas <javierm@redhat.com>
8a61732e8SJavier Martinez Canillas  *
9a61732e8SJavier Martinez Canillas  * Based on drivers/video/fbdev/ssd1307fb.c
10a61732e8SJavier Martinez Canillas  * Copyright 2012 Free Electrons
11a61732e8SJavier Martinez Canillas  */
12a61732e8SJavier Martinez Canillas 
130f1cb4d7SJavier Martinez Canillas #ifndef __SSD130X_H__
140f1cb4d7SJavier Martinez Canillas #define __SSD130X_H__
15a61732e8SJavier Martinez Canillas 
16622113b9SJavier Martinez Canillas #include <drm/drm_connector.h>
17622113b9SJavier Martinez Canillas #include <drm/drm_crtc.h>
18a61732e8SJavier Martinez Canillas #include <drm/drm_drv.h>
19622113b9SJavier Martinez Canillas #include <drm/drm_encoder.h>
20622113b9SJavier Martinez Canillas #include <drm/drm_plane_helper.h>
21a61732e8SJavier Martinez Canillas 
22a61732e8SJavier Martinez Canillas #include <linux/regmap.h>
23a61732e8SJavier Martinez Canillas 
244203e88bSJavier Martinez Canillas #define SSD130X_DATA				0x40
254203e88bSJavier Martinez Canillas #define SSD130X_COMMAND				0x80
264203e88bSJavier Martinez Canillas 
274203e88bSJavier Martinez Canillas enum ssd130x_variants {
284203e88bSJavier Martinez Canillas 	SH1106_ID,
294203e88bSJavier Martinez Canillas 	SSD1305_ID,
304203e88bSJavier Martinez Canillas 	SSD1306_ID,
314203e88bSJavier Martinez Canillas 	SSD1307_ID,
324203e88bSJavier Martinez Canillas 	SSD1309_ID,
334203e88bSJavier Martinez Canillas 	NR_SSD130X_VARIANTS
344203e88bSJavier Martinez Canillas };
354203e88bSJavier Martinez Canillas 
36a61732e8SJavier Martinez Canillas struct ssd130x_deviceinfo {
37a61732e8SJavier Martinez Canillas 	u32 default_vcomh;
38a61732e8SJavier Martinez Canillas 	u32 default_dclk_div;
39a61732e8SJavier Martinez Canillas 	u32 default_dclk_frq;
40f1f288d0SJavier Martinez Canillas 	u32 default_width;
41f1f288d0SJavier Martinez Canillas 	u32 default_height;
42*179a790aSJavier Martinez Canillas 	u32 page_height;
43a61732e8SJavier Martinez Canillas 	int need_pwm;
44a61732e8SJavier Martinez Canillas 	int need_chargepump;
45b0daaa5cSChen-Yu Tsai 	bool page_mode_only;
46a61732e8SJavier Martinez Canillas };
47a61732e8SJavier Martinez Canillas 
48a61732e8SJavier Martinez Canillas struct ssd130x_device {
49a61732e8SJavier Martinez Canillas 	struct drm_device drm;
50a61732e8SJavier Martinez Canillas 	struct device *dev;
51a61732e8SJavier Martinez Canillas 	struct drm_display_mode mode;
52622113b9SJavier Martinez Canillas 	struct drm_plane primary_plane;
53622113b9SJavier Martinez Canillas 	struct drm_crtc crtc;
54622113b9SJavier Martinez Canillas 	struct drm_encoder encoder;
55a61732e8SJavier Martinez Canillas 	struct drm_connector connector;
56a61732e8SJavier Martinez Canillas 	struct i2c_client *client;
57a61732e8SJavier Martinez Canillas 
58a61732e8SJavier Martinez Canillas 	struct regmap *regmap;
59a61732e8SJavier Martinez Canillas 
60a61732e8SJavier Martinez Canillas 	const struct ssd130x_deviceinfo *device_info;
61a61732e8SJavier Martinez Canillas 
62b0daaa5cSChen-Yu Tsai 	unsigned page_address_mode : 1;
63a61732e8SJavier Martinez Canillas 	unsigned area_color_enable : 1;
64a61732e8SJavier Martinez Canillas 	unsigned com_invdir : 1;
65a61732e8SJavier Martinez Canillas 	unsigned com_lrremap : 1;
66a61732e8SJavier Martinez Canillas 	unsigned com_seq : 1;
67a61732e8SJavier Martinez Canillas 	unsigned lookup_table_set : 1;
68a61732e8SJavier Martinez Canillas 	unsigned low_power : 1;
69a61732e8SJavier Martinez Canillas 	unsigned seg_remap : 1;
70a61732e8SJavier Martinez Canillas 	u32 com_offset;
71a61732e8SJavier Martinez Canillas 	u32 contrast;
72a61732e8SJavier Martinez Canillas 	u32 dclk_div;
73a61732e8SJavier Martinez Canillas 	u32 dclk_frq;
74a61732e8SJavier Martinez Canillas 	u32 height;
75a61732e8SJavier Martinez Canillas 	u8 lookup_table[4];
76a61732e8SJavier Martinez Canillas 	u32 page_offset;
77a61732e8SJavier Martinez Canillas 	u32 col_offset;
78a61732e8SJavier Martinez Canillas 	u32 prechargep1;
79a61732e8SJavier Martinez Canillas 	u32 prechargep2;
80a61732e8SJavier Martinez Canillas 
81a61732e8SJavier Martinez Canillas 	struct backlight_device *bl_dev;
82a61732e8SJavier Martinez Canillas 	struct pwm_device *pwm;
83a61732e8SJavier Martinez Canillas 	struct gpio_desc *reset;
84a61732e8SJavier Martinez Canillas 	struct regulator *vcc_reg;
85a61732e8SJavier Martinez Canillas 	u32 vcomh;
86a61732e8SJavier Martinez Canillas 	u32 width;
87a61732e8SJavier Martinez Canillas 	/* Cached address ranges */
88a61732e8SJavier Martinez Canillas 	u8 col_start;
89a61732e8SJavier Martinez Canillas 	u8 col_end;
90a61732e8SJavier Martinez Canillas 	u8 page_start;
91a61732e8SJavier Martinez Canillas 	u8 page_end;
92a61732e8SJavier Martinez Canillas };
93a61732e8SJavier Martinez Canillas 
944203e88bSJavier Martinez Canillas extern const struct ssd130x_deviceinfo ssd130x_variants[];
954203e88bSJavier Martinez Canillas 
96a61732e8SJavier Martinez Canillas struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *regmap);
97a4359b4eSUwe Kleine-König void ssd130x_remove(struct ssd130x_device *ssd130x);
98a61732e8SJavier Martinez Canillas void ssd130x_shutdown(struct ssd130x_device *ssd130x);
99a61732e8SJavier Martinez Canillas 
1000f1cb4d7SJavier Martinez Canillas #endif /* __SSD130X_H__ */
101