xref: /OK3568_Linux_fs/kernel/include/soc/rockchip/rockchip_dmc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright (c) 2017, Fuzhou Rockchip Electronics Co., Ltd
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  */
13 #ifndef __SOC_ROCKCHIP_DMC_H
14 #define __SOC_ROCKCHIP_DMC_H
15 
16 #include <linux/devfreq.h>
17 
18 /* for lcdc_type */
19 #define SCREEN_NULL		0
20 #define SCREEN_RGB		1
21 #define SCREEN_LVDS		2
22 #define SCREEN_DUAL_LVDS	3
23 #define SCREEN_MCU		4
24 #define SCREEN_TVOUT		5
25 #define SCREEN_HDMI		6
26 #define SCREEN_MIPI		7
27 #define SCREEN_DUAL_MIPI	8
28 #define SCREEN_EDP		9
29 #define SCREEN_TVOUT_TEST	10
30 #define SCREEN_LVDS_10BIT	11
31 #define SCREEN_DUAL_LVDS_10BIT	12
32 #define SCREEN_DP		13
33 
34 #define DMCFREQ_TABLE_END	~1u
35 
36 struct freq_map_table {
37 	unsigned int min;
38 	unsigned int max;
39 	unsigned long freq;
40 };
41 
42 struct rl_map_table {
43 	unsigned int pn; /* panel number */
44 	unsigned int rl; /* readlatency */
45 };
46 
47 struct dmcfreq_common_info {
48 	struct device *dev;
49 	struct devfreq *devfreq;
50 	struct freq_map_table *vop_bw_tbl;
51 	struct freq_map_table *vop_frame_bw_tbl;
52 	struct rl_map_table *vop_pn_rl_tbl;
53 	struct delayed_work msch_rl_work;
54 	unsigned long vop_4k_rate;
55 	unsigned long vop_req_rate;
56 	unsigned int read_latency;
57 	unsigned int auto_freq_en;
58 	bool is_msch_rl_work_started;
59 	int (*set_msch_readlatency)(unsigned int rl);
60 };
61 
62 struct dmcfreq_vop_info {
63 	unsigned int line_bw_mbyte;
64 	unsigned int frame_bw_mbyte;
65 	unsigned int plane_num;
66 	unsigned int plane_num_4k;
67 };
68 
69 #if IS_REACHABLE(CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ)
70 void rockchip_dmcfreq_lock(void);
71 void rockchip_dmcfreq_lock_nested(void);
72 void rockchip_dmcfreq_unlock(void);
73 int rockchip_dmcfreq_write_trylock(void);
74 void rockchip_dmcfreq_write_unlock(void);
75 int rockchip_dmcfreq_wait_complete(void);
76 int rockchip_dmcfreq_vop_bandwidth_init(struct dmcfreq_common_info *info);
77 int rockchip_dmcfreq_vop_bandwidth_request(struct dmcfreq_vop_info *vop_info);
78 void rockchip_dmcfreq_vop_bandwidth_update(struct dmcfreq_vop_info *vop_info);
79 #else
rockchip_dmcfreq_lock(void)80 static inline void rockchip_dmcfreq_lock(void)
81 {
82 }
83 
rockchip_dmcfreq_lock_nested(void)84 static inline void rockchip_dmcfreq_lock_nested(void)
85 {
86 }
87 
rockchip_dmcfreq_unlock(void)88 static inline void rockchip_dmcfreq_unlock(void)
89 {
90 }
91 
rockchip_dmcfreq_write_trylock(void)92 static inline int rockchip_dmcfreq_write_trylock(void)
93 {
94 	return 0;
95 }
96 
rockchip_dmcfreq_write_unlock(void)97 static inline void rockchip_dmcfreq_write_unlock(void)
98 {
99 }
100 
rockchip_dmcfreq_wait_complete(void)101 static inline int rockchip_dmcfreq_wait_complete(void)
102 {
103 	return 0;
104 }
105 
106 static inline int
rockchip_dmcfreq_vop_bandwidth_request(struct dmcfreq_vop_info * vop_info)107 rockchip_dmcfreq_vop_bandwidth_request(struct dmcfreq_vop_info *vop_info)
108 {
109 	return 0;
110 }
111 
112 static inline void
rockchip_dmcfreq_vop_bandwidth_update(struct dmcfreq_vop_info * vop_info)113 rockchip_dmcfreq_vop_bandwidth_update(struct dmcfreq_vop_info *vop_info)
114 {
115 }
116 
117 static inline void
rockchip_dmcfreq_vop_bandwidth_init(struct dmcfreq_common_info * info)118 rockchip_dmcfreq_vop_bandwidth_init(struct dmcfreq_common_info *info)
119 {
120 }
121 #endif
122 
123 #endif
124