rkfb:add display lut set/read interface
authoryxj <yxj@rock-chips.com>
Sat, 11 Aug 2012 02:42:50 +0000 (10:42 +0800)
committeryxj <yxj@rock-chips.com>
Wed, 29 Aug 2012 07:45:25 +0000 (15:45 +0800)
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/rkfb_sysfs.c
include/linux/rk_fb.h

index 66dd7845a16afd7fc590083e7f248329d94beb25..dfea2ef440f7e54e210cd48487bf69ef88230422 100644 (file)
@@ -872,8 +872,14 @@ static int init_lcdc_device_driver(struct rk_lcdc_device_driver *dev_drv,
        dev_drv->get_disp_info  = def_drv->get_disp_info;
        dev_drv->ovl_mgr        = def_drv->ovl_mgr;
        dev_drv->fps_mgr        = def_drv->fps_mgr;
-       dev_drv->fb_get_layer   = def_drv->fb_get_layer;
-       dev_drv->fb_layer_remap = def_drv->fb_layer_remap;
+       if(def_drv->fb_get_layer)
+               dev_drv->fb_get_layer   = def_drv->fb_get_layer;
+       if(def_drv->fb_layer_remap)
+               dev_drv->fb_layer_remap = def_drv->fb_layer_remap;
+       if(def_drv->set_dsp_lut)
+               dev_drv->set_dsp_lut    = def_drv->set_dsp_lut;
+       if(def_drv->read_dsp_lut)
+               dev_drv->read_dsp_lut   = def_drv->read_dsp_lut;
        init_layer_par(dev_drv);
        init_completion(&dev_drv->frame_done);
        spin_lock_init(&dev_drv->cpl_lock);
index 92309a3ef7e73a13560d279e36a8f871dd9883d2..b0588c6e7b5ecff0e7dbf667bc78bac5c2243e9d 100644 (file)
@@ -237,6 +237,50 @@ static ssize_t set_fb_win_map(struct device *dev,struct device_attribute *attr,
        
 }
 
+static ssize_t show_dsp_lut(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       
+}
+static ssize_t set_dsp_lut(struct device *dev,struct device_attribute *attr,
+       const char *buf, size_t count)
+{
+       int dsp_lut[256];
+       char *start = buf;
+       int i=256,temp;
+       int space_max = 10;
+
+       struct fb_info *fbi = dev_get_drvdata(dev);
+       struct rk_lcdc_device_driver * dev_drv = 
+               (struct rk_lcdc_device_driver * )fbi->par;
+       
+       for(i=0;i<256;i++)
+       {
+               temp = i;
+               dsp_lut[i] = temp + (temp<<8) + (temp<<16);  //init by default value
+       }
+       printk("%s\n",start);
+       for(i=0;i<256;i++)
+       {
+               temp = simple_strtoul(start,NULL,10);
+               do
+               {
+                       start++;
+                       space_max--;
+               }while ((*start != ' ')&&space_max);
+               
+               if(!space_max)
+                       break;
+               else
+                       start++;
+       }
+       
+       dev_drv->set_dsp_lut(dev_drv,dsp_lut);
+
+       return count;
+       
+}
+
 static struct device_attribute rkfb_attrs[] = {
        __ATTR(phys_addr, S_IRUGO, show_phys, NULL),
        __ATTR(virt_addr, S_IRUGO, show_virt, NULL),
@@ -246,6 +290,7 @@ static struct device_attribute rkfb_attrs[] = {
        __ATTR(overlay, S_IRUGO | S_IWUSR, show_overlay, set_overlay),
        __ATTR(fps, S_IRUGO | S_IWUSR, show_fps, set_fps),
        __ATTR(map, S_IRUGO | S_IWUSR, show_fb_win_map, set_fb_win_map),
+       __ATTR(dsp_lut, S_IRUGO | S_IWUSR, show_dsp_lut, set_dsp_lut),
 };
 
 int rkfb_create_sysfs(struct fb_info *fbi)
index e4e2db3e4429cdbce0259eb4a2d2adf4619d70f7..b68134e1aaad211f47d8256d8c1b5bfd4ade3255 100644 (file)
@@ -232,6 +232,8 @@ struct rk_lcdc_device_driver{
        int (*fps_mgr)(struct rk_lcdc_device_driver *dev_drv,int fps,bool set);
        int (*fb_get_layer)(struct rk_lcdc_device_driver *dev_drv,const char *id);                                      //find layer for fb
        int (*fb_layer_remap)(struct rk_lcdc_device_driver *dev_drv,enum fb_win_map_order order);
+       int (*set_dsp_lut)(struct rk_lcdc_device_driver *dev_drv,int *lut);
+       int (*read_dsp_lut)(struct rk_lcdc_device_driver *dev_drv,int *lut);
        
 };