Lines Matching refs:lvds

56 	void (*pll_setup)(struct rcar_lvds *lvds, unsigned int freq);
86 static void rcar_lvds_write(struct rcar_lvds *lvds, u32 reg, u32 data)
88 iowrite32(data, lvds->mmio + reg);
97 struct rcar_lvds *lvds = connector_to_rcar_lvds(connector);
99 return drm_panel_get_modes(lvds->panel, connector);
105 struct rcar_lvds *lvds = connector_to_rcar_lvds(connector);
115 dev_dbg(lvds->dev, "connector: empty modes list\n");
154 static void rcar_lvds_pll_setup_gen2(struct rcar_lvds *lvds, unsigned int freq)
167 rcar_lvds_write(lvds, LVDPLLCR, val);
170 static void rcar_lvds_pll_setup_gen3(struct rcar_lvds *lvds, unsigned int freq)
183 rcar_lvds_write(lvds, LVDPLLCR, val);
195 static void rcar_lvds_d3_e3_pll_calc(struct rcar_lvds *lvds, struct clk *clk,
319 dev_dbg(lvds->dev,
326 static void __rcar_lvds_pll_setup_d3_e3(struct rcar_lvds *lvds,
332 rcar_lvds_d3_e3_pll_calc(lvds, lvds->clocks.dotclkin[0], freq, &pll,
334 rcar_lvds_d3_e3_pll_calc(lvds, lvds->clocks.dotclkin[1], freq, &pll,
336 rcar_lvds_d3_e3_pll_calc(lvds, lvds->clocks.extal, freq, &pll,
349 rcar_lvds_write(lvds, LVDPLLCR, lvdpllcr);
356 rcar_lvds_write(lvds, LVDDIV, LVDDIV_DIVSEL |
359 rcar_lvds_write(lvds, LVDDIV, 0);
362 static void rcar_lvds_pll_setup_d3_e3(struct rcar_lvds *lvds, unsigned int freq)
364 __rcar_lvds_pll_setup_d3_e3(lvds, freq, false);
373 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
376 if (WARN_ON(!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)))
379 dev_dbg(lvds->dev, "enabling LVDS PLL, freq=%luHz\n", freq);
381 ret = clk_prepare_enable(lvds->clocks.mod);
385 __rcar_lvds_pll_setup_d3_e3(lvds, freq, true);
393 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
395 if (WARN_ON(!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)))
398 dev_dbg(lvds->dev, "disabling LVDS PLL\n");
400 rcar_lvds_write(lvds, LVDPLLCR, 0);
402 clk_disable_unprepare(lvds->clocks.mod);
410 static enum rcar_lvds_mode rcar_lvds_get_lvds_mode(struct rcar_lvds *lvds,
420 if (!lvds->panel)
425 dev_warn(lvds->dev,
439 dev_warn(lvds->dev,
456 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
461 ret = clk_prepare_enable(lvds->clocks.mod);
466 if (lvds->link_type != RCAR_LVDS_SINGLE_LINK && lvds->companion)
467 __rcar_lvds_atomic_enable(lvds->companion, state, crtc,
478 rcar_lvds_write(lvds, LVDCTRCR, LVDCTRCR_CTR3SEL_ZERO |
482 if (lvds->info->quirks & RCAR_LVDS_QUIRK_LANES)
489 rcar_lvds_write(lvds, LVDCHCR, lvdhcr);
491 if (lvds->info->quirks & RCAR_LVDS_QUIRK_DUAL_LINK) {
494 if (lvds->link_type != RCAR_LVDS_SINGLE_LINK) {
502 bool swap_pixels = lvds->link_type ==
513 | (lvds->companion && swap_pixels ?
516 rcar_lvds_write(lvds, LVDSTRIPE, lvdstripe);
523 if (lvds->link_type == RCAR_LVDS_SINGLE_LINK || lvds->companion) {
529 lvds->info->pll_setup(lvds, mode->clock * 1000);
533 lvdcr0 = rcar_lvds_get_lvds_mode(lvds, connector) << LVDCR0_LVMD_SHIFT;
535 if (lvds->bridge.encoder) {
540 rcar_lvds_write(lvds, LVDCR0, lvdcr0);
543 rcar_lvds_write(lvds, LVDCR1,
547 if (lvds->info->gen < 3) {
550 rcar_lvds_write(lvds, LVDCR0, lvdcr0);
553 if (!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)) {
559 rcar_lvds_write(lvds, LVDCR0, lvdcr0);
562 if (lvds->info->quirks & RCAR_LVDS_QUIRK_PWD) {
565 rcar_lvds_write(lvds, LVDCR0, lvdcr0);
568 if (lvds->info->quirks & RCAR_LVDS_QUIRK_GEN3_LVEN) {
574 if (!(lvds->info->quirks & RCAR_LVDS_QUIRK_PWD))
575 rcar_lvds_write(lvds, LVDCR0, lvdcr0);
578 if (!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)) {
585 rcar_lvds_write(lvds, LVDCR0, lvdcr0);
587 if (lvds->panel) {
588 drm_panel_prepare(lvds->panel);
589 drm_panel_enable(lvds->panel);
610 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
612 if (lvds->panel) {
613 drm_panel_disable(lvds->panel);
614 drm_panel_unprepare(lvds->panel);
617 rcar_lvds_write(lvds, LVDCR0, 0);
618 rcar_lvds_write(lvds, LVDCR1, 0);
619 rcar_lvds_write(lvds, LVDPLLCR, 0);
622 if (lvds->link_type != RCAR_LVDS_SINGLE_LINK && lvds->companion)
623 lvds->companion->funcs->atomic_disable(lvds->companion,
626 clk_disable_unprepare(lvds->clocks.mod);
633 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
641 min_freq = lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL ? 5000 : 31000;
650 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
651 struct drm_connector *connector = &lvds->connector;
656 if (lvds->next_bridge)
657 return drm_bridge_attach(bridge->encoder, lvds->next_bridge,
666 if (!lvds->panel)
700 struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge);
702 return lvds->link_type != RCAR_LVDS_SINGLE_LINK;
710 static int rcar_lvds_parse_dt_companion(struct rcar_lvds *lvds)
716 struct device *dev = lvds->dev;
750 lvds->link_type = RCAR_LVDS_DUAL_LINK_ODD_EVEN_PIXELS;
753 lvds->link_type = RCAR_LVDS_DUAL_LINK_EVEN_ODD_PIXELS;
762 if (lvds->next_bridge && lvds->next_bridge->timings &&
763 lvds->next_bridge->timings->dual_link)
764 lvds->link_type = RCAR_LVDS_DUAL_LINK_EVEN_ODD_PIXELS;
766 lvds->link_type = RCAR_LVDS_SINGLE_LINK;
769 if (lvds->link_type == RCAR_LVDS_SINGLE_LINK) {
774 lvds->companion = of_drm_find_bridge(companion);
775 if (!lvds->companion) {
784 if (lvds->link_type == RCAR_LVDS_DUAL_LINK_ODD_EVEN_PIXELS)
796 companion_lvds = bridge_to_rcar_lvds(lvds->companion);
797 companion_lvds->link_type = lvds->link_type;
805 static int rcar_lvds_parse_dt(struct rcar_lvds *lvds)
809 ret = drm_of_find_panel_or_bridge(lvds->dev->of_node, 1, 0,
810 &lvds->panel, &lvds->next_bridge);
814 if (lvds->info->quirks & RCAR_LVDS_QUIRK_DUAL_LINK)
815 ret = rcar_lvds_parse_dt_companion(lvds);
824 if (lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL)
830 static struct clk *rcar_lvds_get_clock(struct rcar_lvds *lvds, const char *name,
835 clk = devm_clk_get(lvds->dev, name);
843 dev_err(lvds->dev, "failed to get %s clock\n",
849 static int rcar_lvds_get_clocks(struct rcar_lvds *lvds)
851 lvds->clocks.mod = rcar_lvds_get_clock(lvds, NULL, false);
852 if (IS_ERR(lvds->clocks.mod))
853 return PTR_ERR(lvds->clocks.mod);
858 if (!(lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL))
861 lvds->clocks.extal = rcar_lvds_get_clock(lvds, "extal", true);
862 if (IS_ERR(lvds->clocks.extal))
863 return PTR_ERR(lvds->clocks.extal);
865 lvds->clocks.dotclkin[0] = rcar_lvds_get_clock(lvds, "dclkin.0", true);
866 if (IS_ERR(lvds->clocks.dotclkin[0]))
867 return PTR_ERR(lvds->clocks.dotclkin[0]);
869 lvds->clocks.dotclkin[1] = rcar_lvds_get_clock(lvds, "dclkin.1", true);
870 if (IS_ERR(lvds->clocks.dotclkin[1]))
871 return PTR_ERR(lvds->clocks.dotclkin[1]);
874 if (!lvds->clocks.extal && !lvds->clocks.dotclkin[0] &&
875 !lvds->clocks.dotclkin[1]) {
876 dev_err(lvds->dev,
901 struct rcar_lvds *lvds;
905 lvds = devm_kzalloc(&pdev->dev, sizeof(*lvds), GFP_KERNEL);
906 if (lvds == NULL)
909 platform_set_drvdata(pdev, lvds);
911 lvds->dev = &pdev->dev;
912 lvds->info = of_device_get_match_data(&pdev->dev);
916 lvds->info = attr->data;
918 ret = rcar_lvds_parse_dt(lvds);
922 lvds->bridge.driver_private = lvds;
923 lvds->bridge.funcs = &rcar_lvds_bridge_ops;
924 lvds->bridge.of_node = pdev->dev.of_node;
927 lvds->mmio = devm_ioremap_resource(&pdev->dev, mem);
928 if (IS_ERR(lvds->mmio))
929 return PTR_ERR(lvds->mmio);
931 ret = rcar_lvds_get_clocks(lvds);
935 drm_bridge_add(&lvds->bridge);
942 struct rcar_lvds *lvds = platform_get_drvdata(pdev);
944 drm_bridge_remove(&lvds->bridge);
981 { .compatible = "renesas,r8a7742-lvds", .data = &rcar_lvds_gen2_info },
982 { .compatible = "renesas,r8a7743-lvds", .data = &rcar_lvds_gen2_info },
983 { .compatible = "renesas,r8a7744-lvds", .data = &rcar_lvds_gen2_info },
984 { .compatible = "renesas,r8a774a1-lvds", .data = &rcar_lvds_gen3_info },
985 { .compatible = "renesas,r8a774b1-lvds", .data = &rcar_lvds_gen3_info },
986 { .compatible = "renesas,r8a774c0-lvds", .data = &rcar_lvds_r8a77990_info },
987 { .compatible = "renesas,r8a774e1-lvds", .data = &rcar_lvds_gen3_info },
988 { .compatible = "renesas,r8a7790-lvds", .data = &rcar_lvds_gen2_info },
989 { .compatible = "renesas,r8a7791-lvds", .data = &rcar_lvds_gen2_info },
990 { .compatible = "renesas,r8a7793-lvds", .data = &rcar_lvds_gen2_info },
991 { .compatible = "renesas,r8a7795-lvds", .data = &rcar_lvds_gen3_info },
992 { .compatible = "renesas,r8a7796-lvds", .data = &rcar_lvds_gen3_info },
993 { .compatible = "renesas,r8a77965-lvds", .data = &rcar_lvds_gen3_info },
994 { .compatible = "renesas,r8a77970-lvds", .data = &rcar_lvds_r8a77970_info },
995 { .compatible = "renesas,r8a77980-lvds", .data = &rcar_lvds_gen3_info },
996 { .compatible = "renesas,r8a77990-lvds", .data = &rcar_lvds_r8a77990_info },
997 { .compatible = "renesas,r8a77995-lvds", .data = &rcar_lvds_r8a77995_info },
1007 .name = "rcar-lvds",