Work on Glamo-core for DRM
[kernel.git] / drivers / mfd / glamo / glamo-core.h
1 #ifndef __GLAMO_CORE_H
2 #define __GLAMO_CORE_H
3
4 #include <linux/mfd/glamo.h>
5
6 /* Amount of Glamo memory */
7 #define GLAMO_INTERNAL_RAM_SIZE 0x800000
8
9 /* Arbitrarily determined amount for the hardware cursor */
10 #define GLAMO_CURSOR_SIZE (4096)
11 #define GLAMO_MMC_BUFFER_SIZE (64 * 1024) /* 64k MMC buffer */
12 /* Remaining memory will be used for 2D and 3D graphics */
13 #define GLAMO_FB_SIZE (GLAMO_INTERNAL_RAM_SIZE     \
14                          - GLAMO_CURSOR_SIZE       \
15                          - GLAMO_MMC_BUFFER_SIZE)
16 /* A 640x480, 16bpp, double-buffered framebuffer */
17 #if (GLAMO_FB_SIZE < (640 * 480 * 4))   /* == 0x12c000 */
18 #error Not enough Glamo VRAM for framebuffer!
19 #endif
20
21 /* for the time being, we put the on-screen framebuffer into the lowest
22  * VRAM space.  This should make the code easily compatible with the various
23  * 2MB/4MB/8MB variants of the Smedia chips
24  * glamo-fb.c assumes FB comes first, followed by cursor, so DON'T MOVE THEM
25  * (see glamo_regs[] in glamo-fb.c for more information) */
26 #define GLAMO_MEM_BASE          (0x800000)
27 #define GLAMO_OFFSET_FB         (0x000000)
28 #define GLAMO_OFFSET_CURSOR     (GLAMO_OFFSET_FB + GLAMO_FB_SIZE)
29 #define GLAMO_OFFSET_MMC        (GLAMO_OFFSET_CURSOR + GLAMO_CURSOR_SIZE)
30
31 enum glamo_pll {
32     GLAMO_PLL1,
33     GLAMO_PLL2,
34 };
35
36 enum glamo_engine_state {
37     GLAMO_ENGINE_DISABLED,
38     GLAMO_ENGINE_SUSPENDED,
39     GLAMO_ENGINE_ENABLED,
40 };
41
42 struct glamo_core {
43         int irq;
44         int irq_base;
45         int irq_works; /* 0 means PCB does not support Glamo IRQ */
46         struct resource *mem;
47         void __iomem *base;
48         struct platform_device *pdev;
49         struct glamo_platform_data *pdata;
50         enum glamo_engine_state engine_state[__NUM_GLAMO_ENGINES];
51         spinlock_t lock;
52         uint16_t saved_irq_mask;
53 };
54
55 struct glamo_script {
56         uint16_t reg;
57         uint16_t val;
58 };
59
60 int glamo_pll_rate(struct glamo_core *glamo, enum glamo_pll pll);
61
62 int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine);
63 int glamo_engine_suspend(struct glamo_core *glamo, enum glamo_engine engine);
64 int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine);
65 void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine);
66 int glamo_engine_reclock(struct glamo_core *glamo,
67                          enum glamo_engine engine, int ps);
68
69 void glamo_reg_read_batch(struct glamo_core *glamo, uint16_t reg,
70                                 uint16_t count, uint16_t *values);
71 void glamo_reg_write_batch(struct glamo_core *glamo, uint16_t reg,
72                                 uint16_t count, uint16_t *values);
73 #endif /* __GLAMO_CORE_H */