Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
   1/*
   2 * Front panel driver for Linux
   3 * Copyright (C) 2000-2008, Willy Tarreau <w@1wt.eu>
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License
   7 * as published by the Free Software Foundation; either version
   8 * 2 of the License, or (at your option) any later version.
   9 *
  10 * This code drives an LCD module (/dev/lcd), and a keypad (/dev/keypad)
  11 * connected to a parallel printer port.
  12 *
  13 * The LCD module may either be an HD44780-like 8-bit parallel LCD, or a 1-bit
  14 * serial module compatible with Samsung's KS0074. The pins may be connected in
  15 * any combination, everything is programmable.
  16 *
  17 * The keypad consists in a matrix of push buttons connecting input pins to
  18 * data output pins or to the ground. The combinations have to be hard-coded
  19 * in the driver, though several profiles exist and adding new ones is easy.
  20 *
  21 * Several profiles are provided for commonly found LCD+keypad modules on the
  22 * market, such as those found in Nexcom's appliances.
  23 *
  24 * FIXME:
  25 *      - the initialization/deinitialization process is very dirty and should
  26 *        be rewritten. It may even be buggy.
  27 *
  28 * TODO:
  29 *	- document 24 keys keyboard (3 rows of 8 cols, 32 diodes + 2 inputs)
  30 *      - make the LCD a part of a virtual screen of Vx*Vy
  31 *	- make the inputs list smp-safe
  32 *      - change the keyboard to a double mapping : signals -> key_id -> values
  33 *        so that applications can change values without knowing signals
  34 *
  35 */
  36
  37#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  38
  39#include <linux/module.h>
  40
  41#include <linux/types.h>
  42#include <linux/errno.h>
  43#include <linux/signal.h>
  44#include <linux/sched.h>
  45#include <linux/spinlock.h>
  46#include <linux/interrupt.h>
  47#include <linux/miscdevice.h>
  48#include <linux/slab.h>
  49#include <linux/ioport.h>
  50#include <linux/fcntl.h>
  51#include <linux/init.h>
  52#include <linux/delay.h>
  53#include <linux/kernel.h>
  54#include <linux/ctype.h>
  55#include <linux/parport.h>
  56#include <linux/list.h>
  57#include <linux/notifier.h>
  58#include <linux/reboot.h>
  59#include <generated/utsrelease.h>
  60
  61#include <linux/io.h>
  62#include <linux/uaccess.h>
  63
  64#define LCD_MINOR		156
  65#define KEYPAD_MINOR		185
  66
  67#define PANEL_VERSION		"0.9.5"
  68
  69#define LCD_MAXBYTES		256	/* max burst write */
  70
  71#define KEYPAD_BUFFER		64
  72
  73/* poll the keyboard this every second */
  74#define INPUT_POLL_TIME		(HZ / 50)
  75/* a key starts to repeat after this times INPUT_POLL_TIME */
  76#define KEYPAD_REP_START	(10)
  77/* a key repeats this times INPUT_POLL_TIME */
  78#define KEYPAD_REP_DELAY	(2)
  79
  80/* keep the light on this times INPUT_POLL_TIME for each flash */
  81#define FLASH_LIGHT_TEMPO	(200)
  82
  83/* converts an r_str() input to an active high, bits string : 000BAOSE */
  84#define PNL_PINPUT(a)		((((unsigned char)(a)) ^ 0x7F) >> 3)
  85
  86#define PNL_PBUSY		0x80	/* inverted input, active low */
  87#define PNL_PACK		0x40	/* direct input, active low */
  88#define PNL_POUTPA		0x20	/* direct input, active high */
  89#define PNL_PSELECD		0x10	/* direct input, active high */
  90#define PNL_PERRORP		0x08	/* direct input, active low */
  91
  92#define PNL_PBIDIR		0x20	/* bi-directional ports */
  93/* high to read data in or-ed with data out */
  94#define PNL_PINTEN		0x10
  95#define PNL_PSELECP		0x08	/* inverted output, active low */
  96#define PNL_PINITP		0x04	/* direct output, active low */
  97#define PNL_PAUTOLF		0x02	/* inverted output, active low */
  98#define PNL_PSTROBE		0x01	/* inverted output */
  99
 100#define PNL_PD0			0x01
 101#define PNL_PD1			0x02
 102#define PNL_PD2			0x04
 103#define PNL_PD3			0x08
 104#define PNL_PD4			0x10
 105#define PNL_PD5			0x20
 106#define PNL_PD6			0x40
 107#define PNL_PD7			0x80
 108
 109#define PIN_NONE		0
 110#define PIN_STROBE		1
 111#define PIN_D0			2
 112#define PIN_D1			3
 113#define PIN_D2			4
 114#define PIN_D3			5
 115#define PIN_D4			6
 116#define PIN_D5			7
 117#define PIN_D6			8
 118#define PIN_D7			9
 119#define PIN_AUTOLF		14
 120#define PIN_INITP		16
 121#define PIN_SELECP		17
 122#define PIN_NOT_SET		127
 123
 124#define LCD_FLAG_S		0x0001
 125#define LCD_FLAG_ID		0x0002
 126#define LCD_FLAG_B		0x0004	/* blink on */
 127#define LCD_FLAG_C		0x0008	/* cursor on */
 128#define LCD_FLAG_D		0x0010	/* display on */
 129#define LCD_FLAG_F		0x0020	/* large font mode */
 130#define LCD_FLAG_N		0x0040	/* 2-rows mode */
 131#define LCD_FLAG_L		0x0080	/* backlight enabled */
 132
 133/* LCD commands */
 134#define LCD_CMD_DISPLAY_CLEAR	0x01	/* Clear entire display */
 135
 136#define LCD_CMD_ENTRY_MODE	0x04	/* Set entry mode */
 137#define LCD_CMD_CURSOR_INC	0x02	/* Increment cursor */
 138
 139#define LCD_CMD_DISPLAY_CTRL	0x08	/* Display control */
 140#define LCD_CMD_DISPLAY_ON	0x04	/* Set display on */
 141#define LCD_CMD_CURSOR_ON	0x02	/* Set cursor on */
 142#define LCD_CMD_BLINK_ON	0x01	/* Set blink on */
 143
 144#define LCD_CMD_SHIFT		0x10	/* Shift cursor/display */
 145#define LCD_CMD_DISPLAY_SHIFT	0x08	/* Shift display instead of cursor */
 146#define LCD_CMD_SHIFT_RIGHT	0x04	/* Shift display/cursor to the right */
 147
 148#define LCD_CMD_FUNCTION_SET	0x20	/* Set function */
 149#define LCD_CMD_DATA_LEN_8BITS	0x10	/* Set data length to 8 bits */
 150#define LCD_CMD_TWO_LINES	0x08	/* Set to two display lines */
 151#define LCD_CMD_FONT_5X10_DOTS	0x04	/* Set char font to 5x10 dots */
 152
 153#define LCD_CMD_SET_CGRAM_ADDR	0x40	/* Set char generator RAM address */
 154
 155#define LCD_CMD_SET_DDRAM_ADDR	0x80	/* Set display data RAM address */
 156
 157#define LCD_ESCAPE_LEN		24	/* max chars for LCD escape command */
 158#define LCD_ESCAPE_CHAR	27	/* use char 27 for escape command */
 159
 160#define NOT_SET			-1
 161
 162/* macros to simplify use of the parallel port */
 163#define r_ctr(x)        (parport_read_control((x)->port))
 164#define r_dtr(x)        (parport_read_data((x)->port))
 165#define r_str(x)        (parport_read_status((x)->port))
 166#define w_ctr(x, y)     (parport_write_control((x)->port, (y)))
 167#define w_dtr(x, y)     (parport_write_data((x)->port, (y)))
 168
 169/* this defines which bits are to be used and which ones to be ignored */
 170/* logical or of the output bits involved in the scan matrix */
 171static __u8 scan_mask_o;
 172/* logical or of the input bits involved in the scan matrix */
 173static __u8 scan_mask_i;
 174
 175enum input_type {
 176	INPUT_TYPE_STD,
 177	INPUT_TYPE_KBD,
 178};
 179
 180enum input_state {
 181	INPUT_ST_LOW,
 182	INPUT_ST_RISING,
 183	INPUT_ST_HIGH,
 184	INPUT_ST_FALLING,
 185};
 186
 187struct logical_input {
 188	struct list_head list;
 189	__u64 mask;
 190	__u64 value;
 191	enum input_type type;
 192	enum input_state state;
 193	__u8 rise_time, fall_time;
 194	__u8 rise_timer, fall_timer, high_timer;
 195
 196	union {
 197		struct {	/* valid when type == INPUT_TYPE_STD */
 198			void (*press_fct)(int);
 199			void (*release_fct)(int);
 200			int press_data;
 201			int release_data;
 202		} std;
 203		struct {	/* valid when type == INPUT_TYPE_KBD */
 204			/* strings can be non null-terminated */
 205			char press_str[sizeof(void *) + sizeof(int)];
 206			char repeat_str[sizeof(void *) + sizeof(int)];
 207			char release_str[sizeof(void *) + sizeof(int)];
 208		} kbd;
 209	} u;
 210};
 211
 212static LIST_HEAD(logical_inputs);	/* list of all defined logical inputs */
 213
 214/* physical contacts history
 215 * Physical contacts are a 45 bits string of 9 groups of 5 bits each.
 216 * The 8 lower groups correspond to output bits 0 to 7, and the 9th group
 217 * corresponds to the ground.
 218 * Within each group, bits are stored in the same order as read on the port :
 219 * BAPSE (busy=4, ack=3, paper empty=2, select=1, error=0).
 220 * So, each __u64 is represented like this :
 221 * 0000000000000000000BAPSEBAPSEBAPSEBAPSEBAPSEBAPSEBAPSEBAPSEBAPSE
 222 * <-----unused------><gnd><d07><d06><d05><d04><d03><d02><d01><d00>
 223 */
 224
 225/* what has just been read from the I/O ports */
 226static __u64 phys_read;
 227/* previous phys_read */
 228static __u64 phys_read_prev;
 229/* stabilized phys_read (phys_read|phys_read_prev) */
 230static __u64 phys_curr;
 231/* previous phys_curr */
 232static __u64 phys_prev;
 233/* 0 means that at least one logical signal needs be computed */
 234static char inputs_stable;
 235
 236/* these variables are specific to the keypad */
 237static struct {
 238	bool enabled;
 239} keypad;
 240
 241static char keypad_buffer[KEYPAD_BUFFER];
 242static int keypad_buflen;
 243static int keypad_start;
 244static char keypressed;
 245static wait_queue_head_t keypad_read_wait;
 246
 247/* lcd-specific variables */
 248static struct {
 249	bool enabled;
 250	bool initialized;
 251	bool must_clear;
 252
 253	int height;
 254	int width;
 255	int bwidth;
 256	int hwidth;
 257	int charset;
 258	int proto;
 259	int light_tempo;
 260
 261	/* TODO: use union here? */
 262	struct {
 263		int e;
 264		int rs;
 265		int rw;
 266		int cl;
 267		int da;
 268		int bl;
 269	} pins;
 270
 271	/* contains the LCD config state */
 272	unsigned long int flags;
 273
 274	/* Contains the LCD X and Y offset */
 275	struct {
 276		unsigned long int x;
 277		unsigned long int y;
 278	} addr;
 279
 280	/* Current escape sequence and it's length or -1 if outside */
 281	struct {
 282		char buf[LCD_ESCAPE_LEN + 1];
 283		int len;
 284	} esc_seq;
 285} lcd;
 286
 287/* Needed only for init */
 288static int selected_lcd_type = NOT_SET;
 289
 290/*
 291 * Bit masks to convert LCD signals to parallel port outputs.
 292 * _d_ are values for data port, _c_ are for control port.
 293 * [0] = signal OFF, [1] = signal ON, [2] = mask
 294 */
 295#define BIT_CLR		0
 296#define BIT_SET		1
 297#define BIT_MSK		2
 298#define BIT_STATES	3
 299/*
 300 * one entry for each bit on the LCD
 301 */
 302#define LCD_BIT_E	0
 303#define LCD_BIT_RS	1
 304#define LCD_BIT_RW	2
 305#define LCD_BIT_BL	3
 306#define LCD_BIT_CL	4
 307#define LCD_BIT_DA	5
 308#define LCD_BITS	6
 309
 310/*
 311 * each bit can be either connected to a DATA or CTRL port
 312 */
 313#define LCD_PORT_C	0
 314#define LCD_PORT_D	1
 315#define LCD_PORTS	2
 316
 317static unsigned char lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES];
 318
 319/*
 320 * LCD protocols
 321 */
 322#define LCD_PROTO_PARALLEL      0
 323#define LCD_PROTO_SERIAL        1
 324#define LCD_PROTO_TI_DA8XX_LCD	2
 325
 326/*
 327 * LCD character sets
 328 */
 329#define LCD_CHARSET_NORMAL      0
 330#define LCD_CHARSET_KS0074      1
 331
 332/*
 333 * LCD types
 334 */
 335#define LCD_TYPE_NONE		0
 336#define LCD_TYPE_CUSTOM		1
 337#define LCD_TYPE_OLD		2
 338#define LCD_TYPE_KS0074		3
 339#define LCD_TYPE_HANTRONIX	4
 340#define LCD_TYPE_NEXCOM		5
 341
 342/*
 343 * keypad types
 344 */
 345#define KEYPAD_TYPE_NONE	0
 346#define KEYPAD_TYPE_OLD		1
 347#define KEYPAD_TYPE_NEW		2
 348#define KEYPAD_TYPE_NEXCOM	3
 349
 350/*
 351 * panel profiles
 352 */
 353#define PANEL_PROFILE_CUSTOM	0
 354#define PANEL_PROFILE_OLD	1
 355#define PANEL_PROFILE_NEW	2
 356#define PANEL_PROFILE_HANTRONIX	3
 357#define PANEL_PROFILE_NEXCOM	4
 358#define PANEL_PROFILE_LARGE	5
 359
 360/*
 361 * Construct custom config from the kernel's configuration
 362 */
 363#define DEFAULT_PARPORT         0
 364#define DEFAULT_PROFILE         PANEL_PROFILE_LARGE
 365#define DEFAULT_KEYPAD_TYPE     KEYPAD_TYPE_OLD
 366#define DEFAULT_LCD_TYPE        LCD_TYPE_OLD
 367#define DEFAULT_LCD_HEIGHT      2
 368#define DEFAULT_LCD_WIDTH       40
 369#define DEFAULT_LCD_BWIDTH      40
 370#define DEFAULT_LCD_HWIDTH      64
 371#define DEFAULT_LCD_CHARSET     LCD_CHARSET_NORMAL
 372#define DEFAULT_LCD_PROTO       LCD_PROTO_PARALLEL
 373
 374#define DEFAULT_LCD_PIN_E       PIN_AUTOLF
 375#define DEFAULT_LCD_PIN_RS      PIN_SELECP
 376#define DEFAULT_LCD_PIN_RW      PIN_INITP
 377#define DEFAULT_LCD_PIN_SCL     PIN_STROBE
 378#define DEFAULT_LCD_PIN_SDA     PIN_D0
 379#define DEFAULT_LCD_PIN_BL      PIN_NOT_SET
 380
 381#ifdef CONFIG_PANEL_PARPORT
 382#undef DEFAULT_PARPORT
 383#define DEFAULT_PARPORT CONFIG_PANEL_PARPORT
 384#endif
 385
 386#ifdef CONFIG_PANEL_PROFILE
 387#undef DEFAULT_PROFILE
 388#define DEFAULT_PROFILE CONFIG_PANEL_PROFILE
 389#endif
 390
 391#if DEFAULT_PROFILE == 0	/* custom */
 392#ifdef CONFIG_PANEL_KEYPAD
 393#undef DEFAULT_KEYPAD_TYPE
 394#define DEFAULT_KEYPAD_TYPE CONFIG_PANEL_KEYPAD
 395#endif
 396
 397#ifdef CONFIG_PANEL_LCD
 398#undef DEFAULT_LCD_TYPE
 399#define DEFAULT_LCD_TYPE CONFIG_PANEL_LCD
 400#endif
 401
 402#ifdef CONFIG_PANEL_LCD_HEIGHT
 403#undef DEFAULT_LCD_HEIGHT
 404#define DEFAULT_LCD_HEIGHT CONFIG_PANEL_LCD_HEIGHT
 405#endif
 406
 407#ifdef CONFIG_PANEL_LCD_WIDTH
 408#undef DEFAULT_LCD_WIDTH
 409#define DEFAULT_LCD_WIDTH CONFIG_PANEL_LCD_WIDTH
 410#endif
 411
 412#ifdef CONFIG_PANEL_LCD_BWIDTH
 413#undef DEFAULT_LCD_BWIDTH
 414#define DEFAULT_LCD_BWIDTH CONFIG_PANEL_LCD_BWIDTH
 415#endif
 416
 417#ifdef CONFIG_PANEL_LCD_HWIDTH
 418#undef DEFAULT_LCD_HWIDTH
 419#define DEFAULT_LCD_HWIDTH CONFIG_PANEL_LCD_HWIDTH
 420#endif
 421
 422#ifdef CONFIG_PANEL_LCD_CHARSET
 423#undef DEFAULT_LCD_CHARSET
 424#define DEFAULT_LCD_CHARSET CONFIG_PANEL_LCD_CHARSET
 425#endif
 426
 427#ifdef CONFIG_PANEL_LCD_PROTO
 428#undef DEFAULT_LCD_PROTO
 429#define DEFAULT_LCD_PROTO CONFIG_PANEL_LCD_PROTO
 430#endif
 431
 432#ifdef CONFIG_PANEL_LCD_PIN_E
 433#undef DEFAULT_LCD_PIN_E
 434#define DEFAULT_LCD_PIN_E CONFIG_PANEL_LCD_PIN_E
 435#endif
 436
 437#ifdef CONFIG_PANEL_LCD_PIN_RS
 438#undef DEFAULT_LCD_PIN_RS
 439#define DEFAULT_LCD_PIN_RS CONFIG_PANEL_LCD_PIN_RS
 440#endif
 441
 442#ifdef CONFIG_PANEL_LCD_PIN_RW
 443#undef DEFAULT_LCD_PIN_RW
 444#define DEFAULT_LCD_PIN_RW CONFIG_PANEL_LCD_PIN_RW
 445#endif
 446
 447#ifdef CONFIG_PANEL_LCD_PIN_SCL
 448#undef DEFAULT_LCD_PIN_SCL
 449#define DEFAULT_LCD_PIN_SCL CONFIG_PANEL_LCD_PIN_SCL
 450#endif
 451
 452#ifdef CONFIG_PANEL_LCD_PIN_SDA
 453#undef DEFAULT_LCD_PIN_SDA
 454#define DEFAULT_LCD_PIN_SDA CONFIG_PANEL_LCD_PIN_SDA
 455#endif
 456
 457#ifdef CONFIG_PANEL_LCD_PIN_BL
 458#undef DEFAULT_LCD_PIN_BL
 459#define DEFAULT_LCD_PIN_BL CONFIG_PANEL_LCD_PIN_BL
 460#endif
 461
 462#endif /* DEFAULT_PROFILE == 0 */
 463
 464/* global variables */
 465
 466/* Device single-open policy control */
 467static atomic_t lcd_available = ATOMIC_INIT(1);
 468static atomic_t keypad_available = ATOMIC_INIT(1);
 469
 470static struct pardevice *pprt;
 471
 472static int keypad_initialized;
 473
 474static void (*lcd_write_cmd)(int);
 475static void (*lcd_write_data)(int);
 476static void (*lcd_clear_fast)(void);
 477
 478static DEFINE_SPINLOCK(pprt_lock);
 479static struct timer_list scan_timer;
 480
 481MODULE_DESCRIPTION("Generic parallel port LCD/Keypad driver");
 482
 483static int parport = DEFAULT_PARPORT;
 484module_param(parport, int, 0000);
 485MODULE_PARM_DESC(parport, "Parallel port index (0=lpt1, 1=lpt2, ...)");
 486
 487static int profile = DEFAULT_PROFILE;
 488module_param(profile, int, 0000);
 489MODULE_PARM_DESC(profile,
 490		 "1=16x2 old kp; 2=serial 16x2, new kp; 3=16x2 hantronix; "
 491		 "4=16x2 nexcom; default=40x2, old kp");
 492
 493static int keypad_type = NOT_SET;
 494module_param(keypad_type, int, 0000);
 495MODULE_PARM_DESC(keypad_type,
 496		 "Keypad type: 0=none, 1=old 6 keys, 2=new 6+1 keys, 3=nexcom 4 keys");
 497
 498static int lcd_type = NOT_SET;
 499module_param(lcd_type, int, 0000);
 500MODULE_PARM_DESC(lcd_type,
 501		 "LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 4=hantronix, 5=nexcom");
 502
 503static int lcd_height = NOT_SET;
 504module_param(lcd_height, int, 0000);
 505MODULE_PARM_DESC(lcd_height, "Number of lines on the LCD");
 506
 507static int lcd_width = NOT_SET;
 508module_param(lcd_width, int, 0000);
 509MODULE_PARM_DESC(lcd_width, "Number of columns on the LCD");
 510
 511static int lcd_bwidth = NOT_SET;	/* internal buffer width (usually 40) */
 512module_param(lcd_bwidth, int, 0000);
 513MODULE_PARM_DESC(lcd_bwidth, "Internal LCD line width (40)");
 514
 515static int lcd_hwidth = NOT_SET;	/* hardware buffer width (usually 64) */
 516module_param(lcd_hwidth, int, 0000);
 517MODULE_PARM_DESC(lcd_hwidth, "LCD line hardware address (64)");
 518
 519static int lcd_charset = NOT_SET;
 520module_param(lcd_charset, int, 0000);
 521MODULE_PARM_DESC(lcd_charset, "LCD character set: 0=standard, 1=KS0074");
 522
 523static int lcd_proto = NOT_SET;
 524module_param(lcd_proto, int, 0000);
 525MODULE_PARM_DESC(lcd_proto,
 526		 "LCD communication: 0=parallel (//), 1=serial, 2=TI LCD Interface");
 527
 528/*
 529 * These are the parallel port pins the LCD control signals are connected to.
 530 * Set this to 0 if the signal is not used. Set it to its opposite value
 531 * (negative) if the signal is negated. -MAXINT is used to indicate that the
 532 * pin has not been explicitly specified.
 533 *
 534 * WARNING! no check will be performed about collisions with keypad !
 535 */
 536
 537static int lcd_e_pin  = PIN_NOT_SET;
 538module_param(lcd_e_pin, int, 0000);
 539MODULE_PARM_DESC(lcd_e_pin,
 540		 "# of the // port pin connected to LCD 'E' signal, with polarity (-17..17)");
 541
 542static int lcd_rs_pin = PIN_NOT_SET;
 543module_param(lcd_rs_pin, int, 0000);
 544MODULE_PARM_DESC(lcd_rs_pin,
 545		 "# of the // port pin connected to LCD 'RS' signal, with polarity (-17..17)");
 546
 547static int lcd_rw_pin = PIN_NOT_SET;
 548module_param(lcd_rw_pin, int, 0000);
 549MODULE_PARM_DESC(lcd_rw_pin,
 550		 "# of the // port pin connected to LCD 'RW' signal, with polarity (-17..17)");
 551
 552static int lcd_cl_pin = PIN_NOT_SET;
 553module_param(lcd_cl_pin, int, 0000);
 554MODULE_PARM_DESC(lcd_cl_pin,
 555		 "# of the // port pin connected to serial LCD 'SCL' signal, with polarity (-17..17)");
 556
 557static int lcd_da_pin = PIN_NOT_SET;
 558module_param(lcd_da_pin, int, 0000);
 559MODULE_PARM_DESC(lcd_da_pin,
 560		 "# of the // port pin connected to serial LCD 'SDA' signal, with polarity (-17..17)");
 561
 562static int lcd_bl_pin = PIN_NOT_SET;
 563module_param(lcd_bl_pin, int, 0000);
 564MODULE_PARM_DESC(lcd_bl_pin,
 565		 "# of the // port pin connected to LCD backlight, with polarity (-17..17)");
 566
 567/* Deprecated module parameters - consider not using them anymore */
 568
 569static int lcd_enabled = NOT_SET;
 570module_param(lcd_enabled, int, 0000);
 571MODULE_PARM_DESC(lcd_enabled, "Deprecated option, use lcd_type instead");
 572
 573static int keypad_enabled = NOT_SET;
 574module_param(keypad_enabled, int, 0000);
 575MODULE_PARM_DESC(keypad_enabled, "Deprecated option, use keypad_type instead");
 576
 577static const unsigned char *lcd_char_conv;
 578
 579/* for some LCD drivers (ks0074) we need a charset conversion table. */
 580static const unsigned char lcd_char_conv_ks0074[256] = {
 581	/*          0|8   1|9   2|A   3|B   4|C   5|D   6|E   7|F */
 582	/* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 583	/* 0x08 */ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
 584	/* 0x10 */ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
 585	/* 0x18 */ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
 586	/* 0x20 */ 0x20, 0x21, 0x22, 0x23, 0xa2, 0x25, 0x26, 0x27,
 587	/* 0x28 */ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
 588	/* 0x30 */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
 589	/* 0x38 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
 590	/* 0x40 */ 0xa0, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
 591	/* 0x48 */ 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
 592	/* 0x50 */ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
 593	/* 0x58 */ 0x58, 0x59, 0x5a, 0xfa, 0xfb, 0xfc, 0x1d, 0xc4,
 594	/* 0x60 */ 0x96, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
 595	/* 0x68 */ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
 596	/* 0x70 */ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
 597	/* 0x78 */ 0x78, 0x79, 0x7a, 0xfd, 0xfe, 0xff, 0xce, 0x20,
 598	/* 0x80 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
 599	/* 0x88 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
 600	/* 0x90 */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
 601	/* 0x98 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
 602	/* 0xA0 */ 0x20, 0x40, 0xb1, 0xa1, 0x24, 0xa3, 0xfe, 0x5f,
 603	/* 0xA8 */ 0x22, 0xc8, 0x61, 0x14, 0x97, 0x2d, 0xad, 0x96,
 604	/* 0xB0 */ 0x80, 0x8c, 0x82, 0x83, 0x27, 0x8f, 0x86, 0xdd,
 605	/* 0xB8 */ 0x2c, 0x81, 0x6f, 0x15, 0x8b, 0x8a, 0x84, 0x60,
 606	/* 0xC0 */ 0xe2, 0xe2, 0xe2, 0x5b, 0x5b, 0xae, 0xbc, 0xa9,
 607	/* 0xC8 */ 0xc5, 0xbf, 0xc6, 0xf1, 0xe3, 0xe3, 0xe3, 0xe3,
 608	/* 0xD0 */ 0x44, 0x5d, 0xa8, 0xe4, 0xec, 0xec, 0x5c, 0x78,
 609	/* 0xD8 */ 0xab, 0xa6, 0xe5, 0x5e, 0x5e, 0xe6, 0xaa, 0xbe,
 610	/* 0xE0 */ 0x7f, 0xe7, 0xaf, 0x7b, 0x7b, 0xaf, 0xbd, 0xc8,
 611	/* 0xE8 */ 0xa4, 0xa5, 0xc7, 0xf6, 0xa7, 0xe8, 0x69, 0x69,
 612	/* 0xF0 */ 0xed, 0x7d, 0xa8, 0xe4, 0xec, 0x5c, 0x5c, 0x25,
 613	/* 0xF8 */ 0xac, 0xa6, 0xea, 0xef, 0x7e, 0xeb, 0xb2, 0x79,
 614};
 615
 616static const char old_keypad_profile[][4][9] = {
 617	{"S0", "Left\n", "Left\n", ""},
 618	{"S1", "Down\n", "Down\n", ""},
 619	{"S2", "Up\n", "Up\n", ""},
 620	{"S3", "Right\n", "Right\n", ""},
 621	{"S4", "Esc\n", "Esc\n", ""},
 622	{"S5", "Ret\n", "Ret\n", ""},
 623	{"", "", "", ""}
 624};
 625
 626/* signals, press, repeat, release */
 627static const char new_keypad_profile[][4][9] = {
 628	{"S0", "Left\n", "Left\n", ""},
 629	{"S1", "Down\n", "Down\n", ""},
 630	{"S2", "Up\n", "Up\n", ""},
 631	{"S3", "Right\n", "Right\n", ""},
 632	{"S4s5", "", "Esc\n", "Esc\n"},
 633	{"s4S5", "", "Ret\n", "Ret\n"},
 634	{"S4S5", "Help\n", "", ""},
 635	/* add new signals above this line */
 636	{"", "", "", ""}
 637};
 638
 639/* signals, press, repeat, release */
 640static const char nexcom_keypad_profile[][4][9] = {
 641	{"a-p-e-", "Down\n", "Down\n", ""},
 642	{"a-p-E-", "Ret\n", "Ret\n", ""},
 643	{"a-P-E-", "Esc\n", "Esc\n", ""},
 644	{"a-P-e-", "Up\n", "Up\n", ""},
 645	/* add new signals above this line */
 646	{"", "", "", ""}
 647};
 648
 649static const char (*keypad_profile)[4][9] = old_keypad_profile;
 650
 651static DECLARE_BITMAP(bits, LCD_BITS);
 652
 653static void lcd_get_bits(unsigned int port, int *val)
 654{
 655	unsigned int bit, state;
 656
 657	for (bit = 0; bit < LCD_BITS; bit++) {
 658		state = test_bit(bit, bits) ? BIT_SET : BIT_CLR;
 659		*val &= lcd_bits[port][bit][BIT_MSK];
 660		*val |= lcd_bits[port][bit][state];
 661	}
 662}
 663
 664static void init_scan_timer(void);
 665
 666/* sets data port bits according to current signals values */
 667static int set_data_bits(void)
 668{
 669	int val;
 670
 671	val = r_dtr(pprt);
 672	lcd_get_bits(LCD_PORT_D, &val);
 673	w_dtr(pprt, val);
 674	return val;
 675}
 676
 677/* sets ctrl port bits according to current signals values */
 678static int set_ctrl_bits(void)
 679{
 680	int val;
 681
 682	val = r_ctr(pprt);
 683	lcd_get_bits(LCD_PORT_C, &val);
 684	w_ctr(pprt, val);
 685	return val;
 686}
 687
 688/* sets ctrl & data port bits according to current signals values */
 689static void panel_set_bits(void)
 690{
 691	set_data_bits();
 692	set_ctrl_bits();
 693}
 694
 695/*
 696 * Converts a parallel port pin (from -25 to 25) to data and control ports
 697 * masks, and data and control port bits. The signal will be considered
 698 * unconnected if it's on pin 0 or an invalid pin (<-25 or >25).
 699 *
 700 * Result will be used this way :
 701 *   out(dport, in(dport) & d_val[2] | d_val[signal_state])
 702 *   out(cport, in(cport) & c_val[2] | c_val[signal_state])
 703 */
 704static void pin_to_bits(int pin, unsigned char *d_val, unsigned char *c_val)
 705{
 706	int d_bit, c_bit, inv;
 707
 708	d_val[0] = 0;
 709	c_val[0] = 0;
 710	d_val[1] = 0;
 711	c_val[1] = 0;
 712	d_val[2] = 0xFF;
 713	c_val[2] = 0xFF;
 714
 715	if (pin == 0)
 716		return;
 717
 718	inv = (pin < 0);
 719	if (inv)
 720		pin = -pin;
 721
 722	d_bit = 0;
 723	c_bit = 0;
 724
 725	switch (pin) {
 726	case PIN_STROBE:	/* strobe, inverted */
 727		c_bit = PNL_PSTROBE;
 728		inv = !inv;
 729		break;
 730	case PIN_D0...PIN_D7:	/* D0 - D7 = 2 - 9 */
 731		d_bit = 1 << (pin - 2);
 732		break;
 733	case PIN_AUTOLF:	/* autofeed, inverted */
 734		c_bit = PNL_PAUTOLF;
 735		inv = !inv;
 736		break;
 737	case PIN_INITP:		/* init, direct */
 738		c_bit = PNL_PINITP;
 739		break;
 740	case PIN_SELECP:	/* select_in, inverted */
 741		c_bit = PNL_PSELECP;
 742		inv = !inv;
 743		break;
 744	default:		/* unknown pin, ignore */
 745		break;
 746	}
 747
 748	if (c_bit) {
 749		c_val[2] &= ~c_bit;
 750		c_val[!inv] = c_bit;
 751	} else if (d_bit) {
 752		d_val[2] &= ~d_bit;
 753		d_val[!inv] = d_bit;
 754	}
 755}
 756
 757/* sleeps that many milliseconds with a reschedule */
 758static void long_sleep(int ms)
 759{
 760	if (in_interrupt())
 761		mdelay(ms);
 762	else
 763		schedule_timeout_interruptible(msecs_to_jiffies(ms));
 764}
 765
 766/*
 767 * send a serial byte to the LCD panel. The caller is responsible for locking
 768 * if needed.
 769 */
 770static void lcd_send_serial(int byte)
 771{
 772	int bit;
 773
 774	/*
 775	 * the data bit is set on D0, and the clock on STROBE.
 776	 * LCD reads D0 on STROBE's rising edge.
 777	 */
 778	for (bit = 0; bit < 8; bit++) {
 779		clear_bit(LCD_BIT_CL, bits);	/* CLK low */
 780		panel_set_bits();
 781		if (byte & 1) {
 782			set_bit(LCD_BIT_DA, bits);
 783		} else {
 784			clear_bit(LCD_BIT_DA, bits);
 785		}
 786
 787		panel_set_bits();
 788		udelay(2);  /* maintain the data during 2 us before CLK up */
 789		set_bit(LCD_BIT_CL, bits);	/* CLK high */
 790		panel_set_bits();
 791		udelay(1);  /* maintain the strobe during 1 us */
 792		byte >>= 1;
 793	}
 794}
 795
 796/* turn the backlight on or off */
 797static void lcd_backlight(int on)
 798{
 799	if (lcd.pins.bl == PIN_NONE)
 800		return;
 801
 802	/* The backlight is activated by setting the AUTOFEED line to +5V  */
 803	spin_lock_irq(&pprt_lock);
 804	if (on)
 805		set_bit(LCD_BIT_BL, bits);
 806	else
 807		clear_bit(LCD_BIT_BL, bits);
 808	panel_set_bits();
 809	spin_unlock_irq(&pprt_lock);
 810}
 811
 812/* send a command to the LCD panel in serial mode */
 813static void lcd_write_cmd_s(int cmd)
 814{
 815	spin_lock_irq(&pprt_lock);
 816	lcd_send_serial(0x1F);	/* R/W=W, RS=0 */
 817	lcd_send_serial(cmd & 0x0F);
 818	lcd_send_serial((cmd >> 4) & 0x0F);
 819	udelay(40);		/* the shortest command takes at least 40 us */
 820	spin_unlock_irq(&pprt_lock);
 821}
 822
 823/* send data to the LCD panel in serial mode */
 824static void lcd_write_data_s(int data)
 825{
 826	spin_lock_irq(&pprt_lock);
 827	lcd_send_serial(0x5F);	/* R/W=W, RS=1 */
 828	lcd_send_serial(data & 0x0F);
 829	lcd_send_serial((data >> 4) & 0x0F);
 830	udelay(40);		/* the shortest data takes at least 40 us */
 831	spin_unlock_irq(&pprt_lock);
 832}
 833
 834/* send a command to the LCD panel in 8 bits parallel mode */
 835static void lcd_write_cmd_p8(int cmd)
 836{
 837	spin_lock_irq(&pprt_lock);
 838	/* present the data to the data port */
 839	w_dtr(pprt, cmd);
 840	udelay(20);	/* maintain the data during 20 us before the strobe */
 841
 842	set_bit(LCD_BIT_E, bits);
 843	clear_bit(LCD_BIT_RS, bits);
 844	clear_bit(LCD_BIT_RW, bits);
 845	set_ctrl_bits();
 846
 847	udelay(40);	/* maintain the strobe during 40 us */
 848
 849	clear_bit(LCD_BIT_E, bits);
 850	set_ctrl_bits();
 851
 852	udelay(120);	/* the shortest command takes at least 120 us */
 853	spin_unlock_irq(&pprt_lock);
 854}
 855
 856/* send data to the LCD panel in 8 bits parallel mode */
 857static void lcd_write_data_p8(int data)
 858{
 859	spin_lock_irq(&pprt_lock);
 860	/* present the data to the data port */
 861	w_dtr(pprt, data);
 862	udelay(20);	/* maintain the data during 20 us before the strobe */
 863
 864	set_bit(LCD_BIT_E, bits);
 865	set_bit(LCD_BIT_RS, bits);
 866	clear_bit(LCD_BIT_RW, bits);
 867	set_ctrl_bits();
 868
 869	udelay(40);	/* maintain the strobe during 40 us */
 870
 871	clear_bit(LCD_BIT_E, bits);
 872	set_ctrl_bits();
 873
 874	udelay(45);	/* the shortest data takes at least 45 us */
 875	spin_unlock_irq(&pprt_lock);
 876}
 877
 878/* send a command to the TI LCD panel */
 879static void lcd_write_cmd_tilcd(int cmd)
 880{
 881	spin_lock_irq(&pprt_lock);
 882	/* present the data to the control port */
 883	w_ctr(pprt, cmd);
 884	udelay(60);
 885	spin_unlock_irq(&pprt_lock);
 886}
 887
 888/* send data to the TI LCD panel */
 889static void lcd_write_data_tilcd(int data)
 890{
 891	spin_lock_irq(&pprt_lock);
 892	/* present the data to the data port */
 893	w_dtr(pprt, data);
 894	udelay(60);
 895	spin_unlock_irq(&pprt_lock);
 896}
 897
 898static void lcd_gotoxy(void)
 899{
 900	lcd_write_cmd(LCD_CMD_SET_DDRAM_ADDR
 901		      | (lcd.addr.y ? lcd.hwidth : 0)
 902		      /*
 903		       * we force the cursor to stay at the end of the
 904		       * line if it wants to go farther
 905		       */
 906		      | ((lcd.addr.x < lcd.bwidth) ? lcd.addr.x &
 907			 (lcd.hwidth - 1) : lcd.bwidth - 1));
 908}
 909
 910static void lcd_print(char c)
 911{
 912	if (lcd.addr.x < lcd.bwidth) {
 913		if (lcd_char_conv)
 914			c = lcd_char_conv[(unsigned char)c];
 915		lcd_write_data(c);
 916		lcd.addr.x++;
 917	}
 918	/* prevents the cursor from wrapping onto the next line */
 919	if (lcd.addr.x == lcd.bwidth)
 920		lcd_gotoxy();
 921}
 922
 923/* fills the display with spaces and resets X/Y */
 924static void lcd_clear_fast_s(void)
 925{
 926	int pos;
 927
 928	lcd.addr.x = 0;
 929	lcd.addr.y = 0;
 930	lcd_gotoxy();
 931
 932	spin_lock_irq(&pprt_lock);
 933	for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) {
 934		lcd_send_serial(0x5F);	/* R/W=W, RS=1 */
 935		lcd_send_serial(' ' & 0x0F);
 936		lcd_send_serial((' ' >> 4) & 0x0F);
 937		/* the shortest data takes at least 40 us */
 938		udelay(40);
 939	}
 940	spin_unlock_irq(&pprt_lock);
 941
 942	lcd.addr.x = 0;
 943	lcd.addr.y = 0;
 944	lcd_gotoxy();
 945}
 946
 947/* fills the display with spaces and resets X/Y */
 948static void lcd_clear_fast_p8(void)
 949{
 950	int pos;
 951
 952	lcd.addr.x = 0;
 953	lcd.addr.y = 0;
 954	lcd_gotoxy();
 955
 956	spin_lock_irq(&pprt_lock);
 957	for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) {
 958		/* present the data to the data port */
 959		w_dtr(pprt, ' ');
 960
 961		/* maintain the data during 20 us before the strobe */
 962		udelay(20);
 963
 964		set_bit(LCD_BIT_E, bits);
 965		set_bit(LCD_BIT_RS, bits);
 966		clear_bit(LCD_BIT_RW, bits);
 967		set_ctrl_bits();
 968
 969		/* maintain the strobe during 40 us */
 970		udelay(40);
 971
 972		clear_bit(LCD_BIT_E, bits);
 973		set_ctrl_bits();
 974
 975		/* the shortest data takes at least 45 us */
 976		udelay(45);
 977	}
 978	spin_unlock_irq(&pprt_lock);
 979
 980	lcd.addr.x = 0;
 981	lcd.addr.y = 0;
 982	lcd_gotoxy();
 983}
 984
 985/* fills the display with spaces and resets X/Y */
 986static void lcd_clear_fast_tilcd(void)
 987{
 988	int pos;
 989
 990	lcd.addr.x = 0;
 991	lcd.addr.y = 0;
 992	lcd_gotoxy();
 993
 994	spin_lock_irq(&pprt_lock);
 995	for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) {
 996		/* present the data to the data port */
 997		w_dtr(pprt, ' ');
 998		udelay(60);
 999	}
