X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fvideo%2Frockchip%2Frkfb_sysfs.c;h=81a1b759d8036de0b8189c23ad3bd666b4c8b86a;hb=f658b8110213148aa268092a528127462a7b6056;hp=7fc7cd8f80ae35ec097536a0992d31a79dde62d4;hpb=a3a3769fe0527c075d99c4a38b3e58071fbfa8ee;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/video/rockchip/rkfb_sysfs.c b/drivers/video/rockchip/rkfb_sysfs.c index 7fc7cd8f80ae..81a1b759d803 100644 --- a/drivers/video/rockchip/rkfb_sysfs.c +++ b/drivers/video/rockchip/rkfb_sysfs.c @@ -110,6 +110,32 @@ static ssize_t show_screen_info(struct device *dev, fps, screen->type, screen->mode.vmode); } +static ssize_t set_screen_info(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; + struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; + int xmirror = 0, ymirror = 0, ret = 0, rotate = 0; + + ret = kstrtoint(buf, 0, &rotate); + if (ret) + return ret; + xmirror = !!(rotate & X_MIRROR); + ymirror = !!(rotate & Y_MIRROR); + dev_drv->cur_screen->x_mirror = xmirror; + dev_drv->cur_screen->y_mirror = ymirror; + mutex_lock(&dev_drv->output_lock); + mutex_lock(&dev_drv->win_config); + if (dev_drv->ops->extern_func) + dev_drv->ops->extern_func(dev_drv, SET_DSP_MIRROR); + mutex_unlock(&dev_drv->win_config); + mutex_unlock(&dev_drv->output_lock); + + return count; +} + static ssize_t show_disp_info(struct device *dev, struct device_attribute *attr, char *buf) { @@ -254,8 +280,10 @@ static ssize_t show_dump_buffer(struct device *dev, size = snprintf(buf, PAGE_SIZE, "bmp -- dump buffer to bmp image\n" + " can't support dump to single file\n" "bin -- dump buffer to bin image\n" - "multi -- each dump will create new file\n" + "multi -- each dump will create new file\n" + " only works on trace context\n" "win=num -- mask win to dump, default mask all\n" " win=1, will dump win1 buffer\n" " win=23, will dump win2 area3 buffer\n" @@ -382,8 +410,7 @@ static ssize_t set_dump_buffer(struct device *dev, continue; } if (!strncmp(p, "multi", 5)) { - is_append = true; - is_bmp = false; + is_append = false; continue; } @@ -404,17 +431,14 @@ static ssize_t set_dump_buffer(struct device *dev, return PTR_ERR(dentry); } + mutex_lock(&dev_drv->front_lock); if (!num_frames) { - mutex_lock(&dev_drv->front_lock); - if (!dev_drv->front_regs) { u16 xact, yact; int data_format; u32 dsp_addr; int ymirror; - mutex_unlock(&dev_drv->front_lock); - if (dev_drv->ops->get_dspbuf_info) dev_drv->ops->get_dspbuf_info(dev_drv, &xact, &yact, &data_format, &dsp_addr, @@ -425,8 +449,10 @@ static ssize_t set_dump_buffer(struct device *dev, goto out; } front_regs = kmalloc(sizeof(*front_regs), GFP_KERNEL); - if (!front_regs) + if (!front_regs) { + mutex_unlock(&dev_drv->front_lock); return -ENOMEM; + } memcpy(front_regs, dev_drv->front_regs, sizeof(*front_regs)); for (i = 0; i < front_regs->win_num; i++) { @@ -457,16 +483,13 @@ static ssize_t set_dump_buffer(struct device *dev, area_data->smem_start, area_data->xvir, area_data->yvir, area_data->data_format, - trace->count_frame, - i, j, trace->is_bmp, trace->is_append); + 0, i, j, is_bmp, false); if (area_data->ion_handle) ion_handle_put(area_data->ion_handle); } } kfree(front_regs); - - mutex_unlock(&dev_drv->front_lock); } else { trace->num_frames = num_frames; trace->count_frame = 0; @@ -476,7 +499,7 @@ static ssize_t set_dump_buffer(struct device *dev, trace->mask_area = mask_area; } out: - + mutex_unlock(&dev_drv->front_lock); return count; } @@ -688,7 +711,7 @@ static ssize_t show_overlay(struct device *dev, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - int ovl; + int ovl = 0; if (dev_drv->ops->ovl_mgr) ovl = dev_drv->ops->ovl_mgr(dev_drv, 0, 0); @@ -727,7 +750,7 @@ static ssize_t show_fps(struct device *dev, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - int fps; + int fps = 0; if (dev_drv->ops->fps_mgr) fps = dev_drv->ops->fps_mgr(dev_drv, 0, 0); @@ -743,17 +766,22 @@ static ssize_t set_fps(struct device *dev, struct device_attribute *attr, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - u32 fps; + struct rk_screen *screen = dev_drv->cur_screen; + u32 fps, origin_fps; int ret; ret = kstrtou32(buf, 0, &fps); if (ret) return ret; - if (fps == 0 || fps > 60) { - dev_info(dev, "unsupport fps value,pelase set 1~60\n"); - return count; - } + origin_fps = rk_fb_calc_fps(screen, dev_drv->pixclock); + + /* + * use too low or too high fps would make screen abnormal, + * and maybe can't recovery, so limit the fps. + */ + if (fps <= 40 || fps > origin_fps) + fps = origin_fps; if (dev_drv->ops->fps_mgr) ret = dev_drv->ops->fps_mgr(dev_drv, fps, 1); @@ -958,7 +986,7 @@ static ssize_t set_dsp_cabc(struct device *dev, struct device_attribute *attr, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - int space_max, ret, mode = 0, calc = 0, up = 0, down = 0, global = 0; + int space_max, ret = 0, mode = 0, calc = 0, up = 0, down = 0, global = 0; const char *start = buf; space_max = 10; /*max space number 10*/ @@ -1005,7 +1033,7 @@ static ssize_t show_dsp_bcsh(struct device *dev, struct fb_info *fbi = dev_get_drvdata(dev); struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; - int brightness, contrast, sat_con, sin_hue, cos_hue; + int brightness = 0, contrast = 0, sat_con = 0, sin_hue = 0, cos_hue = 0; if (dev_drv->ops->get_dsp_bcsh_bcs) { brightness = dev_drv->ops->get_dsp_bcsh_bcs(dev_drv, @@ -1194,6 +1222,28 @@ static ssize_t show_lcdc_id(struct device *dev, return snprintf(buf, PAGE_SIZE, "%d\n", dev_drv->id); } +static ssize_t show_dsp_mode(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; + struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; + + return snprintf(buf, PAGE_SIZE, "%d\n", dev_drv->dsp_mode); +} + +static ssize_t show_hot_plug_state(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; + struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; + + return snprintf(buf, PAGE_SIZE, "%d\n", dev_drv->hot_plug_state); +} + static ssize_t show_win_property(struct device *dev, struct device_attribute *attr, char *buf) @@ -1211,13 +1261,32 @@ static ssize_t show_win_property(struct device *dev, dev_drv->win[win_id]->property.max_input_y); } +static ssize_t set_car_reverse(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct rk_fb_par *fb_par = (struct rk_fb_par *)fbi->par; + struct rk_lcdc_driver *dev_drv = fb_par->lcdc_drv; + u32 status; + int ret; + + ret = kstrtou32(buf, 0, &status); + if (ret) + return ret; + rk_fb_set_car_reverse_status(dev_drv, status); + + return count; +} + static struct device_attribute rkfb_attrs[] = { __ATTR(phys_addr, S_IRUGO, show_phys, NULL), __ATTR(virt_addr, S_IRUGO, show_virt, NULL), __ATTR(disp_info, S_IRUGO, show_disp_info, NULL), __ATTR(dump_buf, S_IRUGO | S_IWUSR, show_dump_buffer, set_dump_buffer), __ATTR(dsp_buf, S_IRUGO | S_IWUSR, show_dsp_buffer, set_dsp_buffer), - __ATTR(screen_info, S_IRUGO, show_screen_info, NULL), + __ATTR(screen_info, S_IRUGO | S_IWUSR, + show_screen_info, set_screen_info), __ATTR(dual_mode, S_IRUGO, show_dual_mode, NULL), __ATTR(enable, S_IRUGO | S_IWUSR, show_fb_state, set_fb_state), __ATTR(overlay, S_IRUGO | S_IWUSR, show_overlay, set_overlay), @@ -1231,6 +1300,9 @@ static struct device_attribute rkfb_attrs[] = { __ATTR(scale, S_IRUGO | S_IWUSR, show_scale, set_scale), __ATTR(lcdcid, S_IRUGO, show_lcdc_id, NULL), __ATTR(win_property, S_IRUGO, show_win_property, NULL), + __ATTR(car_reverse, S_IWUSR, NULL, set_car_reverse), + __ATTR(dsp_mode, S_IRUGO, show_dsp_mode, NULL), + __ATTR(hot_plug_state, S_IRUGO, show_hot_plug_state, NULL), }; int rkfb_create_sysfs(struct fb_info *fbi)