Lines Matching refs:lcd
76 struct charlcd *lcd = data; in charlcd_interrupt() local
79 status = readl(lcd->virtbase + CHAR_STAT) & 0x01; in charlcd_interrupt()
81 writel(CHAR_RAW_CLEAR, lcd->virtbase + CHAR_RAW); in charlcd_interrupt()
83 complete(&lcd->complete); in charlcd_interrupt()
85 dev_info(lcd->dev, "Spurious IRQ (%02x)\n", status); in charlcd_interrupt()
90 static void charlcd_wait_complete_irq(struct charlcd *lcd) in charlcd_wait_complete_irq() argument
94 ret = wait_for_completion_interruptible_timeout(&lcd->complete, in charlcd_wait_complete_irq()
97 writel(0x00, lcd->virtbase + CHAR_MASK); in charlcd_wait_complete_irq()
100 dev_err(lcd->dev, in charlcd_wait_complete_irq()
107 dev_err(lcd->dev, "charlcd controller timed out " in charlcd_wait_complete_irq()
113 static u8 charlcd_4bit_read_char(struct charlcd *lcd) in charlcd_4bit_read_char() argument
120 if (lcd->irq >= 0) in charlcd_4bit_read_char()
121 charlcd_wait_complete_irq(lcd); in charlcd_4bit_read_char()
127 val = readl(lcd->virtbase + CHAR_RAW); in charlcd_4bit_read_char()
131 writel(CHAR_RAW_CLEAR, lcd->virtbase + CHAR_RAW); in charlcd_4bit_read_char()
136 data = readl(lcd->virtbase + CHAR_RD) & 0xf0; in charlcd_4bit_read_char()
146 val = readl(lcd->virtbase + CHAR_RAW); in charlcd_4bit_read_char()
149 writel(CHAR_RAW_CLEAR, lcd->virtbase + CHAR_RAW); in charlcd_4bit_read_char()
153 data |= (readl(lcd->virtbase + CHAR_RD) >> 4) & 0x0f; in charlcd_4bit_read_char()
158 static bool charlcd_4bit_read_bf(struct charlcd *lcd) in charlcd_4bit_read_bf() argument
160 if (lcd->irq >= 0) { in charlcd_4bit_read_bf()
165 writel(CHAR_RAW_CLEAR, lcd->virtbase + CHAR_RAW); in charlcd_4bit_read_bf()
166 init_completion(&lcd->complete); in charlcd_4bit_read_bf()
167 writel(0x01, lcd->virtbase + CHAR_MASK); in charlcd_4bit_read_bf()
169 readl(lcd->virtbase + CHAR_COM); in charlcd_4bit_read_bf()
170 return charlcd_4bit_read_char(lcd) & HD_BUSY_FLAG ? true : false; in charlcd_4bit_read_bf()
173 static void charlcd_4bit_wait_busy(struct charlcd *lcd) in charlcd_4bit_wait_busy() argument
178 while (charlcd_4bit_read_bf(lcd) && retries) in charlcd_4bit_wait_busy()
181 dev_err(lcd->dev, "timeout waiting for busyflag\n"); in charlcd_4bit_wait_busy()
184 static void charlcd_4bit_command(struct charlcd *lcd, u8 cmd) in charlcd_4bit_command() argument
189 writel(cmdhi, lcd->virtbase + CHAR_COM); in charlcd_4bit_command()
191 writel(cmdlo, lcd->virtbase + CHAR_COM); in charlcd_4bit_command()
192 charlcd_4bit_wait_busy(lcd); in charlcd_4bit_command()
195 static void charlcd_4bit_char(struct charlcd *lcd, u8 ch) in charlcd_4bit_char() argument
200 writel(chhi, lcd->virtbase + CHAR_DAT); in charlcd_4bit_char()
202 writel(chlo, lcd->virtbase + CHAR_DAT); in charlcd_4bit_char()
203 charlcd_4bit_wait_busy(lcd); in charlcd_4bit_char()
206 static void charlcd_4bit_print(struct charlcd *lcd, int line, const char *str) in charlcd_4bit_print() argument
224 charlcd_4bit_command(lcd, HD_SET_DDRAM | offset); in charlcd_4bit_print()
228 charlcd_4bit_char(lcd, str[i]); in charlcd_4bit_print()
231 static void charlcd_4bit_init(struct charlcd *lcd) in charlcd_4bit_init() argument
234 writel(HD_FUNCSET | HD_FUNCSET_8BIT, lcd->virtbase + CHAR_COM); in charlcd_4bit_init()
236 writel(HD_FUNCSET | HD_FUNCSET_8BIT, lcd->virtbase + CHAR_COM); in charlcd_4bit_init()
238 writel(HD_FUNCSET | HD_FUNCSET_8BIT, lcd->virtbase + CHAR_COM); in charlcd_4bit_init()
241 writel(HD_FUNCSET, lcd->virtbase + CHAR_COM); in charlcd_4bit_init()
247 charlcd_4bit_command(lcd, HD_FUNCSET | HD_FUNCSET_2_LINES); in charlcd_4bit_init()
248 charlcd_4bit_command(lcd, HD_DISPCTRL | HD_DISPCTRL_ON); in charlcd_4bit_init()
249 charlcd_4bit_command(lcd, HD_ENTRYMODE | HD_ENTRYMODE_INCREMENT); in charlcd_4bit_init()
250 charlcd_4bit_command(lcd, HD_CLEAR); in charlcd_4bit_init()
251 charlcd_4bit_command(lcd, HD_HOME); in charlcd_4bit_init()
253 charlcd_4bit_print(lcd, 0, "ARM Linux"); in charlcd_4bit_init()
254 charlcd_4bit_print(lcd, 1, UTS_RELEASE); in charlcd_4bit_init()
259 struct charlcd *lcd = in charlcd_init_work() local
262 charlcd_4bit_init(lcd); in charlcd_init_work()
268 struct charlcd *lcd; in charlcd_probe() local
271 lcd = kzalloc(sizeof(struct charlcd), GFP_KERNEL); in charlcd_probe()
272 if (!lcd) in charlcd_probe()
275 lcd->dev = &pdev->dev; in charlcd_probe()
282 lcd->phybase = res->start; in charlcd_probe()
283 lcd->physize = resource_size(res); in charlcd_probe()
285 if (request_mem_region(lcd->phybase, lcd->physize, in charlcd_probe()
291 lcd->virtbase = ioremap(lcd->phybase, lcd->physize); in charlcd_probe()
292 if (!lcd->virtbase) { in charlcd_probe()
297 lcd->irq = platform_get_irq(pdev, 0); in charlcd_probe()
299 if (lcd->irq >= 0) { in charlcd_probe()
300 if (request_irq(lcd->irq, charlcd_interrupt, IRQF_DISABLED, in charlcd_probe()
301 DRIVERNAME, lcd)) { in charlcd_probe()
307 platform_set_drvdata(pdev, lcd); in charlcd_probe()
313 INIT_DELAYED_WORK(&lcd->init_work, charlcd_init_work); in charlcd_probe()
314 schedule_delayed_work(&lcd->init_work, 0); in charlcd_probe()
317 lcd->phybase); in charlcd_probe()
322 iounmap(lcd->virtbase); in charlcd_probe()
326 release_mem_region(lcd->phybase, SZ_4K); in charlcd_probe()
328 kfree(lcd); in charlcd_probe()
334 struct charlcd *lcd = platform_get_drvdata(pdev); in charlcd_remove() local
336 if (lcd) { in charlcd_remove()
337 free_irq(lcd->irq, lcd); in charlcd_remove()
338 iounmap(lcd->virtbase); in charlcd_remove()
339 release_mem_region(lcd->phybase, lcd->physize); in charlcd_remove()
341 kfree(lcd); in charlcd_remove()
350 struct charlcd *lcd = platform_get_drvdata(pdev); in charlcd_suspend() local
353 charlcd_4bit_command(lcd, HD_DISPCTRL); in charlcd_suspend()
360 struct charlcd *lcd = platform_get_drvdata(pdev); in charlcd_resume() local
363 charlcd_4bit_command(lcd, HD_DISPCTRL | HD_DISPCTRL_ON); in charlcd_resume()