1000
1001	spin_unlock_irq(&pprt_lock);
1002
1003	lcd.addr.x = 0;
1004	lcd.addr.y = 0;
1005	lcd_gotoxy();
1006}
1007
1008/* clears the display and resets X/Y */
1009static void lcd_clear_display(void)
1010{
1011	lcd_write_cmd(LCD_CMD_DISPLAY_CLEAR);
1012	lcd.addr.x = 0;
1013	lcd.addr.y = 0;
1014	/* we must wait a few milliseconds (15) */
1015	long_sleep(15);
1016}
1017
1018static void lcd_init_display(void)
1019{
1020	lcd.flags = ((lcd.height > 1) ? LCD_FLAG_N : 0)
1021	    | LCD_FLAG_D | LCD_FLAG_C | LCD_FLAG_B;
1022
1023	long_sleep(20);		/* wait 20 ms after power-up for the paranoid */
1024
1025	/* 8bits, 1 line, small fonts; let's do it 3 times */
1026	lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS);
1027	long_sleep(10);
1028	lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS);
1029	long_sleep(10);
1030	lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS);
1031	long_sleep(10);
1032
1033	/* set font height and lines number */
1034	lcd_write_cmd(LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS
1035		      | ((lcd.flags & LCD_FLAG_F) ? LCD_CMD_FONT_5X10_DOTS : 0)
1036		      | ((lcd.flags & LCD_FLAG_N) ? LCD_CMD_TWO_LINES : 0)
1037	    );
1038	long_sleep(10);
1039
1040	/* display off, cursor off, blink off */
1041	lcd_write_cmd(LCD_CMD_DISPLAY_CTRL);
1042	long_sleep(10);
1043
1044	lcd_write_cmd(LCD_CMD_DISPLAY_CTRL	/* set display mode */
1045		      | ((lcd.flags & LCD_FLAG_D) ? LCD_CMD_DISPLAY_ON : 0)
1046		      | ((lcd.flags & LCD_FLAG_C) ? LCD_CMD_CURSOR_ON : 0)
1047		      | ((lcd.flags & LCD_FLAG_B) ? LCD_CMD_BLINK_ON : 0)
1048	    );
1049
1050	lcd_backlight((lcd.flags & LCD_FLAG_L) ? 1 : 0);
1051
1052	long_sleep(10);
1053
1054	/* entry mode set : increment, cursor shifting */
1055	lcd_write_cmd(LCD_CMD_ENTRY_MODE | LCD_CMD_CURSOR_INC);
1056
1057	lcd_clear_display();
1058}
1059
1060/*
1061 * These are the file operation function for user access to /dev/lcd
1062 * This function can also be called from inside the kernel, by
1063 * setting file and ppos to NULL.
1064 *
1065 */
1066
1067static inline int handle_lcd_special_code(void)
1068{
1069	/* LCD special codes */
1070
1071	int processed = 0;
1072
1073	char *esc = lcd.esc_seq.buf + 2;
1074	int oldflags = lcd.flags;
1075
1076	/* check for display mode flags */
1077	switch (*esc) {
1078	case 'D':	/* Display ON */
1079		lcd.flags |= LCD_FLAG_D;
1080		processed = 1;
1081		break;
1082	case 'd':	/* Display OFF */
1083		lcd.flags &= ~LCD_FLAG_D;
1084		processed = 1;
1085		break;
1086	case 'C':	/* Cursor ON */
1087		lcd.flags |= LCD_FLAG_C;
1088		processed = 1;
1089		break;
1090	case 'c':	/* Cursor OFF */
1091		lcd.flags &= ~LCD_FLAG_C;
1092		processed = 1;
1093		break;
1094	case 'B':	/* Blink ON */
1095		lcd.flags |= LCD_FLAG_B;
1096		processed = 1;
1097		break;
1098	case 'b':	/* Blink OFF */
1099		lcd.flags &= ~LCD_FLAG_B;
1100		processed = 1;
1101		break;
1102	case '+':	/* Back light ON */
1103		lcd.flags |= LCD_FLAG_L;
1104		processed = 1;
1105		break;
1106	case '-':	/* Back light OFF */
1107		lcd.flags &= ~LCD_FLAG_L;
1108		processed = 1;
1109		break;
1110	case '*':
1111		/* flash back light using the keypad timer */
1112		if (scan_timer.function) {
1113			if (lcd.light_tempo == 0 &&
1114			    ((lcd.flags & LCD_FLAG_L) == 0))
1115				lcd_backlight(1);
1116			lcd.light_tempo = FLASH_LIGHT_TEMPO;
1117		}
1118		processed = 1;
1119		break;
1120	case 'f':	/* Small Font */
1121		lcd.flags &= ~LCD_FLAG_F;
1122		processed = 1;
1123		break;
1124	case 'F':	/* Large Font */
1125		lcd.flags |= LCD_FLAG_F;
1126		processed = 1;
1127		break;
1128	case 'n':	/* One Line */
1129		lcd.flags &= ~LCD_FLAG_N;
1130		processed = 1;
1131		break;
1132	case 'N':	/* Two Lines */
1133		lcd.flags |= LCD_FLAG_N;
1134		break;
1135	case 'l':	/* Shift Cursor Left */
1136		if (lcd.addr.x > 0) {
1137			/* back one char if not at end of line */
1138			if (lcd.addr.x < lcd.bwidth)
1139				lcd_write_cmd(LCD_CMD_SHIFT);
1140			lcd.addr.x--;
1141		}
1142		processed = 1;
1143		break;
1144	case 'r':	/* shift cursor right */
1145		if (lcd.addr.x < lcd.width) {
1146			/* allow the cursor to pass the end of the line */
1147			if (lcd.addr.x < (lcd.bwidth - 1))
1148				lcd_write_cmd(LCD_CMD_SHIFT |
1149						LCD_CMD_SHIFT_RIGHT);
1150			lcd.addr.x++;
1151		}
1152		processed = 1;
1153		break;
1154	case 'L':	/* shift display left */
1155		lcd_write_cmd(LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT);
1156		processed = 1;
1157		break;
1158	case 'R':	/* shift display right */
1159		lcd_write_cmd(LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT |
1160				LCD_CMD_SHIFT_RIGHT);
1161		processed = 1;
1162		break;
1163	case 'k': {	/* kill end of line */
1164		int x;
1165
1166		for (x = lcd.addr.x; x < lcd.bwidth; x++)
1167			lcd_write_data(' ');
1168
1169		/* restore cursor position */
1170		lcd_gotoxy();
1171		processed = 1;
1172		break;
1173	}
1174	case 'I':	/* reinitialize display */
1175		lcd_init_display();
1176		processed = 1;
1177		break;
1178	case 'G': {
1179		/* Generator : LGcxxxxx...xx; must have <c> between '0'
1180		 * and '7', representing the numerical ASCII code of the
1181		 * redefined character, and <xx...xx> a sequence of 16
1182		 * hex digits representing 8 bytes for each character.
1183		 * Most LCDs will only use 5 lower bits of the 7 first
1184		 * bytes.
1185		 */
1186
1187		unsigned char cgbytes[8];
1188		unsigned char cgaddr;
1189		int cgoffset;
1190		int shift;
1191		char value;
1192		int addr;
1193
1194		if (!strchr(esc, ';'))
1195			break;
1196
1197		esc++;
1198
1199		cgaddr = *(esc++) - '0';
1200		if (cgaddr > 7) {
1201			processed = 1;
1202			break;
1203		}
1204
1205		cgoffset = 0;
1206		shift = 0;
1207		value = 0;
1208		while (*esc && cgoffset < 8) {
1209			shift ^= 4;
1210			if (*esc >= '0' && *esc <= '9') {
1211				value |= (*esc - '0') << shift;
1212			} else if (*esc >= 'A' && *esc <= 'Z') {
1213				value |= (*esc - 'A' + 10) << shift;
1214			} else if (*esc >= 'a' && *esc <= 'z') {
1215				value |= (*esc - 'a' + 10) << shift;
1216			} else {
1217				esc++;
1218				continue;
1219			}
1220
1221			if (shift == 0) {
1222				cgbytes[cgoffset++] = value;
1223				value = 0;
1224			}
1225
1226			esc++;
1227		}
1228
1229		lcd_write_cmd(LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8));
1230		for (addr = 0; addr < cgoffset; addr++)
1231			lcd_write_data(cgbytes[addr]);
1232
1233		/* ensures that we stop writing to CGRAM */
1234		lcd_gotoxy();
1235		processed = 1;
1236		break;
1237	}
1238	case 'x':	/* gotoxy : LxXXX[yYYY]; */
1239	case 'y':	/* gotoxy : LyYYY[xXXX]; */
1240		if (!strchr(esc, ';'))
1241			break;
1242
1243		while (*esc) {
1244			if (*esc == 'x') {
1245				esc++;
1246				if (kstrtoul(esc, 10, &lcd.addr.x) < 0)
1247					break;
1248			} else if (*esc == 'y') {
1249				esc++;
1250				if (kstrtoul(esc, 10, &lcd.addr.y) < 0)
1251					break;
1252			} else {
1253				break;
1254			}
1255		}
1256
1257		lcd_gotoxy();
1258		processed = 1;
1259		break;
1260	}
1261
1262	/* TODO: This indent party here got ugly, clean it! */
1263	/* Check whether one flag was changed */
1264	if (oldflags != lcd.flags) {
1265		/* check whether one of B,C,D flags were changed */
1266		if ((oldflags ^ lcd.flags) &
1267		    (LCD_FLAG_B | LCD_FLAG_C | LCD_FLAG_D))
1268			/* set display mode */
1269			lcd_write_cmd(LCD_CMD_DISPLAY_CTRL
1270				      | ((lcd.flags & LCD_FLAG_D)
1271						      ? LCD_CMD_DISPLAY_ON : 0)
1272				      | ((lcd.flags & LCD_FLAG_C)
1273						      ? LCD_CMD_CURSOR_ON : 0)
1274				      | ((lcd.flags & LCD_FLAG_B)
1275						      ? LCD_CMD_BLINK_ON : 0));
1276		/* check whether one of F,N flags was changed */
1277		else if ((oldflags ^ lcd.flags) & (LCD_FLAG_F | LCD_FLAG_N))
1278			lcd_write_cmd(LCD_CMD_FUNCTION_SET
1279				      | LCD_CMD_DATA_LEN_8BITS
1280				      | ((lcd.flags & LCD_FLAG_F)
1281						      ? LCD_CMD_TWO_LINES : 0)
1282				      | ((lcd.flags & LCD_FLAG_N)
1283						      ? LCD_CMD_FONT_5X10_DOTS
1284								      : 0));
1285		/* check whether L flag was changed */
1286		else if ((oldflags ^ lcd.flags) & (LCD_FLAG_L)) {
1287			if (lcd.flags & (LCD_FLAG_L))
1288				lcd_backlight(1);
1289			else if (lcd.light_tempo == 0)
1290				/*
1291				 * switch off the light only when the tempo
1292				 * lighting is gone
1293				 */
1294				lcd_backlight(0);
1295		}
1296	}
1297
1298	return processed;
1299}
1300
1301static void lcd_write_char(char c)
1302{
1303	/* first, we'll test if we're in escape mode */
1304	if ((c != '\n') && lcd.esc_seq.len >= 0) {
1305		/* yes, let's add this char to the buffer */
1306		lcd.esc_seq.buf[lcd.esc_seq.len++] = c;
1307		lcd.esc_seq.buf[lcd.esc_seq.len] = 0;
1308	} else {
1309		/* aborts any previous escape sequence */
1310		lcd.esc_seq.len = -1;
1311
1312		switch (c) {
1313		case LCD_ESCAPE_CHAR:
1314			/* start of an escape sequence */
1315			lcd.esc_seq.len = 0;
1316			lcd.esc_seq.buf[lcd.esc_seq.len] = 0;
1317			break;
1318		case '\b':
1319			/* go back one char and clear it */
1320			if (lcd.addr.x > 0) {
1321				/*
1322				 * check if we're not at the
1323				 * end of the line
1324				 */
1325				if (lcd.addr.x < lcd.bwidth)
1326					/* back one char */
1327					lcd_write_cmd(LCD_CMD_SHIFT);
1328				lcd.addr.x--;
1329			}
1330			/* replace with a space */
1331			lcd_write_data(' ');
1332			/* back one char again */
1333			lcd_write_cmd(LCD_CMD_SHIFT);
1334			break;
1335		case '\014':
1336			/* quickly clear the display */
1337			lcd_clear_fast();
1338			break;
1339		case '\n':
1340			/*
1341			 * flush the remainder of the current line and
1342			 * go to the beginning of the next line
1343			 */
1344			for (; lcd.addr.x < lcd.bwidth; lcd.addr.x++)
1345				lcd_write_data(' ');
1346			lcd.addr.x = 0;
1347			lcd.addr.y = (lcd.addr.y + 1) % lcd.height;
1348			lcd_gotoxy();
1349			break;
1350		case '\r':
1351			/* go to the beginning of the same line */
1352			lcd.addr.x = 0;
1353			lcd_gotoxy();
1354			break;
1355		case '\t':
1356			/* print a space instead of the tab */
1357			lcd_print(' ');
1358			break;
1359		default:
1360			/* simply print this char */
1361			lcd_print(c);
1362			break;
1363		}
1364	}
1365
1366	/*
1367	 * now we'll see if we're in an escape mode and if the current
1368	 * escape sequence can be understood.
1369	 */
1370	if (lcd.esc_seq.len >= 2) {
1371		int processed = 0;
1372
1373		if (!strcmp(lcd.esc_seq.buf, "[2J")) {
1374			/* clear the display */
1375			lcd_clear_fast();
1376			processed = 1;
1377		} else if (!strcmp(lcd.esc_seq.buf, "[H")) {
1378			/* cursor to home */
1379			lcd.addr.x = 0;
1380			lcd.addr.y = 0;
1381			lcd_gotoxy();
1382			processed = 1;
1383		}
1384		/* codes starting with ^[[L */
1385		else if ((lcd.esc_seq.len >= 3) &&
1386			 (lcd.esc_seq.buf[0] == '[') &&
1387			 (lcd.esc_seq.buf[1] == 'L')) {
1388			processed = handle_lcd_special_code();
1389		}
1390
1391		/* LCD special escape codes */
1392		/*
1393		 * flush the escape sequence if it's been processed
1394		 * or if it is getting too long.
1395		 */
1396		if (processed || (lcd.esc_seq.len >= LCD_ESCAPE_LEN))
1397			lcd.esc_seq.len = -1;
1398	} /* escape codes */
1399}
1400
1401static ssize_t lcd_write(struct file *file,
1402			 const char __user *buf, size_t count, loff_t *ppos)
1403{
1404	const char __user *tmp = buf;
1405	char c;
1406
1407	for (; count-- > 0; (*ppos)++, tmp++) {
1408		if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
1409			/*
1410			 * let's be a little nice with other processes
1411			 * that need some CPU
1412			 */
1413			schedule();
1414
1415		if (get_user(c, tmp))
1416			return -EFAULT;
1417
1418		lcd_write_char(c);
1419	}
1420
1421	return tmp - buf;
1422}
1423
1424static int lcd_open(struct inode *inode, struct file *file)
1425{
1426	if (!atomic_dec_and_test(&lcd_available))
1427		return -EBUSY;	/* open only once at a time */
1428
1429	if (file->f_mode & FMODE_READ)	/* device is write-only */
1430		return -EPERM;
1431
1432	if (lcd.must_clear) {
1433		lcd_clear_display();
1434		lcd.must_clear = false;
1435	}
1436	return nonseekable_open(inode, file);
1437}
1438
1439static int lcd_release(struct inode *inode, struct file *file)
1440{
1441	atomic_inc(&lcd_available);
1442	return 0;
1443}
1444
1445static const struct file_operations lcd_fops = {
1446	.write   = lcd_write,
1447	.open    = lcd_open,
1448	.release = lcd_release,
1449	.llseek  = no_llseek,
1450};
1451
1452static struct miscdevice lcd_dev = {
1453	.minor	= LCD_MINOR,
1454	.name	= "lcd",
1455	.fops	= &lcd_fops,
1456};
1457
1458/* public function usable from the kernel for any purpose */
1459static void panel_lcd_print(const char *s)
1460{
1461	const char *tmp = s;
1462	int count = strlen(s);
1463
1464	if (lcd.enabled && lcd.initialized) {
1465		for (; count-- > 0; tmp++) {
1466			if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
1467				/*
1468				 * let's be a little nice with other processes
1469				 * that need some CPU
1470				 */
1471				schedule();
1472
1473			lcd_write_char(*tmp);
1474		}
1475	}
1476}
1477
1478/* initialize the LCD driver */
1479static void lcd_init(void)
1480{
1481	switch (selected_lcd_type) {
1482	case LCD_TYPE_OLD:
1483		/* parallel mode, 8 bits */
1484		lcd.proto = LCD_PROTO_PARALLEL;
1485		lcd.charset = LCD_CHARSET_NORMAL;
1486		lcd.pins.e = PIN_STROBE;
1487		lcd.pins.rs = PIN_AUTOLF;
1488
1489		lcd.width = 40;
1490		lcd.bwidth = 40;
1491		lcd.hwidth = 64;
1492		lcd.height = 2;
1493		break;
1494	case LCD_TYPE_KS0074:
1495		/* serial mode, ks0074 */
1496		lcd.proto = LCD_PROTO_SERIAL;
1497		lcd.charset = LCD_CHARSET_KS0074;
1498		lcd.pins.bl = PIN_AUTOLF;
1499		lcd.pins.cl = PIN_STROBE;
1500		lcd.pins.da = PIN_D0;
1501
1502		lcd.width = 16;
1503		lcd.bwidth = 40;
1504		lcd.hwidth = 16;
1505		lcd.height = 2;
1506		break;
1507	case LCD_TYPE_NEXCOM:
1508		/* parallel mode, 8 bits, generic */
1509		lcd.proto = LCD_PROTO_PARALLEL;
1510		lcd.charset = LCD_CHARSET_NORMAL;
1511		lcd.pins.e = PIN_AUTOLF;
1512		lcd.pins.rs = PIN_SELECP;
1513		lcd.pins.rw = PIN_INITP;
1514
1515		lcd.width = 16;
1516		lcd.bwidth = 40;
1517		lcd.hwidth = 64;
1518		lcd.height = 2;
1519		break;
1520	case LCD_TYPE_CUSTOM:
1521		/* customer-defined */
1522		lcd.proto = DEFAULT_LCD_PROTO;
1523		lcd.charset = DEFAULT_LCD_CHARSET;
1524		/* default geometry will be set later */
1525		break;
1526	case LCD_TYPE_HANTRONIX:
1527		/* parallel mode, 8 bits, hantronix-like */
1528	default:
1529		lcd.proto = LCD_PROTO_PARALLEL;
1530		lcd.charset = LCD_CHARSET_NORMAL;
1531		lcd.pins.e = PIN_STROBE;
1532		lcd.pins.rs = PIN_SELECP;
1533
1534		lcd.width = 16;
1535		lcd.bwidth = 40;
1536		lcd.hwidth = 64;
1537		lcd.height = 2;
1538		break;
1539	}
1540
1541	/* Overwrite with module params set on loading */
1542	if (lcd_height != NOT_SET)
1543		lcd.height = lcd_height;
1544	if (lcd_width != NOT_SET)
1545		lcd.width = lcd_width;
1546	if (lcd_bwidth != NOT_SET)
1547		lcd.bwidth = lcd_bwidth;
1548	if (lcd_hwidth != NOT_SET)
1549		lcd.hwidth = lcd_hwidth;
1550	if (lcd_charset != NOT_SET)
1551		lcd.charset = lcd_charset;
1552	if (lcd_proto != NOT_SET)
1553		lcd.proto = lcd_proto;
1554	if (lcd_e_pin != PIN_NOT_SET)
1555		lcd.pins.e = lcd_e_pin;
1556	if (lcd_rs_pin != PIN_NOT_SET)
1557		lcd.pins.rs = lcd_rs_pin;
1558	if (lcd_rw_pin != PIN_NOT_SET)
1559		lcd.pins.rw = lcd_rw_pin;
1560	if (lcd_cl_pin != PIN_NOT_SET)
1561		lcd.pins.cl = lcd_cl_pin;
1562	if (lcd_da_pin != PIN_NOT_SET)
1563		lcd.pins.da = lcd_da_pin;
1564	if (lcd_bl_pin != PIN_NOT_SET)
1565		lcd.pins.bl = lcd_bl_pin;
1566
1567	/* this is used to catch wrong and default values */
1568	if (lcd.width <= 0)
1569		lcd.width = DEFAULT_LCD_WIDTH;
1570	if (lcd.bwidth <= 0)
1571		lcd.bwidth = DEFAULT_LCD_BWIDTH;
1572	if (lcd.hwidth <= 0)
1573		lcd.hwidth = DEFAULT_LCD_HWIDTH;
1574	if (lcd.height <= 0)
1575		lcd.height = DEFAULT_LCD_HEIGHT;
1576
1577	if (lcd.proto == LCD_PROTO_SERIAL) {	/* SERIAL */
1578		lcd_write_cmd = lcd_write_cmd_s;
1579		lcd_write_data = lcd_write_data_s;
1580		lcd_clear_fast = lcd_clear_fast_s;
1581
1582		if (lcd.pins.cl == PIN_NOT_SET)
1583			lcd.pins.cl = DEFAULT_LCD_PIN_SCL;
1584		if (lcd.pins.da == PIN_NOT_SET)
1585			lcd.pins.da = DEFAULT_LCD_PIN_SDA;
1586
1587	} else if (lcd.proto == LCD_PROTO_PARALLEL) {	/* PARALLEL */
1588		lcd_write_cmd = lcd_write_cmd_p8;
1589		lcd_write_data = lcd_write_data_p8;
1590		lcd_clear_fast = lcd_clear_fast_p8;
1591
1592		if (lcd.pins.e == PIN_NOT_SET)
1593			lcd.pins.e = DEFAULT_LCD_PIN_E;
1594		if (lcd.pins.rs == PIN_NOT_SET)
1595			lcd.pins.rs = DEFAULT_LCD_PIN_RS;
1596		if (lcd.pins.rw == PIN_NOT_SET)
1597			lcd.pins.rw = DEFAULT_LCD_PIN_RW;
1598	} else {
1599		lcd_write_cmd = lcd_write_cmd_tilcd;
1600		lcd_write_data = lcd_write_data_tilcd;
1601		lcd_clear_fast = lcd_clear_fast_tilcd;
1602	}
1603
1604	if (lcd.pins.bl == PIN_NOT_SET)
1605		lcd.pins.bl = DEFAULT_LCD_PIN_BL;
1606
1607	if (lcd.pins.e == PIN_NOT_SET)
1608		lcd.pins.e = PIN_NONE;
1609	if (lcd.pins.rs == PIN_NOT_SET)
1610		lcd.pins.rs = PIN_NONE;
1611	if (lcd.pins.rw == PIN_NOT_SET)
1612		lcd.pins.rw = PIN_NONE;
1613	if (lcd.pins.bl == PIN_NOT_SET)
1614		lcd.pins.bl = PIN_NONE;
1615	if (lcd.pins.cl == PIN_NOT_SET)
1616		lcd.pins.cl = PIN_NONE;
1617	if (lcd.pins.da == PIN_NOT_SET)
1618		lcd.pins.da = PIN_NONE;
1619
1620	if (lcd.charset == NOT_SET)
1621		lcd.charset = DEFAULT_LCD_CHARSET;
1622
1623	if (lcd.charset == LCD_CHARSET_KS0074)
1624		lcd_char_conv = lcd_char_conv_ks0074;
1625	else
1626		lcd_char_conv = NULL;
1627
1628	if (lcd.pins.bl != PIN_NONE)
1629		init_scan_timer();
1630
1631	pin_to_bits(lcd.pins.e, lcd_bits[LCD_PORT_D][LCD_BIT_E],
1632		    lcd_bits[LCD_PORT_C][LCD_BIT_E]);
1633	pin_to_bits(lcd.pins.rs, lcd_bits[LCD_PORT_D][LCD_BIT_RS],
1634		    lcd_bits[LCD_PORT_C][LCD_BIT_RS]);
1635	pin_to_bits(lcd.pins.rw, lcd_bits[LCD_PORT_D][LCD_BIT_RW],
1636		    lcd_bits[LCD_PORT_C][LCD_BIT_RW]);
1637	pin_to_bits(lcd.pins.bl, lcd_bits[LCD_PORT_D][LCD_BIT_BL],
1638		    lcd_bits[LCD_PORT_C][LCD_BIT_BL]);
1639	pin_to_bits(lcd.pins.cl, lcd_bits[LCD_PORT_D][LCD_BIT_CL],
1640		    lcd_bits[LCD_PORT_C][LCD_BIT_CL]);
1641	pin_to_bits(lcd.pins.da, lcd_bits[LCD_PORT_D][LCD_BIT_DA],
1642		    lcd_bits[LCD_PORT_C][LCD_BIT_DA]);
1643
1644	/*
1645	 * before this line, we must NOT send anything to the display.
1646	 * Since lcd_init_display() needs to write data, we have to
1647	 * enable mark the LCD initialized just before.
1648	 */
1649	lcd.initialized = true;
1650	lcd_init_display();
1651
1652	/* display a short message */
1653#ifdef CONFIG_PANEL_CHANGE_MESSAGE
1654#ifdef CONFIG_PANEL_BOOT_MESSAGE
1655	panel_lcd_print("\x1b[Lc\x1b[Lb\x1b[L*" CONFIG_PANEL_BOOT_MESSAGE);
1656#endif
1657#else
1658	panel_lcd_print("\x1b[Lc\x1b[Lb\x1b[L*Linux-" UTS_RELEASE "\nPanel-"
1659			PANEL_VERSION);
1660#endif
1661	lcd.addr.x = 0;
1662	lcd.addr.y = 0;
1663	/* clear the display on the next device opening */
1664	lcd.must_clear = true;
1665	lcd_gotoxy();
1666}
1667
1668/*
1669 * These are the file operation function for user access to /dev/keypad
1670 */
1671
1672static ssize_t keypad_read(struct file *file,
1673			   char __user *buf, size_t count, loff_t *ppos)
1674{
1675	unsigned i = *ppos;
1676	char __user *tmp = buf;
1677
1678	if (keypad_buflen == 0) {
1679		if (file->f_flags & O_NONBLOCK)
1680			return -EAGAIN;
1681
1682		if (wait_event_interruptible(keypad_read_wait,
1683					     keypad_buflen != 0))
1684			return -EINTR;
1685	}
1686
1687	for (; count-- > 0 && (keypad_buflen > 0);
1688	     ++i, ++tmp, --keypad_buflen) {
1689		put_user(keypad_buffer[keypad_start], tmp);
1690		keypad_start = (keypad_start + 1) % KEYPAD_BUFFER;
1691	}
1692	*ppos = i;
1693
1694	return tmp - buf;
1695}
1696
1697static int keypad_open(struct inode *inode, struct file *file)
1698{
1699	if (!atomic_dec_and_test(&keypad_available))
1700		return -EBUSY;	/* open only once at a time */
1701
1702	if (file->f_mode & FMODE_WRITE)	/* device is read-only */
1703		return -EPERM;
1704
1705	keypad_buflen = 0;	/* flush the buffer on opening */
1706	return 0;
1707}
1708
1709static int keypad_release(struct inode *inode, struct file *file)
1710{
1711	atomic_inc(&keypad_available);
1712	return 0;
1713}
1714
1715static const struct file_operations keypad_fops = {
1716	.read    = keypad_read,		/* read */
1717	.open    = keypad_open,		/* open */
1718	.release = keypad_release,	/* close */
1719	.llseek  = default_llseek,
1720};
1721
1722static struct miscdevice keypad_dev = {
1723	.minor	= KEYPAD_MINOR,
1724	.name	= "keypad",
1725	.fops	= &keypad_fops,
1726};
1727
1728static void keypad_send_key(const char *string, int max_len)
1729{
1730	/* send the key to the device only if a process is attached to it. */
1731	if (!atomic_read(&keypad_available)) {
1732		while (max_len-- && keypad_buflen < KEYPAD_BUFFER && *string) {
1733			keypad_buffer[(keypad_start + keypad_buflen++) %
1734				      KEYPAD_BUFFER] = *string++;
1735		}
1736		wake_up_interruptible(&keypad_read_wait);
1737	}
1738}
1739
1740/* this function scans all the bits involving at least one logical signal,
1741 * and puts the results in the bitfield "phys_read" (one bit per established
1742 * contact), and sets "phys_read_prev" to "phys_read".
1743 *
1744 * Note: to debounce input signals, we will only consider as switched a signal
1745 * which is stable across 2 measures. Signals which are different between two
1746 * reads will be kept as they previously were in their logical form (phys_prev).
1747 * A signal which has just switched will have a 1 in
1748 * (phys_read ^ phys_read_prev).
1749 */
1750static void phys_scan_contacts(void)
1751{
1752	int bit, bitval;
1753	char oldval;
1754	char bitmask;
1755	char gndmask;
1756
1757	phys_prev = phys_curr;
1758	phys_read_prev = phys_read;
1759	phys_read = 0;		/* flush all signals */
1760
1761	/* keep track of old value, with all outputs disabled */
1762	oldval = r_dtr(pprt) | scan_mask_o;
1763	/* activate all keyboard outputs (active low) */
1764	w_dtr(pprt, oldval & ~scan_mask_o);
1765
1766	/* will have a 1 for each bit set to gnd */
1767	bitmask = PNL_PINPUT(r_str(pprt)) & scan_mask_i;
1768	/* disable all matrix signals */
1769	w_dtr(pprt, oldval);
1770
1771	/* now that all outputs are cleared, the only active input bits are
1772	 * directly connected to the ground
1773	 */
1774
1775	/* 1 for each grounded input */
1776	gndmask = PNL_PINPUT(r_str(pprt)) & scan_mask_i;
1777
1778	/* grounded inputs are signals 40-44 */
1779	phys_read |= (__u64)gndmask << 40;
1780
1781	if (bitmask != gndmask) {
1782		/*
1783		 * since clearing the outputs changed some inputs, we know
1784		 * that some input signals are currently tied to some outputs.
1785		 * So we'll scan them.
1786		 */
1787		for (bit = 0; bit < 8; bit++) {
1788			bitval = BIT(bit);
1789
1790			if (!(scan_mask_o & bitval))	/* skip unused bits */
1791				continue;
1792
1793			w_dtr(pprt, oldval & ~bitval);	/* enable this output */
1794			bitmask = PNL_PINPUT(r_str(pprt)) & ~gndmask;
1795			phys_read |= (__u64)bitmask << (5 * bit);
1796		}
1797		w_dtr(pprt, oldval);	/* disable all outputs */
1798	}
1799	/*
1800	 * this is easy: use old bits when they are flapping,
1801	 * use new ones when stable
1802	 */
1803	phys_curr = (phys_prev & (phys_read ^ phys_read_prev)) |
1804		    (phys_read & ~(phys_read ^ phys_read_prev));
1805}
1806
1807static inline int input_state_high(struct logical_input *input)
1808{
1809#if 0
1810	/* FIXME:
1811	 * this is an invalid test. It tries to catch
1812	 * transitions from single-key to multiple-key, but
1813	 * doesn't take into account the contacts polarity.
1814	 * The only solution to the problem is to parse keys
1815	 * from the most complex to the simplest combinations,
1816	 * and mark them as 'caught' once a combination
1817	 * matches, then unmatch it for all other ones.
1818	 */
1819
1820	/* try to catch dangerous transitions cases :
1821	 * someone adds a bit, so this signal was a false
1822	 * positive resulting from a transition. We should
1823	 * invalidate the signal immediately and not call the
1824	 * release function.
1825	 * eg: 0 -(press A)-> A -(press B)-> AB : don't match A's release.
1826	 */
1827	if (((phys_prev & input->mask) == input->value) &&
1828	    ((phys_curr & input->mask) >  input->value)) {
1829		input->state = INPUT_ST_LOW; /* invalidate */
1830		return 1;
1831	}
1832#endif
1833
1834	if ((phys_curr & input->mask) == input->value) {
1835		if ((input->type == INPUT_TYPE_STD) &&
1836		    (input->high_timer == 0)) {
1837			input->high_timer++;
1838			if (input->u.std.press_fct)
1839				input->u.std.press_fct(input->u.std.press_data);
1840		} else if (input->type == INPUT_TYPE_KBD) {
1841			/* will turn on the light */
1842			keypressed = 1;
1843
1844			if (input->high_timer == 0) {
1845				char *press_str = input->u.kbd.press_str;
1846
1847				if (press_str[0]) {
1848					int s = sizeof(input->u.kbd.press_str);
1849
1850					keypad_send_key(press_str, s);
1851				}
1852			}
1853
1854			if (input->u.kbd.repeat_str[0]) {
1855				char *repeat_str = input->u.kbd.repeat_str;
1856
1857				if (input->high_timer >= KEYPAD_REP_START) {
1858					int s = sizeof(input->u.kbd.repeat_str);
1859
1860					input->high_timer -= KEYPAD_REP_DELAY;
1861					keypad_send_key(repeat_str, s);
1862				}
1863				/* we will need to come back here soon */
1864				inputs_stable = 0;
1865			}
1866
1867			if (input->high_timer < 255)
1868				input->high_timer++;
1869		}
1870		return 1;
1871	}
1872
1873	/* else signal falling down. Let's fall through. */
1874	input->state = INPUT_ST_FALLING;
1875	input->fall_timer = 0;
1876
1877	return 0;
1878}
1879
1880static inline void input_state_falling(struct logical_input *input)
1881{
1882#if 0
1883	/* FIXME !!! same comment as in input_state_high */
1884	if (((phys_prev & input->mask) == input->value) &&
1885	    ((phys_curr & input->mask) >  input->value)) {
1886		input->state = INPUT_ST_LOW;	/* invalidate */
1887		return;
1888	}
1889#endif
1890
1891	if ((phys_curr & input->mask) == input->value) {
1892		if (input->type == INPUT_TYPE_KBD) {
1893			/* will turn on the light */
1894			keypressed = 1;
1895
1896			if (input->u.kbd.repeat_str[0]) {
1897				char *repeat_str = input->u.kbd.repeat_str;
1898
1899				if (input->high_timer >= KEYPAD_REP_START) {
1900					int s = sizeof(input->u.kbd.repeat_str);
1901
1902					input->high_timer -= KEYPAD_REP_DELAY;
1903					keypad_send_key(repeat_str, s);
1904				}
1905				/* we will need to come back here soon */
1906				inputs_stable = 0;
1907			}
1908
1909			if (input->high_timer < 255)
1910				input->high_timer++;
1911		}
1912		input->state = INPUT_ST_HIGH;
1913	} else if (input->fall_timer >= input->fall_time) {
1914		/* call release event */
1915		if (input->type == INPUT_TYPE_STD) {
1916			void (*release_fct)(int) = input->u.std.release_fct;
1917
1918			if (release_fct)
1919				release_fct(input->u.std.release_data);
1920		} else if (input->type == INPUT_TYPE_KBD) {
1921			char *release_str = input->u.kbd.release_str;
1922
1923			if (release_str[0]) {
1924				int s = sizeof(input->u.kbd.release_str);
1925
1926				keypad_send_key(release_str, s);
1927			}
1928		}
1929
1930		input->state = INPUT_ST_LOW;
1931	} else {
1932		input->fall_timer++;
1933		inputs_stable = 0;
1934	}
1935}
1936
1937static void panel_process_inputs(void)
1938{
1939	struct list_head *item;
1940	struct logical_input *input;
1941
1942	keypressed = 0;
1943	inputs_stable = 1;
1944	list_for_each(item, &logical_inputs) {
1945		input = list_entry(item, struct logical_input, list);
1946
1947		switch (input->state) {
1948		case INPUT_ST_LOW:
1949			if ((phys_curr & input->mask) != input->value)
1950				break;
1951			/* if all needed ones were already set previously,
1952			 * this means that this logical signal has been
1953			 * activated by the releasing of another combined
1954			 * signal, so we don't want to match.
1955			 * eg: AB -(release B)-> A -(release A)-> 0 :
1956			 *     don't match A.
1957			 */
1958			if ((phys_prev & input->mask) == input->value)
1959				break;
1960			input->rise_timer = 0;
1961			input->state = INPUT_ST_RISING;
1962			/* no break here, fall through */
1963		case INPUT_ST_RISING:
1964			if ((phys_curr & input->mask) != input->value) {
1965				input->state = INPUT_ST_LOW;
1966				break;
1967			}
1968			if (input->rise_timer < input->rise_time) {
1969				inputs_stable = 0;
1970				input->rise_timer++;
1971				break;
1972			}
1973			input->high_timer = 0;
1974			input->state = INPUT_ST_HIGH;
1975			/* no break here, fall through */
1976		case INPUT_ST_HIGH:
1977			if (input_state_high(input))
1978				break;
1979			/* no break here, fall through */
1980		case INPUT_ST_FALLING:
1981			input_state_falling(input);
1982		}
1983	}
1984}
1985
1986static void panel_scan_timer(void)
1987{
1988	if (keypad.enabled && keypad_initialized) {
1989		if (spin_trylock_irq(&pprt_lock)) {
1990			phys_scan_contacts();
1991
1992			/* no need for the parport anymore */
1993			spin_unlock_irq(&pprt_lock);
1994		}
1995
1996		if (!inputs_stable || phys_curr != phys_prev)
1997			panel_process_inputs();
1998	}
1999
2000	if (lcd.enabled && lcd.initialized) {
2001		if (keypressed) {
2002			if (lcd.light_tempo == 0 &&
2003			    ((lcd.flags & LCD_FLAG_L) == 0))
2004				lcd_backlight(1);
2005			lcd.light_tempo = FLASH_LIGHT_TEMPO;
2006		} else if (lcd.light_tempo > 0) {
2007			lcd.light_tempo--;
2008			if (lcd.light_tempo == 0 &&
2009			    ((lcd.flags & LCD_FLAG_L) == 0))
2010				lcd_backlight(0);
2011		}
2012	}
2013
2014	mod_timer(&scan_timer, jiffies + INPUT_POLL_TIME);
2015}
2016
2017static void init_scan_timer(void)
2018{
2019	if (scan_timer.function)
2020		return;		/* already started */
2021
2022	setup_timer(&scan_timer, (void *)&panel_scan_timer, 0);
2023	scan_timer.expires = jiffies + INPUT_POLL_TIME;
2024	add_timer(&scan_timer);
2025}
2026
2027/* converts a name of the form "({BbAaPpSsEe}{01234567-})*" to a series of bits.
2028 * if <omask> or <imask> are non-null, they will be or'ed with the bits
2029 * corresponding to out and in bits respectively.
2030 * returns 1 if ok, 0 if error (in which case, nothing is written).
2031 */
2032static u8 input_name2mask(const char *name, __u64 *mask, __u64 *value,
2033			  u8 *imask, u8 *omask)
2034{
2035	const char sigtab[] = "EeSsPpAaBb";
2036	u8 im, om;
2037	__u64 m, v;
2038
2039	om = 0;
2040	im = 0;
2041	m = 0ULL;
2042	v = 0ULL;
2043	while (*name) {
2044		int in, out, bit, neg;
2045		const char *idx;
2046
2047		idx = strchr(sigtab, *name);
2048		if (!idx)
2049			return 0;	/* input name not found */
2050
2051		in = idx - sigtab;
2052		neg = (in & 1);	/* odd (lower) names are negated */
2053		in >>= 1;
2054		im |= BIT(in);
2055
2056		name++;
2057		if (*name >= '0' && *name <= '7') {
2058			out = *name - '0';
2059			om |= BIT(out);
2060		} else if (*name == '-') {
2061			out = 8;
2062		} else {
2063			return 0;	/* unknown bit name */
2064		}
2065
2066		bit = (out * 5) + in;
2067
2068		m |= 1ULL << bit;
2069		if (!neg)
2070			v |= 1ULL << bit;
2071		name++;
2072	}
2073	*mask = m;
2074	*value = v;
2075	if (imask)
2076		*imask |= im;
2077	if (omask)
2078		*omask |= om;
2079	return 1;
2080}
2081
2082/* tries to bind a key to the signal name <name>. The key will send the
2083 * strings <press>, <repeat>, <release> for these respective events.
2084 * Returns the pointer to the new key if ok, NULL if the key could not be bound.
2085 */
2086static struct logical_input *panel_bind_key(const char *name, const char *press,
2087					    const char *repeat,
2088					    const char *release)
2089{
2090	struct logical_input *key;
2091
2092	key = kzalloc(sizeof(*key), GFP_KERNEL);
2093	if (!key)
2094		return NULL;
2095
2096	if (!input_name2mask(name, &key->mask, &key->value, &scan_mask_i,
2097			     &scan_mask_o)) {
2098		kfree(key);
2099		return NULL;
2100	}
2101
2102	key->type = INPUT_TYPE_KBD;
2103	key->state = INPUT_ST_LOW;
2104	key->rise_time = 1;
2105	key->fall_time = 1;
2106
2107	strncpy(key->u.kbd.press_str, press, sizeof(key->u.kbd.press_str));
2108	strncpy(key->u.kbd.repeat_str, repeat, sizeof(key->u.kbd.repeat_str));
2109	strncpy(key->u.kbd.release_str, release,
2110		sizeof(key->u.kbd.release_str));
2111	list_add(&key->list, &logical_inputs);
2112	return key;
2113}
2114
2115#if 0
2116/* tries to bind a callback function to the signal name <name>. The function
2117 * <press_fct> will be called with the <press_data> arg when the signal is
2118 * activated, and so on for <release_fct>/<release_data>
2119 * Returns the pointer to the new signal if ok, NULL if the signal could not
2120 * be bound.
2121 */
2122static struct logical_input *panel_bind_callback(char *name,
2123						 void (*press_fct)(int),
2124						 int press_data,
2125						 void (*release_fct)(int),
2126						 int release_data)
2127{
2128	struct logical_input *callback;
2129
2130	callback = kmalloc(sizeof(*callback), GFP_KERNEL);
2131	if (!callback)
2132		return NULL;
2133
2134	memset(callback, 0, sizeof(struct logical_input));
2135	if (!input_name2mask(name, &callback->mask, &callback->value,
2136			     &scan_mask_i, &scan_mask_o))
2137		return NULL;
2138
2139	callback->type = INPUT_TYPE_STD;
2140	callback->state = INPUT_ST_LOW;
2141	callback->rise_time = 1;
2142	callback->fall_time = 1;
2143	callback->u.std.press_fct = press_fct;
2144	callback->u.std.press_data = press_data;
2145	callback->u.std.release_fct = release_fct;
2146	callback->u.std.release_data = release_data;
2147	list_add(&callback->list, &logical_inputs);
2148	return callback;
2149}
2150#endif
2151
2152static void keypad_init(void)
2153{
2154	int keynum;
2155
2156	init_waitqueue_head(&keypad_read_wait);
2157	keypad_buflen = 0;	/* flushes any eventual noisy keystroke */
2158
2159	/* Let's create all known keys */
2160
2161	for (keynum = 0; keypad_profile[keynum][0][0]; keynum++) {
2162		panel_bind_key(keypad_profile[keynum][0],
2163			       keypad_profile[keynum][1],
2164			       keypad_profile[keynum][2],
2165			       keypad_profile[keynum][3]);
2166	}
2167
2168	init_scan_timer();
2169	keypad_initialized = 1;
2170}
2171
2172/**************************************************/
2173/* device initialization                          */
2174/**************************************************/
2175
2176static int panel_notify_sys(struct notifier_block *this, unsigned long code,
2177			    void *unused)
2178{
2179	if (lcd.enabled && lcd.initialized) {
2180		switch (code) {
2181		case SYS_DOWN:
2182			panel_lcd_print
2183			    ("\x0cReloading\nSystem...\x1b[Lc\x1b[Lb\x1b[L+");
2184			break;
2185		case SYS_HALT:
2186			panel_lcd_print
2187			    ("\x0cSystem Halted.\x1b[Lc\x1b[Lb\x1b[L+");
2188			break;
2189		case SYS_POWER_OFF:
2190			panel_lcd_print("\x0cPower off.\x1b[Lc\x1b[Lb\x1b[L+");
2191			break;
2192		default:
2193			break;
2194		}
2195	}
2196	return NOTIFY_DONE;
2197}
2198
2199static struct notifier_block panel_notifier = {
2200	panel_notify_sys,
2201	NULL,
2202	0
2203};
2204
2205static void panel_attach(struct parport *port)
2206{
2207	struct pardev_cb panel_cb;
2208
2209	if (port->number != parport)
2210		return;
2211
2212	if (pprt) {
2213		pr_err("%s: port->number=%d parport=%d, already registered!\n",
2214		       __func__, port->number, parport);
2215		return;
2216	}
2217
2218	memset(&panel_cb, 0, sizeof(panel_cb));
2219	panel_cb.private = &pprt;
2220	/* panel_cb.flags = 0 should be PARPORT_DEV_EXCL? */
2221
2222	pprt = parport_register_dev_model(port, "panel", &panel_cb, 0);
2223	if (!pprt) {
2224		pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n",
2225		       __func__, port->number, parport);
2226		return;
2227	}
2228
2229	if (parport_claim(pprt)) {
2230		pr_err("could not claim access to parport%d. Aborting.\n",
2231		       parport);
2232		goto err_unreg_device;
2233	}
2234
2235	/* must init LCD first, just in case an IRQ from the keypad is
2236	 * generated at keypad init
2237	 */
2238	if (lcd.enabled) {
2239		lcd_init();
2240		if (misc_register(&lcd_dev))
2241			goto err_unreg_device;
2242	}
2243
2244	if (keypad.enabled) {
2245		keypad_init();
2246		if (misc_register(&keypad_dev))
2247			goto err_lcd_unreg;
2248	}
2249	register_reboot_notifier(&panel_notifier);
2250	return;
2251
2252err_lcd_unreg:
2253	if (lcd.enabled)
2254		misc_deregister(&lcd_dev);
2255err_unreg_device:
2256	parport_unregister_device(pprt);
2257	pprt = NULL;
2258}
2259
2260static void panel_detach(struct parport *port)
2261{
2262	if (port->number != parport)
2263		return;
2264
2265	if (!pprt) {
2266		pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n",
2267		       __func__, port->number, parport);
2268		return;
2269	}
2270	if (scan_timer.function)
2271		del_timer_sync(&scan_timer);
2272
2273	if (pprt) {
2274		if (keypad.enabled) {
2275			misc_deregister(&keypad_dev);
2276			keypad_initialized = 0;
2277		}
2278
2279		if (lcd.enabled) {
2280			panel_lcd_print("\x0cLCD driver " PANEL_VERSION
2281					"\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-");
2282			misc_deregister(&lcd_dev);
2283			lcd.initialized = false;
2284		}
2285
2286		/* TODO: free all input signals */
2287		parport_release(pprt);
2288		parport_unregister_device(pprt);
2289		pprt = NULL;
2290		unregister_reboot_notifier(&panel_notifier);
2291	}
2292}
2293
2294static struct parport_driver panel_driver = {
2295	.name = "panel",
2296	.match_port = panel_attach,
2297	.detach = panel_detach,
2298	.devmodel = true,
2299};
2300
2301/* init function */
2302static int __init panel_init_module(void)
2303{
2304	int selected_keypad_type = NOT_SET, err;
2305
2306	/* take care of an eventual profile */
2307	switch (profile) {
2308	case PANEL_PROFILE_CUSTOM:
2309		/* custom profile */
2310		selected_keypad_type = DEFAULT_KEYPAD_TYPE;
2311		selected_lcd_type = DEFAULT_LCD_TYPE;
2312		break;
2313	case PANEL_PROFILE_OLD:
2314		/* 8 bits, 2*16, old keypad */
2315		selected_keypad_type = KEYPAD_TYPE_OLD;
2316		selected_lcd_type = LCD_TYPE_OLD;
2317
2318		/* TODO: This two are a little hacky, sort it out later */
2319		if (lcd_width == NOT_SET)
2320			lcd_width = 16;
2321		if (lcd_hwidth == NOT_SET)
2322			lcd_hwidth = 16;
2323		break;
2324	case PANEL_PROFILE_NEW:
2325		/* serial, 2*16, new keypad */
2326		selected_keypad_type = KEYPAD_TYPE_NEW;
2327		selected_lcd_type = LCD_TYPE_KS0074;
2328		break;
2329	case PANEL_PROFILE_HANTRONIX:
2330		/* 8 bits, 2*16 hantronix-like, no keypad */
2331		selected_keypad_type = KEYPAD_TYPE_NONE;
2332		selected_lcd_type = LCD_TYPE_HANTRONIX;
2333		break;
2334	case PANEL_PROFILE_NEXCOM:
2335		/* generic 8 bits, 2*16, nexcom keypad, eg. Nexcom. */
2336		selected_keypad_type = KEYPAD_TYPE_NEXCOM;
2337		selected_lcd_type = LCD_TYPE_NEXCOM;
2338		break;
2339	case PANEL_PROFILE_LARGE:
2340		/* 8 bits, 2*40, old keypad */
2341		selected_keypad_type = KEYPAD_TYPE_OLD;
2342		selected_lcd_type = LCD_TYPE_OLD;
2343		break;
2344	}
2345
2346	/*
2347	 * Overwrite selection with module param values (both keypad and lcd),
2348	 * where the deprecated params have lower prio.
2349	 */
2350	if (keypad_enabled != NOT_SET)
2351		selected_keypad_type = keypad_enabled;
2352	if (keypad_type != NOT_SET)
2353		selected_keypad_type = keypad_type;
2354
2355	keypad.enabled = (selected_keypad_type > 0);
2356
2357	if (lcd_enabled != NOT_SET)
2358		selected_lcd_type = lcd_enabled;
2359	if (lcd_type != NOT_SET)
2360		selected_lcd_type = lcd_type;
2361
2362	lcd.enabled = (selected_lcd_type > 0);
2363
2364	if (lcd.enabled) {
2365		/*
2366		 * Init lcd struct with load-time values to preserve exact
2367		 * current functionality (at least for now).
2368		 */
2369		lcd.height = lcd_height;
2370		lcd.width = lcd_width;
2371		lcd.bwidth = lcd_bwidth;
2372		lcd.hwidth = lcd_hwidth;
2373		lcd.charset = lcd_charset;
2374		lcd.proto = lcd_proto;
2375		lcd.pins.e = lcd_e_pin;
2376		lcd.pins.rs = lcd_rs_pin;
2377		lcd.pins.rw = lcd_rw_pin;
2378		lcd.pins.cl = lcd_cl_pin;
2379		lcd.pins.da = lcd_da_pin;
2380		lcd.pins.bl = lcd_bl_pin;
2381
2382		/* Leave it for now, just in case */
2383		lcd.esc_seq.len = -1;
2384	}
2385
2386	switch (selected_keypad_type) {
2387	case KEYPAD_TYPE_OLD:
2388		keypad_profile = old_keypad_profile;
2389		break;
2390	case KEYPAD_TYPE_NEW:
2391		keypad_profile = new_keypad_profile;
2392		break;
2393	case KEYPAD_TYPE_NEXCOM:
2394		keypad_profile = nexcom_keypad_profile;
2395		break;
2396	default:
2397		keypad_profile = NULL;
2398		break;
2399	}
2400
2401	if (!lcd.enabled && !keypad.enabled) {
2402		/* no device enabled, let's exit */
2403		pr_err("driver version " PANEL_VERSION " disabled.\n");
2404		return -ENODEV;
2405	}
2406
2407	err = parport_register_driver(&panel_driver);
2408	if (err) {
2409		pr_err("could not register with parport. Aborting.\n");
2410		return err;
2411	}
2412
2413	if (pprt)
2414		pr_info("driver version " PANEL_VERSION
2415			" registered on parport%d (io=0x%lx).\n", parport,
2416			pprt->port->base);
2417	else
2418		pr_info("driver version " PANEL_VERSION
2419			" not yet registered\n");
2420	return 0;
2421}
2422
2423static void __exit panel_cleanup_module(void)
2424{
2425	parport_unregister_driver(&panel_driver);
2426}
2427
2428module_init(panel_init_module);
2429module_exit(panel_cleanup_module);
2430MODULE_AUTHOR("Willy Tarreau");
2431MODULE_LICENSE("GPL");
2432
2433/*
2434 * Local variables:
2435 *  c-indent-level: 4
2436 *  tab-width: 8
2437 * End:
2438 */