Lines Matching full:sdi
7 #define DSS_SUBSYS_NAME "SDI"
43 struct sdi_device *sdi; member
69 return dispc_div_calc(ctx->sdi->dss->dispc, fck, in dpi_calc_dss_cb()
74 static int sdi_calc_clock_div(struct sdi_device *sdi, unsigned long pclk, in sdi_calc_clock_div() argument
93 ctx.sdi = sdi; in sdi_calc_clock_div()
101 ok = dss_div_calc(sdi->dss, pclk, ctx.pck_min, in sdi_calc_clock_div()
113 static void sdi_config_lcd_manager(struct sdi_device *sdi) in sdi_config_lcd_manager() argument
115 sdi->mgr_config.io_pad_mode = DSS_IO_PAD_MODE_BYPASS; in sdi_config_lcd_manager()
117 sdi->mgr_config.stallmode = false; in sdi_config_lcd_manager()
118 sdi->mgr_config.fifohandcheck = false; in sdi_config_lcd_manager()
120 sdi->mgr_config.video_port_width = 24; in sdi_config_lcd_manager()
121 sdi->mgr_config.lcden_sig_polarity = 1; in sdi_config_lcd_manager()
123 dss_mgr_set_lcd_config(&sdi->output, &sdi->mgr_config); in sdi_config_lcd_manager()
133 struct sdi_device *sdi = drm_bridge_to_sdi(bridge); in sdi_bridge_attach() local
138 return drm_bridge_attach(bridge->encoder, sdi->output.next_bridge, in sdi_bridge_attach()
147 struct sdi_device *sdi = drm_bridge_to_sdi(bridge); in sdi_bridge_mode_valid() local
156 ret = sdi_calc_clock_div(sdi, pixelclock, &fck, &dispc_cinfo); in sdi_bridge_mode_valid()
167 struct sdi_device *sdi = drm_bridge_to_sdi(bridge); in sdi_bridge_mode_fixup() local
174 ret = sdi_calc_clock_div(sdi, pixelclock, &fck, &dispc_cinfo); in sdi_bridge_mode_fixup()
181 dev_dbg(&sdi->pdev->dev, in sdi_bridge_mode_fixup()
194 struct sdi_device *sdi = drm_bridge_to_sdi(bridge); in sdi_bridge_mode_set() local
196 sdi->pixelclock = adjusted_mode->clock * 1000; in sdi_bridge_mode_set()
201 struct sdi_device *sdi = drm_bridge_to_sdi(bridge); in sdi_bridge_enable() local
206 r = regulator_enable(sdi->vdds_sdi_reg); in sdi_bridge_enable()
210 r = dispc_runtime_get(sdi->dss->dispc); in sdi_bridge_enable()
214 r = sdi_calc_clock_div(sdi, sdi->pixelclock, &fck, &dispc_cinfo); in sdi_bridge_enable()
218 sdi->mgr_config.clock_info = dispc_cinfo; in sdi_bridge_enable()
220 r = dss_set_fck_rate(sdi->dss, fck); in sdi_bridge_enable()
224 sdi_config_lcd_manager(sdi); in sdi_bridge_enable()
229 * However, SDI uses pck-free as source clock for its PLL, and pck-free in sdi_bridge_enable()
237 dispc_mgr_set_clock_div(sdi->dss->dispc, sdi->output.dispc_channel, in sdi_bridge_enable()
238 &sdi->mgr_config.clock_info); in sdi_bridge_enable()
240 dss_sdi_init(sdi->dss, sdi->datapairs); in sdi_bridge_enable()
241 r = dss_sdi_enable(sdi->dss); in sdi_bridge_enable()
246 r = dss_mgr_enable(&sdi->output); in sdi_bridge_enable()
253 dss_sdi_disable(sdi->dss); in sdi_bridge_enable()
257 dispc_runtime_put(sdi->dss->dispc); in sdi_bridge_enable()
259 regulator_disable(sdi->vdds_sdi_reg); in sdi_bridge_enable()
264 struct sdi_device *sdi = drm_bridge_to_sdi(bridge); in sdi_bridge_disable() local
266 dss_mgr_disable(&sdi->output); in sdi_bridge_disable()
268 dss_sdi_disable(sdi->dss); in sdi_bridge_disable()
270 dispc_runtime_put(sdi->dss->dispc); in sdi_bridge_disable()
272 regulator_disable(sdi->vdds_sdi_reg); in sdi_bridge_disable()
284 static void sdi_bridge_init(struct sdi_device *sdi) in sdi_bridge_init() argument
286 sdi->bridge.funcs = &sdi_bridge_funcs; in sdi_bridge_init()
287 sdi->bridge.of_node = sdi->pdev->dev.of_node; in sdi_bridge_init()
288 sdi->bridge.type = DRM_MODE_CONNECTOR_LVDS; in sdi_bridge_init()
290 drm_bridge_add(&sdi->bridge); in sdi_bridge_init()
293 static void sdi_bridge_cleanup(struct sdi_device *sdi) in sdi_bridge_cleanup() argument
295 drm_bridge_remove(&sdi->bridge); in sdi_bridge_cleanup()
302 static int sdi_init_output(struct sdi_device *sdi) in sdi_init_output() argument
304 struct omap_dss_device *out = &sdi->output; in sdi_init_output()
307 sdi_bridge_init(sdi); in sdi_init_output()
309 out->dev = &sdi->pdev->dev; in sdi_init_output()
312 out->name = "sdi.0"; in sdi_init_output()
314 /* We have SDI only on OMAP3, where it's on port 1 */ in sdi_init_output()
319 r = omapdss_device_init_output(out, &sdi->bridge); in sdi_init_output()
321 sdi_bridge_cleanup(sdi); in sdi_init_output()
330 static void sdi_uninit_output(struct sdi_device *sdi) in sdi_uninit_output() argument
332 omapdss_device_unregister(&sdi->output); in sdi_uninit_output()
333 omapdss_device_cleanup_output(&sdi->output); in sdi_uninit_output()
335 sdi_bridge_cleanup(sdi); in sdi_uninit_output()
341 struct sdi_device *sdi; in sdi_init_port() local
346 sdi = kzalloc(sizeof(*sdi), GFP_KERNEL); in sdi_init_port()
347 if (!sdi) in sdi_init_port()
363 sdi->datapairs = datapairs; in sdi_init_port()
364 sdi->dss = dss; in sdi_init_port()
366 sdi->pdev = pdev; in sdi_init_port()
367 port->data = sdi; in sdi_init_port()
369 sdi->vdds_sdi_reg = devm_regulator_get(&pdev->dev, "vdds_sdi"); in sdi_init_port()
370 if (IS_ERR(sdi->vdds_sdi_reg)) { in sdi_init_port()
371 r = PTR_ERR(sdi->vdds_sdi_reg); in sdi_init_port()
377 r = sdi_init_output(sdi); in sdi_init_port()
384 kfree(sdi); in sdi_init_port()
391 struct sdi_device *sdi = port->data; in sdi_uninit_port() local
393 if (!sdi) in sdi_uninit_port()
396 sdi_uninit_output(sdi); in sdi_uninit_port()
397 kfree(sdi); in sdi_uninit_port()