15d108ac8SSergei Poselenov /* 25d108ac8SSergei Poselenov * (C) Copyright 2008 35d108ac8SSergei Poselenov * Sergei Poselenov, Emcraft Systems, sposelenov@emcraft.com. 45d108ac8SSergei Poselenov * 55d108ac8SSergei Poselenov * Copyright 2004 Freescale Semiconductor. 65d108ac8SSergei Poselenov * (C) Copyright 2002,2003, Motorola Inc. 75d108ac8SSergei Poselenov * Xianghua Xiao, (X.Xiao@motorola.com) 85d108ac8SSergei Poselenov * 95d108ac8SSergei Poselenov * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com> 105d108ac8SSergei Poselenov * 111a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 125d108ac8SSergei Poselenov */ 135d108ac8SSergei Poselenov 145d108ac8SSergei Poselenov #include <common.h> 155d108ac8SSergei Poselenov #include <pci.h> 165d108ac8SSergei Poselenov #include <asm/processor.h> 175d108ac8SSergei Poselenov #include <asm/immap_85xx.h> 185d108ac8SSergei Poselenov #include <ioports.h> 195d108ac8SSergei Poselenov #include <flash.h> 20e18575d5SSergei Poselenov #include <libfdt.h> 21e18575d5SSergei Poselenov #include <fdt_support.h> 22e1eb0e25SAndy Fleming #include <asm/io.h> 23fb661ea4Su-boot@bugs.denx.de #include <i2c.h> 24fb661ea4Su-boot@bugs.denx.de #include <mb862xx.h> 25fb661ea4Su-boot@bugs.denx.de #include <video_fb.h> 2659abd15bSSergei Poselenov #include "upm_table.h" 273e79b588SDetlev Zundel 285d108ac8SSergei Poselenov DECLARE_GLOBAL_DATA_PTR; 295d108ac8SSergei Poselenov 305d108ac8SSergei Poselenov extern flash_info_t flash_info[]; /* FLASH chips info */ 31fb661ea4Su-boot@bugs.denx.de extern GraphicDevice mb862xx; 325d108ac8SSergei Poselenov 335d108ac8SSergei Poselenov void local_bus_init (void); 345d108ac8SSergei Poselenov ulong flash_get_size (ulong base, int banknum); 355d108ac8SSergei Poselenov 365d108ac8SSergei Poselenov int checkboard (void) 375d108ac8SSergei Poselenov { 386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 39f0c0b3a9SWolfgang Denk char buf[64]; 405e1882dfSSergei Poselenov int f; 41f0c0b3a9SWolfgang Denk int i = getenv_f("serial#", buf, sizeof(buf)); 42f0c0b3a9SWolfgang Denk #ifdef CONFIG_PCI 43f0c0b3a9SWolfgang Denk char *src; 44f0c0b3a9SWolfgang Denk #endif 455d108ac8SSergei Poselenov 465d108ac8SSergei Poselenov puts("Board: Socrates"); 47f0c0b3a9SWolfgang Denk if (i > 0) { 485d108ac8SSergei Poselenov puts(", serial# "); 49f0c0b3a9SWolfgang Denk puts(buf); 505d108ac8SSergei Poselenov } 515d108ac8SSergei Poselenov putc('\n'); 525d108ac8SSergei Poselenov 535d108ac8SSergei Poselenov #ifdef CONFIG_PCI 54e1eb0e25SAndy Fleming /* Check the PCI_clk sel bit */ 55e1eb0e25SAndy Fleming if (in_be32(&gur->porpllsr) & (1<<15)) { 565e1882dfSSergei Poselenov src = "SYSCLK"; 575e1882dfSSergei Poselenov f = CONFIG_SYS_CLK_FREQ; 585e1882dfSSergei Poselenov } else { 595e1882dfSSergei Poselenov src = "PCI_CLK"; 605e1882dfSSergei Poselenov f = CONFIG_PCI_CLK_FREQ; 615e1882dfSSergei Poselenov } 625e1882dfSSergei Poselenov printf ("PCI1: 32 bit, %d MHz (%s)\n", f/1000000, src); 635d108ac8SSergei Poselenov #else 645d108ac8SSergei Poselenov printf ("PCI1: disabled\n"); 655d108ac8SSergei Poselenov #endif 665d108ac8SSergei Poselenov 675d108ac8SSergei Poselenov /* 685d108ac8SSergei Poselenov * Initialize local bus. 695d108ac8SSergei Poselenov */ 705d108ac8SSergei Poselenov local_bus_init (); 715d108ac8SSergei Poselenov return 0; 725d108ac8SSergei Poselenov } 735d108ac8SSergei Poselenov 745d108ac8SSergei Poselenov int misc_init_r (void) 755d108ac8SSergei Poselenov { 765d108ac8SSergei Poselenov /* 775d108ac8SSergei Poselenov * Adjust flash start and offset to detected values 785d108ac8SSergei Poselenov */ 795d108ac8SSergei Poselenov gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize; 805d108ac8SSergei Poselenov gd->bd->bi_flashoffset = 0; 815d108ac8SSergei Poselenov 825d108ac8SSergei Poselenov /* 835d108ac8SSergei Poselenov * Check if boot FLASH isn't max size 845d108ac8SSergei Poselenov */ 856d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (gd->bd->bi_flashsize < (0 - CONFIG_SYS_FLASH0)) { 86f51cdaf1SBecky Bruce set_lbc_or(0, gd->bd->bi_flashstart | 87f51cdaf1SBecky Bruce (CONFIG_SYS_OR0_PRELIM & 0x00007fff)); 88f51cdaf1SBecky Bruce set_lbc_br(0, gd->bd->bi_flashstart | 89f51cdaf1SBecky Bruce (CONFIG_SYS_BR0_PRELIM & 0x00007fff)); 905d108ac8SSergei Poselenov 915d108ac8SSergei Poselenov /* 925d108ac8SSergei Poselenov * Re-check to get correct base address 935d108ac8SSergei Poselenov */ 946d0f6bcfSJean-Christophe PLAGNIOL-VILLARD flash_get_size(gd->bd->bi_flashstart, CONFIG_SYS_MAX_FLASH_BANKS - 1); 955d108ac8SSergei Poselenov } 965d108ac8SSergei Poselenov 975d108ac8SSergei Poselenov /* 985d108ac8SSergei Poselenov * Check if only one FLASH bank is available 995d108ac8SSergei Poselenov */ 1006d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (gd->bd->bi_flashsize != CONFIG_SYS_MAX_FLASH_BANKS * (0 - CONFIG_SYS_FLASH0)) { 101f51cdaf1SBecky Bruce set_lbc_or(1, 0); 102f51cdaf1SBecky Bruce set_lbc_br(1, 0); 1035d108ac8SSergei Poselenov 1045d108ac8SSergei Poselenov /* 1055d108ac8SSergei Poselenov * Re-do flash protection upon new addresses 1065d108ac8SSergei Poselenov */ 1075d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_CLEAR, 1085d108ac8SSergei Poselenov gd->bd->bi_flashstart, 0xffffffff, 1096d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1105d108ac8SSergei Poselenov 1115d108ac8SSergei Poselenov /* Monitor protection ON by default */ 1125d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_SET, 1136d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_MONITOR_BASE, CONFIG_SYS_MONITOR_BASE + monitor_flash_len - 1, 1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1155d108ac8SSergei Poselenov 1165d108ac8SSergei Poselenov /* Environment protection ON by default */ 1175d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_SET, 1180e8d1586SJean-Christophe PLAGNIOL-VILLARD CONFIG_ENV_ADDR, 1190e8d1586SJean-Christophe PLAGNIOL-VILLARD CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1, 1206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1215d108ac8SSergei Poselenov 1225d108ac8SSergei Poselenov /* Redundant environment protection ON by default */ 1235d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_SET, 1240e8d1586SJean-Christophe PLAGNIOL-VILLARD CONFIG_ENV_ADDR_REDUND, 125dfcd7f21SWolfgang Denk CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1, 1266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1275d108ac8SSergei Poselenov } 1285d108ac8SSergei Poselenov 1295d108ac8SSergei Poselenov return 0; 1305d108ac8SSergei Poselenov } 1315d108ac8SSergei Poselenov 1325d108ac8SSergei Poselenov /* 1335d108ac8SSergei Poselenov * Initialize Local Bus 1345d108ac8SSergei Poselenov */ 1355d108ac8SSergei Poselenov void local_bus_init (void) 1365d108ac8SSergei Poselenov { 137f51cdaf1SBecky Bruce volatile fsl_lbc_t *lbc = LBC_BASE_ADDR; 1386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR); 1393e79b588SDetlev Zundel sys_info_t sysinfo; 1403e79b588SDetlev Zundel uint clkdiv; 1413e79b588SDetlev Zundel uint lbc_mhz; 1426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint lcrr = CONFIG_SYS_LBC_LCRR; 1435d108ac8SSergei Poselenov 1443e79b588SDetlev Zundel get_sys_info (&sysinfo); 145a5d212a2STrent Piepho clkdiv = lbc->lcrr & LCRR_CLKDIV; 146997399faSPrabhakar Kushwaha lbc_mhz = sysinfo.freq_systembus / 1000000 / clkdiv; 1475d108ac8SSergei Poselenov 1483e79b588SDetlev Zundel /* Disable PLL bypass for Local Bus Clock >= 66 MHz */ 1493e79b588SDetlev Zundel if (lbc_mhz >= 66) 1503e79b588SDetlev Zundel lcrr &= ~LCRR_DBYP; /* DLL Enabled */ 1513e79b588SDetlev Zundel else 1523e79b588SDetlev Zundel lcrr |= LCRR_DBYP; /* DLL Bypass */ 1533e79b588SDetlev Zundel 1543e79b588SDetlev Zundel out_be32 (&lbc->lcrr, lcrr); 1553e79b588SDetlev Zundel asm ("sync;isync;msync"); 1563e79b588SDetlev Zundel 1573e79b588SDetlev Zundel out_be32 (&lbc->ltesr, 0xffffffff); /* Clear LBC error interrupts */ 1583e79b588SDetlev Zundel out_be32 (&lbc->lteir, 0xffffffff); /* Enable LBC error interrupts */ 1593e79b588SDetlev Zundel out_be32 (&ecm->eedr, 0xffffffff); /* Clear ecm errors */ 1603e79b588SDetlev Zundel out_be32 (&ecm->eeer, 0xffffffff); /* Enable ecm errors */ 1613e79b588SDetlev Zundel 1623e79b588SDetlev Zundel /* Init UPMA for FPGA access */ 1633e79b588SDetlev Zundel out_be32 (&lbc->mamr, 0x44440); /* Use a customer-supplied value */ 1643e79b588SDetlev Zundel upmconfig (UPMA, (uint *)UPMTableA, sizeof(UPMTableA)/sizeof(int)); 165e64987a8SAnatolij Gustschin 166e64987a8SAnatolij Gustschin /* Init UPMB for Lime controller access */ 167e64987a8SAnatolij Gustschin out_be32 (&lbc->mbmr, 0x444440); /* Use a customer-supplied value */ 168e64987a8SAnatolij Gustschin upmconfig (UPMB, (uint *)UPMTableB, sizeof(UPMTableB)/sizeof(int)); 169e64987a8SAnatolij Gustschin } 1705d108ac8SSergei Poselenov 1715d108ac8SSergei Poselenov #if defined(CONFIG_PCI) 1725d108ac8SSergei Poselenov /* 1735d108ac8SSergei Poselenov * Initialize PCI Devices, report devices found. 1745d108ac8SSergei Poselenov */ 1755d108ac8SSergei Poselenov 1765d108ac8SSergei Poselenov #ifndef CONFIG_PCI_PNP 1775d108ac8SSergei Poselenov static struct pci_config_table pci_mpc85xxads_config_table[] = { 1785d108ac8SSergei Poselenov {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 1795d108ac8SSergei Poselenov PCI_IDSEL_NUMBER, PCI_ANY_ID, 1805d108ac8SSergei Poselenov pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, 1815d108ac8SSergei Poselenov PCI_ENET0_MEMADDR, 1825d108ac8SSergei Poselenov PCI_COMMAND_MEMORY | 1835d108ac8SSergei Poselenov PCI_COMMAND_MASTER}}, 1845d108ac8SSergei Poselenov {} 1855d108ac8SSergei Poselenov }; 1865d108ac8SSergei Poselenov #endif 1875d108ac8SSergei Poselenov 1885d108ac8SSergei Poselenov 1895d108ac8SSergei Poselenov static struct pci_controller hose = { 1905d108ac8SSergei Poselenov #ifndef CONFIG_PCI_PNP 1915d108ac8SSergei Poselenov config_table:pci_mpc85xxads_config_table, 1925d108ac8SSergei Poselenov #endif 1935d108ac8SSergei Poselenov }; 1945d108ac8SSergei Poselenov 1955d108ac8SSergei Poselenov #endif /* CONFIG_PCI */ 1965d108ac8SSergei Poselenov 1975d108ac8SSergei Poselenov 1985d108ac8SSergei Poselenov void pci_init_board (void) 1995d108ac8SSergei Poselenov { 2005d108ac8SSergei Poselenov #ifdef CONFIG_PCI 2015d108ac8SSergei Poselenov pci_mpc85xx_init (&hose); 2025d108ac8SSergei Poselenov #endif /* CONFIG_PCI */ 2035d108ac8SSergei Poselenov } 2045d108ac8SSergei Poselenov 2055d108ac8SSergei Poselenov #ifdef CONFIG_BOARD_EARLY_INIT_R 2065d108ac8SSergei Poselenov int board_early_init_r (void) 2075d108ac8SSergei Poselenov { 2086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 2093e79b588SDetlev Zundel 2103e79b588SDetlev Zundel /* set and reset the GPIO pin 2 which will reset the W83782G chip */ 2113e79b588SDetlev Zundel out_8((unsigned char*)&gur->gpoutdr, 0x3F ); 2123e79b588SDetlev Zundel out_be32((unsigned int*)&gur->gpiocr, 0x200 ); /* enable GPOut */ 2133e79b588SDetlev Zundel udelay(200); 2143e79b588SDetlev Zundel out_8( (unsigned char*)&gur->gpoutdr, 0x1F ); 2153e79b588SDetlev Zundel 2165d108ac8SSergei Poselenov return (0); 2175d108ac8SSergei Poselenov } 2185d108ac8SSergei Poselenov #endif /* CONFIG_BOARD_EARLY_INIT_R */ 219e18575d5SSergei Poselenov 220*7ffe3cd6SRobert P. J. Day #ifdef CONFIG_OF_BOARD_SETUP 221e895a4b0SSimon Glass int ft_board_setup(void *blob, bd_t *bd) 222e18575d5SSergei Poselenov { 2233e79b588SDetlev Zundel u32 val[12]; 2243e79b588SDetlev Zundel int rc, i = 0; 225e18575d5SSergei Poselenov 226e18575d5SSergei Poselenov ft_cpu_setup(blob, bd); 227e18575d5SSergei Poselenov 2283e79b588SDetlev Zundel /* Fixup NOR FLASH mapping */ 2293e79b588SDetlev Zundel val[i++] = 0; /* chip select number */ 2303e79b588SDetlev Zundel val[i++] = 0; /* always 0 */ 2313e79b588SDetlev Zundel val[i++] = gd->bd->bi_flashstart; 2323e79b588SDetlev Zundel val[i++] = gd->bd->bi_flashsize; 2333e79b588SDetlev Zundel 2346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (mb862xx.frameAdrs == CONFIG_SYS_LIME_BASE) { 235e64987a8SAnatolij Gustschin /* Fixup LIME mapping */ 236e64987a8SAnatolij Gustschin val[i++] = 2; /* chip select number */ 237e64987a8SAnatolij Gustschin val[i++] = 0; /* always 0 */ 2386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_LIME_BASE; 2396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_LIME_SIZE; 240e64987a8SAnatolij Gustschin } 241e64987a8SAnatolij Gustschin 2423e79b588SDetlev Zundel /* Fixup FPGA mapping */ 2433e79b588SDetlev Zundel val[i++] = 3; /* chip select number */ 2443e79b588SDetlev Zundel val[i++] = 0; /* always 0 */ 2456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_FPGA_BASE; 2466d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_FPGA_SIZE; 247e18575d5SSergei Poselenov 248e18575d5SSergei Poselenov rc = fdt_find_and_setprop(blob, "/localbus", "ranges", 2493e79b588SDetlev Zundel val, i * sizeof(u32), 1); 250e18575d5SSergei Poselenov if (rc) 2513e79b588SDetlev Zundel printf("Unable to update localbus ranges, err=%s\n", 252e18575d5SSergei Poselenov fdt_strerror(rc)); 253e895a4b0SSimon Glass 254e895a4b0SSimon Glass return 0; 255e18575d5SSergei Poselenov } 256*7ffe3cd6SRobert P. J. Day #endif /* CONFIG_OF_BOARD_SETUP */ 257e64987a8SAnatolij Gustschin 258e64987a8SAnatolij Gustschin #define DEFAULT_BRIGHTNESS 25 259e64987a8SAnatolij Gustschin #define BACKLIGHT_ENABLE (1 << 31) 260e64987a8SAnatolij Gustschin 261e64987a8SAnatolij Gustschin static const gdc_regs init_regs [] = 262e64987a8SAnatolij Gustschin { 263e64987a8SAnatolij Gustschin {0x0100, 0x00010f00}, 264e64987a8SAnatolij Gustschin {0x0020, 0x801901df}, 265e64987a8SAnatolij Gustschin {0x0024, 0x00000000}, 266e64987a8SAnatolij Gustschin {0x0028, 0x00000000}, 267e64987a8SAnatolij Gustschin {0x002c, 0x00000000}, 268e64987a8SAnatolij Gustschin {0x0110, 0x00000000}, 269e64987a8SAnatolij Gustschin {0x0114, 0x00000000}, 270e64987a8SAnatolij Gustschin {0x0118, 0x01df0320}, 271e64987a8SAnatolij Gustschin {0x0004, 0x041f0000}, 272e64987a8SAnatolij Gustschin {0x0008, 0x031f031f}, 273e64987a8SAnatolij Gustschin {0x000c, 0x017f0349}, 274e64987a8SAnatolij Gustschin {0x0010, 0x020c0000}, 275e64987a8SAnatolij Gustschin {0x0014, 0x01df01e9}, 276e64987a8SAnatolij Gustschin {0x0018, 0x00000000}, 277e64987a8SAnatolij Gustschin {0x001c, 0x01e00320}, 278e64987a8SAnatolij Gustschin {0x0100, 0x80010f00}, 279e64987a8SAnatolij Gustschin {0x0, 0x0} 280e64987a8SAnatolij Gustschin }; 281e64987a8SAnatolij Gustschin 282e64987a8SAnatolij Gustschin const gdc_regs *board_get_regs (void) 283e64987a8SAnatolij Gustschin { 284e64987a8SAnatolij Gustschin return init_regs; 285e64987a8SAnatolij Gustschin } 286e64987a8SAnatolij Gustschin 287fb661ea4Su-boot@bugs.denx.de int lime_probe(void) 288fb661ea4Su-boot@bugs.denx.de { 289fb661ea4Su-boot@bugs.denx.de uint cfg_br2; 290fb661ea4Su-boot@bugs.denx.de uint cfg_or2; 291c28d3bbeSWolfgang Grandegger int type; 292fb661ea4Su-boot@bugs.denx.de 293f51cdaf1SBecky Bruce cfg_br2 = get_lbc_br(2); 294f51cdaf1SBecky Bruce cfg_or2 = get_lbc_or(2); 295fb661ea4Su-boot@bugs.denx.de 296fb661ea4Su-boot@bugs.denx.de /* Configure GPCM for CS2 */ 297f51cdaf1SBecky Bruce set_lbc_br(2, 0); 298f51cdaf1SBecky Bruce set_lbc_or(2, 0xfc000410); 299f51cdaf1SBecky Bruce set_lbc_br(2, (CONFIG_SYS_LIME_BASE) | 0x00001901); 300fb661ea4Su-boot@bugs.denx.de 301c28d3bbeSWolfgang Grandegger /* Get controller type */ 302c28d3bbeSWolfgang Grandegger type = mb862xx_probe(CONFIG_SYS_LIME_BASE); 303fb661ea4Su-boot@bugs.denx.de 304fb661ea4Su-boot@bugs.denx.de /* Restore previous CS2 configuration */ 305f51cdaf1SBecky Bruce set_lbc_br(2, 0); 306f51cdaf1SBecky Bruce set_lbc_or(2, cfg_or2); 307f51cdaf1SBecky Bruce set_lbc_br(2, cfg_br2); 308c28d3bbeSWolfgang Grandegger 309c28d3bbeSWolfgang Grandegger return (type == MB862XX_TYPE_LIME) ? 1 : 0; 310fb661ea4Su-boot@bugs.denx.de } 311fb661ea4Su-boot@bugs.denx.de 312e64987a8SAnatolij Gustschin /* Returns Lime base address */ 313e64987a8SAnatolij Gustschin unsigned int board_video_init (void) 314e64987a8SAnatolij Gustschin { 315fb661ea4Su-boot@bugs.denx.de if (!lime_probe()) 316e64987a8SAnatolij Gustschin return 0; 317e64987a8SAnatolij Gustschin 318c28d3bbeSWolfgang Grandegger mb862xx.winSizeX = 800; 319c28d3bbeSWolfgang Grandegger mb862xx.winSizeY = 480; 320e64987a8SAnatolij Gustschin mb862xx.gdfIndex = GDF_15BIT_555RGB; 321e64987a8SAnatolij Gustschin mb862xx.gdfBytesPP = 2; 322e64987a8SAnatolij Gustschin 3236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD return CONFIG_SYS_LIME_BASE; 324e64987a8SAnatolij Gustschin } 325e64987a8SAnatolij Gustschin 326e64987a8SAnatolij Gustschin #define W83782D_REG_CFG 0x40 327e64987a8SAnatolij Gustschin #define W83782D_REG_BANK_SEL 0x4e 328e64987a8SAnatolij Gustschin #define W83782D_REG_ADCCLK 0x4b 329e64987a8SAnatolij Gustschin #define W83782D_REG_BEEP_CTRL 0x4d 330e64987a8SAnatolij Gustschin #define W83782D_REG_BEEP_CTRL2 0x57 331e64987a8SAnatolij Gustschin #define W83782D_REG_PWMOUT1 0x5b 332e64987a8SAnatolij Gustschin #define W83782D_REG_VBAT 0x5d 333e64987a8SAnatolij Gustschin 334e64987a8SAnatolij Gustschin static int w83782d_hwmon_init(void) 335e64987a8SAnatolij Gustschin { 336e64987a8SAnatolij Gustschin u8 buf; 337e64987a8SAnatolij Gustschin 3386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 1, &buf, 1)) 339e64987a8SAnatolij Gustschin return -1; 340e64987a8SAnatolij Gustschin 3416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 0x80); 3426d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BANK_SEL, 0); 3436d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_ADCCLK, 0x40); 344e64987a8SAnatolij Gustschin 3456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD buf = i2c_reg_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL); 3466d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL, 347e64987a8SAnatolij Gustschin buf | 0x80); 3486d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL2, 0); 3496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_PWMOUT1, 0x47); 3506d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_VBAT, 0x01); 351e64987a8SAnatolij Gustschin 3526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD buf = i2c_reg_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG); 3536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 354e64987a8SAnatolij Gustschin (buf & 0xf4) | 0x01); 355e64987a8SAnatolij Gustschin return 0; 356e64987a8SAnatolij Gustschin } 357e64987a8SAnatolij Gustschin 358e64987a8SAnatolij Gustschin static void board_backlight_brightness(int br) 359e64987a8SAnatolij Gustschin { 360e64987a8SAnatolij Gustschin u32 reg; 361e64987a8SAnatolij Gustschin u8 buf; 362e64987a8SAnatolij Gustschin u8 old_buf; 363e64987a8SAnatolij Gustschin 364e64987a8SAnatolij Gustschin /* Select bank 0 */ 3656d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &old_buf, 1)) 366e64987a8SAnatolij Gustschin goto err; 367e64987a8SAnatolij Gustschin else 368e64987a8SAnatolij Gustschin buf = old_buf & 0xf8; 369e64987a8SAnatolij Gustschin 3706d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &buf, 1)) 371e64987a8SAnatolij Gustschin goto err; 372e64987a8SAnatolij Gustschin 373e64987a8SAnatolij Gustschin if (br > 0) { 374e64987a8SAnatolij Gustschin /* PWMOUT1 duty cycle ctrl */ 375e64987a8SAnatolij Gustschin buf = 255 / (100 / br); 3766d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x5b, 1, &buf, 1)) 377e64987a8SAnatolij Gustschin goto err; 378e64987a8SAnatolij Gustschin 379e64987a8SAnatolij Gustschin /* LEDs on */ 3806d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c)); 381e64987a8SAnatolij Gustschin if (!(reg & BACKLIGHT_ENABLE)); 3826d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c), 383e64987a8SAnatolij Gustschin reg | BACKLIGHT_ENABLE); 384e64987a8SAnatolij Gustschin } else { 385e64987a8SAnatolij Gustschin buf = 0; 3866d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x5b, 1, &buf, 1)) 387e64987a8SAnatolij Gustschin goto err; 388e64987a8SAnatolij Gustschin 389e64987a8SAnatolij Gustschin /* LEDs off */ 3906d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c)); 391e64987a8SAnatolij Gustschin reg &= ~BACKLIGHT_ENABLE; 3926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c), reg); 393e64987a8SAnatolij Gustschin } 394e64987a8SAnatolij Gustschin /* Restore previous bank setting */ 3956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &old_buf, 1)) 396e64987a8SAnatolij Gustschin goto err; 397e64987a8SAnatolij Gustschin 398e64987a8SAnatolij Gustschin return; 399e64987a8SAnatolij Gustschin err: 400e64987a8SAnatolij Gustschin printf("W83782G I2C access failed\n"); 401e64987a8SAnatolij Gustschin } 402e64987a8SAnatolij Gustschin 403e64987a8SAnatolij Gustschin void board_backlight_switch (int flag) 404e64987a8SAnatolij Gustschin { 405e64987a8SAnatolij Gustschin char * param; 406e64987a8SAnatolij Gustschin int rc; 407e64987a8SAnatolij Gustschin 408e64987a8SAnatolij Gustschin if (w83782d_hwmon_init()) 409e64987a8SAnatolij Gustschin printf ("hwmon IC init failed\n"); 410e64987a8SAnatolij Gustschin 411e64987a8SAnatolij Gustschin if (flag) { 412e64987a8SAnatolij Gustschin param = getenv("brightness"); 413e64987a8SAnatolij Gustschin rc = param ? simple_strtol(param, NULL, 10) : -1; 414e64987a8SAnatolij Gustschin if (rc < 0) 415e64987a8SAnatolij Gustschin rc = DEFAULT_BRIGHTNESS; 416e64987a8SAnatolij Gustschin } else { 417e64987a8SAnatolij Gustschin rc = 0; 418e64987a8SAnatolij Gustschin } 419e64987a8SAnatolij Gustschin board_backlight_brightness(rc); 420e64987a8SAnatolij Gustschin } 421e64987a8SAnatolij Gustschin 422e64987a8SAnatolij Gustschin #if defined(CONFIG_CONSOLE_EXTRA_INFO) 423e64987a8SAnatolij Gustschin /* 424e64987a8SAnatolij Gustschin * Return text to be printed besides the logo. 425e64987a8SAnatolij Gustschin */ 426e64987a8SAnatolij Gustschin void video_get_info_str (int line_number, char *info) 427e64987a8SAnatolij Gustschin { 428e64987a8SAnatolij Gustschin if (line_number == 1) { 429e64987a8SAnatolij Gustschin strcpy (info, " Board: Socrates"); 430e64987a8SAnatolij Gustschin } else { 431e64987a8SAnatolij Gustschin info [0] = '\0'; 432e64987a8SAnatolij Gustschin } 433e64987a8SAnatolij Gustschin } 434e64987a8SAnatolij Gustschin #endif 435