162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/video/omap2/omapfb.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2008 Nokia Corporation 662306a36Sopenharmony_ci * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Some code and ideas taken from drivers/video/omap/ driver 962306a36Sopenharmony_ci * by Imre Deak. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#ifndef __DRIVERS_VIDEO_OMAP2_OMAPFB_H__ 1362306a36Sopenharmony_ci#define __DRIVERS_VIDEO_OMAP2_OMAPFB_H__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifdef CONFIG_FB_OMAP2_DEBUG_SUPPORT 1662306a36Sopenharmony_ci#define DEBUG 1762306a36Sopenharmony_ci#endif 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <linux/rwsem.h> 2062306a36Sopenharmony_ci#include <linux/dma-mapping.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <video/omapfb_dss.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#ifdef DEBUG 2562306a36Sopenharmony_ciextern bool omapfb_debug; 2662306a36Sopenharmony_ci#define DBG(format, ...) \ 2762306a36Sopenharmony_ci do { \ 2862306a36Sopenharmony_ci if (omapfb_debug) \ 2962306a36Sopenharmony_ci printk(KERN_DEBUG "OMAPFB: " format, ## __VA_ARGS__); \ 3062306a36Sopenharmony_ci } while (0) 3162306a36Sopenharmony_ci#else 3262306a36Sopenharmony_ci#define DBG(format, ...) no_printk(format, ## __VA_ARGS__) 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define FB2OFB(fb_info) ((struct omapfb_info *)(fb_info->par)) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* max number of overlays to which a framebuffer data can be direct */ 3862306a36Sopenharmony_ci#define OMAPFB_MAX_OVL_PER_FB 3 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct omapfb2_mem_region { 4162306a36Sopenharmony_ci int id; 4262306a36Sopenharmony_ci unsigned long attrs; 4362306a36Sopenharmony_ci void *token; 4462306a36Sopenharmony_ci dma_addr_t dma_handle; 4562306a36Sopenharmony_ci u32 paddr; 4662306a36Sopenharmony_ci void __iomem *vaddr; 4762306a36Sopenharmony_ci struct vrfb vrfb; 4862306a36Sopenharmony_ci unsigned long size; 4962306a36Sopenharmony_ci u8 type; /* OMAPFB_PLANE_MEM_* */ 5062306a36Sopenharmony_ci bool alloc; /* allocated by the driver */ 5162306a36Sopenharmony_ci bool map; /* kernel mapped by the driver */ 5262306a36Sopenharmony_ci atomic_t map_count; 5362306a36Sopenharmony_ci struct rw_semaphore lock; 5462306a36Sopenharmony_ci atomic_t lock_count; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* appended to fb_info */ 5862306a36Sopenharmony_cistruct omapfb_info { 5962306a36Sopenharmony_ci int id; 6062306a36Sopenharmony_ci struct omapfb2_mem_region *region; 6162306a36Sopenharmony_ci int num_overlays; 6262306a36Sopenharmony_ci struct omap_overlay *overlays[OMAPFB_MAX_OVL_PER_FB]; 6362306a36Sopenharmony_ci struct omapfb2_device *fbdev; 6462306a36Sopenharmony_ci enum omap_dss_rotation_type rotation_type; 6562306a36Sopenharmony_ci u8 rotation[OMAPFB_MAX_OVL_PER_FB]; 6662306a36Sopenharmony_ci bool mirror; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistruct omapfb_display_data { 7062306a36Sopenharmony_ci struct omapfb2_device *fbdev; 7162306a36Sopenharmony_ci struct omap_dss_device *dssdev; 7262306a36Sopenharmony_ci u8 bpp_override; 7362306a36Sopenharmony_ci enum omapfb_update_mode update_mode; 7462306a36Sopenharmony_ci bool auto_update_work_enabled; 7562306a36Sopenharmony_ci struct delayed_work auto_update_work; 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistruct omapfb2_device { 7962306a36Sopenharmony_ci struct device *dev; 8062306a36Sopenharmony_ci struct mutex mtx; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci u32 pseudo_palette[17]; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci int state; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci unsigned num_fbs; 8762306a36Sopenharmony_ci struct fb_info *fbs[10]; 8862306a36Sopenharmony_ci struct omapfb2_mem_region regions[10]; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci unsigned num_displays; 9162306a36Sopenharmony_ci struct omapfb_display_data displays[10]; 9262306a36Sopenharmony_ci unsigned num_overlays; 9362306a36Sopenharmony_ci struct omap_overlay *overlays[10]; 9462306a36Sopenharmony_ci unsigned num_managers; 9562306a36Sopenharmony_ci struct omap_overlay_manager *managers[10]; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci struct workqueue_struct *auto_update_wq; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistruct omapfb_colormode { 10162306a36Sopenharmony_ci enum omap_color_mode dssmode; 10262306a36Sopenharmony_ci u32 bits_per_pixel; 10362306a36Sopenharmony_ci u32 nonstd; 10462306a36Sopenharmony_ci struct fb_bitfield red; 10562306a36Sopenharmony_ci struct fb_bitfield green; 10662306a36Sopenharmony_ci struct fb_bitfield blue; 10762306a36Sopenharmony_ci struct fb_bitfield transp; 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_civoid set_fb_fix(struct fb_info *fbi); 11162306a36Sopenharmony_ciint check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var); 11262306a36Sopenharmony_ciint omapfb_realloc_fbmem(struct fb_info *fbi, unsigned long size, int type); 11362306a36Sopenharmony_ciint omapfb_apply_changes(struct fb_info *fbi, int init); 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ciint omapfb_create_sysfs(struct omapfb2_device *fbdev); 11662306a36Sopenharmony_civoid omapfb_remove_sysfs(struct omapfb2_device *fbdev); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciint omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ciint dss_mode_to_fb_mode(enum omap_color_mode dssmode, 12162306a36Sopenharmony_ci struct fb_var_screeninfo *var); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ciint omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, 12462306a36Sopenharmony_ci u16 posx, u16 posy, u16 outw, u16 outh); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_civoid omapfb_start_auto_update(struct omapfb2_device *fbdev, 12762306a36Sopenharmony_ci struct omap_dss_device *display); 12862306a36Sopenharmony_civoid omapfb_stop_auto_update(struct omapfb2_device *fbdev, 12962306a36Sopenharmony_ci struct omap_dss_device *display); 13062306a36Sopenharmony_ciint omapfb_get_update_mode(struct fb_info *fbi, enum omapfb_update_mode *mode); 13162306a36Sopenharmony_ciint omapfb_set_update_mode(struct fb_info *fbi, enum omapfb_update_mode mode); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/* find the display connected to this fb, if any */ 13462306a36Sopenharmony_cistatic inline struct omap_dss_device *fb2display(struct fb_info *fbi) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci struct omapfb_info *ofbi = FB2OFB(fbi); 13762306a36Sopenharmony_ci struct omap_overlay *ovl; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci /* XXX: returns the display connected to first attached overlay */ 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci if (ofbi->num_overlays == 0) 14262306a36Sopenharmony_ci return NULL; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci ovl = ofbi->overlays[0]; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci return ovl->get_device(ovl); 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic inline struct omapfb_display_data *get_display_data( 15062306a36Sopenharmony_ci struct omapfb2_device *fbdev, struct omap_dss_device *dssdev) 15162306a36Sopenharmony_ci{ 15262306a36Sopenharmony_ci int i; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci for (i = 0; i < fbdev->num_displays; ++i) 15562306a36Sopenharmony_ci if (fbdev->displays[i].dssdev == dssdev) 15662306a36Sopenharmony_ci return &fbdev->displays[i]; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci /* This should never happen */ 15962306a36Sopenharmony_ci BUG(); 16062306a36Sopenharmony_ci return NULL; 16162306a36Sopenharmony_ci} 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic inline void omapfb_lock(struct omapfb2_device *fbdev) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci mutex_lock(&fbdev->mtx); 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistatic inline void omapfb_unlock(struct omapfb2_device *fbdev) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci mutex_unlock(&fbdev->mtx); 17162306a36Sopenharmony_ci} 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistatic inline int omapfb_overlay_enable(struct omap_overlay *ovl, 17462306a36Sopenharmony_ci int enable) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci if (enable) 17762306a36Sopenharmony_ci return ovl->enable(ovl); 17862306a36Sopenharmony_ci else 17962306a36Sopenharmony_ci return ovl->disable(ovl); 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic inline struct omapfb2_mem_region * 18362306a36Sopenharmony_ciomapfb_get_mem_region(struct omapfb2_mem_region *rg) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci down_read_nested(&rg->lock, rg->id); 18662306a36Sopenharmony_ci atomic_inc(&rg->lock_count); 18762306a36Sopenharmony_ci return rg; 18862306a36Sopenharmony_ci} 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic inline void omapfb_put_mem_region(struct omapfb2_mem_region *rg) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci atomic_dec(&rg->lock_count); 19362306a36Sopenharmony_ci up_read(&rg->lock); 19462306a36Sopenharmony_ci} 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci#endif 197