1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
35
36#include <linux/module.h>
37
38#include <linux/types.h>
39#include <linux/errno.h>
40#include <linux/signal.h>
41#include <linux/sched.h>
42#include <linux/spinlock.h>
43#include <linux/interrupt.h>
44#include <linux/miscdevice.h>
45#include <linux/slab.h>
46#include <linux/ioport.h>
47#include <linux/fcntl.h>
48#include <linux/init.h>
49#include <linux/delay.h>
50#include <linux/kernel.h>
51#include <linux/ctype.h>
52#include <linux/parport.h>
53#include <linux/list.h>
54
55#include <linux/io.h>
56#include <linux/uaccess.h>
57
58#include "charlcd.h"
59
60#define LCD_MAXBYTES 256
61
62#define KEYPAD_BUFFER 64
63
64
65#define INPUT_POLL_TIME (HZ / 50)
66
67#define KEYPAD_REP_START (10)
68
69#define KEYPAD_REP_DELAY (2)
70
71
72#define PNL_PINPUT(a) ((((unsigned char)(a)) ^ 0x7F) >> 3)
73
74#define PNL_PBUSY 0x80
75#define PNL_PACK 0x40
76#define PNL_POUTPA 0x20
77#define PNL_PSELECD 0x10
78#define PNL_PERRORP 0x08
79
80#define PNL_PBIDIR 0x20
81
82#define PNL_PINTEN 0x10
83#define PNL_PSELECP 0x08
84#define PNL_PINITP 0x04
85#define PNL_PAUTOLF 0x02
86#define PNL_PSTROBE 0x01
87
88#define PNL_PD0 0x01
89#define PNL_PD1 0x02
90#define PNL_PD2 0x04
91#define PNL_PD3 0x08
92#define PNL_PD4 0x10
93#define PNL_PD5 0x20
94#define PNL_PD6 0x40
95#define PNL_PD7 0x80
96
97#define PIN_NONE 0
98#define PIN_STROBE 1
99#define PIN_D0 2
100#define PIN_D1 3
101#define PIN_D2 4
102#define PIN_D3 5
103#define PIN_D4 6
104#define PIN_D5 7
105#define PIN_D6 8
106#define PIN_D7 9
107#define PIN_AUTOLF 14
108#define PIN_INITP 16
109#define PIN_SELECP 17
110#define PIN_NOT_SET 127
111
112#define NOT_SET -1
113
114
115#define r_ctr(x) (parport_read_control((x)->port))
116#define r_dtr(x) (parport_read_data((x)->port))
117#define r_str(x) (parport_read_status((x)->port))
118#define w_ctr(x, y) (parport_write_control((x)->port, (y)))
119#define w_dtr(x, y) (parport_write_data((x)->port, (y)))
120
121
122
123static __u8 scan_mask_o;
124
125static __u8 scan_mask_i;
126
127enum input_type {
128 INPUT_TYPE_STD,
129 INPUT_TYPE_KBD,
130};
131
132enum input_state {
133 INPUT_ST_LOW,
134 INPUT_ST_RISING,
135 INPUT_ST_HIGH,
136 INPUT_ST_FALLING,
137};
138
139struct logical_input {
140 struct list_head list;
141 __u64 mask;
142 __u64 value;
143 enum input_type type;
144 enum input_state state;
145 __u8 rise_time, fall_time;
146 __u8 rise_timer, fall_timer, high_timer;
147
148 union {
149 struct {
150 void (*press_fct)(int);
151 void (*release_fct)(int);
152 int press_data;
153 int release_data;
154 } std;
155 struct {
156 char press_str[sizeof(void *) + sizeof(int)] __nonstring;
157 char repeat_str[sizeof(void *) + sizeof(int)] __nonstring;
158 char release_str[sizeof(void *) + sizeof(int)] __nonstring;
159 } kbd;
160 } u;
161};
162
163static LIST_HEAD(logical_inputs);
164
165
166
167
168
169
170
171
172
173
174
175
176
177static __u64 phys_read;
178
179static __u64 phys_read_prev;
180
181static __u64 phys_curr;
182
183static __u64 phys_prev;
184
185static char inputs_stable;
186
187
188static struct {
189 bool enabled;
190} keypad;
191
192static char keypad_buffer[KEYPAD_BUFFER];
193static int keypad_buflen;
194static int keypad_start;
195static char keypressed;
196static wait_queue_head_t keypad_read_wait;
197
198
199static struct {
200 bool enabled;
201 bool initialized;
202
203 int charset;
204 int proto;
205
206
207 struct {
208 int e;
209 int rs;
210 int rw;
211 int cl;
212 int da;
213 int bl;
214 } pins;
215
216 struct charlcd *charlcd;
217} lcd;
218
219
220static int selected_lcd_type = NOT_SET;
221
222
223
224
225
226
227#define BIT_CLR 0
228#define BIT_SET 1
229#define BIT_MSK 2
230#define BIT_STATES 3
231
232
233
234#define LCD_BIT_E 0
235#define LCD_BIT_RS 1
236#define LCD_BIT_RW 2
237#define LCD_BIT_BL 3
238#define LCD_BIT_CL 4
239#define LCD_BIT_DA 5
240#define LCD_BITS 6
241
242
243
244
245#define LCD_PORT_C 0
246#define LCD_PORT_D 1
247#define LCD_PORTS 2
248
249static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES];
250
251
252
253
254#define LCD_PROTO_PARALLEL 0
255#define LCD_PROTO_SERIAL 1
256#define LCD_PROTO_TI_DA8XX_LCD 2
257
258
259
260
261#define LCD_CHARSET_NORMAL 0
262#define LCD_CHARSET_KS0074 1
263
264
265
266
267#define LCD_TYPE_NONE 0
268#define LCD_TYPE_CUSTOM 1
269#define LCD_TYPE_OLD 2
270#define LCD_TYPE_KS0074 3
271#define LCD_TYPE_HANTRONIX 4
272#define LCD_TYPE_NEXCOM 5
273
274
275
276
277#define KEYPAD_TYPE_NONE 0
278#define KEYPAD_TYPE_OLD 1
279#define KEYPAD_TYPE_NEW 2
280#define KEYPAD_TYPE_NEXCOM 3
281
282
283
284
285#define PANEL_PROFILE_CUSTOM 0
286#define PANEL_PROFILE_OLD 1
287#define PANEL_PROFILE_NEW 2
288#define PANEL_PROFILE_HANTRONIX 3
289#define PANEL_PROFILE_NEXCOM 4
290#define PANEL_PROFILE_LARGE 5
291
292
293
294
295#define DEFAULT_PARPORT 0
296#define DEFAULT_PROFILE PANEL_PROFILE_LARGE
297#define DEFAULT_KEYPAD_TYPE KEYPAD_TYPE_OLD
298#define DEFAULT_LCD_TYPE LCD_TYPE_OLD
299#define DEFAULT_LCD_HEIGHT 2
300#define DEFAULT_LCD_WIDTH 40
301#define DEFAULT_LCD_BWIDTH 40
302#define DEFAULT_LCD_HWIDTH 64
303#define DEFAULT_LCD_CHARSET LCD_CHARSET_NORMAL
304#define DEFAULT_LCD_PROTO LCD_PROTO_PARALLEL
305
306#define DEFAULT_LCD_PIN_E PIN_AUTOLF
307#define DEFAULT_LCD_PIN_RS PIN_SELECP
308#define DEFAULT_LCD_PIN_RW PIN_INITP
309#define DEFAULT_LCD_PIN_SCL PIN_STROBE
310#define DEFAULT_LCD_PIN_SDA PIN_D0
311#define DEFAULT_LCD_PIN_BL PIN_NOT_SET
312
313#ifdef CONFIG_PANEL_PARPORT
314#undef DEFAULT_PARPORT
315#define DEFAULT_PARPORT CONFIG_PANEL_PARPORT
316#endif
317
318#ifdef CONFIG_PANEL_PROFILE
319#undef DEFAULT_PROFILE
320#define DEFAULT_PROFILE CONFIG_PANEL_PROFILE
321#endif
322
323#if DEFAULT_PROFILE == 0
324#ifdef CONFIG_PANEL_KEYPAD
325#undef DEFAULT_KEYPAD_TYPE
326#define DEFAULT_KEYPAD_TYPE CONFIG_PANEL_KEYPAD
327#endif
328
329#ifdef CONFIG_PANEL_LCD
330#undef DEFAULT_LCD_TYPE
331#define DEFAULT_LCD_TYPE CONFIG_PANEL_LCD
332#endif
333
334#ifdef CONFIG_PANEL_LCD_HEIGHT
335#undef DEFAULT_LCD_HEIGHT
336#define DEFAULT_LCD_HEIGHT CONFIG_PANEL_LCD_HEIGHT
337#endif
338
339#ifdef CONFIG_PANEL_LCD_WIDTH
340#undef DEFAULT_LCD_WIDTH
341#define DEFAULT_LCD_WIDTH CONFIG_PANEL_LCD_WIDTH
342#endif
343
344#ifdef CONFIG_PANEL_LCD_BWIDTH
345#undef DEFAULT_LCD_BWIDTH
346#define DEFAULT_LCD_BWIDTH CONFIG_PANEL_LCD_BWIDTH
347#endif
348
349#ifdef CONFIG_PANEL_LCD_HWIDTH
350#undef DEFAULT_LCD_HWIDTH
351#define DEFAULT_LCD_HWIDTH CONFIG_PANEL_LCD_HWIDTH
352#endif
353
354#ifdef CONFIG_PANEL_LCD_CHARSET
355#undef DEFAULT_LCD_CHARSET
356#define DEFAULT_LCD_CHARSET CONFIG_PANEL_LCD_CHARSET
357#endif
358
359#ifdef CONFIG_PANEL_LCD_PROTO
360#undef DEFAULT_LCD_PROTO
361#define DEFAULT_LCD_PROTO CONFIG_PANEL_LCD_PROTO
362#endif
363
364#ifdef CONFIG_PANEL_LCD_PIN_E
365#undef DEFAULT_LCD_PIN_E
366#define DEFAULT_LCD_PIN_E CONFIG_PANEL_LCD_PIN_E
367#endif
368
369#ifdef CONFIG_PANEL_LCD_PIN_RS
370#undef DEFAULT_LCD_PIN_RS
371#define DEFAULT_LCD_PIN_RS CONFIG_PANEL_LCD_PIN_RS
372#endif
373
374#ifdef CONFIG_PANEL_LCD_PIN_RW
375#undef DEFAULT_LCD_PIN_RW
376#define DEFAULT_LCD_PIN_RW CONFIG_PANEL_LCD_PIN_RW
377#endif
378
379#ifdef CONFIG_PANEL_LCD_PIN_SCL
380#undef DEFAULT_LCD_PIN_SCL
381#define DEFAULT_LCD_PIN_SCL CONFIG_PANEL_LCD_PIN_SCL
382#endif
383
384#ifdef CONFIG_PANEL_LCD_PIN_SDA
385#undef DEFAULT_LCD_PIN_SDA
386#define DEFAULT_LCD_PIN_SDA CONFIG_PANEL_LCD_PIN_SDA
387#endif
388
389#ifdef CONFIG_PANEL_LCD_PIN_BL
390#undef DEFAULT_LCD_PIN_BL
391#define DEFAULT_LCD_PIN_BL CONFIG_PANEL_LCD_PIN_BL
392#endif
393
394#endif
395
396
397
398
399static atomic_t keypad_available = ATOMIC_INIT(1);
400
401static struct pardevice *pprt;
402
403static int keypad_initialized;
404
405static DEFINE_SPINLOCK(pprt_lock);
406static struct timer_list scan_timer;
407
408MODULE_DESCRIPTION("Generic parallel port LCD/Keypad driver");
409
410static int parport = DEFAULT_PARPORT;
411module_param(parport, int, 0000);
412MODULE_PARM_DESC(parport, "Parallel port index (0=lpt1, 1=lpt2, ...)");
413
414static int profile = DEFAULT_PROFILE;
415module_param(profile, int, 0000);
416MODULE_PARM_DESC(profile,
417 "1=16x2 old kp; 2=serial 16x2, new kp; 3=16x2 hantronix; "
418 "4=16x2 nexcom; default=40x2, old kp");
419
420static int keypad_type = NOT_SET;
421module_param(keypad_type, int, 0000);
422MODULE_PARM_DESC(keypad_type,
423 "Keypad type: 0=none, 1=old 6 keys, 2=new 6+1 keys, 3=nexcom 4 keys");
424
425static int lcd_type = NOT_SET;
426module_param(lcd_type, int, 0000);
427MODULE_PARM_DESC(lcd_type,
428 "LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom");
429
430static int lcd_height = NOT_SET;
431module_param(lcd_height, int, 0000);
432MODULE_PARM_DESC(lcd_height, "Number of lines on the LCD");
433
434static int lcd_width = NOT_SET;
435module_param(lcd_width, int, 0000);
436MODULE_PARM_DESC(lcd_width, "Number of columns on the LCD");
437
438static int lcd_bwidth = NOT_SET;
439module_param(lcd_bwidth, int, 0000);
440MODULE_PARM_DESC(lcd_bwidth, "Internal LCD line width (40)");
441
442static int lcd_hwidth = NOT_SET;
443module_param(lcd_hwidth, int, 0000);
444MODULE_PARM_DESC(lcd_hwidth, "LCD line hardware address (64)");
445
446static int lcd_charset = NOT_SET;
447module_param(lcd_charset, int, 0000);
448MODULE_PARM_DESC(lcd_charset, "LCD character set: 0=standard, 1=KS0074");
449
450static int lcd_proto = NOT_SET;
451module_param(lcd_proto, int, 0000);
452MODULE_PARM_DESC(lcd_proto,
453 "LCD communication: 0=parallel (//), 1=serial, 2=TI LCD Interface");
454
455
456
457
458
459
460
461
462
463
464static int lcd_e_pin = PIN_NOT_SET;
465module_param(lcd_e_pin, int, 0000);
466MODULE_PARM_DESC(lcd_e_pin,
467 "# of the // port pin connected to LCD 'E' signal, with polarity (-17..17)");
468
469static int lcd_rs_pin = PIN_NOT_SET;
470module_param(lcd_rs_pin, int, 0000);
471MODULE_PARM_DESC(lcd_rs_pin,
472 "# of the // port pin connected to LCD 'RS' signal, with polarity (-17..17)");
473
474static int lcd_rw_pin = PIN_NOT_SET;
475module_param(lcd_rw_pin, int, 0000);
476MODULE_PARM_DESC(lcd_rw_pin,
477 "# of the // port pin connected to LCD 'RW' signal, with polarity (-17..17)");
478
479static int lcd_cl_pin = PIN_NOT_SET;
480module_param(lcd_cl_pin, int, 0000);
481MODULE_PARM_DESC(lcd_cl_pin,
482 "# of the // port pin connected to serial LCD 'SCL' signal, with polarity (-17..17)");
483
484static int lcd_da_pin = PIN_NOT_SET;
485module_param(lcd_da_pin, int, 0000);
486MODULE_PARM_DESC(lcd_da_pin,
487 "# of the // port pin connected to serial LCD 'SDA' signal, with polarity (-17..17)");
488
489static int lcd_bl_pin = PIN_NOT_SET;
490module_param(lcd_bl_pin, int, 0000);
491MODULE_PARM_DESC(lcd_bl_pin,
492 "# of the // port pin connected to LCD backlight, with polarity (-17..17)");
493
494
495
496static int lcd_enabled = NOT_SET;
497module_param(lcd_enabled, int, 0000);
498MODULE_PARM_DESC(lcd_enabled, "Deprecated option, use lcd_type instead");
499
500static int keypad_enabled = NOT_SET;
501module_param(keypad_enabled, int, 0000);
502MODULE_PARM_DESC(keypad_enabled, "Deprecated option, use keypad_type instead");
503
504
505static const unsigned char lcd_char_conv_ks0074[256] = {
506
507 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
508 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
509 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
510 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
511 0x20, 0x21, 0x22, 0x23, 0xa2, 0x25, 0x26, 0x27,
512 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
513 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
514 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
515 0xa0, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
516 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
517 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
518 0x58, 0x59, 0x5a, 0xfa, 0xfb, 0xfc, 0x1d, 0xc4,
519 0x96, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
520 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
521 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
522 0x78, 0x79, 0x7a, 0xfd, 0xfe, 0xff, 0xce, 0x20,
523 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
524 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
525 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
526 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
527 0x20, 0x40, 0xb1, 0xa1, 0x24, 0xa3, 0xfe, 0x5f,
528 0x22, 0xc8, 0x61, 0x14, 0x97, 0x2d, 0xad, 0x96,
529 0x80, 0x8c, 0x82, 0x83, 0x27, 0x8f, 0x86, 0xdd,
530 0x2c, 0x81, 0x6f, 0x15, 0x8b, 0x8a, 0x84, 0x60,
531 0xe2, 0xe2, 0xe2, 0x5b, 0x5b, 0xae, 0xbc, 0xa9,
532 0xc5, 0xbf, 0xc6, 0xf1, 0xe3, 0xe3, 0xe3, 0xe3,
533 0x44, 0x5d, 0xa8, 0xe4, 0xec, 0xec, 0x5c, 0x78,
534 0xab, 0xa6, 0xe5, 0x5e, 0x5e, 0xe6, 0xaa, 0xbe,
535 0x7f, 0xe7, 0xaf, 0x7b, 0x7b, 0xaf, 0xbd, 0xc8,
536 0xa4, 0xa5, 0xc7, 0xf6, 0xa7, 0xe8, 0x69, 0x69,
537 0xed, 0x7d, 0xa8, 0xe4, 0xec, 0x5c, 0x5c, 0x25,
538 0xac, 0xa6, 0xea, 0xef, 0x7e, 0xeb, 0xb2, 0x79,
539};
540
541static const char old_keypad_profile[][4][9] = {
542 {"S0", "Left\n", "Left\n", ""},
543 {"S1", "Down\n", "Down\n", ""},
544 {"S2", "Up\n", "Up\n", ""},
545 {"S3", "Right\n", "Right\n", ""},
546 {"S4", "Esc\n", "Esc\n", ""},
547 {"S5", "Ret\n", "Ret\n", ""},
548 {"", "", "", ""}
549};
550
551
552static const char new_keypad_profile[][4][9] = {
553 {"S0", "Left\n", "Left\n", ""},
554 {"S1", "Down\n", "Down\n", ""},
555 {"S2", "Up\n", "Up\n", ""},
556 {"S3", "Right\n", "Right\n", ""},
557 {"S4s5", "", "Esc\n", "Esc\n"},
558 {"s4S5", "", "Ret\n", "Ret\n"},
559 {"S4S5", "Help\n", "", ""},
560
561 {"", "", "", ""}
562};
563
564
565static const char nexcom_keypad_profile[][4][9] = {
566 {"a-p-e-", "Down\n", "Down\n", ""},
567 {"a-p-E-", "Ret\n", "Ret\n", ""},
568 {"a-P-E-", "Esc\n", "Esc\n", ""},
569 {"a-P-e-", "Up\n", "Up\n", ""},
570
571 {"", "", "", ""}
572};
573
574static const char (*keypad_profile)[4][9] = old_keypad_profile;
575
576static DECLARE_BITMAP(bits, LCD_BITS);
577
578static void lcd_get_bits(unsigned int port, int *val)
579{
580 unsigned int bit, state;
581
582 for (bit = 0; bit < LCD_BITS; bit++) {
583 state = test_bit(bit, bits) ? BIT_SET : BIT_CLR;
584 *val &= lcd_bits[port][bit][BIT_MSK];
585 *val |= lcd_bits[port][bit][state];
586 }
587}
588
589
590static int set_data_bits(void)
591{
592 int val;
593
594 val = r_dtr(pprt);
595 lcd_get_bits(LCD_PORT_D, &val);
596 w_dtr(pprt, val);
597 return val;
598}
599
600
601static int set_ctrl_bits(void)
602{
603 int val;
604
605 val = r_ctr(pprt);
606 lcd_get_bits(LCD_PORT_C, &val);
607 w_ctr(pprt, val);
608 return val;
609}
610
611
612static void panel_set_bits(void)
613{
614 set_data_bits();
615 set_ctrl_bits();
616}
617
618
619
620
621
622
623
624
625
626
627static void pin_to_bits(int pin, unsigned char *d_val, unsigned char *c_val)
628{
629 int d_bit, c_bit, inv;
630
631 d_val[0] = 0;
632 c_val[0] = 0;
633 d_val[1] = 0;
634 c_val[1] = 0;
635 d_val[2] = 0xFF;
636 c_val[2] = 0xFF;
637
638 if (pin == 0)
639 return;
640
641 inv = (pin < 0);
642 if (inv)
643 pin = -pin;
644
645 d_bit = 0;
646 c_bit = 0;
647
648 switch (pin) {
649 case PIN_STROBE:
650 c_bit = PNL_PSTROBE;
651 inv = !inv;
652 break;
653 case PIN_D0...PIN_D7:
654 d_bit = 1 << (pin - 2);
655 break;
656 case PIN_AUTOLF:
657 c_bit = PNL_PAUTOLF;
658 inv = !inv;
659 break;
660 case PIN_INITP:
661 c_bit = PNL_PINITP;
662 break;
663 case PIN_SELECP:
664 c_bit = PNL_PSELECP;
665 inv = !inv;
666 break;
667 default:
668 break;
669 }
670
671 if (c_bit) {
672 c_val[2] &= ~c_bit;
673 c_val[!inv] = c_bit;
674 } else if (d_bit) {
675 d_val[2] &= ~d_bit;
676 d_val[!inv] = d_bit;
677 }
678}
679
680
681
682
683
684static void lcd_send_serial(int byte)
685{
686 int bit;
687
688
689
690
691
692 for (bit = 0; bit < 8; bit++) {
693 clear_bit(LCD_BIT_CL, bits);
694 panel_set_bits();
695 if (byte & 1) {
696 set_bit(LCD_BIT_DA, bits);
697 } else {
698 clear_bit(LCD_BIT_DA, bits);
699 }
700
701 panel_set_bits();
702 udelay(2);
703 set_bit(LCD_BIT_CL, bits);
704 panel_set_bits();
705 udelay(1);
706 byte >>= 1;
707 }
708}
709
710
711static void lcd_backlight(struct charlcd *charlcd, int on)
712{
713 if (lcd.pins.bl == PIN_NONE)
714 return;
715
716
717 spin_lock_irq(&pprt_lock);
718 if (on)
719 set_bit(LCD_BIT_BL, bits);
720 else
721 clear_bit(LCD_BIT_BL, bits);
722 panel_set_bits();
723 spin_unlock_irq(&pprt_lock);
724}
725
726
727static void lcd_write_cmd_s(struct charlcd *charlcd, int cmd)
728{
729 spin_lock_irq(&pprt_lock);
730 lcd_send_serial(0x1F);
731 lcd_send_serial(cmd & 0x0F);
732 lcd_send_serial((cmd >> 4) & 0x0F);
733 udelay(40);
734 spin_unlock_irq(&pprt_lock);
735}
736
737
738static void lcd_write_data_s(struct charlcd *charlcd, int data)
739{
740 spin_lock_irq(&pprt_lock);
741 lcd_send_serial(0x5F);
742 lcd_send_serial(data & 0x0F);
743 lcd_send_serial((data >> 4) & 0x0F);
744 udelay(40);
745 spin_unlock_irq(&pprt_lock);
746}
747
748
749static void lcd_write_cmd_p8(struct charlcd *charlcd, int cmd)
750{
751 spin_lock_irq(&pprt_lock);
752
753 w_dtr(pprt, cmd);
754 udelay(20);
755
756 set_bit(LCD_BIT_E, bits);
757 clear_bit(LCD_BIT_RS, bits);
758 clear_bit(LCD_BIT_RW, bits);
759 set_ctrl_bits();
760
761 udelay(40);
762
763 clear_bit(LCD_BIT_E, bits);
764 set_ctrl_bits();
765
766 udelay(120);
767 spin_unlock_irq(&pprt_lock);
768}
769
770
771static void lcd_write_data_p8(struct charlcd *charlcd, int data)
772{
773 spin_lock_irq(&pprt_lock);
774
775 w_dtr(pprt, data);
776 udelay(20);
777
778 set_bit(LCD_BIT_E, bits);
779 set_bit(LCD_BIT_RS, bits);
780 clear_bit(LCD_BIT_RW, bits);
781 set_ctrl_bits();
782
783 udelay(40);
784
785 clear_bit(LCD_BIT_E, bits);
786 set_ctrl_bits();
787
788 udelay(45);
789 spin_unlock_irq(&pprt_lock);
790}
791
792
793static void lcd_write_cmd_tilcd(struct charlcd *charlcd, int cmd)
794{
795 spin_lock_irq(&pprt_lock);
796
797 w_ctr(pprt, cmd);
798 udelay(60);
799 spin_unlock_irq(&pprt_lock);
800}
801
802
803static void lcd_write_data_tilcd(struct charlcd *charlcd, int data)
804{
805 spin_lock_irq(&pprt_lock);
806
807 w_dtr(pprt, data);
808 udelay(60);
809 spin_unlock_irq(&pprt_lock);
810}
811
812
813static void lcd_clear_fast_s(struct charlcd *charlcd)
814{
815 int pos;
816
817 spin_lock_irq(&pprt_lock);
818 for (pos = 0; pos < charlcd->height * charlcd->hwidth; pos++) {
819 lcd_send_serial(0x5F);
820 lcd_send_serial(' ' & 0x0F);
821 lcd_send_serial((' ' >> 4) & 0x0F);
822
823 udelay(40);
824 }
825 spin_unlock_irq(&pprt_lock);
826}
827
828
829static void lcd_clear_fast_p8(struct charlcd *charlcd)
830{
831 int pos;
832
833 spin_lock_irq(&pprt_lock);
834 for (pos = 0; pos < charlcd->height * charlcd->hwidth; pos++) {
835
836 w_dtr(pprt, ' ');
837
838
839 udelay(20);
840
841 set_bit(LCD_BIT_E, bits);
842 set_bit(LCD_BIT_RS, bits);
843 clear_bit(LCD_BIT_RW, bits);
844 set_ctrl_bits();
845
846
847 udelay(40);
848
849 clear_bit(LCD_BIT_E, bits);
850 set_ctrl_bits();
851
852
853 udelay(45);
854 }
855 spin_unlock_irq(&pprt_lock);
856}
857
858
859static void lcd_clear_fast_tilcd(struct charlcd *charlcd)
860{
861 int pos;
862
863 spin_lock_irq(&pprt_lock);
864 for (pos = 0; pos < charlcd->height * charlcd->hwidth; pos++) {
865
866 w_dtr(pprt, ' ');
867 udelay(60);
868 }
869
870 spin_unlock_irq(&pprt_lock);
871}
872
873static const struct charlcd_ops charlcd_serial_ops = {
874 .write_cmd = lcd_write_cmd_s,
875 .write_data = lcd_write_data_s,
876 .clear_fast = lcd_clear_fast_s,
877 .backlight = lcd_backlight,
878};
879
880static const struct charlcd_ops charlcd_parallel_ops = {
881 .write_cmd = lcd_write_cmd_p8,
882 .write_data = lcd_write_data_p8,
883 .clear_fast = lcd_clear_fast_p8,
884 .backlight = lcd_backlight,
885};
886
887static const struct charlcd_ops charlcd_tilcd_ops = {
888 .write_cmd = lcd_write_cmd_tilcd,
889 .write_data = lcd_write_data_tilcd,
890 .clear_fast = lcd_clear_fast_tilcd,
891 .backlight = lcd_backlight,
892};
893
894
895static void lcd_init(void)
896{
897 struct charlcd *charlcd;
898
899 charlcd = charlcd_alloc(0);
900 if (!charlcd)
901 return;
902
903
904
905
906
907 charlcd->height = lcd_height;
908 charlcd->width = lcd_width;
909 charlcd->bwidth = lcd_bwidth;
910 charlcd->hwidth = lcd_hwidth;
911
912 switch (selected_lcd_type) {
913 case LCD_TYPE_OLD:
914
915 lcd.proto = LCD_PROTO_PARALLEL;
916 lcd.charset = LCD_CHARSET_NORMAL;
917 lcd.pins.e = PIN_STROBE;
918 lcd.pins.rs = PIN_AUTOLF;
919
920 charlcd->width = 40;
921 charlcd->bwidth = 40;
922 charlcd->hwidth = 64;
923 charlcd->height = 2;
924 break;
925 case LCD_TYPE_KS0074:
926
927 lcd.proto = LCD_PROTO_SERIAL;
928 lcd.charset = LCD_CHARSET_KS0074;
929 lcd.pins.bl = PIN_AUTOLF;
930 lcd.pins.cl = PIN_STROBE;
931 lcd.pins.da = PIN_D0;
932
933 charlcd->width = 16;
934 charlcd->bwidth = 40;
935 charlcd->hwidth = 16;
936 charlcd->height = 2;
937 break;
938 case LCD_TYPE_NEXCOM:
939
940 lcd.proto = LCD_PROTO_PARALLEL;
941 lcd.charset = LCD_CHARSET_NORMAL;
942 lcd.pins.e = PIN_AUTOLF;
943 lcd.pins.rs = PIN_SELECP;
944 lcd.pins.rw = PIN_INITP;
945
946 charlcd->width = 16;
947 charlcd->bwidth = 40;
948 charlcd->hwidth = 64;
949 charlcd->height = 2;
950 break;
951 case LCD_TYPE_CUSTOM:
952
953 lcd.proto = DEFAULT_LCD_PROTO;
954 lcd.charset = DEFAULT_LCD_CHARSET;
955
956 break;
957 case LCD_TYPE_HANTRONIX:
958
959 default:
960 lcd.proto = LCD_PROTO_PARALLEL;
961 lcd.charset = LCD_CHARSET_NORMAL;
962 lcd.pins.e = PIN_STROBE;
963 lcd.pins.rs = PIN_SELECP;
964
965 charlcd->width = 16;
966 charlcd->bwidth = 40;
967 charlcd->hwidth = 64;
968 charlcd->height = 2;
969 break;
970 }
971
972
973 if (lcd_height != NOT_SET)
974 charlcd->height = lcd_height;
975 if (lcd_width != NOT_SET)
976 charlcd->width = lcd_width;
977 if (lcd_bwidth != NOT_SET)
978 charlcd->bwidth = lcd_bwidth;
979 if (lcd_hwidth != NOT_SET)
980 charlcd->hwidth = lcd_hwidth;
981 if (lcd_charset != NOT_SET)
982 lcd.charset = lcd_charset;
983 if (lcd_proto != NOT_SET)
984 lcd.proto = lcd_proto;
985 if (lcd_e_pin != PIN_NOT_SET)
986 lcd.pins.e = lcd_e_pin;
987 if (lcd_rs_pin != PIN_NOT_SET)
988 lcd.pins.rs = lcd_rs_pin;
989 if (lcd_rw_pin != PIN_NOT_SET)
990 lcd.pins.rw = lcd_rw_pin;
991 if (lcd_cl_pin != PIN_NOT_SET)
992 lcd.pins.cl = lcd_cl_pin;
993 if (lcd_da_pin != PIN_NOT_SET)
994 lcd.pins.da = lcd_da_pin;
995 if (lcd_bl_pin != PIN_NOT_SET)
996 lcd.pins.bl = lcd_bl_pin;
997
998
999 if (charlcd->width <= 0)
1000 charlcd->width = DEFAULT_LCD_WIDTH;
1001 if (charlcd->bwidth <= 0)
1002 charlcd->bwidth = DEFAULT_LCD_BWIDTH;
1003 if (charlcd->hwidth <= 0)
1004 charlcd->hwidth = DEFAULT_LCD_HWIDTH;
1005 if (charlcd->height <= 0)
1006 charlcd->height = DEFAULT_LCD_HEIGHT;
1007
1008 if (lcd.proto == LCD_PROTO_SERIAL) {
1009 charlcd->ops = &charlcd_serial_ops;
1010
1011 if (lcd.pins.cl == PIN_NOT_SET)
1012 lcd.pins.cl = DEFAULT_LCD_PIN_SCL;
1013 if (lcd.pins.da == PIN_NOT_SET)
1014 lcd.pins.da = DEFAULT_LCD_PIN_SDA;
1015
1016 } else if (lcd.proto == LCD_PROTO_PARALLEL) {
1017 charlcd->ops = &charlcd_parallel_ops;
1018
1019 if (lcd.pins.e == PIN_NOT_SET)
1020 lcd.pins.e = DEFAULT_LCD_PIN_E;
1021 if (lcd.pins.rs == PIN_NOT_SET)
1022 lcd.pins.rs = DEFAULT_LCD_PIN_RS;
1023 if (lcd.pins.rw == PIN_NOT_SET)
1024 lcd.pins.rw = DEFAULT_LCD_PIN_RW;
1025 } else {
1026 charlcd->ops = &charlcd_tilcd_ops;
1027 }
1028
1029 if (lcd.pins.bl == PIN_NOT_SET)
1030 lcd.pins.bl = DEFAULT_LCD_PIN_BL;
1031
1032 if (lcd.pins.e == PIN_NOT_SET)
1033 lcd.pins.e = PIN_NONE;
1034 if (lcd.pins.rs == PIN_NOT_SET)
1035 lcd.pins.rs = PIN_NONE;
1036 if (lcd.pins.rw == PIN_NOT_SET)
1037 lcd.pins.rw = PIN_NONE;
1038 if (lcd.pins.bl == PIN_NOT_SET)
1039 lcd.pins.bl = PIN_NONE;
1040 if (lcd.pins.cl == PIN_NOT_SET)
1041 lcd.pins.cl = PIN_NONE;
1042 if (lcd.pins.da == PIN_NOT_SET)
1043 lcd.pins.da = PIN_NONE;
1044
1045 if (lcd.charset == NOT_SET)
1046 lcd.charset = DEFAULT_LCD_CHARSET;
1047
1048 if (lcd.charset == LCD_CHARSET_KS0074)
1049 charlcd->char_conv = lcd_char_conv_ks0074;
1050 else
1051 charlcd->char_conv = NULL;
1052
1053 pin_to_bits(lcd.pins.e, lcd_bits[LCD_PORT_D][LCD_BIT_E],
1054 lcd_bits[LCD_PORT_C][LCD_BIT_E]);
1055 pin_to_bits(lcd.pins.rs, lcd_bits[LCD_PORT_D][LCD_BIT_RS],
1056 lcd_bits[LCD_PORT_C][LCD_BIT_RS]);
1057 pin_to_bits(lcd.pins.rw, lcd_bits[LCD_PORT_D][LCD_BIT_RW],
1058 lcd_bits[LCD_PORT_C][LCD_BIT_RW]);
1059 pin_to_bits(lcd.pins.bl, lcd_bits[LCD_PORT_D][LCD_BIT_BL],
1060 lcd_bits[LCD_PORT_C][LCD_BIT_BL]);
1061 pin_to_bits(lcd.pins.cl, lcd_bits[LCD_PORT_D][LCD_BIT_CL],
1062 lcd_bits[LCD_PORT_C][LCD_BIT_CL]);
1063 pin_to_bits(lcd.pins.da, lcd_bits[LCD_PORT_D][LCD_BIT_DA],
1064 lcd_bits[LCD_PORT_C][LCD_BIT_DA]);
1065
1066 lcd.charlcd = charlcd;
1067 lcd.initialized = true;
1068}
1069
1070
1071
1072
1073
1074static ssize_t keypad_read(struct file *file,
1075 char __user *buf, size_t count, loff_t *ppos)
1076{
1077 unsigned i = *ppos;
1078 char __user *tmp = buf;
1079
1080 if (keypad_buflen == 0) {
1081 if (file->f_flags & O_NONBLOCK)
1082 return -EAGAIN;
1083
1084 if (wait_event_interruptible(keypad_read_wait,
1085 keypad_buflen != 0))
1086 return -EINTR;
1087 }
1088
1089 for (; count-- > 0 && (keypad_buflen > 0);
1090 ++i, ++tmp, --keypad_buflen) {
1091 put_user(keypad_buffer[keypad_start], tmp);
1092 keypad_start = (keypad_start + 1) % KEYPAD_BUFFER;
1093 }
1094 *ppos = i;
1095
1096 return tmp - buf;
1097}
1098
1099static int keypad_open(struct inode *inode, struct file *file)
1100{
1101 int ret;
1102
1103 ret = -EBUSY;
1104 if (!atomic_dec_and_test(&keypad_available))
1105 goto fail;
1106
1107 ret = -EPERM;
1108 if (file->f_mode & FMODE_WRITE)
1109 goto fail;
1110
1111 keypad_buflen = 0;
1112 return 0;
1113 fail:
1114 atomic_inc(&keypad_available);
1115 return ret;
1116}
1117
1118static int keypad_release(struct inode *inode, struct file *file)
1119{
1120 atomic_inc(&keypad_available);
1121 return 0;
1122}
1123
1124static const struct file_operations keypad_fops = {
1125 .read = keypad_read,
1126 .open = keypad_open,
1127 .release = keypad_release,
1128 .llseek = default_llseek,
1129};
1130
1131static struct miscdevice keypad_dev = {
1132 .minor = KEYPAD_MINOR,
1133 .name = "keypad",
1134 .fops = &keypad_fops,
1135};
1136
1137static void keypad_send_key(const char *string, int max_len)
1138{
1139
1140 if (!atomic_read(&keypad_available)) {
1141 while (max_len-- && keypad_buflen < KEYPAD_BUFFER && *string) {
1142 keypad_buffer[(keypad_start + keypad_buflen++) %
1143 KEYPAD_BUFFER] = *string++;
1144 }
1145 wake_up_interruptible(&keypad_read_wait);
1146 }
1147}
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159static void phys_scan_contacts(void)
1160{
1161 int bit, bitval;
1162 char oldval;
1163 char bitmask;
1164 char gndmask;
1165
1166 phys_prev = phys_curr;
1167 phys_read_prev = phys_read;
1168 phys_read = 0;
1169
1170
1171 oldval = r_dtr(pprt) | scan_mask_o;
1172
1173 w_dtr(pprt, oldval & ~scan_mask_o);
1174
1175
1176 bitmask = PNL_PINPUT(r_str(pprt)) & scan_mask_i;
1177
1178 w_dtr(pprt, oldval);
1179
1180
1181
1182
1183
1184
1185 gndmask = PNL_PINPUT(r_str(pprt)) & scan_mask_i;
1186
1187
1188 phys_read |= (__u64)gndmask << 40;
1189
1190 if (bitmask != gndmask) {
1191
1192
1193
1194
1195
1196 for (bit = 0; bit < 8; bit++) {
1197 bitval = BIT(bit);
1198
1199 if (!(scan_mask_o & bitval))
1200 continue;
1201
1202 w_dtr(pprt, oldval & ~bitval);
1203 bitmask = PNL_PINPUT(r_str(pprt)) & ~gndmask;
1204 phys_read |= (__u64)bitmask << (5 * bit);
1205 }
1206 w_dtr(pprt, oldval);
1207 }
1208
1209
1210
1211
1212 phys_curr = (phys_prev & (phys_read ^ phys_read_prev)) |
1213 (phys_read & ~(phys_read ^ phys_read_prev));
1214}
1215
1216static inline int input_state_high(struct logical_input *input)
1217{
1218#if 0
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236 if (((phys_prev & input->mask) == input->value) &&
1237 ((phys_curr & input->mask) > input->value)) {
1238 input->state = INPUT_ST_LOW;
1239 return 1;
1240 }
1241#endif
1242
1243 if ((phys_curr & input->mask) == input->value) {
1244 if ((input->type == INPUT_TYPE_STD) &&
1245 (input->high_timer == 0)) {
1246 input->high_timer++;
1247 if (input->u.std.press_fct)
1248 input->u.std.press_fct(input->u.std.press_data);
1249 } else if (input->type == INPUT_TYPE_KBD) {
1250
1251 keypressed = 1;
1252
1253 if (input->high_timer == 0) {
1254 char *press_str = input->u.kbd.press_str;
1255
1256 if (press_str[0]) {
1257 int s = sizeof(input->u.kbd.press_str);
1258
1259 keypad_send_key(press_str, s);
1260 }
1261 }
1262
1263 if (input->u.kbd.repeat_str[0]) {
1264 char *repeat_str = input->u.kbd.repeat_str;
1265
1266 if (input->high_timer >= KEYPAD_REP_START) {
1267 int s = sizeof(input->u.kbd.repeat_str);
1268
1269 input->high_timer -= KEYPAD_REP_DELAY;
1270 keypad_send_key(repeat_str, s);
1271 }
1272
1273 inputs_stable = 0;
1274 }
1275
1276 if (input->high_timer < 255)
1277 input->high_timer++;
1278 }
1279 return 1;
1280 }
1281
1282
1283 input->state = INPUT_ST_FALLING;
1284 input->fall_timer = 0;
1285
1286 return 0;
1287}
1288
1289static inline void input_state_falling(struct logical_input *input)
1290{
1291#if 0
1292
1293 if (((phys_prev & input->mask) == input->value) &&
1294 ((phys_curr & input->mask) > input->value)) {
1295 input->state = INPUT_ST_LOW;
1296 return;
1297 }
1298#endif
1299
1300 if ((phys_curr & input->mask) == input->value) {
1301 if (input->type == INPUT_TYPE_KBD) {
1302
1303 keypressed = 1;
1304
1305 if (input->u.kbd.repeat_str[0]) {
1306 char *repeat_str = input->u.kbd.repeat_str;
1307
1308 if (input->high_timer >= KEYPAD_REP_START) {
1309 int s = sizeof(input->u.kbd.repeat_str);
1310
1311 input->high_timer -= KEYPAD_REP_DELAY;
1312 keypad_send_key(repeat_str, s);
1313 }
1314
1315 inputs_stable = 0;
1316 }
1317
1318 if (input->high_timer < 255)
1319 input->high_timer++;
1320 }
1321 input->state = INPUT_ST_HIGH;
1322 } else if (input->fall_timer >= input->fall_time) {
1323
1324 if (input->type == INPUT_TYPE_STD) {
1325 void (*release_fct)(int) = input->u.std.release_fct;
1326
1327 if (release_fct)
1328 release_fct(input->u.std.release_data);
1329 } else if (input->type == INPUT_TYPE_KBD) {
1330 char *release_str = input->u.kbd.release_str;
1331
1332 if (release_str[0]) {
1333 int s = sizeof(input->u.kbd.release_str);
1334
1335 keypad_send_key(release_str, s);
1336 }
1337 }
1338
1339 input->state = INPUT_ST_LOW;
1340 } else {
1341 input->fall_timer++;
1342 inputs_stable = 0;
1343 }
1344}
1345
1346static void panel_process_inputs(void)
1347{
1348 struct logical_input *input;
1349
1350 keypressed = 0;
1351 inputs_stable = 1;
1352 list_for_each_entry(input, &logical_inputs, list) {
1353 switch (input->state) {
1354 case INPUT_ST_LOW:
1355 if ((phys_curr & input->mask) != input->value)
1356 break;
1357
1358
1359
1360
1361
1362
1363
1364 if ((phys_prev & input->mask) == input->value)
1365 break;
1366 input->rise_timer = 0;
1367 input->state = INPUT_ST_RISING;
1368
1369 case INPUT_ST_RISING:
1370 if ((phys_curr & input->mask) != input->value) {
1371 input->state = INPUT_ST_LOW;
1372 break;
1373 }
1374 if (input->rise_timer < input->rise_time) {
1375 inputs_stable = 0;
1376 input->rise_timer++;
1377 break;
1378 }
1379 input->high_timer = 0;
1380 input->state = INPUT_ST_HIGH;
1381
1382 case INPUT_ST_HIGH:
1383 if (input_state_high(input))
1384 break;
1385
1386 case INPUT_ST_FALLING:
1387 input_state_falling(input);
1388 }
1389 }
1390}
1391
1392static void panel_scan_timer(struct timer_list *unused)
1393{
1394 if (keypad.enabled && keypad_initialized) {
1395 if (spin_trylock_irq(&pprt_lock)) {
1396 phys_scan_contacts();
1397
1398
1399 spin_unlock_irq(&pprt_lock);
1400 }
1401
1402 if (!inputs_stable || phys_curr != phys_prev)
1403 panel_process_inputs();
1404 }
1405
1406 if (keypressed && lcd.enabled && lcd.initialized)
1407 charlcd_poke(lcd.charlcd);
1408
1409 mod_timer(&scan_timer, jiffies + INPUT_POLL_TIME);
1410}
1411
1412static void init_scan_timer(void)
1413{
1414 if (scan_timer.function)
1415 return;
1416
1417 timer_setup(&scan_timer, panel_scan_timer, 0);
1418 scan_timer.expires = jiffies + INPUT_POLL_TIME;
1419 add_timer(&scan_timer);
1420}
1421
1422
1423
1424
1425
1426
1427static u8 input_name2mask(const char *name, __u64 *mask, __u64 *value,
1428 u8 *imask, u8 *omask)
1429{
1430 const char sigtab[] = "EeSsPpAaBb";
1431 u8 im, om;
1432 __u64 m, v;
1433
1434 om = 0;
1435 im = 0;
1436 m = 0ULL;
1437 v = 0ULL;
1438 while (*name) {
1439 int in, out, bit, neg;
1440 const char *idx;
1441
1442 idx = strchr(sigtab, *name);
1443 if (!idx)
1444 return 0;
1445
1446 in = idx - sigtab;
1447 neg = (in & 1);
1448 in >>= 1;
1449 im |= BIT(in);
1450
1451 name++;
1452 if (*name >= '0' && *name <= '7') {
1453 out = *name - '0';
1454 om |= BIT(out);
1455 } else if (*name == '-') {
1456 out = 8;
1457 } else {
1458 return 0;
1459 }
1460
1461 bit = (out * 5) + in;
1462
1463 m |= 1ULL << bit;
1464 if (!neg)
1465 v |= 1ULL << bit;
1466 name++;
1467 }
1468 *mask = m;
1469 *value = v;
1470 if (imask)
1471 *imask |= im;
1472 if (omask)
1473 *omask |= om;
1474 return 1;
1475}
1476
1477
1478
1479
1480
1481static struct logical_input *panel_bind_key(const char *name, const char *press,
1482 const char *repeat,
1483 const char *release)
1484{
1485 struct logical_input *key;
1486
1487 key = kzalloc(sizeof(*key), GFP_KERNEL);
1488 if (!key)
1489 return NULL;
1490
1491 if (!input_name2mask(name, &key->mask, &key->value, &scan_mask_i,
1492 &scan_mask_o)) {
1493 kfree(key);
1494 return NULL;
1495 }
1496
1497 key->type = INPUT_TYPE_KBD;
1498 key->state = INPUT_ST_LOW;
1499 key->rise_time = 1;
1500 key->fall_time = 1;
1501
1502 strncpy(key->u.kbd.press_str, press, sizeof(key->u.kbd.press_str));
1503 strncpy(key->u.kbd.repeat_str, repeat, sizeof(key->u.kbd.repeat_str));
1504 strncpy(key->u.kbd.release_str, release,
1505 sizeof(key->u.kbd.release_str));
1506 list_add(&key->list, &logical_inputs);
1507 return key;
1508}
1509
1510#if 0
1511
1512
1513
1514
1515
1516
1517static struct logical_input *panel_bind_callback(char *name,
1518 void (*press_fct)(int),
1519 int press_data,
1520 void (*release_fct)(int),
1521 int release_data)
1522{
1523 struct logical_input *callback;
1524
1525 callback = kmalloc(sizeof(*callback), GFP_KERNEL);
1526 if (!callback)
1527 return NULL;
1528
1529 memset(callback, 0, sizeof(struct logical_input));
1530 if (!input_name2mask(name, &callback->mask, &callback->value,
1531 &scan_mask_i, &scan_mask_o))
1532 return NULL;
1533
1534 callback->type = INPUT_TYPE_STD;
1535 callback->state = INPUT_ST_LOW;
1536 callback->rise_time = 1;
1537 callback->fall_time = 1;
1538 callback->u.std.press_fct = press_fct;
1539 callback->u.std.press_data = press_data;
1540 callback->u.std.release_fct = release_fct;
1541 callback->u.std.release_data = release_data;
1542 list_add(&callback->list, &logical_inputs);
1543 return callback;
1544}
1545#endif
1546
1547static void keypad_init(void)
1548{
1549 int keynum;
1550
1551 init_waitqueue_head(&keypad_read_wait);
1552 keypad_buflen = 0;
1553
1554
1555
1556 for (keynum = 0; keypad_profile[keynum][0][0]; keynum++) {
1557 panel_bind_key(keypad_profile[keynum][0],
1558 keypad_profile[keynum][1],
1559 keypad_profile[keynum][2],
1560 keypad_profile[keynum][3]);
1561 }
1562
1563 init_scan_timer();
1564 keypad_initialized = 1;
1565}
1566
1567
1568
1569
1570
1571static void panel_attach(struct parport *port)
1572{
1573 struct pardev_cb panel_cb;
1574
1575 if (port->number != parport)
1576 return;
1577
1578 if (pprt) {
1579 pr_err("%s: port->number=%d parport=%d, already registered!\n",
1580 __func__, port->number, parport);
1581 return;
1582 }
1583
1584 memset(&panel_cb, 0, sizeof(panel_cb));
1585 panel_cb.private = &pprt;
1586
1587
1588 pprt = parport_register_dev_model(port, "panel", &panel_cb, 0);
1589 if (!pprt) {
1590 pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n",
1591 __func__, port->number, parport);
1592 return;
1593 }
1594
1595 if (parport_claim(pprt)) {
1596 pr_err("could not claim access to parport%d. Aborting.\n",
1597 parport);
1598 goto err_unreg_device;
1599 }
1600
1601
1602
1603
1604 if (lcd.enabled) {
1605 lcd_init();
1606 if (!lcd.charlcd || charlcd_register(lcd.charlcd))
1607 goto err_unreg_device;
1608 }
1609
1610 if (keypad.enabled) {
1611 keypad_init();
1612 if (misc_register(&keypad_dev))
1613 goto err_lcd_unreg;
1614 }
1615 return;
1616
1617err_lcd_unreg:
1618 if (scan_timer.function)
1619 del_timer_sync(&scan_timer);
1620 if (lcd.enabled)
1621 charlcd_unregister(lcd.charlcd);
1622err_unreg_device:
1623 charlcd_free(lcd.charlcd);
1624 lcd.charlcd = NULL;
1625 parport_unregister_device(pprt);
1626 pprt = NULL;
1627}
1628
1629static void panel_detach(struct parport *port)
1630{
1631 if (port->number != parport)
1632 return;
1633
1634 if (!pprt) {
1635 pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n",
1636 __func__, port->number, parport);
1637 return;
1638 }
1639 if (scan_timer.function)
1640 del_timer_sync(&scan_timer);
1641
1642 if (keypad.enabled) {
1643 misc_deregister(&keypad_dev);
1644 keypad_initialized = 0;
1645 }
1646
1647 if (lcd.enabled) {
1648 charlcd_unregister(lcd.charlcd);
1649 lcd.initialized = false;
1650 charlcd_free(lcd.charlcd);
1651 lcd.charlcd = NULL;
1652 }
1653
1654
1655 parport_release(pprt);
1656 parport_unregister_device(pprt);
1657 pprt = NULL;
1658}
1659
1660static struct parport_driver panel_driver = {
1661 .name = "panel",
1662 .match_port = panel_attach,
1663 .detach = panel_detach,
1664 .devmodel = true,
1665};
1666
1667
1668static int __init panel_init_module(void)
1669{
1670 int selected_keypad_type = NOT_SET, err;
1671
1672
1673 switch (profile) {
1674 case PANEL_PROFILE_CUSTOM:
1675
1676 selected_keypad_type = DEFAULT_KEYPAD_TYPE;
1677 selected_lcd_type = DEFAULT_LCD_TYPE;
1678 break;
1679 case PANEL_PROFILE_OLD:
1680
1681 selected_keypad_type = KEYPAD_TYPE_OLD;
1682 selected_lcd_type = LCD_TYPE_OLD;
1683
1684
1685 if (lcd_width == NOT_SET)
1686 lcd_width = 16;
1687 if (lcd_hwidth == NOT_SET)
1688 lcd_hwidth = 16;
1689 break;
1690 case PANEL_PROFILE_NEW:
1691
1692 selected_keypad_type = KEYPAD_TYPE_NEW;
1693 selected_lcd_type = LCD_TYPE_KS0074;
1694 break;
1695 case PANEL_PROFILE_HANTRONIX:
1696
1697 selected_keypad_type = KEYPAD_TYPE_NONE;
1698 selected_lcd_type = LCD_TYPE_HANTRONIX;
1699 break;
1700 case PANEL_PROFILE_NEXCOM:
1701
1702 selected_keypad_type = KEYPAD_TYPE_NEXCOM;
1703 selected_lcd_type = LCD_TYPE_NEXCOM;
1704 break;
1705 case PANEL_PROFILE_LARGE:
1706
1707 selected_keypad_type = KEYPAD_TYPE_OLD;
1708 selected_lcd_type = LCD_TYPE_OLD;
1709 break;
1710 }
1711
1712
1713
1714
1715
1716 if (keypad_enabled != NOT_SET)
1717 selected_keypad_type = keypad_enabled;
1718 if (keypad_type != NOT_SET)
1719 selected_keypad_type = keypad_type;
1720
1721 keypad.enabled = (selected_keypad_type > 0);
1722
1723 if (lcd_enabled != NOT_SET)
1724 selected_lcd_type = lcd_enabled;
1725 if (lcd_type != NOT_SET)
1726 selected_lcd_type = lcd_type;
1727
1728 lcd.enabled = (selected_lcd_type > 0);
1729
1730 if (lcd.enabled) {
1731
1732
1733
1734
1735 lcd.charset = lcd_charset;
1736 lcd.proto = lcd_proto;
1737 lcd.pins.e = lcd_e_pin;
1738 lcd.pins.rs = lcd_rs_pin;
1739 lcd.pins.rw = lcd_rw_pin;
1740 lcd.pins.cl = lcd_cl_pin;
1741 lcd.pins.da = lcd_da_pin;
1742 lcd.pins.bl = lcd_bl_pin;
1743 }
1744
1745 switch (selected_keypad_type) {
1746 case KEYPAD_TYPE_OLD:
1747 keypad_profile = old_keypad_profile;
1748 break;
1749 case KEYPAD_TYPE_NEW:
1750 keypad_profile = new_keypad_profile;
1751 break;
1752 case KEYPAD_TYPE_NEXCOM:
1753 keypad_profile = nexcom_keypad_profile;
1754 break;
1755 default:
1756 keypad_profile = NULL;
1757 break;
1758 }
1759
1760 if (!lcd.enabled && !keypad.enabled) {
1761
1762 pr_err("panel driver disabled.\n");
1763 return -ENODEV;
1764 }
1765
1766 err = parport_register_driver(&panel_driver);
1767 if (err) {
1768 pr_err("could not register with parport. Aborting.\n");
1769 return err;
1770 }
1771
1772 if (pprt)
1773 pr_info("panel driver registered on parport%d (io=0x%lx).\n",
1774 parport, pprt->port->base);
1775 else
1776 pr_info("panel driver not yet registered\n");
1777 return 0;
1778}
1779
1780static void __exit panel_cleanup_module(void)
1781{
1782 parport_unregister_driver(&panel_driver);
1783}
1784
1785module_init(panel_init_module);
1786module_exit(panel_cleanup_module);
1787MODULE_AUTHOR("Willy Tarreau");
1788MODULE_LICENSE("GPL");
1789
1790
1791
1792
1793
1794
1795
1796