Lines Matching full:dsi

3  * Samsung SoC MIPI DSI Master driver.
316 static inline void exynos_dsi_write(struct exynos_dsi *dsi, enum reg_idx idx, in exynos_dsi_write() argument
320 writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in exynos_dsi_write()
323 static inline u32 exynos_dsi_read(struct exynos_dsi *dsi, enum reg_idx idx) in exynos_dsi_read() argument
325 return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in exynos_dsi_read()
505 { .compatible = "samsung,exynos3250-mipi-dsi",
507 { .compatible = "samsung,exynos4210-mipi-dsi",
509 { .compatible = "samsung,exynos5410-mipi-dsi",
511 { .compatible = "samsung,exynos5422-mipi-dsi",
513 { .compatible = "samsung,exynos5433-mipi-dsi",
518 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) in exynos_dsi_wait_for_reset() argument
520 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) in exynos_dsi_wait_for_reset()
523 dev_err(dsi->dev, "timeout waiting for reset\n"); in exynos_dsi_wait_for_reset()
526 static void exynos_dsi_reset(struct exynos_dsi *dsi) in exynos_dsi_reset() argument
528 u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; in exynos_dsi_reset()
530 reinit_completion(&dsi->completed); in exynos_dsi_reset()
531 exynos_dsi_write(dsi, DSIM_SWRST_REG, reset_val); in exynos_dsi_reset()
538 static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, in exynos_dsi_pll_find_pms() argument
541 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_pll_find_pms()
592 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, in exynos_dsi_set_pll() argument
595 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_pll()
602 fin = dsi->pll_clk_rate; in exynos_dsi_set_pll()
603 fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s); in exynos_dsi_set_pll()
605 dev_err(dsi->dev, in exynos_dsi_set_pll()
609 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); in exynos_dsi_set_pll()
612 dsi->reg_base + driver_data->plltmr_reg); in exynos_dsi_set_pll()
629 dev_dbg(dsi->dev, "band %d\n", band); in exynos_dsi_set_pll()
634 exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); in exynos_dsi_set_pll()
639 dev_err(dsi->dev, "PLL failed to stabilize\n"); in exynos_dsi_set_pll()
642 reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); in exynos_dsi_set_pll()
648 static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) in exynos_dsi_enable_clock() argument
654 hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate); in exynos_dsi_enable_clock()
656 dev_err(dsi->dev, "failed to configure DSI PLL\n"); in exynos_dsi_enable_clock()
661 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); in exynos_dsi_enable_clock()
669 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", in exynos_dsi_enable_clock()
672 reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); in exynos_dsi_enable_clock()
679 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) in exynos_dsi_enable_clock()
682 exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); in exynos_dsi_enable_clock()
687 static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) in exynos_dsi_set_phy_ctrl() argument
689 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_phy_ctrl()
699 exynos_dsi_write(dsi, DSIM_PHYCTRL_REG, reg); in exynos_dsi_set_phy_ctrl()
707 exynos_dsi_write(dsi, DSIM_PHYTIMING_REG, reg); in exynos_dsi_set_phy_ctrl()
727 exynos_dsi_write(dsi, DSIM_PHYTIMING1_REG, reg); in exynos_dsi_set_phy_ctrl()
740 exynos_dsi_write(dsi, DSIM_PHYTIMING2_REG, reg); in exynos_dsi_set_phy_ctrl()
743 static void exynos_dsi_disable_clock(struct exynos_dsi *dsi) in exynos_dsi_disable_clock() argument
747 reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); in exynos_dsi_disable_clock()
750 exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); in exynos_dsi_disable_clock()
752 reg = exynos_dsi_read(dsi, DSIM_PLLCTRL_REG); in exynos_dsi_disable_clock()
754 exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); in exynos_dsi_disable_clock()
757 static void exynos_dsi_enable_lane(struct exynos_dsi *dsi, u32 lane) in exynos_dsi_enable_lane() argument
759 u32 reg = exynos_dsi_read(dsi, DSIM_CONFIG_REG); in exynos_dsi_enable_lane()
760 reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | in exynos_dsi_enable_lane()
762 exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); in exynos_dsi_enable_lane()
765 static int exynos_dsi_init_link(struct exynos_dsi *dsi) in exynos_dsi_init_link() argument
767 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init_link()
773 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); in exynos_dsi_init_link()
775 exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); in exynos_dsi_init_link()
780 exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); in exynos_dsi_init_link()
783 /* DSI configuration */ in exynos_dsi_init_link()
788 * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video in exynos_dsi_init_link()
791 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_init_link()
798 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH)) in exynos_dsi_init_link()
800 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in exynos_dsi_init_link()
802 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in exynos_dsi_init_link()
804 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) in exynos_dsi_init_link()
806 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) in exynos_dsi_init_link()
808 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP)) in exynos_dsi_init_link()
810 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP)) in exynos_dsi_init_link()
812 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA)) in exynos_dsi_init_link()
816 if (!(dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)) in exynos_dsi_init_link()
819 switch (dsi->format) { in exynos_dsi_init_link()
833 dev_err(dsi->dev, "invalid pixel format\n"); in exynos_dsi_init_link()
846 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { in exynos_dsi_init_link()
849 exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); in exynos_dsi_init_link()
851 lanes_mask = BIT(dsi->lanes) - 1; in exynos_dsi_init_link()
852 exynos_dsi_enable_lane(dsi, lanes_mask); in exynos_dsi_init_link()
858 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); in exynos_dsi_init_link()
862 reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); in exynos_dsi_init_link()
868 reg = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_init_link()
871 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, reg); in exynos_dsi_init_link()
874 exynos_dsi_write(dsi, DSIM_TIMEOUT_REG, reg); in exynos_dsi_init_link()
879 static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) in exynos_dsi_set_display_mode() argument
881 struct drm_display_mode *m = &dsi->mode; in exynos_dsi_set_display_mode()
882 unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; in exynos_dsi_set_display_mode()
885 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_set_display_mode()
889 exynos_dsi_write(dsi, DSIM_MVPORCH_REG, reg); in exynos_dsi_set_display_mode()
893 exynos_dsi_write(dsi, DSIM_MHPORCH_REG, reg); in exynos_dsi_set_display_mode()
897 exynos_dsi_write(dsi, DSIM_MSYNC_REG, reg); in exynos_dsi_set_display_mode()
902 exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); in exynos_dsi_set_display_mode()
904 dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); in exynos_dsi_set_display_mode()
907 static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable) in exynos_dsi_set_display_enable() argument
911 reg = exynos_dsi_read(dsi, DSIM_MDRESOL_REG); in exynos_dsi_set_display_enable()
916 exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); in exynos_dsi_set_display_enable()
919 static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) in exynos_dsi_wait_for_hdr_fifo() argument
924 u32 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); in exynos_dsi_wait_for_hdr_fifo()
936 static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm) in exynos_dsi_set_cmd_lpm() argument
938 u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_set_cmd_lpm()
945 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); in exynos_dsi_set_cmd_lpm()
948 static void exynos_dsi_force_bta(struct exynos_dsi *dsi) in exynos_dsi_force_bta() argument
950 u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_force_bta()
952 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); in exynos_dsi_force_bta()
955 static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, in exynos_dsi_send_to_fifo() argument
958 struct device *dev = dsi->dev; in exynos_dsi_send_to_fifo()
976 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); in exynos_dsi_send_to_fifo()
991 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); in exynos_dsi_send_to_fifo()
1000 if (exynos_dsi_wait_for_hdr_fifo(dsi)) { in exynos_dsi_send_to_fifo()
1006 dsi->state & DSIM_STATE_CMD_LPM)) { in exynos_dsi_send_to_fifo()
1007 exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); in exynos_dsi_send_to_fifo()
1008 dsi->state ^= DSIM_STATE_CMD_LPM; in exynos_dsi_send_to_fifo()
1011 exynos_dsi_write(dsi, DSIM_PKTHDR_REG, reg); in exynos_dsi_send_to_fifo()
1014 exynos_dsi_force_bta(dsi); in exynos_dsi_send_to_fifo()
1017 static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, in exynos_dsi_read_from_fifo() argument
1022 struct device *dev = dsi->dev; in exynos_dsi_read_from_fifo()
1027 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1045 dev_err(dev, "DSI Error Report: 0x%04x\n", in exynos_dsi_read_from_fifo()
1066 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1076 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1095 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1101 static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) in exynos_dsi_transfer_start() argument
1108 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1110 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_start()
1111 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1115 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_start()
1118 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1125 exynos_dsi_send_to_fifo(dsi, xfer); in exynos_dsi_transfer_start()
1133 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1136 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_start()
1138 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1144 static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) in exynos_dsi_transfer_finish() argument
1150 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1152 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_finish()
1153 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1157 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_finish()
1160 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1162 dev_dbg(dsi->dev, in exynos_dsi_transfer_finish()
1171 exynos_dsi_read_from_fifo(dsi, xfer); in exynos_dsi_transfer_finish()
1176 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1179 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_finish()
1181 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1190 static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, in exynos_dsi_remove_transfer() argument
1196 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1198 if (!list_empty(&dsi->transfer_list) && in exynos_dsi_remove_transfer()
1199 xfer == list_first_entry(&dsi->transfer_list, in exynos_dsi_remove_transfer()
1202 start = !list_empty(&dsi->transfer_list); in exynos_dsi_remove_transfer()
1203 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1205 exynos_dsi_transfer_start(dsi); in exynos_dsi_remove_transfer()
1211 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1214 static int exynos_dsi_transfer(struct exynos_dsi *dsi, in exynos_dsi_transfer() argument
1225 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1227 stopped = list_empty(&dsi->transfer_list); in exynos_dsi_transfer()
1228 list_add_tail(&xfer->list, &dsi->transfer_list); in exynos_dsi_transfer()
1230 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1233 exynos_dsi_transfer_start(dsi); in exynos_dsi_transfer()
1239 exynos_dsi_remove_transfer(dsi, xfer); in exynos_dsi_transfer()
1240 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, in exynos_dsi_transfer()
1251 struct exynos_dsi *dsi = dev_id; in exynos_dsi_irq() local
1254 status = exynos_dsi_read(dsi, DSIM_INTSRC_REG); in exynos_dsi_irq()
1258 dev_warn(dsi->dev, "spurious interrupt\n"); in exynos_dsi_irq()
1261 exynos_dsi_write(dsi, DSIM_INTSRC_REG, status); in exynos_dsi_irq()
1267 exynos_dsi_write(dsi, DSIM_INTMSK_REG, mask); in exynos_dsi_irq()
1268 complete(&dsi->completed); in exynos_dsi_irq()
1276 if (exynos_dsi_transfer_finish(dsi)) in exynos_dsi_irq()
1277 exynos_dsi_transfer_start(dsi); in exynos_dsi_irq()
1284 struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; in exynos_dsi_te_irq_handler() local
1285 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_te_irq_handler()
1287 if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) in exynos_dsi_te_irq_handler()
1293 static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) in exynos_dsi_enable_irq() argument
1295 enable_irq(dsi->irq); in exynos_dsi_enable_irq()
1297 if (dsi->te_gpio) in exynos_dsi_enable_irq()
1298 enable_irq(gpiod_to_irq(dsi->te_gpio)); in exynos_dsi_enable_irq()
1301 static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) in exynos_dsi_disable_irq() argument
1303 if (dsi->te_gpio) in exynos_dsi_disable_irq()
1304 disable_irq(gpiod_to_irq(dsi->te_gpio)); in exynos_dsi_disable_irq()
1306 disable_irq(dsi->irq); in exynos_dsi_disable_irq()
1309 static int exynos_dsi_init(struct exynos_dsi *dsi) in exynos_dsi_init() argument
1311 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init()
1313 exynos_dsi_reset(dsi); in exynos_dsi_init()
1314 exynos_dsi_enable_irq(dsi); in exynos_dsi_init()
1317 exynos_dsi_enable_lane(dsi, BIT(dsi->lanes) - 1); in exynos_dsi_init()
1319 exynos_dsi_enable_clock(dsi); in exynos_dsi_init()
1321 exynos_dsi_wait_for_reset(dsi); in exynos_dsi_init()
1322 exynos_dsi_set_phy_ctrl(dsi); in exynos_dsi_init()
1323 exynos_dsi_init_link(dsi); in exynos_dsi_init()
1328 static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, in exynos_dsi_register_te_irq() argument
1334 dsi->te_gpio = gpiod_get_optional(panel, "te", GPIOD_IN); in exynos_dsi_register_te_irq()
1335 if (!dsi->te_gpio) { in exynos_dsi_register_te_irq()
1337 } else if (IS_ERR(dsi->te_gpio)) { in exynos_dsi_register_te_irq()
1338 dev_err(dsi->dev, "gpio request failed with %ld\n", in exynos_dsi_register_te_irq()
1339 PTR_ERR(dsi->te_gpio)); in exynos_dsi_register_te_irq()
1340 return PTR_ERR(dsi->te_gpio); in exynos_dsi_register_te_irq()
1343 te_gpio_irq = gpiod_to_irq(dsi->te_gpio); in exynos_dsi_register_te_irq()
1346 IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); in exynos_dsi_register_te_irq()
1348 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); in exynos_dsi_register_te_irq()
1349 gpiod_put(dsi->te_gpio); in exynos_dsi_register_te_irq()
1356 static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) in exynos_dsi_unregister_te_irq() argument
1358 if (dsi->te_gpio) { in exynos_dsi_unregister_te_irq()
1359 free_irq(gpiod_to_irq(dsi->te_gpio), dsi); in exynos_dsi_unregister_te_irq()
1360 gpiod_put(dsi->te_gpio); in exynos_dsi_unregister_te_irq()
1367 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_pre_enable() local
1370 if (dsi->state & DSIM_STATE_ENABLED) in exynos_dsi_atomic_pre_enable()
1373 ret = pm_runtime_resume_and_get(dsi->dev); in exynos_dsi_atomic_pre_enable()
1375 dev_err(dsi->dev, "failed to enable DSI device.\n"); in exynos_dsi_atomic_pre_enable()
1379 dsi->state |= DSIM_STATE_ENABLED; in exynos_dsi_atomic_pre_enable()
1385 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_enable() local
1387 exynos_dsi_set_display_mode(dsi); in exynos_dsi_atomic_enable()
1388 exynos_dsi_set_display_enable(dsi, true); in exynos_dsi_atomic_enable()
1390 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; in exynos_dsi_atomic_enable()
1398 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_disable() local
1400 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_atomic_disable()
1403 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; in exynos_dsi_atomic_disable()
1409 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_post_disable() local
1411 exynos_dsi_set_display_enable(dsi, false); in exynos_dsi_atomic_post_disable()
1413 dsi->state &= ~DSIM_STATE_ENABLED; in exynos_dsi_atomic_post_disable()
1414 pm_runtime_put_sync(dsi->dev); in exynos_dsi_atomic_post_disable()
1421 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_mode_set() local
1423 drm_mode_copy(&dsi->mode, adjusted_mode); in exynos_dsi_mode_set()
1429 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_attach() local
1431 return drm_bridge_attach(bridge->encoder, dsi->out_bridge, NULL, flags); in exynos_dsi_attach()
1451 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_attach() local
1452 struct device *dev = dsi->dev; in exynos_dsi_host_attach()
1453 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_host_attach()
1460 dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel); in exynos_dsi_host_attach()
1462 dsi->out_bridge = of_drm_find_bridge(device->dev.of_node); in exynos_dsi_host_attach()
1463 if (!dsi->out_bridge) in exynos_dsi_host_attach()
1464 dsi->out_bridge = ERR_PTR(-EINVAL); in exynos_dsi_host_attach()
1467 if (IS_ERR(dsi->out_bridge)) { in exynos_dsi_host_attach()
1468 ret = PTR_ERR(dsi->out_bridge); in exynos_dsi_host_attach()
1475 drm_bridge_add(&dsi->bridge); in exynos_dsi_host_attach()
1477 drm_bridge_attach(encoder, &dsi->bridge, NULL, 0); in exynos_dsi_host_attach()
1482 * If attached panel device is for command mode one, dsi should register in exynos_dsi_host_attach()
1486 ret = exynos_dsi_register_te_irq(dsi, &device->dev); in exynos_dsi_host_attach()
1493 dsi->lanes = device->lanes; in exynos_dsi_host_attach()
1494 dsi->format = device->format; in exynos_dsi_host_attach()
1495 dsi->mode_flags = device->mode_flags; in exynos_dsi_host_attach()
1497 !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); in exynos_dsi_host_attach()
1510 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_detach() local
1511 struct drm_device *drm = dsi->encoder.dev; in exynos_dsi_host_detach()
1513 if (dsi->out_bridge->funcs->detach) in exynos_dsi_host_detach()
1514 dsi->out_bridge->funcs->detach(dsi->out_bridge); in exynos_dsi_host_detach()
1515 dsi->out_bridge = NULL; in exynos_dsi_host_detach()
1520 exynos_dsi_unregister_te_irq(dsi); in exynos_dsi_host_detach()
1522 drm_bridge_remove(&dsi->bridge); in exynos_dsi_host_detach()
1530 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_transfer() local
1534 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_host_transfer()
1537 if (!(dsi->state & DSIM_STATE_INITIALIZED)) { in exynos_dsi_host_transfer()
1538 ret = exynos_dsi_init(dsi); in exynos_dsi_host_transfer()
1541 dsi->state |= DSIM_STATE_INITIALIZED; in exynos_dsi_host_transfer()
1552 ret = exynos_dsi_transfer(dsi, &xfer); in exynos_dsi_host_transfer()
1573 static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) in exynos_dsi_parse_dt() argument
1575 struct device *dev = dsi->dev; in exynos_dsi_parse_dt()
1580 &dsi->pll_clk_rate); in exynos_dsi_parse_dt()
1585 &dsi->burst_clk_rate); in exynos_dsi_parse_dt()
1590 &dsi->esc_clk_rate); in exynos_dsi_parse_dt()
1600 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_bind() local
1601 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_bind()
1611 return mipi_dsi_host_register(&dsi->dsi_host); in exynos_dsi_bind()
1617 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_unbind() local
1619 exynos_dsi_atomic_disable(&dsi->bridge, NULL); in exynos_dsi_unbind()
1621 mipi_dsi_host_unregister(&dsi->dsi_host); in exynos_dsi_unbind()
1632 struct exynos_dsi *dsi; in exynos_dsi_probe() local
1635 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in exynos_dsi_probe()
1636 if (!dsi) in exynos_dsi_probe()
1639 init_completion(&dsi->completed); in exynos_dsi_probe()
1640 spin_lock_init(&dsi->transfer_lock); in exynos_dsi_probe()
1641 INIT_LIST_HEAD(&dsi->transfer_list); in exynos_dsi_probe()
1643 dsi->dsi_host.ops = &exynos_dsi_ops; in exynos_dsi_probe()
1644 dsi->dsi_host.dev = dev; in exynos_dsi_probe()
1646 dsi->dev = dev; in exynos_dsi_probe()
1647 dsi->driver_data = of_device_get_match_data(dev); in exynos_dsi_probe()
1649 dsi->supplies[0].supply = "vddcore"; in exynos_dsi_probe()
1650 dsi->supplies[1].supply = "vddio"; in exynos_dsi_probe()
1651 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), in exynos_dsi_probe()
1652 dsi->supplies); in exynos_dsi_probe()
1656 dsi->clks = devm_kcalloc(dev, in exynos_dsi_probe()
1657 dsi->driver_data->num_clks, sizeof(*dsi->clks), in exynos_dsi_probe()
1659 if (!dsi->clks) in exynos_dsi_probe()
1662 for (i = 0; i < dsi->driver_data->num_clks; i++) { in exynos_dsi_probe()
1663 dsi->clks[i] = devm_clk_get(dev, clk_names[i]); in exynos_dsi_probe()
1664 if (IS_ERR(dsi->clks[i])) { in exynos_dsi_probe()
1666 dsi->clks[i] = devm_clk_get(dev, in exynos_dsi_probe()
1668 if (!IS_ERR(dsi->clks[i])) in exynos_dsi_probe()
1674 return PTR_ERR(dsi->clks[i]); in exynos_dsi_probe()
1678 dsi->reg_base = devm_platform_ioremap_resource(pdev, 0); in exynos_dsi_probe()
1679 if (IS_ERR(dsi->reg_base)) in exynos_dsi_probe()
1680 return PTR_ERR(dsi->reg_base); in exynos_dsi_probe()
1682 dsi->phy = devm_phy_get(dev, "dsim"); in exynos_dsi_probe()
1683 if (IS_ERR(dsi->phy)) { in exynos_dsi_probe()
1685 return PTR_ERR(dsi->phy); in exynos_dsi_probe()
1688 dsi->irq = platform_get_irq(pdev, 0); in exynos_dsi_probe()
1689 if (dsi->irq < 0) in exynos_dsi_probe()
1690 return dsi->irq; in exynos_dsi_probe()
1692 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, in exynos_dsi_probe()
1695 dev_name(dev), dsi); in exynos_dsi_probe()
1697 dev_err(dev, "failed to request dsi irq\n"); in exynos_dsi_probe()
1701 ret = exynos_dsi_parse_dt(dsi); in exynos_dsi_probe()
1705 platform_set_drvdata(pdev, dsi); in exynos_dsi_probe()
1709 dsi->bridge.funcs = &exynos_dsi_bridge_funcs; in exynos_dsi_probe()
1710 dsi->bridge.of_node = dev->of_node; in exynos_dsi_probe()
1711 dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; in exynos_dsi_probe()
1736 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_suspend() local
1737 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_suspend()
1742 if (dsi->state & DSIM_STATE_INITIALIZED) { in exynos_dsi_suspend()
1743 dsi->state &= ~DSIM_STATE_INITIALIZED; in exynos_dsi_suspend()
1745 exynos_dsi_disable_clock(dsi); in exynos_dsi_suspend()
1747 exynos_dsi_disable_irq(dsi); in exynos_dsi_suspend()
1750 dsi->state &= ~DSIM_STATE_CMD_LPM; in exynos_dsi_suspend()
1752 phy_power_off(dsi->phy); in exynos_dsi_suspend()
1755 clk_disable_unprepare(dsi->clks[i]); in exynos_dsi_suspend()
1757 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_suspend()
1759 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); in exynos_dsi_suspend()
1766 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_resume() local
1767 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_resume()
1770 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_resume()
1772 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); in exynos_dsi_resume()
1777 ret = clk_prepare_enable(dsi->clks[i]); in exynos_dsi_resume()
1782 ret = phy_power_on(dsi->phy); in exynos_dsi_resume()
1784 dev_err(dsi->dev, "cannot enable phy %d\n", ret); in exynos_dsi_resume()
1792 clk_disable_unprepare(dsi->clks[i]); in exynos_dsi_resume()
1793 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_resume()
1808 .name = "exynos-dsi",
1817 MODULE_DESCRIPTION("Samsung SoC MIPI DSI Master");