annotate vidix/sh_veu_vid.c @ 34809:ea97bcb28df1

Allow direct rendering for non-reference frames in H.264. This might work for other codecs that currently have DR disabled, but H.264 is the only one tested so far.
author reimar
date Mon, 14 May 2012 18:11:24 +0000
parents 20da977f0f3e
children 0989cbea18b4
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.
29946
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
3 * Copyright (C) 2008, 2009 Magnus Damm
27420
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
29946
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
182 return fd;
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
183 }
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 #define VESTR 0x00 /* start register */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
186 #define VESWR 0x10 /* src: line length */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
187 #define VESSR 0x14 /* src: image size */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
188 #define VSAYR 0x18 /* src: y/rgb plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
189 #define VSACR 0x1c /* src: c plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
190 #define VBSSR 0x20 /* bundle mode register */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
191 #define VEDWR 0x30 /* dst: line length */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
192 #define VDAYR 0x34 /* dst: y/rgb plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
193 #define VDACR 0x38 /* dst: c plane address */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
194 #define VTRCR 0x50 /* transform control */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
195 #define VRFCR 0x54 /* resize scale */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
196 #define VRFSR 0x58 /* resize clip */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
197 #define VENHR 0x5c /* enhance */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
198 #define VFMCR 0x70 /* filter mode */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
199 #define VVTCR 0x74 /* lowpass vertical */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
200 #define VHTCR 0x78 /* lowpass horizontal */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
201 #define VAPCR 0x80 /* color match */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
202 #define VECCR 0x84 /* color replace */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
203 #define VAFXR 0x90 /* fixed mode */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
204 #define VSWPR 0x94 /* swap */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
205 #define VEIER 0xa0 /* interrupt mask */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
206 #define VEVTR 0xa4 /* interrupt event */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
207 #define VSTAR 0xb0 /* status */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
208 #define VBSRR 0xb4 /* reset */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
209
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
210 #define VMCR00 0x200 /* color conversion matrix coefficient 00 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
211 #define VMCR01 0x204 /* color conversion matrix coefficient 01 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
212 #define VMCR02 0x208 /* color conversion matrix coefficient 02 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
213 #define VMCR10 0x20c /* color conversion matrix coefficient 10 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
214 #define VMCR11 0x210 /* color conversion matrix coefficient 11 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
215 #define VMCR12 0x214 /* color conversion matrix coefficient 12 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
216 #define VMCR20 0x218 /* color conversion matrix coefficient 20 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
217 #define VMCR21 0x21c /* color conversion matrix coefficient 21 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
218 #define VMCR22 0x220 /* color conversion matrix coefficient 22 */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
219 #define VCOFFR 0x224 /* color conversion offset */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
220 #define VCBR 0x228 /* color conversion clip */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
221
29948
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
222 #define VRPBR 0xc8 /* resize passband */
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
223
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
224 /* Helper functions for reading registers. */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
225
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
226 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
227 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
228 volatile unsigned long *reg = ump->iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
229
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
230 return reg[reg_offs / 4];
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
233 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
234 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
235 volatile unsigned long *reg = ump->iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
236
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
237 reg[reg_offs / 4] = value;
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
240 static vidix_capability_t sh_veu_cap = {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
241 "SuperH VEU driver",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
242 "Magnus Damm",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
243 TYPE_OUTPUT,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
244 { 0, 0, 0, 0 },
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
245 2560,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
246 1920,
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 16,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
249 -1,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
250 FLAG_UPSCALER|FLAG_DOWNSCALER,
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 -1,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
253 { 0, 0, 0, 0 }
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
256 /* global variables yuck */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
257
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
258 static struct fb_info fbi;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
259 static struct uio_device uio_dev;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
260 static struct uio_map uio_mmio, uio_mem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
261
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
262 struct sh_veu_plane {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
263 unsigned long width;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
264 unsigned long height;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
265 unsigned long stride;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
266 unsigned long pos_x;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
267 unsigned long pos_y;
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
270 static struct sh_veu_plane _src, _dst;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
271 static vidix_playback_t my_info;
29946
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
272 static int fb_fd;
27420
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 static int sh_veu_probe(int verbose, int force)
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 int ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
277
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
278 ret = get_fb_info("/dev/fb0", &fbi);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
279 if (ret < 0)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
280 return ret;
29946
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
281 fb_fd = ret;
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
282
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
283 if (fbi.bpp != 16) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
284 printf("sh_veu: only 16bpp supported\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
285 return -1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
286 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
287
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
288 ret = locate_uio_device("VEU", &uio_dev);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
289 if (ret < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
290 printf("sh_veu: unable to locate matching UIO device\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
291 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
292 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
293
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
294 ret = setup_uio_map(&uio_dev, 0, &uio_mmio);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
295 if (ret < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
296 printf("sh_veu: cannot setup MMIO\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
297 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
298 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
299
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
300 ret = setup_uio_map(&uio_dev, 1, &uio_mem);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
301 if (ret < 0) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
302 printf("sh_veu: cannot setup contiguous memory\n");
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
303 return ret;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
304 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
305
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
306 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
307 uio_dev.name, uio_dev.path,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
308 fbi.width, fbi.height, fbi.bpp);
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 return ret;
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
313 static void sh_veu_wait_irq(vidix_playback_t *info)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
314 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
315 unsigned long n_pending;
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 /* Wait for an interrupt */
28019
f504a06fcf50 Use standard unsigned long type instead of u_long.
diego
parents: 27420
diff changeset
318 read(uio_dev.fd, &n_pending, sizeof(unsigned long));
27420
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 write_reg(&uio_mmio, 0x100, VEVTR); /* ack int, write 0 to bit 0 */
29946
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
321
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
322 /* flush framebuffer to handle deferred io case */
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
323 fsync(fb_fd);
27420
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
326 static int sh_veu_is_veu2h(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
327 {
29948
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
328 return uio_mmio.size == 0x27c;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
329 }
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
330
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
331 static int sh_veu_is_veu3f(void)
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
332 {
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
333 return uio_mmio.size == 0xcc;
27420
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
336 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
337 int vertical, int size_in,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
338 int size_out, int crop_out)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
339 {
29948
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
340 unsigned long fixpoint, mant, frac, value, rep, vb;
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
341
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
342 /* calculate FRAC and MANT */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
343 do {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
344 rep = mant = frac = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
345
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
346 if (size_in == size_out) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
347 if (crop_out != size_out)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
348 mant = 1; /* needed for cropping */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
349 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
350 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
351
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
352 /* VEU2H special upscale */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
353 if (sh_veu_is_veu2h() && size_out > size_in) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
354 fixpoint = (4096 * size_in) / size_out;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
355
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
356 mant = fixpoint / 4096;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
357 frac = fixpoint - (mant * 4096);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
358 frac &= ~0x07;
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 switch (frac) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
361 case 0x800:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
362 rep = 1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
363 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
364 case 0x400:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
365 rep = 3;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
366 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
367 case 0x200:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
368 rep = 7;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
369 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
370 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
371
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
372 if (rep)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
373 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
374 }
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 fixpoint = (4096 * (size_in - 1)) / (size_out + 1);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
377 mant = fixpoint / 4096;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
378 frac = fixpoint - (mant * 4096);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
379
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
380 if (frac & 0x07) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
381 frac &= ~0x07;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
382 if (size_out > size_in)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
383 frac -= 8; /* round down if scaling up */
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 frac += 8; /* round up if scaling down */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
386 }
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 } while (0);
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 scale */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
391 value = read_reg(ump, VRFCR);
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 |= ((mant << 12) | frac) << 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 |= (mant << 12) | frac;
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, VRFCR);
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 /* set clip */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
402 value = read_reg(ump, VRFSR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
403 if (vertical) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
404 value &= ~0xffff0000;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
405 value |= ((rep << 12) | crop_out) << 16;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
406 } else {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
407 value &= ~0xffff;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
408 value |= (rep << 12) | crop_out;
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 write_reg(ump, value, VRFSR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
411
29948
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
412 /* VEU3F needs additional VRPBR register handling */
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
413 if (sh_veu_is_veu3f()) {
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
414 if (size_out > size_in)
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
415 vb = 64;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
416 else {
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
417 if ((mant >= 8) && (mant < 16))
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
418 value = 4;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
419 else if ((mant >= 4) && (mant < 8))
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
420 value = 2;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
421 else
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
422 value = 1;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
423
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
424 vb = 64 * 4096 * value;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
425 vb /= 4096 * mant + frac;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
426 }
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
427
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
428 /* set resize passband register */
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
429 value = read_reg(ump, VRPBR);
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
430 if (vertical) {
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
431 value &= ~0xffff0000;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
432 value |= vb << 16;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
433 } else {
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
434 value &= ~0xffff;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
435 value |= vb;
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
436 }
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
437 write_reg(ump, value, VRPBR);
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
438 }
20da977f0f3e Update the SuperH VEU vidix driver with experimental support for VEU3F.
cehoyos
parents: 29946
diff changeset
439
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
440 return (((size_in * crop_out) / size_out) + 0x03) & ~0x03;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
441 }
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 static void sh_veu_setup_planes(vidix_playback_t *info,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
444 struct sh_veu_plane *src,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
445 struct sh_veu_plane *dst)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
446 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
447 unsigned long addr, real_w, real_h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
448
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
449 src->width = info->src.w;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
450 src->height = info->src.h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
451 src->stride = (info->src.w+15) & ~15;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
452
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
453 dst->width = real_w = info->dest.w;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
454 dst->height = real_h = info->dest.h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
455 dst->stride = fbi.line_length;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
456 dst->pos_x = info->dest.x & ~0x03;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
457 dst->pos_y = info->dest.y;
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 if ((dst->width + dst->pos_x) > fbi.width)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
460 dst->width = fbi.width - dst->pos_x;
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 if ((dst->height + dst->pos_y) > fbi.height)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
463 dst->height = fbi.height - dst->pos_y;
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 addr = fbi.address;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
466 addr += dst->pos_x * (fbi.bpp / 8);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
467 addr += dst->pos_y * dst->stride;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
468
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
469 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
470 real_w, dst->width);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
471 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
472 real_h, dst->height);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
473
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
474 write_reg(&uio_mmio, src->stride, VESWR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
475 write_reg(&uio_mmio, src->width | (src->height << 16), VESSR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
476 write_reg(&uio_mmio, 0, VBSSR); /* not using bundle mode */
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, dst->stride, VEDWR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
479 write_reg(&uio_mmio, addr, VDAYR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
480 write_reg(&uio_mmio, 0, VDACR); /* unused for RGB */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
481
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
482 write_reg(&uio_mmio, 0x67, VSWPR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
483 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
484
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
485 if (sh_veu_is_veu2h()) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
486 write_reg(&uio_mmio, 0x0cc5, VMCR00);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
487 write_reg(&uio_mmio, 0x0950, VMCR01);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
488 write_reg(&uio_mmio, 0x0000, VMCR02);
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 write_reg(&uio_mmio, 0x397f, VMCR10);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
491 write_reg(&uio_mmio, 0x0950, VMCR11);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
492 write_reg(&uio_mmio, 0x3ccd, VMCR12);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
493
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
494 write_reg(&uio_mmio, 0x0000, VMCR20);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
495 write_reg(&uio_mmio, 0x0950, VMCR21);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
496 write_reg(&uio_mmio, 0x1023, VMCR22);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
497
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
498 write_reg(&uio_mmio, 0x00800010, VCOFFR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
499 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
500
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
501 write_reg(&uio_mmio, 1, VEIER); /* enable interrupt in VEU */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
502 }
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 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
505 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
506 unsigned long enable = 1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
507 unsigned long addr;
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 addr = uio_mem.address + info->offsets[frame];
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 write_reg(&uio_mmio, addr + info->offset.y, VSAYR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
512 write_reg(&uio_mmio, addr + info->offset.u, VSACR);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
513
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
514 /* Enable interrupt in UIO driver */
28019
f504a06fcf50 Use standard unsigned long type instead of u_long.
diego
parents: 27420
diff changeset
515 write(uio_dev.fd, &enable, sizeof(unsigned long));
27420
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 write_reg(&uio_mmio, 1, VESTR); /* start operation */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
518 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
519
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
520 static int sh_veu_init(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
521 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
522 write_reg(&uio_mmio, 0x100, VBSRR); /* reset VEU */
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
523 return 0;
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
526 static void sh_veu_destroy(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
527 {
29946
54bacf6a38ca Update the SuperH VEU vidix driver with code that calls fsync() after each
cehoyos
parents: 28019
diff changeset
528 close(fb_fd);
27420
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
529 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
530
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
531 static int sh_veu_get_caps(vidix_capability_t *to)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
532 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
533 memcpy(to, &sh_veu_cap, sizeof(vidix_capability_t));
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
534 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
535 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
536
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
537 static int sh_veu_query_fourcc(vidix_fourcc_t *to)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
538 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
539 if (to->fourcc == IMGFMT_NV12) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
540 to->depth = VID_DEPTH_ALL;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
541 to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
542 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
543 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
544 to->depth = to->flags = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
545 return ENOSYS;
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
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 static int sh_veu_config_playback(vidix_playback_t *info)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
550 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
551 unsigned int i, y_pitch;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
552
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
553 switch (info->fourcc) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
554 case IMGFMT_NV12:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
555 y_pitch = (info->src.w + 15) & ~15;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
556
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
557 info->offset.y = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
558 info->offset.u = y_pitch * info->src.h;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
559 info->frame_size = info->offset.u + info->offset.u / 2;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
560 break;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
561 default:
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
562 return ENOTSUP;
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 info->num_frames = uio_mem.size / info->frame_size;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
566 if (info->num_frames > VID_PLAY_MAXFRAMES)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
567 info->num_frames = VID_PLAY_MAXFRAMES;
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 if (!info->num_frames) {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
570 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
571 (int)uio_mem.size, (int)info->frame_size);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
572 return ENOMEM;
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
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
575 info->dga_addr = uio_mem.iomem;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
576 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
577
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
578 for (i = 0; i < info->num_frames; i++)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
579 info->offsets[i] = info->frame_size * i;
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 my_info = *info;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
582
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
583 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
584 (int)info->num_frames, (int)info->frame_size,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
585 (int)uio_mem.size);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
586
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
587 sh_veu_setup_planes(info, &_src, &_dst);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
588
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
589 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
590 (int)info->src.w, (int)info->src.h,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
591 (int)info->dest.w, (int)info->dest.h,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
592 (int)info->dest.x, (int)info->dest.y,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
593 (int)_src.width, (int)_src.height,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
594 (int)_dst.width, (int)_dst.height,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
595 (int)_dst.pos_x, (int)_dst.pos_y);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
596 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
597 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
598
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
599
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
600 static int sh_veu_playback_on(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
601 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
602 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
603 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
604
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
605 static int sh_veu_playback_off(void)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
606 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
607 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
608 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
609
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
610 static int sh_veu_first_frame = 1;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
611
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
612 static int sh_veu_frame_sel(unsigned int frame)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
613 {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
614 if (!sh_veu_first_frame)
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
615 sh_veu_wait_irq(&my_info);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
616
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
617 sh_veu_blit(&my_info, frame);
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
618 sh_veu_first_frame = 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
619 return 0;
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
620 }
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
621
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
622 VDXDriver sh_veu_drv = {
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
623 "sh_veu",
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
624 NULL,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
625 .probe = sh_veu_probe,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
626 .get_caps = sh_veu_get_caps,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
627 .query_fourcc = sh_veu_query_fourcc,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
628 .init = sh_veu_init,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
629 .destroy = sh_veu_destroy,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
630 .config_playback = sh_veu_config_playback,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
631 .playback_on = sh_veu_playback_on,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
632 .playback_off = sh_veu_playback_off,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
633 .frame_sel = sh_veu_frame_sel,
917c93c652b0 Add VIDIX driver for SuperH Mobile VEU hardware block.
ben
parents:
diff changeset
634 };