Lines Matching +full:lane +full:- +full:polarities
1 // SPDX-License-Identifier: GPL-2.0-only
18 #include <linux/media-bus-format.h>
25 #include <drm/bridge/samsung-dsim.h>
111 #define DSIM_MAIN_VRESOL(x, num_bits) (((x) & ((1 << (num_bits)) - 1)) << 16)
112 #define DSIM_MAIN_HRESOL(x, num_bits) (((x) & ((1 << (num_bits)) - 1)) << 0)
488 * downstream driver - drivers/gpu/drm/bridge/sec-dsim.c
521 writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in samsung_dsim_write()
526 return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]); in samsung_dsim_read()
531 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) in samsung_dsim_wait_for_reset()
534 dev_err(dsi->dev, "timeout waiting for reset\n"); in samsung_dsim_wait_for_reset()
539 u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE]; in samsung_dsim_reset()
541 reinit_completion(&dsi->completed); in samsung_dsim_reset()
554 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_pll_find_pms()
573 if (_m < driver_data->m_min || _m > driver_data->m_max) in samsung_dsim_pll_find_pms()
578 if (tmp < driver_data->min_freq * MHZ || in samsung_dsim_pll_find_pms()
579 tmp > driver_data->max_freq * MHZ) in samsung_dsim_pll_find_pms()
585 delta = abs(fout - tmp); in samsung_dsim_pll_find_pms()
608 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_set_pll()
615 fin = dsi->pll_clk_rate; in samsung_dsim_set_pll()
618 dev_err(dsi->dev, in samsung_dsim_set_pll()
622 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); in samsung_dsim_set_pll()
624 writel(driver_data->reg_values[PLL_TIMER], in samsung_dsim_set_pll()
625 dsi->reg_base + driver_data->plltmr_reg); in samsung_dsim_set_pll()
627 reg = DSIM_PLL_EN | DSIM_PLL_P(p, driver_data->pll_p_offset) | in samsung_dsim_set_pll()
630 if (driver_data->has_freqband) { in samsung_dsim_set_pll()
643 dev_dbg(dsi->dev, "band %d\n", band); in samsung_dsim_set_pll()
648 if (dsi->swap_dn_dp_clk) in samsung_dsim_set_pll()
650 if (dsi->swap_dn_dp_data) in samsung_dsim_set_pll()
657 if (timeout-- == 0) { in samsung_dsim_set_pll()
658 dev_err(dsi->dev, "PLL failed to stabilize\n"); in samsung_dsim_set_pll()
664 dsi->hs_clock = fout; in samsung_dsim_set_pll()
674 struct drm_display_mode *m = &dsi->mode; in samsung_dsim_enable_clock()
675 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->format); in samsung_dsim_enable_clock()
677 /* m->clock is in KHz */ in samsung_dsim_enable_clock()
678 pix_clk = m->clock * 1000; in samsung_dsim_enable_clock()
681 if (dsi->burst_clk_rate) in samsung_dsim_enable_clock()
682 hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate); in samsung_dsim_enable_clock()
684 hs_clk = samsung_dsim_set_pll(dsi, DIV_ROUND_UP(pix_clk * bpp, dsi->lanes)); in samsung_dsim_enable_clock()
687 dev_err(dsi->dev, "failed to configure DSI PLL\n"); in samsung_dsim_enable_clock()
688 return -EFAULT; in samsung_dsim_enable_clock()
692 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); in samsung_dsim_enable_clock()
700 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", in samsung_dsim_enable_clock()
710 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) in samsung_dsim_enable_clock()
720 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_set_phy_ctrl()
721 const unsigned int *reg_values = driver_data->reg_values; in samsung_dsim_set_phy_ctrl()
726 unsigned long long byte_clock = dsi->hs_clock / 8; in samsung_dsim_set_phy_ctrl()
728 if (driver_data->has_freqband) in samsung_dsim_set_phy_ctrl()
731 phy_mipi_dphy_get_default_config_for_hsclk(dsi->hs_clock, in samsung_dsim_set_phy_ctrl()
732 dsi->lanes, &cfg); in samsung_dsim_set_phy_ctrl()
760 /* B D-PHY: D-PHY Master & Slave Analog Block control */ in samsung_dsim_set_phy_ctrl()
767 * T LPX: Transmitted length of any Low-Power state period in samsung_dsim_set_phy_ctrl()
768 * T HS-EXIT: Time that the transmitter drives LP-11 following a HS in samsung_dsim_set_phy_ctrl()
777 * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00 in samsung_dsim_set_phy_ctrl()
778 * Line state immediately before the HS-0 Line state starting the in samsung_dsim_set_phy_ctrl()
780 * T CLK-ZERO: Time that the transmitter drives the HS-0 state prior to in samsung_dsim_set_phy_ctrl()
783 * after the last associated Data Lane has transitioned to LP Mode in samsung_dsim_set_phy_ctrl()
784 * Interval is defined as the period from the end of T HS-TRAIL to in samsung_dsim_set_phy_ctrl()
785 * the beginning of T CLK-TRAIL in samsung_dsim_set_phy_ctrl()
786 * T CLK-TRAIL: Time that the transmitter drives the HS-0 state after in samsung_dsim_set_phy_ctrl()
798 * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00 in samsung_dsim_set_phy_ctrl()
799 * Line state immediately before the HS-0 Line state starting the in samsung_dsim_set_phy_ctrl()
801 * T HS-ZERO: Time that the transmitter drives the HS-0 state prior to in samsung_dsim_set_phy_ctrl()
803 * T HS-TRAIL: Time that the transmitter drives the flipped differential in samsung_dsim_set_phy_ctrl()
828 static void samsung_dsim_enable_lane(struct samsung_dsim *dsi, u32 lane) in samsung_dsim_enable_lane() argument
832 reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK | in samsung_dsim_enable_lane()
833 DSIM_LANE_EN(lane)); in samsung_dsim_enable_lane()
839 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_init_link()
863 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in samsung_dsim_init_link()
870 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH)) in samsung_dsim_init_link()
872 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in samsung_dsim_init_link()
874 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in samsung_dsim_init_link()
876 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) in samsung_dsim_init_link()
878 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) in samsung_dsim_init_link()
880 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP) in samsung_dsim_init_link()
882 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP) in samsung_dsim_init_link()
884 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA) in samsung_dsim_init_link()
888 if (dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET) in samsung_dsim_init_link()
891 switch (dsi->format) { in samsung_dsim_init_link()
905 dev_err(dsi->dev, "invalid pixel format\n"); in samsung_dsim_init_link()
906 return -EINVAL; in samsung_dsim_init_link()
910 * Use non-continuous clock mode if the periparal wants and in samsung_dsim_init_link()
913 * In non-continous clock mode, host controller will turn off in samsung_dsim_init_link()
914 * the HS clock between high-speed transmissions to reduce in samsung_dsim_init_link()
917 if (driver_data->has_clklane_stop && in samsung_dsim_init_link()
918 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) in samsung_dsim_init_link()
922 lanes_mask = BIT(dsi->lanes) - 1; in samsung_dsim_init_link()
925 /* Check clock and data lane state are stop state */ in samsung_dsim_init_link()
928 if (timeout-- == 0) { in samsung_dsim_init_link()
929 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); in samsung_dsim_init_link()
930 return -EFAULT; in samsung_dsim_init_link()
941 reg |= DSIM_STOP_STATE_CNT(driver_data->reg_values[STOP_STATE_CNT]); in samsung_dsim_init_link()
943 if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) in samsung_dsim_init_link()
956 struct drm_display_mode *m = &dsi->mode; in samsung_dsim_set_display_mode()
957 unsigned int num_bits_resol = dsi->driver_data->num_bits_resol; in samsung_dsim_set_display_mode()
960 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in samsung_dsim_set_display_mode()
961 int byte_clk_khz = dsi->hs_clock / 1000 / 8; in samsung_dsim_set_display_mode()
962 int hfp = (m->hsync_start - m->hdisplay) * byte_clk_khz / m->clock; in samsung_dsim_set_display_mode()
963 int hbp = (m->htotal - m->hsync_end) * byte_clk_khz / m->clock; in samsung_dsim_set_display_mode()
964 int hsa = (m->hsync_end - m->hsync_start) * byte_clk_khz / m->clock; in samsung_dsim_set_display_mode()
967 hfp = max(hfp - 6, 0); in samsung_dsim_set_display_mode()
968 hbp = max(hbp - 6, 0); in samsung_dsim_set_display_mode()
969 hsa = max(hsa - 6, 0); in samsung_dsim_set_display_mode()
971 dev_dbg(dsi->dev, "calculated hfp: %u, hbp: %u, hsa: %u", in samsung_dsim_set_display_mode()
975 | DSIM_STABLE_VFP(m->vsync_start - m->vdisplay) in samsung_dsim_set_display_mode()
976 | DSIM_MAIN_VBP(m->vtotal - m->vsync_end); in samsung_dsim_set_display_mode()
982 reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start) in samsung_dsim_set_display_mode()
986 reg = DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) | in samsung_dsim_set_display_mode()
987 DSIM_MAIN_VRESOL(m->vdisplay, num_bits_resol); in samsung_dsim_set_display_mode()
991 dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay); in samsung_dsim_set_display_mode()
1018 } while (--timeout); in samsung_dsim_wait_for_hdr_fifo()
1020 return -ETIMEDOUT; in samsung_dsim_wait_for_hdr_fifo()
1046 struct device *dev = dsi->dev; in samsung_dsim_send_to_fifo()
1047 struct mipi_dsi_packet *pkt = &xfer->packet; in samsung_dsim_send_to_fifo()
1048 const u8 *payload = pkt->payload + xfer->tx_done; in samsung_dsim_send_to_fifo()
1049 u16 length = pkt->payload_length - xfer->tx_done; in samsung_dsim_send_to_fifo()
1050 bool first = !xfer->tx_done; in samsung_dsim_send_to_fifo()
1054 xfer, length, xfer->tx_done, xfer->rx_len, xfer->rx_done); in samsung_dsim_send_to_fifo()
1059 xfer->tx_done += length; in samsung_dsim_send_to_fifo()
1066 length -= 4; in samsung_dsim_send_to_fifo()
1087 reg = get_unaligned_le32(pkt->header); in samsung_dsim_send_to_fifo()
1093 if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM, in samsung_dsim_send_to_fifo()
1094 dsi->state & DSIM_STATE_CMD_LPM)) { in samsung_dsim_send_to_fifo()
1095 samsung_dsim_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); in samsung_dsim_send_to_fifo()
1096 dsi->state ^= DSIM_STATE_CMD_LPM; in samsung_dsim_send_to_fifo()
1101 if (xfer->flags & MIPI_DSI_MSG_REQ_ACK) in samsung_dsim_send_to_fifo()
1108 u8 *payload = xfer->rx_payload + xfer->rx_done; in samsung_dsim_read_from_fifo()
1109 bool first = !xfer->rx_done; in samsung_dsim_read_from_fifo()
1110 struct device *dev = dsi->dev; in samsung_dsim_read_from_fifo()
1120 if (xfer->rx_len >= 2) { in samsung_dsim_read_from_fifo()
1122 ++xfer->rx_done; in samsung_dsim_read_from_fifo()
1128 ++xfer->rx_done; in samsung_dsim_read_from_fifo()
1129 xfer->rx_len = xfer->rx_done; in samsung_dsim_read_from_fifo()
1130 xfer->result = 0; in samsung_dsim_read_from_fifo()
1134 xfer->result = 0; in samsung_dsim_read_from_fifo()
1139 if (length > xfer->rx_len) { in samsung_dsim_read_from_fifo()
1142 xfer->rx_len, length); in samsung_dsim_read_from_fifo()
1143 length = xfer->rx_len; in samsung_dsim_read_from_fifo()
1144 } else if (length < xfer->rx_len) { in samsung_dsim_read_from_fifo()
1145 xfer->rx_len = length; in samsung_dsim_read_from_fifo()
1149 length = xfer->rx_len - xfer->rx_done; in samsung_dsim_read_from_fifo()
1150 xfer->rx_done += length; in samsung_dsim_read_from_fifo()
1160 length -= 4; in samsung_dsim_read_from_fifo()
1177 if (xfer->rx_done == xfer->rx_len) in samsung_dsim_read_from_fifo()
1178 xfer->result = 0; in samsung_dsim_read_from_fifo()
1186 } while (--length); in samsung_dsim_read_from_fifo()
1196 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1198 if (list_empty(&dsi->transfer_list)) { in samsung_dsim_transfer_start()
1199 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1203 xfer = list_first_entry(&dsi->transfer_list, in samsung_dsim_transfer_start()
1206 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1208 if (xfer->packet.payload_length && in samsung_dsim_transfer_start()
1209 xfer->tx_done == xfer->packet.payload_length) in samsung_dsim_transfer_start()
1215 if (xfer->packet.payload_length || xfer->rx_len) in samsung_dsim_transfer_start()
1218 xfer->result = 0; in samsung_dsim_transfer_start()
1219 complete(&xfer->completed); in samsung_dsim_transfer_start()
1221 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1223 list_del_init(&xfer->list); in samsung_dsim_transfer_start()
1224 start = !list_empty(&dsi->transfer_list); in samsung_dsim_transfer_start()
1226 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_start()
1238 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1240 if (list_empty(&dsi->transfer_list)) { in samsung_dsim_transfer_finish()
1241 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1245 xfer = list_first_entry(&dsi->transfer_list, in samsung_dsim_transfer_finish()
1248 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1250 dev_dbg(dsi->dev, in samsung_dsim_transfer_finish()
1252 xfer, xfer->packet.payload_length, xfer->tx_done, xfer->rx_len, in samsung_dsim_transfer_finish()
1253 xfer->rx_done); in samsung_dsim_transfer_finish()
1255 if (xfer->tx_done != xfer->packet.payload_length) in samsung_dsim_transfer_finish()
1258 if (xfer->rx_done != xfer->rx_len) in samsung_dsim_transfer_finish()
1261 if (xfer->rx_done != xfer->rx_len) in samsung_dsim_transfer_finish()
1264 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1266 list_del_init(&xfer->list); in samsung_dsim_transfer_finish()
1267 start = !list_empty(&dsi->transfer_list); in samsung_dsim_transfer_finish()
1269 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer_finish()
1271 if (!xfer->rx_len) in samsung_dsim_transfer_finish()
1272 xfer->result = 0; in samsung_dsim_transfer_finish()
1273 complete(&xfer->completed); in samsung_dsim_transfer_finish()
1284 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_remove_transfer()
1286 if (!list_empty(&dsi->transfer_list) && in samsung_dsim_remove_transfer()
1287 xfer == list_first_entry(&dsi->transfer_list, in samsung_dsim_remove_transfer()
1289 list_del_init(&xfer->list); in samsung_dsim_remove_transfer()
1290 start = !list_empty(&dsi->transfer_list); in samsung_dsim_remove_transfer()
1291 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_remove_transfer()
1297 list_del_init(&xfer->list); in samsung_dsim_remove_transfer()
1299 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_remove_transfer()
1308 xfer->tx_done = 0; in samsung_dsim_transfer()
1309 xfer->rx_done = 0; in samsung_dsim_transfer()
1310 xfer->result = -ETIMEDOUT; in samsung_dsim_transfer()
1311 init_completion(&xfer->completed); in samsung_dsim_transfer()
1313 spin_lock_irqsave(&dsi->transfer_lock, flags); in samsung_dsim_transfer()
1315 stopped = list_empty(&dsi->transfer_list); in samsung_dsim_transfer()
1316 list_add_tail(&xfer->list, &dsi->transfer_list); in samsung_dsim_transfer()
1318 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in samsung_dsim_transfer()
1323 wait_for_completion_timeout(&xfer->completed, in samsung_dsim_transfer()
1325 if (xfer->result == -ETIMEDOUT) { in samsung_dsim_transfer()
1326 struct mipi_dsi_packet *pkt = &xfer->packet; in samsung_dsim_transfer()
1329 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header, in samsung_dsim_transfer()
1330 (int)pkt->payload_length, pkt->payload); in samsung_dsim_transfer()
1331 return -ETIMEDOUT; in samsung_dsim_transfer()
1335 return xfer->result; in samsung_dsim_transfer()
1348 dev_warn(dsi->dev, "spurious interrupt\n"); in samsung_dsim_irq()
1360 complete(&dsi->completed); in samsung_dsim_irq()
1376 enable_irq(dsi->irq); in samsung_dsim_enable_irq()
1378 if (dsi->te_gpio) in samsung_dsim_enable_irq()
1379 enable_irq(gpiod_to_irq(dsi->te_gpio)); in samsung_dsim_enable_irq()
1384 if (dsi->te_gpio) in samsung_dsim_disable_irq()
1385 disable_irq(gpiod_to_irq(dsi->te_gpio)); in samsung_dsim_disable_irq()
1387 disable_irq(dsi->irq); in samsung_dsim_disable_irq()
1404 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_init()
1406 if (dsi->state & DSIM_STATE_INITIALIZED) in samsung_dsim_init()
1412 if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) in samsung_dsim_init()
1413 samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); in samsung_dsim_init()
1416 if (driver_data->wait_for_reset) in samsung_dsim_init()
1421 dsi->state |= DSIM_STATE_INITIALIZED; in samsung_dsim_init()
1432 if (dsi->state & DSIM_STATE_ENABLED) in samsung_dsim_atomic_pre_enable()
1435 ret = pm_runtime_resume_and_get(dsi->dev); in samsung_dsim_atomic_pre_enable()
1437 dev_err(dsi->dev, "failed to enable DSI device.\n"); in samsung_dsim_atomic_pre_enable()
1441 dsi->state |= DSIM_STATE_ENABLED; in samsung_dsim_atomic_pre_enable()
1444 * For Exynos-DSIM the downstream bridge, or panel are expecting in samsung_dsim_atomic_pre_enable()
1447 if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) { in samsung_dsim_atomic_pre_enable()
1462 if (samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) { in samsung_dsim_atomic_enable()
1469 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; in samsung_dsim_atomic_enable()
1477 if (!(dsi->state & DSIM_STATE_ENABLED)) in samsung_dsim_atomic_disable()
1480 if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) in samsung_dsim_atomic_disable()
1483 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; in samsung_dsim_atomic_disable()
1493 dsi->state &= ~DSIM_STATE_ENABLED; in samsung_dsim_atomic_post_disable()
1494 pm_runtime_put_sync(dsi->dev); in samsung_dsim_atomic_post_disable()
1499 * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
1563 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; in samsung_dsim_atomic_check()
1579 if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) { in samsung_dsim_atomic_check()
1580 adjusted_mode->flags |= (DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC); in samsung_dsim_atomic_check()
1581 adjusted_mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); in samsung_dsim_atomic_check()
1582 } else if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MP) { in samsung_dsim_atomic_check()
1583 adjusted_mode->flags &= ~(DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC); in samsung_dsim_atomic_check()
1584 adjusted_mode->flags |= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); in samsung_dsim_atomic_check()
1596 drm_mode_copy(&dsi->mode, adjusted_mode); in samsung_dsim_mode_set()
1604 return drm_bridge_attach(bridge->encoder, dsi->out_bridge, bridge, in samsung_dsim_attach()
1625 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; in samsung_dsim_te_irq_handler()
1627 if (pdata->host_ops && pdata->host_ops->te_irq_handler) in samsung_dsim_te_irq_handler()
1628 return pdata->host_ops->te_irq_handler(dsi); in samsung_dsim_te_irq_handler()
1638 dsi->te_gpio = devm_gpiod_get_optional(dev, "te", GPIOD_IN); in samsung_dsim_register_te_irq()
1639 if (!dsi->te_gpio) in samsung_dsim_register_te_irq()
1641 else if (IS_ERR(dsi->te_gpio)) in samsung_dsim_register_te_irq()
1642 return dev_err_probe(dev, PTR_ERR(dsi->te_gpio), "failed to get te GPIO\n"); in samsung_dsim_register_te_irq()
1644 te_gpio_irq = gpiod_to_irq(dsi->te_gpio); in samsung_dsim_register_te_irq()
1649 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); in samsung_dsim_register_te_irq()
1650 gpiod_put(dsi->te_gpio); in samsung_dsim_register_te_irq()
1661 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; in samsung_dsim_host_attach()
1662 struct device *dev = dsi->dev; in samsung_dsim_host_attach()
1663 struct device_node *np = dev->of_node; in samsung_dsim_host_attach()
1670 * through the upstream device (ie, MIPI-DCS for a MIPI-DSI device). in samsung_dsim_host_attach()
1687 * device-tree node. in samsung_dsim_host_attach()
1690 return -ENODEV; in samsung_dsim_host_attach()
1696 return -ENODEV; in samsung_dsim_host_attach()
1700 dsi->out_bridge = devm_drm_panel_bridge_add(dev, panel); in samsung_dsim_host_attach()
1702 dsi->out_bridge = of_drm_find_bridge(remote); in samsung_dsim_host_attach()
1703 if (!dsi->out_bridge) in samsung_dsim_host_attach()
1704 dsi->out_bridge = ERR_PTR(-EINVAL); in samsung_dsim_host_attach()
1709 if (IS_ERR(dsi->out_bridge)) { in samsung_dsim_host_attach()
1710 ret = PTR_ERR(dsi->out_bridge); in samsung_dsim_host_attach()
1715 DRM_DEV_INFO(dev, "Attached %s device\n", device->name); in samsung_dsim_host_attach()
1717 drm_bridge_add(&dsi->bridge); in samsung_dsim_host_attach()
1725 if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) { in samsung_dsim_host_attach()
1726 ret = samsung_dsim_register_te_irq(dsi, &device->dev); in samsung_dsim_host_attach()
1731 if (pdata->host_ops && pdata->host_ops->attach) { in samsung_dsim_host_attach()
1732 ret = pdata->host_ops->attach(dsi, device); in samsung_dsim_host_attach()
1737 dsi->lanes = device->lanes; in samsung_dsim_host_attach()
1738 dsi->format = device->format; in samsung_dsim_host_attach()
1739 dsi->mode_flags = device->mode_flags; in samsung_dsim_host_attach()
1746 if (dsi->te_gpio) { in samsung_dsim_unregister_te_irq()
1747 free_irq(gpiod_to_irq(dsi->te_gpio), dsi); in samsung_dsim_unregister_te_irq()
1748 gpiod_put(dsi->te_gpio); in samsung_dsim_unregister_te_irq()
1756 const struct samsung_dsim_plat_data *pdata = dsi->plat_data; in samsung_dsim_host_detach()
1758 dsi->out_bridge = NULL; in samsung_dsim_host_detach()
1760 if (pdata->host_ops && pdata->host_ops->detach) in samsung_dsim_host_detach()
1761 pdata->host_ops->detach(dsi, device); in samsung_dsim_host_detach()
1765 drm_bridge_remove(&dsi->bridge); in samsung_dsim_host_detach()
1777 if (!(dsi->state & DSIM_STATE_ENABLED)) in samsung_dsim_host_transfer()
1778 return -EINVAL; in samsung_dsim_host_transfer()
1790 xfer.rx_len = msg->rx_len; in samsung_dsim_host_transfer()
1791 xfer.rx_payload = msg->rx_buf; in samsung_dsim_host_transfer()
1792 xfer.flags = msg->flags; in samsung_dsim_host_transfer()
1817 struct device *dev = dsi->dev; in samsung_dsim_parse_dt()
1818 struct device_node *node = dev->of_node; in samsung_dsim_parse_dt()
1824 ret = samsung_dsim_of_read_u32(node, "samsung,pll-clock-frequency", in samsung_dsim_parse_dt()
1825 &dsi->pll_clk_rate, 1); in samsung_dsim_parse_dt()
1831 dsi->pll_clk_rate = clk_get_rate(pll_clk); in samsung_dsim_parse_dt()
1837 ret = samsung_dsim_of_read_u32(node, "samsung,burst-clock-frequency", in samsung_dsim_parse_dt()
1838 &dsi->burst_clk_rate, 1); in samsung_dsim_parse_dt()
1841 dsi->burst_clk_rate = 0; in samsung_dsim_parse_dt()
1844 ret = samsung_dsim_of_read_u32(node, "samsung,esc-clock-frequency", in samsung_dsim_parse_dt()
1845 &dsi->esc_clk_rate, 0); in samsung_dsim_parse_dt()
1849 endpoint = of_graph_get_endpoint_by_regs(node, 1, -1); in samsung_dsim_parse_dt()
1850 nr_lanes = of_property_count_u32_elems(endpoint, "data-lanes"); in samsung_dsim_parse_dt()
1852 /* Polarity 0 is clock lane, 1..4 are data lanes. */ in samsung_dsim_parse_dt()
1853 of_property_read_u32_array(endpoint, "lane-polarities", in samsung_dsim_parse_dt()
1857 DRM_DEV_ERROR(dsi->dev, "Data lanes polarities do not match"); in samsung_dsim_parse_dt()
1860 dsi->swap_dn_dp_clk = true; in samsung_dsim_parse_dt()
1862 dsi->swap_dn_dp_data = true; in samsung_dsim_parse_dt()
1870 return mipi_dsi_host_register(&dsi->dsi_host); in generic_dsim_register_host()
1875 mipi_dsi_host_unregister(&dsi->dsi_host); in generic_dsim_unregister_host()
1893 struct device *dev = &pdev->dev; in samsung_dsim_probe()
1899 return -ENOMEM; in samsung_dsim_probe()
1901 init_completion(&dsi->completed); in samsung_dsim_probe()
1902 spin_lock_init(&dsi->transfer_lock); in samsung_dsim_probe()
1903 INIT_LIST_HEAD(&dsi->transfer_list); in samsung_dsim_probe()
1905 dsi->dsi_host.ops = &samsung_dsim_ops; in samsung_dsim_probe()
1906 dsi->dsi_host.dev = dev; in samsung_dsim_probe()
1908 dsi->dev = dev; in samsung_dsim_probe()
1909 dsi->plat_data = of_device_get_match_data(dev); in samsung_dsim_probe()
1910 dsi->driver_data = samsung_dsim_types[dsi->plat_data->hw_type]; in samsung_dsim_probe()
1912 dsi->supplies[0].supply = "vddcore"; in samsung_dsim_probe()
1913 dsi->supplies[1].supply = "vddio"; in samsung_dsim_probe()
1914 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), in samsung_dsim_probe()
1915 dsi->supplies); in samsung_dsim_probe()
1919 dsi->clks = devm_kcalloc(dev, dsi->driver_data->num_clks, in samsung_dsim_probe()
1920 sizeof(*dsi->clks), GFP_KERNEL); in samsung_dsim_probe()
1921 if (!dsi->clks) in samsung_dsim_probe()
1922 return -ENOMEM; in samsung_dsim_probe()
1924 for (i = 0; i < dsi->driver_data->num_clks; i++) { in samsung_dsim_probe()
1925 dsi->clks[i] = devm_clk_get(dev, clk_names[i]); in samsung_dsim_probe()
1926 if (IS_ERR(dsi->clks[i])) { in samsung_dsim_probe()
1928 dsi->clks[i] = devm_clk_get(dev, OLD_SCLK_MIPI_CLK_NAME); in samsung_dsim_probe()
1929 if (!IS_ERR(dsi->clks[i])) in samsung_dsim_probe()
1934 return PTR_ERR(dsi->clks[i]); in samsung_dsim_probe()
1938 dsi->reg_base = devm_platform_ioremap_resource(pdev, 0); in samsung_dsim_probe()
1939 if (IS_ERR(dsi->reg_base)) in samsung_dsim_probe()
1940 return PTR_ERR(dsi->reg_base); in samsung_dsim_probe()
1942 dsi->phy = devm_phy_optional_get(dev, "dsim"); in samsung_dsim_probe()
1943 if (IS_ERR(dsi->phy)) { in samsung_dsim_probe()
1945 return PTR_ERR(dsi->phy); in samsung_dsim_probe()
1948 dsi->irq = platform_get_irq(pdev, 0); in samsung_dsim_probe()
1949 if (dsi->irq < 0) in samsung_dsim_probe()
1950 return dsi->irq; in samsung_dsim_probe()
1952 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, in samsung_dsim_probe()
1969 dsi->bridge.funcs = &samsung_dsim_bridge_funcs; in samsung_dsim_probe()
1970 dsi->bridge.of_node = dev->of_node; in samsung_dsim_probe()
1971 dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; in samsung_dsim_probe()
1973 /* DE_LOW: i.MX8M Mini/Nano LCDIF-DSIM glue logic inverts HS/VS/DE */ in samsung_dsim_probe()
1974 if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) in samsung_dsim_probe()
1975 dsi->bridge.timings = &samsung_dsim_bridge_timings_de_low; in samsung_dsim_probe()
1977 dsi->bridge.timings = &samsung_dsim_bridge_timings_de_high; in samsung_dsim_probe()
1979 if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->register_host) in samsung_dsim_probe()
1980 ret = dsi->plat_data->host_ops->register_host(dsi); in samsung_dsim_probe()
1998 pm_runtime_disable(&pdev->dev); in samsung_dsim_remove()
2000 if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->unregister_host) in samsung_dsim_remove()
2001 dsi->plat_data->host_ops->unregister_host(dsi); in samsung_dsim_remove()
2010 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_suspend()
2015 if (dsi->state & DSIM_STATE_INITIALIZED) { in samsung_dsim_suspend()
2016 dsi->state &= ~DSIM_STATE_INITIALIZED; in samsung_dsim_suspend()
2023 dsi->state &= ~DSIM_STATE_CMD_LPM; in samsung_dsim_suspend()
2025 phy_power_off(dsi->phy); in samsung_dsim_suspend()
2027 for (i = driver_data->num_clks - 1; i > -1; i--) in samsung_dsim_suspend()
2028 clk_disable_unprepare(dsi->clks[i]); in samsung_dsim_suspend()
2030 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in samsung_dsim_suspend()
2032 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); in samsung_dsim_suspend()
2040 const struct samsung_dsim_driver_data *driver_data = dsi->driver_data; in samsung_dsim_resume()
2043 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in samsung_dsim_resume()
2045 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); in samsung_dsim_resume()
2049 for (i = 0; i < driver_data->num_clks; i++) { in samsung_dsim_resume()
2050 ret = clk_prepare_enable(dsi->clks[i]); in samsung_dsim_resume()
2055 ret = phy_power_on(dsi->phy); in samsung_dsim_resume()
2057 dev_err(dsi->dev, "cannot enable phy %d\n", ret); in samsung_dsim_resume()
2064 while (--i > -1) in samsung_dsim_resume()
2065 clk_disable_unprepare(dsi->clks[i]); in samsung_dsim_resume()
2066 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in samsung_dsim_resume()
2090 .compatible = "fsl,imx8mm-mipi-dsim",
2094 .compatible = "fsl,imx8mp-mipi-dsim",
2105 .name = "samsung-dsim",