Lines Matching +full:imx8mp +full:- +full:ldb

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 #include <linux/media-bus-format.h>
99 return (fsl_ldb->ch0_enabled && fsl_ldb->ch1_enabled); in fsl_ldb_is_dual()
120 return drm_bridge_attach(bridge->encoder, fsl_ldb->panel_bridge, in fsl_ldb_attach()
128 struct drm_atomic_state *state = old_bridge_state->base.state; in fsl_ldb_atomic_enable()
143 switch (bridge_state->output_bus_cfg.format) { in fsl_ldb_atomic_enable()
163 dev_warn(fsl_ldb->dev, in fsl_ldb_atomic_enable()
165 bridge_state->output_bus_cfg.format); in fsl_ldb_atomic_enable()
174 bridge->encoder); in fsl_ldb_atomic_enable()
175 crtc = drm_atomic_get_new_connector_state(state, connector)->crtc; in fsl_ldb_atomic_enable()
177 mode = &crtc_state->adjusted_mode; in fsl_ldb_atomic_enable()
179 requested_link_freq = fsl_ldb_link_frequency(fsl_ldb, mode->clock); in fsl_ldb_atomic_enable()
180 clk_set_rate(fsl_ldb->clk, requested_link_freq); in fsl_ldb_atomic_enable()
182 configured_link_freq = clk_get_rate(fsl_ldb->clk); in fsl_ldb_atomic_enable()
184 …dev_warn(fsl_ldb->dev, "Configured LDB clock (%lu Hz) does not match requested LVDS clock: %lu Hz\… in fsl_ldb_atomic_enable()
188 clk_prepare_enable(fsl_ldb->clk); in fsl_ldb_atomic_enable()
191 reg = (fsl_ldb->ch0_enabled ? LDB_CTRL_CH0_ENABLE : 0) | in fsl_ldb_atomic_enable()
192 (fsl_ldb->ch1_enabled ? LDB_CTRL_CH1_ENABLE : 0) | in fsl_ldb_atomic_enable()
196 reg |= (fsl_ldb->ch0_enabled ? LDB_CTRL_CH0_DATA_WIDTH : 0) | in fsl_ldb_atomic_enable()
197 (fsl_ldb->ch1_enabled ? LDB_CTRL_CH1_DATA_WIDTH : 0); in fsl_ldb_atomic_enable()
200 reg |= (fsl_ldb->ch0_enabled ? LDB_CTRL_CH0_BIT_MAPPING : 0) | in fsl_ldb_atomic_enable()
201 (fsl_ldb->ch1_enabled ? LDB_CTRL_CH1_BIT_MAPPING : 0); in fsl_ldb_atomic_enable()
203 if (mode->flags & DRM_MODE_FLAG_PVSYNC) in fsl_ldb_atomic_enable()
204 reg |= (fsl_ldb->ch0_enabled ? LDB_CTRL_DI0_VSYNC_POLARITY : 0) | in fsl_ldb_atomic_enable()
205 (fsl_ldb->ch1_enabled ? LDB_CTRL_DI1_VSYNC_POLARITY : 0); in fsl_ldb_atomic_enable()
207 regmap_write(fsl_ldb->regmap, fsl_ldb->devdata->ldb_ctrl, reg); in fsl_ldb_atomic_enable()
209 if (fsl_ldb->devdata->single_ctrl_reg) in fsl_ldb_atomic_enable()
215 regmap_write(fsl_ldb->regmap, fsl_ldb->devdata->lvds_ctrl, reg); in fsl_ldb_atomic_enable()
220 reg |= (fsl_ldb->ch0_enabled ? LVDS_CTRL_CH0_EN : 0) | in fsl_ldb_atomic_enable()
221 (fsl_ldb->ch1_enabled ? LVDS_CTRL_CH1_EN : 0); in fsl_ldb_atomic_enable()
223 regmap_write(fsl_ldb->regmap, fsl_ldb->devdata->lvds_ctrl, reg); in fsl_ldb_atomic_enable()
232 if (fsl_ldb->devdata->lvds_en_bit) in fsl_ldb_atomic_disable()
234 regmap_write(fsl_ldb->regmap, fsl_ldb->devdata->lvds_ctrl, in fsl_ldb_atomic_disable()
237 if (!fsl_ldb->devdata->single_ctrl_reg) in fsl_ldb_atomic_disable()
238 regmap_write(fsl_ldb->regmap, fsl_ldb->devdata->lvds_ctrl, 0); in fsl_ldb_atomic_disable()
239 regmap_write(fsl_ldb->regmap, fsl_ldb->devdata->ldb_ctrl, 0); in fsl_ldb_atomic_disable()
241 clk_disable_unprepare(fsl_ldb->clk); in fsl_ldb_atomic_disable()
275 if (mode->clock > (fsl_ldb_is_dual(fsl_ldb) ? 160000 : 80000)) in fsl_ldb_mode_valid()
294 struct device *dev = &pdev->dev; in fsl_ldb_probe()
303 return -ENOMEM; in fsl_ldb_probe()
305 fsl_ldb->devdata = of_device_get_match_data(dev); in fsl_ldb_probe()
306 if (!fsl_ldb->devdata) in fsl_ldb_probe()
307 return -EINVAL; in fsl_ldb_probe()
309 fsl_ldb->dev = &pdev->dev; in fsl_ldb_probe()
310 fsl_ldb->bridge.funcs = &funcs; in fsl_ldb_probe()
311 fsl_ldb->bridge.of_node = dev->of_node; in fsl_ldb_probe()
313 fsl_ldb->clk = devm_clk_get(dev, "ldb"); in fsl_ldb_probe()
314 if (IS_ERR(fsl_ldb->clk)) in fsl_ldb_probe()
315 return PTR_ERR(fsl_ldb->clk); in fsl_ldb_probe()
317 fsl_ldb->regmap = syscon_node_to_regmap(dev->of_node->parent); in fsl_ldb_probe()
318 if (IS_ERR(fsl_ldb->regmap)) in fsl_ldb_probe()
319 return PTR_ERR(fsl_ldb->regmap); in fsl_ldb_probe()
322 remote1 = of_graph_get_remote_node(dev->of_node, 1, 0); in fsl_ldb_probe()
323 remote2 = of_graph_get_remote_node(dev->of_node, 2, 0); in fsl_ldb_probe()
324 fsl_ldb->ch0_enabled = (remote1 != NULL); in fsl_ldb_probe()
325 fsl_ldb->ch1_enabled = (remote2 != NULL); in fsl_ldb_probe()
330 if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled) { in fsl_ldb_probe()
332 return dev_err_probe(dev, -ENXIO, "No panel node found"); in fsl_ldb_probe()
336 fsl_ldb_is_dual(fsl_ldb) ? "dual-link mode" : in fsl_ldb_probe()
337 fsl_ldb->ch0_enabled ? "channel 0" : "channel 1"); in fsl_ldb_probe()
344 fsl_ldb->panel_bridge = devm_drm_panel_bridge_add(dev, panel); in fsl_ldb_probe()
345 if (IS_ERR(fsl_ldb->panel_bridge)) in fsl_ldb_probe()
346 return PTR_ERR(fsl_ldb->panel_bridge); in fsl_ldb_probe()
352 port1 = of_graph_get_port_by_id(dev->of_node, 1); in fsl_ldb_probe()
353 port2 = of_graph_get_port_by_id(dev->of_node, 2); in fsl_ldb_probe()
365 return -EINVAL; in fsl_ldb_probe()
371 drm_bridge_add(&fsl_ldb->bridge); in fsl_ldb_probe()
380 drm_bridge_remove(&fsl_ldb->bridge); in fsl_ldb_remove()
384 { .compatible = "fsl,imx6sx-ldb",
386 { .compatible = "fsl,imx8mp-ldb",
388 { .compatible = "fsl,imx93-ldb",
398 .name = "fsl-ldb",
405 MODULE_DESCRIPTION("Freescale i.MX8MP LDB");