Lines Matching +full:bias +full:- +full:ctrl +full:- +full:value

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
176 #define LCD_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
177 #define LCD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
178 #define LCD_LOCK_INIT(_sc) mtx_init(&(_sc)->sc_mtx, \
179 device_get_nameunit(_sc->sc_dev), "am335x_lcd", MTX_DEF)
180 #define LCD_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx);
182 #define LCD_READ4(_sc, reg) bus_read_4((_sc)->sc_mem_res, reg);
183 #define LCD_WRITE4(_sc, reg, value) \ argument
184 bus_write_4((_sc)->sc_mem_res, reg, value);
190 #define MODE_HBP(mode) ((mode)->htotal - (mode)->hsync_end)
191 #define MODE_HFP(mode) ((mode)->hsync_start - (mode)->hdisplay)
192 #define MODE_HSW(mode) ((mode)->hsync_end - (mode)->hsync_start)
193 #define MODE_VBP(mode) ((mode)->vtotal - (mode)->vsync_end)
194 #define MODE_VFP(mode) ((mode)->vsync_start - (mode)->vdisplay)
195 #define MODE_VSW(mode) ((mode)->vsync_end - (mode)->vsync_start)
250 delta = abs(reference/i - freq); in am335x_lcd_calc_divisor()
267 backlight = sc->sc_backlight; in am335x_lcd_sysctl_backlight()
270 if (error != 0 || req->newptr == NULL) in am335x_lcd_sysctl_backlight()
282 sc->sc_backlight = backlight; in am335x_lcd_sysctl_backlight()
294 refresh = (mode->dot_clock * 1000 / mode->htotal); in am335x_mode_vrefresh()
295 refresh = (refresh + mode->vtotal / 2) / mode->vtotal; in am335x_mode_vrefresh()
297 if (mode->flags & VID_INTERLACE) in am335x_mode_vrefresh()
299 if (mode->flags & VID_DBLSCAN) in am335x_mode_vrefresh()
311 if (mode->dot_clock > MAX_PIXEL_CLOCK) in am335x_mode_is_valid()
314 if (mode->hdisplay & 0xf) in am335x_mode_is_valid()
317 if (mode->vdisplay > 2048) in am335x_mode_is_valid()
321 hbp = MODE_HBP(mode) - 1; in am335x_mode_is_valid()
322 hfp = MODE_HFP(mode) - 1; in am335x_mode_is_valid()
323 hsw = MODE_HSW(mode) - 1; in am335x_mode_is_valid()
326 vsw = MODE_VSW(mode) - 1; in am335x_mode_is_valid()
341 if (mode->vdisplay*mode->hdisplay*am335x_mode_vrefresh(mode) in am335x_mode_is_valid()
358 sc->sc_hdmi_framer = 0; in am335x_read_hdmi_property()
363 if (OF_getencprop(node, "hdmi", &hdmi_xref, sizeof(hdmi_xref)) != -1) { in am335x_read_hdmi_property()
364 sc->sc_hdmi_framer = hdmi_xref; in am335x_read_hdmi_property()
370 * bindings/media/video-interfaces.txt in am335x_read_hdmi_property()
381 if (OF_getencprop(endpoint, "remote-endpoint", &xref, sizeof(xref)) != -1) { in am335x_read_hdmi_property()
389 sc->sc_hdmi_framer = OF_xref_from_node(OF_parent(node)); in am335x_read_hdmi_property()
390 if (sc->sc_hdmi_framer != 0) in am335x_read_hdmi_property()
418 timings_node = ofw_bus_find_child(node, "display-timings"); in am335x_read_timing()
420 device_printf(dev, "no \"display-timings\" node\n"); in am335x_read_timing()
421 return (-1); in am335x_read_timing()
424 if (OF_searchencprop(timings_node, "native-mode", &native, in am335x_read_timing()
425 sizeof(native)) == -1) { in am335x_read_timing()
426 device_printf(dev, "no \"native-mode\" reference in \"timings\" node\n"); in am335x_read_timing()
427 return (-1); in am335x_read_timing()
434 "hactive", &panel->panel_width))) in am335x_read_timing()
438 "vactive", &panel->panel_height))) in am335x_read_timing()
442 "hfront-porch", &panel->panel_hfp))) in am335x_read_timing()
446 "hback-porch", &panel->panel_hbp))) in am335x_read_timing()
450 "hsync-len", &panel->panel_hsw))) in am335x_read_timing()
454 "vfront-porch", &panel->panel_vfp))) in am335x_read_timing()
458 "vback-porch", &panel->panel_vbp))) in am335x_read_timing()
462 "vsync-len", &panel->panel_vsw))) in am335x_read_timing()
466 "clock-frequency", &panel->panel_pxl_clk))) in am335x_read_timing()
470 "pixelclk-active", &panel->pixelclk_active))) in am335x_read_timing()
474 "hsync-active", &panel->hsync_active))) in am335x_read_timing()
478 "vsync-active", &panel->vsync_active))) in am335x_read_timing()
490 panel_info_node = ofw_bus_find_child(node, "panel-info"); in am335x_read_panel_info()
492 return (-1); in am335x_read_panel_info()
495 "ac-bias", &panel->ac_bias); in am335x_read_panel_info()
498 "ac-bias-intrpt", &panel->ac_bias_intrpt); in am335x_read_panel_info()
501 "dma-burst-sz", &panel->dma_burst_sz); in am335x_read_panel_info()
504 "bpp", &panel->bpp); in am335x_read_panel_info()
507 "fdd", &panel->fdd); in am335x_read_panel_info()
510 "sync-edge", &panel->sync_edge); in am335x_read_panel_info()
513 "sync-ctrl", &panel->sync_ctrl); in am335x_read_panel_info()
526 /* Read value back to make sure it reached the hardware */ in am335x_lcd_intr()
552 LCD_WRITE4(sc, LCD_LCDDMA_FB0_BASE, sc->sc_fb_phys); in am335x_lcd_intr()
553 LCD_WRITE4(sc, LCD_LCDDMA_FB0_CEILING, sc->sc_fb_phys + sc->sc_fb_size - 1); in am335x_lcd_intr()
558 LCD_WRITE4(sc, LCD_LCDDMA_FB1_BASE, sc->sc_fb_phys); in am335x_lcd_intr()
559 LCD_WRITE4(sc, LCD_LCDDMA_FB1_CEILING, sc->sc_fb_phys + sc->sc_fb_size - 1); in am335x_lcd_intr()
573 /* Read value back to make sure it reached the hardware */ in am335x_lcd_intr()
590 if (ei->edid_preferred_mode != NULL) { in am335x_lcd_pick_mode()
591 if (am335x_mode_is_valid(ei->edid_preferred_mode)) in am335x_lcd_pick_mode()
592 videomode = ei->edid_preferred_mode; in am335x_lcd_pick_mode()
596 m = ei->edid_modes; in am335x_lcd_pick_mode()
598 sort_modes(ei->edid_modes, in am335x_lcd_pick_mode()
599 &ei->edid_preferred_mode, in am335x_lcd_pick_mode()
600 ei->edid_nmodes); in am335x_lcd_pick_mode()
601 for (n = 0; n < ei->edid_nmodes; n++) in am335x_lcd_pick_mode()
626 * HDMI/DVI displays are very sensitive to error in frequncy value in am335x_lcd_configure()
629 err = clk_set_freq(sc->sc_clk_dpll_disp_ck, sc->sc_panel.panel_pxl_clk*2, in am335x_lcd_configure()
632 device_printf(sc->sc_dev, "can't set source frequency\n"); in am335x_lcd_configure()
636 err = clk_get_freq(sc->sc_clk_dpll_disp_ck, &ref_freq); in am335x_lcd_configure()
638 device_printf(sc->sc_dev, "can't get reference frequency\n"); in am335x_lcd_configure()
643 dma_size = round_page(sc->sc_panel.panel_width*sc->sc_panel.panel_height*sc->sc_panel.bpp/8); in am335x_lcd_configure()
649 bus_get_dma_tag(sc->sc_dev), in am335x_lcd_configure()
657 &sc->sc_dma_tag); in am335x_lcd_configure()
661 err = bus_dmamem_alloc(sc->sc_dma_tag, (void **)&sc->sc_fb_base, in am335x_lcd_configure()
662 BUS_DMA_COHERENT, &sc->sc_dma_map); in am335x_lcd_configure()
665 device_printf(sc->sc_dev, "cannot allocate framebuffer\n"); in am335x_lcd_configure()
669 err = bus_dmamap_load(sc->sc_dma_tag, sc->sc_dma_map, sc->sc_fb_base, in am335x_lcd_configure()
670 dma_size, am335x_fb_dmamap_cb, &sc->sc_fb_phys, BUS_DMA_NOWAIT); in am335x_lcd_configure()
673 device_printf(sc->sc_dev, "cannot load DMA map\n"); in am335x_lcd_configure()
678 memset(sc->sc_fb_base, 0x0, dma_size); in am335x_lcd_configure()
681 sc->sc_fb_size = sc->sc_panel.panel_width*sc->sc_panel.panel_height*sc->sc_panel.bpp/8; in am335x_lcd_configure()
685 div = am335x_lcd_calc_divisor(ref_freq, sc->sc_panel.panel_pxl_clk); in am335x_lcd_configure()
692 hbp = sc->sc_panel.panel_hbp - 1; in am335x_lcd_configure()
693 hfp = sc->sc_panel.panel_hfp - 1; in am335x_lcd_configure()
694 hsw = sc->sc_panel.panel_hsw - 1; in am335x_lcd_configure()
696 vbp = sc->sc_panel.panel_vbp; in am335x_lcd_configure()
697 vfp = sc->sc_panel.panel_vfp; in am335x_lcd_configure()
698 vsw = sc->sc_panel.panel_vsw - 1; in am335x_lcd_configure()
700 height = sc->sc_panel.panel_height - 1; in am335x_lcd_configure()
701 width = sc->sc_panel.panel_width - 1; in am335x_lcd_configure()
731 if (sc->sc_panel.sync_ctrl) in am335x_lcd_configure()
733 if (sc->sc_panel.sync_edge) in am335x_lcd_configure()
737 if (sc->sc_panel.hsync_active == 0) in am335x_lcd_configure()
739 if (sc->sc_panel.vsync_active == 0) in am335x_lcd_configure()
741 if (sc->sc_panel.pixelclk_active == 0) in am335x_lcd_configure()
744 /* AC bias */ in am335x_lcd_configure()
745 timing2 |= (sc->sc_panel.ac_bias << RASTER_TIMING_2_ACB_SHIFT); in am335x_lcd_configure()
746 timing2 |= (sc->sc_panel.ac_bias_intrpt << RASTER_TIMING_2_ACBI_SHIFT); in am335x_lcd_configure()
755 switch (sc->sc_panel.dma_burst_sz) { in am335x_lcd_configure()
778 LCD_WRITE4(sc, LCD_LCDDMA_FB0_BASE, sc->sc_fb_phys); in am335x_lcd_configure()
779 LCD_WRITE4(sc, LCD_LCDDMA_FB0_CEILING, sc->sc_fb_phys + sc->sc_fb_size - 1); in am335x_lcd_configure()
780 LCD_WRITE4(sc, LCD_LCDDMA_FB1_BASE, sc->sc_fb_phys); in am335x_lcd_configure()
781 LCD_WRITE4(sc, LCD_LCDDMA_FB1_CEILING, sc->sc_fb_phys + sc->sc_fb_size - 1); in am335x_lcd_configure()
785 reg |= (sc->sc_panel.fdd << RASTER_CTRL_REQDLY_SHIFT); in am335x_lcd_configure()
787 if (sc->sc_panel.bpp >= 24) in am335x_lcd_configure()
789 if (sc->sc_panel.bpp == 32) in am335x_lcd_configure()
812 sc->sc_fb_info.fb_name = device_get_nameunit(sc->sc_dev); in am335x_lcd_configure()
813 sc->sc_fb_info.fb_vbase = (intptr_t)sc->sc_fb_base; in am335x_lcd_configure()
814 sc->sc_fb_info.fb_pbase = sc->sc_fb_phys; in am335x_lcd_configure()
815 sc->sc_fb_info.fb_size = sc->sc_fb_size; in am335x_lcd_configure()
816 sc->sc_fb_info.fb_bpp = sc->sc_fb_info.fb_depth = sc->sc_panel.bpp; in am335x_lcd_configure()
817 sc->sc_fb_info.fb_stride = sc->sc_panel.panel_width*sc->sc_panel.bpp / 8; in am335x_lcd_configure()
818 sc->sc_fb_info.fb_width = sc->sc_panel.panel_width; in am335x_lcd_configure()
819 sc->sc_fb_info.fb_height = sc->sc_panel.panel_height; in am335x_lcd_configure()
822 err = (sc_attach_unit(device_get_unit(sc->sc_dev), in am335x_lcd_configure()
823 device_get_flags(sc->sc_dev) | SC_AUTODETECT_KBD)); in am335x_lcd_configure()
826 device_printf(sc->sc_dev, "failed to attach syscons\n"); in am335x_lcd_configure()
830 am335x_lcd_syscons_setup((vm_offset_t)sc->sc_fb_base, sc->sc_fb_phys, &panel); in am335x_lcd_configure()
832 device_t fbd = device_add_child(sc->sc_dev, "fbd", in am335x_lcd_configure()
833 device_get_unit(sc->sc_dev)); in am335x_lcd_configure()
836 device_printf(sc->sc_dev, "failed to attach fbd device\n"); in am335x_lcd_configure()
838 device_printf(sc->sc_dev, "failed to add fbd child\n"); in am335x_lcd_configure()
859 if (!sc->sc_hdmi_framer) { in am335x_lcd_hdmi_event()
860 device_printf(sc->sc_dev, "HDMI event without HDMI framer set\n"); in am335x_lcd_hdmi_event()
864 hdmi_dev = OF_device_from_xref(sc->sc_hdmi_framer); in am335x_lcd_hdmi_event()
866 device_printf(sc->sc_dev, "no actual device for \"hdmi\" property\n"); in am335x_lcd_hdmi_event()
873 device_printf(sc->sc_dev, "failed to get EDID info from HDMI framer\n"); in am335x_lcd_hdmi_event()
883 device_printf(sc->sc_dev, "failed to parse EDID\n"); in am335x_lcd_hdmi_event()
890 device_printf(sc->sc_dev, "failed to find usable videomode"); in am335x_lcd_hdmi_event()
894 device_printf(sc->sc_dev, "detected videomode: %dx%d @ %dKHz\n", videomode->hdisplay, in am335x_lcd_hdmi_event()
895 videomode->vdisplay, am335x_mode_vrefresh(videomode)); in am335x_lcd_hdmi_event()
897 sc->sc_panel.panel_width = videomode->hdisplay; in am335x_lcd_hdmi_event()
898 sc->sc_panel.panel_height = videomode->vdisplay; in am335x_lcd_hdmi_event()
899 sc->sc_panel.panel_hfp = videomode->hsync_start - videomode->hdisplay; in am335x_lcd_hdmi_event()
900 sc->sc_panel.panel_hbp = videomode->htotal - videomode->hsync_end; in am335x_lcd_hdmi_event()
901 sc->sc_panel.panel_hsw = videomode->hsync_end - videomode->hsync_start; in am335x_lcd_hdmi_event()
902 sc->sc_panel.panel_vfp = videomode->vsync_start - videomode->vdisplay; in am335x_lcd_hdmi_event()
903 sc->sc_panel.panel_vbp = videomode->vtotal - videomode->vsync_end; in am335x_lcd_hdmi_event()
904 sc->sc_panel.panel_vsw = videomode->vsync_end - videomode->vsync_start; in am335x_lcd_hdmi_event()
905 sc->sc_panel.pixelclk_active = 1; in am335x_lcd_hdmi_event()
908 if (videomode->flags & VID_NHSYNC) in am335x_lcd_hdmi_event()
909 sc->sc_panel.hsync_active = 1; in am335x_lcd_hdmi_event()
911 sc->sc_panel.hsync_active = 0; in am335x_lcd_hdmi_event()
913 if (videomode->flags & VID_NVSYNC) in am335x_lcd_hdmi_event()
914 sc->sc_panel.vsync_active = 0; in am335x_lcd_hdmi_event()
916 sc->sc_panel.vsync_active = 1; in am335x_lcd_hdmi_event()
918 sc->sc_panel.panel_pxl_clk = videomode->dot_clock * 1000; in am335x_lcd_hdmi_event()
923 hdmi_mode.hskew = videomode->hsync_end - videomode->hsync_start; in am335x_lcd_hdmi_event()
939 if (!ofw_bus_is_compatible(dev, "ti,am33xx-tilcdc")) in am335x_lcd_probe()
967 sc->sc_dev = dev; in am335x_lcd_attach()
972 if (root == -1) { in am335x_lcd_attach()
978 err = clk_get_by_name(dev, "dpll_disp_ck@498", &sc->sc_clk_dpll_disp_ck); in am335x_lcd_attach()
984 sc->sc_panel.ac_bias = 255; in am335x_lcd_attach()
985 sc->sc_panel.ac_bias_intrpt = 0; in am335x_lcd_attach()
986 sc->sc_panel.dma_burst_sz = 16; in am335x_lcd_attach()
987 sc->sc_panel.bpp = 16; in am335x_lcd_attach()
988 sc->sc_panel.fdd = 128; in am335x_lcd_attach()
989 sc->sc_panel.sync_edge = 0; in am335x_lcd_attach()
990 sc->sc_panel.sync_ctrl = 1; in am335x_lcd_attach()
995 if (am335x_read_panel_info(dev, panel_node, &sc->sc_panel)) { in am335x_lcd_attach()
1000 if (am335x_read_timing(dev, panel_node, &sc->sc_panel)) { in am335x_lcd_attach()
1013 sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in am335x_lcd_attach()
1015 if (!sc->sc_mem_res) { in am335x_lcd_attach()
1021 sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in am335x_lcd_attach()
1023 if (!sc->sc_irq_res) { in am335x_lcd_attach()
1024 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); in am335x_lcd_attach()
1029 if (bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE, in am335x_lcd_attach()
1031 &sc->sc_intr_hl) != 0) { in am335x_lcd_attach()
1033 sc->sc_irq_res); in am335x_lcd_attach()
1035 sc->sc_mem_res); in am335x_lcd_attach()
1043 ctx = device_get_sysctl_ctx(sc->sc_dev); in am335x_lcd_attach()
1044 tree = device_get_sysctl_tree(sc->sc_dev); in am335x_lcd_attach()
1045 sc->sc_oid = SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, in am335x_lcd_attach()
1048 sc->sc_backlight = 0; in am335x_lcd_attach()
1052 sc->sc_backlight = 100; in am335x_lcd_attach()
1057 sc->sc_hdmi_evh = EVENTHANDLER_REGISTER(hdmi_event, in am335x_lcd_attach()
1077 return (&sc->sc_fb_info); in am335x_lcd_fb_getinfo()