From f188357974a2e939270292d5670297e242dd80e7 Mon Sep 17 00:00:00 2001 From: yxj Date: Thu, 29 Mar 2012 17:05:40 +0800 Subject: [PATCH] rk30 fb: add sys for debug,add rk_get_lcdc_drv for hdmi --- drivers/video/rockchip/Makefile | 2 +- drivers/video/rockchip/chips/rk30_lcdc.c | 11 +- drivers/video/rockchip/rk_fb.c | 18 ++- drivers/video/rockchip/rkfb_sysfs.c | 117 ++++++++++++++++++ .../video/rockchip => include/linux}/rk_fb.h | 4 + 5 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 drivers/video/rockchip/rkfb_sysfs.c rename {drivers/video/rockchip => include/linux}/rk_fb.h (95%) diff --git a/drivers/video/rockchip/Makefile b/drivers/video/rockchip/Makefile index efd39468e08d..90f3b91aa591 100644 --- a/drivers/video/rockchip/Makefile +++ b/drivers/video/rockchip/Makefile @@ -1,3 +1,3 @@ -obj-$(CONFIG_FB_ROCKCHIP) += rk_fb.o +obj-$(CONFIG_FB_ROCKCHIP) += rk_fb.o rkfb_sysfs.o obj-$(CONFIG_LCDC_RK30) += chips/rk30_lcdc.o obj-$(CONFIG_RGA_RK30) += rga/ diff --git a/drivers/video/rockchip/chips/rk30_lcdc.c b/drivers/video/rockchip/chips/rk30_lcdc.c index a4517a590714..26a7a1af000e 100644 --- a/drivers/video/rockchip/chips/rk30_lcdc.c +++ b/drivers/video/rockchip/chips/rk30_lcdc.c @@ -34,12 +34,14 @@ #include #include "../../display/screen/screen.h" -#include "../rk_fb.h" +#include #include "rk30_lcdc.h" + + static int dbg_thresd = 0; module_param(dbg_thresd, int, S_IRUGO|S_IWUSR); #define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0) @@ -87,9 +89,10 @@ static int rk30_lcdc_deinit(struct rk30_lcdc_device *lcdc_dev) return 0; } -int rk30_load_screen(struct rk30_lcdc_device*lcdc_dev, bool initscreen) +static int rk30_load_screen(struct rk_lcdc_device_driver *dev_drv, bool initscreen) { int ret = -EINVAL; + struct rk30_lcdc_device *lcdc_dev = container_of(dev_drv,struct rk30_lcdc_device,driver); rk_screen *screen = lcdc_dev->screen; u16 face; u16 mcu_total, mcu_rwstart, mcu_csstart, mcu_rwend, mcu_csend; @@ -549,8 +552,8 @@ static struct rk_lcdc_device_driver lcdc_driver = { .set_par = rk30_lcdc_set_par, .blank = rk30_lcdc_blank, .pan_display = rk30_lcdc_pan_display, + .load_screen = rk30_load_screen, }; - static int __devinit rk30_lcdc_probe (struct platform_device *pdev) { struct rk30_lcdc_device *lcdc_dev=NULL; @@ -619,7 +622,7 @@ static int __devinit rk30_lcdc_probe (struct platform_device *pdev) printk(KERN_ERR "init rk30 lcdc failed!\n"); goto err3; } - ret = rk30_load_screen(lcdc_dev,1); + ret = rk30_load_screen(&(lcdc_dev->driver),1); if(ret < 0) { printk(KERN_ERR "rk30 load screen for lcdc0 failed!\n"); diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index f720b7c36941..78ba1805afec 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -30,9 +30,9 @@ #include #include #include - #include "../display/screen/screen.h" -#include "rk_fb.h" +#include + #if 0 #define fbprintk(msg...) printk(msg); @@ -71,7 +71,7 @@ defautl:we alloc three buffer,one for fb0 and fb2 display ui,one for ipp rotate pass the phy addr to fix.smem_start by ioctl ****************************************************************************/ -static int get_fb_layer_id(struct fb_fix_screeninfo *fix) +int get_fb_layer_id(struct fb_fix_screeninfo *fix) { int layer_id; if(!strcmp(fix->id,"fb1")||!strcmp(fix->id,"fb3")) @@ -90,6 +90,17 @@ static int get_fb_layer_id(struct fb_fix_screeninfo *fix) return layer_id; } + +/********************************************************************** +this is for hdmi +id: lcdc id ,0 for lcdc0 ,1 for lcdc1 +***********************************************************************/ +struct rk_lcdc_device_driver * rk_get_lcdc_drv(int id) +{ + struct rk_fb_inf *inf = platform_get_drvdata(g_fb_pdev); + return inf->lcdc_dev_drv[id]; + +} static int rk_fb_open(struct fb_info *info,int user) { struct rk_fb_inf *inf = dev_get_drvdata(info->device); @@ -655,6 +666,7 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv) printk("%s>>fb%d register_framebuffer fail!\n",__func__,fb_inf->num_fb); ret = -EINVAL; } + rkfb_create_sysfs(fbi); fb_inf->fb[fb_inf->num_fb] = fbi; printk("%s>>>>>%s\n",__func__,fb_inf->fb[fb_inf->num_fb]->fix.id); fb_inf->num_fb++; diff --git a/drivers/video/rockchip/rkfb_sysfs.c b/drivers/video/rockchip/rkfb_sysfs.c new file mode 100644 index 000000000000..7e36b2a2e49a --- /dev/null +++ b/drivers/video/rockchip/rkfb_sysfs.c @@ -0,0 +1,117 @@ +/* + * linux/drivers/video/rockchip/rkfb-sysfs.c + * + * Copyright (C) 2012 Rockchip Corporation + * Author: yxj + * + * Some code and ideas taken from + *drivers/video/omap2/omapfb/omapfb-sys.c + *driver by Tomi Valkeinen. + * + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "../display/screen/screen.h" +#include + + +static ssize_t show_screen_info(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct rk_lcdc_device_driver * dev_drv = + (struct rk_lcdc_device_driver * )fbi->par; + rk_screen * screen = dev_drv->screen; + int fps; + u64 ft = (u64)(screen->upper_margin + screen->lower_margin + screen->y_res +screen->vsync_len)* + (screen->left_margin + screen->right_margin + screen->x_res + screen->hsync_len)* + (dev_drv->pixclock); // one frame time ,(pico seconds) + fps = div64_u64(1000000000000llu,ft); + return snprintf(buf, PAGE_SIZE,"xres:%d\nyres:%d\nfps:%d\n", + screen->x_res,screen->y_res,fps); +} + +static ssize_t show_disp_info(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + struct rk_lcdc_device_driver * dev_drv = + (struct rk_lcdc_device_driver * )fbi->par; + int layer_id = get_fb_layer_id(&fbi->fix); + if(dev_drv->get_disp_info) + dev_drv->get_disp_info(dev_drv,layer_id); +} + +static ssize_t show_phys(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + return snprintf(buf, PAGE_SIZE, "0x%lx-----0x%x\n", + fbi->fix.smem_start,fbi->fix.smem_len); +} + +static ssize_t show_virt(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fb_info *fbi = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "0x%p-----0x%x\n", + fbi->screen_base,fbi->fix.smem_len); +} + +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(screen_info, S_IRUGO, show_screen_info, NULL), +}; + +int rkfb_create_sysfs(struct fb_info *fbi) +{ + int r; + int t; + for (t = 0; t < ARRAY_SIZE(rkfb_attrs); t++) + { + r = device_create_file(fbi->dev,&rkfb_attrs[t]); + if (r) + { + dev_err(fbi->dev, "failed to create sysfs " + "file\n"); + return r; + } + } + + + return 0; +} + +void rkfb_remove_sysfs(struct rk_fb_inf *inf) +{ + int i, t; + + for (i = 0; i < inf->num_fb; i++) { + for (t = 0; t < ARRAY_SIZE(rkfb_attrs); t++) + device_remove_file(inf->fb[i]->dev, + &rkfb_attrs[t]); + } +} + diff --git a/drivers/video/rockchip/rk_fb.h b/include/linux/rk_fb.h similarity index 95% rename from drivers/video/rockchip/rk_fb.h rename to include/linux/rk_fb.h index 85433919afba..c3907d2b80fe 100644 --- a/drivers/video/rockchip/rk_fb.h +++ b/include/linux/rk_fb.h @@ -189,6 +189,8 @@ struct rk_lcdc_device_driver{ int (*blank)(struct rk_lcdc_device_driver *dev_drv,int layer_id,int blank_mode); int (*set_par)(struct rk_lcdc_device_driver *dev_drv,int layer_id); int (*pan_display)(struct rk_lcdc_device_driver *dev_drv,int layer_id); + int (*get_disp_info)(struct rk_lcdc_device_driver *dev_drv,int layer_id); + int (*load_screen)(struct rk_lcdc_device_driver *lcdc_dev, bool initscreen); }; @@ -205,4 +207,6 @@ extern int rk_fb_register(struct rk_lcdc_device_driver *fb_device_driver); extern int rk_fb_unregister(struct rk_lcdc_device_driver *fb_device_driver); extern int init_lcdc_device_driver(struct rk_lcdc_device_driver *def_drv, struct rk_lcdc_device_driver *dev_drv,int id); +extern int get_fb_layer_id(struct fb_fix_screeninfo *fix); +extern int rkfb_create_sysfs(struct fb_info *fbi); #endif -- 2.34.1