void lcd_enable(void) { #ifdef CONFIG_USE_FDT u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL); if (dtbaddr == ~0UL) { puts("lcdpower: failed to get 'dtbaddr' from env!\n"); return; } unsigned int driver = FDTPROP(dtbaddr, PATHINF, "brightdrv"); unsigned int bright = FDTPROP(dtbaddr, PATHINF, "brightdef"); unsigned int pwmfrq = FDTPROP(dtbaddr, PATHINF, "brightfdim"); #else unsigned int driver = getenv_ulong("ds1_bright_drv", 16, 0UL); unsigned int bright = getenv_ulong("ds1_bright_def", 10, 50); unsigned int pwmfrq = getenv_ulong("ds1_pwmfreq", 10, ~0UL); #endif unsigned int tmp; struct gptimer *const timerhw = (struct gptimer *)DM_TIMER6_BASE; bright = bright != ~0UL ? bright : 50; switch (driver) { case 0: /* PMIC LED-Driver */ /* brightness level */ tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_WLEDCTRL2, bright, 0xFF); /* turn on light */ tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_WLEDCTRL1, 0x0A, 0xFF); break; case 1: /* PWM using timer6 */ if (pwmfrq != ~0UL) { timerhw->tiocp_cfg = TCFG_RESET; udelay(10); while (timerhw->tiocp_cfg & TCFG_RESET) ; tmp = ~0UL-(V_OSCK/pwmfrq); /* bottom value */ timerhw->tldr = tmp; timerhw->tcrr = tmp; tmp = tmp + ((V_OSCK/pwmfrq)/100) * bright; timerhw->tmar = tmp; timerhw->tclr = (TCLR_PT | (2 << TCLR_TRG_SHIFT) | TCLR_CE | TCLR_AR | TCLR_ST); } else { puts("invalid pwmfrq in env/dtb! skip PWM-setup.\n"); } break; default: puts("no suitable backlightdriver in env/dtb!\n"); break; } br_summaryscreen(); }
void lcdpower(int on) { u32 pin, swval, i; #ifdef CONFIG_USE_FDT if (gd->fdt_blob == NULL) { printf("%s: don't have a valid gd->fdt_blob!\n", __func__); return; } pin = FDTPROP(PATHINF, "pwrpin"); #else pin = env_get_ulong("ds1_pwr", 16, ~0UL); #endif if (pin == ~0UL) { puts("no pwrpin in dtb/env, cannot powerup display!\n"); return; } for (i = 0; i < 3; i++) { if (pin != 0) { swval = pin & 0x80 ? 0 : 1; if (on) gpio_direction_output(pin & 0x7F, swval); else gpio_direction_output(pin & 0x7F, !swval); debug("switched pin %d to %d\n", pin & 0x7F, swval); } pin >>= 8; } }
void lcdpower(int on) { u32 pin, swval, i; #ifdef CONFIG_USE_FDT u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL); if (dtbaddr == ~0UL) { puts("lcdpower: failed to get 'dtbaddr' from env!\n"); return; } pin = FDTPROP(dtbaddr, PATHINF, "pwrpin"); #else pin = getenv_ulong("ds1_pwr", 16, ~0UL); #endif if (pin == ~0UL) { puts("no pwrpin in dtb/env, cannot powerup display!\n"); return; } for (i = 0; i < 3; i++) { if (pin != 0) { swval = pin & 0x80 ? 0 : 1; if (on) gpio_direction_output(pin & 0x7F, swval); else gpio_direction_output(pin & 0x7F, !swval); debug("switched pin %d to %d\n", pin & 0x7F, swval); } pin >>= 8; } }
void lcdbacklight(int on) { #ifdef CONFIG_USE_FDT if (gd->fdt_blob == NULL) { printf("%s: don't have a valid gd->fdt_blob!\n", __func__); return; } unsigned int driver = FDTPROP(PATHINF, "brightdrv"); unsigned int bright = FDTPROP(PATHINF, "brightdef"); unsigned int pwmfrq = FDTPROP(PATHINF, "brightfdim"); #else unsigned int driver = env_get_ulong("ds1_bright_drv", 16, 0UL); unsigned int bright = env_get_ulong("ds1_bright_def", 10, 50); unsigned int pwmfrq = env_get_ulong("ds1_pwmfreq", 10, ~0UL); #endif unsigned int tmp; struct gptimer *timerhw; if (on) bright = bright != ~0UL ? bright : 50; else bright = 0; switch (driver) { case 2: timerhw = (struct gptimer *)DM_TIMER5_BASE; break; default: timerhw = (struct gptimer *)DM_TIMER6_BASE; } switch (driver) { case 0: /* PMIC LED-Driver */ /* brightness level */ tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_WLEDCTRL2, bright, 0xFF); /* current sink */ tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, TPS65217_WLEDCTRL1, bright != 0 ? 0x0A : 0x02, 0xFF); break; case 1: case 2: /* PWM using timer */ if (pwmfrq != ~0UL) { timerhw->tiocp_cfg = TCFG_RESET; udelay(10); while (timerhw->tiocp_cfg & TCFG_RESET) ; tmp = ~0UL-(V_OSCK/pwmfrq); /* bottom value */ timerhw->tldr = tmp; timerhw->tcrr = tmp; tmp = tmp + ((V_OSCK/pwmfrq)/100) * bright; timerhw->tmar = tmp; timerhw->tclr = (TCLR_PT | (2 << TCLR_TRG_SHIFT) | TCLR_CE | TCLR_AR | TCLR_ST); } else { puts("invalid pwmfrq in env/dtb! skip PWM-setup.\n"); } break; default: puts("no suitable backlightdriver in env/dtb!\n"); break; } }
int load_lcdtiming(struct am335x_lcdpanel *panel) { struct am335x_lcdpanel pnltmp; #ifdef CONFIG_USE_FDT u32 dtbprop; char buf[32]; const char *nodep = 0; int nodeoff; if (gd->fdt_blob == NULL) { printf("%s: don't have a valid gd->fdt_blob!\n", __func__); return -1; } memcpy(&pnltmp, (void *)panel, sizeof(struct am335x_lcdpanel)); pnltmp.hactive = FDTPROP(PATHTIM, "hactive"); pnltmp.vactive = FDTPROP(PATHTIM, "vactive"); pnltmp.bpp = FDTPROP(PATHINF, "bpp"); pnltmp.hfp = FDTPROP(PATHTIM, "hfront-porch"); pnltmp.hbp = FDTPROP(PATHTIM, "hback-porch"); pnltmp.hsw = FDTPROP(PATHTIM, "hsync-len"); pnltmp.vfp = FDTPROP(PATHTIM, "vfront-porch"); pnltmp.vbp = FDTPROP(PATHTIM, "vback-porch"); pnltmp.vsw = FDTPROP(PATHTIM, "vsync-len"); pnltmp.pup_delay = FDTPROP(PATHTIM, "pupdelay"); pnltmp.pon_delay = FDTPROP(PATHTIM, "pondelay"); /* calc. proper clk-divisor */ dtbprop = FDTPROP(PATHTIM, "clock-frequency"); if (dtbprop != ~0UL) pnltmp.pxl_clk_div = 192000000 / dtbprop; else pnltmp.pxl_clk_div = ~0UL; /* check polarity of control-signals */ dtbprop = FDTPROP(PATHTIM, "hsync-active"); if (dtbprop == 0) pnltmp.pol |= HSYNC_INVERT; dtbprop = FDTPROP(PATHTIM, "vsync-active"); if (dtbprop == 0) pnltmp.pol |= VSYNC_INVERT; dtbprop = FDTPROP(PATHINF, "sync-ctrl"); if (dtbprop == 1) pnltmp.pol |= HSVS_CONTROL; dtbprop = FDTPROP(PATHINF, "sync-edge"); if (dtbprop == 1) pnltmp.pol |= HSVS_RISEFALL; dtbprop = FDTPROP(PATHTIM, "pixelclk-active"); if (dtbprop == 0) pnltmp.pol |= PXCLK_INVERT; dtbprop = FDTPROP(PATHTIM, "de-active"); if (dtbprop == 0) pnltmp.pol |= DE_INVERT; nodeoff = fdt_path_offset(gd->fdt_blob, "/factory-settings"); if (nodeoff >= 0) { nodep = fdt_getprop(gd->fdt_blob, nodeoff, "rotation", NULL); if (nodep != 0) { if (strcmp(nodep, "cw") == 0) panel_info.vl_rot = 1; else if (strcmp(nodep, "ud") == 0) panel_info.vl_rot = 2; else if (strcmp(nodep, "ccw") == 0) panel_info.vl_rot = 3; else panel_info.vl_rot = 0; } } else { puts("no 'factory-settings / rotation' in dtb!\n"); } snprintf(buf, sizeof(buf), "fbcon=rotate:%d", panel_info.vl_rot); env_set("optargs_rot", buf); #else pnltmp.hactive = env_get_ulong("ds1_hactive", 10, ~0UL); pnltmp.vactive = env_get_ulong("ds1_vactive", 10, ~0UL); pnltmp.bpp = env_get_ulong("ds1_bpp", 10, ~0UL); pnltmp.hfp = env_get_ulong("ds1_hfp", 10, ~0UL); pnltmp.hbp = env_get_ulong("ds1_hbp", 10, ~0UL); pnltmp.hsw = env_get_ulong("ds1_hsw", 10, ~0UL); pnltmp.vfp = env_get_ulong("ds1_vfp", 10, ~0UL); pnltmp.vbp = env_get_ulong("ds1_vbp", 10, ~0UL); pnltmp.vsw = env_get_ulong("ds1_vsw", 10, ~0UL); pnltmp.pxl_clk_div = env_get_ulong("ds1_pxlclkdiv", 10, ~0UL); pnltmp.pol = env_get_ulong("ds1_pol", 16, ~0UL); pnltmp.pup_delay = env_get_ulong("ds1_pupdelay", 10, ~0UL); pnltmp.pon_delay = env_get_ulong("ds1_tondelay", 10, ~0UL); panel_info.vl_rot = env_get_ulong("ds1_rotation", 10, 0); #endif if ( ~0UL == (pnltmp.hactive) || ~0UL == (pnltmp.vactive) || ~0UL == (pnltmp.bpp) || ~0UL == (pnltmp.hfp) || ~0UL == (pnltmp.hbp) || ~0UL == (pnltmp.hsw) || ~0UL == (pnltmp.vfp) || ~0UL == (pnltmp.vbp) || ~0UL == (pnltmp.vsw) || ~0UL == (pnltmp.pxl_clk_div) || ~0UL == (pnltmp.pol) || ~0UL == (pnltmp.pup_delay) || ~0UL == (pnltmp.pon_delay) ) { puts("lcd-settings in env/dtb incomplete!\n"); printf("display-timings:\n" "================\n" "hactive: %d\n" "vactive: %d\n" "bpp : %d\n" "hfp : %d\n" "hbp : %d\n" "hsw : %d\n" "vfp : %d\n" "vbp : %d\n" "vsw : %d\n" "pxlclk : %d\n" "pol : 0x%08x\n" "pondly : %d\n", pnltmp.hactive, pnltmp.vactive, pnltmp.bpp, pnltmp.hfp, pnltmp.hbp, pnltmp.hsw, pnltmp.vfp, pnltmp.vbp, pnltmp.vsw, pnltmp.pxl_clk_div, pnltmp.pol, pnltmp.pon_delay); return -1; } debug("lcd-settings in env complete, taking over.\n"); memcpy((void *)panel, (void *)&pnltmp, sizeof(struct am335x_lcdpanel)); return 0; }
int load_lcdtiming(struct am335x_lcdpanel *panel) { struct am335x_lcdpanel pnltmp; #ifdef CONFIG_USE_FDT u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL); u32 dtbprop; if (dtbaddr == ~0UL) { puts("load_lcdtiming: failed to get 'dtbaddr' from env!\n"); return -1; } memcpy(&pnltmp, (void *)panel, sizeof(struct am335x_lcdpanel)); pnltmp.hactive = FDTPROP(dtbaddr, PATHTIM, "hactive"); pnltmp.vactive = FDTPROP(dtbaddr, PATHTIM, "vactive"); pnltmp.bpp = FDTPROP(dtbaddr, PATHINF, "bpp"); pnltmp.hfp = FDTPROP(dtbaddr, PATHTIM, "hfront-porch"); pnltmp.hbp = FDTPROP(dtbaddr, PATHTIM, "hback-porch"); pnltmp.hsw = FDTPROP(dtbaddr, PATHTIM, "hsync-len"); pnltmp.vfp = FDTPROP(dtbaddr, PATHTIM, "vfront-porch"); pnltmp.vbp = FDTPROP(dtbaddr, PATHTIM, "vback-porch"); pnltmp.vsw = FDTPROP(dtbaddr, PATHTIM, "vsync-len"); pnltmp.pup_delay = FDTPROP(dtbaddr, PATHTIM, "pupdelay"); pnltmp.pon_delay = FDTPROP(dtbaddr, PATHTIM, "pondelay"); /* calc. proper clk-divisor */ dtbprop = FDTPROP(dtbaddr, PATHTIM, "clock-frequency"); if (dtbprop != ~0UL) pnltmp.pxl_clk_div = 192000000 / dtbprop; else pnltmp.pxl_clk_div = ~0UL; /* check polarity of control-signals */ dtbprop = FDTPROP(dtbaddr, PATHTIM, "hsync-active"); if (dtbprop == 0) pnltmp.pol |= HSYNC_INVERT; dtbprop = FDTPROP(dtbaddr, PATHTIM, "vsync-active"); if (dtbprop == 0) pnltmp.pol |= VSYNC_INVERT; dtbprop = FDTPROP(dtbaddr, PATHINF, "sync-ctrl"); if (dtbprop == 1) pnltmp.pol |= HSVS_CONTROL; dtbprop = FDTPROP(dtbaddr, PATHINF, "sync-edge"); if (dtbprop == 1) pnltmp.pol |= HSVS_RISEFALL; dtbprop = FDTPROP(dtbaddr, PATHTIM, "pixelclk-active"); if (dtbprop == 0) pnltmp.pol |= PXCLK_INVERT; dtbprop = FDTPROP(dtbaddr, PATHTIM, "de-active"); if (dtbprop == 0) pnltmp.pol |= DE_INVERT; #else pnltmp.hactive = getenv_ulong("ds1_hactive", 10, ~0UL); pnltmp.vactive = getenv_ulong("ds1_vactive", 10, ~0UL); pnltmp.bpp = getenv_ulong("ds1_bpp", 10, ~0UL); pnltmp.hfp = getenv_ulong("ds1_hfp", 10, ~0UL); pnltmp.hbp = getenv_ulong("ds1_hbp", 10, ~0UL); pnltmp.hsw = getenv_ulong("ds1_hsw", 10, ~0UL); pnltmp.vfp = getenv_ulong("ds1_vfp", 10, ~0UL); pnltmp.vbp = getenv_ulong("ds1_vbp", 10, ~0UL); pnltmp.vsw = getenv_ulong("ds1_vsw", 10, ~0UL); pnltmp.pxl_clk_div = getenv_ulong("ds1_pxlclkdiv", 10, ~0UL); pnltmp.pol = getenv_ulong("ds1_pol", 16, ~0UL); pnltmp.pup_delay = getenv_ulong("ds1_pupdelay", 10, ~0UL); pnltmp.pon_delay = getenv_ulong("ds1_tondelay", 10, ~0UL); #endif if ( ~0UL == (pnltmp.hactive) || ~0UL == (pnltmp.vactive) || ~0UL == (pnltmp.bpp) || ~0UL == (pnltmp.hfp) || ~0UL == (pnltmp.hbp) || ~0UL == (pnltmp.hsw) || ~0UL == (pnltmp.vfp) || ~0UL == (pnltmp.vbp) || ~0UL == (pnltmp.vsw) || ~0UL == (pnltmp.pxl_clk_div) || ~0UL == (pnltmp.pol) || ~0UL == (pnltmp.pup_delay) || ~0UL == (pnltmp.pon_delay) ) { puts("lcd-settings in env/dtb incomplete!\n"); printf("display-timings:\n" "================\n" "hactive: %d\n" "vactive: %d\n" "bpp : %d\n" "hfp : %d\n" "hbp : %d\n" "hsw : %d\n" "vfp : %d\n" "vbp : %d\n" "vsw : %d\n" "pxlclk : %d\n" "pol : 0x%08x\n" "pondly : %d\n", pnltmp.hactive, pnltmp.vactive, pnltmp.bpp, pnltmp.hfp, pnltmp.hbp, pnltmp.hsw, pnltmp.vfp, pnltmp.vbp, pnltmp.vsw, pnltmp.pxl_clk_div, pnltmp.pol, pnltmp.pon_delay); return -1; } debug("lcd-settings in env complete, taking over.\n"); memcpy((void *)panel, (void *)&pnltmp, sizeof(struct am335x_lcdpanel)); return 0; }