1 #include <linux/ctype.h>
\r
2 #include <linux/hdmi.h>
\r
3 #include <linux/string.h>
\r
7 #ifndef CONFIG_HDMI_SAVE_DATA
\r
8 int hdmi_get_data(void)
\r
12 int hdmi_set_data(int data)
\r
18 static ssize_t hdmi_show_state_attrs(struct device *dev,
\r
19 struct device_attribute *attr,
\r
22 struct hdmi *hdmi = dev_get_drvdata(dev);
\r
24 return sprintf(buf, "display_on=%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
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
56 struct hdmi *hdmi = dev_get_drvdata(dev);
\r
59 int set_param = 0, tmp = 0;
\r
60 #ifdef CONFIG_HDMI_SAVE_DATA
\r
63 if(hdmi->mode == DISP_ON_LCD)
\r
65 dev_err(dev, "display on lcd, do not set parameter!\n");
\r
73 if((p = strstr(q, "mode=")) != NULL)
\r
77 if((sscanf(q, "%d", &tmp) == 1) && (tmp >= 0 && tmp <= 3))
\r
79 if(tmp != hdmi->mode)
\r
87 dev_err(dev, "failed to set hdmi configuration\n");
\r
94 else if((p = strstr(q, "hdcp_on=")) != NULL)
\r
98 if((sscanf(q, "%d", &tmp) == 1) && (tmp == 0 || tmp ==1))
\r
100 if(tmp != hdmi->hdcp_on)
\r
103 hdmi->hdcp_on = tmp;
\r
108 dev_err(dev, "failed to set hdmi configuration\n");
\r
116 else if((p = strstr(q, "scale_set=")) != NULL)
\r
119 if((sscanf(q, "%d", &tmp) == 1) && (tmp >=MIN_SCALE && tmp <= 100))
\r
121 hdmi->scale_set = tmp;
\r
122 hdmi_dbg(dev, "set scale = %d\n", tmp);
\r
124 #ifdef CONFIG_HDMI_SAVE_DATA
\r
125 hdmi_data = hdmi_get_data();
\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
134 dev_err(dev, "failed to set hdmi configuration\n");
\r
139 else if((p = strstr(q, "resolution=")) != NULL)
\r
142 if((sscanf(q, "%d", &tmp) == 1) && (tmp >= 0))
\r
144 if(hdmi->resolution != tmp)
\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
152 hdmi->ops->init(hdmi);
\r
153 hdmi_data = (hdmi->resolution&0x7) | (hdmi_data & 0xf8);
\r
154 hdmi_set_data(hdmi_data);
\r
160 dev_err(dev, "failed to set hdmi configuration\n");
\r
169 if(hdmi->ops->set_param && set_param != 0)
\r
171 mutex_lock(&hdmi->lock);
\r
172 ret = hdmi->ops->set_param(hdmi);
\r
173 mutex_unlock(&hdmi->lock);
\r
177 dev_err(dev, "hdmi_restore_state_attrs err\n");
\r
181 static ssize_t hdmi_show_switch_attrs(struct device *dev,
\r
182 struct device_attribute *attr,
\r
185 struct hdmi *hdmi = dev_get_drvdata(dev);
\r
187 return sprintf(buf, "%d\n", hdmi->display_on);
\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
193 int display_on = 0;
\r
194 struct hdmi *hdmi = dev_get_drvdata(dev);
\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
200 hdmi->display_on = display_on;
\r
201 hdmi_changed(hdmi, 1);
\r
205 static ssize_t hdmi_show_debug_attrs(struct device *dev,
\r
206 struct device_attribute *attr,
\r
209 return sprintf(buf, "%d\n", debug_en);
\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
217 sscanf(buf, "%d", &tmp);
\r
219 if(tmp != 0 && tmp != 1)
\r
220 dev_err(dev, "hdmi_restore_debug_attrs err\n");
\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
230 int enable = HDMI_DISABLE, scale = 100, resolution = HDMI_DEFAULT_RESOLUTION;
\r
231 struct hdmi *hdmi = dev_get_drvdata(dev);
\r
233 sscanf(buf, "%d %d %d\n", &enable, &scale, &resolution);
\r
235 hdmi_dbg(dev, "hdmi init, set param: enable = %d, scale = %d, resolution = %d\n",
\r
236 enable, scale, resolution);
\r
238 hdmi->display_on = enable;
\r
239 hdmi->resolution = resolution;
\r
240 hdmi->scale_set = scale;
\r
242 if(hdmi->ops->hdmi_precent(hdmi) && hdmi->display_on)
\r
243 hdmi->scale = scale;
\r
245 if(hdmi->ops->init)
\r
246 hdmi->ops->init(hdmi);
\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
256 int hdmi_create_attrs(struct hdmi *hdmi)
\r
261 for (i = 0; i < ARRAY_SIZE(hdmi_attrs); i++) {
\r
262 rc = device_create_file(hdmi->dev, &hdmi_attrs[i]);
\r
264 goto create_failed;
\r
271 device_remove_file(hdmi->dev, &hdmi_attrs[i]);
\r
276 void hdmi_remove_attrs(struct hdmi *hdmi)
\r
280 for (i = 0; i < ARRAY_SIZE(hdmi_attrs); i++)
\r
281 device_remove_file(hdmi->dev, &hdmi_attrs[i]);
\r