22 #include <linux/module.h>
26 #include <linux/sched.h>
32 #include <linux/slab.h>
42 #define DCS_READ_NUM_ERRORS 0x05
43 #define DCS_BRIGHTNESS 0x51
44 #define DCS_CTRL_DISPLAY 0x53
45 #define DCS_WRITE_CABC 0x55
46 #define DCS_READ_CABC 0x56
47 #define DCS_GET_ID1 0xda
48 #define DCS_GET_ID2 0xdb
49 #define DCS_GET_ID3 0xdc
165 static void hw_guard_start(
struct taal_data *
td,
int guard_msec)
175 if ((
long)wait > 0 && wait <= td->hw_guard_wait) {
196 static int taal_dcs_write_0(
struct taal_data *td,
u8 dcs_cmd)
209 static int taal_sleep_in(
struct taal_data *td)
222 hw_guard_start(td, 120);
230 static int taal_sleep_out(
struct taal_data *td)
240 hw_guard_start(td, 120);
302 mode &= ~((1<<7) | (1<<6) | (1<<5));
303 mode |= (b7 << 7) | (b6 << 6) | (b5 << 5);
308 static int taal_set_update_window(
struct taal_data *td,
319 buf[1] = (x1 >> 8) & 0xff;
320 buf[2] = (x1 >> 0) & 0xff;
321 buf[3] = (x2 >> 8) & 0xff;
322 buf[4] = (x2 >> 0) & 0xff;
329 buf[1] = (y1 >> 8) & 0xff;
330 buf[2] = (y1 >> 0) & 0xff;
331 buf[3] = (y2 >> 8) & 0xff;
332 buf[4] = (y2 >> 0) & 0xff;
383 taal_cancel_ulps_work(dssdev);
385 r = _taal_enable_te(dssdev,
false);
400 taal_panel_reset(dssdev);
404 taal_queue_ulps_work(dssdev);
419 dev_err(&dssdev->
dev,
"failed to enable DSI\n");
425 r = _taal_enable_te(dssdev,
true);
427 dev_err(&dssdev->
dev,
"failed to re-enable TE");
434 taal_queue_ulps_work(dssdev);
443 r = taal_panel_reset(dssdev);
450 taal_queue_ulps_work(dssdev);
460 return taal_exit_ulps(dssdev);
462 taal_cancel_ulps_work(dssdev);
463 taal_queue_ulps_work(dssdev);
476 level = dev->
props.brightness;
480 dev_dbg(&dssdev->
dev,
"update brightness to %d\n", level);
487 r = taal_wake_up(dssdev);
505 return dev->
props.brightness;
511 .get_brightness = taal_bl_get_intensity,
512 .update_status = taal_bl_update_status,
521 *xres = dssdev->
panel.timings.x_res;
522 *yres = dssdev->
panel.timings.y_res;
524 *yres = dssdev->
panel.timings.x_res;
525 *xres = dssdev->
panel.timings.y_res;
542 r = taal_wake_up(dssdev);
572 r = taal_wake_up(dssdev);
574 r = taal_get_id(td, &id1, &id2, &id3);
589 static const char *cabc_modes[] = {
602 const char *mode_str;
608 mode_str =
"unknown";
609 if (mode >= 0 && mode <
ARRAY_SIZE(cabc_modes))
610 mode_str = cabc_modes[
mode];
618 const char *buf,
size_t count)
625 for (i = 0; i <
ARRAY_SIZE(cabc_modes); i++) {
639 r = taal_wake_up(dssdev);
672 i ?
" " :
"", cabc_modes[i],
680 const char *buf,
size_t count)
693 taal_cancel_esd_work(dssdev);
696 taal_queue_esd_work(dssdev);
719 const char *buf,
size_t count)
736 r = taal_enter_ulps(dssdev);
738 r = taal_wake_up(dssdev);
768 const char *buf,
size_t count)
785 r = taal_wake_up(dssdev);
815 show_cabc_mode, store_cabc_mode);
817 show_cabc_available_modes,
NULL);
819 taal_show_esd_interval, taal_store_esd_interval);
821 taal_show_ulps, taal_store_ulps);
823 taal_show_ulps_timeout, taal_store_ulps_timeout);
825 static struct attribute *taal_attrs[] = {
826 &dev_attr_num_dsi_errors.attr,
827 &dev_attr_hw_revision.attr,
828 &dev_attr_cabc_mode.attr,
829 &dev_attr_cabc_available_modes.attr,
830 &dev_attr_esd_interval.attr,
832 &dev_attr_ulps_timeout.attr,
861 static void taal_probe_pdata(
struct taal_data *td,
885 const char *panel_name;
899 taal_probe_pdata(td, pdata);
901 panel_name = pdata->
name;
906 if (panel_name ==
NULL)
909 for (i = 0; i <
ARRAY_SIZE(panel_configs); i++) {
910 if (
strcmp(panel_name, panel_configs[i].
name) == 0) {
932 dev_err(&dssdev->
dev,
"failed to request reset gpio\n");
941 dev_err(&dssdev->
dev,
"GPIO request failed\n");
948 "taal vsync", dssdev);
951 dev_err(&dssdev->
dev,
"IRQ request failed\n");
956 taal_te_timeout_work_callback);
963 dev_err(&dssdev->
dev,
"can't create ESD workqueue\n");
969 taal_hw_reset(dssdev);
973 props.max_brightness = 255;
977 &dssdev->
dev, dssdev, &taal_bl_ops, &props);
987 bldev->
props.brightness = 255;
989 taal_bl_update_status(bldev);
994 dev_err(&dssdev->
dev,
"failed to get virtual channel\n");
1000 dev_err(&dssdev->
dev,
"failed to set VC_ID\n");
1006 dev_err(&dssdev->
dev,
"failed to create sysfs files\n");
1033 if (bldev !=
NULL) {
1035 taal_bl_update_status(bldev);
1039 taal_cancel_ulps_work(dssdev);
1040 taal_cancel_esd_work(dssdev);
1044 taal_hw_reset(dssdev);
1055 dev_err(&dssdev->
dev,
"failed to configure DSI pins\n");
1060 dssdev->
panel.timings.y_res);
1066 dev_err(&dssdev->
dev,
"failed to set HS and LP clocks\n");
1072 dev_err(&dssdev->
dev,
"failed to enable DSI\n");
1076 taal_hw_reset(dssdev);
1080 r = taal_sleep_out(td);
1084 r = taal_get_id(td, &id1, &id2, &id3);
1090 (id2 == 0x00 || id2 == 0xff || id2 == 0x81))
1132 dev_info(&dssdev->
dev,
"%s panel revision %02x.%02x.%02x\n",
1136 "old Taal version, CABC disabled\n");
1144 dev_err(&dssdev->
dev,
"error while enabling panel, issuing HW reset\n");
1146 taal_hw_reset(dssdev);
1162 r = taal_sleep_in(td);
1166 "error disabling panel, issuing HW reset\n");
1167 taal_hw_reset(dssdev);
1177 dev_err(&dssdev->
dev,
"performing LCD reset\n");
1179 taal_power_off(dssdev);
1180 taal_hw_reset(dssdev);
1181 return taal_power_on(dssdev);
1200 r = taal_power_on(dssdev);
1207 taal_queue_esd_work(dssdev);
1228 taal_cancel_ulps_work(dssdev);
1229 taal_cancel_esd_work(dssdev);
1236 r = taal_wake_up(dssdev);
1238 taal_power_off(dssdev);
1262 taal_cancel_ulps_work(dssdev);
1263 taal_cancel_esd_work(dssdev);
1267 r = taal_wake_up(dssdev);
1269 taal_power_off(dssdev);
1299 r = taal_power_on(dssdev);
1307 taal_queue_esd_work(dssdev);
1318 static void taal_framedone_cb(
int err,
void *data)
1321 dev_dbg(&dssdev->
dev,
"framedone, err %d\n", err);
1325 static irqreturn_t taal_te_isr(
int irq,
void *data)
1345 dev_err(&dssdev->
dev,
"start update failed\n");
1356 dev_err(&dssdev->
dev,
"TE not received for 250ms!\n");
1368 dev_dbg(&dssdev->
dev,
"update %d, %d, %d x %d\n", x, y, w, h);
1373 r = taal_wake_up(dssdev);
1383 r = taal_set_update_window(td, 0, 0,
1444 static int taal_enable_te(
struct omap_dss_device *dssdev,
bool enable)
1457 r = taal_wake_up(dssdev);
1461 r = _taal_enable_te(dssdev, enable);
1498 dev_dbg(&dssdev->
dev,
"rotate %d\n", rotate);
1502 if (td->
rotate == rotate)
1508 r = taal_wake_up(dssdev);
1512 r = taal_set_addr_mode(td, rotate, td->
mirror);
1517 if (rotate == 0 || rotate == 2) {
1518 dw = dssdev->
panel.timings.x_res;
1519 dh = dssdev->
panel.timings.y_res;
1521 dw = dssdev->
panel.timings.y_res;
1522 dh = dssdev->
panel.timings.x_res;
1556 dev_dbg(&dssdev->
dev,
"mirror %d\n", enable);
1560 if (td->
mirror == enable)
1565 r = taal_wake_up(dssdev);
1569 r = taal_set_addr_mode(td, td->
rotate, enable);
1598 static int taal_run_test(
struct omap_dss_device *dssdev,
int test_num)
1613 r = taal_wake_up(dssdev);
1638 void *buf,
size_t size,
1644 unsigned buf_used = 0;
1647 if (size < w * h * 3)
1657 size =
min(w * h * 3,
1658 dssdev->
panel.timings.x_res *
1659 dssdev->
panel.timings.y_res * 3);
1663 r = taal_wake_up(dssdev);
1675 taal_set_update_window(td, x, y, w, h);
1681 while (buf_used < size) {
1682 u8 dcs_cmd = first ? 0x2e : 0x3e;
1686 buf + buf_used, size - buf_used);
1700 if (signal_pending(
current)) {
1702 "aborting memory read\n");
1734 taal_enter_ulps(dssdev);
1740 static void taal_esd_work(
struct work_struct *work)
1757 r = taal_wake_up(dssdev);
1759 dev_err(&dssdev->
dev,
"failed to exit ULPS\n");
1765 dev_err(&dssdev->
dev,
"failed to read Taal status\n");
1770 r = taal_sleep_out(td);
1772 dev_err(&dssdev->
dev,
"failed to run Taal self-diagnostics\n");
1778 dev_err(&dssdev->
dev,
"failed to read Taal status\n");
1785 if (!((state1 ^ state2) & (1 << 6))) {
1786 dev_err(&dssdev->
dev,
"LCD self diagnostics failed\n");
1799 taal_queue_esd_work(dssdev);
1804 dev_err(&dssdev->
dev,
"performing LCD reset\n");
1806 taal_panel_reset(dssdev);
1810 taal_queue_esd_work(dssdev);
1816 .probe = taal_probe,
1819 .enable = taal_enable,
1820 .disable = taal_disable,
1821 .suspend = taal_suspend,
1822 .resume = taal_resume,
1824 .update = taal_update,
1827 .get_resolution = taal_get_resolution,
1830 .enable_te = taal_enable_te,
1831 .get_te = taal_get_te,
1833 .set_rotate = taal_rotate,
1834 .get_rotate = taal_get_rotate,
1835 .set_mirror = taal_mirror,
1836 .get_mirror = taal_get_mirror,
1837 .run_test = taal_run_test,
1838 .memory_read = taal_memory_read,
1846 static int __init taal_init(
void)
1853 static void __exit taal_exit(
void)