2009-08-04 16:12:50 +03:00
/*
* linux / drivers / video / omap2 / omapfb . h
*
* Copyright ( C ) 2008 Nokia Corporation
* Author : Tomi Valkeinen < tomi . valkeinen @ nokia . com >
*
* Some code and ideas taken from drivers / video / omap / driver
* by Imre Deak .
*
* 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 < http : //www.gnu.org/licenses/>.
*/
# ifndef __DRIVERS_VIDEO_OMAP2_OMAPFB_H__
# define __DRIVERS_VIDEO_OMAP2_OMAPFB_H__
# ifdef CONFIG_FB_OMAP2_DEBUG_SUPPORT
# define DEBUG
# endif
# include <plat/display.h>
# ifdef DEBUG
extern unsigned int omapfb_debug ;
# define DBG(format, ...) \
if ( omapfb_debug ) \
printk ( KERN_DEBUG " OMAPFB: " format , # # __VA_ARGS__ )
# else
# define DBG(format, ...)
# endif
# define FB2OFB(fb_info) ((struct omapfb_info *)(fb_info->par))
/* max number of overlays to which a framebuffer data can be direct */
# define OMAPFB_MAX_OVL_PER_FB 3
struct omapfb2_mem_region {
2010-03-17 20:36:51 +02:00
int id ;
2009-08-04 16:12:50 +03:00
u32 paddr ;
void __iomem * vaddr ;
struct vrfb vrfb ;
unsigned long size ;
u8 type ; /* OMAPFB_PLANE_MEM_* */
bool alloc ; /* allocated by the driver */
bool map ; /* kernel mapped by the driver */
2010-03-17 20:43:23 +02:00
struct mutex mtx ;
unsigned int ref ;
2010-03-17 20:36:51 +02:00
atomic_t map_count ;
2009-08-04 16:12:50 +03:00
} ;
/* appended to fb_info */
struct omapfb_info {
int id ;
2010-03-17 20:36:51 +02:00
struct omapfb2_mem_region * region ;
2009-08-04 16:12:50 +03:00
int num_overlays ;
struct omap_overlay * overlays [ OMAPFB_MAX_OVL_PER_FB ] ;
struct omapfb2_device * fbdev ;
enum omap_dss_rotation_type rotation_type ;
u8 rotation [ OMAPFB_MAX_OVL_PER_FB ] ;
bool mirror ;
} ;
struct omapfb2_device {
struct device * dev ;
struct mutex mtx ;
u32 pseudo_palette [ 17 ] ;
int state ;
unsigned num_fbs ;
struct fb_info * fbs [ 10 ] ;
2010-03-17 20:36:51 +02:00
struct omapfb2_mem_region regions [ 10 ] ;
2009-08-04 16:12:50 +03:00
unsigned num_displays ;
struct omap_dss_device * displays [ 10 ] ;
unsigned num_overlays ;
struct omap_overlay * overlays [ 10 ] ;
unsigned num_managers ;
struct omap_overlay_manager * managers [ 10 ] ;
2010-01-11 14:33:40 +02:00
unsigned num_bpp_overrides ;
struct {
struct omap_dss_device * dssdev ;
u8 bpp ;
} bpp_overrides [ 10 ] ;
2009-08-04 16:12:50 +03:00
} ;
struct omapfb_colormode {
enum omap_color_mode dssmode ;
u32 bits_per_pixel ;
u32 nonstd ;
struct fb_bitfield red ;
struct fb_bitfield green ;
struct fb_bitfield blue ;
struct fb_bitfield transp ;
} ;
void set_fb_fix ( struct fb_info * fbi ) ;
int check_fb_var ( struct fb_info * fbi , struct fb_var_screeninfo * var ) ;
int omapfb_realloc_fbmem ( struct fb_info * fbi , unsigned long size , int type ) ;
int omapfb_apply_changes ( struct fb_info * fbi , int init ) ;
int omapfb_create_sysfs ( struct omapfb2_device * fbdev ) ;
void omapfb_remove_sysfs ( struct omapfb2_device * fbdev ) ;
int omapfb_ioctl ( struct fb_info * fbi , unsigned int cmd , unsigned long arg ) ;
2010-02-05 14:46:19 +02:00
int omapfb_update_window ( struct fb_info * fbi ,
u32 x , u32 y , u32 w , u32 h ) ;
2009-08-04 16:12:50 +03:00
int dss_mode_to_fb_mode ( enum omap_color_mode dssmode ,
struct fb_var_screeninfo * var ) ;
2010-03-17 20:36:51 +02:00
int omapfb_setup_overlay ( struct fb_info * fbi , struct omap_overlay * ovl ,
u16 posx , u16 posy , u16 outw , u16 outh ) ;
2009-08-04 16:12:50 +03:00
/* find the display connected to this fb, if any */
static inline struct omap_dss_device * fb2display ( struct fb_info * fbi )
{
struct omapfb_info * ofbi = FB2OFB ( fbi ) ;
int i ;
/* XXX: returns the display connected to first attached overlay */
for ( i = 0 ; i < ofbi - > num_overlays ; i + + ) {
if ( ofbi - > overlays [ i ] - > manager )
return ofbi - > overlays [ i ] - > manager - > device ;
}
return NULL ;
}
static inline void omapfb_lock ( struct omapfb2_device * fbdev )
{
mutex_lock ( & fbdev - > mtx ) ;
}
static inline void omapfb_unlock ( struct omapfb2_device * fbdev )
{
mutex_unlock ( & fbdev - > mtx ) ;
}
static inline int omapfb_overlay_enable ( struct omap_overlay * ovl ,
int enable )
{
struct omap_overlay_info info ;
ovl - > get_overlay_info ( ovl , & info ) ;
2010-03-17 20:13:44 +02:00
if ( info . enabled = = enable )
return 0 ;
2009-08-04 16:12:50 +03:00
info . enabled = enable ;
return ovl - > set_overlay_info ( ovl , & info ) ;
}
2010-03-17 20:43:23 +02:00
static inline struct omapfb2_mem_region *
omapfb_get_mem_region ( struct omapfb2_mem_region * rg )
{
mutex_lock ( & rg - > mtx ) ;
rg - > ref + + ;
mutex_unlock ( & rg - > mtx ) ;
return rg ;
}
static inline void omapfb_put_mem_region ( struct omapfb2_mem_region * rg )
{
mutex_lock ( & rg - > mtx ) ;
rg - > ref - - ;
mutex_unlock ( & rg - > mtx ) ;
}
2009-08-04 16:12:50 +03:00
# endif