Lines Matching refs:dsi

333 static inline void exynos_dsi_write(struct exynos_dsi *dsi, enum reg_idx idx,  in exynos_dsi_write()  argument
337 writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in exynos_dsi_write()
340 static inline u32 exynos_dsi_read(struct exynos_dsi *dsi, enum reg_idx idx) in exynos_dsi_read() argument
342 return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in exynos_dsi_read()
535 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi) in exynos_dsi_wait_for_reset() argument
537 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) in exynos_dsi_wait_for_reset()
540 dev_err(dsi->dev, "timeout waiting for reset\n"); in exynos_dsi_wait_for_reset()
543 static void exynos_dsi_reset(struct exynos_dsi *dsi) in exynos_dsi_reset() argument
545 u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; in exynos_dsi_reset()
547 reinit_completion(&dsi->completed); in exynos_dsi_reset()
548 exynos_dsi_write(dsi, DSIM_SWRST_REG, reset_val); in exynos_dsi_reset()
555 static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, in exynos_dsi_pll_find_pms() argument
558 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_pll_find_pms()
609 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, in exynos_dsi_set_pll() argument
612 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_pll()
619 fin = dsi->pll_clk_rate; in exynos_dsi_set_pll()
620 fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s); in exynos_dsi_set_pll()
622 dev_err(dsi->dev, in exynos_dsi_set_pll()
626 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); in exynos_dsi_set_pll()
629 dsi->reg_base + driver_data->plltmr_reg); in exynos_dsi_set_pll()
646 dev_dbg(dsi->dev, "band %d\n", band); in exynos_dsi_set_pll()
651 exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); in exynos_dsi_set_pll()
656 dev_err(dsi->dev, "PLL failed to stabilize\n"); in exynos_dsi_set_pll()
659 reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); in exynos_dsi_set_pll()
665 static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) in exynos_dsi_enable_clock() argument
671 hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate); in exynos_dsi_enable_clock()
673 dev_err(dsi->dev, "failed to configure DSI PLL\n"); in exynos_dsi_enable_clock()
678 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); in exynos_dsi_enable_clock()
686 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", in exynos_dsi_enable_clock()
689 reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); in exynos_dsi_enable_clock()
696 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) in exynos_dsi_enable_clock()
699 exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); in exynos_dsi_enable_clock()
704 static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) in exynos_dsi_set_phy_ctrl() argument
706 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_phy_ctrl()
716 exynos_dsi_write(dsi, DSIM_PHYCTRL_REG, reg); in exynos_dsi_set_phy_ctrl()
724 exynos_dsi_write(dsi, DSIM_PHYTIMING_REG, reg); in exynos_dsi_set_phy_ctrl()
744 exynos_dsi_write(dsi, DSIM_PHYTIMING1_REG, reg); in exynos_dsi_set_phy_ctrl()
757 exynos_dsi_write(dsi, DSIM_PHYTIMING2_REG, reg); in exynos_dsi_set_phy_ctrl()
760 static void exynos_dsi_disable_clock(struct exynos_dsi *dsi) in exynos_dsi_disable_clock() argument
764 reg = exynos_dsi_read(dsi, DSIM_CLKCTRL_REG); in exynos_dsi_disable_clock()
767 exynos_dsi_write(dsi, DSIM_CLKCTRL_REG, reg); in exynos_dsi_disable_clock()
769 reg = exynos_dsi_read(dsi, DSIM_PLLCTRL_REG); in exynos_dsi_disable_clock()
771 exynos_dsi_write(dsi, DSIM_PLLCTRL_REG, reg); in exynos_dsi_disable_clock()
774 static void exynos_dsi_enable_lane(struct exynos_dsi *dsi, u32 lane) in exynos_dsi_enable_lane() argument
776 u32 reg = exynos_dsi_read(dsi, DSIM_CONFIG_REG); in exynos_dsi_enable_lane()
777 reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | in exynos_dsi_enable_lane()
779 exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); in exynos_dsi_enable_lane()
782 static int exynos_dsi_init_link(struct exynos_dsi *dsi) in exynos_dsi_init_link() argument
784 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init_link()
790 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); in exynos_dsi_init_link()
792 exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); in exynos_dsi_init_link()
797 exynos_dsi_write(dsi, DSIM_FIFOCTRL_REG, reg); in exynos_dsi_init_link()
808 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_init_link()
815 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH)) in exynos_dsi_init_link()
817 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in exynos_dsi_init_link()
819 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in exynos_dsi_init_link()
821 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) in exynos_dsi_init_link()
823 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) in exynos_dsi_init_link()
825 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP) in exynos_dsi_init_link()
827 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP) in exynos_dsi_init_link()
829 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA) in exynos_dsi_init_link()
833 if (dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET) in exynos_dsi_init_link()
836 switch (dsi->format) { in exynos_dsi_init_link()
850 dev_err(dsi->dev, "invalid pixel format\n"); in exynos_dsi_init_link()
863 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { in exynos_dsi_init_link()
866 exynos_dsi_write(dsi, DSIM_CONFIG_REG, reg); in exynos_dsi_init_link()
868 lanes_mask = BIT(dsi->lanes) - 1; in exynos_dsi_init_link()
869 exynos_dsi_enable_lane(dsi, lanes_mask); in exynos_dsi_init_link()
875 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); in exynos_dsi_init_link()
879 reg = exynos_dsi_read(dsi, DSIM_STATUS_REG); in exynos_dsi_init_link()
885 reg = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_init_link()
888 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, reg); in exynos_dsi_init_link()
891 exynos_dsi_write(dsi, DSIM_TIMEOUT_REG, reg); in exynos_dsi_init_link()
896 static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) in exynos_dsi_set_display_mode() argument
898 struct drm_display_mode *m = &dsi->mode; in exynos_dsi_set_display_mode()
899 unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; in exynos_dsi_set_display_mode()
902 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_set_display_mode()
906 exynos_dsi_write(dsi, DSIM_MVPORCH_REG, reg); in exynos_dsi_set_display_mode()
910 exynos_dsi_write(dsi, DSIM_MHPORCH_REG, reg); in exynos_dsi_set_display_mode()
914 exynos_dsi_write(dsi, DSIM_MSYNC_REG, reg); in exynos_dsi_set_display_mode()
919 exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); in exynos_dsi_set_display_mode()
921 dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); in exynos_dsi_set_display_mode()
924 static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable) in exynos_dsi_set_display_enable() argument
928 reg = exynos_dsi_read(dsi, DSIM_MDRESOL_REG); in exynos_dsi_set_display_enable()
933 exynos_dsi_write(dsi, DSIM_MDRESOL_REG, reg); in exynos_dsi_set_display_enable()
936 static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) in exynos_dsi_wait_for_hdr_fifo() argument
941 u32 reg = exynos_dsi_read(dsi, DSIM_FIFOCTRL_REG); in exynos_dsi_wait_for_hdr_fifo()
953 static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm) in exynos_dsi_set_cmd_lpm() argument
955 u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_set_cmd_lpm()
962 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); in exynos_dsi_set_cmd_lpm()
965 static void exynos_dsi_force_bta(struct exynos_dsi *dsi) in exynos_dsi_force_bta() argument
967 u32 v = exynos_dsi_read(dsi, DSIM_ESCMODE_REG); in exynos_dsi_force_bta()
969 exynos_dsi_write(dsi, DSIM_ESCMODE_REG, v); in exynos_dsi_force_bta()
972 static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, in exynos_dsi_send_to_fifo() argument
975 struct device *dev = dsi->dev; in exynos_dsi_send_to_fifo()
993 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); in exynos_dsi_send_to_fifo()
1008 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg); in exynos_dsi_send_to_fifo()
1017 if (exynos_dsi_wait_for_hdr_fifo(dsi)) { in exynos_dsi_send_to_fifo()
1023 dsi->state & DSIM_STATE_CMD_LPM)) { in exynos_dsi_send_to_fifo()
1024 exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); in exynos_dsi_send_to_fifo()
1025 dsi->state ^= DSIM_STATE_CMD_LPM; in exynos_dsi_send_to_fifo()
1028 exynos_dsi_write(dsi, DSIM_PKTHDR_REG, reg); in exynos_dsi_send_to_fifo()
1031 exynos_dsi_force_bta(dsi); in exynos_dsi_send_to_fifo()
1034 static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, in exynos_dsi_read_from_fifo() argument
1039 struct device *dev = dsi->dev; in exynos_dsi_read_from_fifo()
1044 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1083 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1093 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1112 reg = exynos_dsi_read(dsi, DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
1118 static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) in exynos_dsi_transfer_start() argument
1125 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1127 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_start()
1128 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1132 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_start()
1135 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1142 exynos_dsi_send_to_fifo(dsi, xfer); in exynos_dsi_transfer_start()
1150 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1153 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_start()
1155 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
1161 static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) in exynos_dsi_transfer_finish() argument
1167 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1169 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_finish()
1170 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1174 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_finish()
1177 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1179 dev_dbg(dsi->dev, in exynos_dsi_transfer_finish()
1188 exynos_dsi_read_from_fifo(dsi, xfer); in exynos_dsi_transfer_finish()
1193 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1196 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_finish()
1198 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1207 static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, in exynos_dsi_remove_transfer() argument
1213 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1215 if (!list_empty(&dsi->transfer_list) && in exynos_dsi_remove_transfer()
1216 xfer == list_first_entry(&dsi->transfer_list, in exynos_dsi_remove_transfer()
1219 start = !list_empty(&dsi->transfer_list); in exynos_dsi_remove_transfer()
1220 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1222 exynos_dsi_transfer_start(dsi); in exynos_dsi_remove_transfer()
1228 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1231 static int exynos_dsi_transfer(struct exynos_dsi *dsi, in exynos_dsi_transfer() argument
1242 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1244 stopped = list_empty(&dsi->transfer_list); in exynos_dsi_transfer()
1245 list_add_tail(&xfer->list, &dsi->transfer_list); in exynos_dsi_transfer()
1247 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1250 exynos_dsi_transfer_start(dsi); in exynos_dsi_transfer()
1256 exynos_dsi_remove_transfer(dsi, xfer); in exynos_dsi_transfer()
1257 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, in exynos_dsi_transfer()
1268 struct exynos_dsi *dsi = dev_id; in exynos_dsi_irq() local
1271 status = exynos_dsi_read(dsi, DSIM_INTSRC_REG); in exynos_dsi_irq()
1275 dev_warn(dsi->dev, "spurious interrupt\n"); in exynos_dsi_irq()
1278 exynos_dsi_write(dsi, DSIM_INTSRC_REG, status); in exynos_dsi_irq()
1284 exynos_dsi_write(dsi, DSIM_INTMSK_REG, mask); in exynos_dsi_irq()
1285 complete(&dsi->completed); in exynos_dsi_irq()
1293 if (exynos_dsi_transfer_finish(dsi)) in exynos_dsi_irq()
1294 exynos_dsi_transfer_start(dsi); in exynos_dsi_irq()
1301 struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; in exynos_dsi_te_irq_handler() local
1302 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_te_irq_handler()
1304 if (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE) in exynos_dsi_te_irq_handler()
1310 static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) in exynos_dsi_enable_irq() argument
1312 enable_irq(dsi->irq); in exynos_dsi_enable_irq()
1314 if (dsi->te_gpio) in exynos_dsi_enable_irq()
1315 enable_irq(gpiod_to_irq(dsi->te_gpio)); in exynos_dsi_enable_irq()
1318 static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) in exynos_dsi_disable_irq() argument
1320 if (dsi->te_gpio) in exynos_dsi_disable_irq()
1321 disable_irq(gpiod_to_irq(dsi->te_gpio)); in exynos_dsi_disable_irq()
1323 disable_irq(dsi->irq); in exynos_dsi_disable_irq()
1326 static int exynos_dsi_init(struct exynos_dsi *dsi) in exynos_dsi_init() argument
1328 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init()
1330 exynos_dsi_reset(dsi); in exynos_dsi_init()
1331 exynos_dsi_enable_irq(dsi); in exynos_dsi_init()
1334 exynos_dsi_enable_lane(dsi, BIT(dsi->lanes) - 1); in exynos_dsi_init()
1336 exynos_dsi_enable_clock(dsi); in exynos_dsi_init()
1338 exynos_dsi_wait_for_reset(dsi); in exynos_dsi_init()
1339 exynos_dsi_set_phy_ctrl(dsi); in exynos_dsi_init()
1340 exynos_dsi_init_link(dsi); in exynos_dsi_init()
1345 static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, in exynos_dsi_register_te_irq() argument
1351 dsi->te_gpio = gpiod_get_optional(panel, "te", GPIOD_IN); in exynos_dsi_register_te_irq()
1352 if (!dsi->te_gpio) { in exynos_dsi_register_te_irq()
1354 } else if (IS_ERR(dsi->te_gpio)) { in exynos_dsi_register_te_irq()
1355 dev_err(dsi->dev, "gpio request failed with %ld\n", in exynos_dsi_register_te_irq()
1356 PTR_ERR(dsi->te_gpio)); in exynos_dsi_register_te_irq()
1357 return PTR_ERR(dsi->te_gpio); in exynos_dsi_register_te_irq()
1360 te_gpio_irq = gpiod_to_irq(dsi->te_gpio); in exynos_dsi_register_te_irq()
1363 IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); in exynos_dsi_register_te_irq()
1365 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); in exynos_dsi_register_te_irq()
1366 gpiod_put(dsi->te_gpio); in exynos_dsi_register_te_irq()
1373 static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) in exynos_dsi_unregister_te_irq() argument
1375 if (dsi->te_gpio) { in exynos_dsi_unregister_te_irq()
1376 free_irq(gpiod_to_irq(dsi->te_gpio), dsi); in exynos_dsi_unregister_te_irq()
1377 gpiod_put(dsi->te_gpio); in exynos_dsi_unregister_te_irq()
1384 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_pre_enable() local
1387 if (dsi->state & DSIM_STATE_ENABLED) in exynos_dsi_atomic_pre_enable()
1390 ret = pm_runtime_resume_and_get(dsi->dev); in exynos_dsi_atomic_pre_enable()
1392 dev_err(dsi->dev, "failed to enable DSI device.\n"); in exynos_dsi_atomic_pre_enable()
1396 dsi->state |= DSIM_STATE_ENABLED; in exynos_dsi_atomic_pre_enable()
1402 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_enable() local
1404 exynos_dsi_set_display_mode(dsi); in exynos_dsi_atomic_enable()
1405 exynos_dsi_set_display_enable(dsi, true); in exynos_dsi_atomic_enable()
1407 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; in exynos_dsi_atomic_enable()
1415 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_disable() local
1417 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_atomic_disable()
1420 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; in exynos_dsi_atomic_disable()
1426 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_atomic_post_disable() local
1428 exynos_dsi_set_display_enable(dsi, false); in exynos_dsi_atomic_post_disable()
1430 dsi->state &= ~DSIM_STATE_ENABLED; in exynos_dsi_atomic_post_disable()
1431 pm_runtime_put_sync(dsi->dev); in exynos_dsi_atomic_post_disable()
1438 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_mode_set() local
1440 drm_mode_copy(&dsi->mode, adjusted_mode); in exynos_dsi_mode_set()
1446 struct exynos_dsi *dsi = bridge_to_dsi(bridge); in exynos_dsi_attach() local
1448 return drm_bridge_attach(bridge->encoder, dsi->out_bridge, bridge, in exynos_dsi_attach()
1469 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_attach() local
1470 struct device *dev = dsi->dev; in exynos_dsi_host_attach()
1471 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_host_attach()
1478 dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel); in exynos_dsi_host_attach()
1480 dsi->out_bridge = of_drm_find_bridge(device->dev.of_node); in exynos_dsi_host_attach()
1481 if (!dsi->out_bridge) in exynos_dsi_host_attach()
1482 dsi->out_bridge = ERR_PTR(-EINVAL); in exynos_dsi_host_attach()
1485 if (IS_ERR(dsi->out_bridge)) { in exynos_dsi_host_attach()
1486 ret = PTR_ERR(dsi->out_bridge); in exynos_dsi_host_attach()
1493 drm_bridge_add(&dsi->bridge); in exynos_dsi_host_attach()
1495 drm_bridge_attach(encoder, &dsi->bridge, in exynos_dsi_host_attach()
1507 ret = exynos_dsi_register_te_irq(dsi, &device->dev); in exynos_dsi_host_attach()
1514 dsi->lanes = device->lanes; in exynos_dsi_host_attach()
1515 dsi->format = device->format; in exynos_dsi_host_attach()
1516 dsi->mode_flags = device->mode_flags; in exynos_dsi_host_attach()
1518 !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO); in exynos_dsi_host_attach()
1531 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_detach() local
1532 struct drm_device *drm = dsi->encoder.dev; in exynos_dsi_host_detach()
1534 if (dsi->out_bridge->funcs->detach) in exynos_dsi_host_detach()
1535 dsi->out_bridge->funcs->detach(dsi->out_bridge); in exynos_dsi_host_detach()
1536 dsi->out_bridge = NULL; in exynos_dsi_host_detach()
1541 exynos_dsi_unregister_te_irq(dsi); in exynos_dsi_host_detach()
1543 drm_bridge_remove(&dsi->bridge); in exynos_dsi_host_detach()
1551 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_transfer() local
1555 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_host_transfer()
1558 if (!(dsi->state & DSIM_STATE_INITIALIZED)) { in exynos_dsi_host_transfer()
1559 ret = exynos_dsi_init(dsi); in exynos_dsi_host_transfer()
1562 dsi->state |= DSIM_STATE_INITIALIZED; in exynos_dsi_host_transfer()
1573 ret = exynos_dsi_transfer(dsi, &xfer); in exynos_dsi_host_transfer()
1594 static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) in exynos_dsi_parse_dt() argument
1596 struct device *dev = dsi->dev; in exynos_dsi_parse_dt()
1601 &dsi->pll_clk_rate); in exynos_dsi_parse_dt()
1606 &dsi->burst_clk_rate); in exynos_dsi_parse_dt()
1611 &dsi->esc_clk_rate); in exynos_dsi_parse_dt()
1621 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_bind() local
1622 struct drm_encoder *encoder = &dsi->encoder; in exynos_dsi_bind()
1632 return mipi_dsi_host_register(&dsi->dsi_host); in exynos_dsi_bind()
1638 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_unbind() local
1640 exynos_dsi_atomic_disable(&dsi->bridge, NULL); in exynos_dsi_unbind()
1642 mipi_dsi_host_unregister(&dsi->dsi_host); in exynos_dsi_unbind()
1653 struct exynos_dsi *dsi; in exynos_dsi_probe() local
1656 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in exynos_dsi_probe()
1657 if (!dsi) in exynos_dsi_probe()
1660 init_completion(&dsi->completed); in exynos_dsi_probe()
1661 spin_lock_init(&dsi->transfer_lock); in exynos_dsi_probe()
1662 INIT_LIST_HEAD(&dsi->transfer_list); in exynos_dsi_probe()
1664 dsi->dsi_host.ops = &exynos_dsi_ops; in exynos_dsi_probe()
1665 dsi->dsi_host.dev = dev; in exynos_dsi_probe()
1667 dsi->dev = dev; in exynos_dsi_probe()
1668 dsi->driver_data = of_device_get_match_data(dev); in exynos_dsi_probe()
1670 dsi->supplies[0].supply = "vddcore"; in exynos_dsi_probe()
1671 dsi->supplies[1].supply = "vddio"; in exynos_dsi_probe()
1672 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), in exynos_dsi_probe()
1673 dsi->supplies); in exynos_dsi_probe()
1677 dsi->clks = devm_kcalloc(dev, in exynos_dsi_probe()
1678 dsi->driver_data->num_clks, sizeof(*dsi->clks), in exynos_dsi_probe()
1680 if (!dsi->clks) in exynos_dsi_probe()
1683 for (i = 0; i < dsi->driver_data->num_clks; i++) { in exynos_dsi_probe()
1684 dsi->clks[i] = devm_clk_get(dev, clk_names[i]); in exynos_dsi_probe()
1685 if (IS_ERR(dsi->clks[i])) { in exynos_dsi_probe()
1687 dsi->clks[i] = devm_clk_get(dev, in exynos_dsi_probe()
1689 if (!IS_ERR(dsi->clks[i])) in exynos_dsi_probe()
1695 return PTR_ERR(dsi->clks[i]); in exynos_dsi_probe()
1699 dsi->reg_base = devm_platform_ioremap_resource(pdev, 0); in exynos_dsi_probe()
1700 if (IS_ERR(dsi->reg_base)) in exynos_dsi_probe()
1701 return PTR_ERR(dsi->reg_base); in exynos_dsi_probe()
1703 dsi->phy = devm_phy_get(dev, "dsim"); in exynos_dsi_probe()
1704 if (IS_ERR(dsi->phy)) { in exynos_dsi_probe()
1706 return PTR_ERR(dsi->phy); in exynos_dsi_probe()
1709 dsi->irq = platform_get_irq(pdev, 0); in exynos_dsi_probe()
1710 if (dsi->irq < 0) in exynos_dsi_probe()
1711 return dsi->irq; in exynos_dsi_probe()
1713 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, in exynos_dsi_probe()
1716 dev_name(dev), dsi); in exynos_dsi_probe()
1722 ret = exynos_dsi_parse_dt(dsi); in exynos_dsi_probe()
1726 platform_set_drvdata(pdev, dsi); in exynos_dsi_probe()
1730 dsi->bridge.funcs = &exynos_dsi_bridge_funcs; in exynos_dsi_probe()
1731 dsi->bridge.of_node = dev->of_node; in exynos_dsi_probe()
1732 dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; in exynos_dsi_probe()
1733 dsi->bridge.pre_enable_prev_first = true; in exynos_dsi_probe()
1758 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_suspend() local
1759 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_suspend()
1764 if (dsi->state & DSIM_STATE_INITIALIZED) { in exynos_dsi_suspend()
1765 dsi->state &= ~DSIM_STATE_INITIALIZED; in exynos_dsi_suspend()
1767 exynos_dsi_disable_clock(dsi); in exynos_dsi_suspend()
1769 exynos_dsi_disable_irq(dsi); in exynos_dsi_suspend()
1772 dsi->state &= ~DSIM_STATE_CMD_LPM; in exynos_dsi_suspend()
1774 phy_power_off(dsi->phy); in exynos_dsi_suspend()
1777 clk_disable_unprepare(dsi->clks[i]); in exynos_dsi_suspend()
1779 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_suspend()
1781 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); in exynos_dsi_suspend()
1788 struct exynos_dsi *dsi = dev_get_drvdata(dev); in exynos_dsi_resume() local
1789 const struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_resume()
1792 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_resume()
1794 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); in exynos_dsi_resume()
1799 ret = clk_prepare_enable(dsi->clks[i]); in exynos_dsi_resume()
1804 ret = phy_power_on(dsi->phy); in exynos_dsi_resume()
1806 dev_err(dsi->dev, "cannot enable phy %d\n", ret); in exynos_dsi_resume()
1814 clk_disable_unprepare(dsi->clks[i]); in exynos_dsi_resume()
1815 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_resume()