2121#include <generated/utsrelease.h>
2222
2323#include "charlcd.h"
24-
25- #define DEFAULT_LCD_BWIDTH 40
26- #define DEFAULT_LCD_HWIDTH 64
24+ #include "hd44780_common.h"
2725
2826/* Keep the backlight on this many seconds for each flash */
2927#define LCD_BL_TEMPO_PERIOD 4
@@ -151,18 +149,19 @@ EXPORT_SYMBOL_GPL(charlcd_poke);
151149static void charlcd_gotoxy (struct charlcd * lcd )
152150{
153151 struct charlcd_priv * priv = charlcd_to_priv (lcd );
152+ struct hd44780_common * hdc = lcd -> drvdata ;
154153 unsigned int addr ;
155154
156155 /*
157156 * we force the cursor to stay at the end of the
158157 * line if it wants to go farther
159158 */
160- addr = priv -> addr .x < lcd -> bwidth ? priv -> addr .x & (lcd -> hwidth - 1 )
161- : lcd -> bwidth - 1 ;
159+ addr = priv -> addr .x < hdc -> bwidth ? priv -> addr .x & (hdc -> hwidth - 1 )
160+ : hdc -> bwidth - 1 ;
162161 if (priv -> addr .y & 1 )
163- addr += lcd -> hwidth ;
162+ addr += hdc -> hwidth ;
164163 if (priv -> addr .y & 2 )
165- addr += lcd -> bwidth ;
164+ addr += hdc -> bwidth ;
166165 lcd -> ops -> write_cmd (lcd , LCD_CMD_SET_DDRAM_ADDR | addr );
167166}
168167
@@ -178,29 +177,31 @@ static void charlcd_home(struct charlcd *lcd)
178177static void charlcd_print (struct charlcd * lcd , char c )
179178{
180179 struct charlcd_priv * priv = charlcd_to_priv (lcd );
180+ struct hd44780_common * hdc = lcd -> drvdata ;
181181
182- if (priv -> addr .x < lcd -> bwidth ) {
182+ if (priv -> addr .x < hdc -> bwidth ) {
183183 if (lcd -> char_conv )
184184 c = lcd -> char_conv [(unsigned char )c ];
185185 lcd -> ops -> write_data (lcd , c );
186186 priv -> addr .x ++ ;
187187
188188 /* prevents the cursor from wrapping onto the next line */
189- if (priv -> addr .x == lcd -> bwidth )
189+ if (priv -> addr .x == hdc -> bwidth )
190190 charlcd_gotoxy (lcd );
191191 }
192192}
193193
194194static void charlcd_clear_fast (struct charlcd * lcd )
195195{
196+ struct hd44780_common * hdc = lcd -> drvdata ;
196197 int pos ;
197198
198199 charlcd_home (lcd );
199200
200201 if (lcd -> ops -> clear_fast )
201202 lcd -> ops -> clear_fast (lcd );
202203 else
203- for (pos = 0 ; pos < min (2 , lcd -> height ) * lcd -> hwidth ; pos ++ )
204+ for (pos = 0 ; pos < min (2 , lcd -> height ) * hdc -> hwidth ; pos ++ )
204205 lcd -> ops -> write_data (lcd , ' ' );
205206
206207 charlcd_home (lcd );
@@ -348,6 +349,7 @@ static bool parse_xy(const char *s, unsigned long *x, unsigned long *y)
348349static inline int handle_lcd_special_code (struct charlcd * lcd )
349350{
350351 struct charlcd_priv * priv = charlcd_to_priv (lcd );
352+ struct hd44780_common * hdc = lcd -> drvdata ;
351353
352354 /* LCD special codes */
353355
@@ -413,7 +415,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
413415 case 'l' : /* Shift Cursor Left */
414416 if (priv -> addr .x > 0 ) {
415417 /* back one char if not at end of line */
416- if (priv -> addr .x < lcd -> bwidth )
418+ if (priv -> addr .x < hdc -> bwidth )
417419 lcd -> ops -> write_cmd (lcd , LCD_CMD_SHIFT );
418420 priv -> addr .x -- ;
419421 }
@@ -422,7 +424,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
422424 case 'r' : /* shift cursor right */
423425 if (priv -> addr .x < lcd -> width ) {
424426 /* allow the cursor to pass the end of the line */
425- if (priv -> addr .x < (lcd -> bwidth - 1 ))
427+ if (priv -> addr .x < (hdc -> bwidth - 1 ))
426428 lcd -> ops -> write_cmd (lcd ,
427429 LCD_CMD_SHIFT | LCD_CMD_SHIFT_RIGHT );
428430 priv -> addr .x ++ ;
@@ -442,7 +444,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
442444 case 'k' : { /* kill end of line */
443445 int x ;
444446
445- for (x = priv -> addr .x ; x < lcd -> bwidth ; x ++ )
447+ for (x = priv -> addr .x ; x < hdc -> bwidth ; x ++ )
446448 lcd -> ops -> write_data (lcd , ' ' );
447449
448450 /* restore cursor position */
@@ -554,6 +556,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
554556static void charlcd_write_char (struct charlcd * lcd , char c )
555557{
556558 struct charlcd_priv * priv = charlcd_to_priv (lcd );
559+ struct hd44780_common * hdc = lcd -> drvdata ;
557560
558561 /* first, we'll test if we're in escape mode */
559562 if ((c != '\n' ) && priv -> esc_seq .len >= 0 ) {
@@ -577,7 +580,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
577580 * check if we're not at the
578581 * end of the line
579582 */
580- if (priv -> addr .x < lcd -> bwidth )
583+ if (priv -> addr .x < hdc -> bwidth )
581584 /* back one char */
582585 lcd -> ops -> write_cmd (lcd , LCD_CMD_SHIFT );
583586 priv -> addr .x -- ;
@@ -596,7 +599,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
596599 * flush the remainder of the current line and
597600 * go to the beginning of the next line
598601 */
599- for (; priv -> addr .x < lcd -> bwidth ; priv -> addr .x ++ )
602+ for (; priv -> addr .x < hdc -> bwidth ; priv -> addr .x ++ )
600603 lcd -> ops -> write_data (lcd , ' ' );
601604 priv -> addr .x = 0 ;
602605 priv -> addr .y = (priv -> addr .y + 1 ) % lcd -> height ;
@@ -779,22 +782,19 @@ static int charlcd_init(struct charlcd *lcd)
779782 return 0 ;
780783}
781784
782- struct charlcd * charlcd_alloc (unsigned int drvdata_size )
785+ struct charlcd * charlcd_alloc (void )
783786{
784787 struct charlcd_priv * priv ;
785788 struct charlcd * lcd ;
786789
787- priv = kzalloc (sizeof (* priv ) + drvdata_size , GFP_KERNEL );
790+ priv = kzalloc (sizeof (* priv ), GFP_KERNEL );
788791 if (!priv )
789792 return NULL ;
790793
791794 priv -> esc_seq .len = -1 ;
792795
793796 lcd = & priv -> lcd ;
794797 lcd -> ifwidth = 8 ;
795- lcd -> bwidth = DEFAULT_LCD_BWIDTH ;
796- lcd -> hwidth = DEFAULT_LCD_HWIDTH ;
797- lcd -> drvdata = priv -> drvdata ;
798798
799799 return lcd ;
800800}
0 commit comments