diff options
| -rw-r--r-- | arch/arm/plat-omap/dma.c | 6 | ||||
| -rw-r--r-- | arch/arm/plat-omap/fb.c | 80 | ||||
| -rw-r--r-- | include/asm-arm/arch-omap/dma.h | 1 | ||||
| -rw-r--r-- | include/asm-arm/arch-omap/lcd_lph8923.h | 14 | ||||
| -rw-r--r-- | include/asm-arm/arch-omap/omapfb.h | 98 |
5 files changed, 172 insertions, 27 deletions
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index a4e5ac77f6df..5dac4230360d 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
| @@ -1258,6 +1258,11 @@ void omap_stop_lcd_dma(void) | |||
| 1258 | omap_writew(w, OMAP1610_DMA_LCD_CTRL); | 1258 | omap_writew(w, OMAP1610_DMA_LCD_CTRL); |
| 1259 | } | 1259 | } |
| 1260 | 1260 | ||
| 1261 | int omap_lcd_dma_ext_running(void) | ||
| 1262 | { | ||
| 1263 | return lcd_dma.ext_ctrl && lcd_dma.active; | ||
| 1264 | } | ||
| 1265 | |||
| 1261 | /*----------------------------------------------------------------------------*/ | 1266 | /*----------------------------------------------------------------------------*/ |
| 1262 | 1267 | ||
| 1263 | static int __init omap_init_dma(void) | 1268 | static int __init omap_init_dma(void) |
| @@ -1389,6 +1394,7 @@ EXPORT_SYMBOL(omap_free_lcd_dma); | |||
| 1389 | EXPORT_SYMBOL(omap_enable_lcd_dma); | 1394 | EXPORT_SYMBOL(omap_enable_lcd_dma); |
| 1390 | EXPORT_SYMBOL(omap_setup_lcd_dma); | 1395 | EXPORT_SYMBOL(omap_setup_lcd_dma); |
| 1391 | EXPORT_SYMBOL(omap_stop_lcd_dma); | 1396 | EXPORT_SYMBOL(omap_stop_lcd_dma); |
| 1397 | EXPORT_SYMBOL(omap_lcd_dma_ext_running); | ||
| 1392 | EXPORT_SYMBOL(omap_set_lcd_dma_b1); | 1398 | EXPORT_SYMBOL(omap_set_lcd_dma_b1); |
| 1393 | EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer); | 1399 | EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer); |
| 1394 | EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller); | 1400 | EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller); |
diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c new file mode 100644 index 000000000000..305e9b990b71 --- /dev/null +++ b/arch/arm/plat-omap/fb.c | |||
| @@ -0,0 +1,80 @@ | |||
| 1 | #include <linux/config.h> | ||
| 2 | #include <linux/module.h> | ||
| 3 | #include <linux/kernel.h> | ||
| 4 | #include <linux/init.h> | ||
| 5 | #include <linux/platform_device.h> | ||
| 6 | #include <linux/bootmem.h> | ||
| 7 | |||
| 8 | #include <asm/hardware.h> | ||
| 9 | #include <asm/io.h> | ||
| 10 | #include <asm/mach-types.h> | ||
| 11 | #include <asm/mach/map.h> | ||
| 12 | |||
| 13 | #include <asm/arch/board.h> | ||
| 14 | #include <asm/arch/sram.h> | ||
| 15 | #include <asm/arch/omapfb.h> | ||
| 16 | |||
| 17 | #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) | ||
| 18 | |||
| 19 | static struct omapfb_platform_data omapfb_config; | ||
| 20 | |||
| 21 | static u64 omap_fb_dma_mask = ~(u32)0; | ||
| 22 | |||
| 23 | static struct platform_device omap_fb_device = { | ||
| 24 | .name = "omapfb", | ||
| 25 | .id = -1, | ||
| 26 | .dev = { | ||
| 27 | .dma_mask = &omap_fb_dma_mask, | ||
| 28 | .coherent_dma_mask = ~(u32)0, | ||
| 29 | .platform_data = &omapfb_config, | ||
| 30 | }, | ||
| 31 | .num_resources = 0, | ||
| 32 | }; | ||
| 33 | |||
| 34 | /* called from map_io */ | ||
| 35 | void omapfb_reserve_mem(void) | ||
| 36 | { | ||
| 37 | const struct omap_fbmem_config *fbmem_conf; | ||
| 38 | |||
| 39 | omapfb_config.fbmem.fb_sram_start = omap_fb_sram_start; | ||
| 40 | omapfb_config.fbmem.fb_sram_size = omap_fb_sram_size; | ||
| 41 | |||
| 42 | fbmem_conf = omap_get_config(OMAP_TAG_FBMEM, struct omap_fbmem_config); | ||
| 43 | |||
| 44 | if (fbmem_conf != NULL) { | ||
| 45 | /* indicate that the bootloader already initialized the | ||
| 46 | * fb device, so we'll skip that part in the fb driver | ||
| 47 | */ | ||
| 48 | omapfb_config.fbmem.fb_sdram_start = fbmem_conf->fb_sdram_start; | ||
| 49 | omapfb_config.fbmem.fb_sdram_size = fbmem_conf->fb_sdram_size; | ||
| 50 | if (fbmem_conf->fb_sdram_size) { | ||
| 51 | pr_info("Reserving %u bytes SDRAM for frame buffer\n", | ||
| 52 | fbmem_conf->fb_sdram_size); | ||
| 53 | reserve_bootmem(fbmem_conf->fb_sdram_start, | ||
| 54 | fbmem_conf->fb_sdram_size); | ||
| 55 | } | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | static inline int omap_init_fb(void) | ||
| 60 | { | ||
| 61 | const struct omap_lcd_config *conf; | ||
| 62 | |||
| 63 | conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config); | ||
| 64 | if (conf == NULL) | ||
| 65 | return 0; | ||
| 66 | |||
| 67 | omapfb_config.lcd = *conf; | ||
| 68 | |||
| 69 | return platform_device_register(&omap_fb_device); | ||
| 70 | } | ||
| 71 | |||
| 72 | arch_initcall(omap_init_fb); | ||
| 73 | |||
| 74 | #else | ||
| 75 | |||
| 76 | void omapfb_reserve_mem(void) {} | ||
| 77 | |||
| 78 | #endif | ||
| 79 | |||
| 80 | |||
diff --git a/include/asm-arm/arch-omap/dma.h b/include/asm-arm/arch-omap/dma.h index d4e73efcb816..ca1202312a45 100644 --- a/include/asm-arm/arch-omap/dma.h +++ b/include/asm-arm/arch-omap/dma.h | |||
| @@ -404,6 +404,7 @@ extern void omap_free_lcd_dma(void); | |||
| 404 | extern void omap_setup_lcd_dma(void); | 404 | extern void omap_setup_lcd_dma(void); |
| 405 | extern void omap_enable_lcd_dma(void); | 405 | extern void omap_enable_lcd_dma(void); |
| 406 | extern void omap_stop_lcd_dma(void); | 406 | extern void omap_stop_lcd_dma(void); |
| 407 | extern int omap_lcd_dma_ext_running(void); | ||
| 407 | extern void omap_set_lcd_dma_ext_controller(int external); | 408 | extern void omap_set_lcd_dma_ext_controller(int external); |
| 408 | extern void omap_set_lcd_dma_single_transfer(int single); | 409 | extern void omap_set_lcd_dma_single_transfer(int single); |
| 409 | extern void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres, | 410 | extern void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres, |
diff --git a/include/asm-arm/arch-omap/lcd_lph8923.h b/include/asm-arm/arch-omap/lcd_lph8923.h new file mode 100644 index 000000000000..004e67e22ca7 --- /dev/null +++ b/include/asm-arm/arch-omap/lcd_lph8923.h | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | #ifndef __LCD_LPH8923_H | ||
| 2 | #define __LCD_LPH8923_H | ||
| 3 | |||
| 4 | enum lcd_lph8923_test_num { | ||
| 5 | LCD_LPH8923_TEST_RGB_LINES, | ||
| 6 | }; | ||
| 7 | |||
| 8 | enum lcd_lph8923_test_result { | ||
| 9 | LCD_LPH8923_TEST_SUCCESS, | ||
| 10 | LCD_LPH8923_TEST_INVALID, | ||
| 11 | LCD_LPH8923_TEST_FAILED, | ||
| 12 | }; | ||
| 13 | |||
| 14 | #endif | ||
diff --git a/include/asm-arm/arch-omap/omapfb.h b/include/asm-arm/arch-omap/omapfb.h index 4ba2622cc142..fccdb3db025f 100644 --- a/include/asm-arm/arch-omap/omapfb.h +++ b/include/asm-arm/arch-omap/omapfb.h | |||
| @@ -34,9 +34,10 @@ | |||
| 34 | #define OMAPFB_MIRROR OMAP_IOW(31, int) | 34 | #define OMAPFB_MIRROR OMAP_IOW(31, int) |
| 35 | #define OMAPFB_SYNC_GFX OMAP_IO(37) | 35 | #define OMAPFB_SYNC_GFX OMAP_IO(37) |
| 36 | #define OMAPFB_VSYNC OMAP_IO(38) | 36 | #define OMAPFB_VSYNC OMAP_IO(38) |
| 37 | #define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, enum omapfb_update_mode) | 37 | #define OMAPFB_SET_UPDATE_MODE OMAP_IOW(40, int) |
| 38 | #define OMAPFB_UPDATE_WINDOW_OLD OMAP_IOW(41, struct omapfb_update_window_old) | ||
| 38 | #define OMAPFB_GET_CAPS OMAP_IOR(42, unsigned long) | 39 | #define OMAPFB_GET_CAPS OMAP_IOR(42, unsigned long) |
| 39 | #define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, enum omapfb_update_mode) | 40 | #define OMAPFB_GET_UPDATE_MODE OMAP_IOW(43, int) |
| 40 | #define OMAPFB_LCD_TEST OMAP_IOW(45, int) | 41 | #define OMAPFB_LCD_TEST OMAP_IOW(45, int) |
| 41 | #define OMAPFB_CTRL_TEST OMAP_IOW(46, int) | 42 | #define OMAPFB_CTRL_TEST OMAP_IOW(46, int) |
| 42 | #define OMAPFB_UPDATE_WINDOW OMAP_IOW(47, struct omapfb_update_window) | 43 | #define OMAPFB_UPDATE_WINDOW OMAP_IOW(47, struct omapfb_update_window) |
| @@ -66,9 +67,14 @@ enum omapfb_color_format { | |||
| 66 | }; | 67 | }; |
| 67 | 68 | ||
| 68 | struct omapfb_update_window { | 69 | struct omapfb_update_window { |
| 69 | u32 x, y; | 70 | __u32 x, y; |
| 70 | u32 width, height; | 71 | __u32 width, height; |
| 71 | u32 format; | 72 | __u32 format; |
| 73 | }; | ||
| 74 | |||
| 75 | struct omapfb_update_window_old { | ||
| 76 | __u32 x, y; | ||
| 77 | __u32 width, height; | ||
| 72 | }; | 78 | }; |
| 73 | 79 | ||
| 74 | enum omapfb_plane { | 80 | enum omapfb_plane { |
| @@ -83,17 +89,17 @@ enum omapfb_channel_out { | |||
| 83 | }; | 89 | }; |
| 84 | 90 | ||
| 85 | struct omapfb_setup_plane { | 91 | struct omapfb_setup_plane { |
| 86 | u8 plane; | 92 | __u8 plane; |
| 87 | u8 channel_out; | 93 | __u8 channel_out; |
| 88 | u32 offset; | 94 | __u32 offset; |
| 89 | u32 pos_x, pos_y; | 95 | __u32 pos_x, pos_y; |
| 90 | u32 width, height; | 96 | __u32 width, height; |
| 91 | u32 color_mode; | 97 | __u32 color_mode; |
| 92 | }; | 98 | }; |
| 93 | 99 | ||
| 94 | struct omapfb_enable_plane { | 100 | struct omapfb_enable_plane { |
| 95 | u8 plane; | 101 | __u8 plane; |
| 96 | u8 enable; | 102 | __u8 enable; |
| 97 | }; | 103 | }; |
| 98 | 104 | ||
| 99 | enum omapfb_color_key_type { | 105 | enum omapfb_color_key_type { |
| @@ -103,10 +109,10 @@ enum omapfb_color_key_type { | |||
| 103 | }; | 109 | }; |
| 104 | 110 | ||
| 105 | struct omapfb_color_key { | 111 | struct omapfb_color_key { |
| 106 | u8 channel_out; | 112 | __u8 channel_out; |
| 107 | u32 background; | 113 | __u32 background; |
| 108 | u32 trans_key; | 114 | __u32 trans_key; |
| 109 | u8 key_type; | 115 | __u8 key_type; |
| 110 | }; | 116 | }; |
| 111 | 117 | ||
| 112 | enum omapfb_update_mode { | 118 | enum omapfb_update_mode { |
| @@ -120,6 +126,9 @@ enum omapfb_update_mode { | |||
| 120 | #include <linux/completion.h> | 126 | #include <linux/completion.h> |
| 121 | #include <linux/interrupt.h> | 127 | #include <linux/interrupt.h> |
| 122 | #include <linux/fb.h> | 128 | #include <linux/fb.h> |
| 129 | #include <linux/mutex.h> | ||
| 130 | |||
| 131 | #include <asm/arch/board.h> | ||
| 123 | 132 | ||
| 124 | #define OMAP_LCDC_INV_VSYNC 0x0001 | 133 | #define OMAP_LCDC_INV_VSYNC 0x0001 |
| 125 | #define OMAP_LCDC_INV_HSYNC 0x0002 | 134 | #define OMAP_LCDC_INV_HSYNC 0x0002 |
| @@ -184,19 +193,38 @@ struct extif_timings { | |||
| 184 | int re_cycle_time; | 193 | int re_cycle_time; |
| 185 | int cs_pulse_width; | 194 | int cs_pulse_width; |
| 186 | int access_time; | 195 | int access_time; |
| 196 | |||
| 197 | int clk_div; | ||
| 198 | |||
| 199 | u32 tim[5]; /* set by extif->convert_timings */ | ||
| 200 | |||
| 201 | int converted; | ||
| 187 | }; | 202 | }; |
| 188 | 203 | ||
| 189 | struct lcd_ctrl_extif { | 204 | struct lcd_ctrl_extif { |
| 190 | int (*init) (void); | 205 | int (*init) (void); |
| 191 | void (*cleanup) (void); | 206 | void (*cleanup) (void); |
| 207 | void (*get_clk_info) (u32 *clk_period, u32 *max_clk_div); | ||
| 208 | int (*convert_timings) (struct extif_timings *timings); | ||
| 192 | void (*set_timings) (const struct extif_timings *timings); | 209 | void (*set_timings) (const struct extif_timings *timings); |
| 193 | void (*write_command) (u32 cmd); | 210 | void (*set_bits_per_cycle)(int bpc); |
| 194 | u32 (*read_data) (void); | 211 | void (*write_command) (const void *buf, unsigned int len); |
| 195 | void (*write_data) (u32 data); | 212 | void (*read_data) (void *buf, unsigned int len); |
| 213 | void (*write_data) (const void *buf, unsigned int len); | ||
| 196 | void (*transfer_area) (int width, int height, | 214 | void (*transfer_area) (int width, int height, |
| 197 | void (callback)(void * data), void *data); | 215 | void (callback)(void * data), void *data); |
| 216 | unsigned long max_transmit_size; | ||
| 198 | }; | 217 | }; |
| 199 | 218 | ||
| 219 | struct omapfb_notifier_block { | ||
| 220 | struct notifier_block nb; | ||
| 221 | void *data; | ||
| 222 | }; | ||
| 223 | |||
| 224 | typedef int (*omapfb_notifier_callback_t)(struct omapfb_notifier_block *, | ||
| 225 | unsigned long event, | ||
| 226 | struct omapfb_device *fbdev); | ||
| 227 | |||
| 200 | struct lcd_ctrl { | 228 | struct lcd_ctrl { |
| 201 | const char *name; | 229 | const char *name; |
| 202 | void *data; | 230 | void *data; |
| @@ -204,9 +232,11 @@ struct lcd_ctrl { | |||
| 204 | int (*init) (struct omapfb_device *fbdev, | 232 | int (*init) (struct omapfb_device *fbdev, |
| 205 | int ext_mode, int req_vram_size); | 233 | int ext_mode, int req_vram_size); |
| 206 | void (*cleanup) (void); | 234 | void (*cleanup) (void); |
| 235 | void (*bind_client) (struct omapfb_notifier_block *nb); | ||
| 207 | void (*get_vram_layout)(unsigned long *size, | 236 | void (*get_vram_layout)(unsigned long *size, |
| 208 | void **virt_base, | 237 | void **virt_base, |
| 209 | dma_addr_t *phys_base); | 238 | dma_addr_t *phys_base); |
| 239 | int (*mmap) (struct vm_area_struct *vma); | ||
| 210 | unsigned long (*get_caps) (void); | 240 | unsigned long (*get_caps) (void); |
| 211 | int (*set_update_mode)(enum omapfb_update_mode mode); | 241 | int (*set_update_mode)(enum omapfb_update_mode mode); |
| 212 | enum omapfb_update_mode (*get_update_mode)(void); | 242 | enum omapfb_update_mode (*get_update_mode)(void); |
| @@ -240,7 +270,7 @@ struct omapfb_device { | |||
| 240 | int state; | 270 | int state; |
| 241 | int ext_lcdc; /* Using external | 271 | int ext_lcdc; /* Using external |
| 242 | LCD controller */ | 272 | LCD controller */ |
| 243 | struct semaphore rqueue_sema; | 273 | struct mutex rqueue_mutex; |
| 244 | 274 | ||
| 245 | void *vram_virt_base; | 275 | void *vram_virt_base; |
| 246 | dma_addr_t vram_phys_base; | 276 | dma_addr_t vram_phys_base; |
| @@ -261,12 +291,13 @@ struct omapfb_device { | |||
| 261 | struct device *dev; | 291 | struct device *dev; |
| 262 | }; | 292 | }; |
| 263 | 293 | ||
| 264 | extern struct lcd_panel h3_panel; | 294 | struct omapfb_platform_data { |
| 265 | extern struct lcd_panel h2_panel; | 295 | struct omap_lcd_config lcd; |
| 266 | extern struct lcd_panel p2_panel; | 296 | struct omap_fbmem_config fbmem; |
| 267 | extern struct lcd_panel osk_panel; | 297 | }; |
| 268 | extern struct lcd_panel innovator1610_panel; | 298 | |
| 269 | extern struct lcd_panel innovator1510_panel; | 299 | #define OMAPFB_EVENT_READY 1 |
| 300 | #define OMAPFB_EVENT_DISABLED 2 | ||
| 270 | 301 | ||
| 271 | #ifdef CONFIG_ARCH_OMAP1 | 302 | #ifdef CONFIG_ARCH_OMAP1 |
| 272 | extern struct lcd_ctrl omap1_lcd_ctrl; | 303 | extern struct lcd_ctrl omap1_lcd_ctrl; |
| @@ -274,7 +305,20 @@ extern struct lcd_ctrl omap1_lcd_ctrl; | |||
| 274 | extern struct lcd_ctrl omap2_disp_ctrl; | 305 | extern struct lcd_ctrl omap2_disp_ctrl; |
| 275 | #endif | 306 | #endif |
| 276 | 307 | ||
| 308 | extern void omapfb_register_panel(struct lcd_panel *panel); | ||
| 277 | extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); | 309 | extern void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval); |
| 310 | extern void omapfb_notify_clients(struct omapfb_device *fbdev, | ||
| 311 | unsigned long event); | ||
| 312 | extern int omapfb_register_client(struct omapfb_notifier_block *nb, | ||
| 313 | omapfb_notifier_callback_t callback, | ||
| 314 | void *callback_data); | ||
| 315 | extern int omapfb_unregister_client(struct omapfb_notifier_block *nb); | ||
| 316 | extern int omapfb_update_window_async(struct omapfb_update_window *win, | ||
| 317 | void (*callback)(void *), | ||
| 318 | void *callback_data); | ||
| 319 | |||
| 320 | /* in arch/arm/plat-omap/devices.c */ | ||
| 321 | extern void omapfb_reserve_mem(void); | ||
| 278 | 322 | ||
| 279 | #endif /* __KERNEL__ */ | 323 | #endif /* __KERNEL__ */ |
| 280 | 324 | ||
