Lines Matching full:dsi
532 static inline void samsung_dsim_write(struct samsung_dsim *dsi, in samsung_dsim_write() argument
535 writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in samsung_dsim_write()
538 static inline u32 samsung_dsim_read(struct samsung_dsim *dsi, enum reg_idx idx) in samsung_dsim_read() argument
540 return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in samsung_dsim_read()
543 static void samsung_dsim_wait_for_reset(struct samsung_dsim *dsi) in samsung_dsim_wait_for_reset() argument
545 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) in samsung_dsim_wait_for_reset()
548 dev_err(dsi->dev, "timeout waiting for reset\n"); in samsung_dsim_wait_for_reset()
551 static void samsung_dsim_reset(struct samsung_dsim *dsi) in samsung_dsim_reset() argument
553 u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; in samsung_dsim_reset()
555 reinit_completion(&dsi->completed); in samsung_dsim_reset()
556 samsung_dsim_write(dsi, DSIM_SWRST_REG, reset_val); in samsung_dsim_reset()
563 static unsigned long samsung_dsim_pll_find_pms(struct samsung_dsim *dsi, in samsung_dsim_pll_find_pms() argument
568 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_pll_find_pms()
619 static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi, in samsung_dsim_set_pll() argument
622 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_set_pll()
629 if (dsi->pll_clk) { in samsung_dsim_set_pll()
635 fin = clk_get_rate(clk_get_parent(dsi->pll_clk)); in samsung_dsim_set_pll()
638 clk_set_rate(dsi->pll_clk, fin); in samsung_dsim_set_pll()
640 fin = clk_get_rate(dsi->pll_clk); in samsung_dsim_set_pll()
642 fin = dsi->pll_clk_rate; in samsung_dsim_set_pll()
644 dev_dbg(dsi->dev, "PLL ref clock freq %lu\n", fin); in samsung_dsim_set_pll()
646 fout = samsung_dsim_pll_find_pms(dsi, fin, freq, &p, &m, &s); in samsung_dsim_set_pll()
648 dev_err(dsi->dev, in samsung_dsim_set_pll()
652 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); in samsung_dsim_set_pll()
655 dsi->reg_base + driver_data->plltmr_reg); in samsung_dsim_set_pll()
673 dev_dbg(dsi->dev, "band %d\n", band); in samsung_dsim_set_pll()
678 if (dsi->swap_dn_dp_clk) in samsung_dsim_set_pll()
680 if (dsi->swap_dn_dp_data) in samsung_dsim_set_pll()
683 samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); in samsung_dsim_set_pll()
688 dev_err(dsi->dev, "PLL failed to stabilize\n"); in samsung_dsim_set_pll()
691 reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); in samsung_dsim_set_pll()
694 dsi->hs_clock = fout; in samsung_dsim_set_pll()
699 static int samsung_dsim_enable_clock(struct samsung_dsim *dsi) in samsung_dsim_enable_clock() argument
704 struct drm_display_mode *m = &dsi->mode; in samsung_dsim_enable_clock()
705 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->format); in samsung_dsim_enable_clock()
711 if (dsi->burst_clk_rate) in samsung_dsim_enable_clock()
712 hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate); in samsung_dsim_enable_clock()
714 hs_clk = samsung_dsim_set_pll(dsi, DIV_ROUND_UP(pix_clk * bpp, dsi->lanes)); in samsung_dsim_enable_clock()
717 dev_err(dsi->dev, "failed to configure DSI PLL\n"); in samsung_dsim_enable_clock()
722 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); in samsung_dsim_enable_clock()
730 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", in samsung_dsim_enable_clock()
733 reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); in samsung_dsim_enable_clock()
740 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) in samsung_dsim_enable_clock()
743 samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); in samsung_dsim_enable_clock()
748 static void samsung_dsim_set_phy_ctrl(struct samsung_dsim *dsi) in samsung_dsim_set_phy_ctrl() argument
750 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_set_phy_ctrl()
756 unsigned long long byte_clock = dsi->hs_clock / 8; in samsung_dsim_set_phy_ctrl()
761 phy_mipi_dphy_get_default_config_for_hsclk(dsi->hs_clock, in samsung_dsim_set_phy_ctrl()
762 dsi->lanes, &cfg); in samsung_dsim_set_phy_ctrl()
794 samsung_dsim_write(dsi, DSIM_PHYCTRL_REG, reg); in samsung_dsim_set_phy_ctrl()
804 samsung_dsim_write(dsi, DSIM_PHYTIMING_REG, reg); in samsung_dsim_set_phy_ctrl()
825 samsung_dsim_write(dsi, DSIM_PHYTIMING1_REG, reg); in samsung_dsim_set_phy_ctrl()
841 samsung_dsim_write(dsi, DSIM_PHYTIMING2_REG, reg); in samsung_dsim_set_phy_ctrl()
844 static void samsung_dsim_disable_clock(struct samsung_dsim *dsi) in samsung_dsim_disable_clock() argument
848 reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG); in samsung_dsim_disable_clock()
851 samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg); in samsung_dsim_disable_clock()
853 reg = samsung_dsim_read(dsi, DSIM_PLLCTRL_REG); in samsung_dsim_disable_clock()
855 samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg); in samsung_dsim_disable_clock()
858 static void samsung_dsim_enable_lane(struct samsung_dsim *dsi, u32 lane) in samsung_dsim_enable_lane() argument
860 u32 reg = samsung_dsim_read(dsi, DSIM_CONFIG_REG); in samsung_dsim_enable_lane()
862 reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | in samsung_dsim_enable_lane()
864 samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); in samsung_dsim_enable_lane()
867 static int samsung_dsim_init_link(struct samsung_dsim *dsi) in samsung_dsim_init_link() argument
869 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_init_link()
875 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); in samsung_dsim_init_link()
877 samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); in samsung_dsim_init_link()
882 samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg); in samsung_dsim_init_link()
885 /* DSI configuration */ in samsung_dsim_init_link()
890 * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video in samsung_dsim_init_link()
893 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in samsung_dsim_init_link()
900 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH)) in samsung_dsim_init_link()
902 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in samsung_dsim_init_link()
904 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in samsung_dsim_init_link()
906 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) in samsung_dsim_init_link()
908 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) in samsung_dsim_init_link()
910 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP) in samsung_dsim_init_link()
912 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP) in samsung_dsim_init_link()
914 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA) in samsung_dsim_init_link()
918 if (dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET) in samsung_dsim_init_link()
921 switch (dsi->format) { in samsung_dsim_init_link()
935 dev_err(dsi->dev, "invalid pixel format\n"); in samsung_dsim_init_link()
948 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) in samsung_dsim_init_link()
950 samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg); in samsung_dsim_init_link()
952 lanes_mask = BIT(dsi->lanes) - 1; in samsung_dsim_init_link()
953 samsung_dsim_enable_lane(dsi, lanes_mask); in samsung_dsim_init_link()
959 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); in samsung_dsim_init_link()
963 reg = samsung_dsim_read(dsi, DSIM_STATUS_REG); in samsung_dsim_init_link()
969 reg = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); in samsung_dsim_init_link()
972 samsung_dsim_write(dsi, DSIM_ESCMODE_REG, reg); in samsung_dsim_init_link()
975 samsung_dsim_write(dsi, DSIM_TIMEOUT_REG, reg); in samsung_dsim_init_link()
980 static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi) in samsung_dsim_set_display_mode() argument
982 struct drm_display_mode *m = &dsi->mode; in samsung_dsim_set_display_mode()
983 unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; in samsung_dsim_set_display_mode()
986 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in samsung_dsim_set_display_mode()
987 u64 byte_clk = dsi->hs_clock / 8; in samsung_dsim_set_display_mode()
999 dev_dbg(dsi->dev, "calculated hfp: %u, hbp: %u, hsa: %u", in samsung_dsim_set_display_mode()
1005 samsung_dsim_write(dsi, DSIM_MVPORCH_REG, reg); in samsung_dsim_set_display_mode()
1008 samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg); in samsung_dsim_set_display_mode()
1012 samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg); in samsung_dsim_set_display_mode()
1017 samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); in samsung_dsim_set_display_mode()
1019 dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); in samsung_dsim_set_display_mode()
1022 static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enable) in samsung_dsim_set_display_enable() argument
1026 reg = samsung_dsim_read(dsi, DSIM_MDRESOL_REG); in samsung_dsim_set_display_enable()
1031 samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg); in samsung_dsim_set_display_enable()
1034 static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi) in samsung_dsim_wait_for_hdr_fifo() argument
1039 u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG); in samsung_dsim_wait_for_hdr_fifo()
1041 if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) { in samsung_dsim_wait_for_hdr_fifo()
1063 static void samsung_dsim_set_cmd_lpm(struct samsung_dsim *dsi, bool lpm) in samsung_dsim_set_cmd_lpm() argument
1065 u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); in samsung_dsim_set_cmd_lpm()
1072 samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); in samsung_dsim_set_cmd_lpm()
1075 static void samsung_dsim_force_bta(struct samsung_dsim *dsi) in samsung_dsim_force_bta() argument
1077 u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG); in samsung_dsim_force_bta()
1080 samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v); in samsung_dsim_force_bta()
1083 static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi, in samsung_dsim_send_to_fifo() argument
1086 struct device *dev = dsi->dev; in samsung_dsim_send_to_fifo()
1104 samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); in samsung_dsim_send_to_fifo()
1119 samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg); in samsung_dsim_send_to_fifo()
1128 if (samsung_dsim_wait_for_hdr_fifo(dsi)) { in samsung_dsim_send_to_fifo()
1134 dsi->state & DSIM_STATE_CMD_LPM)) { in samsung_dsim_send_to_fifo()
1135 samsung_dsim_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); in samsung_dsim_send_to_fifo()
1136 dsi->state ^= DSIM_STATE_CMD_LPM; in samsung_dsim_send_to_fifo()
1139 samsung_dsim_write(dsi, DSIM_PKTHDR_REG, reg); in samsung_dsim_send_to_fifo()
1142 samsung_dsim_force_bta(dsi); in samsung_dsim_send_to_fifo()
1145 static void samsung_dsim_read_from_fifo(struct samsung_dsim *dsi, in samsung_dsim_read_from_fifo() argument
1150 struct device *dev = dsi->dev; in samsung_dsim_read_from_fifo()
1155 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); in samsung_dsim_read_from_fifo()
1173 dev_err(dev, "DSI Error Report: 0x%04x\n", (reg >> 8) & 0xffff); in samsung_dsim_read_from_fifo()
1194 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); in samsung_dsim_read_from_fifo()
1204 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); in samsung_dsim_read_from_fifo()
1223 reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG); in samsung_dsim_read_from_fifo()
1229 static void samsung_dsim_transfer_start(struct samsung_dsim *dsi) in samsung_dsim_transfer_start() argument
1236 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1238 if (list_empty(&dsi->transfer_list)) { in samsung_dsim_transfer_start()
1239 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1243 xfer = list_first_entry(&dsi->transfer_list, in samsung_dsim_transfer_start()
1246 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1253 samsung_dsim_send_to_fifo(dsi, xfer); in samsung_dsim_transfer_start()
1261 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1264 start = !list_empty(&dsi->transfer_list); in samsung_dsim_transfer_start()
1266 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1272 static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi) in samsung_dsim_transfer_finish() argument
1278 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1280 if (list_empty(&dsi->transfer_list)) { in samsung_dsim_transfer_finish()
1281 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1285 xfer = list_first_entry(&dsi->transfer_list, in samsung_dsim_transfer_finish()
1288 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1290 dev_dbg(dsi->dev, in samsung_dsim_transfer_finish()
1299 samsung_dsim_read_from_fifo(dsi, xfer); in samsung_dsim_transfer_finish()
1304 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1307 start = !list_empty(&dsi->transfer_list); in samsung_dsim_transfer_finish()
1309 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1318 static void samsung_dsim_remove_transfer(struct samsung_dsim *dsi, in samsung_dsim_remove_transfer() argument
1324 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_remove_transfer()
1326 if (!list_empty(&dsi->transfer_list) && in samsung_dsim_remove_transfer()
1327 xfer == list_first_entry(&dsi->transfer_list, in samsung_dsim_remove_transfer()
1330 start = !list_empty(&dsi->transfer_list); in samsung_dsim_remove_transfer()
1331 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_remove_transfer()
1333 samsung_dsim_transfer_start(dsi); in samsung_dsim_remove_transfer()
1339 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_remove_transfer()
1342 static int samsung_dsim_transfer(struct samsung_dsim *dsi, in samsung_dsim_transfer() argument
1353 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer()
1355 stopped = list_empty(&dsi->transfer_list); in samsung_dsim_transfer()
1356 list_add_tail(&xfer->list, &dsi->transfer_list); in samsung_dsim_transfer()
1358 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer()
1361 samsung_dsim_transfer_start(dsi); in samsung_dsim_transfer()
1368 samsung_dsim_remove_transfer(dsi, xfer); in samsung_dsim_transfer()
1369 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, in samsung_dsim_transfer()
1380 struct samsung_dsim *dsi = dev_id; in samsung_dsim_irq() local
1383 status = samsung_dsim_read(dsi, DSIM_INTSRC_REG); in samsung_dsim_irq()
1388 dev_warn(dsi->dev, "spurious interrupt\n"); in samsung_dsim_irq()
1391 samsung_dsim_write(dsi, DSIM_INTSRC_REG, status); in samsung_dsim_irq()
1399 samsung_dsim_write(dsi, DSIM_INTMSK_REG, mask); in samsung_dsim_irq()
1400 complete(&dsi->completed); in samsung_dsim_irq()
1408 if (samsung_dsim_transfer_finish(dsi)) in samsung_dsim_irq()
1409 samsung_dsim_transfer_start(dsi); in samsung_dsim_irq()
1414 static void samsung_dsim_enable_irq(struct samsung_dsim *dsi) in samsung_dsim_enable_irq() argument
1416 enable_irq(dsi->irq); in samsung_dsim_enable_irq()
1418 if (dsi->te_gpio) in samsung_dsim_enable_irq()
1419 enable_irq(gpiod_to_irq(dsi->te_gpio)); in samsung_dsim_enable_irq()
1422 static void samsung_dsim_disable_irq(struct samsung_dsim *dsi) in samsung_dsim_disable_irq() argument
1424 if (dsi->te_gpio) in samsung_dsim_disable_irq()
1425 disable_irq(gpiod_to_irq(dsi->te_gpio)); in samsung_dsim_disable_irq()
1427 disable_irq(dsi->irq); in samsung_dsim_disable_irq()
1430 static int samsung_dsim_init(struct samsung_dsim *dsi) in samsung_dsim_init() argument
1432 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_init()
1434 if (dsi->state & DSIM_STATE_INITIALIZED) in samsung_dsim_init()
1437 samsung_dsim_reset(dsi); in samsung_dsim_init()
1438 samsung_dsim_enable_irq(dsi); in samsung_dsim_init()
1441 samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); in samsung_dsim_init()
1443 samsung_dsim_enable_clock(dsi); in samsung_dsim_init()
1445 samsung_dsim_wait_for_reset(dsi); in samsung_dsim_init()
1446 samsung_dsim_set_phy_ctrl(dsi); in samsung_dsim_init()
1447 samsung_dsim_init_link(dsi); in samsung_dsim_init()
1449 dsi->state |= DSIM_STATE_INITIALIZED; in samsung_dsim_init()
1457 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_atomic_pre_enable() local
1460 if (dsi->state & DSIM_STATE_ENABLED) in samsung_dsim_atomic_pre_enable()
1463 ret = pm_runtime_resume_and_get(dsi->dev); in samsung_dsim_atomic_pre_enable()
1465 dev_err(dsi->dev, "failed to enable DSI device.\n"); in samsung_dsim_atomic_pre_enable()
1469 dsi->state |= DSIM_STATE_ENABLED; in samsung_dsim_atomic_pre_enable()
1473 * the host initialization during DSI transfer. in samsung_dsim_atomic_pre_enable()
1475 if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) { in samsung_dsim_atomic_pre_enable()
1476 ret = samsung_dsim_init(dsi); in samsung_dsim_atomic_pre_enable()
1485 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_atomic_enable() local
1487 samsung_dsim_set_display_mode(dsi); in samsung_dsim_atomic_enable()
1488 samsung_dsim_set_display_enable(dsi, true); in samsung_dsim_atomic_enable()
1490 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; in samsung_dsim_atomic_enable()
1496 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_atomic_disable() local
1498 if (!(dsi->state & DSIM_STATE_ENABLED)) in samsung_dsim_atomic_disable()
1501 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; in samsung_dsim_atomic_disable()
1507 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_atomic_post_disable() local
1509 samsung_dsim_set_display_enable(dsi, false); in samsung_dsim_atomic_post_disable()
1511 dsi->state &= ~DSIM_STATE_ENABLED; in samsung_dsim_atomic_post_disable()
1512 pm_runtime_put_sync(dsi->dev); in samsung_dsim_atomic_post_disable()
1517 * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
1519 * Table 14. DSI pixel packing formats
1580 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_atomic_check() local
1597 if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) { in samsung_dsim_atomic_check()
1600 } else if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MP) { in samsung_dsim_atomic_check()
1612 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_mode_set() local
1614 drm_mode_copy(&dsi->mode, adjusted_mode); in samsung_dsim_mode_set()
1620 struct samsung_dsim *dsi = bridge_to_dsi(bridge); in samsung_dsim_attach() local
1622 return drm_bridge_attach(bridge->encoder, dsi->out_bridge, bridge, in samsung_dsim_attach()
1642 struct samsung_dsim *dsi = (struct samsung_dsim *)dev_id; in samsung_dsim_te_irq_handler() local
1643 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; in samsung_dsim_te_irq_handler()
1646 return pdata->host_ops->te_irq_handler(dsi); in samsung_dsim_te_irq_handler()
1651 static int samsung_dsim_register_te_irq(struct samsung_dsim *dsi, struct device *dev) in samsung_dsim_register_te_irq() argument
1656 dsi->te_gpio = devm_gpiod_get_optional(dev, "te", GPIOD_IN); in samsung_dsim_register_te_irq()
1657 if (!dsi->te_gpio) in samsung_dsim_register_te_irq()
1659 else if (IS_ERR(dsi->te_gpio)) in samsung_dsim_register_te_irq()
1660 return dev_err_probe(dev, PTR_ERR(dsi->te_gpio), "failed to get te GPIO\n"); in samsung_dsim_register_te_irq()
1662 te_gpio_irq = gpiod_to_irq(dsi->te_gpio); in samsung_dsim_register_te_irq()
1665 IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi); in samsung_dsim_register_te_irq()
1667 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); in samsung_dsim_register_te_irq()
1668 gpiod_put(dsi->te_gpio); in samsung_dsim_register_te_irq()
1678 struct samsung_dsim *dsi = host_to_dsi(host); in samsung_dsim_host_attach() local
1679 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; in samsung_dsim_host_attach()
1680 struct device *dev = dsi->dev; in samsung_dsim_host_attach()
1688 * through the upstream device (ie, MIPI-DCS for a MIPI-DSI device). in samsung_dsim_host_attach()
1718 dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel); in samsung_dsim_host_attach()
1720 dsi->out_bridge = of_drm_find_bridge(remote); in samsung_dsim_host_attach()
1721 if (!dsi->out_bridge) in samsung_dsim_host_attach()
1722 dsi->out_bridge = ERR_PTR(-EINVAL); in samsung_dsim_host_attach()
1727 if (IS_ERR(dsi->out_bridge)) { in samsung_dsim_host_attach()
1728 ret = PTR_ERR(dsi->out_bridge); in samsung_dsim_host_attach()
1738 drm_bridge_add(&dsi->bridge); in samsung_dsim_host_attach()
1743 * If attached panel device is for command mode one, dsi should register in samsung_dsim_host_attach()
1747 ret = samsung_dsim_register_te_irq(dsi, &device->dev); in samsung_dsim_host_attach()
1753 ret = pdata->host_ops->attach(dsi, device); in samsung_dsim_host_attach()
1758 dsi->lanes = device->lanes; in samsung_dsim_host_attach()
1759 dsi->format = device->format; in samsung_dsim_host_attach()
1760 dsi->mode_flags = device->mode_flags; in samsung_dsim_host_attach()
1765 static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi) in samsung_dsim_unregister_te_irq() argument
1767 if (dsi->te_gpio) { in samsung_dsim_unregister_te_irq()
1768 free_irq(gpiod_to_irq(dsi->te_gpio), dsi); in samsung_dsim_unregister_te_irq()
1769 gpiod_put(dsi->te_gpio); in samsung_dsim_unregister_te_irq()
1776 struct samsung_dsim *dsi = host_to_dsi(host); in samsung_dsim_host_detach() local
1777 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; in samsung_dsim_host_detach()
1779 dsi->out_bridge = NULL; in samsung_dsim_host_detach()
1782 pdata->host_ops->detach(dsi, device); in samsung_dsim_host_detach()
1784 samsung_dsim_unregister_te_irq(dsi); in samsung_dsim_host_detach()
1786 drm_bridge_remove(&dsi->bridge); in samsung_dsim_host_detach()
1794 struct samsung_dsim *dsi = host_to_dsi(host); in samsung_dsim_host_transfer() local
1798 if (!(dsi->state & DSIM_STATE_ENABLED)) in samsung_dsim_host_transfer()
1801 ret = samsung_dsim_init(dsi); in samsung_dsim_host_transfer()
1813 ret = samsung_dsim_transfer(dsi, &xfer); in samsung_dsim_host_transfer()
1834 static int samsung_dsim_parse_dt(struct samsung_dsim *dsi) in samsung_dsim_parse_dt() argument
1836 struct device *dev = dsi->dev; in samsung_dsim_parse_dt()
1843 &dsi->pll_clk_rate, 1); in samsung_dsim_parse_dt()
1847 dsi->pll_clk = devm_clk_get(dev, "sclk_mipi"); in samsung_dsim_parse_dt()
1848 if (IS_ERR(dsi->pll_clk)) in samsung_dsim_parse_dt()
1849 return PTR_ERR(dsi->pll_clk); in samsung_dsim_parse_dt()
1854 &dsi->burst_clk_rate, 1); in samsung_dsim_parse_dt()
1857 dsi->burst_clk_rate = 0; in samsung_dsim_parse_dt()
1861 &dsi->esc_clk_rate, 0); in samsung_dsim_parse_dt()
1873 DRM_DEV_ERROR(dsi->dev, "Data lanes polarities do not match"); in samsung_dsim_parse_dt()
1876 dsi->swap_dn_dp_clk = true; in samsung_dsim_parse_dt()
1878 dsi->swap_dn_dp_data = true; in samsung_dsim_parse_dt()
1884 static int generic_dsim_register_host(struct samsung_dsim *dsi) in generic_dsim_register_host() argument
1886 return mipi_dsi_host_register(&dsi->dsi_host); in generic_dsim_register_host()
1889 static void generic_dsim_unregister_host(struct samsung_dsim *dsi) in generic_dsim_unregister_host() argument
1891 mipi_dsi_host_unregister(&dsi->dsi_host); in generic_dsim_unregister_host()
1910 struct samsung_dsim *dsi; in samsung_dsim_probe() local
1913 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in samsung_dsim_probe()
1914 if (!dsi) in samsung_dsim_probe()
1917 init_completion(&dsi->completed); in samsung_dsim_probe()
1918 spin_lock_init(&dsi->transfer_lock); in samsung_dsim_probe()
1919 INIT_LIST_HEAD(&dsi->transfer_list); in samsung_dsim_probe()
1921 dsi->dsi_host.ops = &samsung_dsim_ops; in samsung_dsim_probe()
1922 dsi->dsi_host.dev = dev; in samsung_dsim_probe()
1924 dsi->dev = dev; in samsung_dsim_probe()
1925 dsi->plat_data = of_device_get_match_data(dev); in samsung_dsim_probe()
1926 dsi->driver_data = samsung_dsim_types[dsi->plat_data->hw_type]; in samsung_dsim_probe()
1928 dsi->supplies[0].supply = "vddcore"; in samsung_dsim_probe()
1929 dsi->supplies[1].supply = "vddio"; in samsung_dsim_probe()
1930 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), in samsung_dsim_probe()
1931 dsi->supplies); in samsung_dsim_probe()
1935 dsi->clks = devm_kcalloc(dev, dsi->driver_data->num_clks, in samsung_dsim_probe()
1936 sizeof(*dsi->clks), GFP_KERNEL); in samsung_dsim_probe()
1937 if (!dsi->clks) in samsung_dsim_probe()
1940 for (i = 0; i < dsi->driver_data->num_clks; i++) { in samsung_dsim_probe()
1941 dsi->clks[i] = devm_clk_get(dev, clk_names[i]); in samsung_dsim_probe()
1942 if (IS_ERR(dsi->clks[i])) { in samsung_dsim_probe()
1944 dsi->clks[i] = devm_clk_get(dev, OLD_SCLK_MIPI_CLK_NAME); in samsung_dsim_probe()
1945 if (!IS_ERR(dsi->clks[i])) in samsung_dsim_probe()
1950 return PTR_ERR(dsi->clks[i]); in samsung_dsim_probe()
1954 dsi->reg_base = devm_platform_ioremap_resource(pdev, 0); in samsung_dsim_probe()
1955 if (IS_ERR(dsi->reg_base)) in samsung_dsim_probe()
1956 return PTR_ERR(dsi->reg_base); in samsung_dsim_probe()
1958 dsi->phy = devm_phy_optional_get(dev, "dsim"); in samsung_dsim_probe()
1959 if (IS_ERR(dsi->phy)) { in samsung_dsim_probe()
1961 return PTR_ERR(dsi->phy); in samsung_dsim_probe()
1964 dsi->irq = platform_get_irq(pdev, 0); in samsung_dsim_probe()
1965 if (dsi->irq < 0) in samsung_dsim_probe()
1966 return dsi->irq; in samsung_dsim_probe()
1968 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, in samsung_dsim_probe()
1971 dev_name(dev), dsi); in samsung_dsim_probe()
1973 dev_err(dev, "failed to request dsi irq\n"); in samsung_dsim_probe()
1977 ret = samsung_dsim_parse_dt(dsi); in samsung_dsim_probe()
1981 platform_set_drvdata(pdev, dsi); in samsung_dsim_probe()
1985 dsi->bridge.funcs = &samsung_dsim_bridge_funcs; in samsung_dsim_probe()
1986 dsi->bridge.of_node = dev->of_node; in samsung_dsim_probe()
1987 dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; in samsung_dsim_probe()
1990 if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) in samsung_dsim_probe()
1991 dsi->bridge.timings = &samsung_dsim_bridge_timings_de_low; in samsung_dsim_probe()
1993 dsi->bridge.timings = &samsung_dsim_bridge_timings_de_high; in samsung_dsim_probe()
1995 if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->register_host) in samsung_dsim_probe()
1996 ret = dsi->plat_data->host_ops->register_host(dsi); in samsung_dsim_probe()
2012 struct samsung_dsim *dsi = platform_get_drvdata(pdev); in samsung_dsim_remove() local
2016 if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->unregister_host) in samsung_dsim_remove()
2017 dsi->plat_data->host_ops->unregister_host(dsi); in samsung_dsim_remove()
2023 struct samsung_dsim *dsi = dev_get_drvdata(dev); in samsung_dsim_suspend() local
2024 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_suspend()
2029 if (dsi->state & DSIM_STATE_INITIALIZED) { in samsung_dsim_suspend()
2030 dsi->state &= ~DSIM_STATE_INITIALIZED; in samsung_dsim_suspend()
2032 samsung_dsim_disable_clock(dsi); in samsung_dsim_suspend()
2034 samsung_dsim_disable_irq(dsi); in samsung_dsim_suspend()
2037 dsi->state &= ~DSIM_STATE_CMD_LPM; in samsung_dsim_suspend()
2039 phy_power_off(dsi->phy); in samsung_dsim_suspend()
2042 clk_disable_unprepare(dsi->clks[i]); in samsung_dsim_suspend()
2044 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in samsung_dsim_suspend()
2046 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); in samsung_dsim_suspend()
2053 struct samsung_dsim *dsi = dev_get_drvdata(dev); in samsung_dsim_resume() local
2054 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_resume()
2057 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in samsung_dsim_resume()
2059 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); in samsung_dsim_resume()
2064 ret = clk_prepare_enable(dsi->clks[i]); in samsung_dsim_resume()
2069 ret = phy_power_on(dsi->phy); in samsung_dsim_resume()
2071 dev_err(dsi->dev, "cannot enable phy %d\n", ret); in samsung_dsim_resume()
2079 clk_disable_unprepare(dsi->clks[i]); in samsung_dsim_resume()
2080 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in samsung_dsim_resume()