Lines Matching full:md

56 static void mipid_transfer(struct mipid_device *md, int cmd, const u8 *wbuf,  in mipid_transfer()  argument
64 BUG_ON(md->spi == NULL); in mipid_transfer()
105 r = spi_sync(md->spi, &m); in mipid_transfer()
107 dev_dbg(&md->spi->dev, "spi_sync %d\n", r); in mipid_transfer()
113 static inline void mipid_cmd(struct mipid_device *md, int cmd) in mipid_cmd() argument
115 mipid_transfer(md, cmd, NULL, 0, NULL, 0); in mipid_cmd()
118 static inline void mipid_write(struct mipid_device *md, in mipid_write() argument
121 mipid_transfer(md, reg, buf, len, NULL, 0); in mipid_write()
124 static inline void mipid_read(struct mipid_device *md, in mipid_read() argument
127 mipid_transfer(md, reg, NULL, 0, buf, len); in mipid_read()
130 static void set_data_lines(struct mipid_device *md, int data_lines) in set_data_lines() argument
145 mipid_write(md, 0x3a, (u8 *)&par, 2); in set_data_lines()
148 static void send_init_string(struct mipid_device *md) in send_init_string() argument
152 mipid_write(md, 0xc2, (u8 *)initpar, sizeof(initpar)); in send_init_string()
153 set_data_lines(md, md->panel.data_lines); in send_init_string()
156 static void hw_guard_start(struct mipid_device *md, int guard_msec) in hw_guard_start() argument
158 md->hw_guard_wait = msecs_to_jiffies(guard_msec); in hw_guard_start()
159 md->hw_guard_end = jiffies + md->hw_guard_wait; in hw_guard_start()
162 static void hw_guard_wait(struct mipid_device *md) in hw_guard_wait() argument
164 unsigned long wait = md->hw_guard_end - jiffies; in hw_guard_wait()
166 if ((long)wait > 0 && time_before_eq(wait, md->hw_guard_wait)) { in hw_guard_wait()
172 static void set_sleep_mode(struct mipid_device *md, int on) in set_sleep_mode() argument
180 hw_guard_wait(md); in set_sleep_mode()
181 mipid_cmd(md, cmd); in set_sleep_mode()
182 hw_guard_start(md, 120); in set_sleep_mode()
194 static void set_display_state(struct mipid_device *md, int enabled) in set_display_state() argument
198 mipid_cmd(md, cmd); in set_display_state()
203 struct mipid_device *md = to_mipid_device(panel); in mipid_set_bklight_level() local
204 struct mipid_platform_data *pd = md->spi->dev.platform_data; in mipid_set_bklight_level()
210 if (!md->enabled) { in mipid_set_bklight_level()
211 md->saved_bklight_level = level; in mipid_set_bklight_level()
221 struct mipid_device *md = to_mipid_device(panel); in mipid_get_bklight_level() local
222 struct mipid_platform_data *pd = md->spi->dev.platform_data; in mipid_get_bklight_level()
231 struct mipid_device *md = to_mipid_device(panel); in mipid_get_bklight_max() local
232 struct mipid_platform_data *pd = md->spi->dev.platform_data; in mipid_get_bklight_max()
245 static u16 read_first_pixel(struct mipid_device *md) in read_first_pixel() argument
250 mutex_lock(&md->mutex); in read_first_pixel()
251 mipid_read(md, MIPID_CMD_READ_RED, &red, 1); in read_first_pixel()
252 mipid_read(md, MIPID_CMD_READ_GREEN, &green, 1); in read_first_pixel()
253 mipid_read(md, MIPID_CMD_READ_BLUE, &blue, 1); in read_first_pixel()
254 mutex_unlock(&md->mutex); in read_first_pixel()
256 switch (md->panel.data_lines) { in read_first_pixel()
275 struct mipid_device *md = to_mipid_device(panel); in mipid_run_test() local
288 omapfb_write_first_pixel(md->fbdev, test_values[i]); in mipid_run_test()
295 pixel = read_first_pixel(md); in mipid_run_test()
299 dev_err(&md->spi->dev, in mipid_run_test()
312 static void ls041y3_esd_recover(struct mipid_device *md) in ls041y3_esd_recover() argument
314 dev_err(&md->spi->dev, "performing LCD ESD recovery\n"); in ls041y3_esd_recover()
315 set_sleep_mode(md, 1); in ls041y3_esd_recover()
316 set_sleep_mode(md, 0); in ls041y3_esd_recover()
319 static void ls041y3_esd_check_mode1(struct mipid_device *md) in ls041y3_esd_check_mode1() argument
323 mipid_read(md, MIPID_CMD_RDDSDR, &state1, 1); in ls041y3_esd_check_mode1()
324 set_sleep_mode(md, 0); in ls041y3_esd_check_mode1()
325 mipid_read(md, MIPID_CMD_RDDSDR, &state2, 1); in ls041y3_esd_check_mode1()
326 dev_dbg(&md->spi->dev, "ESD mode 1 state1 %02x state2 %02x\n", in ls041y3_esd_check_mode1()
332 ls041y3_esd_recover(md); in ls041y3_esd_check_mode1()
335 static void ls041y3_esd_check_mode2(struct mipid_device *md) in ls041y3_esd_check_mode2() argument
355 mipid_write(md, rd->cmd, (u8 *)rd->wbuf, rd->wlen); in ls041y3_esd_check_mode2()
358 mipid_read(md, rd->cmd, rbuf, 2); in ls041y3_esd_check_mode2()
363 mipid_write(md, rd->cmd, (u8 *)rd->wbuf, rd->wlen); in ls041y3_esd_check_mode2()
366 dev_dbg(&md->spi->dev, "ESD mode 2 state %02x\n", rbuf[1]); in ls041y3_esd_check_mode2()
368 ls041y3_esd_recover(md); in ls041y3_esd_check_mode2()
371 static void ls041y3_esd_check(struct mipid_device *md) in ls041y3_esd_check() argument
373 ls041y3_esd_check_mode1(md); in ls041y3_esd_check()
374 if (md->revision >= 0x88) in ls041y3_esd_check()
375 ls041y3_esd_check_mode2(md); in ls041y3_esd_check()
378 static void mipid_esd_start_check(struct mipid_device *md) in mipid_esd_start_check() argument
380 if (md->esd_check != NULL) in mipid_esd_start_check()
381 schedule_delayed_work(&md->esd_work, in mipid_esd_start_check()
385 static void mipid_esd_stop_check(struct mipid_device *md) in mipid_esd_stop_check() argument
387 if (md->esd_check != NULL) in mipid_esd_stop_check()
388 cancel_delayed_work_sync(&md->esd_work); in mipid_esd_stop_check()
393 struct mipid_device *md = container_of(work, struct mipid_device, in mipid_esd_work() local
396 mutex_lock(&md->mutex); in mipid_esd_work()
397 md->esd_check(md); in mipid_esd_work()
398 mutex_unlock(&md->mutex); in mipid_esd_work()
399 mipid_esd_start_check(md); in mipid_esd_work()
404 struct mipid_device *md = to_mipid_device(panel); in mipid_enable() local
406 mutex_lock(&md->mutex); in mipid_enable()
408 if (md->enabled) { in mipid_enable()
409 mutex_unlock(&md->mutex); in mipid_enable()
412 set_sleep_mode(md, 0); in mipid_enable()
413 md->enabled = 1; in mipid_enable()
414 send_init_string(md); in mipid_enable()
415 set_display_state(md, 1); in mipid_enable()
416 mipid_set_bklight_level(panel, md->saved_bklight_level); in mipid_enable()
417 mipid_esd_start_check(md); in mipid_enable()
419 mutex_unlock(&md->mutex); in mipid_enable()
425 struct mipid_device *md = to_mipid_device(panel); in mipid_disable() local
431 mipid_esd_stop_check(md); in mipid_disable()
432 mutex_lock(&md->mutex); in mipid_disable()
434 if (!md->enabled) { in mipid_disable()
435 mutex_unlock(&md->mutex); in mipid_disable()
438 md->saved_bklight_level = mipid_get_bklight_level(panel); in mipid_disable()
440 set_display_state(md, 0); in mipid_disable()
441 set_sleep_mode(md, 1); in mipid_disable()
442 md->enabled = 0; in mipid_disable()
444 mutex_unlock(&md->mutex); in mipid_disable()
447 static int panel_enabled(struct mipid_device *md) in panel_enabled() argument
452 mipid_read(md, MIPID_CMD_READ_DISP_STATUS, (u8 *)&disp_status, 4); in panel_enabled()
455 dev_dbg(&md->spi->dev, in panel_enabled()
464 struct mipid_device *md = to_mipid_device(panel); in mipid_init() local
466 md->fbdev = fbdev; in mipid_init()
467 INIT_DELAYED_WORK(&md->esd_work, mipid_esd_work); in mipid_init()
468 mutex_init(&md->mutex); in mipid_init()
470 md->enabled = panel_enabled(md); in mipid_init()
472 if (md->enabled) in mipid_init()
473 mipid_esd_start_check(md); in mipid_init()
475 md->saved_bklight_level = mipid_get_bklight_level(panel); in mipid_init()
482 struct mipid_device *md = to_mipid_device(panel); in mipid_cleanup() local
484 if (md->enabled) in mipid_cleanup()
485 mipid_esd_stop_check(md); in mipid_cleanup()
513 static int mipid_detect(struct mipid_device *md) in mipid_detect() argument
518 pdata = md->spi->dev.platform_data; in mipid_detect()
520 dev_err(&md->spi->dev, "missing platform data\n"); in mipid_detect()
524 mipid_read(md, MIPID_CMD_READ_DISP_ID, display_id, 3); in mipid_detect()
525 dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n", in mipid_detect()
530 md->panel.name = "lph8923"; in mipid_detect()
533 md->panel.name = "ls041y3"; in mipid_detect()
534 md->esd_check = ls041y3_esd_check; in mipid_detect()
537 md->panel.name = "unknown"; in mipid_detect()
538 dev_err(&md->spi->dev, "invalid display ID\n"); in mipid_detect()
542 md->revision = display_id[1]; in mipid_detect()
543 md->panel.data_lines = pdata->data_lines; in mipid_detect()
545 md->panel.name, md->revision, md->panel.data_lines); in mipid_detect()
552 struct mipid_device *md; in mipid_spi_probe() local
555 md = kzalloc(sizeof(*md), GFP_KERNEL); in mipid_spi_probe()
556 if (md == NULL) { in mipid_spi_probe()
562 md->reset = gpiod_get(&spi->dev, "reset", GPIOD_OUT_LOW); in mipid_spi_probe()
563 if (IS_ERR(md->reset)) in mipid_spi_probe()
564 return dev_err_probe(&spi->dev, PTR_ERR(md->reset), in mipid_spi_probe()
568 md->spi = spi; in mipid_spi_probe()
569 dev_set_drvdata(&spi->dev, md); in mipid_spi_probe()
570 md->panel = mipid_panel; in mipid_spi_probe()
572 r = mipid_detect(md); in mipid_spi_probe()
576 omapfb_register_panel(&md->panel); in mipid_spi_probe()
581 kfree(md); in mipid_spi_probe()
587 struct mipid_device *md = dev_get_drvdata(&spi->dev); in mipid_spi_remove() local
590 gpiod_set_value(md->reset, 1); in mipid_spi_remove()
591 mipid_disable(&md->panel); in mipid_spi_remove()
592 kfree(md); in mipid_spi_remove()