1/*
2 * Generic DSI Command Mode panel driver
3 *
4 * Copyright (C) 2013 Texas Instruments
5 * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published by
9 * the Free Software Foundation.
10 */
11
12/* #define DEBUG */
13
14#include <linux/backlight.h>
15#include <linux/delay.h>
16#include <linux/fb.h>
17#include <linux/gpio.h>
18#include <linux/interrupt.h>
19#include <linux/jiffies.h>
20#include <linux/module.h>
21#include <linux/platform_device.h>
22#include <linux/sched.h>
23#include <linux/slab.h>
24#include <linux/workqueue.h>
25#include <linux/of_device.h>
26#include <linux/of_gpio.h>
27
28#include <video/omapdss.h>
29#include <video/omap-panel-data.h>
30#include <video/mipi_display.h>
31
32/* DSI Virtual channel. Hardcoded for now. */
33#define TCH 0
34
35#define DCS_READ_NUM_ERRORS	0x05
36#define DCS_BRIGHTNESS		0x51
37#define DCS_CTRL_DISPLAY	0x53
38#define DCS_GET_ID1		0xda
39#define DCS_GET_ID2		0xdb
40#define DCS_GET_ID3		0xdc
41
42struct panel_drv_data {
43	struct omap_dss_device dssdev;
44	struct omap_dss_device *in;
45
46	struct omap_video_timings timings;
47
48	struct platform_device *pdev;
49
50	struct mutex lock;
51
52	struct backlight_device *bldev;
53
54	unsigned long	hw_guard_end;	/* next value of jiffies when we can
55					 * issue the next sleep in/out command
56					 */
57	unsigned long	hw_guard_wait;	/* max guard time in jiffies */
58
59	/* panel HW configuration from DT or platform data */
60	int reset_gpio;
61	int ext_te_gpio;
62
63	bool use_dsi_backlight;
64
65	struct omap_dsi_pin_config pin_config;
66
67	/* runtime variables */
68	bool enabled;
69
70	bool te_enabled;
71
72	atomic_t do_update;
73	int channel;
74
75	struct delayed_work te_timeout_work;
76
77	bool intro_printed;
78
79	struct workqueue_struct *workqueue;
80
81	bool ulps_enabled;
82	unsigned ulps_timeout;
83	struct delayed_work ulps_work;
84};
85
86#define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
87
88static irqreturn_t dsicm_te_isr(int irq, void *data);
89static void dsicm_te_timeout_work_callback(struct work_struct *work);
90static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable);
91
92static int dsicm_panel_reset(struct panel_drv_data *ddata);
93
94static void dsicm_ulps_work(struct work_struct *work);
95
96static void hw_guard_start(struct panel_drv_data *ddata, int guard_msec)
97{
98	ddata->hw_guard_wait = msecs_to_jiffies(guard_msec);
99	ddata->hw_guard_end = jiffies + ddata->hw_guard_wait;
100}
101
102static void hw_guard_wait(struct panel_drv_data *ddata)
103{
104	unsigned long wait = ddata->hw_guard_end - jiffies;
105
106	if ((long)wait > 0 && wait <= ddata->hw_guard_wait) {
107		set_current_state(TASK_UNINTERRUPTIBLE);
108		schedule_timeout(wait);
109	}
110}
111
112static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
113{
114	struct omap_dss_device *in = ddata->in;
115	int r;
116	u8 buf[1];
117
118	r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
119
120	if (r < 0)
121		return r;
122
123	*data = buf[0];
124
125	return 0;
126}
127
128static int dsicm_dcs_write_0(struct panel_drv_data *ddata, u8 dcs_cmd)
129{
130	struct omap_dss_device *in = ddata->in;
131	return in->ops.dsi->dcs_write(in, ddata->channel, &dcs_cmd, 1);
132}
133
134static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
135{
136	struct omap_dss_device *in = ddata->in;
137	u8 buf[2] = { dcs_cmd, param };
138
139	return in->ops.dsi->dcs_write(in, ddata->channel, buf, 2);
140}
141
142static int dsicm_sleep_in(struct panel_drv_data *ddata)
143
144{
145	struct omap_dss_device *in = ddata->in;
146	u8 cmd;
147	int r;
148
149	hw_guard_wait(ddata);
150
151	cmd = MIPI_DCS_ENTER_SLEEP_MODE;
152	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, &cmd, 1);
153	if (r)
154		return r;
155
156	hw_guard_start(ddata, 120);
157
158	usleep_range(5000, 10000);
159
160	return 0;
161}
162
163static int dsicm_sleep_out(struct panel_drv_data *ddata)
164{
165	int r;
166
167	hw_guard_wait(ddata);
168
169	r = dsicm_dcs_write_0(ddata, MIPI_DCS_EXIT_SLEEP_MODE);
170	if (r)
171		return r;
172
173	hw_guard_start(ddata, 120);
174
175	usleep_range(5000, 10000);
176
177	return 0;
178}
179
180static int dsicm_get_id(struct panel_drv_data *ddata, u8 *id1, u8 *id2, u8 *id3)
181{
182	int r;
183
184	r = dsicm_dcs_read_1(ddata, DCS_GET_ID1, id1);
185	if (r)
186		return r;
187	r = dsicm_dcs_read_1(ddata, DCS_GET_ID2, id2);
188	if (r)
189		return r;
190	r = dsicm_dcs_read_1(ddata, DCS_GET_ID3, id3);
191	if (r)
192		return r;
193
194	return 0;
195}
196
197static int dsicm_set_update_window(struct panel_drv_data *ddata,
198		u16 x, u16 y, u16 w, u16 h)
199{
200	struct omap_dss_device *in = ddata->in;
201	int r;
202	u16 x1 = x;
203	u16 x2 = x + w - 1;
204	u16 y1 = y;
205	u16 y2 = y + h - 1;
206
207	u8 buf[5];
208	buf[0] = MIPI_DCS_SET_COLUMN_ADDRESS;
209	buf[1] = (x1 >> 8) & 0xff;
210	buf[2] = (x1 >> 0) & 0xff;
211	buf[3] = (x2 >> 8) & 0xff;
212	buf[4] = (x2 >> 0) & 0xff;
213
214	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
215	if (r)
216		return r;
217
218	buf[0] = MIPI_DCS_SET_PAGE_ADDRESS;
219	buf[1] = (y1 >> 8) & 0xff;
220	buf[2] = (y1 >> 0) & 0xff;
221	buf[3] = (y2 >> 8) & 0xff;
222	buf[4] = (y2 >> 0) & 0xff;
223
224	r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
225	if (r)
226		return r;
227
228	in->ops.dsi->bta_sync(in, ddata->channel);
229
230	return r;
231}
232
233static void dsicm_queue_ulps_work(struct panel_drv_data *ddata)
234{
235	if (ddata->ulps_timeout > 0)
236		queue_delayed_work(ddata->workqueue, &ddata->ulps_work,
237				msecs_to_jiffies(ddata->ulps_timeout));
238}
239
240static void dsicm_cancel_ulps_work(struct panel_drv_data *ddata)
241{
242	cancel_delayed_work(&ddata->ulps_work);
243}
244
245static int dsicm_enter_ulps(struct panel_drv_data *ddata)
246{
247	struct omap_dss_device *in = ddata->in;
248	int r;
249
250	if (ddata->ulps_enabled)
251		return 0;
252
253	dsicm_cancel_ulps_work(ddata);
254
255	r = _dsicm_enable_te(ddata, false);
256	if (r)
257		goto err;
258
259	if (gpio_is_valid(ddata->ext_te_gpio))
260		disable_irq(gpio_to_irq(ddata->ext_te_gpio));
261
262	in->ops.dsi->disable(in, false, true);
263
264	ddata->ulps_enabled = true;
265
266	return 0;
267
268err:
269	dev_err(&ddata->pdev->dev, "enter ULPS failed");
270	dsicm_panel_reset(ddata);
271
272	ddata->ulps_enabled = false;
273
274	dsicm_queue_ulps_work(ddata);
275
276	return r;
277}
278
279static int dsicm_exit_ulps(struct panel_drv_data *ddata)
280{
281	struct omap_dss_device *in = ddata->in;
282	int r;
283
284	if (!ddata->ulps_enabled)
285		return 0;
286
287	r = in->ops.dsi->enable(in);
288	if (r) {
289		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
290		goto err1;
291	}
292
293	in->ops.dsi->enable_hs(in, ddata->channel, true);
294
295	r = _dsicm_enable_te(ddata, true);
296	if (r) {
297		dev_err(&ddata->pdev->dev, "failed to re-enable TE");
298		goto err2;
299	}
300
301	if (gpio_is_valid(ddata->ext_te_gpio))
302		enable_irq(gpio_to_irq(ddata->ext_te_gpio));
303
304	dsicm_queue_ulps_work(ddata);
305
306	ddata->ulps_enabled = false;
307
308	return 0;
309
310err2:
311	dev_err(&ddata->pdev->dev, "failed to exit ULPS");
312
313	r = dsicm_panel_reset(ddata);
314	if (!r) {
315		if (gpio_is_valid(ddata->ext_te_gpio))
316			enable_irq(gpio_to_irq(ddata->ext_te_gpio));
317		ddata->ulps_enabled = false;
318	}
319err1:
320	dsicm_queue_ulps_work(ddata);
321
322	return r;
323}
324
325static int dsicm_wake_up(struct panel_drv_data *ddata)
326{
327	if (ddata->ulps_enabled)
328		return dsicm_exit_ulps(ddata);
329
330	dsicm_cancel_ulps_work(ddata);
331	dsicm_queue_ulps_work(ddata);
332	return 0;
333}
334
335static int dsicm_bl_update_status(struct backlight_device *dev)
336{
337	struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
338	struct omap_dss_device *in = ddata->in;
339	int r;
340	int level;
341
342	if (dev->props.fb_blank == FB_BLANK_UNBLANK &&
343			dev->props.power == FB_BLANK_UNBLANK)
344		level = dev->props.brightness;
345	else
346		level = 0;
347
348	dev_dbg(&ddata->pdev->dev, "update brightness to %d\n", level);
349
350	mutex_lock(&ddata->lock);
351
352	if (ddata->enabled) {
353		in->ops.dsi->bus_lock(in);
354
355		r = dsicm_wake_up(ddata);
356		if (!r)
357			r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
358
359		in->ops.dsi->bus_unlock(in);
360	} else {
361		r = 0;
362	}
363
364	mutex_unlock(&ddata->lock);
365
366	return r;
367}
368
369static int dsicm_bl_get_intensity(struct backlight_device *dev)
370{
371	if (dev->props.fb_blank == FB_BLANK_UNBLANK &&
372			dev->props.power == FB_BLANK_UNBLANK)
373		return dev->props.brightness;
374
375	return 0;
376}
377
378static const struct backlight_ops dsicm_bl_ops = {
379	.get_brightness = dsicm_bl_get_intensity,
380	.update_status  = dsicm_bl_update_status,
381};
382
383static void dsicm_get_resolution(struct omap_dss_device *dssdev,
384		u16 *xres, u16 *yres)
385{
386	*xres = dssdev->panel.timings.x_res;
387	*yres = dssdev->panel.timings.y_res;
388}
389
390static ssize_t dsicm_num_errors_show(struct device *dev,
391		struct device_attribute *attr, char *buf)
392{
393	struct platform_device *pdev = to_platform_device(dev);
394	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
395	struct omap_dss_device *in = ddata->in;
396	u8 errors = 0;
397	int r;
398
399	mutex_lock(&ddata->lock);
400
401	if (ddata->enabled) {
402		in->ops.dsi->bus_lock(in);
403
404		r = dsicm_wake_up(ddata);
405		if (!r)
406			r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
407					&errors);
408
409		in->ops.dsi->bus_unlock(in);
410	} else {
411		r = -ENODEV;
412	}
413
414	mutex_unlock(&ddata->lock);
415
416	if (r)
417		return r;
418
419	return snprintf(buf, PAGE_SIZE, "%d\n", errors);
420}
421
422static ssize_t dsicm_hw_revision_show(struct device *dev,
423		struct device_attribute *attr, char *buf)
424{
425	struct platform_device *pdev = to_platform_device(dev);
426	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
427	struct omap_dss_device *in = ddata->in;
428	u8 id1, id2, id3;
429	int r;
430
431	mutex_lock(&ddata->lock);
432
433	if (ddata->enabled) {
434		in->ops.dsi->bus_lock(in);
435
436		r = dsicm_wake_up(ddata);
437		if (!r)
438			r = dsicm_get_id(ddata, &id1, &id2, &id3);
439
440		in->ops.dsi->bus_unlock(in);
441	} else {
442		r = -ENODEV;
443	}
444
445	mutex_unlock(&ddata->lock);
446
447	if (r)
448		return r;
449
450	return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x\n", id1, id2, id3);
451}
452
453static ssize_t dsicm_store_ulps(struct device *dev,
454		struct device_attribute *attr,
455		const char *buf, size_t count)
456{
457	struct platform_device *pdev = to_platform_device(dev);
458	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
459	struct omap_dss_device *in = ddata->in;
460	unsigned long t;
461	int r;
462
463	r = kstrtoul(buf, 0, &t);
464	if (r)
465		return r;
466
467	mutex_lock(&ddata->lock);
468
469	if (ddata->enabled) {
470		in->ops.dsi->bus_lock(in);
471
472		if (t)
473			r = dsicm_enter_ulps(ddata);
474		else
475			r = dsicm_wake_up(ddata);
476
477		in->ops.dsi->bus_unlock(in);
478	}
479
480	mutex_unlock(&ddata->lock);
481
482	if (r)
483		return r;
484
485	return count;
486}
487
488static ssize_t dsicm_show_ulps(struct device *dev,
489		struct device_attribute *attr,
490		char *buf)
491{
492	struct platform_device *pdev = to_platform_device(dev);
493	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
494	unsigned t;
495
496	mutex_lock(&ddata->lock);
497	t = ddata->ulps_enabled;
498	mutex_unlock(&ddata->lock);
499
500	return snprintf(buf, PAGE_SIZE, "%u\n", t);
501}
502
503static ssize_t dsicm_store_ulps_timeout(struct device *dev,
504		struct device_attribute *attr,
505		const char *buf, size_t count)
506{
507	struct platform_device *pdev = to_platform_device(dev);
508	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
509	struct omap_dss_device *in = ddata->in;
510	unsigned long t;
511	int r;
512
513	r = kstrtoul(buf, 0, &t);
514	if (r)
515		return r;
516
517	mutex_lock(&ddata->lock);
518	ddata->ulps_timeout = t;
519
520	if (ddata->enabled) {
521		/* dsicm_wake_up will restart the timer */
522		in->ops.dsi->bus_lock(in);
523		r = dsicm_wake_up(ddata);
524		in->ops.dsi->bus_unlock(in);
525	}
526
527	mutex_unlock(&ddata->lock);
528
529	if (r)
530		return r;
531
532	return count;
533}
534
535static ssize_t dsicm_show_ulps_timeout(struct device *dev,
536		struct device_attribute *attr,
537		char *buf)
538{
539	struct platform_device *pdev = to_platform_device(dev);
540	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
541	unsigned t;
542
543	mutex_lock(&ddata->lock);
544	t = ddata->ulps_timeout;
545	mutex_unlock(&ddata->lock);
546
547	return snprintf(buf, PAGE_SIZE, "%u\n", t);
548}
549
550static DEVICE_ATTR(num_dsi_errors, S_IRUGO, dsicm_num_errors_show, NULL);
551static DEVICE_ATTR(hw_revision, S_IRUGO, dsicm_hw_revision_show, NULL);
552static DEVICE_ATTR(ulps, S_IRUGO | S_IWUSR,
553		dsicm_show_ulps, dsicm_store_ulps);
554static DEVICE_ATTR(ulps_timeout, S_IRUGO | S_IWUSR,
555		dsicm_show_ulps_timeout, dsicm_store_ulps_timeout);
556
557static struct attribute *dsicm_attrs[] = {
558	&dev_attr_num_dsi_errors.attr,
559	&dev_attr_hw_revision.attr,
560	&dev_attr_ulps.attr,
561	&dev_attr_ulps_timeout.attr,
562	NULL,
563};
564
565static struct attribute_group dsicm_attr_group = {
566	.attrs = dsicm_attrs,
567};
568
569static void dsicm_hw_reset(struct panel_drv_data *ddata)
570{
571	if (!gpio_is_valid(ddata->reset_gpio))
572		return;
573
574	gpio_set_value(ddata->reset_gpio, 1);
575	udelay(10);
576	/* reset the panel */
577	gpio_set_value(ddata->reset_gpio, 0);
578	/* assert reset */
579	udelay(10);
580	gpio_set_value(ddata->reset_gpio, 1);
581	/* wait after releasing reset */
582	usleep_range(5000, 10000);
583}
584
585static int dsicm_power_on(struct panel_drv_data *ddata)
586{
587	struct omap_dss_device *in = ddata->in;
588	u8 id1, id2, id3;
589	int r;
590	struct omap_dss_dsi_config dsi_config = {
591		.mode = OMAP_DSS_DSI_CMD_MODE,
592		.pixel_format = OMAP_DSS_DSI_FMT_RGB888,
593		.timings = &ddata->timings,
594		.hs_clk_min = 150000000,
595		.hs_clk_max = 300000000,
596		.lp_clk_min = 7000000,
597		.lp_clk_max = 10000000,
598	};
599
600	if (ddata->pin_config.num_pins > 0) {
601		r = in->ops.dsi->configure_pins(in, &ddata->pin_config);
602		if (r) {
603			dev_err(&ddata->pdev->dev,
604				"failed to configure DSI pins\n");
605			goto err0;
606		}
607	}
608
609	r = in->ops.dsi->set_config(in, &dsi_config);
610	if (r) {
611		dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
612		goto err0;
613	}
614
615	r = in->ops.dsi->enable(in);
616	if (r) {
617		dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
618		goto err0;
619	}
620
621	dsicm_hw_reset(ddata);
622
623	in->ops.dsi->enable_hs(in, ddata->channel, false);
624
625	r = dsicm_sleep_out(ddata);
626	if (r)
627		goto err;
628
629	r = dsicm_get_id(ddata, &id1, &id2, &id3);
630	if (r)
631		goto err;
632
633	r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, 0xff);
634	if (r)
635		goto err;
636
637	r = dsicm_dcs_write_1(ddata, DCS_CTRL_DISPLAY,
638			(1<<2) | (1<<5));	/* BL | BCTRL */
639	if (r)
640		goto err;
641
642	r = dsicm_dcs_write_1(ddata, MIPI_DCS_SET_PIXEL_FORMAT,
643		MIPI_DCS_PIXEL_FMT_24BIT);
644	if (r)
645		goto err;
646
647	r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_ON);
648	if (r)
649		goto err;
650
651	r = _dsicm_enable_te(ddata, ddata->te_enabled);
652	if (r)
653		goto err;
654
655	r = in->ops.dsi->enable_video_output(in, ddata->channel);
656	if (r)
657		goto err;
658
659	ddata->enabled = 1;
660
661	if (!ddata->intro_printed) {
662		dev_info(&ddata->pdev->dev, "panel revision %02x.%02x.%02x\n",
663			id1, id2, id3);
664		ddata->intro_printed = true;
665	}
666
667	in->ops.dsi->enable_hs(in, ddata->channel, true);
668
669	return 0;
670err:
671	dev_err(&ddata->pdev->dev, "error while enabling panel, issuing HW reset\n");
672
673	dsicm_hw_reset(ddata);
674
675	in->ops.dsi->disable(in, true, false);
676err0:
677	return r;
678}
679
680static void dsicm_power_off(struct panel_drv_data *ddata)
681{
682	struct omap_dss_device *in = ddata->in;
683	int r;
684
685	in->ops.dsi->disable_video_output(in, ddata->channel);
686
687	r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_OFF);
688	if (!r)
689		r = dsicm_sleep_in(ddata);
690
691	if (r) {
692		dev_err(&ddata->pdev->dev,
693				"error disabling panel, issuing HW reset\n");
694		dsicm_hw_reset(ddata);
695	}
696
697	in->ops.dsi->disable(in, true, false);
698
699	ddata->enabled = 0;
700}
701
702static int dsicm_panel_reset(struct panel_drv_data *ddata)
703{
704	dev_err(&ddata->pdev->dev, "performing LCD reset\n");
705
706	dsicm_power_off(ddata);
707	dsicm_hw_reset(ddata);
708	return dsicm_power_on(ddata);
709}
710
711static int dsicm_connect(struct omap_dss_device *dssdev)
712{
713	struct panel_drv_data *ddata = to_panel_data(dssdev);
714	struct omap_dss_device *in = ddata->in;
715	struct device *dev = &ddata->pdev->dev;
716	int r;
717
718	if (omapdss_device_is_connected(dssdev))
719		return 0;
720
721	r = in->ops.dsi->connect(in, dssdev);
722	if (r) {
723		dev_err(dev, "Failed to connect to video source\n");
724		return r;
725	}
726
727	r = in->ops.dsi->request_vc(ddata->in, &ddata->channel);
728	if (r) {
729		dev_err(dev, "failed to get virtual channel\n");
730		goto err_req_vc;
731	}
732
733	r = in->ops.dsi->set_vc_id(ddata->in, ddata->channel, TCH);
734	if (r) {
735		dev_err(dev, "failed to set VC_ID\n");
736		goto err_vc_id;
737	}
738
739	return 0;
740
741err_vc_id:
742	in->ops.dsi->release_vc(ddata->in, ddata->channel);
743err_req_vc:
744	in->ops.dsi->disconnect(in, dssdev);
745	return r;
746}
747
748static void dsicm_disconnect(struct omap_dss_device *dssdev)
749{
750	struct panel_drv_data *ddata = to_panel_data(dssdev);
751	struct omap_dss_device *in = ddata->in;
752
753	if (!omapdss_device_is_connected(dssdev))
754		return;
755
756	in->ops.dsi->release_vc(in, ddata->channel);
757	in->ops.dsi->disconnect(in, dssdev);
758}
759
760static int dsicm_enable(struct omap_dss_device *dssdev)
761{
762	struct panel_drv_data *ddata = to_panel_data(dssdev);
763	struct omap_dss_device *in = ddata->in;
764	int r;
765
766	dev_dbg(&ddata->pdev->dev, "enable\n");
767
768	mutex_lock(&ddata->lock);
769
770	if (!omapdss_device_is_connected(dssdev)) {
771		r = -ENODEV;
772		goto err;
773	}
774
775	if (omapdss_device_is_enabled(dssdev)) {
776		r = 0;
777		goto err;
778	}
779
780	in->ops.dsi->bus_lock(in);
781
782	r = dsicm_power_on(ddata);
783
784	in->ops.dsi->bus_unlock(in);
785
786	if (r)
787		goto err;
788
789	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
790
791	mutex_unlock(&ddata->lock);
792
793	return 0;
794err:
795	dev_dbg(&ddata->pdev->dev, "enable failed\n");
796	mutex_unlock(&ddata->lock);
797	return r;
798}
799
800static void dsicm_disable(struct omap_dss_device *dssdev)
801{
802	struct panel_drv_data *ddata = to_panel_data(dssdev);
803	struct omap_dss_device *in = ddata->in;
804	int r;
805
806	dev_dbg(&ddata->pdev->dev, "disable\n");
807
808	mutex_lock(&ddata->lock);
809
810	dsicm_cancel_ulps_work(ddata);
811
812	in->ops.dsi->bus_lock(in);
813
814	if (omapdss_device_is_enabled(dssdev)) {
815		r = dsicm_wake_up(ddata);
816		if (!r)
817			dsicm_power_off(ddata);
818	}
819
820	in->ops.dsi->bus_unlock(in);
821
822	dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
823
824	mutex_unlock(&ddata->lock);
825}
826
827static void dsicm_framedone_cb(int err, void *data)
828{
829	struct panel_drv_data *ddata = data;
830	struct omap_dss_device *in = ddata->in;
831
832	dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
833	in->ops.dsi->bus_unlock(ddata->in);
834}
835
836static irqreturn_t dsicm_te_isr(int irq, void *data)
837{
838	struct panel_drv_data *ddata = data;
839	struct omap_dss_device *in = ddata->in;
840	int old;
841	int r;
842
843	old = atomic_cmpxchg(&ddata->do_update, 1, 0);
844
845	if (old) {
846		cancel_delayed_work(&ddata->te_timeout_work);
847
848		r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
849				ddata);
850		if (r)
851			goto err;
852	}
853
854	return IRQ_HANDLED;
855err:
856	dev_err(&ddata->pdev->dev, "start update failed\n");
857	in->ops.dsi->bus_unlock(in);
858	return IRQ_HANDLED;
859}
860
861static void dsicm_te_timeout_work_callback(struct work_struct *work)
862{
863	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
864					te_timeout_work.work);
865	struct omap_dss_device *in = ddata->in;
866
867	dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
868
869	atomic_set(&ddata->do_update, 0);
870	in->ops.dsi->bus_unlock(in);
871}
872
873static int dsicm_update(struct omap_dss_device *dssdev,
874				    u16 x, u16 y, u16 w, u16 h)
875{
876	struct panel_drv_data *ddata = to_panel_data(dssdev);
877	struct omap_dss_device *in = ddata->in;
878	int r;
879
880	dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
881
882	mutex_lock(&ddata->lock);
883	in->ops.dsi->bus_lock(in);
884
885	r = dsicm_wake_up(ddata);
886	if (r)
887		goto err;
888
889	if (!ddata->enabled) {
890		r = 0;
891		goto err;
892	}
893
894	/* XXX no need to send this every frame, but dsi break if not done */
895	r = dsicm_set_update_window(ddata, 0, 0,
896			dssdev->panel.timings.x_res,
897			dssdev->panel.timings.y_res);
898	if (r)
899		goto err;
900
901	if (ddata->te_enabled && gpio_is_valid(ddata->ext_te_gpio)) {
902		schedule_delayed_work(&ddata->te_timeout_work,
903				msecs_to_jiffies(250));
904		atomic_set(&ddata->do_update, 1);
905	} else {
906		r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
907				ddata);
908		if (r)
909			goto err;
910	}
911
912	/* note: no bus_unlock here. unlock is in framedone_cb */
913	mutex_unlock(&ddata->lock);
914	return 0;
915err:
916	in->ops.dsi->bus_unlock(in);
917	mutex_unlock(&ddata->lock);
918	return r;
919}
920
921static int dsicm_sync(struct omap_dss_device *dssdev)
922{
923	struct panel_drv_data *ddata = to_panel_data(dssdev);
924	struct omap_dss_device *in = ddata->in;
925
926	dev_dbg(&ddata->pdev->dev, "sync\n");
927
928	mutex_lock(&ddata->lock);
929	in->ops.dsi->bus_lock(in);
930	in->ops.dsi->bus_unlock(in);
931	mutex_unlock(&ddata->lock);
932
933	dev_dbg(&ddata->pdev->dev, "sync done\n");
934
935	return 0;
936}
937
938static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
939{
940	struct omap_dss_device *in = ddata->in;
941	int r;
942
943	if (enable)
944		r = dsicm_dcs_write_1(ddata, MIPI_DCS_SET_TEAR_ON, 0);
945	else
946		r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
947
948	if (!gpio_is_valid(ddata->ext_te_gpio))
949		in->ops.dsi->enable_te(in, enable);
950
951	/* possible panel bug */
952	msleep(100);
953
954	return r;
955}
956
957static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
958{
959	struct panel_drv_data *ddata = to_panel_data(dssdev);
960	struct omap_dss_device *in = ddata->in;
961	int r;
962
963	mutex_lock(&ddata->lock);
964
965	if (ddata->te_enabled == enable)
966		goto end;
967
968	in->ops.dsi->bus_lock(in);
969
970	if (ddata->enabled) {
971		r = dsicm_wake_up(ddata);
972		if (r)
973			goto err;
974
975		r = _dsicm_enable_te(ddata, enable);
976		if (r)
977			goto err;
978	}
979
980	ddata->te_enabled = enable;
981
982	in->ops.dsi->bus_unlock(in);
983end:
984	mutex_unlock(&ddata->lock);
985
986	return 0;
987err:
988	in->ops.dsi->bus_unlock(in);
989	mutex_unlock(&ddata->lock);
990
991	return r;
992}
993
994static int dsicm_get_te(struct omap_dss_device *dssdev)
995{
996	struct panel_drv_data *ddata = to_panel_data(dssdev);
997	int r;
998
999	mutex_lock(&ddata->lock);
1000	r = ddata->te_enabled;
1001	mutex_unlock(&ddata->lock);
1002
1003	return r;
1004}
1005
1006static int dsicm_memory_read(struct omap_dss_device *dssdev,
1007		void *buf, size_t size,
1008		u16 x, u16 y, u16 w, u16 h)
1009{
1010	struct panel_drv_data *ddata = to_panel_data(dssdev);
1011	struct omap_dss_device *in = ddata->in;
1012	int r;
1013	int first = 1;
1014	int plen;
1015	unsigned buf_used = 0;
1016
1017	if (size < w * h * 3)
1018		return -ENOMEM;
1019
1020	mutex_lock(&ddata->lock);
1021
1022	if (!ddata->enabled) {
1023		r = -ENODEV;
1024		goto err1;
1025	}
1026
1027	size = min(w * h * 3,
1028			dssdev->panel.timings.x_res *
1029			dssdev->panel.timings.y_res * 3);
1030
1031	in->ops.dsi->bus_lock(in);
1032
1033	r = dsicm_wake_up(ddata);
1034	if (r)
1035		goto err2;
1036
1037	/* plen 1 or 2 goes into short packet. until checksum error is fixed,
1038	 * use short packets. plen 32 works, but bigger packets seem to cause
1039	 * an error. */
1040	if (size % 2)
1041		plen = 1;
1042	else
1043		plen = 2;
1044
1045	dsicm_set_update_window(ddata, x, y, w, h);
1046
1047	r = in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, plen);
1048	if (r)
1049		goto err2;
1050
1051	while (buf_used < size) {
1052		u8 dcs_cmd = first ? 0x2e : 0x3e;
1053		first = 0;
1054
1055		r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd,
1056				buf + buf_used, size - buf_used);
1057
1058		if (r < 0) {
1059			dev_err(dssdev->dev, "read error\n");
1060			goto err3;
1061		}
1062
1063		buf_used += r;
1064
1065		if (r < plen) {
1066			dev_err(&ddata->pdev->dev, "short read\n");
1067			break;
1068		}
1069
1070		if (signal_pending(current)) {
1071			dev_err(&ddata->pdev->dev, "signal pending, "
1072					"aborting memory read\n");
1073			r = -ERESTARTSYS;
1074			goto err3;
1075		}
1076	}
1077
1078	r = buf_used;
1079
1080err3:
1081	in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, 1);
1082err2:
1083	in->ops.dsi->bus_unlock(in);
1084err1:
1085	mutex_unlock(&ddata->lock);
1086	return r;
1087}
1088
1089static void dsicm_ulps_work(struct work_struct *work)
1090{
1091	struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
1092			ulps_work.work);
1093	struct omap_dss_device *dssdev = &ddata->dssdev;
1094	struct omap_dss_device *in = ddata->in;
1095
1096	mutex_lock(&ddata->lock);
1097
1098	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || !ddata->enabled) {
1099		mutex_unlock(&ddata->lock);
1100		return;
1101	}
1102
1103	in->ops.dsi->bus_lock(in);
1104
1105	dsicm_enter_ulps(ddata);
1106
1107	in->ops.dsi->bus_unlock(in);
1108	mutex_unlock(&ddata->lock);
1109}
1110
1111static struct omap_dss_driver dsicm_ops = {
1112	.connect	= dsicm_connect,
1113	.disconnect	= dsicm_disconnect,
1114
1115	.enable		= dsicm_enable,
1116	.disable	= dsicm_disable,
1117
1118	.update		= dsicm_update,
1119	.sync		= dsicm_sync,
1120
1121	.get_resolution	= dsicm_get_resolution,
1122	.get_recommended_bpp = omapdss_default_get_recommended_bpp,
1123
1124	.enable_te	= dsicm_enable_te,
1125	.get_te		= dsicm_get_te,
1126
1127	.memory_read	= dsicm_memory_read,
1128};
1129
1130static int dsicm_probe_pdata(struct platform_device *pdev)
1131{
1132	const struct panel_dsicm_platform_data *pdata;
1133	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
1134	struct omap_dss_device *dssdev, *in;
1135
1136	pdata = dev_get_platdata(&pdev->dev);
1137
1138	in = omap_dss_find_output(pdata->source);
1139	if (in == NULL) {
1140		dev_err(&pdev->dev, "failed to find video source\n");
1141		return -EPROBE_DEFER;
1142	}
1143	ddata->in = in;
1144
1145	ddata->reset_gpio = pdata->reset_gpio;
1146
1147	if (pdata->use_ext_te)
1148		ddata->ext_te_gpio = pdata->ext_te_gpio;
1149	else
1150		ddata->ext_te_gpio = -1;
1151
1152	ddata->ulps_timeout = pdata->ulps_timeout;
1153
1154	ddata->use_dsi_backlight = pdata->use_dsi_backlight;
1155
1156	ddata->pin_config = pdata->pin_config;
1157
1158	dssdev = &ddata->dssdev;
1159	dssdev->name = pdata->name;
1160
1161	return 0;
1162}
1163
1164static int dsicm_probe_of(struct platform_device *pdev)
1165{
1166	struct device_node *node = pdev->dev.of_node;
1167	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
1168	struct omap_dss_device *in;
1169	int gpio;
1170
1171	gpio = of_get_named_gpio(node, "reset-gpios", 0);
1172	if (!gpio_is_valid(gpio)) {
1173		dev_err(&pdev->dev, "failed to parse reset gpio\n");
1174		return gpio;
1175	}
1176	ddata->reset_gpio = gpio;
1177
1178	gpio = of_get_named_gpio(node, "te-gpios", 0);
1179	if (gpio_is_valid(gpio) || gpio == -ENOENT) {
1180		ddata->ext_te_gpio = gpio;
1181	} else {
1182		dev_err(&pdev->dev, "failed to parse TE gpio\n");
1183		return gpio;
1184	}
1185
1186	in = omapdss_of_find_source_for_first_ep(node);
1187	if (IS_ERR(in)) {
1188		dev_err(&pdev->dev, "failed to find video source\n");
1189		return PTR_ERR(in);
1190	}
1191
1192	ddata->in = in;
1193
1194	/* TODO: ulps, backlight */
1195
1196	return 0;
1197}
1198
1199static int dsicm_probe(struct platform_device *pdev)
1200{
1201	struct backlight_properties props;
1202	struct panel_drv_data *ddata;
1203	struct backlight_device *bldev = NULL;
1204	struct device *dev = &pdev->dev;
1205	struct omap_dss_device *dssdev;
1206	int r;
1207
1208	dev_dbg(dev, "probe\n");
1209
1210	ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
1211	if (!ddata)
1212		return -ENOMEM;
1213
1214	platform_set_drvdata(pdev, ddata);
1215	ddata->pdev = pdev;
1216
1217	if (dev_get_platdata(dev)) {
1218		r = dsicm_probe_pdata(pdev);
1219		if (r)
1220			return r;
1221	} else if (pdev->dev.of_node) {
1222		r = dsicm_probe_of(pdev);
1223		if (r)
1224			return r;
1225	} else {
1226		return -ENODEV;
1227	}
1228
1229	ddata->timings.x_res = 864;
1230	ddata->timings.y_res = 480;
1231	ddata->timings.pixelclock = 864 * 480 * 60;
1232
1233	dssdev = &ddata->dssdev;
1234	dssdev->dev = dev;
1235	dssdev->driver = &dsicm_ops;
1236	dssdev->panel.timings = ddata->timings;
1237	dssdev->type = OMAP_DISPLAY_TYPE_DSI;
1238	dssdev->owner = THIS_MODULE;
1239
1240	dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888;
1241	dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
1242		OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
1243
1244	r = omapdss_register_display(dssdev);
1245	if (r) {
1246		dev_err(dev, "Failed to register panel\n");
1247		goto err_reg;
1248	}
1249
1250	mutex_init(&ddata->lock);
1251
1252	atomic_set(&ddata->do_update, 0);
1253
1254	if (gpio_is_valid(ddata->reset_gpio)) {
1255		r = devm_gpio_request_one(dev, ddata->reset_gpio,
1256				GPIOF_OUT_INIT_LOW, "taal rst");
1257		if (r) {
1258			dev_err(dev, "failed to request reset gpio\n");
1259			return r;
1260		}
1261	}
1262
1263	if (gpio_is_valid(ddata->ext_te_gpio)) {
1264		r = devm_gpio_request_one(dev, ddata->ext_te_gpio,
1265				GPIOF_IN, "taal irq");
1266		if (r) {
1267			dev_err(dev, "GPIO request failed\n");
1268			return r;
1269		}
1270
1271		r = devm_request_irq(dev, gpio_to_irq(ddata->ext_te_gpio),
1272				dsicm_te_isr,
1273				IRQF_TRIGGER_RISING,
1274				"taal vsync", ddata);
1275
1276		if (r) {
1277			dev_err(dev, "IRQ request failed\n");
1278			return r;
1279		}
1280
1281		INIT_DEFERRABLE_WORK(&ddata->te_timeout_work,
1282					dsicm_te_timeout_work_callback);
1283
1284		dev_dbg(dev, "Using GPIO TE\n");
1285	}
1286
1287	ddata->workqueue = create_singlethread_workqueue("dsicm_wq");
1288	if (ddata->workqueue == NULL) {
1289		dev_err(dev, "can't create workqueue\n");
1290		return -ENOMEM;
1291	}
1292	INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work);
1293
1294	dsicm_hw_reset(ddata);
1295
1296	if (ddata->use_dsi_backlight) {
1297		memset(&props, 0, sizeof(struct backlight_properties));
1298		props.max_brightness = 255;
1299
1300		props.type = BACKLIGHT_RAW;
1301		bldev = backlight_device_register(dev_name(dev),
1302				dev, ddata, &dsicm_bl_ops, &props);
1303		if (IS_ERR(bldev)) {
1304			r = PTR_ERR(bldev);
1305			goto err_bl;
1306		}
1307
1308		ddata->bldev = bldev;
1309
1310		bldev->props.fb_blank = FB_BLANK_UNBLANK;
1311		bldev->props.power = FB_BLANK_UNBLANK;
1312		bldev->props.brightness = 255;
1313
1314		dsicm_bl_update_status(bldev);
1315	}
1316
1317	r = sysfs_create_group(&dev->kobj, &dsicm_attr_group);
1318	if (r) {
1319		dev_err(dev, "failed to create sysfs files\n");
1320		goto err_sysfs_create;
1321	}
1322
1323	return 0;
1324
1325err_sysfs_create:
1326	if (bldev != NULL)
1327		backlight_device_unregister(bldev);
1328err_bl:
1329	destroy_workqueue(ddata->workqueue);
1330err_reg:
1331	return r;
1332}
1333
1334static int __exit dsicm_remove(struct platform_device *pdev)
1335{
1336	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
1337	struct omap_dss_device *dssdev = &ddata->dssdev;
1338	struct backlight_device *bldev;
1339
1340	dev_dbg(&pdev->dev, "remove\n");
1341
1342	omapdss_unregister_display(dssdev);
1343
1344	dsicm_disable(dssdev);
1345	dsicm_disconnect(dssdev);
1346
1347	sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
1348
1349	bldev = ddata->bldev;
1350	if (bldev != NULL) {
1351		bldev->props.power = FB_BLANK_POWERDOWN;
1352		dsicm_bl_update_status(bldev);
1353		backlight_device_unregister(bldev);
1354	}
1355
1356	omap_dss_put_device(ddata->in);
1357
1358	dsicm_cancel_ulps_work(ddata);
1359	destroy_workqueue(ddata->workqueue);
1360
1361	/* reset, to be sure that the panel is in a valid state */
1362	dsicm_hw_reset(ddata);
1363
1364	return 0;
1365}
1366
1367static const struct of_device_id dsicm_of_match[] = {
1368	{ .compatible = "omapdss,panel-dsi-cm", },
1369	{},
1370};
1371
1372MODULE_DEVICE_TABLE(of, dsicm_of_match);
1373
1374static struct platform_driver dsicm_driver = {
1375	.probe = dsicm_probe,
1376	.remove = __exit_p(dsicm_remove),
1377	.driver = {
1378		.name = "panel-dsi-cm",
1379		.of_match_table = dsicm_of_match,
1380		.suppress_bind_attrs = true,
1381	},
1382};
1383
1384module_platform_driver(dsicm_driver);
1385
1386MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ti.com>");
1387MODULE_DESCRIPTION("Generic DSI Command Mode Panel Driver");
1388MODULE_LICENSE("GPL");
1389