Lines Matching full:dsi
3 * Samsung SoC MIPI DSI Master driver.
320 static inline void exynos_dsi_write(struct exynos_dsi *dsi, enum reg_idx idx, in exynos_dsi_write() argument
324 writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in exynos_dsi_write()
327 static inline u32 exynos_dsi_read(struct exynos_dsi *dsi, enum reg_idx idx) in exynos_dsi_read() argument
329 return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in exynos_dsi_read()
509 { .compatible = "samsung,exynos3250-mipi-dsi",
511 { .compatible = "samsung,exynos4210-mipi-dsi",
513 { .compatible = "samsung,exynos5410-mipi-dsi",
515 { .compatible = "samsung,exynos5422-mipi-dsi",
517 { .compatible = "samsung,exynos5433-mipi-dsi",
522 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) in exynos_dsi_wait_for_reset() argument
524 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) in exynos_dsi_wait_for_reset()
527 dev_err(dsi->dev, "timeout waiting for reset\n"); in exynos_dsi_wait_for_reset()
530 static void exynos_dsi_reset(struct exynos_dsi *dsi) in exynos_dsi_reset() argument
532 u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; in exynos_dsi_reset()
534 reinit_completion(&dsi->completed); in exynos_dsi_reset()
535 exynos_dsi_write(dsi, DSIM_SWRST_REG, reset_val); in exynos_dsi_reset()
542 static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, in exynos_dsi_pll_find_pms() argument
545 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_pll_find_pms()
596 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, in exynos_dsi_set_pll() argument
599 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_pll()
606 fin = dsi->pll_clk_rate; in exynos_dsi_set_pll()
607 fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s); in exynos_dsi_set_pll()
609 dev_err(dsi->dev, in exynos_dsi_set_pll()
613 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); in exynos_dsi_set_pll()
616 dsi->reg_base + driver_data->plltmr_reg); in exynos_dsi_set_pll()
633 dev_dbg(dsi->dev, "band %d\n", band); in exynos_dsi_set_pll()
638 exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); in exynos_dsi_set_pll()
643 dev_err(dsi->dev, "PLL failed to stabilize\n"); in exynos_dsi_set_pll()
646 reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); in exynos_dsi_set_pll()
652 static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) in exynos_dsi_enable_clock() argument
658 hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate); in exynos_dsi_enable_clock()
660 dev_err(dsi->dev, "failed to configure DSI PLL\n"); in exynos_dsi_enable_clock()
665 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); in exynos_dsi_enable_clock()
673 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", in exynos_dsi_enable_clock()
676 reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); in exynos_dsi_enable_clock()
683 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) in exynos_dsi_enable_clock()
686 exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); in exynos_dsi_enable_clock()
691 static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) in exynos_dsi_set_phy_ctrl() argument
693 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_phy_ctrl()
703 exynos_dsi_write(dsi, DSIM_PHYCTRL_REG, reg); in exynos_dsi_set_phy_ctrl()
711 exynos_dsi_write(dsi, DSIM_PHYTIMING_REG, reg); in exynos_dsi_set_phy_ctrl()
731 exynos_dsi_write(dsi, DSIM_PHYTIMING1_REG, reg); in exynos_dsi_set_phy_ctrl()
744 exynos_dsi_write(dsi, DSIM_PHYTIMING2_REG, reg); in exynos_dsi_set_phy_ctrl()
747 static void exynos_dsi_disable_clock(struct exynos_dsi *dsi) in exynos_dsi_disable_clock() argument
751 reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); in exynos_dsi_disable_clock()
754 exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); in exynos_dsi_disable_clock()
756 reg = exynos_dsi_read(dsi, DSIM_PLLCTRL_REG); in exynos_dsi_disable_clock()
758 exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); in exynos_dsi_disable_clock()
761 static void exynos_dsi_enable_lane(struct exynos_dsi *dsi, u32 lane) in exynos_dsi_enable_lane() argument
763 u32 reg = exynos_dsi_read(dsi, DSIM_CONFIG_REG); in exynos_dsi_enable_lane()
764 reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | in exynos_dsi_enable_lane()
766 exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); in exynos_dsi_enable_lane()
769 static int exynos_dsi_init_link(struct exynos_dsi *dsi) in exynos_dsi_init_link() argument
771 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init_link()
777 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); in exynos_dsi_init_link()
779 exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); in exynos_dsi_init_link()
784 exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); in exynos_dsi_init_link()
787 /* DSI configuration */ in exynos_dsi_init_link()
792 * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video in exynos_dsi_init_link()
795 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_init_link()
802 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH)) in exynos_dsi_init_link()
804 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in exynos_dsi_init_link()
806 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in exynos_dsi_init_link()
808 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) in exynos_dsi_init_link()
810 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) in exynos_dsi_init_link()
812 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP)) in exynos_dsi_init_link()
814 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP)) in exynos_dsi_init_link()
816 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA)) in exynos_dsi_init_link()
820 if (!(dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)) in exynos_dsi_init_link()
823 switch (dsi->format) { in exynos_dsi_init_link()
837 dev_err(dsi->dev, "invalid pixel format\n"); in exynos_dsi_init_link()
850 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { in exynos_dsi_init_link()
853 exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); in exynos_dsi_init_link()
855 lanes_mask = BIT(dsi->lanes) - 1; in exynos_dsi_init_link()
856 exynos_dsi_enable_lane(dsi, lanes_mask); in exynos_dsi_init_link()
862 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); in exynos_dsi_init_link()
866 reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); in exynos_dsi_init_link()
872 reg = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_init_link()
875 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, reg); in exynos_dsi_init_link()
878 exynos_dsi_write(dsi, DSIM_TIMEOUT_REG, reg); in exynos_dsi_init_link()
883 static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) in exynos_dsi_set_display_mode() argument
885 struct drm_display_mode *m = &dsi->encoder.crtc->state->adjusted_mode; in exynos_dsi_set_display_mode()
886 unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; in exynos_dsi_set_display_mode()
889 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_set_display_mode()
893 exynos_dsi_write(dsi, DSIM_MVPORCH_REG, reg); in exynos_dsi_set_display_mode()
897 exynos_dsi_write(dsi, DSIM_MHPORCH_REG, reg); in exynos_dsi_set_display_mode()
901 exynos_dsi_write(dsi, DSIM_MSYNC_REG, reg); in exynos_dsi_set_display_mode()
906 exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); in exynos_dsi_set_display_mode()
908 dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); in exynos_dsi_set_display_mode()
911 static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable) in exynos_dsi_set_display_enable() argument
915 reg = exynos_dsi_read(dsi, DSIM_MDRESOL_REG); in exynos_dsi_set_display_enable()
920 exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); in exynos_dsi_set_display_enable()
923 static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) in exynos_dsi_wait_for_hdr_fifo() argument
928 u32 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); in exynos_dsi_wait_for_hdr_fifo()
940 static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm) in exynos_dsi_set_cmd_lpm() argument
942 u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_set_cmd_lpm()
949 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); in exynos_dsi_set_cmd_lpm()
952 static void exynos_dsi_force_bta(struct exynos_dsi *dsi) in exynos_dsi_force_bta() argument
954 u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_force_bta()
956 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); in exynos_dsi_force_bta()
959 static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, in exynos_dsi_send_to_fifo() argument
962 struct device *dev = dsi->dev; in exynos_dsi_send_to_fifo()
980 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); in exynos_dsi_send_to_fifo()
995 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); in exynos_dsi_send_to_fifo()
1004 if (exynos_dsi_wait_for_hdr_fifo(dsi)) { in exynos_dsi_send_to_fifo()
1010 dsi->state & DSIM_STATE_CMD_LPM)) { in exynos_dsi_send_to_fifo()
1011 exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); in exynos_dsi_send_to_fifo()
1012 dsi->state ^= DSIM_STATE_CMD_LPM; in exynos_dsi_send_to_fifo()
1015 exynos_dsi_write(dsi, DSIM_PKTHDR_REG, reg); in exynos_dsi_send_to_fifo()
1018 exynos_dsi_force_bta(dsi); in exynos_dsi_send_to_fifo()
1021 static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, in exynos_dsi_read_from_fifo() argument
1026 struct device *dev = dsi->dev; in exynos_dsi_read_from_fifo()
1031 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1049 dev_err(dev, "DSI Error Report: 0x%04x\n", in exynos_dsi_read_from_fifo()
1070 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1080 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1099 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1105 static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) in exynos_dsi_transfer_start() argument
1112 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1114 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_start()
1115 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1119 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_start()
1122 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1129 exynos_dsi_send_to_fifo(dsi, xfer); in exynos_dsi_transfer_start()
1137 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1140 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_start()
1142 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1148 static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) in exynos_dsi_transfer_finish() argument
1154 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1156 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_finish()
1157 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1161 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_finish()
1164 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1166 dev_dbg(dsi->dev, in exynos_dsi_transfer_finish()
1175 exynos_dsi_read_from_fifo(dsi, xfer); in exynos_dsi_transfer_finish()
1180 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1183 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_finish()
1185 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1194 static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, in exynos_dsi_remove_transfer() argument
1200 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1202 if (!list_empty(&dsi->transfer_list) && in exynos_dsi_remove_transfer()
1203 xfer == list_first_entry(&dsi->transfer_list, in exynos_dsi_remove_transfer()
1206 start = !list_empty(&dsi->transfer_list); in exynos_dsi_remove_transfer()
1207 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1209 exynos_dsi_transfer_start(dsi); in exynos_dsi_remove_transfer()
1215 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1218 static int exynos_dsi_transfer(struct exynos_dsi *dsi, in exynos_dsi_transfer() argument
1229 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1231 stopped = list_empty(&dsi->transfer_list); in exynos_dsi_transfer()
1232 list_add_tail(&xfer->list, &dsi->transfer_list); in exynos_dsi_transfer()
1234 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1237 exynos_dsi_transfer_start(dsi); in exynos_dsi_transfer()
1243 exynos_dsi_remove_transfer(dsi, xfer); in exynos_dsi_transfer()
1244 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, in exynos_dsi_transfer()
1255 struct exynos_dsi *dsi = dev_id; in exynos_dsi_irq() local
1258 status = exynos_dsi_read(dsi, DSIM_INTSRC_REG); in exynos_dsi_irq()
1262 dev_warn(dsi->dev, "spurious interrupt\n"); in exynos_dsi_irq()
1265 exynos_dsi_write(dsi, DSIM_INTSRC_REG, status); in exynos_dsi_irq()
1271 exynos_dsi_write(dsi, DSIM_INTMSK_REG, mask); in exynos_dsi_irq()
1272 complete(&dsi->completed); in exynos_dsi_irq()
1280 if (exynos_dsi_transfer_finish(dsi)) in exynos_dsi_irq()
1281 exynos_dsi_transfer_start(dsi); in exynos_dsi_irq()
1288 struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; in exynos_dsi_te_irq_handler() local
1289 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_te_irq_handler()
1291 if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) in exynos_dsi_te_irq_handler()
1297 static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) in exynos_dsi_enable_irq() argument
1299 enable_irq(dsi->irq); in exynos_dsi_enable_irq()
1301 if (gpio_is_valid(dsi->te_gpio)) in exynos_dsi_enable_irq()
1302 enable_irq(gpio_to_irq(dsi->te_gpio)); in exynos_dsi_enable_irq()
1305 static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) in exynos_dsi_disable_irq() argument
1307 if (gpio_is_valid(dsi->te_gpio)) in exynos_dsi_disable_irq()
1308 disable_irq(gpio_to_irq(dsi->te_gpio)); in exynos_dsi_disable_irq()
1310 disable_irq(dsi->irq); in exynos_dsi_disable_irq()
1313 static int exynos_dsi_init(struct exynos_dsi *dsi) in exynos_dsi_init() argument
1315 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init()
1317 exynos_dsi_reset(dsi); in exynos_dsi_init()
1318 exynos_dsi_enable_irq(dsi); in exynos_dsi_init()
1321 exynos_dsi_enable_lane(dsi, BIT(dsi->lanes) - 1); in exynos_dsi_init()
1323 exynos_dsi_enable_clock(dsi); in exynos_dsi_init()
1325 exynos_dsi_wait_for_reset(dsi); in exynos_dsi_init()
1326 exynos_dsi_set_phy_ctrl(dsi); in exynos_dsi_init()
1327 exynos_dsi_init_link(dsi); in exynos_dsi_init()
1332 static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, in exynos_dsi_register_te_irq() argument
1338 dsi->te_gpio = of_get_named_gpio(panel->of_node, "te-gpios", 0); in exynos_dsi_register_te_irq()
1339 if (dsi->te_gpio == -ENOENT) in exynos_dsi_register_te_irq()
1342 if (!gpio_is_valid(dsi->te_gpio)) { in exynos_dsi_register_te_irq()
1343 ret = dsi->te_gpio; in exynos_dsi_register_te_irq()
1344 dev_err(dsi->dev, "cannot get te-gpios, %d\n", ret); in exynos_dsi_register_te_irq()
1348 ret = gpio_request(dsi->te_gpio, "te_gpio"); in exynos_dsi_register_te_irq()
1350 dev_err(dsi->dev, "gpio request failed with %d\n", ret); in exynos_dsi_register_te_irq()
1354 te_gpio_irq = gpio_to_irq(dsi->te_gpio); in exynos_dsi_register_te_irq()
1357 IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); in exynos_dsi_register_te_irq()
1359 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); in exynos_dsi_register_te_irq()
1360 gpio_free(dsi->te_gpio); in exynos_dsi_register_te_irq()
1368 static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) in exynos_dsi_unregister_te_irq() argument
1370 if (gpio_is_valid(dsi->te_gpio)) { in exynos_dsi_unregister_te_irq()
1371 free_irq(gpio_to_irq(dsi->te_gpio), dsi); in exynos_dsi_unregister_te_irq()
1372 gpio_free(dsi->te_gpio); in exynos_dsi_unregister_te_irq()
1373 dsi->te_gpio = -ENOENT; in exynos_dsi_unregister_te_irq()
1379 struct exynos_dsi *dsi = encoder_to_dsi(encoder); in exynos_dsi_enable() local
1383 if (dsi->state & DSIM_STATE_ENABLED) in exynos_dsi_enable()
1386 ret = pm_runtime_resume_and_get(dsi->dev); in exynos_dsi_enable()
1388 dev_err(dsi->dev, "failed to enable DSI device.\n"); in exynos_dsi_enable()
1392 dsi->state |= DSIM_STATE_ENABLED; in exynos_dsi_enable()
1394 if (dsi->panel) { in exynos_dsi_enable()
1395 ret = drm_panel_prepare(dsi->panel); in exynos_dsi_enable()
1399 list_for_each_entry_reverse(iter, &dsi->bridge_chain, in exynos_dsi_enable()
1406 exynos_dsi_set_display_mode(dsi); in exynos_dsi_enable()
1407 exynos_dsi_set_display_enable(dsi, true); in exynos_dsi_enable()
1409 if (dsi->panel) { in exynos_dsi_enable()
1410 ret = drm_panel_enable(dsi->panel); in exynos_dsi_enable()
1414 list_for_each_entry(iter, &dsi->bridge_chain, chain_node) { in exynos_dsi_enable()
1420 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; in exynos_dsi_enable()
1424 exynos_dsi_set_display_enable(dsi, false); in exynos_dsi_enable()
1425 drm_panel_unprepare(dsi->panel); in exynos_dsi_enable()
1428 dsi->state &= ~DSIM_STATE_ENABLED; in exynos_dsi_enable()
1429 pm_runtime_put(dsi->dev); in exynos_dsi_enable()
1434 struct exynos_dsi *dsi = encoder_to_dsi(encoder); in exynos_dsi_disable() local
1437 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_disable()
1440 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; in exynos_dsi_disable()
1442 drm_panel_disable(dsi->panel); in exynos_dsi_disable()
1444 list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) { in exynos_dsi_disable()
1449 exynos_dsi_set_display_enable(dsi, false); in exynos_dsi_disable()
1450 drm_panel_unprepare(dsi->panel); in exynos_dsi_disable()
1452 list_for_each_entry(iter, &dsi->bridge_chain, chain_node) { in exynos_dsi_disable()
1457 dsi->state &= ~DSIM_STATE_ENABLED; in exynos_dsi_disable()
1458 pm_runtime_put_sync(dsi->dev); in exynos_dsi_disable()
1485 struct exynos_dsi *dsi = connector_to_dsi(connector); in exynos_dsi_get_modes() local
1487 if (dsi->panel) in exynos_dsi_get_modes()
1488 return drm_panel_get_modes(dsi->panel, connector); in exynos_dsi_get_modes()
1499 struct exynos_dsi *dsi = encoder_to_dsi(encoder); in exynos_dsi_create_connector() local
1500 struct drm_connector *connector = &dsi->connector; in exynos_dsi_create_connector()
1509 DRM_DEV_ERROR(dsi->dev, in exynos_dsi_create_connector()
1535 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_attach() local
1536 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_host_attach()
1543 dsi->out_bridge = out_bridge; in exynos_dsi_host_attach()
1544 list_splice_init(&encoder->bridge_chain, &dsi->bridge_chain); in exynos_dsi_host_attach()
1549 DRM_DEV_ERROR(dsi->dev, in exynos_dsi_host_attach()
1556 dsi->panel = of_drm_find_panel(device->dev.of_node); in exynos_dsi_host_attach()
1557 if (IS_ERR(dsi->panel)) in exynos_dsi_host_attach()
1558 dsi->panel = NULL; in exynos_dsi_host_attach()
1560 dsi->connector.status = connector_status_connected; in exynos_dsi_host_attach()
1566 * If attached panel device is for command mode one, dsi should register in exynos_dsi_host_attach()
1570 int ret = exynos_dsi_register_te_irq(dsi, &device->dev); in exynos_dsi_host_attach()
1577 dsi->lanes = device->lanes; in exynos_dsi_host_attach()
1578 dsi->format = device->format; in exynos_dsi_host_attach()
1579 dsi->mode_flags = device->mode_flags; in exynos_dsi_host_attach()
1581 !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); in exynos_dsi_host_attach()
1594 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_detach() local
1595 struct drm_device *drm = dsi->encoder.dev; in exynos_dsi_host_detach()
1597 if (dsi->panel) { in exynos_dsi_host_detach()
1599 exynos_dsi_disable(&dsi->encoder); in exynos_dsi_host_detach()
1600 dsi->panel = NULL; in exynos_dsi_host_detach()
1601 dsi->connector.status = connector_status_disconnected; in exynos_dsi_host_detach()
1604 if (dsi->out_bridge->funcs->detach) in exynos_dsi_host_detach()
1605 dsi->out_bridge->funcs->detach(dsi->out_bridge); in exynos_dsi_host_detach()
1606 dsi->out_bridge = NULL; in exynos_dsi_host_detach()
1607 INIT_LIST_HEAD(&dsi->bridge_chain); in exynos_dsi_host_detach()
1613 exynos_dsi_unregister_te_irq(dsi); in exynos_dsi_host_detach()
1621 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_transfer() local
1625 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_host_transfer()
1628 if (!(dsi->state & DSIM_STATE_INITIALIZED)) { in exynos_dsi_host_transfer()
1629 ret = exynos_dsi_init(dsi); in exynos_dsi_host_transfer()
1632 dsi->state |= DSIM_STATE_INITIALIZED; in exynos_dsi_host_transfer()
1643 ret = exynos_dsi_transfer(dsi, &xfer); in exynos_dsi_host_transfer()
1669 static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) in exynos_dsi_parse_dt() argument
1671 struct device *dev = dsi->dev; in exynos_dsi_parse_dt()
1676 &dsi->pll_clk_rate); in exynos_dsi_parse_dt()
1681 &dsi->burst_clk_rate); in exynos_dsi_parse_dt()
1686 &dsi->esc_clk_rate); in exynos_dsi_parse_dt()
1696 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_bind() local
1697 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_bind()
1719 return mipi_dsi_host_register(&dsi->dsi_host); in exynos_dsi_bind()
1725 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_unbind() local
1726 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_unbind()
1730 mipi_dsi_host_unregister(&dsi->dsi_host); in exynos_dsi_unbind()
1741 struct exynos_dsi *dsi; in exynos_dsi_probe() local
1744 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in exynos_dsi_probe()
1745 if (!dsi) in exynos_dsi_probe()
1749 dsi->te_gpio = -ENOENT; in exynos_dsi_probe()
1751 init_completion(&dsi->completed); in exynos_dsi_probe()
1752 spin_lock_init(&dsi->transfer_lock); in exynos_dsi_probe()
1753 INIT_LIST_HEAD(&dsi->transfer_list); in exynos_dsi_probe()
1754 INIT_LIST_HEAD(&dsi->bridge_chain); in exynos_dsi_probe()
1756 dsi->dsi_host.ops = &exynos_dsi_ops; in exynos_dsi_probe()
1757 dsi->dsi_host.dev = dev; in exynos_dsi_probe()
1759 dsi->dev = dev; in exynos_dsi_probe()
1760 dsi->driver_data = of_device_get_match_data(dev); in exynos_dsi_probe()
1762 dsi->supplies[0].supply = "vddcore"; in exynos_dsi_probe()
1763 dsi->supplies[1].supply = "vddio"; in exynos_dsi_probe()
1764 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), in exynos_dsi_probe()
1765 dsi->supplies); in exynos_dsi_probe()
1769 dsi->clks = devm_kcalloc(dev, in exynos_dsi_probe()
1770 dsi->driver_data->num_clks, sizeof(*dsi->clks), in exynos_dsi_probe()
1772 if (!dsi->clks) in exynos_dsi_probe()
1775 for (i = 0; i < dsi->driver_data->num_clks; i++) { in exynos_dsi_probe()
1776 dsi->clks[i] = devm_clk_get(dev, clk_names[i]); in exynos_dsi_probe()
1777 if (IS_ERR(dsi->clks[i])) { in exynos_dsi_probe()
1779 dsi->clks[i] = devm_clk_get(dev, in exynos_dsi_probe()
1781 if (!IS_ERR(dsi->clks[i])) in exynos_dsi_probe()
1787 return PTR_ERR(dsi->clks[i]); in exynos_dsi_probe()
1791 dsi->reg_base = devm_platform_ioremap_resource(pdev, 0); in exynos_dsi_probe()
1792 if (IS_ERR(dsi->reg_base)) in exynos_dsi_probe()
1793 return PTR_ERR(dsi->reg_base); in exynos_dsi_probe()
1795 dsi->phy = devm_phy_get(dev, "dsim"); in exynos_dsi_probe()
1796 if (IS_ERR(dsi->phy)) { in exynos_dsi_probe()
1798 return PTR_ERR(dsi->phy); in exynos_dsi_probe()
1801 dsi->irq = platform_get_irq(pdev, 0); in exynos_dsi_probe()
1802 if (dsi->irq < 0) in exynos_dsi_probe()
1803 return dsi->irq; in exynos_dsi_probe()
1805 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, in exynos_dsi_probe()
1808 dev_name(dev), dsi); in exynos_dsi_probe()
1810 dev_err(dev, "failed to request dsi irq\n"); in exynos_dsi_probe()
1814 ret = exynos_dsi_parse_dt(dsi); in exynos_dsi_probe()
1818 platform_set_drvdata(pdev, dsi); in exynos_dsi_probe()
1845 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_suspend() local
1846 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_suspend()
1851 if (dsi->state & DSIM_STATE_INITIALIZED) { in exynos_dsi_suspend()
1852 dsi->state &= ~DSIM_STATE_INITIALIZED; in exynos_dsi_suspend()
1854 exynos_dsi_disable_clock(dsi); in exynos_dsi_suspend()
1856 exynos_dsi_disable_irq(dsi); in exynos_dsi_suspend()
1859 dsi->state &= ~DSIM_STATE_CMD_LPM; in exynos_dsi_suspend()
1861 phy_power_off(dsi->phy); in exynos_dsi_suspend()
1864 clk_disable_unprepare(dsi->clks[i]); in exynos_dsi_suspend()
1866 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_suspend()
1868 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); in exynos_dsi_suspend()
1875 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_resume() local
1876 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_resume()
1879 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_resume()
1881 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); in exynos_dsi_resume()
1886 ret = clk_prepare_enable(dsi->clks[i]); in exynos_dsi_resume()
1891 ret = phy_power_on(dsi->phy); in exynos_dsi_resume()
1893 dev_err(dsi->dev, "cannot enable phy %d\n", ret); in exynos_dsi_resume()
1901 clk_disable_unprepare(dsi->clks[i]); in exynos_dsi_resume()
1902 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_resume()
1917 .name = "exynos-dsi",
1926 MODULE_DESCRIPTION("Samsung SoC MIPI DSI Master");