Lines Matching refs:dcon

47 static s32 dcon_write(struct dcon_priv *dcon, u8 reg, u16 val)  in dcon_write()  argument
49 return i2c_smbus_write_word_data(dcon->client, reg, val); in dcon_write()
52 static s32 dcon_read(struct dcon_priv *dcon, u8 reg) in dcon_read() argument
54 return i2c_smbus_read_word_data(dcon->client, reg); in dcon_read()
59 static int dcon_hw_init(struct dcon_priv *dcon, int is_init) in dcon_hw_init() argument
64 ver = dcon_read(dcon, DCON_REG_ID); in dcon_hw_init()
73 rc = pdata->init(dcon); in dcon_hw_init()
81 dev_err(&dcon->client->dev, in dcon_hw_init()
88 dcon_write(dcon, 0x3a, 0xc040); in dcon_hw_init()
89 dcon_write(dcon, DCON_REG_MEM_OPT_A, 0x0000); /* clear option bits */ in dcon_hw_init()
90 dcon_write(dcon, DCON_REG_MEM_OPT_A, in dcon_hw_init()
92 dcon_write(dcon, DCON_REG_MEM_OPT_B, MEM_SOFT_RESET); in dcon_hw_init()
96 dcon->disp_mode = MODE_PASSTHRU | MODE_BL_ENABLE | in dcon_hw_init()
99 dcon_write(dcon, DCON_REG_MODE, dcon->disp_mode); in dcon_hw_init()
102 dcon_write(dcon, DCON_REG_SCAN_INT, resumeline); in dcon_hw_init()
117 static int dcon_bus_stabilize(struct dcon_priv *dcon, int is_powered_down) in dcon_bus_stabilize() argument
138 x = dcon_read(dcon, DCON_REG_ID); in dcon_bus_stabilize()
151 return dcon_hw_init(dcon, 0); in dcon_bus_stabilize()
155 static void dcon_set_backlight(struct dcon_priv *dcon, u8 level) in dcon_set_backlight() argument
157 dcon->bl_val = level; in dcon_set_backlight()
158 dcon_write(dcon, DCON_REG_BRIGHT, dcon->bl_val); in dcon_set_backlight()
161 if (dcon->bl_val == 0) { in dcon_set_backlight()
162 dcon->disp_mode &= ~MODE_BL_ENABLE; in dcon_set_backlight()
163 dcon_write(dcon, DCON_REG_MODE, dcon->disp_mode); in dcon_set_backlight()
164 } else if (!(dcon->disp_mode & MODE_BL_ENABLE)) { in dcon_set_backlight()
165 dcon->disp_mode |= MODE_BL_ENABLE; in dcon_set_backlight()
166 dcon_write(dcon, DCON_REG_MODE, dcon->disp_mode); in dcon_set_backlight()
171 static int dcon_set_mono_mode(struct dcon_priv *dcon, bool enable_mono) in dcon_set_mono_mode() argument
173 if (dcon->mono == enable_mono) in dcon_set_mono_mode()
176 dcon->mono = enable_mono; in dcon_set_mono_mode()
179 dcon->disp_mode &= ~(MODE_CSWIZZLE | MODE_COL_AA); in dcon_set_mono_mode()
180 dcon->disp_mode |= MODE_MONO_LUMA; in dcon_set_mono_mode()
182 dcon->disp_mode &= ~(MODE_MONO_LUMA); in dcon_set_mono_mode()
183 dcon->disp_mode |= MODE_CSWIZZLE | MODE_COL_AA; in dcon_set_mono_mode()
186 dcon_write(dcon, DCON_REG_MODE, dcon->disp_mode); in dcon_set_mono_mode()
194 static void dcon_sleep(struct dcon_priv *dcon, bool sleep) in dcon_sleep() argument
200 if (dcon->asleep == sleep) in dcon_sleep()
213 dcon->asleep = sleep; in dcon_sleep()
216 if (dcon->bl_val != 0) in dcon_sleep()
217 dcon->disp_mode |= MODE_BL_ENABLE; in dcon_sleep()
218 x = dcon_bus_stabilize(dcon, 1); in dcon_sleep()
222 dcon->asleep = sleep; in dcon_sleep()
225 dcon_set_backlight(dcon, dcon->bl_val); in dcon_sleep()
236 static void dcon_load_holdoff(struct dcon_priv *dcon) in dcon_load_holdoff() argument
242 delta_t = ktime_sub(now, dcon->load_time); in dcon_load_holdoff()
249 static bool dcon_blank_fb(struct dcon_priv *dcon, bool blank) in dcon_blank_fb() argument
254 lock_fb_info(dcon->fbinfo); in dcon_blank_fb()
256 dcon->ignore_fb_events = true; in dcon_blank_fb()
257 err = fb_blank(dcon->fbinfo, in dcon_blank_fb()
259 dcon->ignore_fb_events = false; in dcon_blank_fb()
260 unlock_fb_info(dcon->fbinfo); in dcon_blank_fb()
264 dev_err(&dcon->client->dev, "couldn't %sblank framebuffer\n", in dcon_blank_fb()
274 struct dcon_priv *dcon = container_of(work, struct dcon_priv, in dcon_source_switch() local
276 int source = dcon->pending_src; in dcon_source_switch()
278 if (dcon->curr_src == source) in dcon_source_switch()
281 dcon_load_holdoff(dcon); in dcon_source_switch()
283 dcon->switched = false; in dcon_source_switch()
289 if (dcon_write(dcon, DCON_REG_MODE, in dcon_source_switch()
290 dcon->disp_mode | MODE_SCAN_INT)) in dcon_source_switch()
294 wait_event_timeout(dcon->waitq, dcon->switched, HZ); in dcon_source_switch()
296 if (!dcon->switched) in dcon_source_switch()
300 if (dcon_write(dcon, DCON_REG_MODE, dcon->disp_mode)) in dcon_source_switch()
311 if (!dcon_blank_fb(dcon, false)) { in dcon_source_switch()
313 dcon->pending_src = DCON_SOURCE_DCON; in dcon_source_switch()
319 dcon->load_time = ktime_get(); in dcon_source_switch()
331 dcon->load_time = ktime_get(); in dcon_source_switch()
333 wait_event_timeout(dcon->waitq, dcon->switched, HZ / 2); in dcon_source_switch()
335 if (!dcon->switched) { in dcon_source_switch()
349 delta_t = ktime_sub(dcon->irq_time, dcon->load_time); in dcon_source_switch()
350 if (dcon->switched && ktime_to_ns(delta_t) in dcon_source_switch()
356 dcon->load_time = ktime_get(); in dcon_source_switch()
361 dcon_blank_fb(dcon, true); in dcon_source_switch()
369 dcon->curr_src = source; in dcon_source_switch()
372 static void dcon_set_source(struct dcon_priv *dcon, int arg) in dcon_set_source() argument
374 if (dcon->pending_src == arg) in dcon_set_source()
377 dcon->pending_src = arg; in dcon_set_source()
379 if (dcon->curr_src != arg) in dcon_set_source()
380 schedule_work(&dcon->switch_source); in dcon_set_source()
383 static void dcon_set_source_sync(struct dcon_priv *dcon, int arg) in dcon_set_source_sync() argument
385 dcon_set_source(dcon, arg); in dcon_set_source_sync()
386 flush_work(&dcon->switch_source); in dcon_set_source_sync()
393 struct dcon_priv *dcon = dev_get_drvdata(dev); in dcon_mode_show() local
395 return sprintf(buf, "%4.4X\n", dcon->disp_mode); in dcon_mode_show()
402 struct dcon_priv *dcon = dev_get_drvdata(dev); in dcon_sleep_show() local
404 return sprintf(buf, "%d\n", dcon->asleep); in dcon_sleep_show()
411 struct dcon_priv *dcon = dev_get_drvdata(dev); in dcon_freeze_show() local
413 return sprintf(buf, "%d\n", dcon->curr_src == DCON_SOURCE_DCON ? 1 : 0); in dcon_freeze_show()
420 struct dcon_priv *dcon = dev_get_drvdata(dev); in dcon_mono_show() local
422 return sprintf(buf, "%d\n", dcon->mono); in dcon_mono_show()
452 struct dcon_priv *dcon = dev_get_drvdata(dev); in dcon_freeze_store() local
462 dcon_set_source(dcon, DCON_SOURCE_CPU); in dcon_freeze_store()
465 dcon_set_source_sync(dcon, DCON_SOURCE_DCON); in dcon_freeze_store()
468 dcon_set_source(dcon, DCON_SOURCE_DCON); in dcon_freeze_store()
519 struct dcon_priv *dcon = bl_get_data(dev); in dcon_bl_update() local
522 if (level != dcon->bl_val) in dcon_bl_update()
523 dcon_set_backlight(dcon, level); in dcon_bl_update()
526 if (!dcon->ignore_fb_events) in dcon_bl_update()
527 dcon_sleep(dcon, !!(dev->props.state & BL_CORE_FBBLANK)); in dcon_bl_update()
534 struct dcon_priv *dcon = bl_get_data(dev); in dcon_bl_get() local
536 return dcon->bl_val; in dcon_bl_get()
553 struct dcon_priv *dcon = container_of(nb, struct dcon_priv, reboot_nb); in dcon_reboot_notify() local
555 if (!dcon || !dcon->client) in dcon_reboot_notify()
559 dcon_write(dcon, DCON_REG_MODE, 0x39); in dcon_reboot_notify()
560 dcon_write(dcon, DCON_REG_MODE, 0x32); in dcon_reboot_notify()
584 struct dcon_priv *dcon; in dcon_probe() local
590 dcon = kzalloc(sizeof(*dcon), GFP_KERNEL); in dcon_probe()
591 if (!dcon) in dcon_probe()
594 dcon->client = client; in dcon_probe()
595 init_waitqueue_head(&dcon->waitq); in dcon_probe()
596 INIT_WORK(&dcon->switch_source, dcon_source_switch); in dcon_probe()
597 dcon->reboot_nb.notifier_call = dcon_reboot_notify; in dcon_probe()
598 dcon->reboot_nb.priority = -1; in dcon_probe()
600 i2c_set_clientdata(client, dcon); in dcon_probe()
607 dcon->fbinfo = registered_fb[0]; in dcon_probe()
609 rc = dcon_hw_init(dcon, 1); in dcon_probe()
623 platform_set_drvdata(dcon_device, dcon); in dcon_probe()
639 dcon->bl_val = dcon_read(dcon, DCON_REG_BRIGHT) & 0x0F; in dcon_probe()
642 dcon_bl_props.brightness = dcon->bl_val; in dcon_probe()
643 dcon->bl_dev = backlight_device_register("dcon-bl", &dcon_device->dev, in dcon_probe()
644 dcon, &dcon_bl_ops, in dcon_probe()
646 if (IS_ERR(dcon->bl_dev)) { in dcon_probe()
648 PTR_ERR(dcon->bl_dev)); in dcon_probe()
649 dcon->bl_dev = NULL; in dcon_probe()
652 register_reboot_notifier(&dcon->reboot_nb); in dcon_probe()
665 free_irq(DCON_IRQ, dcon); in dcon_probe()
667 kfree(dcon); in dcon_probe()
673 struct dcon_priv *dcon = i2c_get_clientdata(client); in dcon_remove() local
675 unregister_reboot_notifier(&dcon->reboot_nb); in dcon_remove()
678 free_irq(DCON_IRQ, dcon); in dcon_remove()
680 backlight_device_unregister(dcon->bl_dev); in dcon_remove()
684 cancel_work_sync(&dcon->switch_source); in dcon_remove()
686 kfree(dcon); in dcon_remove()
693 struct dcon_priv *dcon = i2c_get_clientdata(client); in dcon_suspend() local
695 if (!dcon->asleep) { in dcon_suspend()
697 dcon_set_source_sync(dcon, DCON_SOURCE_DCON); in dcon_suspend()
706 struct dcon_priv *dcon = i2c_get_clientdata(client); in dcon_resume() local
708 if (!dcon->asleep) { in dcon_resume()
709 dcon_bus_stabilize(dcon, 0); in dcon_resume()
710 dcon_set_source(dcon, DCON_SOURCE_CPU); in dcon_resume()
725 struct dcon_priv *dcon = id; in dcon_interrupt() local
738 dcon->switched = true; in dcon_interrupt()
739 dcon->irq_time = ktime_get(); in dcon_interrupt()
740 wake_up(&dcon->waitq); in dcon_interrupt()
751 if (dcon->curr_src != dcon->pending_src && !dcon->switched) { in dcon_interrupt()
752 dcon->switched = true; in dcon_interrupt()
753 dcon->irq_time = ktime_get(); in dcon_interrupt()
754 wake_up(&dcon->waitq); in dcon_interrupt()