Lines Matching full:dsi
25 /* DSI digital registers & bit definitions */
29 /* DSI wrapper registers & bit definitions */
32 #define WCFGR_DSIM BIT(0) /* DSI Mode */
36 #define WCR_DSIEN BIT(3) /* DSI ENable */
60 /* dsi color format coding according to the datasheet */
80 struct dw_mipi_dsi *dsi; member
87 static inline void dsi_write(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 val) in dsi_write() argument
89 writel(val, dsi->base + reg); in dsi_write()
92 static inline u32 dsi_read(struct dw_mipi_dsi_stm *dsi, u32 reg) in dsi_read() argument
94 return readl(dsi->base + reg); in dsi_read()
97 static inline void dsi_set(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 mask) in dsi_set() argument
99 dsi_write(dsi, reg, dsi_read(dsi, reg) | mask); in dsi_set()
102 static inline void dsi_clear(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 mask) in dsi_clear() argument
104 dsi_write(dsi, reg, dsi_read(dsi, reg) & ~mask); in dsi_clear()
107 static inline void dsi_update_bits(struct dw_mipi_dsi_stm *dsi, u32 reg, in dsi_update_bits() argument
110 dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val); in dsi_update_bits()
141 static int dsi_pll_get_params(struct dw_mipi_dsi_stm *dsi, in dsi_pll_get_params() argument
152 fvco_min = dsi->lane_min_kbps * 2 * ODF_MAX; in dsi_pll_get_params()
153 fvco_max = dsi->lane_max_kbps * 2 * ODF_MIN; in dsi_pll_get_params()
199 struct dw_mipi_dsi_stm *dsi = priv_data; in dw_mipi_dsi_phy_init() local
204 dsi_set(dsi, DSI_WRPCR, WRPCR_REGEN | WRPCR_BGREN); in dw_mipi_dsi_phy_init()
205 ret = readl_poll_timeout(dsi->base + DSI_WISR, val, val & WISR_RRS, in dw_mipi_dsi_phy_init()
210 /* Enable the DSI PLL & wait for its lock */ in dw_mipi_dsi_phy_init()
211 dsi_set(dsi, DSI_WRPCR, WRPCR_PLLEN); in dw_mipi_dsi_phy_init()
212 ret = readl_poll_timeout(dsi->base + DSI_WISR, val, val & WISR_PLLLS, in dw_mipi_dsi_phy_init()
222 struct dw_mipi_dsi_stm *dsi = priv_data; in dw_mipi_dsi_phy_power_on() local
226 /* Enable the DSI wrapper */ in dw_mipi_dsi_phy_power_on()
227 dsi_set(dsi, DSI_WCR, WCR_DSIEN); in dw_mipi_dsi_phy_power_on()
232 struct dw_mipi_dsi_stm *dsi = priv_data; in dw_mipi_dsi_phy_power_off() local
236 /* Disable the DSI wrapper */ in dw_mipi_dsi_phy_power_off()
237 dsi_clear(dsi, DSI_WCR, WCR_DSIEN); in dw_mipi_dsi_phy_power_off()
245 struct dw_mipi_dsi_stm *dsi = priv_data; in dw_mipi_dsi_get_lane_mbps() local
250 pll_in_khz = (unsigned int)(clk_get_rate(dsi->pllref_clk) / 1000); in dw_mipi_dsi_get_lane_mbps()
260 if (pll_out_khz > dsi->lane_max_kbps) { in dw_mipi_dsi_get_lane_mbps()
261 pll_out_khz = dsi->lane_max_kbps; in dw_mipi_dsi_get_lane_mbps()
264 if (pll_out_khz < dsi->lane_min_kbps) { in dw_mipi_dsi_get_lane_mbps()
265 pll_out_khz = dsi->lane_min_kbps; in dw_mipi_dsi_get_lane_mbps()
273 ret = dsi_pll_get_params(dsi, pll_in_khz, pll_out_khz, in dw_mipi_dsi_get_lane_mbps()
282 dsi_update_bits(dsi, DSI_WRPCR, WRPCR_NDIV | WRPCR_IDF | WRPCR_ODF, in dw_mipi_dsi_get_lane_mbps()
287 dsi_update_bits(dsi, DSI_WPCR0, WPCR0_UIX4, val); in dw_mipi_dsi_get_lane_mbps()
290 dsi_clear(dsi, DSI_WCFGR, WCFGR_DSIM); in dw_mipi_dsi_get_lane_mbps()
293 dsi_update_bits(dsi, DSI_WCFGR, WCFGR_COLMUX, in dw_mipi_dsi_get_lane_mbps()
332 struct dw_mipi_dsi_stm *dsi = priv_data; in dw_mipi_dsi_stm_mode_valid() local
343 if (pll_out_khz > dsi->lane_max_kbps) in dw_mipi_dsi_stm_mode_valid()
350 if (pll_out_khz < dsi->lane_min_kbps) in dw_mipi_dsi_stm_mode_valid()
358 pll_in_khz = clk_get_rate(dsi->pllref_clk) / 1000; in dw_mipi_dsi_stm_mode_valid()
359 ret = dsi_pll_get_params(dsi, pll_in_khz, pll_out_khz, &idf, &ndiv, &odf); in dw_mipi_dsi_stm_mode_valid()
383 /* sync packets are codes as DSI short packets (4 bytes) */ in dw_mipi_dsi_stm_mode_valid()
409 * In non-burst mode DSI has to enter in LP during HFP in dw_mipi_dsi_stm_mode_valid()
437 { .compatible = "st,stm32-dsi", .data = &dw_mipi_dsi_stm_plat_data, },
445 struct dw_mipi_dsi_stm *dsi; in dw_mipi_dsi_stm_probe() local
450 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); in dw_mipi_dsi_stm_probe()
451 if (!dsi) in dw_mipi_dsi_stm_probe()
455 dsi->base = devm_ioremap_resource(dev, res); in dw_mipi_dsi_stm_probe()
456 if (IS_ERR(dsi->base)) { in dw_mipi_dsi_stm_probe()
457 ret = PTR_ERR(dsi->base); in dw_mipi_dsi_stm_probe()
458 DRM_ERROR("Unable to get dsi registers %d\n", ret); in dw_mipi_dsi_stm_probe()
462 dsi->vdd_supply = devm_regulator_get(dev, "phy-dsi"); in dw_mipi_dsi_stm_probe()
463 if (IS_ERR(dsi->vdd_supply)) { in dw_mipi_dsi_stm_probe()
464 ret = PTR_ERR(dsi->vdd_supply); in dw_mipi_dsi_stm_probe()
469 ret = regulator_enable(dsi->vdd_supply); in dw_mipi_dsi_stm_probe()
475 dsi->pllref_clk = devm_clk_get(dev, "ref"); in dw_mipi_dsi_stm_probe()
476 if (IS_ERR(dsi->pllref_clk)) { in dw_mipi_dsi_stm_probe()
477 ret = PTR_ERR(dsi->pllref_clk); in dw_mipi_dsi_stm_probe()
482 ret = clk_prepare_enable(dsi->pllref_clk); in dw_mipi_dsi_stm_probe()
501 dsi->hw_version = dsi_read(dsi, DSI_VERSION) & VERSION; in dw_mipi_dsi_stm_probe()
504 if (dsi->hw_version != HWVER_130 && dsi->hw_version != HWVER_131) { in dw_mipi_dsi_stm_probe()
506 DRM_ERROR("bad dsi hardware version\n"); in dw_mipi_dsi_stm_probe()
511 dsi->lane_min_kbps = LANE_MIN_KBPS; in dw_mipi_dsi_stm_probe()
512 dsi->lane_max_kbps = LANE_MAX_KBPS; in dw_mipi_dsi_stm_probe()
513 if (dsi->hw_version == HWVER_131) { in dw_mipi_dsi_stm_probe()
514 dsi->lane_min_kbps *= 2; in dw_mipi_dsi_stm_probe()
515 dsi->lane_max_kbps *= 2; in dw_mipi_dsi_stm_probe()
518 dw_mipi_dsi_stm_plat_data.base = dsi->base; in dw_mipi_dsi_stm_probe()
519 dw_mipi_dsi_stm_plat_data.priv_data = dsi; in dw_mipi_dsi_stm_probe()
521 platform_set_drvdata(pdev, dsi); in dw_mipi_dsi_stm_probe()
523 dsi->dsi = dw_mipi_dsi_probe(pdev, &dw_mipi_dsi_stm_plat_data); in dw_mipi_dsi_stm_probe()
524 if (IS_ERR(dsi->dsi)) { in dw_mipi_dsi_stm_probe()
525 ret = PTR_ERR(dsi->dsi); in dw_mipi_dsi_stm_probe()
526 dev_err_probe(dev, ret, "Failed to initialize mipi dsi host\n"); in dw_mipi_dsi_stm_probe()
533 clk_disable_unprepare(dsi->pllref_clk); in dw_mipi_dsi_stm_probe()
535 regulator_disable(dsi->vdd_supply); in dw_mipi_dsi_stm_probe()
542 struct dw_mipi_dsi_stm *dsi = platform_get_drvdata(pdev); in dw_mipi_dsi_stm_remove() local
544 dw_mipi_dsi_remove(dsi->dsi); in dw_mipi_dsi_stm_remove()
545 clk_disable_unprepare(dsi->pllref_clk); in dw_mipi_dsi_stm_remove()
546 regulator_disable(dsi->vdd_supply); in dw_mipi_dsi_stm_remove()
553 struct dw_mipi_dsi_stm *dsi = dw_mipi_dsi_stm_plat_data.priv_data; in dw_mipi_dsi_stm_suspend() local
557 clk_disable_unprepare(dsi->pllref_clk); in dw_mipi_dsi_stm_suspend()
558 regulator_disable(dsi->vdd_supply); in dw_mipi_dsi_stm_suspend()
565 struct dw_mipi_dsi_stm *dsi = dw_mipi_dsi_stm_plat_data.priv_data; in dw_mipi_dsi_stm_resume() local
570 ret = regulator_enable(dsi->vdd_supply); in dw_mipi_dsi_stm_resume()
576 ret = clk_prepare_enable(dsi->pllref_clk); in dw_mipi_dsi_stm_resume()
578 regulator_disable(dsi->vdd_supply); in dw_mipi_dsi_stm_resume()
596 .name = "stm32-display-dsi",
605 MODULE_DESCRIPTION("STMicroelectronics DW MIPI DSI host controller driver");