1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2f7018c21STomi Valkeinen #ifndef SH_MOBILE_LCDCFB_H 3f7018c21STomi Valkeinen #define SH_MOBILE_LCDCFB_H 4f7018c21STomi Valkeinen 5f7018c21STomi Valkeinen #include <linux/completion.h> 6f7018c21STomi Valkeinen #include <linux/fb.h> 7f7018c21STomi Valkeinen #include <linux/mutex.h> 8f7018c21STomi Valkeinen #include <linux/wait.h> 9f7018c21STomi Valkeinen 10f7018c21STomi Valkeinen /* per-channel registers */ 11f7018c21STomi Valkeinen enum { LDDCKPAT1R, LDDCKPAT2R, LDMT1R, LDMT2R, LDMT3R, LDDFR, LDSM1R, 12f7018c21STomi Valkeinen LDSM2R, LDSA1R, LDSA2R, LDMLSR, LDHCNR, LDHSYNR, LDVLNR, LDVSYNR, LDPMR, 13f7018c21STomi Valkeinen LDHAJR, 14f7018c21STomi Valkeinen NR_CH_REGS }; 15f7018c21STomi Valkeinen 16f7018c21STomi Valkeinen #define PALETTE_NR 16 17f7018c21STomi Valkeinen 18f7018c21STomi Valkeinen struct backlight_device; 19f7018c21STomi Valkeinen struct fb_info; 20f7018c21STomi Valkeinen struct module; 21f7018c21STomi Valkeinen struct sh_mobile_lcdc_chan; 22f7018c21STomi Valkeinen struct sh_mobile_lcdc_entity; 23f7018c21STomi Valkeinen struct sh_mobile_lcdc_format_info; 24f7018c21STomi Valkeinen struct sh_mobile_lcdc_priv; 25f7018c21STomi Valkeinen 26f7018c21STomi Valkeinen #define SH_MOBILE_LCDC_DISPLAY_DISCONNECTED 0 27f7018c21STomi Valkeinen #define SH_MOBILE_LCDC_DISPLAY_CONNECTED 1 28f7018c21STomi Valkeinen 29f7018c21STomi Valkeinen struct sh_mobile_lcdc_entity_ops { 30f7018c21STomi Valkeinen /* Display */ 31f7018c21STomi Valkeinen int (*display_on)(struct sh_mobile_lcdc_entity *entity); 32f7018c21STomi Valkeinen void (*display_off)(struct sh_mobile_lcdc_entity *entity); 33f7018c21STomi Valkeinen }; 34f7018c21STomi Valkeinen 35f7018c21STomi Valkeinen enum sh_mobile_lcdc_entity_event { 36f7018c21STomi Valkeinen SH_MOBILE_LCDC_EVENT_DISPLAY_CONNECT, 37f7018c21STomi Valkeinen SH_MOBILE_LCDC_EVENT_DISPLAY_DISCONNECT, 38f7018c21STomi Valkeinen SH_MOBILE_LCDC_EVENT_DISPLAY_MODE, 39f7018c21STomi Valkeinen }; 40f7018c21STomi Valkeinen 41f7018c21STomi Valkeinen struct sh_mobile_lcdc_entity { 42f7018c21STomi Valkeinen struct module *owner; 43f7018c21STomi Valkeinen const struct sh_mobile_lcdc_entity_ops *ops; 44f7018c21STomi Valkeinen struct sh_mobile_lcdc_chan *lcdc; 45f7018c21STomi Valkeinen struct fb_videomode def_mode; 46f7018c21STomi Valkeinen }; 47f7018c21STomi Valkeinen 48f7018c21STomi Valkeinen /* 49f7018c21STomi Valkeinen * struct sh_mobile_lcdc_chan - LCDC display channel 50f7018c21STomi Valkeinen * 51f7018c21STomi Valkeinen * @pan_y_offset: Panning linear offset in bytes (luma component) 52f7018c21STomi Valkeinen * @base_addr_y: Frame buffer viewport base address (luma component) 53f7018c21STomi Valkeinen * @base_addr_c: Frame buffer viewport base address (chroma component) 54f7018c21STomi Valkeinen * @pitch: Frame buffer line pitch 55f7018c21STomi Valkeinen */ 56f7018c21STomi Valkeinen struct sh_mobile_lcdc_chan { 57f7018c21STomi Valkeinen struct sh_mobile_lcdc_priv *lcdc; 58f7018c21STomi Valkeinen struct sh_mobile_lcdc_entity *tx_dev; 59f7018c21STomi Valkeinen const struct sh_mobile_lcdc_chan_cfg *cfg; 60f7018c21STomi Valkeinen 61f7018c21STomi Valkeinen unsigned long *reg_offs; 62f7018c21STomi Valkeinen unsigned long ldmt1r_value; 63f7018c21STomi Valkeinen unsigned long enabled; /* ME and SE in LDCNT2R */ 64f7018c21STomi Valkeinen 65f7018c21STomi Valkeinen struct mutex open_lock; /* protects the use counter */ 66f7018c21STomi Valkeinen int use_count; 67f7018c21STomi Valkeinen 68f7018c21STomi Valkeinen void *fb_mem; 69f7018c21STomi Valkeinen unsigned long fb_size; 70f7018c21STomi Valkeinen 71f7018c21STomi Valkeinen dma_addr_t dma_handle; 72f7018c21STomi Valkeinen unsigned long pan_y_offset; 73f7018c21STomi Valkeinen 74f7018c21STomi Valkeinen unsigned long frame_end; 75f7018c21STomi Valkeinen wait_queue_head_t frame_end_wait; 76f7018c21STomi Valkeinen struct completion vsync_completion; 77f7018c21STomi Valkeinen 78f7018c21STomi Valkeinen const struct sh_mobile_lcdc_format_info *format; 79f7018c21STomi Valkeinen u32 colorspace; 80f7018c21STomi Valkeinen unsigned int xres; 81f7018c21STomi Valkeinen unsigned int xres_virtual; 82f7018c21STomi Valkeinen unsigned int yres; 83f7018c21STomi Valkeinen unsigned int yres_virtual; 84f7018c21STomi Valkeinen unsigned int pitch; 85f7018c21STomi Valkeinen 86f7018c21STomi Valkeinen unsigned long base_addr_y; 87f7018c21STomi Valkeinen unsigned long base_addr_c; 88f7018c21STomi Valkeinen unsigned int line_size; 89f7018c21STomi Valkeinen 90f7018c21STomi Valkeinen /* Backlight */ 91f7018c21STomi Valkeinen struct backlight_device *bl; 92f7018c21STomi Valkeinen unsigned int bl_brightness; 93f7018c21STomi Valkeinen 94f7018c21STomi Valkeinen /* FB */ 95f7018c21STomi Valkeinen struct fb_info *info; 96f7018c21STomi Valkeinen u32 pseudo_palette[PALETTE_NR]; 97f7018c21STomi Valkeinen struct { 98f7018c21STomi Valkeinen unsigned int width; 99f7018c21STomi Valkeinen unsigned int height; 100f7018c21STomi Valkeinen struct fb_videomode mode; 101f7018c21STomi Valkeinen } display; 102f7018c21STomi Valkeinen struct fb_deferred_io defio; 103f7018c21STomi Valkeinen struct scatterlist *sglist; 104f7018c21STomi Valkeinen int blank_status; 105f7018c21STomi Valkeinen }; 106f7018c21STomi Valkeinen 107f7018c21STomi Valkeinen #endif 108