• Home
  • Raw
  • Download

Lines Matching full:dsi

7 #define DSS_SUBSYS_NAME "DSI"
47 /* DSI Protocol Engine */
111 #define REG_GET(dsi, idx, start, end) \ argument
112 FLD_GET(dsi_read_reg(dsi, idx), start, end)
114 #define REG_FLD_MOD(dsi, idx, val, start, end) \ argument
115 dsi_write_reg(dsi, idx, FLD_MOD(dsi_read_reg(dsi, idx), val, start, end))
207 static int dsi_display_init_dispc(struct dsi_data *dsi);
208 static void dsi_display_uninit_dispc(struct dsi_data *dsi);
210 static int dsi_vc_send_null(struct dsi_data *dsi, int channel);
212 /* DSI PLL HSDIV indices */
273 struct dsi_data *dsi; member
302 DSI_QUIRK_PLL_PWR_BUG = (1 << 0), /* DSI-PLL power command 0x3 is not working */
421 struct dsi_data *dsi; member
435 static inline void dsi_write_reg(struct dsi_data *dsi, in dsi_write_reg() argument
441 case DSI_PROTO: base = dsi->proto_base; break; in dsi_write_reg()
442 case DSI_PHY: base = dsi->phy_base; break; in dsi_write_reg()
443 case DSI_PLL: base = dsi->pll_base; break; in dsi_write_reg()
450 static inline u32 dsi_read_reg(struct dsi_data *dsi, const struct dsi_reg idx) in dsi_read_reg() argument
455 case DSI_PROTO: base = dsi->proto_base; break; in dsi_read_reg()
456 case DSI_PHY: base = dsi->phy_base; break; in dsi_read_reg()
457 case DSI_PLL: base = dsi->pll_base; break; in dsi_read_reg()
466 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_bus_lock() local
468 down(&dsi->bus_lock); in dsi_bus_lock()
473 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_bus_unlock() local
475 up(&dsi->bus_lock); in dsi_bus_unlock()
478 static bool dsi_bus_is_locked(struct dsi_data *dsi) in dsi_bus_is_locked() argument
480 return dsi->bus_lock.count == 0; in dsi_bus_is_locked()
488 static inline bool wait_for_bit_change(struct dsi_data *dsi, in wait_for_bit_change() argument
499 if (REG_GET(dsi, idx, bitnum, bitnum) == value) in wait_for_bit_change()
506 if (REG_GET(dsi, idx, bitnum, bitnum) == value) in wait_for_bit_change()
534 static void dsi_perf_mark_setup(struct dsi_data *dsi) in dsi_perf_mark_setup() argument
536 dsi->perf_setup_time = ktime_get(); in dsi_perf_mark_setup()
539 static void dsi_perf_mark_start(struct dsi_data *dsi) in dsi_perf_mark_start() argument
541 dsi->perf_start_time = ktime_get(); in dsi_perf_mark_start()
544 static void dsi_perf_show(struct dsi_data *dsi, const char *name) in dsi_perf_show() argument
555 setup_time = ktime_sub(dsi->perf_start_time, dsi->perf_setup_time); in dsi_perf_show()
560 trans_time = ktime_sub(t, dsi->perf_start_time); in dsi_perf_show()
567 total_bytes = dsi->update_bytes; in dsi_perf_show()
569 pr_info("DSI(%s): %u us + %u us = %u us (%uHz), %u bytes, %u kbytes/sec\n", in dsi_perf_show()
579 static inline void dsi_perf_mark_setup(struct dsi_data *dsi) in dsi_perf_mark_setup() argument
583 static inline void dsi_perf_mark_start(struct dsi_data *dsi) in dsi_perf_mark_start() argument
587 static inline void dsi_perf_show(struct dsi_data *dsi, const char *name) in dsi_perf_show() argument
604 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()
636 pr_debug("DSI VC(%d) IRQ 0x%x: %s%s%s%s%s%s%s%s%s\n", in print_irq_status_vc()
658 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()
684 static void dsi_collect_irq_stats(struct dsi_data *dsi, u32 irqstatus, in dsi_collect_irq_stats() argument
689 spin_lock(&dsi->irq_stats_lock); in dsi_collect_irq_stats()
691 dsi->irq_stats.irq_count++; in dsi_collect_irq_stats()
692 dss_collect_irq_stats(irqstatus, dsi->irq_stats.dsi_irqs); in dsi_collect_irq_stats()
695 dss_collect_irq_stats(vcstatus[i], dsi->irq_stats.vc_irqs[i]); in dsi_collect_irq_stats()
697 dss_collect_irq_stats(ciostatus, dsi->irq_stats.cio_irqs); in dsi_collect_irq_stats()
699 spin_unlock(&dsi->irq_stats_lock); in dsi_collect_irq_stats()
702 #define dsi_collect_irq_stats(dsi, irqstatus, vcstatus, ciostatus) argument
707 static void dsi_handle_irq_errors(struct dsi_data *dsi, u32 irqstatus, in dsi_handle_irq_errors() argument
713 DSSERR("DSI error, irqstatus %x\n", irqstatus); in dsi_handle_irq_errors()
715 spin_lock(&dsi->errors_lock); in dsi_handle_irq_errors()
716 dsi->errors |= irqstatus & DSI_IRQ_ERROR_MASK; in dsi_handle_irq_errors()
717 spin_unlock(&dsi->errors_lock); in dsi_handle_irq_errors()
724 DSSERR("DSI VC(%d) error, vc irqstatus %x\n", in dsi_handle_irq_errors()
733 DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus); in dsi_handle_irq_errors()
778 struct dsi_data *dsi = arg; in omap_dsi_irq_handler() local
782 if (!dsi->is_enabled) in omap_dsi_irq_handler()
785 spin_lock(&dsi->irq_lock); in omap_dsi_irq_handler()
787 irqstatus = dsi_read_reg(dsi, DSI_IRQSTATUS); in omap_dsi_irq_handler()
791 spin_unlock(&dsi->irq_lock); in omap_dsi_irq_handler()
795 dsi_write_reg(dsi, DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK); in omap_dsi_irq_handler()
797 dsi_read_reg(dsi, DSI_IRQSTATUS); in omap_dsi_irq_handler()
805 vcstatus[i] = dsi_read_reg(dsi, DSI_VC_IRQSTATUS(i)); in omap_dsi_irq_handler()
807 dsi_write_reg(dsi, DSI_VC_IRQSTATUS(i), vcstatus[i]); in omap_dsi_irq_handler()
809 dsi_read_reg(dsi, DSI_VC_IRQSTATUS(i)); in omap_dsi_irq_handler()
813 ciostatus = dsi_read_reg(dsi, DSI_COMPLEXIO_IRQ_STATUS); in omap_dsi_irq_handler()
815 dsi_write_reg(dsi, DSI_COMPLEXIO_IRQ_STATUS, ciostatus); in omap_dsi_irq_handler()
817 dsi_read_reg(dsi, DSI_COMPLEXIO_IRQ_STATUS); in omap_dsi_irq_handler()
824 del_timer(&dsi->te_timer); in omap_dsi_irq_handler()
829 memcpy(&dsi->isr_tables_copy, &dsi->isr_tables, in omap_dsi_irq_handler()
830 sizeof(dsi->isr_tables)); in omap_dsi_irq_handler()
832 spin_unlock(&dsi->irq_lock); in omap_dsi_irq_handler()
834 dsi_handle_isrs(&dsi->isr_tables_copy, irqstatus, vcstatus, ciostatus); in omap_dsi_irq_handler()
836 dsi_handle_irq_errors(dsi, irqstatus, vcstatus, ciostatus); in omap_dsi_irq_handler()
838 dsi_collect_irq_stats(dsi, irqstatus, vcstatus, ciostatus); in omap_dsi_irq_handler()
843 /* dsi->irq_lock has to be locked by the caller */
844 static void _omap_dsi_configure_irqs(struct dsi_data *dsi, in _omap_dsi_configure_irqs() argument
867 old_mask = dsi_read_reg(dsi, enable_reg); in _omap_dsi_configure_irqs()
869 dsi_write_reg(dsi, status_reg, (mask ^ old_mask) & mask); in _omap_dsi_configure_irqs()
870 dsi_write_reg(dsi, enable_reg, mask); in _omap_dsi_configure_irqs()
873 dsi_read_reg(dsi, enable_reg); in _omap_dsi_configure_irqs()
874 dsi_read_reg(dsi, status_reg); in _omap_dsi_configure_irqs()
877 /* dsi->irq_lock has to be locked by the caller */
878 static void _omap_dsi_set_irqs(struct dsi_data *dsi) in _omap_dsi_set_irqs() argument
884 _omap_dsi_configure_irqs(dsi, dsi->isr_tables.isr_table, in _omap_dsi_set_irqs()
885 ARRAY_SIZE(dsi->isr_tables.isr_table), mask, in _omap_dsi_set_irqs()
889 /* dsi->irq_lock has to be locked by the caller */
890 static void _omap_dsi_set_irqs_vc(struct dsi_data *dsi, int vc) in _omap_dsi_set_irqs_vc() argument
892 _omap_dsi_configure_irqs(dsi, dsi->isr_tables.isr_table_vc[vc], in _omap_dsi_set_irqs_vc()
893 ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc]), in _omap_dsi_set_irqs_vc()
898 /* dsi->irq_lock has to be locked by the caller */
899 static void _omap_dsi_set_irqs_cio(struct dsi_data *dsi) in _omap_dsi_set_irqs_cio() argument
901 _omap_dsi_configure_irqs(dsi, dsi->isr_tables.isr_table_cio, in _omap_dsi_set_irqs_cio()
902 ARRAY_SIZE(dsi->isr_tables.isr_table_cio), in _omap_dsi_set_irqs_cio()
907 static void _dsi_initialize_irq(struct dsi_data *dsi) in _dsi_initialize_irq() argument
912 spin_lock_irqsave(&dsi->irq_lock, flags); in _dsi_initialize_irq()
914 memset(&dsi->isr_tables, 0, sizeof(dsi->isr_tables)); in _dsi_initialize_irq()
916 _omap_dsi_set_irqs(dsi); in _dsi_initialize_irq()
918 _omap_dsi_set_irqs_vc(dsi, vc); in _dsi_initialize_irq()
919 _omap_dsi_set_irqs_cio(dsi); in _dsi_initialize_irq()
921 spin_unlock_irqrestore(&dsi->irq_lock, flags); in _dsi_initialize_irq()
980 static int dsi_register_isr(struct dsi_data *dsi, omap_dsi_isr_t isr, in dsi_register_isr() argument
986 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_register_isr()
988 r = _dsi_register_isr(isr, arg, mask, dsi->isr_tables.isr_table, in dsi_register_isr()
989 ARRAY_SIZE(dsi->isr_tables.isr_table)); in dsi_register_isr()
992 _omap_dsi_set_irqs(dsi); in dsi_register_isr()
994 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_register_isr()
999 static int dsi_unregister_isr(struct dsi_data *dsi, omap_dsi_isr_t isr, in dsi_unregister_isr() argument
1005 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_unregister_isr()
1007 r = _dsi_unregister_isr(isr, arg, mask, dsi->isr_tables.isr_table, in dsi_unregister_isr()
1008 ARRAY_SIZE(dsi->isr_tables.isr_table)); in dsi_unregister_isr()
1011 _omap_dsi_set_irqs(dsi); in dsi_unregister_isr()
1013 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_unregister_isr()
1018 static int dsi_register_isr_vc(struct dsi_data *dsi, int channel, in dsi_register_isr_vc() argument
1024 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_register_isr_vc()
1027 dsi->isr_tables.isr_table_vc[channel], in dsi_register_isr_vc()
1028 ARRAY_SIZE(dsi->isr_tables.isr_table_vc[channel])); in dsi_register_isr_vc()
1031 _omap_dsi_set_irqs_vc(dsi, channel); in dsi_register_isr_vc()
1033 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_register_isr_vc()
1038 static int dsi_unregister_isr_vc(struct dsi_data *dsi, int channel, in dsi_unregister_isr_vc() argument
1044 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_unregister_isr_vc()
1047 dsi->isr_tables.isr_table_vc[channel], in dsi_unregister_isr_vc()
1048 ARRAY_SIZE(dsi->isr_tables.isr_table_vc[channel])); in dsi_unregister_isr_vc()
1051 _omap_dsi_set_irqs_vc(dsi, channel); in dsi_unregister_isr_vc()
1053 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_unregister_isr_vc()
1058 static int dsi_register_isr_cio(struct dsi_data *dsi, omap_dsi_isr_t isr, in dsi_register_isr_cio() argument
1064 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_register_isr_cio()
1066 r = _dsi_register_isr(isr, arg, mask, dsi->isr_tables.isr_table_cio, in dsi_register_isr_cio()
1067 ARRAY_SIZE(dsi->isr_tables.isr_table_cio)); in dsi_register_isr_cio()
1070 _omap_dsi_set_irqs_cio(dsi); in dsi_register_isr_cio()
1072 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_register_isr_cio()
1077 static int dsi_unregister_isr_cio(struct dsi_data *dsi, omap_dsi_isr_t isr, in dsi_unregister_isr_cio() argument
1083 spin_lock_irqsave(&dsi->irq_lock, flags); in dsi_unregister_isr_cio()
1085 r = _dsi_unregister_isr(isr, arg, mask, dsi->isr_tables.isr_table_cio, in dsi_unregister_isr_cio()
1086 ARRAY_SIZE(dsi->isr_tables.isr_table_cio)); in dsi_unregister_isr_cio()
1089 _omap_dsi_set_irqs_cio(dsi); in dsi_unregister_isr_cio()
1091 spin_unlock_irqrestore(&dsi->irq_lock, flags); in dsi_unregister_isr_cio()
1096 static u32 dsi_get_errors(struct dsi_data *dsi) in dsi_get_errors() argument
1101 spin_lock_irqsave(&dsi->errors_lock, flags); in dsi_get_errors()
1102 e = dsi->errors; in dsi_get_errors()
1103 dsi->errors = 0; in dsi_get_errors()
1104 spin_unlock_irqrestore(&dsi->errors_lock, flags); in dsi_get_errors()
1108 static int dsi_runtime_get(struct dsi_data *dsi) in dsi_runtime_get() argument
1114 r = pm_runtime_get_sync(dsi->dev); in dsi_runtime_get()
1119 static void dsi_runtime_put(struct dsi_data *dsi) in dsi_runtime_put() argument
1125 r = pm_runtime_put_sync(dsi->dev); in dsi_runtime_put()
1129 static void _dsi_print_reset_status(struct dsi_data *dsi) in _dsi_print_reset_status() argument
1135 * required after DSIPHY reset to complete the reset of the DSI complex in _dsi_print_reset_status()
1137 l = dsi_read_reg(dsi, DSI_DSIPHY_CFG5); in _dsi_print_reset_status()
1139 if (dsi->data->quirks & DSI_QUIRK_REVERSE_TXCLKESC) { in _dsi_print_reset_status()
1150 FLD_GET(dsi_read_reg(dsi, DSI_##fld), start, end) in _dsi_print_reset_status()
1152 pr_debug("DSI resets: PLL (%d) CIO (%d) PHY (%x%x%x, %d, %d, %d)\n", in _dsi_print_reset_status()
1165 static inline int dsi_if_enable(struct dsi_data *dsi, bool enable) in dsi_if_enable() argument
1170 REG_FLD_MOD(dsi, DSI_CTRL, enable, 0, 0); /* IF_EN */ in dsi_if_enable()
1172 if (!wait_for_bit_change(dsi, DSI_CTRL, 0, enable)) { in dsi_if_enable()
1180 static unsigned long dsi_get_pll_hsdiv_dispc_rate(struct dsi_data *dsi) in dsi_get_pll_hsdiv_dispc_rate() argument
1182 return dsi->pll.cinfo.clkout[HSDIV_DISPC]; in dsi_get_pll_hsdiv_dispc_rate()
1185 static unsigned long dsi_get_pll_hsdiv_dsi_rate(struct dsi_data *dsi) in dsi_get_pll_hsdiv_dsi_rate() argument
1187 return dsi->pll.cinfo.clkout[HSDIV_DSI]; in dsi_get_pll_hsdiv_dsi_rate()
1190 static unsigned long dsi_get_txbyteclkhs(struct dsi_data *dsi) in dsi_get_txbyteclkhs() argument
1192 return dsi->pll.cinfo.clkdco / 16; in dsi_get_txbyteclkhs()
1195 static unsigned long dsi_fclk_rate(struct dsi_data *dsi) in dsi_fclk_rate() argument
1200 source = dss_get_dsi_clk_source(dsi->dss, dsi->module_id); in dsi_fclk_rate()
1202 /* DSI FCLK source is DSS_CLK_FCK */ in dsi_fclk_rate()
1203 r = clk_get_rate(dsi->dss_clk); in dsi_fclk_rate()
1205 /* DSI FCLK source is dsi_pll_hsdiv_dsi_clk */ in dsi_fclk_rate()
1206 r = dsi_get_pll_hsdiv_dsi_rate(dsi); in dsi_fclk_rate()
1231 static int dsi_set_lp_clk_divisor(struct dsi_data *dsi) in dsi_set_lp_clk_divisor() argument
1236 unsigned int lpdiv_max = dsi->data->max_pll_lpdiv; in dsi_set_lp_clk_divisor()
1239 lp_clk_div = dsi->user_lp_cinfo.lp_clk_div; in dsi_set_lp_clk_divisor()
1244 dsi_fclk = dsi_fclk_rate(dsi); in dsi_set_lp_clk_divisor()
1249 dsi->current_lp_cinfo.lp_clk = lp_clk; in dsi_set_lp_clk_divisor()
1250 dsi->current_lp_cinfo.lp_clk_div = lp_clk_div; in dsi_set_lp_clk_divisor()
1253 REG_FLD_MOD(dsi, DSI_CLK_CTRL, lp_clk_div, 12, 0); in dsi_set_lp_clk_divisor()
1256 REG_FLD_MOD(dsi, DSI_CLK_CTRL, dsi_fclk > 30000000 ? 1 : 0, 21, 21); in dsi_set_lp_clk_divisor()
1261 static void dsi_enable_scp_clk(struct dsi_data *dsi) in dsi_enable_scp_clk() argument
1263 if (dsi->scp_clk_refcount++ == 0) in dsi_enable_scp_clk()
1264 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 1, 14, 14); /* CIO_CLK_ICG */ in dsi_enable_scp_clk()
1267 static void dsi_disable_scp_clk(struct dsi_data *dsi) in dsi_disable_scp_clk() argument
1269 WARN_ON(dsi->scp_clk_refcount == 0); in dsi_disable_scp_clk()
1270 if (--dsi->scp_clk_refcount == 0) in dsi_disable_scp_clk()
1271 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 14, 14); /* CIO_CLK_ICG */ in dsi_disable_scp_clk()
1281 static int dsi_pll_power(struct dsi_data *dsi, enum dsi_pll_power_state state) in dsi_pll_power() argument
1285 /* DSI-PLL power command 0x3 is not working */ in dsi_pll_power()
1286 if ((dsi->data->quirks & DSI_QUIRK_PLL_PWR_BUG) && in dsi_pll_power()
1291 REG_FLD_MOD(dsi, DSI_CLK_CTRL, state, 31, 30); in dsi_pll_power()
1294 while (FLD_GET(dsi_read_reg(dsi, DSI_CLK_CTRL), 29, 28) != state) { in dsi_pll_power()
1296 DSSERR("Failed to set DSI PLL power mode to %d\n", in dsi_pll_power()
1307 static void dsi_pll_calc_dsi_fck(struct dsi_data *dsi, in dsi_pll_calc_dsi_fck() argument
1312 max_dsi_fck = dsi->data->max_fck_freq; in dsi_pll_calc_dsi_fck()
1320 struct dsi_data *dsi = container_of(pll, struct dsi_data, pll); in dsi_pll_enable() local
1325 r = dsi_runtime_get(dsi); in dsi_pll_enable()
1332 dsi_enable_scp_clk(dsi); in dsi_pll_enable()
1334 r = regulator_enable(dsi->vdds_dsi_reg); in dsi_pll_enable()
1339 dispc_pck_free_enable(dsi->dss->dispc, 1); in dsi_pll_enable()
1341 if (!wait_for_bit_change(dsi, DSI_PLL_STATUS, 0, 1)) { in dsi_pll_enable()
1344 dispc_pck_free_enable(dsi->dss->dispc, 0); in dsi_pll_enable()
1350 dispc_pck_free_enable(dsi->dss->dispc, 0); in dsi_pll_enable()
1352 r = dsi_pll_power(dsi, DSI_PLL_POWER_ON_ALL); in dsi_pll_enable()
1361 regulator_disable(dsi->vdds_dsi_reg); in dsi_pll_enable()
1363 dsi_disable_scp_clk(dsi); in dsi_pll_enable()
1364 dsi_runtime_put(dsi); in dsi_pll_enable()
1370 struct dsi_data *dsi = container_of(pll, struct dsi_data, pll); in dsi_pll_disable() local
1372 dsi_pll_power(dsi, DSI_PLL_POWER_OFF); in dsi_pll_disable()
1374 regulator_disable(dsi->vdds_dsi_reg); in dsi_pll_disable()
1376 dsi_disable_scp_clk(dsi); in dsi_pll_disable()
1377 dsi_runtime_put(dsi); in dsi_pll_disable()
1384 struct dsi_data *dsi = s->private; in dsi_dump_dsi_clocks() local
1385 struct dss_pll_clock_info *cinfo = &dsi->pll.cinfo; in dsi_dump_dsi_clocks()
1387 int dsi_module = dsi->module_id; in dsi_dump_dsi_clocks()
1388 struct dss_pll *pll = &dsi->pll; in dsi_dump_dsi_clocks()
1390 dispc_clk_src = dss_get_dispc_clk_source(dsi->dss); in dsi_dump_dsi_clocks()
1391 dsi_clk_src = dss_get_dsi_clk_source(dsi->dss, dsi_module); in dsi_dump_dsi_clocks()
1393 if (dsi_runtime_get(dsi)) in dsi_dump_dsi_clocks()
1396 seq_printf(s, "- DSI%d PLL -\n", dsi_module + 1); in dsi_dump_dsi_clocks()
1398 seq_printf(s, "dsi pll clkin\t%lu\n", clk_get_rate(pll->clkin)); in dsi_dump_dsi_clocks()
1423 seq_printf(s, "- DSI%d -\n", dsi_module + 1); in dsi_dump_dsi_clocks()
1425 seq_printf(s, "dsi fclk source = %s\n", in dsi_dump_dsi_clocks()
1428 seq_printf(s, "DSI_FCLK\t%lu\n", dsi_fclk_rate(dsi)); in dsi_dump_dsi_clocks()
1433 seq_printf(s, "TxByteClkHS\t%lu\n", dsi_get_txbyteclkhs(dsi)); in dsi_dump_dsi_clocks()
1435 seq_printf(s, "LP_CLK\t\t%lu\n", dsi->current_lp_cinfo.lp_clk); in dsi_dump_dsi_clocks()
1437 dsi_runtime_put(dsi); in dsi_dump_dsi_clocks()
1445 struct dsi_data *dsi = s->private; in dsi_dump_dsi_irqs() local
1453 spin_lock_irqsave(&dsi->irq_stats_lock, flags); in dsi_dump_dsi_irqs()
1455 *stats = dsi->irq_stats; in dsi_dump_dsi_irqs()
1456 memset(&dsi->irq_stats, 0, sizeof(dsi->irq_stats)); in dsi_dump_dsi_irqs()
1457 dsi->irq_stats.last_reset = jiffies; in dsi_dump_dsi_irqs()
1459 spin_unlock_irqrestore(&dsi->irq_stats_lock, flags); in dsi_dump_dsi_irqs()
1468 seq_printf(s, "-- DSI%d interrupts --\n", dsi->module_id + 1); in dsi_dump_dsi_irqs()
1542 struct dsi_data *dsi = s->private; in dsi_dump_dsi_regs() local
1544 if (dsi_runtime_get(dsi)) in dsi_dump_dsi_regs()
1546 dsi_enable_scp_clk(dsi); in dsi_dump_dsi_regs()
1548 #define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsi, r)) in dsi_dump_dsi_regs()
1620 dsi_disable_scp_clk(dsi); in dsi_dump_dsi_regs()
1621 dsi_runtime_put(dsi); in dsi_dump_dsi_regs()
1632 static int dsi_cio_power(struct dsi_data *dsi, enum dsi_cio_power_state state) in dsi_cio_power() argument
1637 REG_FLD_MOD(dsi, DSI_COMPLEXIO_CFG1, state, 28, 27); in dsi_cio_power()
1640 while (FLD_GET(dsi_read_reg(dsi, DSI_COMPLEXIO_CFG1), in dsi_cio_power()
1653 static unsigned int dsi_get_line_buf_size(struct dsi_data *dsi) in dsi_get_line_buf_size() argument
1661 if (!(dsi->data->quirks & DSI_QUIRK_GNQ)) in dsi_get_line_buf_size()
1664 val = REG_GET(dsi, DSI_GNQ, 14, 12); /* VP1_LINE_BUFFER_SIZE */ in dsi_get_line_buf_size()
1687 static int dsi_set_lane_config(struct dsi_data *dsi) in dsi_set_lane_config() argument
1700 r = dsi_read_reg(dsi, DSI_COMPLEXIO_CFG1); in dsi_set_lane_config()
1702 for (i = 0; i < dsi->num_lanes_used; ++i) { in dsi_set_lane_config()
1707 for (t = 0; t < dsi->num_lanes_supported; ++t) in dsi_set_lane_config()
1708 if (dsi->lanes[t].function == functions[i]) in dsi_set_lane_config()
1711 if (t == dsi->num_lanes_supported) in dsi_set_lane_config()
1715 polarity = dsi->lanes[t].polarity; in dsi_set_lane_config()
1722 for (; i < dsi->num_lanes_supported; ++i) { in dsi_set_lane_config()
1729 dsi_write_reg(dsi, DSI_COMPLEXIO_CFG1, r); in dsi_set_lane_config()
1734 static inline unsigned int ns2ddr(struct dsi_data *dsi, unsigned int ns) in ns2ddr() argument
1737 unsigned long ddr_clk = dsi->pll.cinfo.clkdco / 4; in ns2ddr()
1742 static inline unsigned int ddr2ns(struct dsi_data *dsi, unsigned int ddr) in ddr2ns() argument
1744 unsigned long ddr_clk = dsi->pll.cinfo.clkdco / 4; in ddr2ns()
1749 static void dsi_cio_timings(struct dsi_data *dsi) in dsi_cio_timings() argument
1761 ths_prepare = ns2ddr(dsi, 70) + 2; in dsi_cio_timings()
1764 ths_prepare_ths_zero = ns2ddr(dsi, 175) + 2; in dsi_cio_timings()
1767 ths_trail = ns2ddr(dsi, 60) + 5; in dsi_cio_timings()
1770 ths_exit = ns2ddr(dsi, 145); in dsi_cio_timings()
1773 tlpx_half = ns2ddr(dsi, 25); in dsi_cio_timings()
1776 tclk_trail = ns2ddr(dsi, 60) + 2; in dsi_cio_timings()
1779 tclk_prepare = ns2ddr(dsi, 65); in dsi_cio_timings()
1782 tclk_zero = ns2ddr(dsi, 260); in dsi_cio_timings()
1785 ths_prepare, ddr2ns(dsi, ths_prepare), in dsi_cio_timings()
1786 ths_prepare_ths_zero, ddr2ns(dsi, ths_prepare_ths_zero)); in dsi_cio_timings()
1788 ths_trail, ddr2ns(dsi, ths_trail), in dsi_cio_timings()
1789 ths_exit, ddr2ns(dsi, ths_exit)); in dsi_cio_timings()
1793 tlpx_half, ddr2ns(dsi, tlpx_half), in dsi_cio_timings()
1794 tclk_trail, ddr2ns(dsi, tclk_trail), in dsi_cio_timings()
1795 tclk_zero, ddr2ns(dsi, tclk_zero)); in dsi_cio_timings()
1797 tclk_prepare, ddr2ns(dsi, tclk_prepare)); in dsi_cio_timings()
1801 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG0); in dsi_cio_timings()
1806 dsi_write_reg(dsi, DSI_DSIPHY_CFG0, r); in dsi_cio_timings()
1808 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG1); in dsi_cio_timings()
1813 if (dsi->data->quirks & DSI_QUIRK_PHY_DCC) { in dsi_cio_timings()
1819 dsi_write_reg(dsi, DSI_DSIPHY_CFG1, r); in dsi_cio_timings()
1821 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG2); in dsi_cio_timings()
1823 dsi_write_reg(dsi, DSI_DSIPHY_CFG2, r); in dsi_cio_timings()
1827 static void dsi_cio_enable_lane_override(struct dsi_data *dsi, in dsi_cio_enable_lane_override() argument
1833 u8 lptxscp_start = dsi->num_lanes_supported == 3 ? 22 : 26; in dsi_cio_enable_lane_override()
1837 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_cio_enable_lane_override()
1838 unsigned int p = dsi->lanes[i].polarity; in dsi_cio_enable_lane_override()
1859 REG_FLD_MOD(dsi, DSI_DSIPHY_CFG10, l, lptxscp_start, 17); in dsi_cio_enable_lane_override()
1864 REG_FLD_MOD(dsi, DSI_DSIPHY_CFG10, 1, 27, 27); in dsi_cio_enable_lane_override()
1867 static void dsi_cio_disable_lane_override(struct dsi_data *dsi) in dsi_cio_disable_lane_override() argument
1870 REG_FLD_MOD(dsi, DSI_DSIPHY_CFG10, 0, 27, 27); /* ENLPTXSCPDAT */ in dsi_cio_disable_lane_override()
1873 REG_FLD_MOD(dsi, DSI_DSIPHY_CFG10, 0, 22, 17); in dsi_cio_disable_lane_override()
1876 static int dsi_cio_wait_tx_clk_esc_reset(struct dsi_data *dsi) in dsi_cio_wait_tx_clk_esc_reset() argument
1884 if (dsi->data->quirks & DSI_QUIRK_REVERSE_TXCLKESC) in dsi_cio_wait_tx_clk_esc_reset()
1889 for (i = 0; i < dsi->num_lanes_supported; ++i) in dsi_cio_wait_tx_clk_esc_reset()
1890 in_use[i] = dsi->lanes[i].function != DSI_LANE_UNUSED; in dsi_cio_wait_tx_clk_esc_reset()
1897 l = dsi_read_reg(dsi, DSI_DSIPHY_CFG5); in dsi_cio_wait_tx_clk_esc_reset()
1900 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_cio_wait_tx_clk_esc_reset()
1905 if (ok == dsi->num_lanes_supported) in dsi_cio_wait_tx_clk_esc_reset()
1909 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_cio_wait_tx_clk_esc_reset()
1924 static unsigned int dsi_get_lane_mask(struct dsi_data *dsi) in dsi_get_lane_mask() argument
1929 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_get_lane_mask()
1930 if (dsi->lanes[i].function != DSI_LANE_UNUSED) in dsi_get_lane_mask()
1949 static int dsi_omap4_mux_pads(struct dsi_data *dsi, unsigned int lanes) in dsi_omap4_mux_pads() argument
1954 if (dsi->module_id == 0) { in dsi_omap4_mux_pads()
1959 } else if (dsi->module_id == 1) { in dsi_omap4_mux_pads()
1968 return regmap_update_bits(dsi->syscon, OMAP4_DSIPHY_SYSCON_OFFSET, in dsi_omap4_mux_pads()
1981 static int dsi_omap5_mux_pads(struct dsi_data *dsi, unsigned int lanes) in dsi_omap5_mux_pads() argument
1985 if (dsi->module_id == 0) in dsi_omap5_mux_pads()
1987 else if (dsi->module_id == 1) in dsi_omap5_mux_pads()
1992 return regmap_update_bits(dsi->syscon, OMAP5_DSIPHY_SYSCON_OFFSET, in dsi_omap5_mux_pads()
1997 static int dsi_enable_pads(struct dsi_data *dsi, unsigned int lane_mask) in dsi_enable_pads() argument
1999 if (dsi->data->model == DSI_MODEL_OMAP4) in dsi_enable_pads()
2000 return dsi_omap4_mux_pads(dsi, lane_mask); in dsi_enable_pads()
2001 if (dsi->data->model == DSI_MODEL_OMAP5) in dsi_enable_pads()
2002 return dsi_omap5_mux_pads(dsi, lane_mask); in dsi_enable_pads()
2006 static void dsi_disable_pads(struct dsi_data *dsi) in dsi_disable_pads() argument
2008 if (dsi->data->model == DSI_MODEL_OMAP4) in dsi_disable_pads()
2009 dsi_omap4_mux_pads(dsi, 0); in dsi_disable_pads()
2010 else if (dsi->data->model == DSI_MODEL_OMAP5) in dsi_disable_pads()
2011 dsi_omap5_mux_pads(dsi, 0); in dsi_disable_pads()
2014 static int dsi_cio_init(struct dsi_data *dsi) in dsi_cio_init() argument
2019 DSSDBG("DSI CIO init starts"); in dsi_cio_init()
2021 r = dsi_enable_pads(dsi, dsi_get_lane_mask(dsi)); in dsi_cio_init()
2025 dsi_enable_scp_clk(dsi); in dsi_cio_init()
2028 * required after DSIPHY reset to complete the reset of the DSI complex in dsi_cio_init()
2030 dsi_read_reg(dsi, DSI_DSIPHY_CFG5); in dsi_cio_init()
2032 if (!wait_for_bit_change(dsi, DSI_DSIPHY_CFG5, 30, 1)) { in dsi_cio_init()
2038 r = dsi_set_lane_config(dsi); in dsi_cio_init()
2043 l = dsi_read_reg(dsi, DSI_TIMING1); in dsi_cio_init()
2048 dsi_write_reg(dsi, DSI_TIMING1, l); in dsi_cio_init()
2050 if (dsi->ulps_enabled) { in dsi_cio_init()
2067 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_cio_init()
2068 if (dsi->lanes[i].function == DSI_LANE_UNUSED) in dsi_cio_init()
2073 dsi_cio_enable_lane_override(dsi, mask_p, 0); in dsi_cio_init()
2076 r = dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_ON); in dsi_cio_init()
2080 if (!wait_for_bit_change(dsi, DSI_COMPLEXIO_CFG1, 29, 1)) { in dsi_cio_init()
2086 dsi_if_enable(dsi, true); in dsi_cio_init()
2087 dsi_if_enable(dsi, false); in dsi_cio_init()
2088 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 1, 20, 20); /* LP_CLK_ENABLE */ in dsi_cio_init()
2090 r = dsi_cio_wait_tx_clk_esc_reset(dsi); in dsi_cio_init()
2094 if (dsi->ulps_enabled) { in dsi_cio_init()
2095 /* Keep Mark-1 state for 1ms (as per DSI spec) */ in dsi_cio_init()
2102 dsi_cio_disable_lane_override(dsi); in dsi_cio_init()
2106 REG_FLD_MOD(dsi, DSI_TIMING1, 0, 15, 15); in dsi_cio_init()
2108 dsi_cio_timings(dsi); in dsi_cio_init()
2110 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_cio_init()
2112 REG_FLD_MOD(dsi, DSI_CLK_CTRL, in dsi_cio_init()
2113 dsi->vm_timings.ddr_clk_always_on, 13, 13); in dsi_cio_init()
2116 dsi->ulps_enabled = false; in dsi_cio_init()
2123 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 20, 20); /* LP_CLK_ENABLE */ in dsi_cio_init()
2125 dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_OFF); in dsi_cio_init()
2127 if (dsi->ulps_enabled) in dsi_cio_init()
2128 dsi_cio_disable_lane_override(dsi); in dsi_cio_init()
2130 dsi_disable_scp_clk(dsi); in dsi_cio_init()
2131 dsi_disable_pads(dsi); in dsi_cio_init()
2135 static void dsi_cio_uninit(struct dsi_data *dsi) in dsi_cio_uninit() argument
2138 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 13, 13); in dsi_cio_uninit()
2140 dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_OFF); in dsi_cio_uninit()
2141 dsi_disable_scp_clk(dsi); in dsi_cio_uninit()
2142 dsi_disable_pads(dsi); in dsi_cio_uninit()
2145 static void dsi_config_tx_fifo(struct dsi_data *dsi, in dsi_config_tx_fifo() argument
2153 dsi->vc[0].tx_fifo_size = size1; in dsi_config_tx_fifo()
2154 dsi->vc[1].tx_fifo_size = size2; in dsi_config_tx_fifo()
2155 dsi->vc[2].tx_fifo_size = size3; in dsi_config_tx_fifo()
2156 dsi->vc[3].tx_fifo_size = size4; in dsi_config_tx_fifo()
2160 int size = dsi->vc[i].tx_fifo_size; in dsi_config_tx_fifo()
2174 dsi_write_reg(dsi, DSI_TX_FIFO_VC_SIZE, r); in dsi_config_tx_fifo()
2177 static void dsi_config_rx_fifo(struct dsi_data *dsi, in dsi_config_rx_fifo() argument
2185 dsi->vc[0].rx_fifo_size = size1; in dsi_config_rx_fifo()
2186 dsi->vc[1].rx_fifo_size = size2; in dsi_config_rx_fifo()
2187 dsi->vc[2].rx_fifo_size = size3; in dsi_config_rx_fifo()
2188 dsi->vc[3].rx_fifo_size = size4; in dsi_config_rx_fifo()
2192 int size = dsi->vc[i].rx_fifo_size; in dsi_config_rx_fifo()
2206 dsi_write_reg(dsi, DSI_RX_FIFO_VC_SIZE, r); in dsi_config_rx_fifo()
2209 static int dsi_force_tx_stop_mode_io(struct dsi_data *dsi) in dsi_force_tx_stop_mode_io() argument
2213 r = dsi_read_reg(dsi, DSI_TIMING1); in dsi_force_tx_stop_mode_io()
2215 dsi_write_reg(dsi, DSI_TIMING1, r); in dsi_force_tx_stop_mode_io()
2217 if (!wait_for_bit_change(dsi, DSI_TIMING1, 15, 0)) { in dsi_force_tx_stop_mode_io()
2225 static bool dsi_vc_is_enabled(struct dsi_data *dsi, int channel) in dsi_vc_is_enabled() argument
2227 return REG_GET(dsi, DSI_VC_CTRL(channel), 0, 0); in dsi_vc_is_enabled()
2234 struct dsi_data *dsi = vp_data->dsi; in dsi_packet_sent_handler_vp() local
2235 const int channel = dsi->update_channel; in dsi_packet_sent_handler_vp()
2236 u8 bit = dsi->te_enabled ? 30 : 31; in dsi_packet_sent_handler_vp()
2238 if (REG_GET(dsi, DSI_VC_TE(channel), bit, bit) == 0) in dsi_packet_sent_handler_vp()
2242 static int dsi_sync_vc_vp(struct dsi_data *dsi, int channel) in dsi_sync_vc_vp() argument
2246 .dsi = dsi, in dsi_sync_vc_vp()
2252 bit = dsi->te_enabled ? 30 : 31; in dsi_sync_vc_vp()
2254 r = dsi_register_isr_vc(dsi, channel, dsi_packet_sent_handler_vp, in dsi_sync_vc_vp()
2260 if (REG_GET(dsi, DSI_VC_TE(channel), bit, bit)) { in dsi_sync_vc_vp()
2269 dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_vp, in dsi_sync_vc_vp()
2274 dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_vp, in dsi_sync_vc_vp()
2284 struct dsi_data *dsi = l4_data->dsi; in dsi_packet_sent_handler_l4() local
2285 const int channel = dsi->update_channel; in dsi_packet_sent_handler_l4()
2287 if (REG_GET(dsi, DSI_VC_CTRL(channel), 5, 5) == 0) in dsi_packet_sent_handler_l4()
2291 static int dsi_sync_vc_l4(struct dsi_data *dsi, int channel) in dsi_sync_vc_l4() argument
2295 .dsi = dsi, in dsi_sync_vc_l4()
2300 r = dsi_register_isr_vc(dsi, channel, dsi_packet_sent_handler_l4, in dsi_sync_vc_l4()
2306 if (REG_GET(dsi, DSI_VC_CTRL(channel), 5, 5)) { in dsi_sync_vc_l4()
2315 dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_l4, in dsi_sync_vc_l4()
2320 dsi_unregister_isr_vc(dsi, channel, dsi_packet_sent_handler_l4, in dsi_sync_vc_l4()
2326 static int dsi_sync_vc(struct dsi_data *dsi, int channel) in dsi_sync_vc() argument
2328 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_sync_vc()
2332 if (!dsi_vc_is_enabled(dsi, channel)) in dsi_sync_vc()
2335 switch (dsi->vc[channel].source) { in dsi_sync_vc()
2337 return dsi_sync_vc_vp(dsi, channel); in dsi_sync_vc()
2339 return dsi_sync_vc_l4(dsi, channel); in dsi_sync_vc()
2346 static int dsi_vc_enable(struct dsi_data *dsi, int channel, bool enable) in dsi_vc_enable() argument
2353 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), enable, 0, 0); in dsi_vc_enable()
2355 if (!wait_for_bit_change(dsi, DSI_VC_CTRL(channel), 0, enable)) { in dsi_vc_enable()
2363 static void dsi_vc_initial_config(struct dsi_data *dsi, int channel) in dsi_vc_initial_config() argument
2369 r = dsi_read_reg(dsi, DSI_VC_CTRL(channel)); in dsi_vc_initial_config()
2382 if (dsi->data->quirks & DSI_QUIRK_VC_OCP_WIDTH) in dsi_vc_initial_config()
2388 dsi_write_reg(dsi, DSI_VC_CTRL(channel), r); in dsi_vc_initial_config()
2390 dsi->vc[channel].source = DSI_VC_SOURCE_L4; in dsi_vc_initial_config()
2393 static int dsi_vc_config_source(struct dsi_data *dsi, int channel, in dsi_vc_config_source() argument
2396 if (dsi->vc[channel].source == source) in dsi_vc_config_source()
2401 dsi_sync_vc(dsi, channel); in dsi_vc_config_source()
2403 dsi_vc_enable(dsi, channel, 0); in dsi_vc_config_source()
2406 if (!wait_for_bit_change(dsi, DSI_VC_CTRL(channel), 15, 0)) { in dsi_vc_config_source()
2412 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), source, 1, 1); in dsi_vc_config_source()
2415 if (dsi->data->quirks & DSI_QUIRK_DCS_CMD_CONFIG_VC) { in dsi_vc_config_source()
2417 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), enable, 30, 30); in dsi_vc_config_source()
2420 dsi_vc_enable(dsi, channel, 1); in dsi_vc_config_source()
2422 dsi->vc[channel].source = source; in dsi_vc_config_source()
2430 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_enable_hs() local
2434 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_enable_hs()
2436 dsi_vc_enable(dsi, channel, 0); in dsi_vc_enable_hs()
2437 dsi_if_enable(dsi, 0); in dsi_vc_enable_hs()
2439 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), enable, 9, 9); in dsi_vc_enable_hs()
2441 dsi_vc_enable(dsi, channel, 1); in dsi_vc_enable_hs()
2442 dsi_if_enable(dsi, 1); in dsi_vc_enable_hs()
2444 dsi_force_tx_stop_mode_io(dsi); in dsi_vc_enable_hs()
2447 if (dsi->vm_timings.ddr_clk_always_on && enable) in dsi_vc_enable_hs()
2448 dsi_vc_send_null(dsi, channel); in dsi_vc_enable_hs()
2451 static void dsi_vc_flush_long_data(struct dsi_data *dsi, int channel) in dsi_vc_flush_long_data() argument
2453 while (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { in dsi_vc_flush_long_data()
2455 val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel)); in dsi_vc_flush_long_data()
2501 static u16 dsi_vc_flush_receive_data(struct dsi_data *dsi, int channel) in dsi_vc_flush_receive_data() argument
2504 while (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { in dsi_vc_flush_receive_data()
2507 val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel)); in dsi_vc_flush_receive_data()
2522 dsi_vc_flush_long_data(dsi, channel); in dsi_vc_flush_receive_data()
2530 static int dsi_vc_send_bta(struct dsi_data *dsi, int channel) in dsi_vc_send_bta() argument
2532 if (dsi->debug_write || dsi->debug_read) in dsi_vc_send_bta()
2535 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_send_bta()
2538 if (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { in dsi_vc_send_bta()
2540 dsi_vc_flush_receive_data(dsi, channel); in dsi_vc_send_bta()
2543 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), 1, 6, 6); /* BTA_EN */ in dsi_vc_send_bta()
2546 dsi_read_reg(dsi, DSI_VC_CTRL(channel)); in dsi_vc_send_bta()
2553 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_send_bta_sync() local
2558 r = dsi_register_isr_vc(dsi, channel, dsi_completion_handler, in dsi_vc_send_bta_sync()
2563 r = dsi_register_isr(dsi, dsi_completion_handler, &completion, in dsi_vc_send_bta_sync()
2568 r = dsi_vc_send_bta(dsi, channel); in dsi_vc_send_bta_sync()
2579 err = dsi_get_errors(dsi); in dsi_vc_send_bta_sync()
2586 dsi_unregister_isr(dsi, dsi_completion_handler, &completion, in dsi_vc_send_bta_sync()
2589 dsi_unregister_isr_vc(dsi, channel, dsi_completion_handler, in dsi_vc_send_bta_sync()
2595 static inline void dsi_vc_write_long_header(struct dsi_data *dsi, int channel, in dsi_vc_write_long_header() argument
2601 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_write_long_header()
2603 data_id = data_type | dsi->vc[channel].vc_id << 6; in dsi_vc_write_long_header()
2608 dsi_write_reg(dsi, DSI_VC_LONG_PACKET_HEADER(channel), val); in dsi_vc_write_long_header()
2611 static inline void dsi_vc_write_long_payload(struct dsi_data *dsi, int channel, in dsi_vc_write_long_payload() argument
2621 dsi_write_reg(dsi, DSI_VC_LONG_PACKET_PAYLOAD(channel), val); in dsi_vc_write_long_payload()
2624 static int dsi_vc_send_long(struct dsi_data *dsi, int channel, u8 data_type, in dsi_vc_send_long() argument
2633 if (dsi->debug_write) in dsi_vc_send_long()
2637 if (dsi->vc[channel].tx_fifo_size * 32 * 4 < len + 4) { in dsi_vc_send_long()
2642 dsi_vc_config_source(dsi, channel, DSI_VC_SOURCE_L4); in dsi_vc_send_long()
2644 dsi_vc_write_long_header(dsi, channel, data_type, len, ecc); in dsi_vc_send_long()
2648 if (dsi->debug_write) in dsi_vc_send_long()
2656 dsi_vc_write_long_payload(dsi, channel, b1, b2, b3, b4); in dsi_vc_send_long()
2663 if (dsi->debug_write) in dsi_vc_send_long()
2681 dsi_vc_write_long_payload(dsi, channel, b1, b2, b3, 0); in dsi_vc_send_long()
2687 static int dsi_vc_send_short(struct dsi_data *dsi, int channel, u8 data_type, in dsi_vc_send_short() argument
2693 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_vc_send_short()
2695 if (dsi->debug_write) in dsi_vc_send_short()
2700 dsi_vc_config_source(dsi, channel, DSI_VC_SOURCE_L4); in dsi_vc_send_short()
2702 if (FLD_GET(dsi_read_reg(dsi, DSI_VC_CTRL(channel)), 16, 16)) { in dsi_vc_send_short()
2707 data_id = data_type | dsi->vc[channel].vc_id << 6; in dsi_vc_send_short()
2711 dsi_write_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel), r); in dsi_vc_send_short()
2716 static int dsi_vc_send_null(struct dsi_data *dsi, int channel) in dsi_vc_send_null() argument
2718 return dsi_vc_send_long(dsi, channel, MIPI_DSI_NULL_PACKET, NULL, 0, 0); in dsi_vc_send_null()
2721 static int dsi_vc_write_nosync_common(struct dsi_data *dsi, int channel, in dsi_vc_write_nosync_common() argument
2729 r = dsi_vc_send_short(dsi, channel, in dsi_vc_write_nosync_common()
2732 r = dsi_vc_send_short(dsi, channel, in dsi_vc_write_nosync_common()
2737 r = dsi_vc_send_short(dsi, channel, in dsi_vc_write_nosync_common()
2743 r = dsi_vc_send_long(dsi, channel, in dsi_vc_write_nosync_common()
2755 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_dcs_write_nosync() local
2757 return dsi_vc_write_nosync_common(dsi, channel, data, len, in dsi_vc_dcs_write_nosync()
2764 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_generic_write_nosync() local
2766 return dsi_vc_write_nosync_common(dsi, channel, data, len, in dsi_vc_generic_write_nosync()
2774 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_write_common() local
2777 r = dsi_vc_write_nosync_common(dsi, channel, data, len, type); in dsi_vc_write_common()
2786 if (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20)) { in dsi_vc_write_common()
2788 dsi_vc_flush_receive_data(dsi, channel); in dsi_vc_write_common()
2814 static int dsi_vc_dcs_send_read_request(struct dsi_data *dsi, int channel, in dsi_vc_dcs_send_read_request() argument
2819 if (dsi->debug_read) in dsi_vc_dcs_send_read_request()
2823 r = dsi_vc_send_short(dsi, channel, MIPI_DSI_DCS_READ, dcs_cmd, 0); in dsi_vc_dcs_send_read_request()
2833 static int dsi_vc_generic_send_read_request(struct dsi_data *dsi, int channel, in dsi_vc_generic_send_read_request() argument
2840 if (dsi->debug_read) in dsi_vc_generic_send_read_request()
2858 r = dsi_vc_send_short(dsi, channel, data_type, data, 0); in dsi_vc_generic_send_read_request()
2868 static int dsi_vc_read_rx_fifo(struct dsi_data *dsi, int channel, u8 *buf, in dsi_vc_read_rx_fifo() argument
2876 if (REG_GET(dsi, DSI_VC_CTRL(channel), 20, 20) == 0) { in dsi_vc_read_rx_fifo()
2882 val = dsi_read_reg(dsi, DSI_VC_SHORT_PACKET_HEADER(channel)); in dsi_vc_read_rx_fifo()
2883 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2896 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2913 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2932 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2945 val = dsi_read_reg(dsi, in dsi_vc_read_rx_fifo()
2947 if (dsi->debug_read) in dsi_vc_read_rx_fifo()
2979 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_dcs_read() local
2982 r = dsi_vc_dcs_send_read_request(dsi, channel, dcs_cmd); in dsi_vc_dcs_read()
2990 r = dsi_vc_read_rx_fifo(dsi, channel, buf, buflen, in dsi_vc_dcs_read()
3009 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_generic_read() local
3012 r = dsi_vc_generic_send_read_request(dsi, channel, reqdata, reqlen); in dsi_vc_generic_read()
3020 r = dsi_vc_read_rx_fifo(dsi, channel, buf, buflen, in dsi_vc_generic_read()
3036 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_vc_set_max_rx_packet_size() local
3038 return dsi_vc_send_short(dsi, channel, in dsi_vc_set_max_rx_packet_size()
3042 static int dsi_enter_ulps(struct dsi_data *dsi) in dsi_enter_ulps() argument
3050 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_enter_ulps()
3052 WARN_ON(dsi->ulps_enabled); in dsi_enter_ulps()
3054 if (dsi->ulps_enabled) in dsi_enter_ulps()
3058 if (REG_GET(dsi, DSI_CLK_CTRL, 13, 13)) { in dsi_enter_ulps()
3059 dsi_if_enable(dsi, 0); in dsi_enter_ulps()
3060 REG_FLD_MOD(dsi, DSI_CLK_CTRL, 0, 13, 13); in dsi_enter_ulps()
3061 dsi_if_enable(dsi, 1); in dsi_enter_ulps()
3064 dsi_sync_vc(dsi, 0); in dsi_enter_ulps()
3065 dsi_sync_vc(dsi, 1); in dsi_enter_ulps()
3066 dsi_sync_vc(dsi, 2); in dsi_enter_ulps()
3067 dsi_sync_vc(dsi, 3); in dsi_enter_ulps()
3069 dsi_force_tx_stop_mode_io(dsi); in dsi_enter_ulps()
3071 dsi_vc_enable(dsi, 0, false); in dsi_enter_ulps()
3072 dsi_vc_enable(dsi, 1, false); in dsi_enter_ulps()
3073 dsi_vc_enable(dsi, 2, false); in dsi_enter_ulps()
3074 dsi_vc_enable(dsi, 3, false); in dsi_enter_ulps()
3076 if (REG_GET(dsi, DSI_COMPLEXIO_CFG2, 16, 16)) { /* HS_BUSY */ in dsi_enter_ulps()
3081 if (REG_GET(dsi, DSI_COMPLEXIO_CFG2, 17, 17)) { /* LP_BUSY */ in dsi_enter_ulps()
3086 r = dsi_register_isr_cio(dsi, dsi_completion_handler, &completion, in dsi_enter_ulps()
3093 for (i = 0; i < dsi->num_lanes_supported; ++i) { in dsi_enter_ulps()
3094 if (dsi->lanes[i].function == DSI_LANE_UNUSED) in dsi_enter_ulps()
3100 REG_FLD_MOD(dsi, DSI_COMPLEXIO_CFG2, mask, 9, 5); in dsi_enter_ulps()
3103 dsi_read_reg(dsi, DSI_COMPLEXIO_CFG2); in dsi_enter_ulps()
3112 dsi_unregister_isr_cio(dsi, dsi_completion_handler, &completion, in dsi_enter_ulps()
3116 REG_FLD_MOD(dsi, DSI_COMPLEXIO_CFG2, 0, 9, 5); in dsi_enter_ulps()
3119 dsi_read_reg(dsi, DSI_COMPLEXIO_CFG2); in dsi_enter_ulps()
3121 dsi_cio_power(dsi, DSI_COMPLEXIO_POWER_ULPS); in dsi_enter_ulps()
3123 dsi_if_enable(dsi, false); in dsi_enter_ulps()
3125 dsi->ulps_enabled = true; in dsi_enter_ulps()
3130 dsi_unregister_isr_cio(dsi, dsi_completion_handler, &completion, in dsi_enter_ulps()
3135 static void dsi_set_lp_rx_timeout(struct dsi_data *dsi, unsigned int ticks, in dsi_set_lp_rx_timeout() argument
3145 fck = dsi_fclk_rate(dsi); in dsi_set_lp_rx_timeout()
3147 r = dsi_read_reg(dsi, DSI_TIMING2); in dsi_set_lp_rx_timeout()
3152 dsi_write_reg(dsi, DSI_TIMING2, r); in dsi_set_lp_rx_timeout()
3162 static void dsi_set_ta_timeout(struct dsi_data *dsi, unsigned int ticks, in dsi_set_ta_timeout() argument
3172 fck = dsi_fclk_rate(dsi); in dsi_set_ta_timeout()
3174 r = dsi_read_reg(dsi, DSI_TIMING1); in dsi_set_ta_timeout()
3179 dsi_write_reg(dsi, DSI_TIMING1, r); in dsi_set_ta_timeout()
3189 static void dsi_set_stop_state_counter(struct dsi_data *dsi, unsigned int ticks, in dsi_set_stop_state_counter() argument
3199 fck = dsi_fclk_rate(dsi); in dsi_set_stop_state_counter()
3201 r = dsi_read_reg(dsi, DSI_TIMING1); in dsi_set_stop_state_counter()
3206 dsi_write_reg(dsi, DSI_TIMING1, r); in dsi_set_stop_state_counter()
3216 static void dsi_set_hs_tx_timeout(struct dsi_data *dsi, unsigned int ticks, in dsi_set_hs_tx_timeout() argument
3226 fck = dsi_get_txbyteclkhs(dsi); in dsi_set_hs_tx_timeout()
3228 r = dsi_read_reg(dsi, DSI_TIMING2); in dsi_set_hs_tx_timeout()
3233 dsi_write_reg(dsi, DSI_TIMING2, r); in dsi_set_hs_tx_timeout()
3243 static void dsi_config_vp_num_line_buffers(struct dsi_data *dsi) in dsi_config_vp_num_line_buffers() argument
3247 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_config_vp_num_line_buffers()
3248 int bpp = dsi_get_pixel_size(dsi->pix_fmt); in dsi_config_vp_num_line_buffers()
3249 const struct videomode *vm = &dsi->vm; in dsi_config_vp_num_line_buffers()
3254 if (dsi->line_buffer_size <= vm->hactive * bpp / 8) in dsi_config_vp_num_line_buffers()
3264 REG_FLD_MOD(dsi, DSI_CTRL, num_line_buffers, 13, 12); in dsi_config_vp_num_line_buffers()
3267 static void dsi_config_vp_sync_events(struct dsi_data *dsi) in dsi_config_vp_sync_events() argument
3272 if (dsi->vm_timings.trans_mode == OMAP_DSS_DSI_PULSE_MODE) in dsi_config_vp_sync_events()
3277 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_config_vp_sync_events()
3285 dsi_write_reg(dsi, DSI_CTRL, r); in dsi_config_vp_sync_events()
3288 static void dsi_config_blanking_modes(struct dsi_data *dsi) in dsi_config_blanking_modes() argument
3290 int blanking_mode = dsi->vm_timings.blanking_mode; in dsi_config_blanking_modes()
3291 int hfp_blanking_mode = dsi->vm_timings.hfp_blanking_mode; in dsi_config_blanking_modes()
3292 int hbp_blanking_mode = dsi->vm_timings.hbp_blanking_mode; in dsi_config_blanking_modes()
3293 int hsa_blanking_mode = dsi->vm_timings.hsa_blanking_mode; in dsi_config_blanking_modes()
3300 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_config_blanking_modes()
3305 dsi_write_reg(dsi, DSI_CTRL, r); in dsi_config_blanking_modes()
3370 static void dsi_config_cmd_mode_interleaving(struct dsi_data *dsi) in dsi_config_cmd_mode_interleaving() argument
3378 const struct videomode *vm = &dsi->vm; in dsi_config_cmd_mode_interleaving()
3379 int bpp = dsi_get_pixel_size(dsi->pix_fmt); in dsi_config_cmd_mode_interleaving()
3380 int ndl = dsi->num_lanes_used - 1; in dsi_config_cmd_mode_interleaving()
3381 int dsi_fclk_hsdiv = dsi->user_dsi_cinfo.mX[HSDIV_DSI] + 1; in dsi_config_cmd_mode_interleaving()
3388 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_config_cmd_mode_interleaving()
3394 r = dsi_read_reg(dsi, DSI_VM_TIMING1); in dsi_config_cmd_mode_interleaving()
3399 r = dsi_read_reg(dsi, DSI_CLK_TIMING); in dsi_config_cmd_mode_interleaving()
3403 r = dsi_read_reg(dsi, DSI_VM_TIMING7); in dsi_config_cmd_mode_interleaving()
3407 r = dsi_read_reg(dsi, DSI_CLK_CTRL); in dsi_config_cmd_mode_interleaving()
3411 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG0); in dsi_config_cmd_mode_interleaving()
3414 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG1); in dsi_config_cmd_mode_interleaving()
3460 DSSDBG("DSI HS interleaving(TXBYTECLKHS) HSA %d, HFP %d, HBP %d, BLLP %d\n", in dsi_config_cmd_mode_interleaving()
3464 DSSDBG("DSI LP interleaving(bytes) HSA %d, HFP %d, HBP %d, BLLP %d\n", in dsi_config_cmd_mode_interleaving()
3468 r = dsi_read_reg(dsi, DSI_VM_TIMING4); in dsi_config_cmd_mode_interleaving()
3472 dsi_write_reg(dsi, DSI_VM_TIMING4, r); in dsi_config_cmd_mode_interleaving()
3474 r = dsi_read_reg(dsi, DSI_VM_TIMING5); in dsi_config_cmd_mode_interleaving()
3478 dsi_write_reg(dsi, DSI_VM_TIMING5, r); in dsi_config_cmd_mode_interleaving()
3480 r = dsi_read_reg(dsi, DSI_VM_TIMING6); in dsi_config_cmd_mode_interleaving()
3483 dsi_write_reg(dsi, DSI_VM_TIMING6, r); in dsi_config_cmd_mode_interleaving()
3486 static int dsi_proto_config(struct dsi_data *dsi) in dsi_proto_config() argument
3491 dsi_config_tx_fifo(dsi, DSI_FIFO_SIZE_32, in dsi_proto_config()
3496 dsi_config_rx_fifo(dsi, DSI_FIFO_SIZE_32, in dsi_proto_config()
3502 dsi_set_stop_state_counter(dsi, 0x1000, false, false); in dsi_proto_config()
3503 dsi_set_ta_timeout(dsi, 0x1fff, true, true); in dsi_proto_config()
3504 dsi_set_lp_rx_timeout(dsi, 0x1fff, true, true); in dsi_proto_config()
3505 dsi_set_hs_tx_timeout(dsi, 0x1fff, true, true); in dsi_proto_config()
3507 switch (dsi_get_pixel_size(dsi->pix_fmt)) { in dsi_proto_config()
3522 r = dsi_read_reg(dsi, DSI_CTRL); in dsi_proto_config()
3531 if (!(dsi->data->quirks & DSI_QUIRK_DCS_CMD_CONFIG_VC)) { in dsi_proto_config()
3537 dsi_write_reg(dsi, DSI_CTRL, r); in dsi_proto_config()
3539 dsi_config_vp_num_line_buffers(dsi); in dsi_proto_config()
3541 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_proto_config()
3542 dsi_config_vp_sync_events(dsi); in dsi_proto_config()
3543 dsi_config_blanking_modes(dsi); in dsi_proto_config()
3544 dsi_config_cmd_mode_interleaving(dsi); in dsi_proto_config()
3547 dsi_vc_initial_config(dsi, 0); in dsi_proto_config()
3548 dsi_vc_initial_config(dsi, 1); in dsi_proto_config()
3549 dsi_vc_initial_config(dsi, 2); in dsi_proto_config()
3550 dsi_vc_initial_config(dsi, 3); in dsi_proto_config()
3555 static void dsi_proto_timings(struct dsi_data *dsi) in dsi_proto_timings() argument
3564 int ndl = dsi->num_lanes_used - 1; in dsi_proto_timings()
3567 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG0); in dsi_proto_timings()
3574 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG1); in dsi_proto_timings()
3578 r = dsi_read_reg(dsi, DSI_DSIPHY_CFG2); in dsi_proto_timings()
3584 tclk_post = ns2ddr(dsi, 60) + 26; in dsi_proto_timings()
3595 r = dsi_read_reg(dsi, DSI_CLK_TIMING); in dsi_proto_timings()
3598 dsi_write_reg(dsi, DSI_CLK_TIMING, r); in dsi_proto_timings()
3612 dsi_write_reg(dsi, DSI_VM_TIMING7, r); in dsi_proto_timings()
3617 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_proto_timings()
3619 int hsa = dsi->vm_timings.hsa; in dsi_proto_timings()
3620 int hfp = dsi->vm_timings.hfp; in dsi_proto_timings()
3621 int hbp = dsi->vm_timings.hbp; in dsi_proto_timings()
3622 int vsa = dsi->vm_timings.vsa; in dsi_proto_timings()
3623 int vfp = dsi->vm_timings.vfp; in dsi_proto_timings()
3624 int vbp = dsi->vm_timings.vbp; in dsi_proto_timings()
3625 int window_sync = dsi->vm_timings.window_sync; in dsi_proto_timings()
3627 const struct videomode *vm = &dsi->vm; in dsi_proto_timings()
3628 int bpp = dsi_get_pixel_size(dsi->pix_fmt); in dsi_proto_timings()
3631 hsync_end = dsi->vm_timings.trans_mode == OMAP_DSS_DSI_PULSE_MODE; in dsi_proto_timings()
3646 r = dsi_read_reg(dsi, DSI_VM_TIMING1); in dsi_proto_timings()
3650 dsi_write_reg(dsi, DSI_VM_TIMING1, r); in dsi_proto_timings()
3652 r = dsi_read_reg(dsi, DSI_VM_TIMING2); in dsi_proto_timings()
3657 dsi_write_reg(dsi, DSI_VM_TIMING2, r); in dsi_proto_timings()
3659 r = dsi_read_reg(dsi, DSI_VM_TIMING3); in dsi_proto_timings()
3662 dsi_write_reg(dsi, DSI_VM_TIMING3, r); in dsi_proto_timings()
3669 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_configure_pins() local
3687 if (num_pins < 4 || num_pins > dsi->num_lanes_supported * 2 in dsi_configure_pins()
3703 if (dx < 0 || dx >= dsi->num_lanes_supported * 2) in dsi_configure_pins()
3706 if (dy < 0 || dy >= dsi->num_lanes_supported * 2) in dsi_configure_pins()
3726 memcpy(dsi->lanes, lanes, sizeof(dsi->lanes)); in dsi_configure_pins()
3727 dsi->num_lanes_used = num_lanes; in dsi_configure_pins()
3734 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_enable_video_output() local
3735 int bpp = dsi_get_pixel_size(dsi->pix_fmt); in dsi_enable_video_output()
3740 r = dsi_display_init_dispc(dsi); in dsi_enable_video_output()
3744 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_enable_video_output()
3745 switch (dsi->pix_fmt) { in dsi_enable_video_output()
3763 dsi_if_enable(dsi, false); in dsi_enable_video_output()
3764 dsi_vc_enable(dsi, channel, false); in dsi_enable_video_output()
3767 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), 1, 4, 4); in dsi_enable_video_output()
3769 word_count = DIV_ROUND_UP(dsi->vm.hactive * bpp, 8); in dsi_enable_video_output()
3771 dsi_vc_write_long_header(dsi, channel, data_type, in dsi_enable_video_output()
3774 dsi_vc_enable(dsi, channel, true); in dsi_enable_video_output()
3775 dsi_if_enable(dsi, true); in dsi_enable_video_output()
3778 r = dss_mgr_enable(&dsi->output); in dsi_enable_video_output()
3785 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_enable_video_output()
3786 dsi_if_enable(dsi, false); in dsi_enable_video_output()
3787 dsi_vc_enable(dsi, channel, false); in dsi_enable_video_output()
3790 dsi_display_uninit_dispc(dsi); in dsi_enable_video_output()
3796 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_disable_video_output() local
3798 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { in dsi_disable_video_output()
3799 dsi_if_enable(dsi, false); in dsi_disable_video_output()
3800 dsi_vc_enable(dsi, channel, false); in dsi_disable_video_output()
3803 REG_FLD_MOD(dsi, DSI_VC_CTRL(channel), 0, 4, 4); in dsi_disable_video_output()
3805 dsi_vc_enable(dsi, channel, true); in dsi_disable_video_output()
3806 dsi_if_enable(dsi, true); in dsi_disable_video_output()
3809 dss_mgr_disable(&dsi->output); in dsi_disable_video_output()
3811 dsi_display_uninit_dispc(dsi); in dsi_disable_video_output()
3814 static void dsi_update_screen_dispc(struct dsi_data *dsi) in dsi_update_screen_dispc() argument
3824 const unsigned channel = dsi->update_channel; in dsi_update_screen_dispc()
3825 const unsigned int line_buf_size = dsi->line_buffer_size; in dsi_update_screen_dispc()
3826 u16 w = dsi->vm.hactive; in dsi_update_screen_dispc()
3827 u16 h = dsi->vm.vactive; in dsi_update_screen_dispc()
3831 dsi_vc_config_source(dsi, channel, DSI_VC_SOURCE_VP); in dsi_update_screen_dispc()
3833 bytespp = dsi_get_pixel_size(dsi->pix_fmt) / 8; in dsi_update_screen_dispc()
3852 dsi_write_reg(dsi, DSI_VC_TE(channel), l); in dsi_update_screen_dispc()
3854 dsi_vc_write_long_header(dsi, channel, MIPI_DSI_DCS_LONG_WRITE, in dsi_update_screen_dispc()
3857 if (dsi->te_enabled) in dsi_update_screen_dispc()
3861 dsi_write_reg(dsi, DSI_VC_TE(channel), l); in dsi_update_screen_dispc()
3869 dispc_disable_sidle(dsi->dss->dispc); in dsi_update_screen_dispc()
3871 dsi_perf_mark_start(dsi); in dsi_update_screen_dispc()
3873 r = schedule_delayed_work(&dsi->framedone_timeout_work, in dsi_update_screen_dispc()
3877 dss_mgr_start_update(&dsi->output); in dsi_update_screen_dispc()
3879 if (dsi->te_enabled) { in dsi_update_screen_dispc()
3882 REG_FLD_MOD(dsi, DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */ in dsi_update_screen_dispc()
3884 dsi_vc_send_bta(dsi, channel); in dsi_update_screen_dispc()
3887 mod_timer(&dsi->te_timer, jiffies + msecs_to_jiffies(250)); in dsi_update_screen_dispc()
3899 static void dsi_handle_framedone(struct dsi_data *dsi, int error) in dsi_handle_framedone() argument
3902 dispc_enable_sidle(dsi->dss->dispc); in dsi_handle_framedone()
3904 if (dsi->te_enabled) { in dsi_handle_framedone()
3906 REG_FLD_MOD(dsi, DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */ in dsi_handle_framedone()
3909 dsi->framedone_callback(error, dsi->framedone_data); in dsi_handle_framedone()
3912 dsi_perf_show(dsi, "DISPC"); in dsi_handle_framedone()
3917 struct dsi_data *dsi = container_of(work, struct dsi_data, in dsi_framedone_timeout_work_callback() local
3924 * DSI */ in dsi_framedone_timeout_work_callback()
3928 dsi_handle_framedone(dsi, -ETIMEDOUT); in dsi_framedone_timeout_work_callback()
3933 struct dsi_data *dsi = data; in dsi_framedone_irq_callback() local
3936 * turns itself off. However, DSI still has the pixels in its buffers, in dsi_framedone_irq_callback()
3940 cancel_delayed_work(&dsi->framedone_timeout_work); in dsi_framedone_irq_callback()
3942 dsi_handle_framedone(dsi, 0); in dsi_framedone_irq_callback()
3948 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_update() local
3951 dsi_perf_mark_setup(dsi); in dsi_update()
3953 dsi->update_channel = channel; in dsi_update()
3955 dsi->framedone_callback = callback; in dsi_update()
3956 dsi->framedone_data = data; in dsi_update()
3958 dw = dsi->vm.hactive; in dsi_update()
3959 dh = dsi->vm.vactive; in dsi_update()
3962 dsi->update_bytes = dw * dh * in dsi_update()
3963 dsi_get_pixel_size(dsi->pix_fmt) / 8; in dsi_update()
3965 dsi_update_screen_dispc(dsi); in dsi_update()
3972 static int dsi_configure_dispc_clocks(struct dsi_data *dsi) in dsi_configure_dispc_clocks() argument
3978 fck = dsi_get_pll_hsdiv_dispc_rate(dsi); in dsi_configure_dispc_clocks()
3980 dispc_cinfo.lck_div = dsi->user_dispc_cinfo.lck_div; in dsi_configure_dispc_clocks()
3981 dispc_cinfo.pck_div = dsi->user_dispc_cinfo.pck_div; in dsi_configure_dispc_clocks()
3983 r = dispc_calc_clock_rates(dsi->dss->dispc, fck, &dispc_cinfo); in dsi_configure_dispc_clocks()
3989 dsi->mgr_config.clock_info = dispc_cinfo; in dsi_configure_dispc_clocks()
3994 static int dsi_display_init_dispc(struct dsi_data *dsi) in dsi_display_init_dispc() argument
3996 enum omap_channel channel = dsi->output.dispc_channel; in dsi_display_init_dispc()
3999 dss_select_lcd_clk_source(dsi->dss, channel, dsi->module_id == 0 ? in dsi_display_init_dispc()
4003 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) { in dsi_display_init_dispc()
4004 r = dss_mgr_register_framedone_handler(&dsi->output, in dsi_display_init_dispc()
4005 dsi_framedone_irq_callback, dsi); in dsi_display_init_dispc()
4011 dsi->mgr_config.stallmode = true; in dsi_display_init_dispc()
4012 dsi->mgr_config.fifohandcheck = true; in dsi_display_init_dispc()
4014 dsi->mgr_config.stallmode = false; in dsi_display_init_dispc()
4015 dsi->mgr_config.fifohandcheck = false; in dsi_display_init_dispc()
4018 r = dsi_configure_dispc_clocks(dsi); in dsi_display_init_dispc()
4022 dsi->mgr_config.io_pad_mode = DSS_IO_PAD_MODE_BYPASS; in dsi_display_init_dispc()
4023 dsi->mgr_config.video_port_width = in dsi_display_init_dispc()
4024 dsi_get_pixel_size(dsi->pix_fmt); in dsi_display_init_dispc()
4025 dsi->mgr_config.lcden_sig_polarity = 0; in dsi_display_init_dispc()
4027 dss_mgr_set_lcd_config(&dsi->output, &dsi->mgr_config); in dsi_display_init_dispc()
4031 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) in dsi_display_init_dispc()
4032 dss_mgr_unregister_framedone_handler(&dsi->output, in dsi_display_init_dispc()
4033 dsi_framedone_irq_callback, dsi); in dsi_display_init_dispc()
4035 dss_select_lcd_clk_source(dsi->dss, channel, DSS_CLK_SRC_FCK); in dsi_display_init_dispc()
4039 static void dsi_display_uninit_dispc(struct dsi_data *dsi) in dsi_display_uninit_dispc() argument
4041 enum omap_channel channel = dsi->output.dispc_channel; in dsi_display_uninit_dispc()
4043 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) in dsi_display_uninit_dispc()
4044 dss_mgr_unregister_framedone_handler(&dsi->output, in dsi_display_uninit_dispc()
4045 dsi_framedone_irq_callback, dsi); in dsi_display_uninit_dispc()
4047 dss_select_lcd_clk_source(dsi->dss, channel, DSS_CLK_SRC_FCK); in dsi_display_uninit_dispc()
4050 static int dsi_configure_dsi_clocks(struct dsi_data *dsi) in dsi_configure_dsi_clocks() argument
4055 cinfo = dsi->user_dsi_cinfo; in dsi_configure_dsi_clocks()
4057 r = dss_pll_set_config(&dsi->pll, &cinfo); in dsi_configure_dsi_clocks()
4059 DSSERR("Failed to set dsi clocks\n"); in dsi_configure_dsi_clocks()
4066 static int dsi_display_init_dsi(struct dsi_data *dsi) in dsi_display_init_dsi() argument
4070 r = dss_pll_enable(&dsi->pll); in dsi_display_init_dsi()
4074 r = dsi_configure_dsi_clocks(dsi); in dsi_display_init_dsi()
4078 dss_select_dsi_clk_source(dsi->dss, dsi->module_id, in dsi_display_init_dsi()
4079 dsi->module_id == 0 ? in dsi_display_init_dsi()
4084 if (!dsi->vdds_dsi_enabled) { in dsi_display_init_dsi()
4085 r = regulator_enable(dsi->vdds_dsi_reg); in dsi_display_init_dsi()
4089 dsi->vdds_dsi_enabled = true; in dsi_display_init_dsi()
4092 r = dsi_cio_init(dsi); in dsi_display_init_dsi()
4096 _dsi_print_reset_status(dsi); in dsi_display_init_dsi()
4098 dsi_proto_timings(dsi); in dsi_display_init_dsi()
4099 dsi_set_lp_clk_divisor(dsi); in dsi_display_init_dsi()
4102 _dsi_print_reset_status(dsi); in dsi_display_init_dsi()
4104 r = dsi_proto_config(dsi); in dsi_display_init_dsi()
4109 dsi_vc_enable(dsi, 0, 1); in dsi_display_init_dsi()
4110 dsi_vc_enable(dsi, 1, 1); in dsi_display_init_dsi()
4111 dsi_vc_enable(dsi, 2, 1); in dsi_display_init_dsi()
4112 dsi_vc_enable(dsi, 3, 1); in dsi_display_init_dsi()
4113 dsi_if_enable(dsi, 1); in dsi_display_init_dsi()
4114 dsi_force_tx_stop_mode_io(dsi); in dsi_display_init_dsi()
4118 dsi_cio_uninit(dsi); in dsi_display_init_dsi()
4120 regulator_disable(dsi->vdds_dsi_reg); in dsi_display_init_dsi()
4121 dsi->vdds_dsi_enabled = false; in dsi_display_init_dsi()
4123 dss_select_dsi_clk_source(dsi->dss, dsi->module_id, DSS_CLK_SRC_FCK); in dsi_display_init_dsi()
4125 dss_pll_disable(&dsi->pll); in dsi_display_init_dsi()
4130 static void dsi_display_uninit_dsi(struct dsi_data *dsi, bool disconnect_lanes, in dsi_display_uninit_dsi() argument
4133 if (enter_ulps && !dsi->ulps_enabled) in dsi_display_uninit_dsi()
4134 dsi_enter_ulps(dsi); in dsi_display_uninit_dsi()
4137 dsi_if_enable(dsi, 0); in dsi_display_uninit_dsi()
4138 dsi_vc_enable(dsi, 0, 0); in dsi_display_uninit_dsi()
4139 dsi_vc_enable(dsi, 1, 0); in dsi_display_uninit_dsi()
4140 dsi_vc_enable(dsi, 2, 0); in dsi_display_uninit_dsi()
4141 dsi_vc_enable(dsi, 3, 0); in dsi_display_uninit_dsi()
4143 dss_select_dsi_clk_source(dsi->dss, dsi->module_id, DSS_CLK_SRC_FCK); in dsi_display_uninit_dsi()
4144 dsi_cio_uninit(dsi); in dsi_display_uninit_dsi()
4145 dss_pll_disable(&dsi->pll); in dsi_display_uninit_dsi()
4148 regulator_disable(dsi->vdds_dsi_reg); in dsi_display_uninit_dsi()
4149 dsi->vdds_dsi_enabled = false; in dsi_display_uninit_dsi()
4155 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_display_enable() local
4160 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_display_enable()
4162 mutex_lock(&dsi->lock); in dsi_display_enable()
4164 r = dsi_runtime_get(dsi); in dsi_display_enable()
4168 _dsi_initialize_irq(dsi); in dsi_display_enable()
4170 r = dsi_display_init_dsi(dsi); in dsi_display_enable()
4174 mutex_unlock(&dsi->lock); in dsi_display_enable()
4179 dsi_runtime_put(dsi); in dsi_display_enable()
4181 mutex_unlock(&dsi->lock); in dsi_display_enable()
4188 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_display_disable() local
4192 WARN_ON(!dsi_bus_is_locked(dsi)); in dsi_display_disable()
4194 mutex_lock(&dsi->lock); in dsi_display_disable()
4196 dsi_sync_vc(dsi, 0); in dsi_display_disable()
4197 dsi_sync_vc(dsi, 1); in dsi_display_disable()
4198 dsi_sync_vc(dsi, 2); in dsi_display_disable()
4199 dsi_sync_vc(dsi, 3); in dsi_display_disable()
4201 dsi_display_uninit_dsi(dsi, disconnect_lanes, enter_ulps); in dsi_display_disable()
4203 dsi_runtime_put(dsi); in dsi_display_disable()
4205 mutex_unlock(&dsi->lock); in dsi_display_disable()
4210 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_enable_te() local
4212 dsi->te_enabled = enable; in dsi_enable_te()
4331 return dispc_div_calc(ctx->dsi->dss->dispc, dispc, in dsi_cm_calc_hsdiv_cb()
4340 struct dsi_data *dsi = ctx->dsi; in dsi_cm_calc_pll_cb() local
4348 dsi->data->max_fck_freq, in dsi_cm_calc_pll_cb()
4352 static bool dsi_cm_calc(struct dsi_data *dsi, in dsi_cm_calc() argument
4361 clkin = clk_get_rate(dsi->pll.clkin); in dsi_cm_calc()
4363 ndl = dsi->num_lanes_used - 1; in dsi_cm_calc()
4376 ctx->dsi = dsi; in dsi_cm_calc()
4377 ctx->pll = &dsi->pll; in dsi_cm_calc()
4393 struct dsi_data *dsi = ctx->dsi; in dsi_vm_calc_blanking() local
4396 int ndl = dsi->num_lanes_used - 1; in dsi_vm_calc_blanking()
4430 * When there are no line buffers, DISPC and DSI must have the in dsi_vm_calc_blanking()
4431 * same tput. Otherwise DISPC tput needs to be higher than DSI's. in dsi_vm_calc_blanking()
4433 if (dsi->line_buffer_size < xres * bitspp / 8) { in dsi_vm_calc_blanking()
4441 /* DSI tput must be over the min requirement */ in dsi_vm_calc_blanking()
4445 /* When non-burst mode, DSI tput must be below max requirement. */ in dsi_vm_calc_blanking()
4462 /* DSI htot to match the panel's nominal pck */ in dsi_vm_calc_blanking()
4469 /* total DSI blanking needed to achieve panel's TL */ in dsi_vm_calc_blanking()
4472 /* DISPC htot to match the DSI TL */ in dsi_vm_calc_blanking()
4475 /* verify that the DSI and DISPC TLs are the same */ in dsi_vm_calc_blanking()
4481 /* setup DSI videomode */ in dsi_vm_calc_blanking()
4605 print_dsi_vm("dsi ", &ctx->dsi_vm); in dsi_vm_calc_dispc_cb()
4632 return dispc_div_calc(ctx->dsi->dss->dispc, dispc, in dsi_vm_calc_hsdiv_cb()
4641 struct dsi_data *dsi = ctx->dsi; in dsi_vm_calc_pll_cb() local
4649 dsi->data->max_fck_freq, in dsi_vm_calc_pll_cb()
4653 static bool dsi_vm_calc(struct dsi_data *dsi, in dsi_vm_calc() argument
4661 int ndl = dsi->num_lanes_used - 1; in dsi_vm_calc()
4665 clkin = clk_get_rate(dsi->pll.clkin); in dsi_vm_calc()
4668 ctx->dsi = dsi; in dsi_vm_calc()
4669 ctx->pll = &dsi->pll; in dsi_vm_calc()
4698 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_set_config() local
4703 mutex_lock(&dsi->lock); in dsi_set_config()
4705 dsi->pix_fmt = config->pixel_format; in dsi_set_config()
4706 dsi->mode = config->mode; in dsi_set_config()
4709 ok = dsi_vm_calc(dsi, config, &ctx); in dsi_set_config()
4711 ok = dsi_cm_calc(dsi, config, &ctx); in dsi_set_config()
4714 DSSERR("failed to find suitable DSI clock settings\n"); in dsi_set_config()
4719 dsi_pll_calc_dsi_fck(dsi, &ctx.dsi_cinfo); in dsi_set_config()
4722 config->lp_clk_min, config->lp_clk_max, &dsi->user_lp_cinfo); in dsi_set_config()
4724 DSSERR("failed to find suitable DSI LP clock settings\n"); in dsi_set_config()
4728 dsi->user_dsi_cinfo = ctx.dsi_cinfo; in dsi_set_config()
4729 dsi->user_dispc_cinfo = ctx.dispc_cinfo; in dsi_set_config()
4731 dsi->vm = ctx.vm; in dsi_set_config()
4737 dsi->vm.flags &= ~DISPLAY_FLAGS_INTERLACED; in dsi_set_config()
4738 dsi->vm.flags &= ~DISPLAY_FLAGS_HSYNC_LOW; in dsi_set_config()
4739 dsi->vm.flags |= DISPLAY_FLAGS_HSYNC_HIGH; in dsi_set_config()
4740 dsi->vm.flags &= ~DISPLAY_FLAGS_VSYNC_LOW; in dsi_set_config()
4741 dsi->vm.flags |= DISPLAY_FLAGS_VSYNC_HIGH; in dsi_set_config()
4744 * flags, but this will only be possible when the DSI encoder will be in dsi_set_config()
4747 dsi->vm.flags &= ~DISPLAY_FLAGS_PIXDATA_NEGEDGE; in dsi_set_config()
4748 dsi->vm.flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; in dsi_set_config()
4749 dsi->vm.flags &= ~DISPLAY_FLAGS_DE_LOW; in dsi_set_config()
4750 dsi->vm.flags |= DISPLAY_FLAGS_DE_HIGH; in dsi_set_config()
4751 dsi->vm.flags &= ~DISPLAY_FLAGS_SYNC_POSEDGE; in dsi_set_config()
4752 dsi->vm.flags |= DISPLAY_FLAGS_SYNC_NEGEDGE; in dsi_set_config()
4754 dss_mgr_set_timings(&dsi->output, &dsi->vm); in dsi_set_config()
4756 dsi->vm_timings = ctx.dsi_vm; in dsi_set_config()
4758 mutex_unlock(&dsi->lock); in dsi_set_config()
4762 mutex_unlock(&dsi->lock); in dsi_set_config()
4768 * Return a hardcoded channel for the DSI output. This should work for
4773 static enum omap_channel dsi_get_channel(struct dsi_data *dsi) in dsi_get_channel() argument
4775 switch (dsi->data->model) { in dsi_get_channel()
4780 switch (dsi->module_id) { in dsi_get_channel()
4791 switch (dsi->module_id) { in dsi_get_channel()
4809 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_request_vc() local
4812 for (i = 0; i < ARRAY_SIZE(dsi->vc); i++) { in dsi_request_vc()
4813 if (!dsi->vc[i].dssdev) { in dsi_request_vc()
4814 dsi->vc[i].dssdev = dssdev; in dsi_request_vc()
4826 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_set_vc_id() local
4838 if (dsi->vc[channel].dssdev != dssdev) { in dsi_set_vc_id()
4844 dsi->vc[channel].vc_id = vc_id; in dsi_set_vc_id()
4851 struct dsi_data *dsi = to_dsi_data(dssdev); in dsi_release_vc() local
4854 dsi->vc[channel].dssdev == dssdev) { in dsi_release_vc()
4855 dsi->vc[channel].dssdev = NULL; in dsi_release_vc()
4856 dsi->vc[channel].vc_id = 0; in dsi_release_vc()
4861 static int dsi_get_clocks(struct dsi_data *dsi) in dsi_get_clocks() argument
4865 clk = devm_clk_get(dsi->dev, "fck"); in dsi_get_clocks()
4871 dsi->dss_clk = clk; in dsi_get_clocks()
4893 .dsi = {
5020 static int dsi_init_pll_data(struct dss_device *dss, struct dsi_data *dsi) in dsi_init_pll_data() argument
5022 struct dss_pll *pll = &dsi->pll; in dsi_init_pll_data()
5026 clk = devm_clk_get(dsi->dev, "sys_clk"); in dsi_init_pll_data()
5032 pll->name = dsi->module_id == 0 ? "dsi0" : "dsi1"; in dsi_init_pll_data()
5033 pll->id = dsi->module_id == 0 ? DSS_PLL_DSI1 : DSS_PLL_DSI2; in dsi_init_pll_data()
5035 pll->base = dsi->pll_base; in dsi_init_pll_data()
5036 pll->hw = dsi->data->pll_hw; in dsi_init_pll_data()
5053 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_bind() local
5058 dsi->dss = dss; in dsi_bind()
5060 dsi_init_pll_data(dss, dsi); in dsi_bind()
5062 r = dsi_runtime_get(dsi); in dsi_bind()
5066 rev = dsi_read_reg(dsi, DSI_REVISION); in dsi_bind()
5067 dev_dbg(dev, "OMAP DSI rev %d.%d\n", in dsi_bind()
5070 dsi->line_buffer_size = dsi_get_line_buf_size(dsi); in dsi_bind()
5072 dsi_runtime_put(dsi); in dsi_bind()
5074 snprintf(name, sizeof(name), "dsi%u_regs", dsi->module_id + 1); in dsi_bind()
5075 dsi->debugfs.regs = dss_debugfs_create_file(dss, name, in dsi_bind()
5076 dsi_dump_dsi_regs, dsi); in dsi_bind()
5078 snprintf(name, sizeof(name), "dsi%u_irqs", dsi->module_id + 1); in dsi_bind()
5079 dsi->debugfs.irqs = dss_debugfs_create_file(dss, name, in dsi_bind()
5080 dsi_dump_dsi_irqs, dsi); in dsi_bind()
5082 snprintf(name, sizeof(name), "dsi%u_clks", dsi->module_id + 1); in dsi_bind()
5083 dsi->debugfs.clks = dss_debugfs_create_file(dss, name, in dsi_bind()
5084 dsi_dump_dsi_clocks, dsi); in dsi_bind()
5091 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_unbind() local
5093 dss_debugfs_remove_file(dsi->debugfs.clks); in dsi_unbind()
5094 dss_debugfs_remove_file(dsi->debugfs.irqs); in dsi_unbind()
5095 dss_debugfs_remove_file(dsi->debugfs.regs); in dsi_unbind()
5097 WARN_ON(dsi->scp_clk_refcount > 0); in dsi_unbind()
5099 dss_pll_unregister(&dsi->pll); in dsi_unbind()
5111 static int dsi_init_output(struct dsi_data *dsi) in dsi_init_output() argument
5113 struct omap_dss_device *out = &dsi->output; in dsi_init_output()
5116 out->dev = dsi->dev; in dsi_init_output()
5117 out->id = dsi->module_id == 0 ? in dsi_init_output()
5121 out->name = dsi->module_id == 0 ? "dsi.0" : "dsi.1"; in dsi_init_output()
5122 out->dispc_channel = dsi_get_channel(dsi); in dsi_init_output()
5139 static void dsi_uninit_output(struct dsi_data *dsi) in dsi_uninit_output() argument
5141 struct omap_dss_device *out = &dsi->output; in dsi_uninit_output()
5147 static int dsi_probe_of(struct dsi_data *dsi) in dsi_probe_of() argument
5149 struct device_node *node = dsi->dev->of_node; in dsi_probe_of()
5163 dev_err(dsi->dev, "failed to find lane data\n"); in dsi_probe_of()
5171 num_pins > dsi->num_lanes_supported * 2) { in dsi_probe_of()
5172 dev_err(dsi->dev, "bad number of lanes\n"); in dsi_probe_of()
5179 dev_err(dsi->dev, "failed to read lane data\n"); in dsi_probe_of()
5187 r = dsi_configure_pins(&dsi->output, &pin_cfg); in dsi_probe_of()
5189 dev_err(dsi->dev, "failed to configure pins"); in dsi_probe_of()
5255 { .compatible = "ti,omap3-dsi", .data = &dsi_of_data_omap36xx, },
5256 { .compatible = "ti,omap4-dsi", .data = &dsi_of_data_omap4, },
5257 { .compatible = "ti,omap5-dsi", .data = &dsi_of_data_omap5, },
5272 struct dsi_data *dsi; in dsi_probe() local
5278 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in dsi_probe()
5279 if (!dsi) in dsi_probe()
5282 dsi->dev = dev; in dsi_probe()
5283 dev_set_drvdata(dev, dsi); in dsi_probe()
5285 spin_lock_init(&dsi->irq_lock); in dsi_probe()
5286 spin_lock_init(&dsi->errors_lock); in dsi_probe()
5287 dsi->errors = 0; in dsi_probe()
5290 spin_lock_init(&dsi->irq_stats_lock); in dsi_probe()
5291 dsi->irq_stats.last_reset = jiffies; in dsi_probe()
5294 mutex_init(&dsi->lock); in dsi_probe()
5295 sema_init(&dsi->bus_lock, 1); in dsi_probe()
5297 INIT_DEFERRABLE_WORK(&dsi->framedone_timeout_work, in dsi_probe()
5301 timer_setup(&dsi->te_timer, dsi_te_timeout, 0); in dsi_probe()
5305 dsi->proto_base = devm_ioremap_resource(dev, dsi_mem); in dsi_probe()
5306 if (IS_ERR(dsi->proto_base)) in dsi_probe()
5307 return PTR_ERR(dsi->proto_base); in dsi_probe()
5310 dsi->phy_base = devm_ioremap_resource(dev, res); in dsi_probe()
5311 if (IS_ERR(dsi->phy_base)) in dsi_probe()
5312 return PTR_ERR(dsi->phy_base); in dsi_probe()
5315 dsi->pll_base = devm_ioremap_resource(dev, res); in dsi_probe()
5316 if (IS_ERR(dsi->pll_base)) in dsi_probe()
5317 return PTR_ERR(dsi->pll_base); in dsi_probe()
5319 dsi->irq = platform_get_irq(pdev, 0); in dsi_probe()
5320 if (dsi->irq < 0) { in dsi_probe()
5325 r = devm_request_irq(dev, dsi->irq, omap_dsi_irq_handler, in dsi_probe()
5326 IRQF_SHARED, dev_name(dev), dsi); in dsi_probe()
5332 dsi->vdds_dsi_reg = devm_regulator_get(dev, "vdd"); in dsi_probe()
5333 if (IS_ERR(dsi->vdds_dsi_reg)) { in dsi_probe()
5334 if (PTR_ERR(dsi->vdds_dsi_reg) != -EPROBE_DEFER) in dsi_probe()
5335 DSSERR("can't get DSI VDD regulator\n"); in dsi_probe()
5336 return PTR_ERR(dsi->vdds_dsi_reg); in dsi_probe()
5341 dsi->data = soc->data; in dsi_probe()
5343 dsi->data = of_match_node(dsi_of_match, dev->of_node)->data; in dsi_probe()
5345 d = dsi->data->modules; in dsi_probe()
5350 DSSERR("unsupported DSI module\n"); in dsi_probe()
5354 dsi->module_id = d->id; in dsi_probe()
5356 if (dsi->data->model == DSI_MODEL_OMAP4 || in dsi_probe()
5357 dsi->data->model == DSI_MODEL_OMAP5) { in dsi_probe()
5365 dsi->data->model == DSI_MODEL_OMAP4 ? in dsi_probe()
5370 dsi->syscon = syscon_node_to_regmap(np); in dsi_probe()
5374 /* DSI VCs initialization */ in dsi_probe()
5375 for (i = 0; i < ARRAY_SIZE(dsi->vc); i++) { in dsi_probe()
5376 dsi->vc[i].source = DSI_VC_SOURCE_L4; in dsi_probe()
5377 dsi->vc[i].dssdev = NULL; in dsi_probe()
5378 dsi->vc[i].vc_id = 0; in dsi_probe()
5381 r = dsi_get_clocks(dsi); in dsi_probe()
5387 /* DSI on OMAP3 doesn't have register DSI_GNQ, set number in dsi_probe()
5389 if (dsi->data->quirks & DSI_QUIRK_GNQ) { in dsi_probe()
5390 dsi_runtime_get(dsi); in dsi_probe()
5392 dsi->num_lanes_supported = 1 + REG_GET(dsi, DSI_GNQ, 11, 9); in dsi_probe()
5393 dsi_runtime_put(dsi); in dsi_probe()
5395 dsi->num_lanes_supported = 3; in dsi_probe()
5400 DSSERR("Failed to populate DSI child devices: %d\n", r); in dsi_probe()
5404 r = dsi_init_output(dsi); in dsi_probe()
5408 r = dsi_probe_of(dsi); in dsi_probe()
5410 DSSERR("Invalid DSI DT data\n"); in dsi_probe()
5421 dsi_uninit_output(dsi); in dsi_probe()
5431 struct dsi_data *dsi = platform_get_drvdata(pdev); in dsi_remove() local
5435 dsi_uninit_output(dsi); in dsi_remove()
5441 if (dsi->vdds_dsi_reg != NULL && dsi->vdds_dsi_enabled) { in dsi_remove()
5442 regulator_disable(dsi->vdds_dsi_reg); in dsi_remove()
5443 dsi->vdds_dsi_enabled = false; in dsi_remove()
5451 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_runtime_suspend() local
5453 dsi->is_enabled = false; in dsi_runtime_suspend()
5456 /* wait for current handler to finish before turning the DSI off */ in dsi_runtime_suspend()
5457 synchronize_irq(dsi->irq); in dsi_runtime_suspend()
5464 struct dsi_data *dsi = dev_get_drvdata(dev); in dsi_runtime_resume() local
5466 dsi->is_enabled = true; in dsi_runtime_resume()