patch-2.4.7 linux/drivers/media/video/zoran_procfs.c
Next file: linux/drivers/media/video/zr36057.h
Previous file: linux/drivers/media/video/zoran.h
Back to the patch index
Back to the overall index
- Lines: 171
- Date:
Wed Jul 4 14:41:33 2001
- Orig file:
v2.4.6/linux/drivers/media/video/zoran_procfs.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.6/linux/drivers/media/video/zoran_procfs.c linux/drivers/media/video/zoran_procfs.c
@@ -0,0 +1,170 @@
+#include <linux/config.h>
+#include <linux/ctype.h>
+
+struct procfs_params_zr36067 {
+ char *name;
+ short reg;
+ u32 mask;
+ short bit;
+};
+
+static struct procfs_params_zr36067 zr67[] = {
+ {"HSPol", 0x000, 1, 30},
+ {"HStart", 0x000, 0x3ff, 10},
+ {"HEnd", 0x000, 0x3ff, 0},
+
+ {"VSPol", 0x004, 1, 30},
+ {"VStart", 0x004, 0x3ff, 10},
+ {"VEnd", 0x004, 0x3ff, 0},
+
+ {"ExtFl", 0x008, 1, 26},
+ {"TopField", 0x008, 1, 25},
+ {"VCLKPol", 0x008, 1, 24},
+ {"DupFld", 0x008, 1, 20},
+ {"LittleEndian", 0x008, 1, 0},
+
+ {"HsyncStart", 0x10c, 0xffff, 16},
+ {"LineTot", 0x10c, 0xffff, 0},
+
+ {"NAX", 0x110, 0xffff, 16},
+ {"PAX", 0x110, 0xffff, 0},
+
+ {"NAY", 0x114, 0xffff, 16},
+ {"PAY", 0x114, 0xffff, 0},
+/* {"",,,}, */
+
+ {NULL, 0, 0, 0},
+};
+
+static void setparam(struct zoran *zr, char *name, char *sval)
+{
+ int i, reg0, reg, val;
+ i = 0;
+ while (zr67[i].name != NULL) {
+ if (!strncmp(name, zr67[i].name, strlen(zr67[i].name))) {
+ reg = reg0 = btread(zr67[i].reg);
+ reg &= ~(zr67[i].mask << zr67[i].bit);
+ if (!isdigit(sval[0]))
+ break;
+ val = simple_strtoul(sval, NULL, 0);
+ if ((val & ~zr67[i].mask))
+ break;
+ reg |= (val & zr67[i].mask) << zr67[i].bit;
+ printk(KERN_INFO "%s: setparam: setting ZR36067 register 0x%03x: 0x%08x=>0x%08x %s=%d\n",
+ zr->name, zr67[i].reg, reg0, reg, zr67[i].name, val);
+ btwrite(reg, zr67[i].reg);
+ break;
+ }
+ i++;
+ }
+}
+
+/* This macro was stolen from /usr/src/drivers/char/nvram.c and modified */
+#define PRINT_PROC(args...) \
+ do { \
+ if (begin + len > offset + size) { \
+ *eof = 0; \
+ break; \
+ } \
+ len += sprintf( buffer+len, ##args ); \
+ if (begin + len < offset) { \
+ begin += len; \
+ len = 0; \
+ } \
+ } while(0)
+
+static int zoran_read_proc(char *buffer, char **start, off_t offset, int size, int *eof, void *data)
+{
+#ifdef CONFIG_PROC_FS
+ int len = 0;
+ off_t begin = 0;
+
+ int i;
+ struct zoran *zr;
+
+ zr = (struct zoran *) data;
+ DEBUG2(printk(KERN_INFO "%s: read_proc: buffer=%x, offset=%d, size=%d, data=%x\n", zr->name, (int) buffer, (int) offset, size, (int) data));
+ *eof = 1;
+ PRINT_PROC("ZR36067 registers:");
+ for (i = 0; i < 0x130; i += 4) {
+ if (!(i % 16)) {
+ PRINT_PROC("\n%03X", i);
+ }
+ PRINT_PROC(" %08X ", btread(i));
+ }
+ PRINT_PROC("\n");
+ if (offset >= len + begin) {
+ return 0;
+ }
+ *start = buffer + begin - offset;
+ return ((size < begin + len - offset) ? size : begin + len - offset);
+#endif
+ return 0;
+}
+
+static int zoran_write_proc(struct file *file, const char *buffer, unsigned long count, void *data)
+{
+#ifdef CONFIG_PROC_FS
+ char *string, *sp;
+ char *line, *ldelim, *varname, *svar, *tdelim;
+ struct zoran *zr;
+
+ zr = (struct zoran *) data;
+
+ string = sp = vmalloc(count + 1);
+ if (!string) {
+ printk(KERN_ERR "%s: write_proc: can not allocate memory\n", zr->name);
+ return -ENOMEM;
+ }
+ memcpy(string, buffer, count);
+ string[count] = 0;
+ DEBUG2(printk(KERN_INFO "%s: write_proc: name=%s count=%lu data=%x\n", zr->name, file->f_dentry->d_name.name, count, (int) data));
+ ldelim = " \t\n";
+ tdelim = "=";
+ line = strpbrk(sp, ldelim);
+ while (line) {
+ *line = 0;
+ svar = strpbrk(sp, tdelim);
+ if (svar) {
+ *svar = 0;
+ varname = sp;
+ svar++;
+ setparam(zr, varname, svar);
+ }
+ sp = line + 1;
+ line = strpbrk(sp, ldelim);
+ }
+ vfree(string);
+#endif
+ return count;
+}
+
+static int zoran_proc_init(int i)
+{
+#ifdef CONFIG_PROC_FS
+ char name[8];
+ sprintf(name, "zoran%d", i);
+ if ((zoran[i].zoran_proc = create_proc_entry(name, 0, 0))) {
+ zoran[i].zoran_proc->read_proc = zoran_read_proc;
+ zoran[i].zoran_proc->write_proc = zoran_write_proc;
+ zoran[i].zoran_proc->data = &zoran[i];
+ printk(KERN_INFO "%s: procfs entry /proc/%s allocated. data=%x\n", zoran[i].name, name, (int) zoran[i].zoran_proc->data);
+ } else {
+ printk(KERN_ERR "%s: Unable to initialise /proc/%s\n", zoran[i].name, name);
+ return 1;
+ }
+#endif
+ return 0;
+}
+
+static void zoran_proc_cleanup(int i)
+{
+#ifdef CONFIG_PROC_FS
+ char name[8];
+ sprintf(name, "zoran%d", i);
+ if (zoran[i].zoran_proc) {
+ remove_proc_entry(name, 0);
+ }
+ zoran[i].zoran_proc = NULL;
+#endif
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)