1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
/*
* Copyright (C) 2011-2016 Freescale Semiconductor, Inc. All Rights Reserved.
* Copyright 2017 NXP.
*/
/*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
#ifndef __MIPI_DSI_H__
#define __MIPI_DSI_H__
#include <linux/regmap.h>
#include "mxc_dispdrv.h"
#ifdef DEBUG
#define mipi_dbg(fmt, ...) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define mipi_dbg(fmt, ...)
#endif
#define DSI_CMD_BUF_MAXSIZE (128)
#define DSI_NON_BURST_WITH_SYNC_PULSE 0
#define DSI_NON_BURST_WITH_SYNC_EVENT 1
#define DSI_BURST_MODE 2
#define DSI_HSA_PKT_OVERHEAD 10
#define DSI_HFP_PKT_OVERHEAD 8
#define DSI_HBP_PKT_OVERHEAD 14
/* DPI interface pixel color coding map */
enum mipi_dsi_dpi_fmt {
MIPI_RGB565_PACKED = 0,
MIPI_RGB565_LOOSELY,
MIPI_RGB565_CONFIG3,
MIPI_RGB666_PACKED,
MIPI_RGB666_LOOSELY,
MIPI_RGB888,
};
struct mipi_lcd_config {
u32 virtual_ch;
u32 data_lane_num;
/* device max DPHY clock in MHz unit */
u32 max_phy_clk;
enum mipi_dsi_dpi_fmt dpi_fmt;
};
struct mipi_dsi_info;
struct mipi_dsi_lcd_callback {
/* callback for lcd panel operation */
void (*get_mipi_lcd_videomode)(struct fb_videomode **, int *,
struct mipi_lcd_config **);
int (*mipi_lcd_setup)(struct mipi_dsi_info *);
};
struct mipi_dsi_match_lcd {
char *lcd_panel;
struct mipi_dsi_lcd_callback lcd_callback;
};
struct mipi_dsi_bus_mux {
int reg;
int mask;
int (*get_mux) (int dev_id, int disp_id);
};
/* driver private data */
struct mipi_dsi_info {
struct platform_device *pdev;
void __iomem *mmio_base;
void __iomem *phy_base;
struct regmap *regmap;
struct regmap *mux_sel;
const struct mipi_dsi_bus_mux *bus_mux;
int dsi_power_on;
int lcd_inited;
int encoder;
int traffic_mode;
u32 dphy_pll_config;
int dev_id;
int disp_id;
char *lcd_panel;
int irq;
uint32_t phy_ref_clkfreq;
#ifdef CONFIG_FB_IMX64
struct clk *core_clk;
struct clk *phy_ref_clk;
struct clk *dbi_clk;
struct clk *rxesc_clk;
struct clk *txesc_clk;
#else
struct clk *dphy_clk;
struct clk *cfg_clk;
struct clk *esc_clk;
#endif
struct mxc_dispdrv_handle *disp_mipi;
int vmode_index;
struct fb_videomode *mode;
struct regulator *disp_power_on;
struct mipi_lcd_config *lcd_config;
/* board related power control */
struct backlight_device *bl;
/* callback for lcd panel operation */
struct mipi_dsi_lcd_callback *lcd_callback;
int (*mipi_dsi_pkt_read)(struct mipi_dsi_info *mipi,
u8 data_type, u32 *buf, int len);
int (*mipi_dsi_pkt_write)(struct mipi_dsi_info *mipi_dsi,
u8 data_type, const u32 *buf, int len);
int (*mipi_dsi_dcs_cmd)(struct mipi_dsi_info *mipi,
u8 cmd, const u32 *param, int num);
};
#ifdef CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL
void mipid_hx8369_get_lcd_videomode(struct fb_videomode **mode, int *size,
struct mipi_lcd_config **data);
int mipid_hx8369_lcd_setup(struct mipi_dsi_info *);
#endif
#ifdef CONFIG_FB_MXC_TRULY_PANEL_TFT3P5079E
void mipid_otm8018b_get_lcd_videomode(struct fb_videomode **mode, int *size,
struct mipi_lcd_config **data);
int mipid_otm8018b_lcd_setup(struct mipi_dsi_info *);
#endif
#ifdef CONFIG_FB_MXC_TRULY_PANEL_TFT3P5581E
void mipid_hx8363_get_lcd_videomode(struct fb_videomode **mode, int *size,
struct mipi_lcd_config **data);
int mipid_hx8363_lcd_setup(struct mipi_dsi_info *);
#endif
#ifndef CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL
#error "Please configure MIPI LCD panel, we cannot find one!"
#endif
#endif
|