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