in panel.c [829:1018]
static void lcd_init(void)
{
struct charlcd *charlcd;
struct hd44780_common *hdc;
hdc = hd44780_common_alloc();
if (!hdc)
return;
charlcd = charlcd_alloc();
if (!charlcd) {
kfree(hdc);
return;
}
hdc->hd44780 = &lcd;
charlcd->drvdata = hdc;
/*
* Init lcd struct with load-time values to preserve exact
* current functionality (at least for now).
*/
charlcd->height = lcd_height;
charlcd->width = lcd_width;
hdc->bwidth = lcd_bwidth;
hdc->hwidth = lcd_hwidth;
switch (selected_lcd_type) {
case LCD_TYPE_OLD:
/* parallel mode, 8 bits */
lcd.proto = LCD_PROTO_PARALLEL;
lcd.charset = LCD_CHARSET_NORMAL;
lcd.pins.e = PIN_STROBE;
lcd.pins.rs = PIN_AUTOLF;
charlcd->width = 40;
hdc->bwidth = 40;
hdc->hwidth = 64;
charlcd->height = 2;
break;
case LCD_TYPE_KS0074:
/* serial mode, ks0074 */
lcd.proto = LCD_PROTO_SERIAL;
lcd.charset = LCD_CHARSET_KS0074;
lcd.pins.bl = PIN_AUTOLF;
lcd.pins.cl = PIN_STROBE;
lcd.pins.da = PIN_D0;
charlcd->width = 16;
hdc->bwidth = 40;
hdc->hwidth = 16;
charlcd->height = 2;
break;
case LCD_TYPE_NEXCOM:
/* parallel mode, 8 bits, generic */
lcd.proto = LCD_PROTO_PARALLEL;
lcd.charset = LCD_CHARSET_NORMAL;
lcd.pins.e = PIN_AUTOLF;
lcd.pins.rs = PIN_SELECP;
lcd.pins.rw = PIN_INITP;
charlcd->width = 16;
hdc->bwidth = 40;
hdc->hwidth = 64;
charlcd->height = 2;
break;
case LCD_TYPE_CUSTOM:
/* customer-defined */
lcd.proto = DEFAULT_LCD_PROTO;
lcd.charset = DEFAULT_LCD_CHARSET;
/* default geometry will be set later */
break;
case LCD_TYPE_HANTRONIX:
/* parallel mode, 8 bits, hantronix-like */
default:
lcd.proto = LCD_PROTO_PARALLEL;
lcd.charset = LCD_CHARSET_NORMAL;
lcd.pins.e = PIN_STROBE;
lcd.pins.rs = PIN_SELECP;
charlcd->width = 16;
hdc->bwidth = 40;
hdc->hwidth = 64;
charlcd->height = 2;
break;
}
/* Overwrite with module params set on loading */
if (lcd_height != NOT_SET)
charlcd->height = lcd_height;
if (lcd_width != NOT_SET)
charlcd->width = lcd_width;
if (lcd_bwidth != NOT_SET)
hdc->bwidth = lcd_bwidth;
if (lcd_hwidth != NOT_SET)
hdc->hwidth = lcd_hwidth;
if (lcd_charset != NOT_SET)
lcd.charset = lcd_charset;
if (lcd_proto != NOT_SET)
lcd.proto = lcd_proto;
if (lcd_e_pin != PIN_NOT_SET)
lcd.pins.e = lcd_e_pin;
if (lcd_rs_pin != PIN_NOT_SET)
lcd.pins.rs = lcd_rs_pin;
if (lcd_rw_pin != PIN_NOT_SET)
lcd.pins.rw = lcd_rw_pin;
if (lcd_cl_pin != PIN_NOT_SET)
lcd.pins.cl = lcd_cl_pin;
if (lcd_da_pin != PIN_NOT_SET)
lcd.pins.da = lcd_da_pin;
if (lcd_bl_pin != PIN_NOT_SET)
lcd.pins.bl = lcd_bl_pin;
/* this is used to catch wrong and default values */
if (charlcd->width <= 0)
charlcd->width = DEFAULT_LCD_WIDTH;
if (hdc->bwidth <= 0)
hdc->bwidth = DEFAULT_LCD_BWIDTH;
if (hdc->hwidth <= 0)
hdc->hwidth = DEFAULT_LCD_HWIDTH;
if (charlcd->height <= 0)
charlcd->height = DEFAULT_LCD_HEIGHT;
if (lcd.proto == LCD_PROTO_SERIAL) { /* SERIAL */
charlcd->ops = &charlcd_ops;
hdc->write_data = lcd_write_data_s;
hdc->write_cmd = lcd_write_cmd_s;
if (lcd.pins.cl == PIN_NOT_SET)
lcd.pins.cl = DEFAULT_LCD_PIN_SCL;
if (lcd.pins.da == PIN_NOT_SET)
lcd.pins.da = DEFAULT_LCD_PIN_SDA;
} else if (lcd.proto == LCD_PROTO_PARALLEL) { /* PARALLEL */
charlcd->ops = &charlcd_ops;
hdc->write_data = lcd_write_data_p8;
hdc->write_cmd = lcd_write_cmd_p8;
if (lcd.pins.e == PIN_NOT_SET)
lcd.pins.e = DEFAULT_LCD_PIN_E;
if (lcd.pins.rs == PIN_NOT_SET)
lcd.pins.rs = DEFAULT_LCD_PIN_RS;
if (lcd.pins.rw == PIN_NOT_SET)
lcd.pins.rw = DEFAULT_LCD_PIN_RW;
} else {
charlcd->ops = &charlcd_ops;
hdc->write_data = lcd_write_data_tilcd;
hdc->write_cmd = lcd_write_cmd_tilcd;
}
if (lcd.pins.bl == PIN_NOT_SET)
lcd.pins.bl = DEFAULT_LCD_PIN_BL;
if (lcd.pins.e == PIN_NOT_SET)
lcd.pins.e = PIN_NONE;
if (lcd.pins.rs == PIN_NOT_SET)
lcd.pins.rs = PIN_NONE;
if (lcd.pins.rw == PIN_NOT_SET)
lcd.pins.rw = PIN_NONE;
if (lcd.pins.bl == PIN_NOT_SET)
lcd.pins.bl = PIN_NONE;
if (lcd.pins.cl == PIN_NOT_SET)
lcd.pins.cl = PIN_NONE;
if (lcd.pins.da == PIN_NOT_SET)
lcd.pins.da = PIN_NONE;
if (lcd.charset == NOT_SET)
lcd.charset = DEFAULT_LCD_CHARSET;
if (lcd.charset == LCD_CHARSET_KS0074)
charlcd->char_conv = lcd_char_conv_ks0074;
else
charlcd->char_conv = NULL;
pin_to_bits(lcd.pins.e, lcd_bits[LCD_PORT_D][LCD_BIT_E],
lcd_bits[LCD_PORT_C][LCD_BIT_E]);
pin_to_bits(lcd.pins.rs, lcd_bits[LCD_PORT_D][LCD_BIT_RS],
lcd_bits[LCD_PORT_C][LCD_BIT_RS]);
pin_to_bits(lcd.pins.rw, lcd_bits[LCD_PORT_D][LCD_BIT_RW],
lcd_bits[LCD_PORT_C][LCD_BIT_RW]);
pin_to_bits(lcd.pins.bl, lcd_bits[LCD_PORT_D][LCD_BIT_BL],
lcd_bits[LCD_PORT_C][LCD_BIT_BL]);
pin_to_bits(lcd.pins.cl, lcd_bits[LCD_PORT_D][LCD_BIT_CL],
lcd_bits[LCD_PORT_C][LCD_BIT_CL]);
pin_to_bits(lcd.pins.da, lcd_bits[LCD_PORT_D][LCD_BIT_DA],
lcd_bits[LCD_PORT_C][LCD_BIT_DA]);
lcd.charlcd = charlcd;
lcd.initialized = true;
}