aboutsummaryrefslogtreecommitdiff
path: root/drivers/mfd/glamo/glamo-drm-private.h
blob: 02ae7e9fd2ee706f8ab0a99931d44e59f5489403 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* Smedia Glamo 336x/337x DRM private bits
 *
 * Copyright (C) 2008-2009 Thomas White <taw@bitwiz.org.uk>
 * Copyright (C) 2009 Andreas Pokorny <andreas.pokorny@gmail.com>
 * Based on xf86-video-glamo
 * Copyright  2007 OpenMoko, Inc.
 * Copyright © 2009 Lars-Peter Clausen <lars@metafoo.de>
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#ifndef __GLAMO_DRMPRIV_H
#define __GLAMO_DRMPRIV_H


#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/semaphore.h>
#include <linux/spinlock.h>
#include <linux/wait.h>

#include "glamo-core.h"


/* Memory to allocate for the framebuffer.
 * The rest is reserved for the DRM memory manager */
#define GLAMO_FRAMEBUFFER_ALLOCATION (2*480*640)


struct glamodrm_handle {

	/* This device */
	struct device *dev;

	/* The parent device handle */
	struct glamo_core *glamo_core;

	/* Framebuffer handle for the console (i.e. /dev/fb0) */
	struct fb_info *fb;

	/* Command queue registers */
	struct resource *reg;
	char __iomem *reg_base;

	/* VRAM region */
	struct resource *vram;

	/* Command queue region */
	struct resource *cmdq;
	char __iomem *cmdq_base;

	/* LCD controller registers */
	struct resource *lcd_regs;
	char __iomem *lcd_base;

	/* 2D engine registers */
	struct resource *twod_regs;
	char __iomem *twod_base;

	ssize_t vram_size;

	/* Memory management */
	struct drm_mm *mmgr;

	/* semaphore against concurrent ioctl */
	struct semaphore add_to_ring;

	/* Saved state */
	u_int16_t saved_clock;
	u_int16_t saved_width;
	u_int16_t saved_height;
	u_int16_t saved_pitch;
	u_int16_t saved_htotal;
	u_int16_t saved_hrtrst;
	u_int16_t saved_hrtren;
	u_int16_t saved_hdspst;
	u_int16_t saved_hdspen;
	u_int16_t saved_vtotal;
	u_int16_t saved_vrtrst;
	u_int16_t saved_vrtren;
	u_int16_t saved_vdspst;
	u_int16_t saved_vdspen;

	/* Fencing */
	atomic_t curr_seq;              /* The last used stamp number */
	struct list_head fence_list;    /* List of active fences */
	rwlock_t fence_list_lock;       /* Lock to protect fence_list */
	wait_queue_head_t fence_queue;  /* Waitqueue */
	struct tasklet_struct fence_tl; /* Tasklet for fence IRQ */

	/* A scratch block */
	struct drm_mm_node *scratch;
};


/* Private data.  This is where we keep our memory management bits */
struct drm_glamo_gem_object {
	struct drm_gem_object *obj;	/* The GEM object this refers to */
	struct drm_mm_node *block;	/* Block handle for drm_mm */
	uint64_t mmap_offset;
};


struct glamo_crtc {
	struct drm_crtc base;
	struct glamodrm_handle *gdrm;
	/* a mode_set for fbdev users on this crtc */
	struct drm_mode_set mode_set;
	int blank_mode;
};


struct glamo_framebuffer {
	struct drm_framebuffer base;
	struct drm_gem_object *obj;
};


struct glamo_output {
	struct drm_connector base;
	struct drm_encoder enc;
	struct glamodrm_handle *gdrm;
};


/* Colour mode for KMS framebuffer */
enum {
	GLAMO_FB_RGB565,
	GLAMO_FB_ARGB1555,
	GLAMO_FB_ARGB4444
};


#define to_glamo_crtc(x) container_of(x, struct glamo_crtc, base)
#define to_glamo_output(x) container_of(x, struct glamo_output, base)
#define enc_to_glamo_output(x) container_of(x, struct glamo_output, enc)
#define to_glamo_framebuffer(x) container_of(x, struct glamo_framebuffer, base)


#endif /* __GLAMO_DRMPRIV_H */