Lines Matching refs:dsi

354 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)  in exynos_dsi_wait_for_reset()  argument
356 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300))) in exynos_dsi_wait_for_reset()
359 dev_err(dsi->dev, "timeout waiting for reset\n"); in exynos_dsi_wait_for_reset()
362 static void exynos_dsi_reset(struct exynos_dsi *dsi) in exynos_dsi_reset() argument
364 reinit_completion(&dsi->completed); in exynos_dsi_reset()
365 writel(DSIM_SWRST, dsi->reg_base + DSIM_SWRST_REG); in exynos_dsi_reset()
372 static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi, in exynos_dsi_pll_find_pms() argument
424 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi, in exynos_dsi_set_pll() argument
427 struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_pll()
434 clk_set_rate(dsi->pll_clk, dsi->pll_clk_rate); in exynos_dsi_set_pll()
436 fin = clk_get_rate(dsi->pll_clk); in exynos_dsi_set_pll()
438 dev_err(dsi->dev, "failed to get PLL clock frequency\n"); in exynos_dsi_set_pll()
442 dev_dbg(dsi->dev, "PLL input frequency: %lu\n", fin); in exynos_dsi_set_pll()
444 fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s); in exynos_dsi_set_pll()
446 dev_err(dsi->dev, in exynos_dsi_set_pll()
450 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s); in exynos_dsi_set_pll()
452 writel(500, dsi->reg_base + driver_data->plltmr_reg); in exynos_dsi_set_pll()
469 dev_dbg(dsi->dev, "band %d\n", band); in exynos_dsi_set_pll()
474 writel(reg, dsi->reg_base + DSIM_PLLCTRL_REG); in exynos_dsi_set_pll()
479 dev_err(dsi->dev, "PLL failed to stabilize\n"); in exynos_dsi_set_pll()
482 reg = readl(dsi->reg_base + DSIM_STATUS_REG); in exynos_dsi_set_pll()
488 static int exynos_dsi_enable_clock(struct exynos_dsi *dsi) in exynos_dsi_enable_clock() argument
494 hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate); in exynos_dsi_enable_clock()
496 dev_err(dsi->dev, "failed to configure DSI PLL\n"); in exynos_dsi_enable_clock()
501 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate); in exynos_dsi_enable_clock()
509 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n", in exynos_dsi_enable_clock()
512 reg = readl(dsi->reg_base + DSIM_CLKCTRL_REG); in exynos_dsi_enable_clock()
519 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1) in exynos_dsi_enable_clock()
522 writel(reg, dsi->reg_base + DSIM_CLKCTRL_REG); in exynos_dsi_enable_clock()
527 static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi) in exynos_dsi_set_phy_ctrl() argument
529 struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_set_phy_ctrl()
537 writel(reg, dsi->reg_base + DSIM_PHYCTRL_REG); in exynos_dsi_set_phy_ctrl()
545 writel(reg, dsi->reg_base + DSIM_PHYTIMING_REG); in exynos_dsi_set_phy_ctrl()
564 writel(reg, dsi->reg_base + DSIM_PHYTIMING1_REG); in exynos_dsi_set_phy_ctrl()
577 writel(reg, dsi->reg_base + DSIM_PHYTIMING2_REG); in exynos_dsi_set_phy_ctrl()
580 static void exynos_dsi_disable_clock(struct exynos_dsi *dsi) in exynos_dsi_disable_clock() argument
584 reg = readl(dsi->reg_base + DSIM_CLKCTRL_REG); in exynos_dsi_disable_clock()
587 writel(reg, dsi->reg_base + DSIM_CLKCTRL_REG); in exynos_dsi_disable_clock()
589 reg = readl(dsi->reg_base + DSIM_PLLCTRL_REG); in exynos_dsi_disable_clock()
591 writel(reg, dsi->reg_base + DSIM_PLLCTRL_REG); in exynos_dsi_disable_clock()
594 static int exynos_dsi_init_link(struct exynos_dsi *dsi) in exynos_dsi_init_link() argument
596 struct exynos_dsi_driver_data *driver_data = dsi->driver_data; in exynos_dsi_init_link()
602 reg = readl(dsi->reg_base + DSIM_FIFOCTRL_REG); in exynos_dsi_init_link()
604 writel(reg, dsi->reg_base + DSIM_FIFOCTRL_REG); in exynos_dsi_init_link()
609 writel(reg, dsi->reg_base + DSIM_FIFOCTRL_REG); in exynos_dsi_init_link()
621 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_init_link()
628 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH)) in exynos_dsi_init_link()
630 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) in exynos_dsi_init_link()
632 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) in exynos_dsi_init_link()
634 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT) in exynos_dsi_init_link()
636 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE) in exynos_dsi_init_link()
638 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HFP)) in exynos_dsi_init_link()
640 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HBP)) in exynos_dsi_init_link()
642 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSA)) in exynos_dsi_init_link()
646 if (!(dsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET)) in exynos_dsi_init_link()
649 switch (dsi->format) { in exynos_dsi_init_link()
663 dev_err(dsi->dev, "invalid pixel format\n"); in exynos_dsi_init_link()
667 reg |= DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1); in exynos_dsi_init_link()
669 writel(reg, dsi->reg_base + DSIM_CONFIG_REG); in exynos_dsi_init_link()
672 writel(reg, dsi->reg_base + DSIM_CONFIG_REG); in exynos_dsi_init_link()
674 lanes_mask = BIT(dsi->lanes) - 1; in exynos_dsi_init_link()
676 writel(reg, dsi->reg_base + DSIM_CONFIG_REG); in exynos_dsi_init_link()
687 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) { in exynos_dsi_init_link()
689 writel(reg, dsi->reg_base + DSIM_CONFIG_REG); in exynos_dsi_init_link()
696 dev_err(dsi->dev, "waiting for bus lanes timed out\n"); in exynos_dsi_init_link()
700 reg = readl(dsi->reg_base + DSIM_STATUS_REG); in exynos_dsi_init_link()
706 reg = readl(dsi->reg_base + DSIM_ESCMODE_REG); in exynos_dsi_init_link()
709 writel(reg, dsi->reg_base + DSIM_ESCMODE_REG); in exynos_dsi_init_link()
712 writel(reg, dsi->reg_base + DSIM_TIMEOUT_REG); in exynos_dsi_init_link()
717 static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi) in exynos_dsi_set_display_mode() argument
719 struct videomode *vm = &dsi->vm; in exynos_dsi_set_display_mode()
722 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { in exynos_dsi_set_display_mode()
726 writel(reg, dsi->reg_base + DSIM_MVPORCH_REG); in exynos_dsi_set_display_mode()
730 writel(reg, dsi->reg_base + DSIM_MHPORCH_REG); in exynos_dsi_set_display_mode()
734 writel(reg, dsi->reg_base + DSIM_MSYNC_REG); in exynos_dsi_set_display_mode()
738 writel(reg, dsi->reg_base + DSIM_MDRESOL_REG); in exynos_dsi_set_display_mode()
740 dev_dbg(dsi->dev, "LCD size = %dx%d\n", vm->hactive, vm->vactive); in exynos_dsi_set_display_mode()
743 static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable) in exynos_dsi_set_display_enable() argument
747 reg = readl(dsi->reg_base + DSIM_MDRESOL_REG); in exynos_dsi_set_display_enable()
752 writel(reg, dsi->reg_base + DSIM_MDRESOL_REG); in exynos_dsi_set_display_enable()
755 static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi) in exynos_dsi_wait_for_hdr_fifo() argument
760 u32 reg = readl(dsi->reg_base + DSIM_FIFOCTRL_REG); in exynos_dsi_wait_for_hdr_fifo()
772 static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm) in exynos_dsi_set_cmd_lpm() argument
774 u32 v = readl(dsi->reg_base + DSIM_ESCMODE_REG); in exynos_dsi_set_cmd_lpm()
781 writel(v, dsi->reg_base + DSIM_ESCMODE_REG); in exynos_dsi_set_cmd_lpm()
784 static void exynos_dsi_force_bta(struct exynos_dsi *dsi) in exynos_dsi_force_bta() argument
786 u32 v = readl(dsi->reg_base + DSIM_ESCMODE_REG); in exynos_dsi_force_bta()
789 writel(v, dsi->reg_base + DSIM_ESCMODE_REG); in exynos_dsi_force_bta()
792 static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi, in exynos_dsi_send_to_fifo() argument
795 struct device *dev = dsi->dev; in exynos_dsi_send_to_fifo()
813 writel(reg, dsi->reg_base + DSIM_PAYLOAD_REG); in exynos_dsi_send_to_fifo()
828 writel(reg, dsi->reg_base + DSIM_PAYLOAD_REG); in exynos_dsi_send_to_fifo()
840 if (exynos_dsi_wait_for_hdr_fifo(dsi)) { in exynos_dsi_send_to_fifo()
846 dsi->state & DSIM_STATE_CMD_LPM)) { in exynos_dsi_send_to_fifo()
847 exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM); in exynos_dsi_send_to_fifo()
848 dsi->state ^= DSIM_STATE_CMD_LPM; in exynos_dsi_send_to_fifo()
851 writel(reg, dsi->reg_base + DSIM_PKTHDR_REG); in exynos_dsi_send_to_fifo()
854 exynos_dsi_force_bta(dsi); in exynos_dsi_send_to_fifo()
857 static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi, in exynos_dsi_read_from_fifo() argument
862 struct device *dev = dsi->dev; in exynos_dsi_read_from_fifo()
867 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
906 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
916 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
935 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG); in exynos_dsi_read_from_fifo()
941 static void exynos_dsi_transfer_start(struct exynos_dsi *dsi) in exynos_dsi_transfer_start() argument
948 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
950 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_start()
951 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
955 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_start()
958 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
964 exynos_dsi_send_to_fifo(dsi, xfer); in exynos_dsi_transfer_start()
972 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
975 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_start()
977 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_start()
983 static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi) in exynos_dsi_transfer_finish() argument
989 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
991 if (list_empty(&dsi->transfer_list)) { in exynos_dsi_transfer_finish()
992 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
996 xfer = list_first_entry(&dsi->transfer_list, in exynos_dsi_transfer_finish()
999 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1001 dev_dbg(dsi->dev, in exynos_dsi_transfer_finish()
1009 exynos_dsi_read_from_fifo(dsi, xfer); in exynos_dsi_transfer_finish()
1014 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1017 start = !list_empty(&dsi->transfer_list); in exynos_dsi_transfer_finish()
1019 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer_finish()
1028 static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi, in exynos_dsi_remove_transfer() argument
1034 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1036 if (!list_empty(&dsi->transfer_list) && in exynos_dsi_remove_transfer()
1037 xfer == list_first_entry(&dsi->transfer_list, in exynos_dsi_remove_transfer()
1040 start = !list_empty(&dsi->transfer_list); in exynos_dsi_remove_transfer()
1041 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1043 exynos_dsi_transfer_start(dsi); in exynos_dsi_remove_transfer()
1049 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_remove_transfer()
1052 static int exynos_dsi_transfer(struct exynos_dsi *dsi, in exynos_dsi_transfer() argument
1063 spin_lock_irqsave(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1065 stopped = list_empty(&dsi->transfer_list); in exynos_dsi_transfer()
1066 list_add_tail(&xfer->list, &dsi->transfer_list); in exynos_dsi_transfer()
1068 spin_unlock_irqrestore(&dsi->transfer_lock, flags); in exynos_dsi_transfer()
1071 exynos_dsi_transfer_start(dsi); in exynos_dsi_transfer()
1076 exynos_dsi_remove_transfer(dsi, xfer); in exynos_dsi_transfer()
1077 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 2, xfer->data, in exynos_dsi_transfer()
1088 struct exynos_dsi *dsi = dev_id; in exynos_dsi_irq() local
1091 status = readl(dsi->reg_base + DSIM_INTSRC_REG); in exynos_dsi_irq()
1095 dev_warn(dsi->dev, "spurious interrupt\n"); in exynos_dsi_irq()
1098 writel(status, dsi->reg_base + DSIM_INTSRC_REG); in exynos_dsi_irq()
1102 writel(mask, dsi->reg_base + DSIM_INTMSK_REG); in exynos_dsi_irq()
1103 complete(&dsi->completed); in exynos_dsi_irq()
1110 if (exynos_dsi_transfer_finish(dsi)) in exynos_dsi_irq()
1111 exynos_dsi_transfer_start(dsi); in exynos_dsi_irq()
1118 struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id; in exynos_dsi_te_irq_handler() local
1119 struct drm_encoder *encoder = dsi->display.encoder; in exynos_dsi_te_irq_handler()
1121 if (dsi->state & DSIM_STATE_ENABLED) in exynos_dsi_te_irq_handler()
1127 static void exynos_dsi_enable_irq(struct exynos_dsi *dsi) in exynos_dsi_enable_irq() argument
1129 enable_irq(dsi->irq); in exynos_dsi_enable_irq()
1131 if (gpio_is_valid(dsi->te_gpio)) in exynos_dsi_enable_irq()
1132 enable_irq(gpio_to_irq(dsi->te_gpio)); in exynos_dsi_enable_irq()
1135 static void exynos_dsi_disable_irq(struct exynos_dsi *dsi) in exynos_dsi_disable_irq() argument
1137 if (gpio_is_valid(dsi->te_gpio)) in exynos_dsi_disable_irq()
1138 disable_irq(gpio_to_irq(dsi->te_gpio)); in exynos_dsi_disable_irq()
1140 disable_irq(dsi->irq); in exynos_dsi_disable_irq()
1143 static int exynos_dsi_init(struct exynos_dsi *dsi) in exynos_dsi_init() argument
1145 exynos_dsi_reset(dsi); in exynos_dsi_init()
1146 exynos_dsi_enable_irq(dsi); in exynos_dsi_init()
1147 exynos_dsi_enable_clock(dsi); in exynos_dsi_init()
1148 exynos_dsi_wait_for_reset(dsi); in exynos_dsi_init()
1149 exynos_dsi_set_phy_ctrl(dsi); in exynos_dsi_init()
1150 exynos_dsi_init_link(dsi); in exynos_dsi_init()
1155 static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi) in exynos_dsi_register_te_irq() argument
1160 dsi->te_gpio = of_get_named_gpio(dsi->panel_node, "te-gpios", 0); in exynos_dsi_register_te_irq()
1161 if (!gpio_is_valid(dsi->te_gpio)) { in exynos_dsi_register_te_irq()
1162 dev_err(dsi->dev, "no te-gpios specified\n"); in exynos_dsi_register_te_irq()
1163 ret = dsi->te_gpio; in exynos_dsi_register_te_irq()
1167 ret = gpio_request_one(dsi->te_gpio, GPIOF_IN, "te_gpio"); in exynos_dsi_register_te_irq()
1169 dev_err(dsi->dev, "gpio request failed with %d\n", ret); in exynos_dsi_register_te_irq()
1173 te_gpio_irq = gpio_to_irq(dsi->te_gpio); in exynos_dsi_register_te_irq()
1177 IRQF_TRIGGER_RISING, "TE", dsi); in exynos_dsi_register_te_irq()
1179 dev_err(dsi->dev, "request interrupt failed with %d\n", ret); in exynos_dsi_register_te_irq()
1180 gpio_free(dsi->te_gpio); in exynos_dsi_register_te_irq()
1188 static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) in exynos_dsi_unregister_te_irq() argument
1190 if (gpio_is_valid(dsi->te_gpio)) { in exynos_dsi_unregister_te_irq()
1191 free_irq(gpio_to_irq(dsi->te_gpio), dsi); in exynos_dsi_unregister_te_irq()
1192 gpio_free(dsi->te_gpio); in exynos_dsi_unregister_te_irq()
1193 dsi->te_gpio = -ENOENT; in exynos_dsi_unregister_te_irq()
1200 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_attach() local
1202 dsi->lanes = device->lanes; in exynos_dsi_host_attach()
1203 dsi->format = device->format; in exynos_dsi_host_attach()
1204 dsi->mode_flags = device->mode_flags; in exynos_dsi_host_attach()
1205 dsi->panel_node = device->dev.of_node; in exynos_dsi_host_attach()
1213 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO)) { in exynos_dsi_host_attach()
1214 int ret = exynos_dsi_register_te_irq(dsi); in exynos_dsi_host_attach()
1220 if (dsi->connector.dev) in exynos_dsi_host_attach()
1221 drm_helper_hpd_irq_event(dsi->connector.dev); in exynos_dsi_host_attach()
1229 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_detach() local
1231 exynos_dsi_unregister_te_irq(dsi); in exynos_dsi_host_detach()
1233 dsi->panel_node = NULL; in exynos_dsi_host_detach()
1235 if (dsi->connector.dev) in exynos_dsi_host_detach()
1236 drm_helper_hpd_irq_event(dsi->connector.dev); in exynos_dsi_host_detach()
1250 struct exynos_dsi *dsi = host_to_dsi(host); in exynos_dsi_host_transfer() local
1254 if (!(dsi->state & DSIM_STATE_INITIALIZED)) { in exynos_dsi_host_transfer()
1255 ret = exynos_dsi_init(dsi); in exynos_dsi_host_transfer()
1258 dsi->state |= DSIM_STATE_INITIALIZED; in exynos_dsi_host_transfer()
1285 ret = exynos_dsi_transfer(dsi, &xfer); in exynos_dsi_host_transfer()
1295 static int exynos_dsi_poweron(struct exynos_dsi *dsi) in exynos_dsi_poweron() argument
1299 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_poweron()
1301 dev_err(dsi->dev, "cannot enable regulators %d\n", ret); in exynos_dsi_poweron()
1305 ret = clk_prepare_enable(dsi->bus_clk); in exynos_dsi_poweron()
1307 dev_err(dsi->dev, "cannot enable bus clock %d\n", ret); in exynos_dsi_poweron()
1311 ret = clk_prepare_enable(dsi->pll_clk); in exynos_dsi_poweron()
1313 dev_err(dsi->dev, "cannot enable pll clock %d\n", ret); in exynos_dsi_poweron()
1317 ret = phy_power_on(dsi->phy); in exynos_dsi_poweron()
1319 dev_err(dsi->dev, "cannot enable phy %d\n", ret); in exynos_dsi_poweron()
1326 clk_disable_unprepare(dsi->pll_clk); in exynos_dsi_poweron()
1328 clk_disable_unprepare(dsi->bus_clk); in exynos_dsi_poweron()
1330 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_poweron()
1335 static void exynos_dsi_poweroff(struct exynos_dsi *dsi) in exynos_dsi_poweroff() argument
1341 if (dsi->state & DSIM_STATE_INITIALIZED) { in exynos_dsi_poweroff()
1342 dsi->state &= ~DSIM_STATE_INITIALIZED; in exynos_dsi_poweroff()
1344 exynos_dsi_disable_clock(dsi); in exynos_dsi_poweroff()
1346 exynos_dsi_disable_irq(dsi); in exynos_dsi_poweroff()
1349 dsi->state &= ~DSIM_STATE_CMD_LPM; in exynos_dsi_poweroff()
1351 phy_power_off(dsi->phy); in exynos_dsi_poweroff()
1353 clk_disable_unprepare(dsi->pll_clk); in exynos_dsi_poweroff()
1354 clk_disable_unprepare(dsi->bus_clk); in exynos_dsi_poweroff()
1356 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies); in exynos_dsi_poweroff()
1358 dev_err(dsi->dev, "cannot disable regulators %d\n", ret); in exynos_dsi_poweroff()
1361 static int exynos_dsi_enable(struct exynos_dsi *dsi) in exynos_dsi_enable() argument
1365 if (dsi->state & DSIM_STATE_ENABLED) in exynos_dsi_enable()
1368 ret = exynos_dsi_poweron(dsi); in exynos_dsi_enable()
1372 ret = drm_panel_prepare(dsi->panel); in exynos_dsi_enable()
1374 exynos_dsi_poweroff(dsi); in exynos_dsi_enable()
1378 exynos_dsi_set_display_mode(dsi); in exynos_dsi_enable()
1379 exynos_dsi_set_display_enable(dsi, true); in exynos_dsi_enable()
1381 dsi->state |= DSIM_STATE_ENABLED; in exynos_dsi_enable()
1383 ret = drm_panel_enable(dsi->panel); in exynos_dsi_enable()
1385 dsi->state &= ~DSIM_STATE_ENABLED; in exynos_dsi_enable()
1386 exynos_dsi_set_display_enable(dsi, false); in exynos_dsi_enable()
1387 drm_panel_unprepare(dsi->panel); in exynos_dsi_enable()
1388 exynos_dsi_poweroff(dsi); in exynos_dsi_enable()
1395 static void exynos_dsi_disable(struct exynos_dsi *dsi) in exynos_dsi_disable() argument
1397 if (!(dsi->state & DSIM_STATE_ENABLED)) in exynos_dsi_disable()
1400 drm_panel_disable(dsi->panel); in exynos_dsi_disable()
1401 exynos_dsi_set_display_enable(dsi, false); in exynos_dsi_disable()
1402 drm_panel_unprepare(dsi->panel); in exynos_dsi_disable()
1403 exynos_dsi_poweroff(dsi); in exynos_dsi_disable()
1405 dsi->state &= ~DSIM_STATE_ENABLED; in exynos_dsi_disable()
1410 struct exynos_dsi *dsi = display_to_dsi(display); in exynos_dsi_dpms() local
1412 if (dsi->panel) { in exynos_dsi_dpms()
1415 exynos_dsi_enable(dsi); in exynos_dsi_dpms()
1420 exynos_dsi_disable(dsi); in exynos_dsi_dpms()
1431 struct exynos_dsi *dsi = connector_to_dsi(connector); in exynos_dsi_detect() local
1433 if (!dsi->panel) { in exynos_dsi_detect()
1434 dsi->panel = of_drm_find_panel(dsi->panel_node); in exynos_dsi_detect()
1435 if (dsi->panel) in exynos_dsi_detect()
1436 drm_panel_attach(dsi->panel, &dsi->connector); in exynos_dsi_detect()
1437 } else if (!dsi->panel_node) { in exynos_dsi_detect()
1440 display = platform_get_drvdata(to_platform_device(dsi->dev)); in exynos_dsi_detect()
1442 drm_panel_detach(dsi->panel); in exynos_dsi_detect()
1443 dsi->panel = NULL; in exynos_dsi_detect()
1446 if (dsi->panel) in exynos_dsi_detect()
1468 struct exynos_dsi *dsi = connector_to_dsi(connector); in exynos_dsi_get_modes() local
1470 if (dsi->panel) in exynos_dsi_get_modes()
1471 return dsi->panel->funcs->get_modes(dsi->panel); in exynos_dsi_get_modes()
1479 struct exynos_dsi *dsi = connector_to_dsi(connector); in exynos_dsi_best_encoder() local
1481 return dsi->display.encoder; in exynos_dsi_best_encoder()
1492 struct exynos_dsi *dsi = display_to_dsi(display); in exynos_dsi_create_connector() local
1493 struct drm_connector *connector = &dsi->connector; in exynos_dsi_create_connector()
1516 struct exynos_dsi *dsi = display_to_dsi(display); in exynos_dsi_mode_set() local
1517 struct videomode *vm = &dsi->vm; in exynos_dsi_mode_set()
1598 static int exynos_dsi_parse_dt(struct exynos_dsi *dsi) in exynos_dsi_parse_dt() argument
1600 struct device *dev = dsi->dev; in exynos_dsi_parse_dt()
1606 &dsi->pll_clk_rate); in exynos_dsi_parse_dt()
1624 &dsi->burst_clk_rate); in exynos_dsi_parse_dt()
1629 &dsi->esc_clk_rate); in exynos_dsi_parse_dt()
1641 struct exynos_dsi *dsi = display_to_dsi(display); in exynos_dsi_bind() local
1652 return mipi_dsi_host_register(&dsi->dsi_host); in exynos_dsi_bind()
1659 struct exynos_dsi *dsi = display_to_dsi(display); in exynos_dsi_unbind() local
1663 mipi_dsi_host_unregister(&dsi->dsi_host); in exynos_dsi_unbind()
1675 struct exynos_dsi *dsi; in exynos_dsi_probe() local
1678 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in exynos_dsi_probe()
1679 if (!dsi) in exynos_dsi_probe()
1682 dsi->display.type = EXYNOS_DISPLAY_TYPE_LCD; in exynos_dsi_probe()
1683 dsi->display.ops = &exynos_dsi_display_ops; in exynos_dsi_probe()
1686 dsi->display.type); in exynos_dsi_probe()
1691 dsi->te_gpio = -ENOENT; in exynos_dsi_probe()
1693 init_completion(&dsi->completed); in exynos_dsi_probe()
1694 spin_lock_init(&dsi->transfer_lock); in exynos_dsi_probe()
1695 INIT_LIST_HEAD(&dsi->transfer_list); in exynos_dsi_probe()
1697 dsi->dsi_host.ops = &exynos_dsi_ops; in exynos_dsi_probe()
1698 dsi->dsi_host.dev = dev; in exynos_dsi_probe()
1700 dsi->dev = dev; in exynos_dsi_probe()
1701 dsi->driver_data = exynos_dsi_get_driver_data(pdev); in exynos_dsi_probe()
1703 ret = exynos_dsi_parse_dt(dsi); in exynos_dsi_probe()
1707 dsi->supplies[0].supply = "vddcore"; in exynos_dsi_probe()
1708 dsi->supplies[1].supply = "vddio"; in exynos_dsi_probe()
1709 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies), in exynos_dsi_probe()
1710 dsi->supplies); in exynos_dsi_probe()
1716 dsi->pll_clk = devm_clk_get(dev, "pll_clk"); in exynos_dsi_probe()
1717 if (IS_ERR(dsi->pll_clk)) { in exynos_dsi_probe()
1719 ret = PTR_ERR(dsi->pll_clk); in exynos_dsi_probe()
1723 dsi->bus_clk = devm_clk_get(dev, "bus_clk"); in exynos_dsi_probe()
1724 if (IS_ERR(dsi->bus_clk)) { in exynos_dsi_probe()
1726 ret = PTR_ERR(dsi->bus_clk); in exynos_dsi_probe()
1731 dsi->reg_base = devm_ioremap_resource(dev, res); in exynos_dsi_probe()
1732 if (IS_ERR(dsi->reg_base)) { in exynos_dsi_probe()
1734 ret = PTR_ERR(dsi->reg_base); in exynos_dsi_probe()
1738 dsi->phy = devm_phy_get(dev, "dsim"); in exynos_dsi_probe()
1739 if (IS_ERR(dsi->phy)) { in exynos_dsi_probe()
1741 ret = PTR_ERR(dsi->phy); in exynos_dsi_probe()
1745 dsi->irq = platform_get_irq(pdev, 0); in exynos_dsi_probe()
1746 if (dsi->irq < 0) { in exynos_dsi_probe()
1748 ret = dsi->irq; in exynos_dsi_probe()
1752 irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN); in exynos_dsi_probe()
1753 ret = devm_request_threaded_irq(dev, dsi->irq, NULL, in exynos_dsi_probe()
1755 dev_name(dev), dsi); in exynos_dsi_probe()
1761 platform_set_drvdata(pdev, &dsi->display); in exynos_dsi_probe()