annotate vidix/sh_veu_vid.c @ 29792:c2dde95d9850

PPC: make inline asm xform address test work with Apple tools original from mru, ffmpeg commit r20466 adapted to mplayer by Emanuele Giaquinta (exg)
author attila
date Fri, 06 Nov 2009 14:06:58 +0000
parents f504a06fcf50
children 54bacf6a38ca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
1 /*
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
2 * VIDIX driver for SuperH Mobile VEU hardware block.
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
3 * Copyright (C) 2008 Magnus Damm
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
4 *
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
5 * Requires a kernel that exposes the VEU hardware block to user space
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
6 * using UIO. Available in upstream linux-2.6.27 or later.
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
7 *
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
8 * Tested using WVGA and QVGA panels with sh7722 VEU and sh7723 VEU2H.
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
9 *
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
10 * This file is part of MPlayer.
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
11 *
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
12 * MPlayer is free software; you can redistribute it and/or modify
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
13 * it under the terms of the GNU General Public License as published by
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
15 * (at your option) any later version.
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
16 *
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
17 * MPlayer is distributed in the hope that it will be useful,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
20 * GNU General Public License for more details.
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
21 *
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
23 * along with MPlayer; if not, write to the Free Software
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
25 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
26
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
27 #include <stdio.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
28 #include <unistd.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
29 #include <string.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
30 #include <stdlib.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
31 #include <sys/mman.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
32 #include <sys/time.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
33 #include <sys/ioctl.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
34 #include <fcntl.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
35 #include <linux/fb.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
36 #include <inttypes.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
37 #include <unistd.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
38 #include <errno.h>
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
39
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
40 #include "config.h"
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
41 #include "vidix.h"
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
42 #include "fourcc.h"
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
43
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
44 #include "dha.h"
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
45
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
46 static int fgets_with_openclose(char *fname, char *buf, size_t maxlen)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
47 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
48 FILE *fp;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
49
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
50 fp = fopen(fname, "r");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
51 if (!fp)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
52 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
53
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
54 fgets(buf, maxlen, fp);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
55 fclose(fp);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
56 return strlen(buf);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
57 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
58
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
59 struct uio_device {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
60 char *name;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
61 char *path;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
62 int fd;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
63 };
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
64
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
65 #define MAXNAMELEN 256
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
66
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
67 static int locate_uio_device(char *name, struct uio_device *udp)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
68 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
69 char fname[MAXNAMELEN], buf[MAXNAMELEN];
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
70 char *tmp;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
71 int uio_id;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
72
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
73 uio_id = -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
74 do {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
75 uio_id++;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
76 snprintf(fname, MAXNAMELEN, "/sys/class/uio/uio%d/name", uio_id);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
77 if (fgets_with_openclose(fname, buf, MAXNAMELEN) < 0)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
78 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
79
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
80 } while (strncmp(name, buf, strlen(name)));
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
81
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
82 tmp = strchr(buf, '\n');
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
83 if (tmp)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
84 *tmp = '\0';
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
85
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
86 udp->name = strdup(buf);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
87 udp->path = strdup(fname);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
88 udp->path[strlen(udp->path) - 5] = '\0';
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
89
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
90 snprintf(buf, MAXNAMELEN, "/dev/uio%d", uio_id);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
91 udp->fd = open(buf, O_RDWR | O_SYNC);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
92
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
93 if (udp->fd < 0)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
94 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
95
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
96 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
97 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
98
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
99 struct uio_map {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
100 unsigned long address;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
101 unsigned long size;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
102 void *iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
103 };
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
104
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
105 static int setup_uio_map(struct uio_device *udp, int nr, struct uio_map *ump)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
106 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
107 char fname[MAXNAMELEN], buf[MAXNAMELEN];
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
108
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
109 snprintf(fname, MAXNAMELEN, "%s/maps/map%d/addr", udp->path, nr);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
110 if (fgets_with_openclose(fname, buf, MAXNAMELEN) <= 0)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
111 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
112
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
113 ump->address = strtoul(buf, NULL, 0);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
114
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
115 snprintf(fname, MAXNAMELEN, "%s/maps/map%d/size", udp->path, nr);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
116 if (fgets_with_openclose(fname, buf, MAXNAMELEN) <= 0)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
117 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
118
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
119 ump->size = strtoul(buf, NULL, 0);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
120 ump->iomem = mmap(0, ump->size,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
121 PROT_READ|PROT_WRITE, MAP_SHARED,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
122 udp->fd, nr * getpagesize());
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
123
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
124 if (ump->iomem == MAP_FAILED)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
125 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
126
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
127 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
128 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
129
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
130 struct fb_info {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
131 unsigned long width;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
132 unsigned long height;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
133 unsigned long bpp;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
134 unsigned long line_length;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
135
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
136 unsigned long address;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
137 unsigned long size;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
138 };
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
139
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
140 static int get_fb_info(char *device, struct fb_info *fip)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
141 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
142 struct fb_var_screeninfo vinfo;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
143 struct fb_fix_screeninfo finfo;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
144 void *iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
145 int fd;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
146
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
147 fd = open(device, O_RDWR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
148 if (fd < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
149 perror("open");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
150 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
151 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
152
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
153 if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
154 perror("ioctl(FBIOGET_VSCREENINFO)");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
155 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
156 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
157
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
158 fip->width = vinfo.xres;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
159 fip->height = vinfo.yres;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
160 fip->bpp = vinfo.bits_per_pixel;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
161
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
162 if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
163 perror("ioctl(FBIOGET_FSCREENINFO)");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
164 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
165 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
166
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
167 fip->address = finfo.smem_start;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
168 fip->size = finfo.smem_len;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
169 fip->line_length = finfo.line_length;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
170
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
171 iomem = mmap(0, fip->size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
172
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
173 if (iomem == MAP_FAILED) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
174 perror("mmap");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
175 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
176 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
177
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
178 /* clear framebuffer */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
179 memset(iomem, 0, fip->line_length * fip->height);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
180 munmap(iomem, fip->size);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
181
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
182 close(fd);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
183 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
184 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
185
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
186 #define VESTR 0x00 /* start register */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
187 #define VESWR 0x10 /* src: line length */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
188 #define VESSR 0x14 /* src: image size */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
189 #define VSAYR 0x18 /* src: y/rgb plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
190 #define VSACR 0x1c /* src: c plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
191 #define VBSSR 0x20 /* bundle mode register */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
192 #define VEDWR 0x30 /* dst: line length */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
193 #define VDAYR 0x34 /* dst: y/rgb plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
194 #define VDACR 0x38 /* dst: c plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
195 #define VTRCR 0x50 /* transform control */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
196 #define VRFCR 0x54 /* resize scale */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
197 #define VRFSR 0x58 /* resize clip */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
198 #define VENHR 0x5c /* enhance */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
199 #define VFMCR 0x70 /* filter mode */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
200 #define VVTCR 0x74 /* lowpass vertical */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
201 #define VHTCR 0x78 /* lowpass horizontal */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
202 #define VAPCR 0x80 /* color match */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
203 #define VECCR 0x84 /* color replace */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
204 #define VAFXR 0x90 /* fixed mode */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
205 #define VSWPR 0x94 /* swap */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
206 #define VEIER 0xa0 /* interrupt mask */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
207 #define VEVTR 0xa4 /* interrupt event */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
208 #define VSTAR 0xb0 /* status */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
209 #define VBSRR 0xb4 /* reset */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
210
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
211 #define VMCR00 0x200 /* color conversion matrix coefficient 00 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
212 #define VMCR01 0x204 /* color conversion matrix coefficient 01 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
213 #define VMCR02 0x208 /* color conversion matrix coefficient 02 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
214 #define VMCR10 0x20c /* color conversion matrix coefficient 10 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
215 #define VMCR11 0x210 /* color conversion matrix coefficient 11 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
216 #define VMCR12 0x214 /* color conversion matrix coefficient 12 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
217 #define VMCR20 0x218 /* color conversion matrix coefficient 20 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
218 #define VMCR21 0x21c /* color conversion matrix coefficient 21 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
219 #define VMCR22 0x220 /* color conversion matrix coefficient 22 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
220 #define VCOFFR 0x224 /* color conversion offset */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
221 #define VCBR 0x228 /* color conversion clip */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
222
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
223 /* Helper functions for reading registers. */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
224
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
225 static unsigned long read_reg(struct uio_map *ump, int reg_offs)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
226 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
227 volatile unsigned long *reg = ump->iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
228
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
229 return reg[reg_offs / 4];
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
230 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
231
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
232 static void write_reg(struct uio_map *ump, unsigned long value, int reg_offs)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
233 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
234 volatile unsigned long *reg = ump->iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
235
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
236 reg[reg_offs / 4] = value;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
237 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
238
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
239 static vidix_capability_t sh_veu_cap = {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
240 "SuperH VEU driver",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
241 "Magnus Damm",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
242 TYPE_OUTPUT,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
243 { 0, 0, 0, 0 },
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
244 2560,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
245 1920,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
246 16,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
247 16,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
248 -1,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
249 FLAG_UPSCALER|FLAG_DOWNSCALER,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
250 -1,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
251 -1,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
252 { 0, 0, 0, 0 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
253 };
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
254
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
255 /* global variables yuck */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
256
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
257 static struct fb_info fbi;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
258 static struct uio_device uio_dev;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
259 static struct uio_map uio_mmio, uio_mem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
260
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
261 struct sh_veu_plane {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
262 unsigned long width;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
263 unsigned long height;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
264 unsigned long stride;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
265 unsigned long pos_x;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
266 unsigned long pos_y;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
267 };
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
268
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
269 static struct sh_veu_plane _src, _dst;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
270 static vidix_playback_t my_info;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
271
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
272 static int sh_veu_probe(int verbose, int force)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
273 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
274 int ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
275
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
276 ret = get_fb_info("/dev/fb0", &fbi);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
277 if (ret < 0)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
278 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
279
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
280 if (fbi.bpp != 16) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
281 printf("sh_veu: only 16bpp supported\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
282 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
283 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
284
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
285 ret = locate_uio_device("VEU", &uio_dev);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
286 if (ret < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
287 printf("sh_veu: unable to locate matching UIO device\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
288 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
289 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
290
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
291 ret = setup_uio_map(&uio_dev, 0, &uio_mmio);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
292 if (ret < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
293 printf("sh_veu: cannot setup MMIO\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
294 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
295 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
296
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
297 ret = setup_uio_map(&uio_dev, 1, &uio_mem);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
298 if (ret < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
299 printf("sh_veu: cannot setup contiguous memory\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
300 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
301 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
302
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
303 printf("sh_veu: Using %s at %s on %lux%lu %ldbpp /dev/fb0\n",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
304 uio_dev.name, uio_dev.path,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
305 fbi.width, fbi.height, fbi.bpp);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
306
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
307 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
308 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
309
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
310 static void sh_veu_wait_irq(vidix_playback_t *info)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
311 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
312 unsigned long n_pending;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
313
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
314 /* Wait for an interrupt */
28019
f504a06fcf50 Use standard unsigned long type instead of u_long.
diego
parents: 27420
diff changeset
315 read(uio_dev.fd, &n_pending, sizeof(unsigned long));
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
316
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
317 write_reg(&uio_mmio, 0x100, VEVTR); /* ack int, write 0 to bit 0 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
318 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
319
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
320 static int sh_veu_is_veu2h(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
321 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
322 return uio_mmio.size > 0xb8;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
323 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
324
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
325 static unsigned long sh_veu_do_scale(struct uio_map *ump,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
326 int vertical, int size_in,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
327 int size_out, int crop_out)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
328 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
329 unsigned long fixpoint, mant, frac, value, rep;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
330
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
331 /* calculate FRAC and MANT */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
332 do {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
333 rep = mant = frac = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
334
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
335 if (size_in == size_out) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
336 if (crop_out != size_out)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
337 mant = 1; /* needed for cropping */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
338 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
339 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
340
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
341 /* VEU2H special upscale */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
342 if (sh_veu_is_veu2h() && size_out > size_in) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
343 fixpoint = (4096 * size_in) / size_out;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
344
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
345 mant = fixpoint / 4096;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
346 frac = fixpoint - (mant * 4096);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
347 frac &= ~0x07;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
348
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
349 switch (frac) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
350 case 0x800:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
351 rep = 1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
352 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
353 case 0x400:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
354 rep = 3;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
355 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
356 case 0x200:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
357 rep = 7;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
358 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
359 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
360
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
361 if (rep)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
362 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
363 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
364
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
365 fixpoint = (4096 * (size_in - 1)) / (size_out + 1);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
366 mant = fixpoint / 4096;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
367 frac = fixpoint - (mant * 4096);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
368
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
369 if (frac & 0x07) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
370 frac &= ~0x07;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
371 if (size_out > size_in)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
372 frac -= 8; /* round down if scaling up */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
373 else
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
374 frac += 8; /* round up if scaling down */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
375 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
376
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
377 } while (0);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
378
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
379 /* set scale */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
380 value = read_reg(ump, VRFCR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
381 if (vertical) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
382 value &= ~0xffff0000;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
383 value |= ((mant << 12) | frac) << 16;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
384 } else {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
385 value &= ~0xffff;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
386 value |= (mant << 12) | frac;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
387 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
388 write_reg(ump, value, VRFCR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
389
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
390 /* set clip */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
391 value = read_reg(ump, VRFSR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
392 if (vertical) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
393 value &= ~0xffff0000;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
394 value |= ((rep << 12) | crop_out) << 16;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
395 } else {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
396 value &= ~0xffff;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
397 value |= (rep << 12) | crop_out;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
398 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
399 write_reg(ump, value, VRFSR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
400
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
401 return (((size_in * crop_out) / size_out) + 0x03) & ~0x03;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
402 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
403
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
404 static void sh_veu_setup_planes(vidix_playback_t *info,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
405 struct sh_veu_plane *src,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
406 struct sh_veu_plane *dst)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
407 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
408 unsigned long addr, real_w, real_h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
409
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
410 src->width = info->src.w;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
411 src->height = info->src.h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
412 src->stride = (info->src.w+15) & ~15;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
413
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
414 dst->width = real_w = info->dest.w;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
415 dst->height = real_h = info->dest.h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
416 dst->stride = fbi.line_length;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
417 dst->pos_x = info->dest.x & ~0x03;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
418 dst->pos_y = info->dest.y;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
419
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
420 if ((dst->width + dst->pos_x) > fbi.width)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
421 dst->width = fbi.width - dst->pos_x;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
422
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
423 if ((dst->height + dst->pos_y) > fbi.height)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
424 dst->height = fbi.height - dst->pos_y;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
425
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
426 addr = fbi.address;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
427 addr += dst->pos_x * (fbi.bpp / 8);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
428 addr += dst->pos_y * dst->stride;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
429
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
430 src->width = sh_veu_do_scale(&uio_mmio, 0, src->width,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
431 real_w, dst->width);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
432 src->height = sh_veu_do_scale(&uio_mmio, 1, src->height,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
433 real_h, dst->height);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
434
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
435 write_reg(&uio_mmio, src->stride, VESWR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
436 write_reg(&uio_mmio, src->width | (src->height << 16), VESSR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
437 write_reg(&uio_mmio, 0, VBSSR); /* not using bundle mode */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
438
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
439 write_reg(&uio_mmio, dst->stride, VEDWR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
440 write_reg(&uio_mmio, addr, VDAYR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
441 write_reg(&uio_mmio, 0, VDACR); /* unused for RGB */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
442
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
443 write_reg(&uio_mmio, 0x67, VSWPR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
444 write_reg(&uio_mmio, (6 << 16) | (0 << 14) | 2 | 4, VTRCR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
445
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
446 if (sh_veu_is_veu2h()) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
447 write_reg(&uio_mmio, 0x0cc5, VMCR00);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
448 write_reg(&uio_mmio, 0x0950, VMCR01);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
449 write_reg(&uio_mmio, 0x0000, VMCR02);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
450
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
451 write_reg(&uio_mmio, 0x397f, VMCR10);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
452 write_reg(&uio_mmio, 0x0950, VMCR11);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
453 write_reg(&uio_mmio, 0x3ccd, VMCR12);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
454
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
455 write_reg(&uio_mmio, 0x0000, VMCR20);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
456 write_reg(&uio_mmio, 0x0950, VMCR21);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
457 write_reg(&uio_mmio, 0x1023, VMCR22);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
458
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
459 write_reg(&uio_mmio, 0x00800010, VCOFFR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
460 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
461
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
462 write_reg(&uio_mmio, 1, VEIER); /* enable interrupt in VEU */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
463 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
464
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
465 static void sh_veu_blit(vidix_playback_t *info, int frame)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
466 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
467 unsigned long enable = 1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
468 unsigned long addr;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
469
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
470 addr = uio_mem.address + info->offsets[frame];
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
471
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
472 write_reg(&uio_mmio, addr + info->offset.y, VSAYR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
473 write_reg(&uio_mmio, addr + info->offset.u, VSACR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
474
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
475 /* Enable interrupt in UIO driver */
28019
f504a06fcf50 Use standard unsigned long type instead of u_long.
diego
parents: 27420
diff changeset
476 write(uio_dev.fd, &enable, sizeof(unsigned long));
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
477
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
478 write_reg(&uio_mmio, 1, VESTR); /* start operation */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
479 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
480
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
481 static int sh_veu_init(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
482 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
483 write_reg(&uio_mmio, 0x100, VBSRR); /* reset VEU */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
484 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
485 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
486
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
487 static void sh_veu_destroy(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
488 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
489 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
490
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
491 static int sh_veu_get_caps(vidix_capability_t *to)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
492 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
493 memcpy(to, &sh_veu_cap, sizeof(vidix_capability_t));
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
494 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
495 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
496
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
497 static int sh_veu_query_fourcc(vidix_fourcc_t *to)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
498 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
499 if (to->fourcc == IMGFMT_NV12) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
500 to->depth = VID_DEPTH_ALL;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
501 to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
502 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
503 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
504 to->depth = to->flags = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
505 return ENOSYS;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
506 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
507
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
508
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
509 static int sh_veu_config_playback(vidix_playback_t *info)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
510 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
511 unsigned int i, y_pitch;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
512
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
513 switch (info->fourcc) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
514 case IMGFMT_NV12:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
515 y_pitch = (info->src.w + 15) & ~15;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
516
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
517 info->offset.y = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
518 info->offset.u = y_pitch * info->src.h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
519 info->frame_size = info->offset.u + info->offset.u / 2;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
520 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
521 default:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
522 return ENOTSUP;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
523 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
524
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
525 info->num_frames = uio_mem.size / info->frame_size;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
526 if (info->num_frames > VID_PLAY_MAXFRAMES)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
527 info->num_frames = VID_PLAY_MAXFRAMES;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
528
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
529 if (!info->num_frames) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
530 printf("sh_veu: %d is not enough memory for %d bytes frame\n",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
531 (int)uio_mem.size, (int)info->frame_size);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
532 return ENOMEM;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
533 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
534
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
535 info->dga_addr = uio_mem.iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
536 info->dest.pitch.y = info->dest.pitch.u = info->dest.pitch.v = 16;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
537
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
538 for (i = 0; i < info->num_frames; i++)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
539 info->offsets[i] = info->frame_size * i;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
540
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
541 my_info = *info;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
542
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
543 printf("sh_veu: %d frames * %d bytes, total size = %d\n",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
544 (int)info->num_frames, (int)info->frame_size,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
545 (int)uio_mem.size);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
546
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
547 sh_veu_setup_planes(info, &_src, &_dst);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
548
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
549 printf("sh_veu: %dx%d->%dx%d@%dx%d -> %dx%d->%dx%d@%dx%d \n",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
550 (int)info->src.w, (int)info->src.h,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
551 (int)info->dest.w, (int)info->dest.h,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
552 (int)info->dest.x, (int)info->dest.y,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
553 (int)_src.width, (int)_src.height,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
554 (int)_dst.width, (int)_dst.height,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
555 (int)_dst.pos_x, (int)_dst.pos_y);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
556 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
557 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
558
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
559
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
560 static int sh_veu_playback_on(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
561 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
562 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
563 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
564
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
565 static int sh_veu_playback_off(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
566 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
567 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
568 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
569
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
570 static int sh_veu_first_frame = 1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
571
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
572 static int sh_veu_frame_sel(unsigned int frame)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
573 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
574 if (!sh_veu_first_frame)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
575 sh_veu_wait_irq(&my_info);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
576
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
577 sh_veu_blit(&my_info, frame);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
578 sh_veu_first_frame = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
579 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
580 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
581
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
582 VDXDriver sh_veu_drv = {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
583 "sh_veu",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
584 NULL,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
585 .probe = sh_veu_probe,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
586 .get_caps = sh_veu_get_caps,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
587 .query_fourcc = sh_veu_query_fourcc,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
588 .init = sh_veu_init,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
589 .destroy = sh_veu_destroy,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
590 .config_playback = sh_veu_config_playback,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
591 .playback_on = sh_veu_playback_on,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
592 .playback_off = sh_veu_playback_off,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
593 .frame_sel = sh_veu_frame_sel,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
594 };