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