rk30 lcdc: display lut support
[firefly-linux-kernel-4.4.55.git] / drivers / video / hdmi / hdmi-sysfs.c
1 #include <linux/ctype.h>\r
2 #include <linux/hdmi.h>\r
3 #include <linux/string.h>\r
4 \r
5 int debug_en = 0;\r
6 \r
7 #ifndef CONFIG_HDMI_SAVE_DATA\r
8 int hdmi_get_data(void)\r
9 {\r
10 return 0;\r
11 }\r
12 int hdmi_set_data(int data)\r
13 {\r
14 return 0;\r
15 }\r
16 #endif\r
17 \r
18 static ssize_t hdmi_show_state_attrs(struct device *dev,\r
19                                               struct device_attribute *attr,\r
20                                               char *buf) \r
21 {\r
22         struct hdmi *hdmi = dev_get_drvdata(dev);\r
23 \r
24         return sprintf(buf, "display_on=%d\n"\r
25                                                 "plug=%d\n"\r
26                                                 "dual_disp=%d\n"\r
27                                                 "video_mode=%d\n"\r
28                                                 "mode=%d\n"\r
29                                                 "hdcp_on=%d\n"\r
30                                                 "audio_fs=%d\n"\r
31                                                 "scale=%d\n"\r
32                                                 "scale_set=%d\n"\r
33                                                 "resolution=%d\n"\r
34                                                 "--------------------------\n"\r
35                                                 "resolution support:\n"\r
36                                                 "HDMI_1920x1080p_50Hz       0\n"\r
37                                                 "HDMI_1920x1080p_60Hz       1\n"\r
38                                                 "HDMI_1280x720p_50Hz        2\n"\r
39                                                 "HDMI_1280x720p_60Hz        3\n"\r
40                                                 "HDMI_720x576p_50Hz_4x3     4\n"\r
41                                                 "HDMI_720x576p_50Hz_16x9    5\n"\r
42                                                 "HDMI_720x480p_60Hz_4x3     6\n"\r
43                                                 "HDMI_720x480p_60Hz_16x9    7\n"\r
44                                                 "--------------------------\n", \r
45                                                 hdmi->display_on,hdmi->ops->hdmi_precent(hdmi),\r
46                                                 hdmi->dual_disp,fb_get_video_mode(), hdmi->mode, hdmi->hdcp_on,\r
47                                                 hdmi->audio_fs, (hdmi->ops->hdmi_precent(hdmi) && hdmi->display_on)?hdmi->scale:100, \r
48                                                 hdmi->scale_set,\r
49                                                 hdmi->resolution);\r
50 }\r
51 static ssize_t hdmi_restore_state_attrs(struct device *dev, \r
52                                                 struct device_attribute *attr,\r
53                                                 const char *buf, size_t size)\r
54 {\r
55         int ret = 0;\r
56         struct hdmi *hdmi = dev_get_drvdata(dev);\r
57         char *p;\r
58         const char *q;\r
59         int set_param = 0, tmp = 0;\r
60         #ifdef CONFIG_HDMI_SAVE_DATA\r
61     int hdmi_data=0;\r
62     #endif\r
63         if(hdmi->mode == DISP_ON_LCD)\r
64         {\r
65                 dev_err(dev, "display on lcd, do not set parameter!\n");\r
66                 ret = -EINVAL;\r
67                 goto exit;\r
68         }\r
69 \r
70         q = buf;\r
71         do\r
72         {\r
73                 if((p = strstr(q, "mode=")) != NULL)\r
74                 {\r
75                         q = p + 5;\r
76 #if 0\r
77                         if((sscanf(q, "%d", &tmp) == 1) && (tmp >= 0 && tmp <= 3))\r
78                         {\r
79                                 if(tmp != hdmi->mode)\r
80                                 {\r
81                                         set_param |= 1;\r
82                                         hdmi->mode = tmp;\r
83                                 }\r
84                         }\r
85                         else\r
86                         {\r
87                                 dev_err(dev, "failed to set hdmi configuration\n");\r
88                                 ret = -EINVAL;\r
89                                 goto exit;\r
90                         }\r
91 #endif\r
92                 }\r
93 \r
94                 else if((p = strstr(q, "hdcp_on=")) != NULL)\r
95                 {\r
96                         q = p + 8;\r
97 #if 0\r
98                         if((sscanf(q, "%d", &tmp) == 1) && (tmp == 0 || tmp ==1))\r
99                         {\r
100                                 if(tmp != hdmi->hdcp_on)\r
101                                 {\r
102                                         set_param |= 1;\r
103                                         hdmi->hdcp_on = tmp;\r
104                                 }\r
105                         }\r
106                         else\r
107                         {\r
108                                 dev_err(dev, "failed to set hdmi configuration\n");\r
109                                 ret = -EINVAL;\r
110                                 goto exit;\r
111                         }\r
112 #endif\r
113                 }\r
114 \r
115 \r
116                 else if((p = strstr(q, "scale_set=")) != NULL)\r
117                 {\r
118                         q = p + 10;\r
119                         if((sscanf(q, "%d", &tmp) == 1) && (tmp >=MIN_SCALE && tmp <= 100))\r
120                         {\r
121                                 hdmi->scale_set = tmp;\r
122                                 hdmi_dbg(dev, "set scale = %d\n", tmp);\r
123                                 hdmi->scale = tmp;\r
124                                 #ifdef CONFIG_HDMI_SAVE_DATA\r
125                                 hdmi_data = hdmi_get_data();\r
126                                 if(hdmi_data<0)\r
127                                     hdmi->ops->init(hdmi);\r
128                                 hdmi_data = (((hdmi->scale-MIN_SCALE)&0x1f)<<3) | (hdmi_data & 0x7);\r
129                                 hdmi_set_data(hdmi_data);\r
130                                 #endif\r
131                         }\r
132                         else\r
133                         {\r
134                                 dev_err(dev, "failed to set hdmi configuration\n");\r
135                                 ret = -EINVAL;\r
136                                 goto exit;\r
137                         }\r
138                 }\r
139                 else if((p = strstr(q, "resolution=")) != NULL)\r
140                 {\r
141                         q = p + 11;\r
142                         if((sscanf(q, "%d", &tmp) == 1) && (tmp >= 0))\r
143                         {\r
144                                 if(hdmi->resolution != tmp)\r
145                                 {\r
146                                         set_param |= 1;\r
147                                         hdmi_dbg(dev, "set resolution = %d\n", tmp);\r
148                                         hdmi->resolution = tmp;\r
149                                         #ifdef CONFIG_HDMI_SAVE_DATA\r
150                                         hdmi_data = hdmi_get_data();\r
151                                         if(hdmi_data<0)\r
152                                         hdmi->ops->init(hdmi);\r
153                                         hdmi_data = (hdmi->resolution&0x7) | (hdmi_data & 0xf8);\r
154                                         hdmi_set_data(hdmi_data);\r
155                                         #endif\r
156                                 }\r
157                         }\r
158                         else\r
159                         {\r
160                                 dev_err(dev, "failed to set hdmi configuration\n");\r
161                                 ret = -EINVAL;\r
162                                 goto exit;\r
163                         }\r
164                 }\r
165                 else\r
166                         break;\r
167                 \r
168         }while(*q != 0);\r
169         if(hdmi->ops->set_param && set_param != 0)\r
170         {\r
171                 mutex_lock(&hdmi->lock);\r
172                 ret = hdmi->ops->set_param(hdmi);\r
173                 mutex_unlock(&hdmi->lock);\r
174         }\r
175 exit:\r
176         if(ret < 0)\r
177                 dev_err(dev, "hdmi_restore_state_attrs err\n");\r
178         return size;\r
179 }\r
180 \r
181 static ssize_t hdmi_show_switch_attrs(struct device *dev,\r
182                                               struct device_attribute *attr,\r
183                                               char *buf) \r
184 {                                \r
185         struct hdmi *hdmi = dev_get_drvdata(dev);\r
186 \r
187         return sprintf(buf, "%d\n", hdmi->display_on);\r
188 }\r
189 static ssize_t hdmi_restore_switch_attrs(struct device *dev, \r
190                                                 struct device_attribute *attr,\r
191                                                 const char *buf, size_t size)\r
192 {\r
193         int display_on = 0;\r
194         struct hdmi *hdmi = dev_get_drvdata(dev);\r
195         \r
196         sscanf(buf, "%d", &display_on);\r
197         hdmi_dbg(dev, "hdmi %s\n", (display_on)?"enable":"disable");\r
198         if(display_on ^ hdmi->display_on)\r
199         {\r
200                 hdmi->display_on = display_on;\r
201                 hdmi_changed(hdmi, 1);\r
202         }\r
203         return size;\r
204 }\r
205 static ssize_t hdmi_show_debug_attrs(struct device *dev,\r
206                                               struct device_attribute *attr,\r
207                                               char *buf) \r
208 {                                \r
209         return sprintf(buf, "%d\n", debug_en);\r
210 }\r
211 static ssize_t hdmi_restore_debug_attrs(struct device *dev, \r
212                                                 struct device_attribute *attr,\r
213                                                 const char *buf, size_t size)\r
214 {\r
215         int tmp;\r
216         \r
217         sscanf(buf, "%d", &tmp);\r
218         \r
219         if(tmp != 0 && tmp != 1)\r
220                 dev_err(dev, "hdmi_restore_debug_attrs err\n");\r
221         else\r
222                 debug_en = tmp;\r
223         return size;\r
224 }\r
225 #if 0\r
226 static ssize_t hdmi_restore_init_attrs(struct device *dev, \r
227                                                 struct device_attribute *attr,\r
228                                                 const char *buf, size_t size)\r
229 {\r
230         int enable = HDMI_DISABLE, scale = 100, resolution = HDMI_DEFAULT_RESOLUTION;\r
231         struct hdmi *hdmi = dev_get_drvdata(dev);\r
232 \r
233         sscanf(buf, "%d %d %d\n", &enable, &scale, &resolution);\r
234         \r
235         hdmi_dbg(dev, "hdmi init, set param: enable = %d, scale = %d, resolution = %d\n",\r
236                         enable, scale, resolution);\r
237 \r
238         hdmi->display_on = enable;\r
239         hdmi->resolution = resolution;\r
240         hdmi->scale_set = scale;\r
241         \r
242         if(hdmi->ops->hdmi_precent(hdmi) && hdmi->display_on)\r
243                 hdmi->scale = scale;\r
244 \r
245         if(hdmi->ops->init)\r
246                 hdmi->ops->init(hdmi);\r
247         return size;\r
248 }\r
249 #endif\r
250 static struct device_attribute hdmi_attrs[] = {\r
251         __ATTR(state, 0774, hdmi_show_state_attrs, hdmi_restore_state_attrs),\r
252         __ATTR(enable, 0774, hdmi_show_switch_attrs, hdmi_restore_switch_attrs),\r
253         __ATTR(debug, 0774, hdmi_show_debug_attrs, hdmi_restore_debug_attrs),\r
254         //__ATTR(init, 0777, NULL, hdmi_restore_init_attrs),\r
255 };\r
256 int hdmi_create_attrs(struct hdmi *hdmi)\r
257 {\r
258         int rc = 0;\r
259         int i;\r
260 \r
261         for (i = 0; i < ARRAY_SIZE(hdmi_attrs); i++) {\r
262                 rc = device_create_file(hdmi->dev, &hdmi_attrs[i]);\r
263                 if (rc)\r
264                         goto create_failed;\r
265         }\r
266 \r
267         goto succeed;\r
268 \r
269 create_failed:\r
270         while (i--)\r
271                 device_remove_file(hdmi->dev, &hdmi_attrs[i]);\r
272 succeed:\r
273         return rc;\r
274 }\r
275 \r
276 void hdmi_remove_attrs(struct hdmi *hdmi)\r
277 {\r
278         int i;\r
279 \r
280         for (i = 0; i < ARRAY_SIZE(hdmi_attrs); i++)\r
281                 device_remove_file(hdmi->dev, &hdmi_attrs[i]);\r
282 }\r
283 \r
284 \r