3 # Patch managed by http://www.holgerschurig.de/patcher.html
6 --- linux-2.4.27/drivers/char/Makefile~simpad-proc-sys-board
7 +++ linux-2.4.27/drivers/char/Makefile
9 ifeq ($(CONFIG_SA1100_CERF_CPLD),y)
12 + ifeq ($(CONFIG_SA1100_SIMPAD),y)
13 + obj-$(CONFIG_SA1100_SIMPAD) += sysctl.o
15 ifeq ($(CONFIG_ARCH_FORTUNET),y)
19 +++ linux-2.4.27/drivers/char/sysctl.c
22 + * /proc/sys/board - Interface to the SIMpad cs3 register
24 + * (c) 2004 by Till Harbaum, BeeCon GmbH, <harbaum@beecon.de>
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>
36 +#include <asm/arch/simpad.h>
37 +#include <asm/uaccess.h>
39 +extern long get_cs3_shadow(void);
40 +extern void set_cs3_bit(int value);
41 +extern void clear_cs3_bit(int value);
44 + * This is the number for the "board" entry in /proc/sys:
46 +#define SIMPAD_SYSCTL 1312
49 + * These are the numbers for the entries in /etc/sys/board
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
59 + CTL_PCMCIA_BUFF_DIS,
63 + CTL_IRDA_SD, // Shutdown for powersave
65 + CTL_SD_MEDIAQ, // Shutdown for powersave
67 + CTL_IRDA_MODE, // Fast/Slow IrDA mode
68 + CTL_ENABLE_5V, // Enable 5V circuit
72 +static const char simpad_board_name[] = "SIMpad";
73 +static int dummy_int;
74 +static char dummy_str[80];
77 +simpad_sysctl_handler(ctl_table * ctl, int write, struct file *filp,
78 + void *buffer, size_t * lenp)
80 + int *valp = ctl->data;
84 + // Update parameters from the real registers
85 + switch (ctl->ctl_name) {
87 + sprintf(dummy_str, "0x%04lx", get_cs3_shadow());
88 + return proc_dostring(ctl,write,filp,buffer,lenp);
91 + // the 16 control bits of the cs3 register
96 + case CTL_DISPLAY_ON:
97 + case CTL_PCMCIA_BUFF_DIS:
99 + case CTL_PCMCIA_RESET:
100 + case CTL_DECT_POWER_ON:
103 + case CTL_SD_MEDIAQ:
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;
113 + // Just ignore unsupported parameters
117 + // the strings are all handled now and ran onto a return;
122 + // Perform the generic integer operation
123 + if ((ret = proc_dointvec(ctl, write, filp, buffer, lenp)) != 0)
126 + // Write changes out to the registers
127 + if (write && *valp != val) {
130 + switch (ctl->ctl_name) {
132 + // the 16 control bits of the cs3 register
133 + case CTL_DISPLAY_ON:
134 + case CTL_DECT_POWER_ON:
136 + case CTL_SD_MEDIAQ:
138 + case CTL_IRDA_MODE:
139 + case CTL_RESET_SIMCARD:
141 + set_cs3_bit(1u << (ctl->ctl_name-CTL_VCC_5V_EN));
143 + clear_cs3_bit(1u << (ctl->ctl_name-CTL_VCC_5V_EN));
147 + // Just ignore unsupported parameters
155 +#define PROC_RDONLY 0444
156 +#define PROC_RDWR 0664
158 +static ctl_table simpad_table[] = {
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,
170 + maxlen: sizeof(dummy_str),
171 + proc_handler: &simpad_sysctl_handler,
174 + procname: "vcc_5v_en",
175 + ctl_name: CTL_VCC_5V_EN,
177 + maxlen: sizeof(int),
178 + proc_handler: &simpad_sysctl_handler,
181 + procname: "vcc_3v_en",
182 + ctl_name: CTL_VCC_3V_EN,
184 + maxlen: sizeof(int),
185 + proc_handler: &simpad_sysctl_handler,
191 + maxlen: sizeof(int),
192 + proc_handler: &simpad_sysctl_handler,
198 + maxlen: sizeof(int),
199 + proc_handler: &simpad_sysctl_handler,
202 + procname: "display_on",
203 + ctl_name: CTL_DISPLAY_ON,
205 + maxlen: sizeof(int),
206 + proc_handler: &simpad_sysctl_handler,
209 + procname: "pcmcia_buff_dis",
210 + ctl_name: CTL_PCMCIA_BUFF_DIS,
212 + maxlen: sizeof(int),
213 + proc_handler: &simpad_sysctl_handler,
216 + procname: "mq_reset",
217 + ctl_name: CTL_MQ_RESET,
219 + maxlen: sizeof(int),
220 + proc_handler: &simpad_sysctl_handler,
223 + procname: "pcmcia_reset",
224 + ctl_name: CTL_PCMCIA_RESET,
226 + maxlen: sizeof(int),
227 + proc_handler: &simpad_sysctl_handler,
230 + procname: "dect_power_on",
231 + ctl_name: CTL_DECT_POWER_ON,
233 + maxlen: sizeof(int),
234 + proc_handler: &simpad_sysctl_handler,
237 + procname: "irda_sd",
238 + ctl_name: CTL_IRDA_SD,
240 + maxlen: sizeof(int),
241 + proc_handler: &simpad_sysctl_handler,
244 + procname: "rs232_on",
245 + ctl_name: CTL_RS232_ON,
247 + maxlen: sizeof(int),
248 + proc_handler: &simpad_sysctl_handler,
251 + procname: "sd_mediaq",
252 + ctl_name: CTL_SD_MEDIAQ,
254 + maxlen: sizeof(int),
255 + proc_handler: &simpad_sysctl_handler,
258 + procname: "led2_on",
259 + ctl_name: CTL_LED2_ON,
261 + maxlen: sizeof(int),
262 + proc_handler: &simpad_sysctl_handler,
265 + procname: "irda_mode",
266 + ctl_name: CTL_IRDA_MODE,
268 + maxlen: sizeof(int),
269 + proc_handler: &simpad_sysctl_handler,
272 + procname: "enable_5v",
273 + ctl_name: CTL_ENABLE_5V,
275 + maxlen: sizeof(int),
276 + proc_handler: &simpad_sysctl_handler,
279 + procname: "reset_simcard",
280 + ctl_name: CTL_RESET_SIMCARD,
282 + maxlen: sizeof(int),
283 + proc_handler: &simpad_sysctl_handler,
289 +static ctl_table simpad_root_table[] = {
290 + {SIMPAD_SYSCTL, "board", NULL, 0, 0555, simpad_table},
295 +static struct ctl_table_header *simpad_table_header;
298 +static int __init simpad_sysctl_init(void)
300 + simpad_table_header = register_sysctl_table(simpad_root_table, 0);
301 + if (!simpad_table_header)
306 +static void __exit simpad_sysctl_exit(void)
308 + unregister_sysctl_table(simpad_table_header);
312 +module_init(simpad_sysctl_init);
313 +module_exit(simpad_sysctl_exit);
315 +MODULE_AUTHOR("Till Harbaum <harbaum@beecon.de>");
316 +MODULE_DESCRIPTION("Implements /proc/sys/board");
317 +MODULE_LICENSE("GPL");