]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/linux/opensimpad-64+0/simpad-proc-sys-board.patch
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / linux / opensimpad-64+0 / simpad-proc-sys-board.patch
1
2 #
3 # Patch managed by http://www.holgerschurig.de/patcher.html
4 #
5
6 --- linux-2.4.27/drivers/char/Makefile~simpad-proc-sys-board
7 +++ linux-2.4.27/drivers/char/Makefile
8 @@ -134,6 +134,9 @@
9    ifeq ($(CONFIG_SA1100_CERF_CPLD),y)
10      KEYBD    += cerf_keyb.o
11    endif
12 +  ifeq ($(CONFIG_SA1100_SIMPAD),y)
13 +    obj-$(CONFIG_SA1100_SIMPAD) += sysctl.o
14 +  endif
15    ifeq ($(CONFIG_ARCH_FORTUNET),y)
16      KEYMAP   := defkeymap.o
17    endif
18 --- /dev/null
19 +++ linux-2.4.27/drivers/char/sysctl.c
20 @@ -0,0 +1,297 @@
21 +/*
22 + *  /proc/sys/board - Interface to the SIMpad cs3 register
23 + *
24 + *  (c) 2004 by Till Harbaum, BeeCon GmbH, <harbaum@beecon.de>
25 + */
26 +
27 +#include <linux/module.h>
28 +#include <linux/init.h>
29 +#include <linux/errno.h>
30 +#include <linux/sysctl.h>
31 +#include <linux/crc32.h>
32 +#include <linux/delay.h>
33 +#include <linux/pm.h>
34 +
35 +#include <asm/io.h>
36 +#include <asm/arch/simpad.h>
37 +#include <asm/uaccess.h>
38 +
39 +extern long get_cs3_shadow(void);
40 +extern void set_cs3_bit(int value);
41 +extern void clear_cs3_bit(int value);
42 +
43 +/*
44 + * This is the number for the "board" entry in /proc/sys:
45 + */
46 +#define SIMPAD_SYSCTL 1312
47 +
48 +/*
49 + * These are the numbers for the entries in /etc/sys/board
50 + */
51 +enum {
52 +       CTL_NAME=991,
53 +       CTL_CS3,          // the complete latch
54 +       CTL_VCC_5V_EN,    // For 5V PCMCIA 
55 +        CTL_VCC_3V_EN,    // FOR 3.3V PCMCIA
56 +        CTL_EN1,          // This is only for EPROM's
57 +        CTL_EN0,          // Both should be enable for 3.3V or 5V
58 +        CTL_DISPLAY_ON,
59 +        CTL_PCMCIA_BUFF_DIS,
60 +        CTL_MQ_RESET,
61 +        CTL_PCMCIA_RESET,
62 +        CTL_DECT_POWER_ON,
63 +        CTL_IRDA_SD,      // Shutdown for powersave
64 +        CTL_RS232_ON, 
65 +        CTL_SD_MEDIAQ,    // Shutdown for powersave
66 +        CTL_LED2_ON,
67 +        CTL_IRDA_MODE,    // Fast/Slow IrDA mode
68 +        CTL_ENABLE_5V,    // Enable 5V circuit
69 +        CTL_RESET_SIMCARD
70 +};
71 +
72 +static const char simpad_board_name[] = "SIMpad";
73 +static int  dummy_int;
74 +static char dummy_str[80];
75 +
76 +static int
77 +simpad_sysctl_handler(ctl_table * ctl, int write, struct file *filp,
78 +                     void *buffer, size_t * lenp)
79 +{
80 +       int *valp = ctl->data;
81 +       int val;
82 +       int ret;
83 +
84 +       // Update parameters from the real registers
85 +       switch (ctl->ctl_name) {
86 +       case CTL_CS3:
87 +           sprintf(dummy_str, "0x%04lx", get_cs3_shadow());
88 +           return proc_dostring(ctl,write,filp,buffer,lenp);
89 +           break;
90 +
91 +        // the 16 control bits of the cs3 register
92 +        case CTL_VCC_5V_EN:
93 +       case CTL_VCC_3V_EN:
94 +       case CTL_EN1:
95 +       case CTL_EN0:
96 +       case CTL_DISPLAY_ON:
97 +       case CTL_PCMCIA_BUFF_DIS:
98 +       case CTL_MQ_RESET:
99 +       case CTL_PCMCIA_RESET:
100 +       case CTL_DECT_POWER_ON:
101 +       case CTL_IRDA_SD:
102 +       case CTL_RS232_ON:
103 +       case CTL_SD_MEDIAQ:
104 +       case CTL_LED2_ON:
105 +       case CTL_IRDA_MODE:
106 +       case CTL_ENABLE_5V:
107 +       case CTL_RESET_SIMCARD:
108 +               *valp = (get_cs3_shadow() & 
109 +                       (1u << (ctl->ctl_name-CTL_VCC_5V_EN)))?1:0;
110 +                break;
111 +
112 +       default:
113 +               // Just ignore unsupported parameters
114 +               break;
115 +       }
116 +
117 +       // the strings are all handled now and ran onto a return;
118 +
119 +       // Save old state
120 +       val = *valp;
121 +
122 +       // Perform the generic integer operation        
123 +       if ((ret = proc_dointvec(ctl, write, filp, buffer, lenp)) != 0)
124 +               return (ret);
125 +
126 +       // Write changes out to the registers
127 +       if (write && *valp != val) {
128 +
129 +               val = *valp;
130 +               switch (ctl->ctl_name) {
131 +
132 +                // the 16 control bits of the cs3 register
133 +               case CTL_DISPLAY_ON:
134 +               case CTL_DECT_POWER_ON:
135 +               case CTL_IRDA_SD:
136 +               case CTL_SD_MEDIAQ:
137 +               case CTL_LED2_ON:
138 +               case CTL_IRDA_MODE:
139 +               case CTL_RESET_SIMCARD:
140 +                       if (val) 
141 +                               set_cs3_bit(1u << (ctl->ctl_name-CTL_VCC_5V_EN));
142 +                       else     
143 +                               clear_cs3_bit(1u << (ctl->ctl_name-CTL_VCC_5V_EN));
144 +                break;
145 +
146 +               default:
147 +                       // Just ignore unsupported parameters
148 +                       break;
149 +               }
150 +       }
151 +
152 +       return ret;
153 +}
154 +
155 +#define PROC_RDONLY 0444
156 +#define PROC_RDWR   0664
157 +
158 +static ctl_table simpad_table[] = {
159 +        {
160 +        procname:      "sys_name",
161 +        ctl_name:      CTL_NAME, 
162 +        data:          &simpad_board_name,
163 +        maxlen:        sizeof(simpad_board_name),
164 +         proc_handler: &proc_dostring,
165 +        mode:          PROC_RDONLY,
166 +       }, {
167 +        procname:      "cs3",
168 +        ctl_name:      CTL_CS3, 
169 +        data:          &dummy_str,
170 +        maxlen:        sizeof(dummy_str),
171 +         proc_handler: &simpad_sysctl_handler,
172 +        mode:          PROC_RDONLY,
173 +       }, {
174 +        procname:      "vcc_5v_en",
175 +        ctl_name:      CTL_VCC_5V_EN,
176 +        data:          &dummy_int,
177 +        maxlen:        sizeof(int),
178 +         proc_handler: &simpad_sysctl_handler,
179 +        mode:          PROC_RDONLY,
180 +       }, {
181 +        procname:      "vcc_3v_en",
182 +        ctl_name:      CTL_VCC_3V_EN,
183 +        data:          &dummy_int,
184 +        maxlen:        sizeof(int),
185 +         proc_handler: &simpad_sysctl_handler,
186 +        mode:          PROC_RDONLY,
187 +       }, {
188 +        procname:      "en1",
189 +        ctl_name:      CTL_EN1,
190 +        data:          &dummy_int,
191 +        maxlen:        sizeof(int),
192 +         proc_handler: &simpad_sysctl_handler,
193 +        mode:          PROC_RDONLY,
194 +       }, {
195 +        procname:      "en0",
196 +        ctl_name:      CTL_EN0,
197 +        data:          &dummy_int,
198 +        maxlen:        sizeof(int),
199 +         proc_handler: &simpad_sysctl_handler,
200 +        mode:          PROC_RDONLY,
201 +       }, {
202 +        procname:      "display_on",
203 +        ctl_name:      CTL_DISPLAY_ON,
204 +        data:          &dummy_int,
205 +        maxlen:        sizeof(int),
206 +         proc_handler: &simpad_sysctl_handler,
207 +        mode:          PROC_RDWR,
208 +       }, {
209 +        procname:      "pcmcia_buff_dis",
210 +        ctl_name:      CTL_PCMCIA_BUFF_DIS,
211 +        data:          &dummy_int,
212 +        maxlen:        sizeof(int),
213 +         proc_handler: &simpad_sysctl_handler,
214 +        mode:          PROC_RDONLY,
215 +       }, {
216 +        procname:      "mq_reset",
217 +        ctl_name:      CTL_MQ_RESET,
218 +        data:          &dummy_int,
219 +        maxlen:        sizeof(int),
220 +         proc_handler: &simpad_sysctl_handler,
221 +        mode:          PROC_RDONLY,
222 +       }, {
223 +        procname:      "pcmcia_reset",
224 +        ctl_name:      CTL_PCMCIA_RESET,
225 +        data:          &dummy_int,
226 +        maxlen:        sizeof(int),
227 +         proc_handler: &simpad_sysctl_handler,
228 +        mode:          PROC_RDONLY,
229 +       }, {
230 +        procname:      "dect_power_on",
231 +        ctl_name:      CTL_DECT_POWER_ON,
232 +        data:          &dummy_int,
233 +        maxlen:        sizeof(int),
234 +         proc_handler: &simpad_sysctl_handler,
235 +        mode:          PROC_RDWR,
236 +       }, {
237 +        procname:      "irda_sd",
238 +        ctl_name:      CTL_IRDA_SD,
239 +        data:          &dummy_int,
240 +        maxlen:        sizeof(int),
241 +         proc_handler: &simpad_sysctl_handler,
242 +        mode:          PROC_RDWR,
243 +       }, {
244 +        procname:      "rs232_on",
245 +        ctl_name:      CTL_RS232_ON,
246 +        data:          &dummy_int,
247 +        maxlen:        sizeof(int),
248 +         proc_handler: &simpad_sysctl_handler,
249 +        mode:          PROC_RDONLY,
250 +       }, {
251 +        procname:      "sd_mediaq",
252 +        ctl_name:      CTL_SD_MEDIAQ,
253 +        data:          &dummy_int,
254 +        maxlen:        sizeof(int),
255 +         proc_handler: &simpad_sysctl_handler,
256 +        mode:          PROC_RDWR,
257 +       }, {
258 +        procname:      "led2_on",
259 +        ctl_name:      CTL_LED2_ON,
260 +        data:          &dummy_int,
261 +        maxlen:        sizeof(int),
262 +         proc_handler: &simpad_sysctl_handler,
263 +        mode:          PROC_RDWR,
264 +       }, {
265 +        procname:      "irda_mode",
266 +        ctl_name:      CTL_IRDA_MODE,
267 +        data:          &dummy_int,
268 +        maxlen:        sizeof(int),
269 +         proc_handler: &simpad_sysctl_handler,
270 +        mode:          PROC_RDWR,
271 +       }, {
272 +        procname:      "enable_5v",
273 +        ctl_name:      CTL_ENABLE_5V,
274 +        data:          &dummy_int,
275 +        maxlen:        sizeof(int),
276 +         proc_handler: &simpad_sysctl_handler,
277 +        mode:          PROC_RDONLY,
278 +       }, {
279 +        procname:      "reset_simcard",
280 +        ctl_name:      CTL_RESET_SIMCARD,
281 +        data:          &dummy_int,
282 +        maxlen:        sizeof(int),
283 +         proc_handler: &simpad_sysctl_handler,
284 +        mode:          PROC_RDWR,
285 +       },
286 +        {0}
287 +        };
288 +
289 +static ctl_table simpad_root_table[] = {
290 +        {SIMPAD_SYSCTL, "board", NULL, 0, 0555, simpad_table},
291 +        {0}
292 +        };
293 +
294 +
295 +static struct ctl_table_header *simpad_table_header;
296 +
297 +
298 +static int __init simpad_sysctl_init(void) 
299 +{
300 +        simpad_table_header = register_sysctl_table(simpad_root_table, 0);
301 +        if (!simpad_table_header)
302 +                return -ENOMEM;
303 +        return 0;
304 +}
305 +
306 +static void __exit simpad_sysctl_exit(void)
307 +{
308 +        unregister_sysctl_table(simpad_table_header);
309 +}
310 +
311 +
312 +module_init(simpad_sysctl_init);
313 +module_exit(simpad_sysctl_exit);
314 +
315 +MODULE_AUTHOR("Till Harbaum <harbaum@beecon.de>");
316 +MODULE_DESCRIPTION("Implements /proc/sys/board");
317 +MODULE_LICENSE("GPL");