Lines Matching full:dsi

7 #define DSS_SUBSYS_NAME "DSI"
48 #include "dsi.h"
50 #define REG_GET(dsi, idx, start, end) \ argument
51 FLD_GET(dsi_read_reg(dsi, idx), start, end)
53 #define REG_FLD_MOD(dsi, idx, val, start, end) \ argument
54 dsi_write_reg(dsi, idx, FLD_MOD(dsi_read_reg(dsi, idx), val, start, end))
56 static int dsi_init_dispc(struct dsi_data *dsi);
57 static void dsi_uninit_dispc(struct dsi_data *dsi);
59 static int dsi_vc_send_null(struct dsi_data *dsi, int vc, int channel);
61 static ssize_t _omap_dsi_host_transfer(struct dsi_data *dsi, int vc,
86 static inline void dsi_write_reg(struct dsi_data *dsi, in dsi_write_reg() argument
92 case DSI_PROTO: base = dsi->proto_base; break; in dsi_write_reg()
93 case DSI_PHY: base = dsi->phy_base; break; in dsi_write_reg()
94 case DSI_PLL: base = dsi->pll_base; break; in dsi_write_reg()
101 static inline u32 dsi_read_reg(struct dsi_data *dsi, const struct dsi_reg idx) in dsi_read_reg() argument
106 case DSI_PROTO: base = dsi->proto_base; break; in dsi_read_reg()
107 case DSI_PHY: base = dsi->phy_base; break; in dsi_read_reg()
108 case DSI_PLL: base = dsi->pll_base; break; in dsi_read_reg()
115 static void dsi_bus_lock(struct dsi_data *dsi) in dsi_bus_lock() argument
117 down(&dsi->bus_lock); in dsi_bus_lock()
120 static void dsi_bus_unlock(struct dsi_data *dsi) in dsi_bus_unlock() argument
122 up(&dsi->bus_lock); in dsi_bus_unlock()
125 static bool dsi_bus_is_locked(struct dsi_data *dsi) in dsi_bus_is_locked() argument
127 return dsi->bus_lock.count == 0; in dsi_bus_is_locked()
135 static inline bool wait_for_bit_change(struct dsi_data *dsi, in wait_for_bit_change() argument
146 if (REG_GET(dsi, idx, bitnum, bitnum) == value) in wait_for_bit_change()
153 if (REG_GET(dsi, idx, bitnum, bitnum) == value) in wait_for_bit_change()
165 static void dsi_perf_mark_setup(struct dsi_data *dsi) in dsi_perf_mark_setup() argument
167 dsi->perf_setup_time = ktime_get(); in dsi_perf_mark_setup()
170 static void dsi_perf_mark_start(struct dsi_data *dsi) in dsi_perf_mark_start() argument
172 dsi->perf_start_time = ktime_get(); in dsi_perf_mark_start()
175 static void dsi_perf_show(struct dsi_data *dsi, const char *name) in dsi_perf_show() argument
186 setup_time = ktime_sub(dsi->perf_start_time, dsi->perf_setup_time); in dsi_perf_show()
191 trans_time = ktime_sub(t, dsi->perf_start_time); in dsi_perf_show()
198 total_bytes = dsi->update_bytes; in dsi_perf_show()
200 pr_info("DSI(%s): %u us + %u us = %u us (%uHz), %u bytes, %u kbytes/sec\n", in dsi_perf_show()
210 static inline void dsi_perf_mark_setup(struct dsi_data *dsi) in dsi_perf_mark_setup() argument
214 static inline void dsi_perf_mark_start(struct dsi_data *dsi) in dsi_perf_mark_start() argument
218 static inline void dsi_perf_show(struct dsi_data *dsi, const char *name) in dsi_perf_show() argument
235 pr_debug("DSI IRQ: 0x%x: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", in print_irq_status()
267 pr_debug("DSI VC(%d) IRQ 0x%x: %s%s%s%s%s%s%s%s%s\n", in print_irq_status_vc()
289 pr_debug("DSI CIO IRQ 0x%x: %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", in print_irq_status_cio()
315 static void dsi_collect_irq_stats(struct dsi_data *dsi, u32 irqstatus, in dsi_collect_irq_stats() argument
320 spin_lock(&dsi->irq_stats_lock); in dsi_collect_irq_stats()
322 dsi->irq_stats.irq_count++; in dsi_collect_irq_stats()
323 dss_collect_irq_stats(irqstatus, dsi->irq_stats.dsi_irqs); in dsi_collect_irq_stats()
326 dss_collect_irq_stats(vcstatus[i], dsi->irq_stats.vc_irqs[i]); in dsi_collect_irq_stats()
328 dss_collect_irq_stats(ciostatus, dsi->irq_stats.cio_irqs); in dsi_collect_irq_stats()
330 spin_unlock(&dsi->irq_stats_lock); in dsi_collect_irq_stats()
333 #define dsi_collect_irq_stats(dsi, irqstatus, vcstatus, ciostatus) argument
338 static void dsi_handle_irq_errors(struct dsi_data *dsi, u32 irqstatus, in dsi_handle_irq_errors() argument
344 DSSERR("DSI error, irqstatus %x\n", irqstatus); in dsi_handle_irq_errors()
346 spin_lock(&dsi->errors_lock); in dsi_handle_irq_errors()
347 dsi->errors |= irqstatus & DSI_IRQ_ERROR_MASK; in dsi_handle_irq_errors()
348 spin_unlock(&dsi->errors_lock); in dsi_handle_irq_errors()
355 DSSERR("DSI VC(%d) error, vc irqstatus %x\n", in dsi_handle_irq_errors()
364 DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus); in dsi_handle_irq_errors()
409 struct dsi_data *dsi = arg; in omap_dsi_irq_handler() local
413 if (!dsi->is_enabled) in omap_dsi_irq_handler()
416 spin_lock(&dsi->irq_lock); in omap_dsi_irq_handler()
418 irqstatus = dsi_read_reg(dsi, DSI_IRQSTATUS); in omap_dsi_irq_handler()
422 spin_unlock(&dsi->irq_lock); in omap_dsi_irq_handler()
426 dsi_write_reg(dsi, DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK); in omap_dsi_irq_handler()
428 dsi_read_reg(dsi, DSI_IRQSTATUS); in omap_dsi_irq_handler()
436 vcstatus[i] = dsi_read_reg(dsi, DSI_VC_IRQSTATUS(i)); in omap_dsi_irq_handler()
438 dsi_write_reg(dsi, DSI_VC_IRQSTATUS(i), vcstatus[i]); in omap_dsi_irq_handler()
440 dsi_read_reg(dsi, DSI_VC_IRQSTATUS(i)); in omap_dsi_irq_handler()
444 ciostatus = dsi_read_reg(dsi, DSI_COMPLEXIO_IRQ_STATUS); in omap_dsi_irq_handler()
446 dsi_write_reg(dsi, DSI_COMPLEXIO_IRQ_STATUS, ciostatus); in omap_dsi_irq_handler()
448 dsi_read_reg(dsi, DSI_COMPLEXIO_IRQ_STATUS); in omap_dsi_irq_handler()
455 del_timer(&dsi->te_timer); in omap_dsi_irq_handler()
460 memcpy(&dsi->isr_tables_copy, &dsi->isr_tables, in omap_dsi_irq_handler()
461 sizeof(dsi->isr_tables)); in omap_dsi_irq_handler()
463 spin_unlock(&dsi->irq_lock); in omap_dsi_irq_handler()
465 dsi_handle_isrs(&dsi->isr_tables_copy, irqstatus, vcstatus, ciostatus); in omap_dsi_irq_handler()
467 dsi_handle_irq_errors(dsi, irqstatus, vcstatus, ciostatus); in omap_dsi_irq_handler()
469 dsi_collect_irq_stats(dsi, irqstatus, vcstatus, ciostatus); in omap_dsi_irq_handler()
474 /* dsi->irq_lock has to be locked by the caller */
475 static void _omap_dsi_configure_irqs(struct dsi_data *dsi, in _omap_dsi_configure_irqs() argument
498 old_mask = dsi_read_reg(dsi, enable_reg); in _omap_dsi_configure_irqs()
500 dsi_write_reg(dsi, status_reg, (mask ^ old_mask) & mask); in _omap_dsi_configure_irqs()
501 dsi_write_reg(dsi, enable_reg, mask); in _omap_dsi_configure_irqs()
504 dsi_read_reg(dsi, enable_reg); in _omap_dsi_configure_irqs()
505 dsi_read_reg(dsi, status_reg); in _omap_dsi_configure_irqs()
508 /* dsi->irq_lock has to be locked by the caller */
509 static void _omap_dsi_set_irqs(struct dsi_data *dsi) in _omap_dsi_set_irqs() argument
515 _omap_dsi_configure_irqs(dsi, dsi->isr_tables.isr_table, in _omap_dsi_set_irqs()
516 ARRAY_SIZE(dsi->isr_tables.isr_table), mask, in _omap_dsi_set_irqs()
520 /* dsi->irq_lock has to be locked by the caller */
521 static void _omap_dsi_set_irqs_vc(struct dsi_data *dsi, int vc) in _omap_dsi_set_irqs_vc() argument
523 _omap_dsi_configure_irqs(dsi, dsi->isr_tables.isr_table_vc[vc], in _omap_dsi_set_irqs_vc()
524 ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc]), in _omap_dsi_set_irqs_vc()
529 /* dsi->irq_lock has to be locked by the caller */
530 static void _omap_dsi_set_irqs_cio(struct dsi_data *dsi) in _omap_dsi_set_irqs_cio() argument
532 _omap_dsi_configure_irqs(dsi, dsi->isr_tables.isr_table_cio, in _omap_dsi_set_irqs_cio()
533 ARRAY_SIZE(dsi->isr_tables.isr_table_cio), in _omap_dsi_set_irqs_cio()
538 static void _dsi_initialize_irq(struct dsi_data *dsi) in _dsi_initialize_irq() argument
543 spin_lock_irqsave(&dsi->irq_lock, flags); in _dsi_initialize_irq()
545 memset(&dsi->isr_tables, 0, sizeof(dsi->isr_tables)); in _dsi_initialize_irq()
547 _omap_dsi_set_irqs(dsi); in _dsi_initialize_irq()
549 _omap_dsi_set_irqs_vc(dsi, vc); in _dsi_initialize_irq()
550 _omap_dsi_set_irqs_cio(dsi); in _dsi_initialize_irq()
552 spin_unlock_irqrestore(&dsi->irq_lock, flags); in _dsi_initialize_irq()
611 static int dsi_register_isr(struct dsi_data *dsi, omap_dsi_isr_t isr, in dsi_register_isr() argument
617 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_register_isr()
619 r = _dsi_register_isr(isr, arg, mask, dsi->isr_tables.isr_table, in dsi_register_isr()
620 ARRAY_SIZE(dsi->isr_tables.isr_table)); in dsi_register_isr()
623 _omap_dsi_set_irqs(dsi); in dsi_register_isr()
625 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_register_isr()
630 static int dsi_unregister_isr(struct dsi_data *dsi, omap_dsi_isr_t isr, in dsi_unregister_isr() argument
636 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_unregister_isr()
638 r = _dsi_unregister_isr(isr, arg, mask, dsi->isr_tables.isr_table, in dsi_unregister_isr()
639 ARRAY_SIZE(dsi->isr_tables.isr_table)); in dsi_unregister_isr()
642 _omap_dsi_set_irqs(dsi); in dsi_unregister_isr()
644 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_unregister_isr()
649 static int dsi_register_isr_vc(struct dsi_data *dsi, int vc, in dsi_register_isr_vc() argument
655 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_register_isr_vc()
658 dsi->isr_tables.isr_table_vc[vc], in dsi_register_isr_vc()
659 ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc])); in dsi_register_isr_vc()
662 _omap_dsi_set_irqs_vc(dsi, vc); in dsi_register_isr_vc()
664 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_register_isr_vc()
669 static int dsi_unregister_isr_vc(struct dsi_data *dsi, int vc, in dsi_unregister_isr_vc() argument
675 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_unregister_isr_vc()
678 dsi->isr_tables.isr_table_vc[vc], in dsi_unregister_isr_vc()
679 ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc])); in dsi_unregister_isr_vc()
682 _omap_dsi_set_irqs_vc(dsi, vc); in dsi_unregister_isr_vc()
684 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_unregister_isr_vc()
689 static u32 dsi_get_errors(struct dsi_data *dsi) in dsi_get_errors() argument
694 spin_lock_irqsave(&dsi->errors_lock, flags); in dsi_get_errors()
695 e = dsi->errors; in dsi_get_errors()
696 dsi->errors = 0; in dsi_get_errors()
697 spin_unlock_irqrestore(&dsi->errors_lock, flags); in dsi_get_errors()
701 static int dsi_runtime_get(struct dsi_data *dsi) in dsi_runtime_get() argument
707 r = pm_runtime_get_sync(dsi->dev); in dsi_runtime_get()
709 pm_runtime_put_noidle(dsi->dev); in dsi_runtime_get()
715 static void dsi_runtime_put(struct dsi_data *dsi) in dsi_runtime_put() argument
721 r = pm_runtime_put_sync(dsi->dev); in dsi_runtime_put()
725 static void _dsi_print_reset_status(struct dsi_data *dsi) in _dsi_print_reset_status() argument
730 * required after DSIPHY reset to complete the reset of the DSI complex in _dsi_print_reset_status()
732 dsi_read_reg(dsi, DSI_DSIPHY_CFG5); in _dsi_print_reset_status()
734 if (dsi->data->quirks & DSI_QUIRK_REVERSE_TXCLKESC) { in _dsi_print_reset_status()
745 FLD_GET(dsi_read_reg(dsi, DSI_##fld), start, end) in _dsi_print_reset_status()
747 pr_debug("DSI resets: PLL (%d) CIO (%d) PHY (%x%x%x, %d, %d, %d)\n", in _dsi_print_reset_status()
760 static inline int dsi_if_enable(struct dsi_data *dsi, bool enable) in dsi_if_enable() argument
765 REG_FLD_MOD(dsi, DSI_CTRL, enable, 0, 0); /* IF_EN */ in dsi_if_enable()
767 if (!wait_for_bit_change(dsi, DSI_CTRL, 0, enable)) { in dsi_if_enable()
775 static unsigned long dsi_get_pll_hsdiv_dispc_rate(struct dsi_data *dsi) in dsi_get_pll_hsdiv_dispc_rate() argument
777 return dsi->pll.cinfo.clkout[HSDIV_DISPC]; in dsi_get_pll_hsdiv_dispc_rate()
780 static unsigned long dsi_get_pll_hsdiv_dsi_rate(struct dsi_data *dsi) in dsi_get_pll_hsdiv_dsi_rate() argument
782 return dsi->pll.cinfo.clkout[HSDIV_DSI]; in dsi_get_pll_hsdiv_dsi_rate()
785 static unsigned long dsi_get_txbyteclkhs(struct dsi_data *dsi) in dsi_get_txbyteclkhs() argument
787 return dsi->pll.cinfo.clkdco / 16; in dsi_get_txbyteclkhs()
790 static unsigned long dsi_fclk_rate(struct dsi_data *dsi) in dsi_fclk_rate() argument
795 source = dss_get_dsi_clk_source(dsi->dss, dsi->module_id); in dsi_fclk_rate()
797 /* DSI FCLK source is DSS_CLK_FCK */ in dsi_fclk_rate()
798 r = clk_get_rate(dsi->dss_clk); in dsi_fclk_rate()
800 /* DSI FCLK source is dsi_pll_hsdiv_dsi_clk */ in dsi_fclk_rate()
801 r = dsi_get_pll_hsdiv_dsi_rate(dsi); in dsi_fclk_rate()
826 static int dsi_set_lp_clk_divisor(struct dsi_data *dsi) in dsi_set_lp_clk_divisor() argument
831 unsigned int lpdiv_max = dsi->data->max_pll_lpdiv; in dsi_set_lp_clk_divisor()
834 lp_clk_div = dsi->user_lp_cinfo.lp_clk_div; in dsi_set_lp_clk_divisor()
839 dsi_fclk = dsi_fclk_rate(dsi); in dsi_set_lp_clk_divisor()
844 dsi->current_lp_cinfo.lp_clk = lp_clk; in dsi_set_lp_clk_divisor()
845 dsi->current_lp_cinfo.lp_clk_div = lp_clk_div; in dsi_set_lp_clk_divisor()
848 REG_FLD_MOD(dsi, DSI_CLK_CTRL, lp_clk_div, 12, 0); in dsi_set_lp_clk_divisor()
851 REG_FLD_MOD(dsi, DSI_CLK_CTRL, dsi_fclk > 30000000 ? 1 : 0, 21, 21); in dsi_set_lp_clk_divisor()
856 static void dsi_enable_scp_clk(struct dsi_data *dsi) in dsi_enable_scp_clk() argument
858 if (dsi->scp_clk_refcount++ == 0) in dsi_enable_scp_clk()
859 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 1, 14, 14); /* CIO_CLK_ICG */ in dsi_enable_scp_clk()
862 static void dsi_disable_scp_clk(struct dsi_data *dsi) in dsi_disable_scp_clk() argument
864 WARN_ON(dsi->scp_clk_refcount == 0); in dsi_disable_scp_clk()
865 if (--dsi->scp_clk_refcount == 0) in dsi_disable_scp_clk()
866 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 14, 14); /* CIO_CLK_ICG */ in dsi_disable_scp_clk()
876 static int dsi_pll_power(struct dsi_data *dsi, enum dsi_pll_power_state state) in dsi_pll_power() argument
880 /* DSI-PLL power command 0x3 is not working */ in dsi_pll_power()
881 if ((dsi->data->quirks & DSI_QUIRK_PLL_PWR_BUG) && in dsi_pll_power()
886 REG_FLD_MOD(dsi, DSI_CLK_CTRL, state, 31, 30); in dsi_pll_power()
889 while (FLD_GET(dsi_read_reg(dsi, DSI_CLK_CTRL), 29, 28) != state) { in dsi_pll_power()
891 DSSERR("Failed to set DSI PLL power mode to %d\n", in dsi_pll_power()
902 static void dsi_pll_calc_dsi_fck(struct dsi_data *dsi, in dsi_pll_calc_dsi_fck() argument
907 max_dsi_fck = dsi->data->max_fck_freq; in dsi_pll_calc_dsi_fck()
915 struct dsi_data *dsi = container_of(pll, struct dsi_data, pll); in dsi_pll_enable() local
920 r = dsi_runtime_get(dsi); in dsi_pll_enable()
927 dsi_enable_scp_clk(dsi); in dsi_pll_enable()
929 r = regulator_enable(dsi->vdds_dsi_reg); in dsi_pll_enable()
934 dispc_pck_free_enable(dsi->dss->dispc, 1); in dsi_pll_enable()
936 if (!wait_for_bit_change(dsi, DSI_PLL_STATUS, 0, 1)) { in dsi_pll_enable()
939 dispc_pck_free_enable(dsi->dss->dispc, 0); in dsi_pll_enable()
945 dispc_pck_free_enable(dsi->dss->dispc, 0); in dsi_pll_enable()
947 r = dsi_pll_power(dsi, DSI_PLL_POWER_ON_ALL); in dsi_pll_enable()
956 regulator_disable(dsi->vdds_dsi_reg); in dsi_pll_enable()
958 dsi_disable_scp_clk(dsi); in dsi_pll_enable()
959 dsi_runtime_put(dsi); in dsi_pll_enable()
965 struct dsi_data *dsi = container_of(pll, struct dsi_data, pll); in dsi_pll_disable() local
967 dsi_pll_power(dsi, DSI_PLL_POWER_OFF); in dsi_pll_disable()
969 regulator_disable(dsi->vdds_dsi_reg); in dsi_pll_disable()
971 dsi_disable_scp_clk(dsi); in dsi_pll_disable()
972 dsi_runtime_put(dsi); in dsi_pll_disable()
979 struct dsi_data *dsi = s->private; in dsi_dump_dsi_clocks() local
980 struct dss_pll_clock_info *cinfo = &dsi->pll.cinfo; in dsi_dump_dsi_clocks()
982 int dsi_module = dsi->module_id; in dsi_dump_dsi_clocks()
983 struct dss_pll *pll = &dsi->pll; in dsi_dump_dsi_clocks()
985 dispc_clk_src = dss_get_dispc_clk_source(dsi->dss); in dsi_dump_dsi_clocks()
986 dsi_clk_src = dss_get_dsi_clk_source(dsi->dss, dsi_module); in dsi_dump_dsi_clocks()
988 if (dsi_runtime_get(dsi)) in dsi_dump_dsi_clocks()
991 seq_printf(s, "- DSI%d PLL -\n", dsi_module + 1); in dsi_dump_dsi_clocks()
993 seq_printf(s, "dsi pll clkin\t%lu\n", clk_get_rate(pll->clkin)); in dsi_dump_dsi_clocks()
1018 seq_printf(s, "- DSI%d -\n", dsi_module + 1); in dsi_dump_dsi_clocks()
1020 seq_printf(s, "dsi fclk source = %s\n", in dsi_dump_dsi_clocks()
1023 seq_printf(s, "DSI_FCLK\t%lu\n", dsi_fclk_rate(dsi)); in dsi_dump_dsi_clocks()
1028 seq_printf(s, "TxByteClkHS\t%lu\n", dsi_get_txbyteclkhs(dsi)); in dsi_dump_dsi_clocks()
1030 seq_printf(s, "LP_CLK\t\t%lu\n", dsi->current_lp_cinfo.lp_clk); in dsi_dump_dsi_clocks()
1032 dsi_runtime_put(dsi); in dsi_dump_dsi_clocks()
1040 struct dsi_data *dsi = s->private; in dsi_dump_dsi_irqs() local
1044 spin_lock_irqsave(&dsi->irq_stats_lock, flags); in dsi_dump_dsi_irqs()
1046 stats = dsi->irq_stats; in dsi_dump_dsi_irqs()
1047 memset(&dsi->irq_stats, 0, sizeof(dsi->irq_stats)); in dsi_dump_dsi_irqs()
1048 dsi->irq_stats.last_reset = jiffies; in dsi_dump_dsi_irqs()
1050 spin_unlock_irqrestore(&dsi->irq_stats_lock, flags); in dsi_dump_dsi_irqs()
1059 seq_printf(s, "-- DSI%d interrupts --\n", dsi->module_id + 1); in dsi_dump_dsi_irqs()
1131 struct dsi_data *dsi = s->private; in dsi_dump_dsi_regs() local
1133 if (dsi_runtime_get(dsi)) in dsi_dump_dsi_regs()
1135 dsi_enable_scp_clk(dsi); in dsi_dump_dsi_regs()
1137 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsi, r)) in dsi_dump_dsi_regs()
1209 dsi_disable_scp_clk(dsi); in dsi_dump_dsi_regs()
1210 dsi_runtime_put(dsi); in dsi_dump_dsi_regs()
1221 static int dsi_cio_power(struct dsi_data *dsi, enum dsi_cio_power_state state) in dsi_cio_power() argument
1226 REG_FLD_MOD(dsi, DSI_COMPLEXIO_CFG1, state, 28, 27); in dsi_cio_power()
1229 while (FLD_GET(dsi_read_reg(dsi, DSI_COMPLEXIO_CFG1), in dsi_cio_power()
1242 static unsigned int dsi_get_line_buf_size(struct dsi_data *dsi) in dsi_get_line_buf_size() argument
1250 if (!(dsi->data->quirks & DSI_QUIRK_GNQ)) in dsi_get_line_buf_size()
1253 val = REG_GET(dsi, DSI_GNQ, 14, 12); /* VP1_LINE_BUFFER_SIZE */ in dsi_get_line_buf_size()
1276 static int dsi_set_lane_config(struct dsi_data *dsi) in dsi_set_lane_config() argument
1289 r = dsi_read_reg(dsi, DSI_COMPLEXIO_CFG1); in dsi_set_lane_config()
1291 for (i = 0; i < dsi->num_lanes_used; ++i) { in dsi_set_lane_config()
1296 for (t = 0; t < dsi->num_lanes_supported; ++t) in dsi_set_lane_config()
1297 if (dsi->lanes[t].function == functions[i]) in dsi_set_lane_config()
1300 if (t == dsi->num_lanes_supported) in dsi_set_lane_config()
1304 polarity = dsi->lanes[t].polarity; in dsi_set_lane_config()
1311 for (; i < dsi->num_lanes_supported; ++i) { in dsi_set_lane_config()
1318 dsi_write_reg(dsi, DSI_COMPLEXIO_CFG1, r); in dsi_set_lane_config()
1323 static inline unsigned int ns2ddr(struct dsi_data *dsi, unsigned int ns) in ns2ddr() argument
1326 unsigned long ddr_clk = dsi->pll.cinfo.clkdco / 4; in ns2ddr()
1331 static inline unsigned int ddr2ns(struct dsi_data *dsi, unsigned int ddr) in ddr2ns() argument
1333 unsigned long ddr_clk = dsi->pll.cinfo.clkdco / 4; in ddr2ns()
1338 static void dsi_cio_timings(struct dsi_data *dsi) in dsi_cio_timings() argument
1350 ths_prepare = ns2ddr(dsi, 70) + 2; in dsi_cio_timings()
1353 ths_prepare_ths_zero = ns2ddr(dsi, 175) + 2; in dsi_cio_timings()
1356 ths_trail = ns2ddr(dsi, 60) + 5; in dsi_cio_timings()
1359 ths_exit = ns2ddr(dsi, 145); in dsi_cio_timings()
1362 tlpx_half = ns2ddr(dsi, 25); in dsi_cio_timings()
1365 tclk_trail = ns2ddr(dsi, 60) + 2; in dsi_cio_timings()
1368 tclk_prepare = ns2ddr(dsi, 65); in dsi_cio_timings()
1371 tclk_zero = ns2ddr(dsi, 260); in dsi_cio_timings()
1374 ths_prepare, ddr2ns(dsi, ths_prepare), in dsi_cio_timings()
1375 ths_prepare_ths_zero, ddr2ns(dsi, ths_prepare_ths_zero)); in dsi_cio_timings()
1377 ths_trail, ddr2ns(dsi, ths_trail), in dsi_cio_timings()
1378 ths_exit, ddr2ns(dsi, ths_exit)); in dsi_cio_timings()
1382 tlpx_half, ddr2ns(dsi, tlpx_half), in dsi_cio_timings()
1383 tclk_trail, ddr2ns(dsi, tclk_trail), in dsi_cio_timings()
1384 tclk_zero, ddr2ns(dsi, tclk_zero)); in dsi_cio_timings()
1386 tclk_prepare, ddr2ns(dsi, tclk_prepare)); in dsi_cio_timings()
1390 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG0); in dsi_cio_timings()
1395 dsi_write_reg(dsi, DSI_DSIPHY_CFG0, r); in dsi_cio_timings()
1397 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG1); in dsi_cio_timings()
1402 if (dsi->data->quirks & DSI_QUIRK_PHY_DCC) { in dsi_cio_timings()
1408 dsi_write_reg(dsi, DSI_DSIPHY_CFG1, r); in dsi_cio_timings()
1410 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG2); in dsi_cio_timings()
1412 dsi_write_reg(dsi, DSI_DSIPHY_CFG2, r); in dsi_cio_timings()
1415 static int dsi_cio_wait_tx_clk_esc_reset(struct dsi_data *dsi) in dsi_cio_wait_tx_clk_esc_reset() argument
1423 if (dsi->data->quirks & DSI_QUIRK_REVERSE_TXCLKESC) in dsi_cio_wait_tx_clk_esc_reset()
1428 for (i = 0; i < dsi->num_lanes_supported; ++i) in dsi_cio_wait_tx_clk_esc_reset()
1429 in_use[i] = dsi->lanes[i].function != DSI_LANE_UNUSED; in dsi_cio_wait_tx_clk_esc_reset()
1436 l = dsi_read_reg(dsi, DSI_DSIPHY_CFG5); in dsi_cio_wait_tx_clk_esc_reset()
1439 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_cio_wait_tx_clk_esc_reset()
1444 if (ok == dsi->num_lanes_supported) in dsi_cio_wait_tx_clk_esc_reset()
1448 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_cio_wait_tx_clk_esc_reset()
1463 static unsigned int dsi_get_lane_mask(struct dsi_data *dsi) in dsi_get_lane_mask() argument
1468 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_get_lane_mask()
1469 if (dsi->lanes[i].function != DSI_LANE_UNUSED) in dsi_get_lane_mask()
1488 static int dsi_omap4_mux_pads(struct dsi_data *dsi, unsigned int lanes) in dsi_omap4_mux_pads() argument
1493 if (dsi->module_id == 0) { in dsi_omap4_mux_pads()
1498 } else if (dsi->module_id == 1) { in dsi_omap4_mux_pads()
1507 return regmap_update_bits(dsi->syscon, OMAP4_DSIPHY_SYSCON_OFFSET, in dsi_omap4_mux_pads()
1520 static int dsi_omap5_mux_pads(struct dsi_data *dsi, unsigned int lanes) in dsi_omap5_mux_pads() argument
1524 if (dsi->module_id == 0) in dsi_omap5_mux_pads()
1526 else if (dsi->module_id == 1) in dsi_omap5_mux_pads()
1531 return regmap_update_bits(dsi->syscon, OMAP5_DSIPHY_SYSCON_OFFSET, in dsi_omap5_mux_pads()
1536 static int dsi_enable_pads(struct dsi_data *dsi, unsigned int lane_mask) in dsi_enable_pads() argument
1538 if (dsi->data->model == DSI_MODEL_OMAP4) in dsi_enable_pads()
1539 return dsi_omap4_mux_pads(dsi, lane_mask); in dsi_enable_pads()
1540 if (dsi->data->model == DSI_MODEL_OMAP5) in dsi_enable_pads()
1541 return dsi_omap5_mux_pads(dsi, lane_mask); in dsi_enable_pads()
1545 static void dsi_disable_pads(struct dsi_data *dsi) in dsi_disable_pads() argument
1547 if (dsi->data->model == DSI_MODEL_OMAP4) in dsi_disable_pads()
1548 dsi_omap4_mux_pads(dsi, 0); in dsi_disable_pads()
1549 else if (dsi->data->model == DSI_MODEL_OMAP5) in dsi_disable_pads()
1550 dsi_omap5_mux_pads(dsi, 0); in dsi_disable_pads()
1553 static int dsi_cio_init(struct dsi_data *dsi) in dsi_cio_init() argument
1558 DSSDBG("DSI CIO init starts"); in dsi_cio_init()
1560 r = dsi_enable_pads(dsi, dsi_get_lane_mask(dsi)); in dsi_cio_init()
1564 dsi_enable_scp_clk(dsi); in dsi_cio_init()
1567 * required after DSIPHY reset to complete the reset of the DSI complex in dsi_cio_init()
1569 dsi_read_reg(dsi, DSI_DSIPHY_CFG5); in dsi_cio_init()
1571 if (!wait_for_bit_change(dsi, DSI_DSIPHY_CFG5, 30, 1)) { in dsi_cio_init()
1577 r = dsi_set_lane_config(dsi); in dsi_cio_init()
1582 l = dsi_read_reg(dsi, DSI_TIMING1); in dsi_cio_init()
1587 dsi_write_reg(dsi, DSI_TIMING1, l); in dsi_cio_init()
1589 r = dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_ON); in dsi_cio_init()
1593 if (!wait_for_bit_change(dsi, DSI_COMPLEXIO_CFG1, 29, 1)) { in dsi_cio_init()
1599 dsi_if_enable(dsi, true); in dsi_cio_init()
1600 dsi_if_enable(dsi, false); in dsi_cio_init()
1601 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 1, 20, 20); /* LP_CLK_ENABLE */ in dsi_cio_init()
1603 r = dsi_cio_wait_tx_clk_esc_reset(dsi); in dsi_cio_init()
1608 REG_FLD_MOD(dsi, DSI_TIMING1, 0, 15, 15); in dsi_cio_init()
1610 dsi_cio_timings(dsi); in dsi_cio_init()
1613 REG_FLD_MOD(dsi, DSI_CLK_CTRL, in dsi_cio_init()
1614 !(dsi->dsidev->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS), in dsi_cio_init()
1622 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 20, 20); /* LP_CLK_ENABLE */ in dsi_cio_init()
1624 dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_OFF); in dsi_cio_init()
1627 dsi_disable_scp_clk(dsi); in dsi_cio_init()
1628 dsi_disable_pads(dsi); in dsi_cio_init()
1632 static void dsi_cio_uninit(struct dsi_data *dsi) in dsi_cio_uninit() argument
1635 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 13, 13); in dsi_cio_uninit()
1637 dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_OFF); in dsi_cio_uninit()
1638 dsi_disable_scp_clk(dsi); in dsi_cio_uninit()
1639 dsi_disable_pads(dsi); in dsi_cio_uninit()
1642 static void dsi_config_tx_fifo(struct dsi_data *dsi, in dsi_config_tx_fifo() argument
1650 dsi->vc[0].tx_fifo_size = size1; in dsi_config_tx_fifo()
1651 dsi->vc[1].tx_fifo_size = size2; in dsi_config_tx_fifo()
1652 dsi->vc[2].tx_fifo_size = size3; in dsi_config_tx_fifo()
1653 dsi->vc[3].tx_fifo_size = size4; in dsi_config_tx_fifo()
1657 int size = dsi->vc[i].tx_fifo_size; in dsi_config_tx_fifo()
1671 dsi_write_reg(dsi, DSI_TX_FIFO_VC_SIZE, r); in dsi_config_tx_fifo()
1674 static void dsi_config_rx_fifo(struct dsi_data *dsi, in dsi_config_rx_fifo() argument
1682 dsi->vc[0].rx_fifo_size = size1; in dsi_config_rx_fifo()
1683 dsi->vc[1].rx_fifo_size = size2; in dsi_config_rx_fifo()
1684 dsi->vc[2].rx_fifo_size = size3; in dsi_config_rx_fifo()
1685 dsi->vc[3].rx_fifo_size = size4; in dsi_config_rx_fifo()
1689 int size = dsi->vc[i].rx_fifo_size; in dsi_config_rx_fifo()
1703 dsi_write_reg(dsi, DSI_RX_FIFO_VC_SIZE, r); in dsi_config_rx_fifo()
1706 static int dsi_force_tx_stop_mode_io(struct dsi_data *dsi) in dsi_force_tx_stop_mode_io() argument
1710 r = dsi_read_reg(dsi, DSI_TIMING1); in dsi_force_tx_stop_mode_io()
1712 dsi_write_reg(dsi, DSI_TIMING1, r); in dsi_force_tx_stop_mode_io()
1714 if (!wait_for_bit_change(dsi, DSI_TIMING1, 15, 0)) { in dsi_force_tx_stop_mode_io()
1722 static bool dsi_vc_is_enabled(struct dsi_data *dsi, int vc) in dsi_vc_is_enabled() argument
1724 return REG_GET(dsi, DSI_VC_CTRL(vc), 0, 0); in dsi_vc_is_enabled()
1731 struct dsi_data *dsi = vp_data->dsi; in dsi_packet_sent_handler_vp() local
1732 const int vc = dsi->update_vc; in dsi_packet_sent_handler_vp()
1733 u8 bit = dsi->te_enabled ? 30 : 31; in dsi_packet_sent_handler_vp()
1735 if (REG_GET(dsi, DSI_VC_TE(vc), bit, bit) == 0) in dsi_packet_sent_handler_vp()
1739 static int dsi_sync_vc_vp(struct dsi_data *dsi, int vc) in dsi_sync_vc_vp() argument
1743 .dsi = dsi, in dsi_sync_vc_vp()
1749 bit = dsi->te_enabled ? 30 : 31; in dsi_sync_vc_vp()
1751 r = dsi_register_isr_vc(dsi, vc, dsi_packet_sent_handler_vp, in dsi_sync_vc_vp()
1757 if (REG_GET(dsi, DSI_VC_TE(vc), bit, bit)) { in dsi_sync_vc_vp()
1766 dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_vp, in dsi_sync_vc_vp()
1771 dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_vp, in dsi_sync_vc_vp()
1781 struct dsi_data *dsi = l4_data->dsi; in dsi_packet_sent_handler_l4() local
1782 const int vc = dsi->update_vc; in dsi_packet_sent_handler_l4()
1784 if (REG_GET(dsi, DSI_VC_CTRL(vc), 5, 5) == 0) in dsi_packet_sent_handler_l4()
1788 static int dsi_sync_vc_l4(struct dsi_data *dsi, int vc) in dsi_sync_vc_l4() argument
1792 .dsi = dsi, in dsi_sync_vc_l4()
1797 r = dsi_register_isr_vc(dsi, vc, dsi_packet_sent_handler_l4, in dsi_sync_vc_l4()
1803 if (REG_GET(dsi, DSI_VC_CTRL(vc), 5, 5)) { in dsi_sync_vc_l4()
1812 dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_l4, in dsi_sync_vc_l4()
1817 dsi_unregister_isr_vc(dsi, vc, dsi_packet_sent_handler_l4, in dsi_sync_vc_l4()
1823 static int dsi_sync_vc(struct dsi_data *dsi, int vc) in dsi_sync_vc() argument
1825 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_sync_vc()
1829 if (!dsi_vc_is_enabled(dsi, vc)) in dsi_sync_vc()
1832 switch (dsi->vc[vc].source) { in dsi_sync_vc()
1834 return dsi_sync_vc_vp(dsi, vc); in dsi_sync_vc()
1836 return dsi_sync_vc_l4(dsi, vc); in dsi_sync_vc()
1843 static int dsi_vc_enable(struct dsi_data *dsi, int vc, bool enable) in dsi_vc_enable() argument
1850 REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), enable, 0, 0); in dsi_vc_enable()
1852 if (!wait_for_bit_change(dsi, DSI_VC_CTRL(vc), 0, enable)) { in dsi_vc_enable()
1860 static void dsi_vc_initial_config(struct dsi_data *dsi, int vc) in dsi_vc_initial_config() argument
1866 r = dsi_read_reg(dsi, DSI_VC_CTRL(vc)); in dsi_vc_initial_config()
1879 if (dsi->data->quirks & DSI_QUIRK_VC_OCP_WIDTH) in dsi_vc_initial_config()
1885 dsi_write_reg(dsi, DSI_VC_CTRL(vc), r); in dsi_vc_initial_config()
1887 dsi->vc[vc].source = DSI_VC_SOURCE_L4; in dsi_vc_initial_config()
1893 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_enable_hs() local
1897 if (REG_GET(dsi, DSI_VC_CTRL(vc), 9, 9) == enable) in dsi_vc_enable_hs()
1900 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_enable_hs()
1902 dsi_vc_enable(dsi, vc, 0); in dsi_vc_enable_hs()
1903 dsi_if_enable(dsi, 0); in dsi_vc_enable_hs()
1905 REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), enable, 9, 9); in dsi_vc_enable_hs()
1907 dsi_vc_enable(dsi, vc, 1); in dsi_vc_enable_hs()
1908 dsi_if_enable(dsi, 1); in dsi_vc_enable_hs()
1910 dsi_force_tx_stop_mode_io(dsi); in dsi_vc_enable_hs()
1913 static void dsi_vc_flush_long_data(struct dsi_data *dsi, int vc) in dsi_vc_flush_long_data() argument
1915 while (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) { in dsi_vc_flush_long_data()
1917 val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc)); in dsi_vc_flush_long_data()
1963 static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int vc) in dsi_vc_flush_receive_data() argument
1966 while (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) { in dsi_vc_flush_receive_data()
1969 val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc)); in dsi_vc_flush_receive_data()
1984 dsi_vc_flush_long_data(dsi, vc); in dsi_vc_flush_receive_data()
1992 static int dsi_vc_send_bta(struct dsi_data *dsi, int vc) in dsi_vc_send_bta() argument
1994 if (dsi->debug_write || dsi->debug_read) in dsi_vc_send_bta()
1997 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_send_bta()
2000 if (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) { in dsi_vc_send_bta()
2002 dsi_vc_flush_receive_data(dsi, vc); in dsi_vc_send_bta()
2005 REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), 1, 6, 6); /* BTA_EN */ in dsi_vc_send_bta()
2008 dsi_read_reg(dsi, DSI_VC_CTRL(vc)); in dsi_vc_send_bta()
2015 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_send_bta_sync() local
2020 r = dsi_register_isr_vc(dsi, vc, dsi_completion_handler, in dsi_vc_send_bta_sync()
2025 r = dsi_register_isr(dsi, dsi_completion_handler, &completion, in dsi_vc_send_bta_sync()
2030 r = dsi_vc_send_bta(dsi, vc); in dsi_vc_send_bta_sync()
2041 err = dsi_get_errors(dsi); in dsi_vc_send_bta_sync()
2048 dsi_unregister_isr(dsi, dsi_completion_handler, &completion, in dsi_vc_send_bta_sync()
2051 dsi_unregister_isr_vc(dsi, vc, dsi_completion_handler, in dsi_vc_send_bta_sync()
2057 static inline void dsi_vc_write_long_header(struct dsi_data *dsi, int vc, in dsi_vc_write_long_header() argument
2064 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_write_long_header()
2071 dsi_write_reg(dsi, DSI_VC_LONG_PACKET_HEADER(vc), val); in dsi_vc_write_long_header()
2074 static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int vc, in dsi_vc_write_long_payload() argument
2084 dsi_write_reg(dsi, DSI_VC_LONG_PACKET_PAYLOAD(vc), val); in dsi_vc_write_long_payload()
2087 static int dsi_vc_send_long(struct dsi_data *dsi, int vc, in dsi_vc_send_long() argument
2096 if (dsi->debug_write) in dsi_vc_send_long()
2100 if (dsi->vc[vc].tx_fifo_size * 32 * 4 < msg->tx_len + 4) { in dsi_vc_send_long()
2105 dsi_vc_write_long_header(dsi, vc, msg->channel, msg->type, msg->tx_len, 0); in dsi_vc_send_long()
2109 if (dsi->debug_write) in dsi_vc_send_long()
2117 dsi_vc_write_long_payload(dsi, vc, b1, b2, b3, b4); in dsi_vc_send_long()
2124 if (dsi->debug_write) in dsi_vc_send_long()
2142 dsi_vc_write_long_payload(dsi, vc, b1, b2, b3, 0); in dsi_vc_send_long()
2148 static int dsi_vc_send_short(struct dsi_data *dsi, int vc, in dsi_vc_send_short() argument
2159 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_send_short()
2161 if (dsi->debug_write) in dsi_vc_send_short()
2165 if (FLD_GET(dsi_read_reg(dsi, DSI_VC_CTRL(vc)), 16, 16)) { in dsi_vc_send_short()
2173 dsi_write_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc), r); in dsi_vc_send_short()
2178 static int dsi_vc_send_null(struct dsi_data *dsi, int vc, int channel) in dsi_vc_send_null() argument
2185 return dsi_vc_send_long(dsi, vc, &msg); in dsi_vc_send_null()
2191 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_write_common() local
2195 r = dsi_vc_send_short(dsi, vc, msg); in dsi_vc_write_common()
2197 r = dsi_vc_send_long(dsi, vc, msg); in dsi_vc_write_common()
2216 if (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20)) { in dsi_vc_write_common()
2218 dsi_vc_flush_receive_data(dsi, vc); in dsi_vc_write_common()
2225 static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int vc, u8 *buf, in dsi_vc_read_rx_fifo() argument
2233 if (REG_GET(dsi, DSI_VC_CTRL(vc), 20, 20) == 0) { in dsi_vc_read_rx_fifo()
2239 val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(vc)); in dsi_vc_read_rx_fifo()
2240 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2253 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2270 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2289 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2302 val = dsi_read_reg(dsi, in dsi_vc_read_rx_fifo()
2304 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2336 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_dcs_read() local
2340 if (dsi->debug_read) in dsi_vc_dcs_read()
2343 r = dsi_vc_send_short(dsi, vc, msg); in dsi_vc_dcs_read()
2351 r = dsi_vc_read_rx_fifo(dsi, vc, msg->rx_buf, msg->rx_len, in dsi_vc_dcs_read()
2370 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_generic_read() local
2373 r = dsi_vc_send_short(dsi, vc, msg); in dsi_vc_generic_read()
2381 r = dsi_vc_read_rx_fifo(dsi, vc, msg->rx_buf, msg->rx_len, in dsi_vc_generic_read()
2397 static void dsi_set_lp_rx_timeout(struct dsi_data *dsi, unsigned int ticks, in dsi_set_lp_rx_timeout() argument
2407 fck = dsi_fclk_rate(dsi); in dsi_set_lp_rx_timeout()
2409 r = dsi_read_reg(dsi, DSI_TIMING2); in dsi_set_lp_rx_timeout()
2414 dsi_write_reg(dsi, DSI_TIMING2, r); in dsi_set_lp_rx_timeout()
2424 static void dsi_set_ta_timeout(struct dsi_data *dsi, unsigned int ticks, in dsi_set_ta_timeout() argument
2434 fck = dsi_fclk_rate(dsi); in dsi_set_ta_timeout()
2436 r = dsi_read_reg(dsi, DSI_TIMING1); in dsi_set_ta_timeout()
2441 dsi_write_reg(dsi, DSI_TIMING1, r); in dsi_set_ta_timeout()
2451 static void dsi_set_stop_state_counter(struct dsi_data *dsi, unsigned int ticks, in dsi_set_stop_state_counter() argument
2461 fck = dsi_fclk_rate(dsi); in dsi_set_stop_state_counter()
2463 r = dsi_read_reg(dsi, DSI_TIMING1); in dsi_set_stop_state_counter()
2468 dsi_write_reg(dsi, DSI_TIMING1, r); in dsi_set_stop_state_counter()
2478 static void dsi_set_hs_tx_timeout(struct dsi_data *dsi, unsigned int ticks, in dsi_set_hs_tx_timeout() argument
2488 fck = dsi_get_txbyteclkhs(dsi); in dsi_set_hs_tx_timeout()
2490 r = dsi_read_reg(dsi, DSI_TIMING2); in dsi_set_hs_tx_timeout()
2495 dsi_write_reg(dsi, DSI_TIMING2, r); in dsi_set_hs_tx_timeout()
2505 static void dsi_config_vp_num_line_buffers(struct dsi_data *dsi) in dsi_config_vp_num_line_buffers() argument
2509 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_config_vp_num_line_buffers()
2510 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt); in dsi_config_vp_num_line_buffers()
2511 const struct videomode *vm = &dsi->vm; in dsi_config_vp_num_line_buffers()
2516 if (dsi->line_buffer_size <= vm->hactive * bpp / 8) in dsi_config_vp_num_line_buffers()
2526 REG_FLD_MOD(dsi, DSI_CTRL, num_line_buffers, 13, 12); in dsi_config_vp_num_line_buffers()
2529 static void dsi_config_vp_sync_events(struct dsi_data *dsi) in dsi_config_vp_sync_events() argument
2534 if (dsi->vm_timings.trans_mode == OMAP_DSS_DSI_PULSE_MODE) in dsi_config_vp_sync_events()
2539 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_config_vp_sync_events()
2547 dsi_write_reg(dsi, DSI_CTRL, r); in dsi_config_vp_sync_events()
2550 static void dsi_config_blanking_modes(struct dsi_data *dsi) in dsi_config_blanking_modes() argument
2552 int blanking_mode = dsi->vm_timings.blanking_mode; in dsi_config_blanking_modes()
2553 int hfp_blanking_mode = dsi->vm_timings.hfp_blanking_mode; in dsi_config_blanking_modes()
2554 int hbp_blanking_mode = dsi->vm_timings.hbp_blanking_mode; in dsi_config_blanking_modes()
2555 int hsa_blanking_mode = dsi->vm_timings.hsa_blanking_mode; in dsi_config_blanking_modes()
2562 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_config_blanking_modes()
2567 dsi_write_reg(dsi, DSI_CTRL, r); in dsi_config_blanking_modes()
2632 static void dsi_config_cmd_mode_interleaving(struct dsi_data *dsi) in dsi_config_cmd_mode_interleaving() argument
2640 const struct videomode *vm = &dsi->vm; in dsi_config_cmd_mode_interleaving()
2641 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt); in dsi_config_cmd_mode_interleaving()
2642 int ndl = dsi->num_lanes_used - 1; in dsi_config_cmd_mode_interleaving()
2643 int dsi_fclk_hsdiv = dsi->user_dsi_cinfo.mX[HSDIV_DSI] + 1; in dsi_config_cmd_mode_interleaving()
2650 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_config_cmd_mode_interleaving()
2656 r = dsi_read_reg(dsi, DSI_VM_TIMING1); in dsi_config_cmd_mode_interleaving()
2661 r = dsi_read_reg(dsi, DSI_CLK_TIMING); in dsi_config_cmd_mode_interleaving()
2665 r = dsi_read_reg(dsi, DSI_VM_TIMING7); in dsi_config_cmd_mode_interleaving()
2669 r = dsi_read_reg(dsi, DSI_CLK_CTRL); in dsi_config_cmd_mode_interleaving()
2673 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG0); in dsi_config_cmd_mode_interleaving()
2676 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG1); in dsi_config_cmd_mode_interleaving()
2722 DSSDBG("DSI HS interleaving(TXBYTECLKHS) HSA %d, HFP %d, HBP %d, BLLP %d\n", in dsi_config_cmd_mode_interleaving()
2726 DSSDBG("DSI LP interleaving(bytes) HSA %d, HFP %d, HBP %d, BLLP %d\n", in dsi_config_cmd_mode_interleaving()
2730 r = dsi_read_reg(dsi, DSI_VM_TIMING4); in dsi_config_cmd_mode_interleaving()
2734 dsi_write_reg(dsi, DSI_VM_TIMING4, r); in dsi_config_cmd_mode_interleaving()
2736 r = dsi_read_reg(dsi, DSI_VM_TIMING5); in dsi_config_cmd_mode_interleaving()
2740 dsi_write_reg(dsi, DSI_VM_TIMING5, r); in dsi_config_cmd_mode_interleaving()
2742 r = dsi_read_reg(dsi, DSI_VM_TIMING6); in dsi_config_cmd_mode_interleaving()
2745 dsi_write_reg(dsi, DSI_VM_TIMING6, r); in dsi_config_cmd_mode_interleaving()
2748 static int dsi_proto_config(struct dsi_data *dsi) in dsi_proto_config() argument
2753 dsi_config_tx_fifo(dsi, DSI_FIFO_SIZE_32, in dsi_proto_config()
2758 dsi_config_rx_fifo(dsi, DSI_FIFO_SIZE_32, in dsi_proto_config()
2764 dsi_set_stop_state_counter(dsi, 0x1000, false, false); in dsi_proto_config()
2765 dsi_set_ta_timeout(dsi, 0x1fff, true, true); in dsi_proto_config()
2766 dsi_set_lp_rx_timeout(dsi, 0x1fff, true, true); in dsi_proto_config()
2767 dsi_set_hs_tx_timeout(dsi, 0x1fff, true, true); in dsi_proto_config()
2769 switch (mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt)) { in dsi_proto_config()
2784 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_proto_config()
2793 if (!(dsi->data->quirks & DSI_QUIRK_DCS_CMD_CONFIG_VC)) { in dsi_proto_config()
2799 dsi_write_reg(dsi, DSI_CTRL, r); in dsi_proto_config()
2801 dsi_config_vp_num_line_buffers(dsi); in dsi_proto_config()
2803 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_proto_config()
2804 dsi_config_vp_sync_events(dsi); in dsi_proto_config()
2805 dsi_config_blanking_modes(dsi); in dsi_proto_config()
2806 dsi_config_cmd_mode_interleaving(dsi); in dsi_proto_config()
2809 dsi_vc_initial_config(dsi, 0); in dsi_proto_config()
2810 dsi_vc_initial_config(dsi, 1); in dsi_proto_config()
2811 dsi_vc_initial_config(dsi, 2); in dsi_proto_config()
2812 dsi_vc_initial_config(dsi, 3); in dsi_proto_config()
2817 static void dsi_proto_timings(struct dsi_data *dsi) in dsi_proto_timings() argument
2826 int ndl = dsi->num_lanes_used - 1; in dsi_proto_timings()
2829 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG0); in dsi_proto_timings()
2836 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG1); in dsi_proto_timings()
2840 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG2); in dsi_proto_timings()
2846 tclk_post = ns2ddr(dsi, 60) + 26; in dsi_proto_timings()
2857 r = dsi_read_reg(dsi, DSI_CLK_TIMING); in dsi_proto_timings()
2860 dsi_write_reg(dsi, DSI_CLK_TIMING, r); in dsi_proto_timings()
2874 dsi_write_reg(dsi, DSI_VM_TIMING7, r); in dsi_proto_timings()
2879 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_proto_timings()
2881 int hsa = dsi->vm_timings.hsa; in dsi_proto_timings()
2882 int hfp = dsi->vm_timings.hfp; in dsi_proto_timings()
2883 int hbp = dsi->vm_timings.hbp; in dsi_proto_timings()
2884 int vsa = dsi->vm_timings.vsa; in dsi_proto_timings()
2885 int vfp = dsi->vm_timings.vfp; in dsi_proto_timings()
2886 int vbp = dsi->vm_timings.vbp; in dsi_proto_timings()
2887 int window_sync = dsi->vm_timings.window_sync; in dsi_proto_timings()
2889 const struct videomode *vm = &dsi->vm; in dsi_proto_timings()
2890 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt); in dsi_proto_timings()
2893 hsync_end = dsi->vm_timings.trans_mode == OMAP_DSS_DSI_PULSE_MODE; in dsi_proto_timings()
2908 r = dsi_read_reg(dsi, DSI_VM_TIMING1); in dsi_proto_timings()
2912 dsi_write_reg(dsi, DSI_VM_TIMING1, r); in dsi_proto_timings()
2914 r = dsi_read_reg(dsi, DSI_VM_TIMING2); in dsi_proto_timings()
2919 dsi_write_reg(dsi, DSI_VM_TIMING2, r); in dsi_proto_timings()
2921 r = dsi_read_reg(dsi, DSI_VM_TIMING3); in dsi_proto_timings()
2924 dsi_write_reg(dsi, DSI_VM_TIMING3, r); in dsi_proto_timings()
2928 static int dsi_configure_pins(struct dsi_data *dsi, in dsi_configure_pins() argument
2943 if (num_pins < 4 || num_pins > dsi->num_lanes_supported * 2 in dsi_configure_pins()
2959 if (dx >= dsi->num_lanes_supported * 2) in dsi_configure_pins()
2962 if (dy >= dsi->num_lanes_supported * 2) in dsi_configure_pins()
2982 memcpy(dsi->lanes, lanes, sizeof(dsi->lanes)); in dsi_configure_pins()
2983 dsi->num_lanes_used = num_lanes; in dsi_configure_pins()
2988 static int dsi_enable_video_mode(struct dsi_data *dsi, int vc) in dsi_enable_video_mode() argument
2990 int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt); in dsi_enable_video_mode()
2994 switch (dsi->pix_fmt) { in dsi_enable_video_mode()
3011 dsi_if_enable(dsi, false); in dsi_enable_video_mode()
3012 dsi_vc_enable(dsi, vc, false); in dsi_enable_video_mode()
3015 REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), 1, 4, 4); in dsi_enable_video_mode()
3017 word_count = DIV_ROUND_UP(dsi->vm.hactive * bpp, 8); in dsi_enable_video_mode()
3019 dsi_vc_write_long_header(dsi, vc, dsi->dsidev->channel, data_type, in dsi_enable_video_mode()
3022 dsi_vc_enable(dsi, vc, true); in dsi_enable_video_mode()
3023 dsi_if_enable(dsi, true); in dsi_enable_video_mode()
3028 static void dsi_disable_video_mode(struct dsi_data *dsi, int vc) in dsi_disable_video_mode() argument
3030 dsi_if_enable(dsi, false); in dsi_disable_video_mode()
3031 dsi_vc_enable(dsi, vc, false); in dsi_disable_video_mode()
3034 REG_FLD_MOD(dsi, DSI_VC_CTRL(vc), 0, 4, 4); in dsi_disable_video_mode()
3036 dsi_vc_enable(dsi, vc, true); in dsi_disable_video_mode()
3037 dsi_if_enable(dsi, true); in dsi_disable_video_mode()
3042 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_enable_video_output() local
3045 r = dsi_init_dispc(dsi); in dsi_enable_video_output()
3047 dev_err(dsi->dev, "failed to init dispc!\n"); in dsi_enable_video_output()
3051 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_enable_video_output()
3052 r = dsi_enable_video_mode(dsi, vc); in dsi_enable_video_output()
3057 r = dss_mgr_enable(&dsi->output); in dsi_enable_video_output()
3064 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_enable_video_output()
3065 dsi_if_enable(dsi, false); in dsi_enable_video_output()
3066 dsi_vc_enable(dsi, vc, false); in dsi_enable_video_output()
3069 dsi_uninit_dispc(dsi); in dsi_enable_video_output()
3070 dev_err(dsi->dev, "failed to enable DSI encoder!\n"); in dsi_enable_video_output()
3076 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_disable_video_output() local
3078 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) in dsi_disable_video_output()
3079 dsi_disable_video_mode(dsi, vc); in dsi_disable_video_output()
3081 dss_mgr_disable(&dsi->output); in dsi_disable_video_output()
3083 dsi_uninit_dispc(dsi); in dsi_disable_video_output()
3086 static void dsi_update_screen_dispc(struct dsi_data *dsi) in dsi_update_screen_dispc() argument
3096 const unsigned vc = dsi->update_vc; in dsi_update_screen_dispc()
3097 const unsigned int line_buf_size = dsi->line_buffer_size; in dsi_update_screen_dispc()
3098 u16 w = dsi->vm.hactive; in dsi_update_screen_dispc()
3099 u16 h = dsi->vm.vactive; in dsi_update_screen_dispc()
3103 bytespp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt) / 8; in dsi_update_screen_dispc()
3122 dsi_write_reg(dsi, DSI_VC_TE(vc), l); in dsi_update_screen_dispc()
3124 dsi_vc_write_long_header(dsi, vc, dsi->dsidev->channel, MIPI_DSI_DCS_LONG_WRITE, in dsi_update_screen_dispc()
3127 if (dsi->te_enabled) in dsi_update_screen_dispc()
3131 dsi_write_reg(dsi, DSI_VC_TE(vc), l); in dsi_update_screen_dispc()
3139 dispc_disable_sidle(dsi->dss->dispc); in dsi_update_screen_dispc()
3141 dsi_perf_mark_start(dsi); in dsi_update_screen_dispc()
3143 r = schedule_delayed_work(&dsi->framedone_timeout_work, in dsi_update_screen_dispc()
3147 dss_mgr_start_update(&dsi->output); in dsi_update_screen_dispc()
3149 if (dsi->te_enabled) { in dsi_update_screen_dispc()
3152 REG_FLD_MOD(dsi, DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */ in dsi_update_screen_dispc()
3154 dsi_vc_send_bta(dsi, vc); in dsi_update_screen_dispc()
3157 mod_timer(&dsi->te_timer, jiffies + msecs_to_jiffies(250)); in dsi_update_screen_dispc()
3169 static void dsi_handle_framedone(struct dsi_data *dsi, int error) in dsi_handle_framedone() argument
3172 dispc_enable_sidle(dsi->dss->dispc); in dsi_handle_framedone()
3174 if (dsi->te_enabled) { in dsi_handle_framedone()
3176 REG_FLD_MOD(dsi, DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */ in dsi_handle_framedone()
3179 dsi_bus_unlock(dsi); in dsi_handle_framedone()
3182 dsi_perf_show(dsi, "DISPC"); in dsi_handle_framedone()
3187 struct dsi_data *dsi = container_of(work, struct dsi_data, in dsi_framedone_timeout_work_callback() local
3194 * DSI */ in dsi_framedone_timeout_work_callback()
3198 dsi_handle_framedone(dsi, -ETIMEDOUT); in dsi_framedone_timeout_work_callback()
3203 struct dsi_data *dsi = data; in dsi_framedone_irq_callback() local
3206 * turns itself off. However, DSI still has the pixels in its buffers, in dsi_framedone_irq_callback()
3210 cancel_delayed_work(&dsi->framedone_timeout_work); in dsi_framedone_irq_callback()
3214 dsi_handle_framedone(dsi, 0); in dsi_framedone_irq_callback()
3217 static int _dsi_update(struct dsi_data *dsi) in _dsi_update() argument
3219 dsi_perf_mark_setup(dsi); in _dsi_update()
3222 dsi->update_bytes = dsi->vm.hactive * dsi->vm.vactive * in _dsi_update()
3223 mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt) / 8; in _dsi_update()
3225 dsi_update_screen_dispc(dsi); in _dsi_update()
3230 static int _dsi_send_nop(struct dsi_data *dsi, int vc, int channel) in _dsi_send_nop() argument
3240 WARN_ON(!dsi_bus_is_locked(dsi)); in _dsi_send_nop()
3242 return _omap_dsi_host_transfer(dsi, vc, &msg); in _dsi_send_nop()
3247 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_update_channel() local
3250 dsi_bus_lock(dsi); in dsi_update_channel()
3252 if (!dsi->video_enabled) { in dsi_update_channel()
3257 if (dsi->vm.hactive == 0 || dsi->vm.vactive == 0) { in dsi_update_channel()
3266 * updates stop working. This is probably related to DSI spec stating in dsi_update_channel()
3267 * that the DSI host should transition to LP at least once per frame. in dsi_update_channel()
3269 r = _dsi_send_nop(dsi, VC_CMD, dsi->dsidev->channel); in dsi_update_channel()
3275 dsi->update_vc = vc; in dsi_update_channel()
3277 if (dsi->te_enabled && dsi->te_gpio) { in dsi_update_channel()
3278 schedule_delayed_work(&dsi->te_timeout_work, in dsi_update_channel()
3280 atomic_set(&dsi->do_ext_te_update, 1); in dsi_update_channel()
3282 _dsi_update(dsi); in dsi_update_channel()
3288 dsi_bus_unlock(dsi); in dsi_update_channel()
3299 static int dsi_configure_dispc_clocks(struct dsi_data *dsi) in dsi_configure_dispc_clocks() argument
3305 fck = dsi_get_pll_hsdiv_dispc_rate(dsi); in dsi_configure_dispc_clocks()
3307 dispc_cinfo.lck_div = dsi->user_dispc_cinfo.lck_div; in dsi_configure_dispc_clocks()
3308 dispc_cinfo.pck_div = dsi->user_dispc_cinfo.pck_div; in dsi_configure_dispc_clocks()
3310 r = dispc_calc_clock_rates(dsi->dss->dispc, fck, &dispc_cinfo); in dsi_configure_dispc_clocks()
3316 dsi->mgr_config.clock_info = dispc_cinfo; in dsi_configure_dispc_clocks()
3321 static int dsi_init_dispc(struct dsi_data *dsi) in dsi_init_dispc() argument
3323 enum omap_channel dispc_channel = dsi->output.dispc_channel; in dsi_init_dispc()
3326 dss_select_lcd_clk_source(dsi->dss, dispc_channel, dsi->module_id == 0 ? in dsi_init_dispc()
3330 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) { in dsi_init_dispc()
3331 r = dss_mgr_register_framedone_handler(&dsi->output, in dsi_init_dispc()
3332 dsi_framedone_irq_callback, dsi); in dsi_init_dispc()
3338 dsi->mgr_config.stallmode = true; in dsi_init_dispc()
3339 dsi->mgr_config.fifohandcheck = true; in dsi_init_dispc()
3341 dsi->mgr_config.stallmode = false; in dsi_init_dispc()
3342 dsi->mgr_config.fifohandcheck = false; in dsi_init_dispc()
3345 r = dsi_configure_dispc_clocks(dsi); in dsi_init_dispc()
3349 dsi->mgr_config.io_pad_mode = DSS_IO_PAD_MODE_BYPASS; in dsi_init_dispc()
3350 dsi->mgr_config.video_port_width = in dsi_init_dispc()
3351 mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt); in dsi_init_dispc()
3352 dsi->mgr_config.lcden_sig_polarity = 0; in dsi_init_dispc()
3354 dss_mgr_set_lcd_config(&dsi->output, &dsi->mgr_config); in dsi_init_dispc()
3358 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) in dsi_init_dispc()
3359 dss_mgr_unregister_framedone_handler(&dsi->output, in dsi_init_dispc()
3360 dsi_framedone_irq_callback, dsi); in dsi_init_dispc()
3362 dss_select_lcd_clk_source(dsi->dss, dispc_channel, DSS_CLK_SRC_FCK); in dsi_init_dispc()
3366 static void dsi_uninit_dispc(struct dsi_data *dsi) in dsi_uninit_dispc() argument
3368 enum omap_channel dispc_channel = dsi->output.dispc_channel; in dsi_uninit_dispc()
3370 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) in dsi_uninit_dispc()
3371 dss_mgr_unregister_framedone_handler(&dsi->output, in dsi_uninit_dispc()
3372 dsi_framedone_irq_callback, dsi); in dsi_uninit_dispc()
3374 dss_select_lcd_clk_source(dsi->dss, dispc_channel, DSS_CLK_SRC_FCK); in dsi_uninit_dispc()
3377 static int dsi_configure_dsi_clocks(struct dsi_data *dsi) in dsi_configure_dsi_clocks() argument
3382 cinfo = dsi->user_dsi_cinfo; in dsi_configure_dsi_clocks()
3384 r = dss_pll_set_config(&dsi->pll, &cinfo); in dsi_configure_dsi_clocks()
3386 DSSERR("Failed to set dsi clocks\n"); in dsi_configure_dsi_clocks()
3393 static void dsi_setup_dsi_vcs(struct dsi_data *dsi) in dsi_setup_dsi_vcs() argument
3396 REG_FLD_MOD(dsi, DSI_VC_CTRL(VC_CMD), 0, 9, 9); /* LP */ in dsi_setup_dsi_vcs()
3398 REG_FLD_MOD(dsi, DSI_VC_CTRL(VC_CMD), 0, 1, 1); /* SOURCE_L4 */ in dsi_setup_dsi_vcs()
3399 dsi->vc[VC_CMD].source = DSI_VC_SOURCE_L4; in dsi_setup_dsi_vcs()
3402 REG_FLD_MOD(dsi, DSI_VC_CTRL(VC_VIDEO), 1, 9, 9); /* HS */ in dsi_setup_dsi_vcs()
3404 REG_FLD_MOD(dsi, DSI_VC_CTRL(VC_VIDEO), 1, 1, 1); /* SOURCE_VP */ in dsi_setup_dsi_vcs()
3405 dsi->vc[VC_VIDEO].source = DSI_VC_SOURCE_VP; in dsi_setup_dsi_vcs()
3407 if ((dsi->data->quirks & DSI_QUIRK_DCS_CMD_CONFIG_VC) && in dsi_setup_dsi_vcs()
3408 !(dsi->dsidev->mode_flags & MIPI_DSI_MODE_VIDEO)) in dsi_setup_dsi_vcs()
3409 REG_FLD_MOD(dsi, DSI_VC_CTRL(VC_VIDEO), 1, 30, 30); /* DCS_CMD_ENABLE */ in dsi_setup_dsi_vcs()
3411 dsi_vc_enable(dsi, VC_CMD, 1); in dsi_setup_dsi_vcs()
3412 dsi_vc_enable(dsi, VC_VIDEO, 1); in dsi_setup_dsi_vcs()
3414 dsi_if_enable(dsi, 1); in dsi_setup_dsi_vcs()
3416 dsi_force_tx_stop_mode_io(dsi); in dsi_setup_dsi_vcs()
3419 if (!(dsi->dsidev->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)) in dsi_setup_dsi_vcs()
3420 dsi_vc_send_null(dsi, VC_CMD, dsi->dsidev->channel); in dsi_setup_dsi_vcs()
3423 static int dsi_init_dsi(struct dsi_data *dsi) in dsi_init_dsi() argument
3427 r = dss_pll_enable(&dsi->pll); in dsi_init_dsi()
3431 r = dsi_configure_dsi_clocks(dsi); in dsi_init_dsi()
3435 dss_select_dsi_clk_source(dsi->dss, dsi->module_id, in dsi_init_dsi()
3436 dsi->module_id == 0 ? in dsi_init_dsi()
3441 if (!dsi->vdds_dsi_enabled) { in dsi_init_dsi()
3442 r = regulator_enable(dsi->vdds_dsi_reg); in dsi_init_dsi()
3446 dsi->vdds_dsi_enabled = true; in dsi_init_dsi()
3449 r = dsi_cio_init(dsi); in dsi_init_dsi()
3453 _dsi_print_reset_status(dsi); in dsi_init_dsi()
3455 dsi_proto_timings(dsi); in dsi_init_dsi()
3456 dsi_set_lp_clk_divisor(dsi); in dsi_init_dsi()
3459 _dsi_print_reset_status(dsi); in dsi_init_dsi()
3461 r = dsi_proto_config(dsi); in dsi_init_dsi()
3465 dsi_setup_dsi_vcs(dsi); in dsi_init_dsi()
3469 dsi_cio_uninit(dsi); in dsi_init_dsi()
3471 regulator_disable(dsi->vdds_dsi_reg); in dsi_init_dsi()
3472 dsi->vdds_dsi_enabled = false; in dsi_init_dsi()
3474 dss_select_dsi_clk_source(dsi->dss, dsi->module_id, DSS_CLK_SRC_FCK); in dsi_init_dsi()
3476 dss_pll_disable(&dsi->pll); in dsi_init_dsi()
3481 static void dsi_uninit_dsi(struct dsi_data *dsi) in dsi_uninit_dsi() argument
3484 dsi_if_enable(dsi, 0); in dsi_uninit_dsi()
3485 dsi_vc_enable(dsi, 0, 0); in dsi_uninit_dsi()
3486 dsi_vc_enable(dsi, 1, 0); in dsi_uninit_dsi()
3487 dsi_vc_enable(dsi, 2, 0); in dsi_uninit_dsi()
3488 dsi_vc_enable(dsi, 3, 0); in dsi_uninit_dsi()
3490 dss_select_dsi_clk_source(dsi->dss, dsi->module_id, DSS_CLK_SRC_FCK); in dsi_uninit_dsi()
3491 dsi_cio_uninit(dsi); in dsi_uninit_dsi()
3492 dss_pll_disable(&dsi->pll); in dsi_uninit_dsi()
3494 regulator_disable(dsi->vdds_dsi_reg); in dsi_uninit_dsi()
3495 dsi->vdds_dsi_enabled = false; in dsi_uninit_dsi()
3498 static void dsi_enable(struct dsi_data *dsi) in dsi_enable() argument
3502 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_enable()
3504 if (WARN_ON(dsi->iface_enabled)) in dsi_enable()
3507 mutex_lock(&dsi->lock); in dsi_enable()
3509 r = dsi_runtime_get(dsi); in dsi_enable()
3513 _dsi_initialize_irq(dsi); in dsi_enable()
3515 r = dsi_init_dsi(dsi); in dsi_enable()
3519 dsi->iface_enabled = true; in dsi_enable()
3521 mutex_unlock(&dsi->lock); in dsi_enable()
3526 dsi_runtime_put(dsi); in dsi_enable()
3528 mutex_unlock(&dsi->lock); in dsi_enable()
3532 static void dsi_disable(struct dsi_data *dsi) in dsi_disable() argument
3534 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_disable()
3536 if (WARN_ON(!dsi->iface_enabled)) in dsi_disable()
3539 mutex_lock(&dsi->lock); in dsi_disable()
3541 dsi_sync_vc(dsi, 0); in dsi_disable()
3542 dsi_sync_vc(dsi, 1); in dsi_disable()
3543 dsi_sync_vc(dsi, 2); in dsi_disable()
3544 dsi_sync_vc(dsi, 3); in dsi_disable()
3546 dsi_uninit_dsi(dsi); in dsi_disable()
3548 dsi_runtime_put(dsi); in dsi_disable()
3550 dsi->iface_enabled = false; in dsi_disable()
3552 mutex_unlock(&dsi->lock); in dsi_disable()
3555 static int dsi_enable_te(struct dsi_data *dsi, bool enable) in dsi_enable_te() argument
3557 dsi->te_enabled = enable; in dsi_enable_te()
3559 if (dsi->te_gpio) { in dsi_enable_te()
3561 enable_irq(dsi->te_irq); in dsi_enable_te()
3563 disable_irq(dsi->te_irq); in dsi_enable_te()
3684 return dispc_div_calc(ctx->dsi->dss->dispc, dispc, in dsi_cm_calc_hsdiv_cb()
3693 struct dsi_data *dsi = ctx->dsi; in dsi_cm_calc_pll_cb() local
3701 dsi->data->max_fck_freq, in dsi_cm_calc_pll_cb()
3705 static bool dsi_cm_calc(struct dsi_data *dsi, in dsi_cm_calc() argument
3714 clkin = clk_get_rate(dsi->pll.clkin); in dsi_cm_calc()
3716 ndl = dsi->num_lanes_used - 1; in dsi_cm_calc()
3729 ctx->dsi = dsi; in dsi_cm_calc()
3730 ctx->pll = &dsi->pll; in dsi_cm_calc()
3746 struct dsi_data *dsi = ctx->dsi; in dsi_vm_calc_blanking() local
3749 int ndl = dsi->num_lanes_used - 1; in dsi_vm_calc_blanking()
3783 * When there are no line buffers, DISPC and DSI must have the in dsi_vm_calc_blanking()
3784 * same tput. Otherwise DISPC tput needs to be higher than DSI's. in dsi_vm_calc_blanking()
3786 if (dsi->line_buffer_size < xres * bitspp / 8) { in dsi_vm_calc_blanking()
3794 /* DSI tput must be over the min requirement */ in dsi_vm_calc_blanking()
3798 /* When non-burst mode, DSI tput must be below max requirement. */ in dsi_vm_calc_blanking()
3815 /* DSI htot to match the panel's nominal pck */ in dsi_vm_calc_blanking()
3822 /* total DSI blanking needed to achieve panel's TL */ in dsi_vm_calc_blanking()
3825 /* DISPC htot to match the DSI TL */ in dsi_vm_calc_blanking()
3828 /* verify that the DSI and DISPC TLs are the same */ in dsi_vm_calc_blanking()
3834 /* setup DSI videomode */ in dsi_vm_calc_blanking()
3957 print_dsi_vm("dsi ", &ctx->dsi_vm); in dsi_vm_calc_dispc_cb()
3984 return dispc_div_calc(ctx->dsi->dss->dispc, dispc, in dsi_vm_calc_hsdiv_cb()
3993 struct dsi_data *dsi = ctx->dsi; in dsi_vm_calc_pll_cb() local
4001 dsi->data->max_fck_freq, in dsi_vm_calc_pll_cb()
4005 static bool dsi_vm_calc(struct dsi_data *dsi, in dsi_vm_calc() argument
4013 int ndl = dsi->num_lanes_used - 1; in dsi_vm_calc()
4017 clkin = clk_get_rate(dsi->pll.clkin); in dsi_vm_calc()
4020 ctx->dsi = dsi; in dsi_vm_calc()
4021 ctx->pll = &dsi->pll; in dsi_vm_calc()
4049 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_is_video_mode() local
4051 return dsi->mode == OMAP_DSS_DSI_VIDEO_MODE; in dsi_is_video_mode()
4054 static int __dsi_calc_config(struct dsi_data *dsi, in __dsi_calc_config() argument
4058 struct omap_dss_dsi_config cfg = dsi->config; in __dsi_calc_config()
4066 cfg.mode = dsi->mode; in __dsi_calc_config()
4067 cfg.pixel_format = dsi->pix_fmt; in __dsi_calc_config()
4069 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) in __dsi_calc_config()
4070 ok = dsi_vm_calc(dsi, &cfg, ctx); in __dsi_calc_config()
4072 ok = dsi_cm_calc(dsi, &cfg, ctx); in __dsi_calc_config()
4077 dsi_pll_calc_dsi_fck(dsi, &ctx->dsi_cinfo); in __dsi_calc_config()
4090 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_set_config() local
4094 mutex_lock(&dsi->lock); in dsi_set_config()
4096 r = __dsi_calc_config(dsi, mode, &ctx); in dsi_set_config()
4098 DSSERR("failed to find suitable DSI clock settings\n"); in dsi_set_config()
4102 dsi->user_lp_cinfo = ctx.lp_cinfo; in dsi_set_config()
4103 dsi->user_dsi_cinfo = ctx.dsi_cinfo; in dsi_set_config()
4104 dsi->user_dispc_cinfo = ctx.dispc_cinfo; in dsi_set_config()
4106 dsi->vm = ctx.vm; in dsi_set_config()
4112 dsi->vm.flags &= ~DISPLAY_FLAGS_INTERLACED; in dsi_set_config()
4113 dsi->vm.flags &= ~DISPLAY_FLAGS_HSYNC_LOW; in dsi_set_config()
4114 dsi->vm.flags |= DISPLAY_FLAGS_HSYNC_HIGH; in dsi_set_config()
4115 dsi->vm.flags &= ~DISPLAY_FLAGS_VSYNC_LOW; in dsi_set_config()
4116 dsi->vm.flags |= DISPLAY_FLAGS_VSYNC_HIGH; in dsi_set_config()
4119 * flags, but this will only be possible when the DSI encoder will be in dsi_set_config()
4122 dsi->vm.flags &= ~DISPLAY_FLAGS_PIXDATA_NEGEDGE; in dsi_set_config()
4123 dsi->vm.flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; in dsi_set_config()
4124 dsi->vm.flags &= ~DISPLAY_FLAGS_DE_LOW; in dsi_set_config()
4125 dsi->vm.flags |= DISPLAY_FLAGS_DE_HIGH; in dsi_set_config()
4126 dsi->vm.flags &= ~DISPLAY_FLAGS_SYNC_POSEDGE; in dsi_set_config()
4127 dsi->vm.flags |= DISPLAY_FLAGS_SYNC_NEGEDGE; in dsi_set_config()
4129 dss_mgr_set_timings(&dsi->output, &dsi->vm); in dsi_set_config()
4131 dsi->vm_timings = ctx.dsi_vm; in dsi_set_config()
4133 mutex_unlock(&dsi->lock); in dsi_set_config()
4137 mutex_unlock(&dsi->lock); in dsi_set_config()
4143 * Return a hardcoded dispc channel for the DSI output. This should work for
4148 static enum omap_channel dsi_get_dispc_channel(struct dsi_data *dsi) in dsi_get_dispc_channel() argument
4150 switch (dsi->data->model) { in dsi_get_dispc_channel()
4155 switch (dsi->module_id) { in dsi_get_dispc_channel()
4166 switch (dsi->module_id) { in dsi_get_dispc_channel()
4182 static ssize_t _omap_dsi_host_transfer(struct dsi_data *dsi, int vc, in _omap_dsi_host_transfer() argument
4185 struct omap_dss_device *dssdev = &dsi->output; in _omap_dsi_host_transfer()
4223 dsi_enable_te(dsi, false); in _omap_dsi_host_transfer()
4225 dsi_enable_te(dsi, true); in _omap_dsi_host_transfer()
4234 struct dsi_data *dsi = host_to_omap(host); in omap_dsi_host_transfer() local
4238 dsi_bus_lock(dsi); in omap_dsi_host_transfer()
4240 if (!dsi->iface_enabled) { in omap_dsi_host_transfer()
4241 dsi_enable(dsi); in omap_dsi_host_transfer()
4242 schedule_delayed_work(&dsi->dsi_disable_work, msecs_to_jiffies(2000)); in omap_dsi_host_transfer()
4245 r = _omap_dsi_host_transfer(dsi, vc, msg); in omap_dsi_host_transfer()
4247 dsi_bus_unlock(dsi); in omap_dsi_host_transfer()
4252 static int dsi_get_clocks(struct dsi_data *dsi) in dsi_get_clocks() argument
4256 clk = devm_clk_get(dsi->dev, "fck"); in dsi_get_clocks()
4262 dsi->dss_clk = clk; in dsi_get_clocks()
4274 struct dsi_data *dsi = (struct dsi_data *)dev_id; in omap_dsi_te_irq_handler() local
4277 old = atomic_cmpxchg(&dsi->do_ext_te_update, 1, 0); in omap_dsi_te_irq_handler()
4279 cancel_delayed_work(&dsi->te_timeout_work); in omap_dsi_te_irq_handler()
4280 _dsi_update(dsi); in omap_dsi_te_irq_handler()
4288 struct dsi_data *dsi = in omap_dsi_te_timeout_work_callback() local
4292 old = atomic_cmpxchg(&dsi->do_ext_te_update, 1, 0); in omap_dsi_te_timeout_work_callback()
4294 dev_err(dsi->dev, "TE not received for 250ms!\n"); in omap_dsi_te_timeout_work_callback()
4295 _dsi_update(dsi); in omap_dsi_te_timeout_work_callback()
4299 static int omap_dsi_register_te_irq(struct dsi_data *dsi, in omap_dsi_register_te_irq() argument
4305 dsi->te_gpio = gpiod_get(&client->dev, "te-gpios", GPIOD_IN); in omap_dsi_register_te_irq()
4306 if (IS_ERR(dsi->te_gpio)) { in omap_dsi_register_te_irq()
4307 err = PTR_ERR(dsi->te_gpio); in omap_dsi_register_te_irq()
4310 dsi->te_gpio = NULL; in omap_dsi_register_te_irq()
4314 dev_err(dsi->dev, "Could not get TE gpio: %d\n", err); in omap_dsi_register_te_irq()
4318 te_irq = gpiod_to_irq(dsi->te_gpio); in omap_dsi_register_te_irq()
4320 gpiod_put(dsi->te_gpio); in omap_dsi_register_te_irq()
4321 dsi->te_gpio = NULL; in omap_dsi_register_te_irq()
4325 dsi->te_irq = te_irq; in omap_dsi_register_te_irq()
4331 "TE", dsi); in omap_dsi_register_te_irq()
4333 dev_err(dsi->dev, "request irq failed with %d\n", err); in omap_dsi_register_te_irq()
4334 gpiod_put(dsi->te_gpio); in omap_dsi_register_te_irq()
4335 dsi->te_gpio = NULL; in omap_dsi_register_te_irq()
4339 INIT_DEFERRABLE_WORK(&dsi->te_timeout_work, in omap_dsi_register_te_irq()
4342 dev_dbg(dsi->dev, "Using GPIO TE\n"); in omap_dsi_register_te_irq()
4347 static void omap_dsi_unregister_te_irq(struct dsi_data *dsi) in omap_dsi_unregister_te_irq() argument
4349 if (dsi->te_gpio) { in omap_dsi_unregister_te_irq()
4350 free_irq(dsi->te_irq, dsi); in omap_dsi_unregister_te_irq()
4351 cancel_delayed_work(&dsi->te_timeout_work); in omap_dsi_unregister_te_irq()
4352 gpiod_put(dsi->te_gpio); in omap_dsi_unregister_te_irq()
4353 dsi->te_gpio = NULL; in omap_dsi_unregister_te_irq()
4360 struct dsi_data *dsi = host_to_omap(host); in omap_dsi_host_attach() local
4363 if (dsi->dsidev) { in omap_dsi_host_attach()
4364 DSSERR("dsi client already attached\n"); in omap_dsi_host_attach()
4373 atomic_set(&dsi->do_ext_te_update, 0); in omap_dsi_host_attach()
4376 dsi->mode = OMAP_DSS_DSI_VIDEO_MODE; in omap_dsi_host_attach()
4378 r = omap_dsi_register_te_irq(dsi, client); in omap_dsi_host_attach()
4382 dsi->mode = OMAP_DSS_DSI_CMD_MODE; in omap_dsi_host_attach()
4385 dsi->dsidev = client; in omap_dsi_host_attach()
4386 dsi->pix_fmt = client->format; in omap_dsi_host_attach()
4388 dsi->config.hs_clk_min = 150000000; // TODO: get from client? in omap_dsi_host_attach()
4389 dsi->config.hs_clk_max = client->hs_rate; in omap_dsi_host_attach()
4390 dsi->config.lp_clk_min = 7000000; // TODO: get from client? in omap_dsi_host_attach()
4391 dsi->config.lp_clk_max = client->lp_rate; in omap_dsi_host_attach()
4394 dsi->config.trans_mode = OMAP_DSS_DSI_BURST_MODE; in omap_dsi_host_attach()
4396 dsi->config.trans_mode = OMAP_DSS_DSI_PULSE_MODE; in omap_dsi_host_attach()
4398 dsi->config.trans_mode = OMAP_DSS_DSI_EVENT_MODE; in omap_dsi_host_attach()
4406 struct dsi_data *dsi = host_to_omap(host); in omap_dsi_host_detach() local
4408 if (WARN_ON(dsi->dsidev != client)) in omap_dsi_host_detach()
4411 cancel_delayed_work_sync(&dsi->dsi_disable_work); in omap_dsi_host_detach()
4413 dsi_bus_lock(dsi); in omap_dsi_host_detach()
4415 if (dsi->iface_enabled) in omap_dsi_host_detach()
4416 dsi_disable(dsi); in omap_dsi_host_detach()
4418 dsi_bus_unlock(dsi); in omap_dsi_host_detach()
4420 omap_dsi_unregister_te_irq(dsi); in omap_dsi_host_detach()
4421 dsi->dsidev = NULL; in omap_dsi_host_detach()
4522 static int dsi_init_pll_data(struct dss_device *dss, struct dsi_data *dsi) in dsi_init_pll_data() argument
4524 struct dss_pll *pll = &dsi->pll; in dsi_init_pll_data()
4528 clk = devm_clk_get(dsi->dev, "sys_clk"); in dsi_init_pll_data()
4534 pll->name = dsi->module_id == 0 ? "dsi0" : "dsi1"; in dsi_init_pll_data()
4535 pll->id = dsi->module_id == 0 ? DSS_PLL_DSI1 : DSS_PLL_DSI2; in dsi_init_pll_data()
4537 pll->base = dsi->pll_base; in dsi_init_pll_data()
4538 pll->hw = dsi->data->pll_hw; in dsi_init_pll_data()
4555 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_bind() local
4560 dsi->dss = dss; in dsi_bind()
4562 dsi_init_pll_data(dss, dsi); in dsi_bind()
4564 r = dsi_runtime_get(dsi); in dsi_bind()
4568 rev = dsi_read_reg(dsi, DSI_REVISION); in dsi_bind()
4569 dev_dbg(dev, "OMAP DSI rev %d.%d\n", in dsi_bind()
4572 dsi->line_buffer_size = dsi_get_line_buf_size(dsi); in dsi_bind()
4574 dsi_runtime_put(dsi); in dsi_bind()
4576 snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1); in dsi_bind()
4577 dsi->debugfs.regs = dss_debugfs_create_file(dss, name, in dsi_bind()
4578 dsi_dump_dsi_regs, dsi); in dsi_bind()
4580 snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1); in dsi_bind()
4581 dsi->debugfs.irqs = dss_debugfs_create_file(dss, name, in dsi_bind()
4582 dsi_dump_dsi_irqs, dsi); in dsi_bind()
4584 snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1); in dsi_bind()
4585 dsi->debugfs.clks = dss_debugfs_create_file(dss, name, in dsi_bind()
4586 dsi_dump_dsi_clocks, dsi); in dsi_bind()
4593 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_unbind() local
4595 dss_debugfs_remove_file(dsi->debugfs.clks); in dsi_unbind()
4596 dss_debugfs_remove_file(dsi->debugfs.irqs); in dsi_unbind()
4597 dss_debugfs_remove_file(dsi->debugfs.regs); in dsi_unbind()
4599 WARN_ON(dsi->scp_clk_refcount > 0); in dsi_unbind()
4601 dss_pll_unregister(&dsi->pll); in dsi_unbind()
4616 struct dsi_data *dsi = drm_bridge_to_dsi(bridge); in dsi_bridge_attach() local
4621 return drm_bridge_attach(bridge->encoder, dsi->output.next_bridge, in dsi_bridge_attach()
4630 struct dsi_data *dsi = drm_bridge_to_dsi(bridge); in dsi_bridge_mode_valid() local
4634 mutex_lock(&dsi->lock); in dsi_bridge_mode_valid()
4635 r = __dsi_calc_config(dsi, mode, &ctx); in dsi_bridge_mode_valid()
4636 mutex_unlock(&dsi->lock); in dsi_bridge_mode_valid()
4645 struct dsi_data *dsi = drm_bridge_to_dsi(bridge); in dsi_bridge_mode_set() local
4647 dsi_set_config(&dsi->output, adjusted_mode); in dsi_bridge_mode_set()
4652 struct dsi_data *dsi = drm_bridge_to_dsi(bridge); in dsi_bridge_enable() local
4653 struct omap_dss_device *dssdev = &dsi->output; in dsi_bridge_enable()
4655 cancel_delayed_work_sync(&dsi->dsi_disable_work); in dsi_bridge_enable()
4657 dsi_bus_lock(dsi); in dsi_bridge_enable()
4659 if (!dsi->iface_enabled) in dsi_bridge_enable()
4660 dsi_enable(dsi); in dsi_bridge_enable()
4664 dsi->video_enabled = true; in dsi_bridge_enable()
4666 dsi_bus_unlock(dsi); in dsi_bridge_enable()
4671 struct dsi_data *dsi = drm_bridge_to_dsi(bridge); in dsi_bridge_disable() local
4672 struct omap_dss_device *dssdev = &dsi->output; in dsi_bridge_disable()
4674 cancel_delayed_work_sync(&dsi->dsi_disable_work); in dsi_bridge_disable()
4676 dsi_bus_lock(dsi); in dsi_bridge_disable()
4678 dsi->video_enabled = false; in dsi_bridge_disable()
4682 dsi_disable(dsi); in dsi_bridge_disable()
4684 dsi_bus_unlock(dsi); in dsi_bridge_disable()
4695 static void dsi_bridge_init(struct dsi_data *dsi) in dsi_bridge_init() argument
4697 dsi->bridge.funcs = &dsi_bridge_funcs; in dsi_bridge_init()
4698 dsi->bridge.of_node = dsi->host.dev->of_node; in dsi_bridge_init()
4699 dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; in dsi_bridge_init()
4701 drm_bridge_add(&dsi->bridge); in dsi_bridge_init()
4704 static void dsi_bridge_cleanup(struct dsi_data *dsi) in dsi_bridge_cleanup() argument
4706 drm_bridge_remove(&dsi->bridge); in dsi_bridge_cleanup()
4713 static int dsi_init_output(struct dsi_data *dsi) in dsi_init_output() argument
4715 struct omap_dss_device *out = &dsi->output; in dsi_init_output()
4718 dsi_bridge_init(dsi); in dsi_init_output()
4720 out->dev = dsi->dev; in dsi_init_output()
4721 out->id = dsi->module_id == 0 ? in dsi_init_output()
4725 out->name = dsi->module_id == 0 ? "dsi.0" : "dsi.1"; in dsi_init_output()
4726 out->dispc_channel = dsi_get_dispc_channel(dsi); in dsi_init_output()
4733 r = omapdss_device_init_output(out, &dsi->bridge); in dsi_init_output()
4735 dsi_bridge_cleanup(dsi); in dsi_init_output()
4744 static void dsi_uninit_output(struct dsi_data *dsi) in dsi_uninit_output() argument
4746 struct omap_dss_device *out = &dsi->output; in dsi_uninit_output()
4750 dsi_bridge_cleanup(dsi); in dsi_uninit_output()
4753 static int dsi_probe_of(struct dsi_data *dsi) in dsi_probe_of() argument
4755 struct device_node *node = dsi->dev->of_node; in dsi_probe_of()
4768 dev_err(dsi->dev, "failed to find lane data\n"); in dsi_probe_of()
4776 num_pins > dsi->num_lanes_supported * 2) { in dsi_probe_of()
4777 dev_err(dsi->dev, "bad number of lanes\n"); in dsi_probe_of()
4784 dev_err(dsi->dev, "failed to read lane data\n"); in dsi_probe_of()
4788 r = dsi_configure_pins(dsi, num_pins, lane_arr); in dsi_probe_of()
4790 dev_err(dsi->dev, "failed to configure pins"); in dsi_probe_of()
4856 { .compatible = "ti,omap3-dsi", .data = &dsi_of_data_omap36xx, },
4857 { .compatible = "ti,omap4-dsi", .data = &dsi_of_data_omap4, },
4858 { .compatible = "ti,omap5-dsi", .data = &dsi_of_data_omap5, },
4870 struct dsi_data *dsi = container_of(work, struct dsi_data, dsi_disable_work.work); in omap_dsi_disable_work_callback() local
4872 dsi_bus_lock(dsi); in omap_dsi_disable_work_callback()
4874 if (dsi->iface_enabled && !dsi->video_enabled) in omap_dsi_disable_work_callback()
4875 dsi_disable(dsi); in omap_dsi_disable_work_callback()
4877 dsi_bus_unlock(dsi); in omap_dsi_disable_work_callback()
4885 struct dsi_data *dsi; in dsi_probe() local
4890 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in dsi_probe()
4891 if (!dsi) in dsi_probe()
4894 dsi->dev = dev; in dsi_probe()
4895 dev_set_drvdata(dev, dsi); in dsi_probe()
4897 spin_lock_init(&dsi->irq_lock); in dsi_probe()
4898 spin_lock_init(&dsi->errors_lock); in dsi_probe()
4899 dsi->errors = 0; in dsi_probe()
4902 spin_lock_init(&dsi->irq_stats_lock); in dsi_probe()
4903 dsi->irq_stats.last_reset = jiffies; in dsi_probe()
4906 mutex_init(&dsi->lock); in dsi_probe()
4907 sema_init(&dsi->bus_lock, 1); in dsi_probe()
4909 INIT_DEFERRABLE_WORK(&dsi->framedone_timeout_work, in dsi_probe()
4912 INIT_DEFERRABLE_WORK(&dsi->dsi_disable_work, omap_dsi_disable_work_callback); in dsi_probe()
4915 timer_setup(&dsi->te_timer, dsi_te_timeout, 0); in dsi_probe()
4919 dsi->proto_base = devm_ioremap_resource(dev, dsi_mem); in dsi_probe()
4920 if (IS_ERR(dsi->proto_base)) in dsi_probe()
4921 return PTR_ERR(dsi->proto_base); in dsi_probe()
4923 dsi->phy_base = devm_platform_ioremap_resource_byname(pdev, "phy"); in dsi_probe()
4924 if (IS_ERR(dsi->phy_base)) in dsi_probe()
4925 return PTR_ERR(dsi->phy_base); in dsi_probe()
4927 dsi->pll_base = devm_platform_ioremap_resource_byname(pdev, "pll"); in dsi_probe()
4928 if (IS_ERR(dsi->pll_base)) in dsi_probe()
4929 return PTR_ERR(dsi->pll_base); in dsi_probe()
4931 dsi->irq = platform_get_irq(pdev, 0); in dsi_probe()
4932 if (dsi->irq < 0) { in dsi_probe()
4937 r = devm_request_irq(dev, dsi->irq, omap_dsi_irq_handler, in dsi_probe()
4938 IRQF_SHARED, dev_name(dev), dsi); in dsi_probe()
4944 dsi->vdds_dsi_reg = devm_regulator_get(dev, "vdd"); in dsi_probe()
4945 if (IS_ERR(dsi->vdds_dsi_reg)) { in dsi_probe()
4946 if (PTR_ERR(dsi->vdds_dsi_reg) != -EPROBE_DEFER) in dsi_probe()
4947 DSSERR("can't get DSI VDD regulator\n"); in dsi_probe()
4948 return PTR_ERR(dsi->vdds_dsi_reg); in dsi_probe()
4953 dsi->data = soc->data; in dsi_probe()
4955 dsi->data = of_match_node(dsi_of_match, dev->of_node)->data; in dsi_probe()
4957 d = dsi->data->modules; in dsi_probe()
4962 DSSERR("unsupported DSI module\n"); in dsi_probe()
4966 dsi->module_id = d->id; in dsi_probe()
4968 if (dsi->data->model == DSI_MODEL_OMAP4 || in dsi_probe()
4969 dsi->data->model == DSI_MODEL_OMAP5) { in dsi_probe()
4977 dsi->data->model == DSI_MODEL_OMAP4 ? in dsi_probe()
4982 dsi->syscon = syscon_node_to_regmap(np); in dsi_probe()
4986 /* DSI VCs initialization */ in dsi_probe()
4987 for (i = 0; i < ARRAY_SIZE(dsi->vc); i++) in dsi_probe()
4988 dsi->vc[i].source = DSI_VC_SOURCE_L4; in dsi_probe()
4990 r = dsi_get_clocks(dsi); in dsi_probe()
4996 /* DSI on OMAP3 doesn't have register DSI_GNQ, set number in dsi_probe()
4998 if (dsi->data->quirks & DSI_QUIRK_GNQ) { in dsi_probe()
4999 dsi_runtime_get(dsi); in dsi_probe()
5001 dsi->num_lanes_supported = 1 + REG_GET(dsi, DSI_GNQ, 11, 9); in dsi_probe()
5002 dsi_runtime_put(dsi); in dsi_probe()
5004 dsi->num_lanes_supported = 3; in dsi_probe()
5007 dsi->host.ops = &omap_dsi_host_ops; in dsi_probe()
5008 dsi->host.dev = &pdev->dev; in dsi_probe()
5010 r = dsi_probe_of(dsi); in dsi_probe()
5012 DSSERR("Invalid DSI DT data\n"); in dsi_probe()
5016 r = mipi_dsi_host_register(&dsi->host); in dsi_probe()
5018 dev_err(&pdev->dev, "failed to register DSI host: %d\n", r); in dsi_probe()
5022 r = dsi_init_output(dsi); in dsi_probe()
5033 dsi_uninit_output(dsi); in dsi_probe()
5035 mipi_dsi_host_unregister(&dsi->host); in dsi_probe()
5043 struct dsi_data *dsi = platform_get_drvdata(pdev); in dsi_remove() local
5047 dsi_uninit_output(dsi); in dsi_remove()
5049 mipi_dsi_host_unregister(&dsi->host); in dsi_remove()
5053 if (dsi->vdds_dsi_reg != NULL && dsi->vdds_dsi_enabled) { in dsi_remove()
5054 regulator_disable(dsi->vdds_dsi_reg); in dsi_remove()
5055 dsi->vdds_dsi_enabled = false; in dsi_remove()
5063 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_runtime_suspend() local
5065 dsi->is_enabled = false; in dsi_runtime_suspend()
5068 /* wait for current handler to finish before turning the DSI off */ in dsi_runtime_suspend()
5069 synchronize_irq(dsi->irq); in dsi_runtime_suspend()
5076 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_runtime_resume() local
5078 dsi->is_enabled = true; in dsi_runtime_resume()