Update DEP-5 uri
[debian/omnibook.git] / dump.c
1 /*
2  *  dump.c - Raw dump of EC register, stolen from ibm_acpi.c
3  *
4  *
5  *  Copyright (C) 2004-2005 Borislav Deianov <borislav@users.sf.net>
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include "omnibook.h"
23 #include "hardware.h"
24
25 static u8 ecdump_regs[256];
26
27 static int ecdump_read(char *buffer, struct omnibook_operation *io_op)
28 {
29         int len = 0;
30         int i, j;
31         u8 v;
32
33         len +=
34             sprintf(buffer + len,
35                     "EC      " " +00 +01 +02 +03 +04 +05 +06 +07"
36                     " +08 +09 +0a +0b +0c +0d +0e +0f\n");
37
38         if(mutex_lock_interruptible(&io_op->backend->mutex))
39                         return -ERESTARTSYS;
40
41         for (i = 0; i < 255; i += 16) {
42                 len += sprintf(buffer + len, "EC 0x%02x:", i);
43                 for (j = 0; j < 16; j++) {
44                         io_op->read_addr = i +j;
45                         if (__backend_byte_read(io_op, &v))
46                                 break;
47                         if (v != ecdump_regs[i + j])
48                                 len += sprintf(buffer + len, " *%02x", v);
49                         else
50                                 len += sprintf(buffer + len, "  %02x", v);
51                         ecdump_regs[i + j] = v;
52                 }
53                 len += sprintf(buffer + len, "\n");
54                 if (j != 16)
55                         break;
56         }
57
58         mutex_unlock(&io_op->backend->mutex);
59
60         /* These are way too dangerous to advertise openly... */
61 #if 0
62         len +=
63             sprintf(buffer + len,
64                     "commands:\t0x<offset> 0x<value>" " (<offset> is 00-ff, <value> is 00-ff)\n");
65         len +=
66             sprintf(buffer + len,
67                     "commands:\t0x<offset> <value>  " " (<offset> is 00-ff, <value> is 0-255)\n");
68 #endif
69         return len;
70 }
71
72 static int ecdump_write(char *buffer, struct omnibook_operation *io_op)
73 {
74
75         int i, v;
76
77         if (sscanf(buffer, "0x%x 0x%x", &i, &v) == 2) {
78                 /* i and v set */
79         } else if (sscanf(buffer, "0x%x %u", &i, &v) == 2) {
80                 /* i and v set */
81         } else
82                 return -EINVAL;
83         if (i >= 0 && i < 256 && v >= 0 && v < 256) {
84                 io_op->write_addr = i;
85                 return backend_byte_write(io_op, v);
86         } else
87                 return -EINVAL;
88
89         return 0;
90 }
91
92 static struct omnibook_tbl dump_table[] __initdata = {
93         {ALL_ECTYPES, {EC,}},
94         {0,}
95 };
96
97 static struct omnibook_feature __declared_feature dump_driver = {
98         .name = "dump",
99         .enabled = 0,
100         .read = ecdump_read,
101         .write = ecdump_write,
102         .tbl = dump_table,
103 };
104
105 module_param_named(dump, dump_driver.enabled, int, S_IRUGO);
106 MODULE_PARM_DESC(dump, "Use 0 to disable, 1 to enable embedded controller register dump support");
107 /* End of file */