Lines Matching refs:dss
55 #define REG_GET(dss, idx, start, end) \ argument
56 FLD_GET(dss_read_reg(dss, idx), start, end)
58 #define REG_FLD_MOD(dss, idx, val, start, end) \ argument
59 dss_write_reg(dss, idx, \
60 FLD_MOD(dss_read_reg(dss, idx), val, start, end))
63 int (*dpi_select_source)(struct dss_device *dss, int port,
65 int (*select_lcd_source)(struct dss_device *dss,
95 static inline void dss_write_reg(struct dss_device *dss, in dss_write_reg() argument
98 __raw_writel(val, dss->base + idx.idx); in dss_write_reg()
101 static inline u32 dss_read_reg(struct dss_device *dss, const struct dss_reg idx) in dss_read_reg() argument
103 return __raw_readl(dss->base + idx.idx); in dss_read_reg()
106 #define SR(dss, reg) \ argument
107 dss->ctx[(DSS_##reg).idx / sizeof(u32)] = dss_read_reg(dss, DSS_##reg)
108 #define RR(dss, reg) \ argument
109 dss_write_reg(dss, DSS_##reg, dss->ctx[(DSS_##reg).idx / sizeof(u32)])
111 static void dss_save_context(struct dss_device *dss) in dss_save_context() argument
115 SR(dss, CONTROL); in dss_save_context()
117 if (dss->feat->outputs[OMAP_DSS_CHANNEL_LCD] & OMAP_DSS_OUTPUT_SDI) { in dss_save_context()
118 SR(dss, SDI_CONTROL); in dss_save_context()
119 SR(dss, PLL_CONTROL); in dss_save_context()
122 dss->ctx_valid = true; in dss_save_context()
127 static void dss_restore_context(struct dss_device *dss) in dss_restore_context() argument
131 if (!dss->ctx_valid) in dss_restore_context()
134 RR(dss, CONTROL); in dss_restore_context()
136 if (dss->feat->outputs[OMAP_DSS_CHANNEL_LCD] & OMAP_DSS_OUTPUT_SDI) { in dss_restore_context()
137 RR(dss, SDI_CONTROL); in dss_restore_context()
138 RR(dss, PLL_CONTROL); in dss_restore_context()
152 if (!pll->dss->syscon_pll_ctrl) in dss_ctrl_pll_enable()
172 regmap_update_bits(pll->dss->syscon_pll_ctrl, in dss_ctrl_pll_enable()
173 pll->dss->syscon_pll_ctrl_offset, in dss_ctrl_pll_enable()
177 static int dss_ctrl_pll_set_control_mux(struct dss_device *dss, in dss_ctrl_pll_set_control_mux() argument
183 if (!dss->syscon_pll_ctrl) in dss_ctrl_pll_set_control_mux()
238 regmap_update_bits(dss->syscon_pll_ctrl, dss->syscon_pll_ctrl_offset, in dss_ctrl_pll_set_control_mux()
244 void dss_sdi_init(struct dss_device *dss, int datapairs) in dss_sdi_init() argument
250 l = dss_read_reg(dss, DSS_SDI_CONTROL); in dss_sdi_init()
254 dss_write_reg(dss, DSS_SDI_CONTROL, l); in dss_sdi_init()
256 l = dss_read_reg(dss, DSS_PLL_CONTROL); in dss_sdi_init()
260 dss_write_reg(dss, DSS_PLL_CONTROL, l); in dss_sdi_init()
263 int dss_sdi_enable(struct dss_device *dss) in dss_sdi_enable() argument
267 dispc_pck_free_enable(dss->dispc, 1); in dss_sdi_enable()
270 REG_FLD_MOD(dss, DSS_PLL_CONTROL, 1, 18, 18); /* SDI_PLL_SYSRESET */ in dss_sdi_enable()
274 REG_FLD_MOD(dss, DSS_PLL_CONTROL, 1, 28, 28); /* SDI_PLL_GOBIT */ in dss_sdi_enable()
278 while (dss_read_reg(dss, DSS_SDI_STATUS) & (1 << 6)) { in dss_sdi_enable()
286 REG_FLD_MOD(dss, DSS_PLL_CONTROL, 0, 28, 28); in dss_sdi_enable()
290 while (!(dss_read_reg(dss, DSS_SDI_STATUS) & (1 << 5))) { in dss_sdi_enable()
297 dispc_lcd_enable_signal(dss->dispc, 1); in dss_sdi_enable()
301 while (!(dss_read_reg(dss, DSS_SDI_STATUS) & (1 << 2))) { in dss_sdi_enable()
311 dispc_lcd_enable_signal(dss->dispc, 0); in dss_sdi_enable()
314 REG_FLD_MOD(dss, DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ in dss_sdi_enable()
316 dispc_pck_free_enable(dss->dispc, 0); in dss_sdi_enable()
321 void dss_sdi_disable(struct dss_device *dss) in dss_sdi_disable() argument
323 dispc_lcd_enable_signal(dss->dispc, 0); in dss_sdi_disable()
325 dispc_pck_free_enable(dss->dispc, 0); in dss_sdi_disable()
328 REG_FLD_MOD(dss, DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ in dss_sdi_disable()
336 static void dss_dump_clocks(struct dss_device *dss, struct seq_file *s) in dss_dump_clocks() argument
341 if (dss_runtime_get(dss)) in dss_dump_clocks()
347 fclk_rate = clk_get_rate(dss->dss_clk); in dss_dump_clocks()
353 dss_runtime_put(dss); in dss_dump_clocks()
358 struct dss_device *dss = s->private; in dss_dump_regs() local
360 #define DUMPREG(dss, r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(dss, r)) in dss_dump_regs() argument
362 if (dss_runtime_get(dss)) in dss_dump_regs()
365 DUMPREG(dss, DSS_REVISION); in dss_dump_regs()
366 DUMPREG(dss, DSS_SYSCONFIG); in dss_dump_regs()
367 DUMPREG(dss, DSS_SYSSTATUS); in dss_dump_regs()
368 DUMPREG(dss, DSS_CONTROL); in dss_dump_regs()
370 if (dss->feat->outputs[OMAP_DSS_CHANNEL_LCD] & OMAP_DSS_OUTPUT_SDI) { in dss_dump_regs()
371 DUMPREG(dss, DSS_SDI_CONTROL); in dss_dump_regs()
372 DUMPREG(dss, DSS_PLL_CONTROL); in dss_dump_regs()
373 DUMPREG(dss, DSS_SDI_STATUS); in dss_dump_regs()
376 dss_runtime_put(dss); in dss_dump_regs()
383 struct dss_device *dss = s->private; in dss_debug_dump_clocks() local
385 dss_dump_clocks(dss, s); in dss_debug_dump_clocks()
386 dispc_dump_clocks(dss->dispc, s); in dss_debug_dump_clocks()
405 static void dss_select_dispc_clk_source(struct dss_device *dss, in dss_select_dispc_clk_source() argument
414 if (WARN_ON(dss->feat->has_lcd_clk_src && clk_src != DSS_CLK_SRC_FCK)) in dss_select_dispc_clk_source()
432 REG_FLD_MOD(dss, DSS_CONTROL, b, /* DISPC_CLK_SWITCH */ in dss_select_dispc_clk_source()
433 dss->feat->dispc_clk_switch.start, in dss_select_dispc_clk_source()
434 dss->feat->dispc_clk_switch.end); in dss_select_dispc_clk_source()
436 dss->dispc_clk_source = clk_src; in dss_select_dispc_clk_source()
439 void dss_select_dsi_clk_source(struct dss_device *dss, int dsi_module, in dss_select_dsi_clk_source() argument
462 REG_FLD_MOD(dss, DSS_CONTROL, b, pos, pos); /* DSIx_CLK_SWITCH */ in dss_select_dsi_clk_source()
464 dss->dsi_clk_source[dsi_module] = clk_src; in dss_select_dsi_clk_source()
467 static int dss_lcd_clk_mux_dra7(struct dss_device *dss, in dss_lcd_clk_mux_dra7() argument
482 REG_FLD_MOD(dss, DSS_CONTROL, 0, ctrl_bit, ctrl_bit); in dss_lcd_clk_mux_dra7()
486 r = dss_ctrl_pll_set_control_mux(dss, clk_src, channel); in dss_lcd_clk_mux_dra7()
490 REG_FLD_MOD(dss, DSS_CONTROL, 1, ctrl_bit, ctrl_bit); in dss_lcd_clk_mux_dra7()
495 static int dss_lcd_clk_mux_omap5(struct dss_device *dss, in dss_lcd_clk_mux_omap5() argument
514 REG_FLD_MOD(dss, DSS_CONTROL, 0, ctrl_bit, ctrl_bit); in dss_lcd_clk_mux_omap5()
521 REG_FLD_MOD(dss, DSS_CONTROL, 1, ctrl_bit, ctrl_bit); in dss_lcd_clk_mux_omap5()
526 static int dss_lcd_clk_mux_omap4(struct dss_device *dss, in dss_lcd_clk_mux_omap4() argument
543 REG_FLD_MOD(dss, DSS_CONTROL, 0, ctrl_bit, ctrl_bit); in dss_lcd_clk_mux_omap4()
550 REG_FLD_MOD(dss, DSS_CONTROL, 1, ctrl_bit, ctrl_bit); in dss_lcd_clk_mux_omap4()
555 void dss_select_lcd_clk_source(struct dss_device *dss, in dss_select_lcd_clk_source() argument
562 if (!dss->feat->has_lcd_clk_src) { in dss_select_lcd_clk_source()
563 dss_select_dispc_clk_source(dss, clk_src); in dss_select_lcd_clk_source()
564 dss->lcd_clk_source[idx] = clk_src; in dss_select_lcd_clk_source()
568 r = dss->feat->ops->select_lcd_source(dss, channel, clk_src); in dss_select_lcd_clk_source()
572 dss->lcd_clk_source[idx] = clk_src; in dss_select_lcd_clk_source()
575 enum dss_clk_source dss_get_dispc_clk_source(struct dss_device *dss) in dss_get_dispc_clk_source() argument
577 return dss->dispc_clk_source; in dss_get_dispc_clk_source()
580 enum dss_clk_source dss_get_dsi_clk_source(struct dss_device *dss, in dss_get_dsi_clk_source() argument
583 return dss->dsi_clk_source[dsi_module]; in dss_get_dsi_clk_source()
586 enum dss_clk_source dss_get_lcd_clk_source(struct dss_device *dss, in dss_get_lcd_clk_source() argument
589 if (dss->feat->has_lcd_clk_src) { in dss_get_lcd_clk_source()
591 return dss->lcd_clk_source[idx]; in dss_get_lcd_clk_source()
595 return dss->dispc_clk_source; in dss_get_lcd_clk_source()
599 bool dss_div_calc(struct dss_device *dss, unsigned long pck, in dss_div_calc() argument
609 fck_hw_max = dss->feat->fck_freq_max; in dss_div_calc()
611 if (dss->parent_clk == NULL) { in dss_div_calc()
618 fck = clk_round_rate(dss->dss_clk, fck); in dss_div_calc()
623 fckd_hw_max = dss->feat->fck_div_max; in dss_div_calc()
625 m = dss->feat->dss_fck_multiplier; in dss_div_calc()
626 prate = clk_get_rate(dss->parent_clk); in dss_div_calc()
643 int dss_set_fck_rate(struct dss_device *dss, unsigned long rate) in dss_set_fck_rate() argument
649 r = clk_set_rate(dss->dss_clk, rate); in dss_set_fck_rate()
653 dss->dss_clk_rate = clk_get_rate(dss->dss_clk); in dss_set_fck_rate()
655 WARN_ONCE(dss->dss_clk_rate != rate, "clk rate mismatch: %lu != %lu", in dss_set_fck_rate()
656 dss->dss_clk_rate, rate); in dss_set_fck_rate()
661 unsigned long dss_get_dispc_clk_rate(struct dss_device *dss) in dss_get_dispc_clk_rate() argument
663 return dss->dss_clk_rate; in dss_get_dispc_clk_rate()
666 unsigned long dss_get_max_fck_rate(struct dss_device *dss) in dss_get_max_fck_rate() argument
668 return dss->feat->fck_freq_max; in dss_get_max_fck_rate()
671 static int dss_setup_default_clock(struct dss_device *dss) in dss_setup_default_clock() argument
678 max_dss_fck = dss->feat->fck_freq_max; in dss_setup_default_clock()
680 if (dss->parent_clk == NULL) { in dss_setup_default_clock()
681 fck = clk_round_rate(dss->dss_clk, max_dss_fck); in dss_setup_default_clock()
683 prate = clk_get_rate(dss->parent_clk); in dss_setup_default_clock()
685 fck_div = DIV_ROUND_UP(prate * dss->feat->dss_fck_multiplier, in dss_setup_default_clock()
688 * dss->feat->dss_fck_multiplier; in dss_setup_default_clock()
691 r = dss_set_fck_rate(dss, fck); in dss_setup_default_clock()
698 void dss_set_venc_output(struct dss_device *dss, enum omap_dss_venc_type type) in dss_set_venc_output() argument
710 REG_FLD_MOD(dss, DSS_CONTROL, l, 6, 6); in dss_set_venc_output()
713 void dss_set_dac_pwrdn_bgz(struct dss_device *dss, bool enable) in dss_set_dac_pwrdn_bgz() argument
716 REG_FLD_MOD(dss, DSS_CONTROL, enable, 5, 5); in dss_set_dac_pwrdn_bgz()
719 void dss_select_hdmi_venc_clk_source(struct dss_device *dss, in dss_select_hdmi_venc_clk_source() argument
724 outputs = dss->feat->outputs[OMAP_DSS_CHANNEL_DIGIT]; in dss_select_hdmi_venc_clk_source()
734 REG_FLD_MOD(dss, DSS_CONTROL, src, 15, 15); in dss_select_hdmi_venc_clk_source()
737 static int dss_dpi_select_source_omap2_omap3(struct dss_device *dss, int port, in dss_dpi_select_source_omap2_omap3() argument
746 static int dss_dpi_select_source_omap4(struct dss_device *dss, int port, in dss_dpi_select_source_omap4() argument
762 REG_FLD_MOD(dss, DSS_CONTROL, val, 17, 17); in dss_dpi_select_source_omap4()
767 static int dss_dpi_select_source_omap5(struct dss_device *dss, int port, in dss_dpi_select_source_omap5() argument
789 REG_FLD_MOD(dss, DSS_CONTROL, val, 17, 16); in dss_dpi_select_source_omap5()
794 static int dss_dpi_select_source_dra7xx(struct dss_device *dss, int port, in dss_dpi_select_source_dra7xx() argument
799 return dss_dpi_select_source_omap5(dss, port, channel); in dss_dpi_select_source_dra7xx()
815 int dss_dpi_select_source(struct dss_device *dss, int port, in dss_dpi_select_source() argument
818 return dss->feat->ops->dpi_select_source(dss, port, channel); in dss_dpi_select_source()
821 static int dss_get_clocks(struct dss_device *dss) in dss_get_clocks() argument
825 clk = devm_clk_get(&dss->pdev->dev, "fck"); in dss_get_clocks()
831 dss->dss_clk = clk; in dss_get_clocks()
833 if (dss->feat->parent_clk_name) { in dss_get_clocks()
834 clk = clk_get(NULL, dss->feat->parent_clk_name); in dss_get_clocks()
837 dss->feat->parent_clk_name); in dss_get_clocks()
844 dss->parent_clk = clk; in dss_get_clocks()
849 static void dss_put_clocks(struct dss_device *dss) in dss_put_clocks() argument
851 if (dss->parent_clk) in dss_put_clocks()
852 clk_put(dss->parent_clk); in dss_put_clocks()
855 int dss_runtime_get(struct dss_device *dss) in dss_runtime_get() argument
861 r = pm_runtime_get_sync(&dss->pdev->dev); in dss_runtime_get()
863 pm_runtime_put_noidle(&dss->pdev->dev); in dss_runtime_get()
869 void dss_runtime_put(struct dss_device *dss) in dss_runtime_put() argument
875 r = pm_runtime_put_sync(&dss->pdev->dev); in dss_runtime_put()
886 static int dss_initialize_debugfs(struct dss_device *dss) in dss_initialize_debugfs() argument
894 dss->debugfs.root = dir; in dss_initialize_debugfs()
899 static void dss_uninitialize_debugfs(struct dss_device *dss) in dss_uninitialize_debugfs() argument
901 debugfs_remove_recursive(dss->debugfs.root); in dss_uninitialize_debugfs()
925 dss_debugfs_create_file(struct dss_device *dss, const char *name, in dss_debugfs_create_file() argument
937 entry->dentry = debugfs_create_file(name, 0444, dss->debugfs.root, in dss_debugfs_create_file()
953 static inline int dss_initialize_debugfs(struct dss_device *dss) in dss_initialize_debugfs() argument
957 static inline void dss_uninitialize_debugfs(struct dss_device *dss) in dss_uninitialize_debugfs() argument
1158 static void __dss_uninit_ports(struct dss_device *dss, unsigned int num_ports) in __dss_uninit_ports() argument
1160 struct platform_device *pdev = dss->pdev; in __dss_uninit_ports()
1170 switch (dss->feat->ports[i]) { in __dss_uninit_ports()
1184 static int dss_init_ports(struct dss_device *dss) in dss_init_ports() argument
1186 struct platform_device *pdev = dss->pdev; in dss_init_ports()
1192 for (i = 0; i < dss->feat->num_ports; i++) { in dss_init_ports()
1197 switch (dss->feat->ports[i]) { in dss_init_ports()
1199 r = dpi_init_port(dss, pdev, port, dss->feat->model); in dss_init_ports()
1205 r = sdi_init_port(dss, pdev, port); in dss_init_ports()
1220 __dss_uninit_ports(dss, i); in dss_init_ports()
1224 static void dss_uninit_ports(struct dss_device *dss) in dss_uninit_ports() argument
1226 __dss_uninit_ports(dss, dss->feat->num_ports); in dss_uninit_ports()
1229 static int dss_video_pll_probe(struct dss_device *dss) in dss_video_pll_probe() argument
1231 struct platform_device *pdev = dss->pdev; in dss_video_pll_probe()
1240 dss->syscon_pll_ctrl = in dss_video_pll_probe()
1242 1, &dss->syscon_pll_ctrl_offset); in dss_video_pll_probe()
1243 if (IS_ERR(dss->syscon_pll_ctrl)) { in dss_video_pll_probe()
1246 return PTR_ERR(dss->syscon_pll_ctrl); in dss_video_pll_probe()
1269 dss->video1_pll = dss_video_pll_init(dss, pdev, 0, in dss_video_pll_probe()
1271 if (IS_ERR(dss->video1_pll)) in dss_video_pll_probe()
1272 return PTR_ERR(dss->video1_pll); in dss_video_pll_probe()
1276 dss->video2_pll = dss_video_pll_init(dss, pdev, 1, in dss_video_pll_probe()
1278 if (IS_ERR(dss->video2_pll)) { in dss_video_pll_probe()
1279 dss_video_pll_uninit(dss->video1_pll); in dss_video_pll_probe()
1280 return PTR_ERR(dss->video2_pll); in dss_video_pll_probe()
1307 struct dss_device *dss = dev_get_drvdata(dev); in dss_bind() local
1318 pdata.dss = dss; in dss_bind()
1326 dss->drm_pdev = drm_pdev; in dss_bind()
1333 struct dss_device *dss = dev_get_drvdata(dev); in dss_unbind() local
1335 platform_device_unregister(dss->drm_pdev); in dss_unbind()
1379 static int dss_probe_hardware(struct dss_device *dss) in dss_probe_hardware() argument
1384 r = dss_runtime_get(dss); in dss_probe_hardware()
1388 dss->dss_clk_rate = clk_get_rate(dss->dss_clk); in dss_probe_hardware()
1391 REG_FLD_MOD(dss, DSS_CONTROL, 0, 0, 0); in dss_probe_hardware()
1393 dss_select_dispc_clk_source(dss, DSS_CLK_SRC_FCK); in dss_probe_hardware()
1396 REG_FLD_MOD(dss, DSS_CONTROL, 1, 4, 4); /* venc dac demen */ in dss_probe_hardware()
1397 REG_FLD_MOD(dss, DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ in dss_probe_hardware()
1398 REG_FLD_MOD(dss, DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ in dss_probe_hardware()
1400 dss->dsi_clk_source[0] = DSS_CLK_SRC_FCK; in dss_probe_hardware()
1401 dss->dsi_clk_source[1] = DSS_CLK_SRC_FCK; in dss_probe_hardware()
1402 dss->dispc_clk_source = DSS_CLK_SRC_FCK; in dss_probe_hardware()
1403 dss->lcd_clk_source[0] = DSS_CLK_SRC_FCK; in dss_probe_hardware()
1404 dss->lcd_clk_source[1] = DSS_CLK_SRC_FCK; in dss_probe_hardware()
1406 rev = dss_read_reg(dss, DSS_REVISION); in dss_probe_hardware()
1409 dss_runtime_put(dss); in dss_probe_hardware()
1419 struct dss_device *dss; in dss_probe() local
1422 dss = kzalloc(sizeof(*dss), GFP_KERNEL); in dss_probe()
1423 if (!dss) in dss_probe()
1426 dss->pdev = pdev; in dss_probe()
1427 platform_set_drvdata(pdev, dss); in dss_probe()
1441 dss->feat = soc->data; in dss_probe()
1443 dss->feat = device_get_match_data(&pdev->dev); in dss_probe()
1446 dss->base = devm_platform_ioremap_resource(pdev, 0); in dss_probe()
1447 if (IS_ERR(dss->base)) { in dss_probe()
1448 r = PTR_ERR(dss->base); in dss_probe()
1452 r = dss_get_clocks(dss); in dss_probe()
1456 r = dss_setup_default_clock(dss); in dss_probe()
1461 r = dss_video_pll_probe(dss); in dss_probe()
1465 r = dss_init_ports(dss); in dss_probe()
1472 r = dss_probe_hardware(dss); in dss_probe()
1477 r = dss_initialize_debugfs(dss); in dss_probe()
1481 dss->debugfs.clk = dss_debugfs_create_file(dss, "clk", in dss_probe()
1482 dss_debug_dump_clocks, dss); in dss_probe()
1483 dss->debugfs.dss = dss_debugfs_create_file(dss, "dss", dss_dump_regs, in dss_probe()
1484 dss); in dss_probe()
1507 dss_debugfs_remove_file(dss->debugfs.clk); in dss_probe()
1508 dss_debugfs_remove_file(dss->debugfs.dss); in dss_probe()
1509 dss_uninitialize_debugfs(dss); in dss_probe()
1513 dss_uninit_ports(dss); in dss_probe()
1516 if (dss->video1_pll) in dss_probe()
1517 dss_video_pll_uninit(dss->video1_pll); in dss_probe()
1518 if (dss->video2_pll) in dss_probe()
1519 dss_video_pll_uninit(dss->video2_pll); in dss_probe()
1522 dss_put_clocks(dss); in dss_probe()
1525 kfree(dss); in dss_probe()
1532 struct dss_device *dss = platform_get_drvdata(pdev); in dss_remove() local
1538 dss_debugfs_remove_file(dss->debugfs.clk); in dss_remove()
1539 dss_debugfs_remove_file(dss->debugfs.dss); in dss_remove()
1540 dss_uninitialize_debugfs(dss); in dss_remove()
1544 dss_uninit_ports(dss); in dss_remove()
1546 if (dss->video1_pll) in dss_remove()
1547 dss_video_pll_uninit(dss->video1_pll); in dss_remove()
1549 if (dss->video2_pll) in dss_remove()
1550 dss_video_pll_uninit(dss->video2_pll); in dss_remove()
1552 dss_put_clocks(dss); in dss_remove()
1554 kfree(dss); in dss_remove()
1564 struct dss_device *dss = dev_get_drvdata(dev); in dss_runtime_suspend() local
1566 dss_save_context(dss); in dss_runtime_suspend()
1576 struct dss_device *dss = dev_get_drvdata(dev); in dss_runtime_resume() local
1592 dss_restore_context(dss); in dss_runtime_resume()