Lines Matching +full:mipi +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
33 #define DRIVER_NAME "meson-dw-mipi-dsi"
34 #define DRIVER_DESC "Amlogic Meson MIPI-DSI DRM driver"
45 const struct drm_display_mode *mode; member
61 mipi_dsi->base + MIPI_DSI_TOP_SW_RESET); in meson_dw_mipi_dsi_hw_init()
64 0, mipi_dsi->base + MIPI_DSI_TOP_SW_RESET); in meson_dw_mipi_dsi_hw_init()
69 mipi_dsi->base + MIPI_DSI_TOP_CLK_CNTL); in meson_dw_mipi_dsi_hw_init()
72 writel_relaxed(0, mipi_dsi->base + MIPI_DSI_TOP_MEM_PD); in meson_dw_mipi_dsi_hw_init()
82 ret = clk_set_rate(mipi_dsi->bit_clk, in dw_mipi_dsi_phy_init()
83 mipi_dsi->phy_opts.mipi_dphy.hs_clk_rate); in dw_mipi_dsi_phy_init()
85 dev_err(mipi_dsi->dev, "Failed to set DSI Bit clock rate %lu (ret %d)\n", in dw_mipi_dsi_phy_init()
86 mipi_dsi->phy_opts.mipi_dphy.hs_clk_rate, ret); in dw_mipi_dsi_phy_init()
91 ret = clk_rate_exclusive_get(mipi_dsi->bit_clk); in dw_mipi_dsi_phy_init()
93 dev_err(mipi_dsi->dev, in dw_mipi_dsi_phy_init()
98 ret = clk_set_rate(mipi_dsi->px_clk, mipi_dsi->mode->clock * 1000); in dw_mipi_dsi_phy_init()
101 dev_err(mipi_dsi->dev, "Failed to set DSI Pixel clock rate %u (%d)\n", in dw_mipi_dsi_phy_init()
102 mipi_dsi->mode->clock * 1000, ret); in dw_mipi_dsi_phy_init()
106 switch (mipi_dsi->dsi_device->format) { in dw_mipi_dsi_phy_init()
117 return -EINVAL; in dw_mipi_dsi_phy_init()
126 mipi_dsi->base + MIPI_DSI_TOP_CNTL); in dw_mipi_dsi_phy_init()
128 return phy_configure(mipi_dsi->phy, &mipi_dsi->phy_opts); in dw_mipi_dsi_phy_init()
135 if (phy_power_on(mipi_dsi->phy)) in dw_mipi_dsi_phy_power_on()
136 dev_warn(mipi_dsi->dev, "Failed to power on PHY\n"); in dw_mipi_dsi_phy_power_on()
143 if (phy_power_off(mipi_dsi->phy)) in dw_mipi_dsi_phy_power_off()
144 dev_warn(mipi_dsi->dev, "Failed to power off PHY\n"); in dw_mipi_dsi_phy_power_off()
147 clk_rate_exclusive_put(mipi_dsi->bit_clk); in dw_mipi_dsi_phy_power_off()
151 dw_mipi_dsi_get_lane_mbps(void *priv_data, const struct drm_display_mode *mode, in dw_mipi_dsi_get_lane_mbps() argument
158 mipi_dsi->mode = mode; in dw_mipi_dsi_get_lane_mbps()
160 bpp = mipi_dsi_pixel_format_to_bpp(mipi_dsi->dsi_device->format); in dw_mipi_dsi_get_lane_mbps()
162 phy_mipi_dphy_get_default_config(mode->clock * 1000, in dw_mipi_dsi_get_lane_mbps()
163 bpp, mipi_dsi->dsi_device->lanes, in dw_mipi_dsi_get_lane_mbps()
164 &mipi_dsi->phy_opts.mipi_dphy); in dw_mipi_dsi_get_lane_mbps()
166 *lane_mbps = DIV_ROUND_UP(mipi_dsi->phy_opts.mipi_dphy.hs_clk_rate, USEC_PER_SEC); in dw_mipi_dsi_get_lane_mbps()
177 switch (mipi_dsi->mode->hdisplay) { in dw_mipi_dsi_phy_get_timing()
182 timing->clk_lp2hs = 23; in dw_mipi_dsi_phy_get_timing()
183 timing->clk_hs2lp = 38; in dw_mipi_dsi_phy_get_timing()
184 timing->data_lp2hs = 15; in dw_mipi_dsi_phy_get_timing()
185 timing->data_hs2lp = 9; in dw_mipi_dsi_phy_get_timing()
189 timing->clk_lp2hs = 37; in dw_mipi_dsi_phy_get_timing()
190 timing->clk_hs2lp = 135; in dw_mipi_dsi_phy_get_timing()
191 timing->data_lp2hs = 50; in dw_mipi_dsi_phy_get_timing()
192 timing->data_hs2lp = 3; in dw_mipi_dsi_phy_get_timing()
221 mipi_dsi->dsi_device = device; in meson_dw_mipi_dsi_host_attach()
223 switch (device->format) { in meson_dw_mipi_dsi_host_attach()
230 dev_err(mipi_dsi->dev, "invalid pixel format %d\n", device->format); in meson_dw_mipi_dsi_host_attach()
231 return -EINVAL; in meson_dw_mipi_dsi_host_attach()
234 ret = phy_init(mipi_dsi->phy); in meson_dw_mipi_dsi_host_attach()
248 if (device == mipi_dsi->dsi_device) in meson_dw_mipi_dsi_host_detach()
249 mipi_dsi->dsi_device = NULL; in meson_dw_mipi_dsi_host_detach()
251 return -EINVAL; in meson_dw_mipi_dsi_host_detach()
253 return phy_exit(mipi_dsi->phy); in meson_dw_mipi_dsi_host_detach()
264 struct device *dev = &pdev->dev; in meson_dw_mipi_dsi_probe()
268 return -ENOMEM; in meson_dw_mipi_dsi_probe()
270 mipi_dsi->base = devm_platform_ioremap_resource(pdev, 0); in meson_dw_mipi_dsi_probe()
271 if (IS_ERR(mipi_dsi->base)) in meson_dw_mipi_dsi_probe()
272 return PTR_ERR(mipi_dsi->base); in meson_dw_mipi_dsi_probe()
274 mipi_dsi->phy = devm_phy_get(dev, "dphy"); in meson_dw_mipi_dsi_probe()
275 if (IS_ERR(mipi_dsi->phy)) in meson_dw_mipi_dsi_probe()
276 return dev_err_probe(dev, PTR_ERR(mipi_dsi->phy), in meson_dw_mipi_dsi_probe()
277 "failed to get mipi dphy\n"); in meson_dw_mipi_dsi_probe()
279 mipi_dsi->bit_clk = devm_clk_get_enabled(dev, "bit"); in meson_dw_mipi_dsi_probe()
280 if (IS_ERR(mipi_dsi->bit_clk)) { in meson_dw_mipi_dsi_probe()
281 int ret = PTR_ERR(mipi_dsi->bit_clk); in meson_dw_mipi_dsi_probe()
284 if (ret == -EIO) in meson_dw_mipi_dsi_probe()
285 ret = -EPROBE_DEFER; in meson_dw_mipi_dsi_probe()
290 mipi_dsi->px_clk = devm_clk_get_enabled(dev, "px"); in meson_dw_mipi_dsi_probe()
291 if (IS_ERR(mipi_dsi->px_clk)) in meson_dw_mipi_dsi_probe()
292 return dev_err_probe(dev, PTR_ERR(mipi_dsi->px_clk), in meson_dw_mipi_dsi_probe()
299 mipi_dsi->top_rst = devm_reset_control_get_exclusive(dev, "top"); in meson_dw_mipi_dsi_probe()
300 if (IS_ERR(mipi_dsi->top_rst)) in meson_dw_mipi_dsi_probe()
301 return dev_err_probe(dev, PTR_ERR(mipi_dsi->top_rst), in meson_dw_mipi_dsi_probe()
304 reset_control_assert(mipi_dsi->top_rst); in meson_dw_mipi_dsi_probe()
306 reset_control_deassert(mipi_dsi->top_rst); in meson_dw_mipi_dsi_probe()
308 /* MIPI DSI Controller */ in meson_dw_mipi_dsi_probe()
310 mipi_dsi->dev = dev; in meson_dw_mipi_dsi_probe()
311 mipi_dsi->pdata.base = mipi_dsi->base; in meson_dw_mipi_dsi_probe()
312 mipi_dsi->pdata.max_data_lanes = 4; in meson_dw_mipi_dsi_probe()
313 mipi_dsi->pdata.phy_ops = &meson_dw_mipi_dsi_phy_ops; in meson_dw_mipi_dsi_probe()
314 mipi_dsi->pdata.host_ops = &meson_dw_mipi_dsi_host_ops; in meson_dw_mipi_dsi_probe()
315 mipi_dsi->pdata.priv_data = mipi_dsi; in meson_dw_mipi_dsi_probe()
318 mipi_dsi->dmd = dw_mipi_dsi_probe(pdev, &mipi_dsi->pdata); in meson_dw_mipi_dsi_probe()
319 if (IS_ERR(mipi_dsi->dmd)) in meson_dw_mipi_dsi_probe()
320 return dev_err_probe(dev, PTR_ERR(mipi_dsi->dmd), in meson_dw_mipi_dsi_probe()
330 dw_mipi_dsi_remove(mipi_dsi->dmd); in meson_dw_mipi_dsi_remove()
334 { .compatible = "amlogic,meson-g12a-dw-mipi-dsi", },