0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/backlight.h>
0012 #include <linux/delay.h>
0013 #include <linux/fb.h>
0014 #include <linux/gpio.h>
0015 #include <linux/interrupt.h>
0016 #include <linux/jiffies.h>
0017 #include <linux/module.h>
0018 #include <linux/platform_device.h>
0019 #include <linux/sched/signal.h>
0020 #include <linux/slab.h>
0021 #include <linux/workqueue.h>
0022 #include <linux/of_device.h>
0023 #include <linux/of_gpio.h>
0024
0025 #include <video/omapfb_dss.h>
0026 #include <video/mipi_display.h>
0027
0028
0029 #define TCH 0
0030
0031 #define DCS_READ_NUM_ERRORS 0x05
0032 #define DCS_BRIGHTNESS 0x51
0033 #define DCS_CTRL_DISPLAY 0x53
0034 #define DCS_GET_ID1 0xda
0035 #define DCS_GET_ID2 0xdb
0036 #define DCS_GET_ID3 0xdc
0037
0038 struct panel_drv_data {
0039 struct omap_dss_device dssdev;
0040 struct omap_dss_device *in;
0041
0042 struct omap_video_timings timings;
0043
0044 struct platform_device *pdev;
0045
0046 struct mutex lock;
0047
0048 struct backlight_device *bldev;
0049
0050 unsigned long hw_guard_end;
0051
0052
0053 unsigned long hw_guard_wait;
0054
0055
0056 int reset_gpio;
0057 int ext_te_gpio;
0058
0059 bool use_dsi_backlight;
0060
0061 struct omap_dsi_pin_config pin_config;
0062
0063
0064 bool enabled;
0065
0066 bool te_enabled;
0067
0068 atomic_t do_update;
0069 int channel;
0070
0071 struct delayed_work te_timeout_work;
0072
0073 bool intro_printed;
0074
0075 bool ulps_enabled;
0076 unsigned ulps_timeout;
0077 struct delayed_work ulps_work;
0078 };
0079
0080 #define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
0081
0082 static irqreturn_t dsicm_te_isr(int irq, void *data);
0083 static void dsicm_te_timeout_work_callback(struct work_struct *work);
0084 static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable);
0085
0086 static int dsicm_panel_reset(struct panel_drv_data *ddata);
0087
0088 static void dsicm_ulps_work(struct work_struct *work);
0089
0090 static void hw_guard_start(struct panel_drv_data *ddata, int guard_msec)
0091 {
0092 ddata->hw_guard_wait = msecs_to_jiffies(guard_msec);
0093 ddata->hw_guard_end = jiffies + ddata->hw_guard_wait;
0094 }
0095
0096 static void hw_guard_wait(struct panel_drv_data *ddata)
0097 {
0098 unsigned long wait = ddata->hw_guard_end - jiffies;
0099
0100 if ((long)wait > 0 && time_before_eq(wait, ddata->hw_guard_wait)) {
0101 set_current_state(TASK_UNINTERRUPTIBLE);
0102 schedule_timeout(wait);
0103 }
0104 }
0105
0106 static int dsicm_dcs_read_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 *data)
0107 {
0108 struct omap_dss_device *in = ddata->in;
0109 int r;
0110 u8 buf[1];
0111
0112 r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd, buf, 1);
0113
0114 if (r < 0)
0115 return r;
0116
0117 *data = buf[0];
0118
0119 return 0;
0120 }
0121
0122 static int dsicm_dcs_write_0(struct panel_drv_data *ddata, u8 dcs_cmd)
0123 {
0124 struct omap_dss_device *in = ddata->in;
0125 return in->ops.dsi->dcs_write(in, ddata->channel, &dcs_cmd, 1);
0126 }
0127
0128 static int dsicm_dcs_write_1(struct panel_drv_data *ddata, u8 dcs_cmd, u8 param)
0129 {
0130 struct omap_dss_device *in = ddata->in;
0131 u8 buf[2] = { dcs_cmd, param };
0132
0133 return in->ops.dsi->dcs_write(in, ddata->channel, buf, 2);
0134 }
0135
0136 static int dsicm_sleep_in(struct panel_drv_data *ddata)
0137
0138 {
0139 struct omap_dss_device *in = ddata->in;
0140 u8 cmd;
0141 int r;
0142
0143 hw_guard_wait(ddata);
0144
0145 cmd = MIPI_DCS_ENTER_SLEEP_MODE;
0146 r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, &cmd, 1);
0147 if (r)
0148 return r;
0149
0150 hw_guard_start(ddata, 120);
0151
0152 usleep_range(5000, 10000);
0153
0154 return 0;
0155 }
0156
0157 static int dsicm_sleep_out(struct panel_drv_data *ddata)
0158 {
0159 int r;
0160
0161 hw_guard_wait(ddata);
0162
0163 r = dsicm_dcs_write_0(ddata, MIPI_DCS_EXIT_SLEEP_MODE);
0164 if (r)
0165 return r;
0166
0167 hw_guard_start(ddata, 120);
0168
0169 usleep_range(5000, 10000);
0170
0171 return 0;
0172 }
0173
0174 static int dsicm_get_id(struct panel_drv_data *ddata, u8 *id1, u8 *id2, u8 *id3)
0175 {
0176 int r;
0177
0178 r = dsicm_dcs_read_1(ddata, DCS_GET_ID1, id1);
0179 if (r)
0180 return r;
0181 r = dsicm_dcs_read_1(ddata, DCS_GET_ID2, id2);
0182 if (r)
0183 return r;
0184 r = dsicm_dcs_read_1(ddata, DCS_GET_ID3, id3);
0185 if (r)
0186 return r;
0187
0188 return 0;
0189 }
0190
0191 static int dsicm_set_update_window(struct panel_drv_data *ddata,
0192 u16 x, u16 y, u16 w, u16 h)
0193 {
0194 struct omap_dss_device *in = ddata->in;
0195 int r;
0196 u16 x1 = x;
0197 u16 x2 = x + w - 1;
0198 u16 y1 = y;
0199 u16 y2 = y + h - 1;
0200
0201 u8 buf[5];
0202 buf[0] = MIPI_DCS_SET_COLUMN_ADDRESS;
0203 buf[1] = (x1 >> 8) & 0xff;
0204 buf[2] = (x1 >> 0) & 0xff;
0205 buf[3] = (x2 >> 8) & 0xff;
0206 buf[4] = (x2 >> 0) & 0xff;
0207
0208 r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
0209 if (r)
0210 return r;
0211
0212 buf[0] = MIPI_DCS_SET_PAGE_ADDRESS;
0213 buf[1] = (y1 >> 8) & 0xff;
0214 buf[2] = (y1 >> 0) & 0xff;
0215 buf[3] = (y2 >> 8) & 0xff;
0216 buf[4] = (y2 >> 0) & 0xff;
0217
0218 r = in->ops.dsi->dcs_write_nosync(in, ddata->channel, buf, sizeof(buf));
0219 if (r)
0220 return r;
0221
0222 in->ops.dsi->bta_sync(in, ddata->channel);
0223
0224 return r;
0225 }
0226
0227 static void dsicm_queue_ulps_work(struct panel_drv_data *ddata)
0228 {
0229 if (ddata->ulps_timeout > 0)
0230 schedule_delayed_work(&ddata->ulps_work,
0231 msecs_to_jiffies(ddata->ulps_timeout));
0232 }
0233
0234 static void dsicm_cancel_ulps_work(struct panel_drv_data *ddata)
0235 {
0236 cancel_delayed_work(&ddata->ulps_work);
0237 }
0238
0239 static int dsicm_enter_ulps(struct panel_drv_data *ddata)
0240 {
0241 struct omap_dss_device *in = ddata->in;
0242 int r;
0243
0244 if (ddata->ulps_enabled)
0245 return 0;
0246
0247 dsicm_cancel_ulps_work(ddata);
0248
0249 r = _dsicm_enable_te(ddata, false);
0250 if (r)
0251 goto err;
0252
0253 if (gpio_is_valid(ddata->ext_te_gpio))
0254 disable_irq(gpio_to_irq(ddata->ext_te_gpio));
0255
0256 in->ops.dsi->disable(in, false, true);
0257
0258 ddata->ulps_enabled = true;
0259
0260 return 0;
0261
0262 err:
0263 dev_err(&ddata->pdev->dev, "enter ULPS failed");
0264 dsicm_panel_reset(ddata);
0265
0266 ddata->ulps_enabled = false;
0267
0268 dsicm_queue_ulps_work(ddata);
0269
0270 return r;
0271 }
0272
0273 static int dsicm_exit_ulps(struct panel_drv_data *ddata)
0274 {
0275 struct omap_dss_device *in = ddata->in;
0276 int r;
0277
0278 if (!ddata->ulps_enabled)
0279 return 0;
0280
0281 r = in->ops.dsi->enable(in);
0282 if (r) {
0283 dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
0284 goto err1;
0285 }
0286
0287 in->ops.dsi->enable_hs(in, ddata->channel, true);
0288
0289 r = _dsicm_enable_te(ddata, true);
0290 if (r) {
0291 dev_err(&ddata->pdev->dev, "failed to re-enable TE");
0292 goto err2;
0293 }
0294
0295 if (gpio_is_valid(ddata->ext_te_gpio))
0296 enable_irq(gpio_to_irq(ddata->ext_te_gpio));
0297
0298 dsicm_queue_ulps_work(ddata);
0299
0300 ddata->ulps_enabled = false;
0301
0302 return 0;
0303
0304 err2:
0305 dev_err(&ddata->pdev->dev, "failed to exit ULPS");
0306
0307 r = dsicm_panel_reset(ddata);
0308 if (!r) {
0309 if (gpio_is_valid(ddata->ext_te_gpio))
0310 enable_irq(gpio_to_irq(ddata->ext_te_gpio));
0311 ddata->ulps_enabled = false;
0312 }
0313 err1:
0314 dsicm_queue_ulps_work(ddata);
0315
0316 return r;
0317 }
0318
0319 static int dsicm_wake_up(struct panel_drv_data *ddata)
0320 {
0321 if (ddata->ulps_enabled)
0322 return dsicm_exit_ulps(ddata);
0323
0324 dsicm_cancel_ulps_work(ddata);
0325 dsicm_queue_ulps_work(ddata);
0326 return 0;
0327 }
0328
0329 static int dsicm_bl_update_status(struct backlight_device *dev)
0330 {
0331 struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
0332 struct omap_dss_device *in = ddata->in;
0333 int r;
0334 int level;
0335
0336 if (dev->props.fb_blank == FB_BLANK_UNBLANK &&
0337 dev->props.power == FB_BLANK_UNBLANK)
0338 level = dev->props.brightness;
0339 else
0340 level = 0;
0341
0342 dev_dbg(&ddata->pdev->dev, "update brightness to %d\n", level);
0343
0344 mutex_lock(&ddata->lock);
0345
0346 if (ddata->enabled) {
0347 in->ops.dsi->bus_lock(in);
0348
0349 r = dsicm_wake_up(ddata);
0350 if (!r)
0351 r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, level);
0352
0353 in->ops.dsi->bus_unlock(in);
0354 } else {
0355 r = 0;
0356 }
0357
0358 mutex_unlock(&ddata->lock);
0359
0360 return r;
0361 }
0362
0363 static int dsicm_bl_get_intensity(struct backlight_device *dev)
0364 {
0365 if (dev->props.fb_blank == FB_BLANK_UNBLANK &&
0366 dev->props.power == FB_BLANK_UNBLANK)
0367 return dev->props.brightness;
0368
0369 return 0;
0370 }
0371
0372 static const struct backlight_ops dsicm_bl_ops = {
0373 .get_brightness = dsicm_bl_get_intensity,
0374 .update_status = dsicm_bl_update_status,
0375 };
0376
0377 static void dsicm_get_resolution(struct omap_dss_device *dssdev,
0378 u16 *xres, u16 *yres)
0379 {
0380 *xres = dssdev->panel.timings.x_res;
0381 *yres = dssdev->panel.timings.y_res;
0382 }
0383
0384 static ssize_t dsicm_num_errors_show(struct device *dev,
0385 struct device_attribute *attr, char *buf)
0386 {
0387 struct panel_drv_data *ddata = dev_get_drvdata(dev);
0388 struct omap_dss_device *in = ddata->in;
0389 u8 errors = 0;
0390 int r;
0391
0392 mutex_lock(&ddata->lock);
0393
0394 if (ddata->enabled) {
0395 in->ops.dsi->bus_lock(in);
0396
0397 r = dsicm_wake_up(ddata);
0398 if (!r)
0399 r = dsicm_dcs_read_1(ddata, DCS_READ_NUM_ERRORS,
0400 &errors);
0401
0402 in->ops.dsi->bus_unlock(in);
0403 } else {
0404 r = -ENODEV;
0405 }
0406
0407 mutex_unlock(&ddata->lock);
0408
0409 if (r)
0410 return r;
0411
0412 return sysfs_emit(buf, "%d\n", errors);
0413 }
0414
0415 static ssize_t dsicm_hw_revision_show(struct device *dev,
0416 struct device_attribute *attr, char *buf)
0417 {
0418 struct panel_drv_data *ddata = dev_get_drvdata(dev);
0419 struct omap_dss_device *in = ddata->in;
0420 u8 id1, id2, id3;
0421 int r;
0422
0423 mutex_lock(&ddata->lock);
0424
0425 if (ddata->enabled) {
0426 in->ops.dsi->bus_lock(in);
0427
0428 r = dsicm_wake_up(ddata);
0429 if (!r)
0430 r = dsicm_get_id(ddata, &id1, &id2, &id3);
0431
0432 in->ops.dsi->bus_unlock(in);
0433 } else {
0434 r = -ENODEV;
0435 }
0436
0437 mutex_unlock(&ddata->lock);
0438
0439 if (r)
0440 return r;
0441
0442 return sysfs_emit(buf, "%02x.%02x.%02x\n", id1, id2, id3);
0443 }
0444
0445 static ssize_t dsicm_store_ulps(struct device *dev,
0446 struct device_attribute *attr,
0447 const char *buf, size_t count)
0448 {
0449 struct panel_drv_data *ddata = dev_get_drvdata(dev);
0450 struct omap_dss_device *in = ddata->in;
0451 unsigned long t;
0452 int r;
0453
0454 r = kstrtoul(buf, 0, &t);
0455 if (r)
0456 return r;
0457
0458 mutex_lock(&ddata->lock);
0459
0460 if (ddata->enabled) {
0461 in->ops.dsi->bus_lock(in);
0462
0463 if (t)
0464 r = dsicm_enter_ulps(ddata);
0465 else
0466 r = dsicm_wake_up(ddata);
0467
0468 in->ops.dsi->bus_unlock(in);
0469 }
0470
0471 mutex_unlock(&ddata->lock);
0472
0473 if (r)
0474 return r;
0475
0476 return count;
0477 }
0478
0479 static ssize_t dsicm_show_ulps(struct device *dev,
0480 struct device_attribute *attr,
0481 char *buf)
0482 {
0483 struct panel_drv_data *ddata = dev_get_drvdata(dev);
0484 unsigned t;
0485
0486 mutex_lock(&ddata->lock);
0487 t = ddata->ulps_enabled;
0488 mutex_unlock(&ddata->lock);
0489
0490 return sysfs_emit(buf, "%u\n", t);
0491 }
0492
0493 static ssize_t dsicm_store_ulps_timeout(struct device *dev,
0494 struct device_attribute *attr,
0495 const char *buf, size_t count)
0496 {
0497 struct panel_drv_data *ddata = dev_get_drvdata(dev);
0498 struct omap_dss_device *in = ddata->in;
0499 unsigned long t;
0500 int r;
0501
0502 r = kstrtoul(buf, 0, &t);
0503 if (r)
0504 return r;
0505
0506 mutex_lock(&ddata->lock);
0507 ddata->ulps_timeout = t;
0508
0509 if (ddata->enabled) {
0510
0511 in->ops.dsi->bus_lock(in);
0512 r = dsicm_wake_up(ddata);
0513 in->ops.dsi->bus_unlock(in);
0514 }
0515
0516 mutex_unlock(&ddata->lock);
0517
0518 if (r)
0519 return r;
0520
0521 return count;
0522 }
0523
0524 static ssize_t dsicm_show_ulps_timeout(struct device *dev,
0525 struct device_attribute *attr,
0526 char *buf)
0527 {
0528 struct panel_drv_data *ddata = dev_get_drvdata(dev);
0529 unsigned t;
0530
0531 mutex_lock(&ddata->lock);
0532 t = ddata->ulps_timeout;
0533 mutex_unlock(&ddata->lock);
0534
0535 return sysfs_emit(buf, "%u\n", t);
0536 }
0537
0538 static DEVICE_ATTR(num_dsi_errors, S_IRUGO, dsicm_num_errors_show, NULL);
0539 static DEVICE_ATTR(hw_revision, S_IRUGO, dsicm_hw_revision_show, NULL);
0540 static DEVICE_ATTR(ulps, S_IRUGO | S_IWUSR,
0541 dsicm_show_ulps, dsicm_store_ulps);
0542 static DEVICE_ATTR(ulps_timeout, S_IRUGO | S_IWUSR,
0543 dsicm_show_ulps_timeout, dsicm_store_ulps_timeout);
0544
0545 static struct attribute *dsicm_attrs[] = {
0546 &dev_attr_num_dsi_errors.attr,
0547 &dev_attr_hw_revision.attr,
0548 &dev_attr_ulps.attr,
0549 &dev_attr_ulps_timeout.attr,
0550 NULL,
0551 };
0552
0553 static const struct attribute_group dsicm_attr_group = {
0554 .attrs = dsicm_attrs,
0555 };
0556
0557 static void dsicm_hw_reset(struct panel_drv_data *ddata)
0558 {
0559 if (!gpio_is_valid(ddata->reset_gpio))
0560 return;
0561
0562 gpio_set_value(ddata->reset_gpio, 1);
0563 udelay(10);
0564
0565 gpio_set_value(ddata->reset_gpio, 0);
0566
0567 udelay(10);
0568 gpio_set_value(ddata->reset_gpio, 1);
0569
0570 usleep_range(5000, 10000);
0571 }
0572
0573 static int dsicm_power_on(struct panel_drv_data *ddata)
0574 {
0575 struct omap_dss_device *in = ddata->in;
0576 u8 id1, id2, id3;
0577 int r;
0578 struct omap_dss_dsi_config dsi_config = {
0579 .mode = OMAP_DSS_DSI_CMD_MODE,
0580 .pixel_format = OMAP_DSS_DSI_FMT_RGB888,
0581 .timings = &ddata->timings,
0582 .hs_clk_min = 150000000,
0583 .hs_clk_max = 300000000,
0584 .lp_clk_min = 7000000,
0585 .lp_clk_max = 10000000,
0586 };
0587
0588 if (ddata->pin_config.num_pins > 0) {
0589 r = in->ops.dsi->configure_pins(in, &ddata->pin_config);
0590 if (r) {
0591 dev_err(&ddata->pdev->dev,
0592 "failed to configure DSI pins\n");
0593 goto err0;
0594 }
0595 }
0596
0597 r = in->ops.dsi->set_config(in, &dsi_config);
0598 if (r) {
0599 dev_err(&ddata->pdev->dev, "failed to configure DSI\n");
0600 goto err0;
0601 }
0602
0603 r = in->ops.dsi->enable(in);
0604 if (r) {
0605 dev_err(&ddata->pdev->dev, "failed to enable DSI\n");
0606 goto err0;
0607 }
0608
0609 dsicm_hw_reset(ddata);
0610
0611 in->ops.dsi->enable_hs(in, ddata->channel, false);
0612
0613 r = dsicm_sleep_out(ddata);
0614 if (r)
0615 goto err;
0616
0617 r = dsicm_get_id(ddata, &id1, &id2, &id3);
0618 if (r)
0619 goto err;
0620
0621 r = dsicm_dcs_write_1(ddata, DCS_BRIGHTNESS, 0xff);
0622 if (r)
0623 goto err;
0624
0625 r = dsicm_dcs_write_1(ddata, DCS_CTRL_DISPLAY,
0626 (1<<2) | (1<<5));
0627 if (r)
0628 goto err;
0629
0630 r = dsicm_dcs_write_1(ddata, MIPI_DCS_SET_PIXEL_FORMAT,
0631 MIPI_DCS_PIXEL_FMT_24BIT);
0632 if (r)
0633 goto err;
0634
0635 r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_ON);
0636 if (r)
0637 goto err;
0638
0639 r = _dsicm_enable_te(ddata, ddata->te_enabled);
0640 if (r)
0641 goto err;
0642
0643 r = in->ops.dsi->enable_video_output(in, ddata->channel);
0644 if (r)
0645 goto err;
0646
0647 ddata->enabled = 1;
0648
0649 if (!ddata->intro_printed) {
0650 dev_info(&ddata->pdev->dev, "panel revision %02x.%02x.%02x\n",
0651 id1, id2, id3);
0652 ddata->intro_printed = true;
0653 }
0654
0655 in->ops.dsi->enable_hs(in, ddata->channel, true);
0656
0657 return 0;
0658 err:
0659 dev_err(&ddata->pdev->dev, "error while enabling panel, issuing HW reset\n");
0660
0661 dsicm_hw_reset(ddata);
0662
0663 in->ops.dsi->disable(in, true, false);
0664 err0:
0665 return r;
0666 }
0667
0668 static void dsicm_power_off(struct panel_drv_data *ddata)
0669 {
0670 struct omap_dss_device *in = ddata->in;
0671 int r;
0672
0673 in->ops.dsi->disable_video_output(in, ddata->channel);
0674
0675 r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_DISPLAY_OFF);
0676 if (!r)
0677 r = dsicm_sleep_in(ddata);
0678
0679 if (r) {
0680 dev_err(&ddata->pdev->dev,
0681 "error disabling panel, issuing HW reset\n");
0682 dsicm_hw_reset(ddata);
0683 }
0684
0685 in->ops.dsi->disable(in, true, false);
0686
0687 ddata->enabled = 0;
0688 }
0689
0690 static int dsicm_panel_reset(struct panel_drv_data *ddata)
0691 {
0692 dev_err(&ddata->pdev->dev, "performing LCD reset\n");
0693
0694 dsicm_power_off(ddata);
0695 dsicm_hw_reset(ddata);
0696 return dsicm_power_on(ddata);
0697 }
0698
0699 static int dsicm_connect(struct omap_dss_device *dssdev)
0700 {
0701 struct panel_drv_data *ddata = to_panel_data(dssdev);
0702 struct omap_dss_device *in = ddata->in;
0703 struct device *dev = &ddata->pdev->dev;
0704 int r;
0705
0706 if (omapdss_device_is_connected(dssdev))
0707 return 0;
0708
0709 r = in->ops.dsi->connect(in, dssdev);
0710 if (r) {
0711 dev_err(dev, "Failed to connect to video source\n");
0712 return r;
0713 }
0714
0715 r = in->ops.dsi->request_vc(ddata->in, &ddata->channel);
0716 if (r) {
0717 dev_err(dev, "failed to get virtual channel\n");
0718 goto err_req_vc;
0719 }
0720
0721 r = in->ops.dsi->set_vc_id(ddata->in, ddata->channel, TCH);
0722 if (r) {
0723 dev_err(dev, "failed to set VC_ID\n");
0724 goto err_vc_id;
0725 }
0726
0727 return 0;
0728
0729 err_vc_id:
0730 in->ops.dsi->release_vc(ddata->in, ddata->channel);
0731 err_req_vc:
0732 in->ops.dsi->disconnect(in, dssdev);
0733 return r;
0734 }
0735
0736 static void dsicm_disconnect(struct omap_dss_device *dssdev)
0737 {
0738 struct panel_drv_data *ddata = to_panel_data(dssdev);
0739 struct omap_dss_device *in = ddata->in;
0740
0741 if (!omapdss_device_is_connected(dssdev))
0742 return;
0743
0744 in->ops.dsi->release_vc(in, ddata->channel);
0745 in->ops.dsi->disconnect(in, dssdev);
0746 }
0747
0748 static int dsicm_enable(struct omap_dss_device *dssdev)
0749 {
0750 struct panel_drv_data *ddata = to_panel_data(dssdev);
0751 struct omap_dss_device *in = ddata->in;
0752 int r;
0753
0754 dev_dbg(&ddata->pdev->dev, "enable\n");
0755
0756 mutex_lock(&ddata->lock);
0757
0758 if (!omapdss_device_is_connected(dssdev)) {
0759 r = -ENODEV;
0760 goto err;
0761 }
0762
0763 if (omapdss_device_is_enabled(dssdev)) {
0764 r = 0;
0765 goto err;
0766 }
0767
0768 in->ops.dsi->bus_lock(in);
0769
0770 r = dsicm_power_on(ddata);
0771
0772 in->ops.dsi->bus_unlock(in);
0773
0774 if (r)
0775 goto err;
0776
0777 dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
0778
0779 mutex_unlock(&ddata->lock);
0780
0781 return 0;
0782 err:
0783 dev_dbg(&ddata->pdev->dev, "enable failed\n");
0784 mutex_unlock(&ddata->lock);
0785 return r;
0786 }
0787
0788 static void dsicm_disable(struct omap_dss_device *dssdev)
0789 {
0790 struct panel_drv_data *ddata = to_panel_data(dssdev);
0791 struct omap_dss_device *in = ddata->in;
0792 int r;
0793
0794 dev_dbg(&ddata->pdev->dev, "disable\n");
0795
0796 mutex_lock(&ddata->lock);
0797
0798 dsicm_cancel_ulps_work(ddata);
0799
0800 in->ops.dsi->bus_lock(in);
0801
0802 if (omapdss_device_is_enabled(dssdev)) {
0803 r = dsicm_wake_up(ddata);
0804 if (!r)
0805 dsicm_power_off(ddata);
0806 }
0807
0808 in->ops.dsi->bus_unlock(in);
0809
0810 dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
0811
0812 mutex_unlock(&ddata->lock);
0813 }
0814
0815 static void dsicm_framedone_cb(int err, void *data)
0816 {
0817 struct panel_drv_data *ddata = data;
0818 struct omap_dss_device *in = ddata->in;
0819
0820 dev_dbg(&ddata->pdev->dev, "framedone, err %d\n", err);
0821 in->ops.dsi->bus_unlock(ddata->in);
0822 }
0823
0824 static irqreturn_t dsicm_te_isr(int irq, void *data)
0825 {
0826 struct panel_drv_data *ddata = data;
0827 struct omap_dss_device *in = ddata->in;
0828 int old;
0829 int r;
0830
0831 old = atomic_cmpxchg(&ddata->do_update, 1, 0);
0832
0833 if (old) {
0834 cancel_delayed_work(&ddata->te_timeout_work);
0835
0836 r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
0837 ddata);
0838 if (r)
0839 goto err;
0840 }
0841
0842 return IRQ_HANDLED;
0843 err:
0844 dev_err(&ddata->pdev->dev, "start update failed\n");
0845 in->ops.dsi->bus_unlock(in);
0846 return IRQ_HANDLED;
0847 }
0848
0849 static void dsicm_te_timeout_work_callback(struct work_struct *work)
0850 {
0851 struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
0852 te_timeout_work.work);
0853 struct omap_dss_device *in = ddata->in;
0854
0855 dev_err(&ddata->pdev->dev, "TE not received for 250ms!\n");
0856
0857 atomic_set(&ddata->do_update, 0);
0858 in->ops.dsi->bus_unlock(in);
0859 }
0860
0861 static int dsicm_update(struct omap_dss_device *dssdev,
0862 u16 x, u16 y, u16 w, u16 h)
0863 {
0864 struct panel_drv_data *ddata = to_panel_data(dssdev);
0865 struct omap_dss_device *in = ddata->in;
0866 int r;
0867
0868 dev_dbg(&ddata->pdev->dev, "update %d, %d, %d x %d\n", x, y, w, h);
0869
0870 mutex_lock(&ddata->lock);
0871 in->ops.dsi->bus_lock(in);
0872
0873 r = dsicm_wake_up(ddata);
0874 if (r)
0875 goto err;
0876
0877 if (!ddata->enabled) {
0878 r = 0;
0879 goto err;
0880 }
0881
0882
0883 r = dsicm_set_update_window(ddata, 0, 0,
0884 dssdev->panel.timings.x_res,
0885 dssdev->panel.timings.y_res);
0886 if (r)
0887 goto err;
0888
0889 if (ddata->te_enabled && gpio_is_valid(ddata->ext_te_gpio)) {
0890 schedule_delayed_work(&ddata->te_timeout_work,
0891 msecs_to_jiffies(250));
0892 atomic_set(&ddata->do_update, 1);
0893 } else {
0894 r = in->ops.dsi->update(in, ddata->channel, dsicm_framedone_cb,
0895 ddata);
0896 if (r)
0897 goto err;
0898 }
0899
0900
0901 mutex_unlock(&ddata->lock);
0902 return 0;
0903 err:
0904 in->ops.dsi->bus_unlock(in);
0905 mutex_unlock(&ddata->lock);
0906 return r;
0907 }
0908
0909 static int dsicm_sync(struct omap_dss_device *dssdev)
0910 {
0911 struct panel_drv_data *ddata = to_panel_data(dssdev);
0912 struct omap_dss_device *in = ddata->in;
0913
0914 dev_dbg(&ddata->pdev->dev, "sync\n");
0915
0916 mutex_lock(&ddata->lock);
0917 in->ops.dsi->bus_lock(in);
0918 in->ops.dsi->bus_unlock(in);
0919 mutex_unlock(&ddata->lock);
0920
0921 dev_dbg(&ddata->pdev->dev, "sync done\n");
0922
0923 return 0;
0924 }
0925
0926 static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
0927 {
0928 struct omap_dss_device *in = ddata->in;
0929 int r;
0930
0931 if (enable)
0932 r = dsicm_dcs_write_1(ddata, MIPI_DCS_SET_TEAR_ON, 0);
0933 else
0934 r = dsicm_dcs_write_0(ddata, MIPI_DCS_SET_TEAR_OFF);
0935
0936 if (!gpio_is_valid(ddata->ext_te_gpio))
0937 in->ops.dsi->enable_te(in, enable);
0938
0939
0940 msleep(100);
0941
0942 return r;
0943 }
0944
0945 static int dsicm_enable_te(struct omap_dss_device *dssdev, bool enable)
0946 {
0947 struct panel_drv_data *ddata = to_panel_data(dssdev);
0948 struct omap_dss_device *in = ddata->in;
0949 int r;
0950
0951 mutex_lock(&ddata->lock);
0952
0953 if (ddata->te_enabled == enable)
0954 goto end;
0955
0956 in->ops.dsi->bus_lock(in);
0957
0958 if (ddata->enabled) {
0959 r = dsicm_wake_up(ddata);
0960 if (r)
0961 goto err;
0962
0963 r = _dsicm_enable_te(ddata, enable);
0964 if (r)
0965 goto err;
0966 }
0967
0968 ddata->te_enabled = enable;
0969
0970 in->ops.dsi->bus_unlock(in);
0971 end:
0972 mutex_unlock(&ddata->lock);
0973
0974 return 0;
0975 err:
0976 in->ops.dsi->bus_unlock(in);
0977 mutex_unlock(&ddata->lock);
0978
0979 return r;
0980 }
0981
0982 static int dsicm_get_te(struct omap_dss_device *dssdev)
0983 {
0984 struct panel_drv_data *ddata = to_panel_data(dssdev);
0985 int r;
0986
0987 mutex_lock(&ddata->lock);
0988 r = ddata->te_enabled;
0989 mutex_unlock(&ddata->lock);
0990
0991 return r;
0992 }
0993
0994 static int dsicm_memory_read(struct omap_dss_device *dssdev,
0995 void *buf, size_t size,
0996 u16 x, u16 y, u16 w, u16 h)
0997 {
0998 struct panel_drv_data *ddata = to_panel_data(dssdev);
0999 struct omap_dss_device *in = ddata->in;
1000 int r;
1001 int first = 1;
1002 int plen;
1003 unsigned buf_used = 0;
1004
1005 if (size < w * h * 3)
1006 return -ENOMEM;
1007
1008 mutex_lock(&ddata->lock);
1009
1010 if (!ddata->enabled) {
1011 r = -ENODEV;
1012 goto err1;
1013 }
1014
1015 size = min(w * h * 3,
1016 dssdev->panel.timings.x_res *
1017 dssdev->panel.timings.y_res * 3);
1018
1019 in->ops.dsi->bus_lock(in);
1020
1021 r = dsicm_wake_up(ddata);
1022 if (r)
1023 goto err2;
1024
1025
1026
1027
1028 if (size % 2)
1029 plen = 1;
1030 else
1031 plen = 2;
1032
1033 dsicm_set_update_window(ddata, x, y, w, h);
1034
1035 r = in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, plen);
1036 if (r)
1037 goto err2;
1038
1039 while (buf_used < size) {
1040 u8 dcs_cmd = first ? 0x2e : 0x3e;
1041 first = 0;
1042
1043 r = in->ops.dsi->dcs_read(in, ddata->channel, dcs_cmd,
1044 buf + buf_used, size - buf_used);
1045
1046 if (r < 0) {
1047 dev_err(dssdev->dev, "read error\n");
1048 goto err3;
1049 }
1050
1051 buf_used += r;
1052
1053 if (r < plen) {
1054 dev_err(&ddata->pdev->dev, "short read\n");
1055 break;
1056 }
1057
1058 if (signal_pending(current)) {
1059 dev_err(&ddata->pdev->dev, "signal pending, "
1060 "aborting memory read\n");
1061 r = -ERESTARTSYS;
1062 goto err3;
1063 }
1064 }
1065
1066 r = buf_used;
1067
1068 err3:
1069 in->ops.dsi->set_max_rx_packet_size(in, ddata->channel, 1);
1070 err2:
1071 in->ops.dsi->bus_unlock(in);
1072 err1:
1073 mutex_unlock(&ddata->lock);
1074 return r;
1075 }
1076
1077 static void dsicm_ulps_work(struct work_struct *work)
1078 {
1079 struct panel_drv_data *ddata = container_of(work, struct panel_drv_data,
1080 ulps_work.work);
1081 struct omap_dss_device *dssdev = &ddata->dssdev;
1082 struct omap_dss_device *in = ddata->in;
1083
1084 mutex_lock(&ddata->lock);
1085
1086 if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE || !ddata->enabled) {
1087 mutex_unlock(&ddata->lock);
1088 return;
1089 }
1090
1091 in->ops.dsi->bus_lock(in);
1092
1093 dsicm_enter_ulps(ddata);
1094
1095 in->ops.dsi->bus_unlock(in);
1096 mutex_unlock(&ddata->lock);
1097 }
1098
1099 static struct omap_dss_driver dsicm_ops = {
1100 .connect = dsicm_connect,
1101 .disconnect = dsicm_disconnect,
1102
1103 .enable = dsicm_enable,
1104 .disable = dsicm_disable,
1105
1106 .update = dsicm_update,
1107 .sync = dsicm_sync,
1108
1109 .get_resolution = dsicm_get_resolution,
1110 .get_recommended_bpp = omapdss_default_get_recommended_bpp,
1111
1112 .enable_te = dsicm_enable_te,
1113 .get_te = dsicm_get_te,
1114
1115 .memory_read = dsicm_memory_read,
1116 };
1117
1118 static int dsicm_probe_of(struct platform_device *pdev)
1119 {
1120 struct device_node *node = pdev->dev.of_node;
1121 struct panel_drv_data *ddata = platform_get_drvdata(pdev);
1122 struct omap_dss_device *in;
1123 int gpio;
1124
1125 gpio = of_get_named_gpio(node, "reset-gpios", 0);
1126 if (!gpio_is_valid(gpio)) {
1127 dev_err(&pdev->dev, "failed to parse reset gpio\n");
1128 return gpio;
1129 }
1130 ddata->reset_gpio = gpio;
1131
1132 gpio = of_get_named_gpio(node, "te-gpios", 0);
1133 if (gpio_is_valid(gpio) || gpio == -ENOENT) {
1134 ddata->ext_te_gpio = gpio;
1135 } else {
1136 dev_err(&pdev->dev, "failed to parse TE gpio\n");
1137 return gpio;
1138 }
1139
1140 in = omapdss_of_find_source_for_first_ep(node);
1141 if (IS_ERR(in)) {
1142 dev_err(&pdev->dev, "failed to find video source\n");
1143 return PTR_ERR(in);
1144 }
1145
1146 ddata->in = in;
1147
1148
1149
1150 return 0;
1151 }
1152
1153 static int dsicm_probe(struct platform_device *pdev)
1154 {
1155 struct backlight_properties props;
1156 struct panel_drv_data *ddata;
1157 struct backlight_device *bldev = NULL;
1158 struct device *dev = &pdev->dev;
1159 struct omap_dss_device *dssdev;
1160 int r;
1161
1162 dev_dbg(dev, "probe\n");
1163
1164 if (!pdev->dev.of_node)
1165 return -ENODEV;
1166
1167 ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
1168 if (!ddata)
1169 return -ENOMEM;
1170
1171 platform_set_drvdata(pdev, ddata);
1172 ddata->pdev = pdev;
1173
1174 r = dsicm_probe_of(pdev);
1175 if (r)
1176 return r;
1177
1178 ddata->timings.x_res = 864;
1179 ddata->timings.y_res = 480;
1180 ddata->timings.pixelclock = 864 * 480 * 60;
1181
1182 dssdev = &ddata->dssdev;
1183 dssdev->dev = dev;
1184 dssdev->driver = &dsicm_ops;
1185 dssdev->panel.timings = ddata->timings;
1186 dssdev->type = OMAP_DISPLAY_TYPE_DSI;
1187 dssdev->owner = THIS_MODULE;
1188
1189 dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888;
1190 dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
1191 OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
1192
1193 r = omapdss_register_display(dssdev);
1194 if (r) {
1195 dev_err(dev, "Failed to register panel\n");
1196 goto err_reg;
1197 }
1198
1199 mutex_init(&ddata->lock);
1200
1201 atomic_set(&ddata->do_update, 0);
1202
1203 if (gpio_is_valid(ddata->reset_gpio)) {
1204 r = devm_gpio_request_one(dev, ddata->reset_gpio,
1205 GPIOF_OUT_INIT_LOW, "taal rst");
1206 if (r) {
1207 dev_err(dev, "failed to request reset gpio\n");
1208 return r;
1209 }
1210 }
1211
1212 if (gpio_is_valid(ddata->ext_te_gpio)) {
1213 r = devm_gpio_request_one(dev, ddata->ext_te_gpio,
1214 GPIOF_IN, "taal irq");
1215 if (r) {
1216 dev_err(dev, "GPIO request failed\n");
1217 return r;
1218 }
1219
1220 r = devm_request_irq(dev, gpio_to_irq(ddata->ext_te_gpio),
1221 dsicm_te_isr,
1222 IRQF_TRIGGER_RISING,
1223 "taal vsync", ddata);
1224
1225 if (r) {
1226 dev_err(dev, "IRQ request failed\n");
1227 return r;
1228 }
1229
1230 INIT_DEFERRABLE_WORK(&ddata->te_timeout_work,
1231 dsicm_te_timeout_work_callback);
1232
1233 dev_dbg(dev, "Using GPIO TE\n");
1234 }
1235
1236 INIT_DELAYED_WORK(&ddata->ulps_work, dsicm_ulps_work);
1237
1238 dsicm_hw_reset(ddata);
1239
1240 if (ddata->use_dsi_backlight) {
1241 memset(&props, 0, sizeof(struct backlight_properties));
1242 props.max_brightness = 255;
1243
1244 props.type = BACKLIGHT_RAW;
1245 bldev = backlight_device_register(dev_name(dev),
1246 dev, ddata, &dsicm_bl_ops, &props);
1247 if (IS_ERR(bldev)) {
1248 r = PTR_ERR(bldev);
1249 goto err_reg;
1250 }
1251
1252 ddata->bldev = bldev;
1253
1254 bldev->props.fb_blank = FB_BLANK_UNBLANK;
1255 bldev->props.power = FB_BLANK_UNBLANK;
1256 bldev->props.brightness = 255;
1257
1258 dsicm_bl_update_status(bldev);
1259 }
1260
1261 r = sysfs_create_group(&dev->kobj, &dsicm_attr_group);
1262 if (r) {
1263 dev_err(dev, "failed to create sysfs files\n");
1264 goto err_sysfs_create;
1265 }
1266
1267 return 0;
1268
1269 err_sysfs_create:
1270 if (bldev != NULL)
1271 backlight_device_unregister(bldev);
1272 err_reg:
1273 return r;
1274 }
1275
1276 static int __exit dsicm_remove(struct platform_device *pdev)
1277 {
1278 struct panel_drv_data *ddata = platform_get_drvdata(pdev);
1279 struct omap_dss_device *dssdev = &ddata->dssdev;
1280 struct backlight_device *bldev;
1281
1282 dev_dbg(&pdev->dev, "remove\n");
1283
1284 omapdss_unregister_display(dssdev);
1285
1286 dsicm_disable(dssdev);
1287 dsicm_disconnect(dssdev);
1288
1289 sysfs_remove_group(&pdev->dev.kobj, &dsicm_attr_group);
1290
1291 bldev = ddata->bldev;
1292 if (bldev != NULL) {
1293 bldev->props.power = FB_BLANK_POWERDOWN;
1294 dsicm_bl_update_status(bldev);
1295 backlight_device_unregister(bldev);
1296 }
1297
1298 omap_dss_put_device(ddata->in);
1299
1300 dsicm_cancel_ulps_work(ddata);
1301
1302
1303 dsicm_hw_reset(ddata);
1304
1305 return 0;
1306 }
1307
1308 static const struct of_device_id dsicm_of_match[] = {
1309 { .compatible = "omapdss,panel-dsi-cm", },
1310 {},
1311 };
1312
1313 MODULE_DEVICE_TABLE(of, dsicm_of_match);
1314
1315 static struct platform_driver dsicm_driver = {
1316 .probe = dsicm_probe,
1317 .remove = __exit_p(dsicm_remove),
1318 .driver = {
1319 .name = "panel-dsi-cm",
1320 .of_match_table = dsicm_of_match,
1321 .suppress_bind_attrs = true,
1322 },
1323 };
1324
1325 module_platform_driver(dsicm_driver);
1326
1327 MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ti.com>");
1328 MODULE_DESCRIPTION("Generic DSI Command Mode Panel Driver");
1329 MODULE_LICENSE("GPL");