11 #include <linux/module.h>
17 #include <linux/slab.h>
19 #include <generated/utsrelease.h>
21 #define DRIVERNAME "arm-charlcd"
22 #define CHARLCD_TIMEOUT (msecs_to_jiffies(1000))
25 #define CHAR_COM 0x00U
26 #define CHAR_DAT 0x04U
28 #define CHAR_RAW 0x0CU
29 #define CHAR_MASK 0x10U
30 #define CHAR_STAT 0x14U
32 #define CHAR_RAW_CLEAR 0x00000000U
33 #define CHAR_RAW_VALID 0x00000100U
36 #define HD_CLEAR 0x01U
38 #define HD_ENTRYMODE 0x04U
39 #define HD_ENTRYMODE_INCREMENT 0x02U
40 #define HD_ENTRYMODE_SHIFT 0x01U
41 #define HD_DISPCTRL 0x08U
42 #define HD_DISPCTRL_ON 0x04U
43 #define HD_DISPCTRL_CURSOR_ON 0x02U
44 #define HD_DISPCTRL_CURSOR_BLINK 0x01U
45 #define HD_CRSR_SHIFT 0x10U
46 #define HD_CRSR_SHIFT_DISPLAY 0x08U
47 #define HD_CRSR_SHIFT_DISPLAY_RIGHT 0x04U
48 #define HD_FUNCSET 0x20U
49 #define HD_FUNCSET_8BIT 0x10U
50 #define HD_FUNCSET_2_LINES 0x08U
51 #define HD_FUNCSET_FONT_5X10 0x04U
52 #define HD_SET_CGRAM 0x40U
53 #define HD_SET_DDRAM 0x80U
54 #define HD_BUSY_FLAG 0x80U
85 dev_info(lcd->
dev,
"Spurious IRQ (%02x)\n", status);
90 static void charlcd_wait_complete_irq(
struct charlcd *lcd)
101 "wait_for_completion_interruptible_timeout() "
102 "returned %d waiting for ready\n", ret);
107 dev_err(lcd->
dev,
"charlcd controller timed out "
108 "waiting for ready\n");
113 static u8 charlcd_4bit_read_char(
struct charlcd *lcd)
121 charlcd_wait_complete_irq(lcd);
158 static bool charlcd_4bit_read_bf(
struct charlcd *lcd)
170 return charlcd_4bit_read_char(lcd) &
HD_BUSY_FLAG ?
true :
false;
173 static void charlcd_4bit_wait_busy(
struct charlcd *lcd)
178 while (charlcd_4bit_read_bf(lcd) && retries)
181 dev_err(lcd->
dev,
"timeout waiting for busyflag\n");
184 static void charlcd_4bit_command(
struct charlcd *lcd,
u8 cmd)
186 u32 cmdlo = (cmd << 4) & 0xf0;
187 u32 cmdhi = (cmd & 0xf0);
192 charlcd_4bit_wait_busy(lcd);
195 static void charlcd_4bit_char(
struct charlcd *lcd,
u8 ch)
197 u32 chlo = (ch << 4) & 0xf0;
198 u32 chhi = (ch & 0xf0);
203 charlcd_4bit_wait_busy(lcd);
206 static void charlcd_4bit_print(
struct charlcd *lcd,
int line,
const char *
str)
227 for (i = 0; i <
strlen(str) && i < 0x28; i++)
228 charlcd_4bit_char(lcd, str[i]);
231 static void charlcd_4bit_init(
struct charlcd *lcd)
250 charlcd_4bit_command(lcd,
HD_CLEAR);
251 charlcd_4bit_command(lcd,
HD_HOME);
253 charlcd_4bit_print(lcd, 0,
"ARM Linux");
254 charlcd_4bit_print(lcd, 1, UTS_RELEASE);
262 charlcd_4bit_init(lcd);
280 goto out_no_resource;
283 lcd->
physize = resource_size(res);
288 goto out_no_memregion;
307 platform_set_drvdata(pdev, lcd);
316 dev_info(&pdev->
dev,
"initialized ARM character LCD at %08x\n",
324 platform_set_drvdata(pdev,
NULL);
334 struct charlcd *lcd = platform_get_drvdata(pdev);
340 platform_set_drvdata(pdev,
NULL);
347 static int charlcd_suspend(
struct device *
dev)
350 struct charlcd *lcd = platform_get_drvdata(pdev);
357 static int charlcd_resume(
struct device *
dev)
360 struct charlcd *lcd = platform_get_drvdata(pdev);
367 static const struct dev_pm_ops charlcd_pm_ops = {
368 .suspend = charlcd_suspend,
369 .resume = charlcd_resume,
376 .pm = &charlcd_pm_ops,
381 static int __init charlcd_init(
void)
386 static void __exit charlcd_exit(
void)