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 * 115d108ac8SSergei Poselenov * See file CREDITS for list of people who contributed to this 125d108ac8SSergei Poselenov * project. 135d108ac8SSergei Poselenov * 145d108ac8SSergei Poselenov * This program is free software; you can redistribute it and/or 155d108ac8SSergei Poselenov * modify it under the terms of the GNU General Public License as 165d108ac8SSergei Poselenov * published by the Free Software Foundation; either version 2 of 175d108ac8SSergei Poselenov * the License, or (at your option) any later version. 185d108ac8SSergei Poselenov * 195d108ac8SSergei Poselenov * This program is distributed in the hope that it will be useful, 205d108ac8SSergei Poselenov * but WITHOUT ANY WARRANTY; without even the implied warranty of 215d108ac8SSergei Poselenov * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 225d108ac8SSergei Poselenov * GNU General Public License for more details. 235d108ac8SSergei Poselenov * 245d108ac8SSergei Poselenov * You should have received a copy of the GNU General Public License 255d108ac8SSergei Poselenov * along with this program; if not, write to the Free Software 265d108ac8SSergei Poselenov * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 275d108ac8SSergei Poselenov * MA 02111-1307 USA 285d108ac8SSergei Poselenov */ 295d108ac8SSergei Poselenov 305d108ac8SSergei Poselenov #include <common.h> 315d108ac8SSergei Poselenov #include <pci.h> 325d108ac8SSergei Poselenov #include <asm/processor.h> 335d108ac8SSergei Poselenov #include <asm/immap_85xx.h> 345d108ac8SSergei Poselenov #include <ioports.h> 355d108ac8SSergei Poselenov #include <flash.h> 36e18575d5SSergei Poselenov #include <libfdt.h> 37e18575d5SSergei Poselenov #include <fdt_support.h> 38e1eb0e25SAndy Fleming #include <asm/io.h> 39fb661ea4Su-boot@bugs.denx.de #include <i2c.h> 40fb661ea4Su-boot@bugs.denx.de #include <mb862xx.h> 41fb661ea4Su-boot@bugs.denx.de #include <video_fb.h> 4259abd15bSSergei Poselenov #include "upm_table.h" 433e79b588SDetlev Zundel 445d108ac8SSergei Poselenov DECLARE_GLOBAL_DATA_PTR; 455d108ac8SSergei Poselenov 465d108ac8SSergei Poselenov extern flash_info_t flash_info[]; /* FLASH chips info */ 47fb661ea4Su-boot@bugs.denx.de extern GraphicDevice mb862xx; 485d108ac8SSergei Poselenov 495d108ac8SSergei Poselenov void local_bus_init (void); 505d108ac8SSergei Poselenov ulong flash_get_size (ulong base, int banknum); 515d108ac8SSergei Poselenov 525d108ac8SSergei Poselenov int checkboard (void) 535d108ac8SSergei Poselenov { 546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 553e79b588SDetlev Zundel 565e1882dfSSergei Poselenov char *src; 575e1882dfSSergei Poselenov int f; 585d108ac8SSergei Poselenov char *s = getenv("serial#"); 595d108ac8SSergei Poselenov 605d108ac8SSergei Poselenov puts("Board: Socrates"); 615d108ac8SSergei Poselenov if (s != NULL) { 625d108ac8SSergei Poselenov puts(", serial# "); 635d108ac8SSergei Poselenov puts(s); 645d108ac8SSergei Poselenov } 655d108ac8SSergei Poselenov putc('\n'); 665d108ac8SSergei Poselenov 675d108ac8SSergei Poselenov #ifdef CONFIG_PCI 68e1eb0e25SAndy Fleming /* Check the PCI_clk sel bit */ 69e1eb0e25SAndy Fleming if (in_be32(&gur->porpllsr) & (1<<15)) { 705e1882dfSSergei Poselenov src = "SYSCLK"; 715e1882dfSSergei Poselenov f = CONFIG_SYS_CLK_FREQ; 725e1882dfSSergei Poselenov } else { 735e1882dfSSergei Poselenov src = "PCI_CLK"; 745e1882dfSSergei Poselenov f = CONFIG_PCI_CLK_FREQ; 755e1882dfSSergei Poselenov } 765e1882dfSSergei Poselenov printf ("PCI1: 32 bit, %d MHz (%s)\n", f/1000000, src); 775d108ac8SSergei Poselenov #else 785d108ac8SSergei Poselenov printf ("PCI1: disabled\n"); 795d108ac8SSergei Poselenov #endif 805d108ac8SSergei Poselenov 815d108ac8SSergei Poselenov /* 825d108ac8SSergei Poselenov * Initialize local bus. 835d108ac8SSergei Poselenov */ 845d108ac8SSergei Poselenov local_bus_init (); 855d108ac8SSergei Poselenov return 0; 865d108ac8SSergei Poselenov } 875d108ac8SSergei Poselenov 885d108ac8SSergei Poselenov int misc_init_r (void) 895d108ac8SSergei Poselenov { 906d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_lbc_t *memctl = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); 915d108ac8SSergei Poselenov 925d108ac8SSergei Poselenov /* 935d108ac8SSergei Poselenov * Adjust flash start and offset to detected values 945d108ac8SSergei Poselenov */ 955d108ac8SSergei Poselenov gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize; 965d108ac8SSergei Poselenov gd->bd->bi_flashoffset = 0; 975d108ac8SSergei Poselenov 985d108ac8SSergei Poselenov /* 995d108ac8SSergei Poselenov * Check if boot FLASH isn't max size 1005d108ac8SSergei Poselenov */ 1016d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (gd->bd->bi_flashsize < (0 - CONFIG_SYS_FLASH0)) { 1026d0f6bcfSJean-Christophe PLAGNIOL-VILLARD memctl->or0 = gd->bd->bi_flashstart | (CONFIG_SYS_OR0_PRELIM & 0x00007fff); 1036d0f6bcfSJean-Christophe PLAGNIOL-VILLARD memctl->br0 = gd->bd->bi_flashstart | (CONFIG_SYS_BR0_PRELIM & 0x00007fff); 1045d108ac8SSergei Poselenov 1055d108ac8SSergei Poselenov /* 1065d108ac8SSergei Poselenov * Re-check to get correct base address 1075d108ac8SSergei Poselenov */ 1086d0f6bcfSJean-Christophe PLAGNIOL-VILLARD flash_get_size(gd->bd->bi_flashstart, CONFIG_SYS_MAX_FLASH_BANKS - 1); 1095d108ac8SSergei Poselenov } 1105d108ac8SSergei Poselenov 1115d108ac8SSergei Poselenov /* 1125d108ac8SSergei Poselenov * Check if only one FLASH bank is available 1135d108ac8SSergei Poselenov */ 1146d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (gd->bd->bi_flashsize != CONFIG_SYS_MAX_FLASH_BANKS * (0 - CONFIG_SYS_FLASH0)) { 1155d108ac8SSergei Poselenov memctl->or1 = 0; 1165d108ac8SSergei Poselenov memctl->br1 = 0; 1175d108ac8SSergei Poselenov 1185d108ac8SSergei Poselenov /* 1195d108ac8SSergei Poselenov * Re-do flash protection upon new addresses 1205d108ac8SSergei Poselenov */ 1215d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_CLEAR, 1225d108ac8SSergei Poselenov gd->bd->bi_flashstart, 0xffffffff, 1236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1245d108ac8SSergei Poselenov 1255d108ac8SSergei Poselenov /* Monitor protection ON by default */ 1265d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_SET, 1276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_MONITOR_BASE, CONFIG_SYS_MONITOR_BASE + monitor_flash_len - 1, 1286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1295d108ac8SSergei Poselenov 1305d108ac8SSergei Poselenov /* Environment protection ON by default */ 1315d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_SET, 1320e8d1586SJean-Christophe PLAGNIOL-VILLARD CONFIG_ENV_ADDR, 1330e8d1586SJean-Christophe PLAGNIOL-VILLARD CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1, 1346d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1355d108ac8SSergei Poselenov 1365d108ac8SSergei Poselenov /* Redundant environment protection ON by default */ 1375d108ac8SSergei Poselenov flash_protect (FLAG_PROTECT_SET, 1380e8d1586SJean-Christophe PLAGNIOL-VILLARD CONFIG_ENV_ADDR_REDUND, 139*dfcd7f21SWolfgang Denk CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1, 1406d0f6bcfSJean-Christophe PLAGNIOL-VILLARD &flash_info[CONFIG_SYS_MAX_FLASH_BANKS - 1]); 1415d108ac8SSergei Poselenov } 1425d108ac8SSergei Poselenov 1435d108ac8SSergei Poselenov return 0; 1445d108ac8SSergei Poselenov } 1455d108ac8SSergei Poselenov 1465d108ac8SSergei Poselenov /* 1475d108ac8SSergei Poselenov * Initialize Local Bus 1485d108ac8SSergei Poselenov */ 1495d108ac8SSergei Poselenov void local_bus_init (void) 1505d108ac8SSergei Poselenov { 1516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); 1526d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR); 1533e79b588SDetlev Zundel sys_info_t sysinfo; 1543e79b588SDetlev Zundel uint clkdiv; 1553e79b588SDetlev Zundel uint lbc_mhz; 1566d0f6bcfSJean-Christophe PLAGNIOL-VILLARD uint lcrr = CONFIG_SYS_LBC_LCRR; 1575d108ac8SSergei Poselenov 1583e79b588SDetlev Zundel get_sys_info (&sysinfo); 159a5d212a2STrent Piepho clkdiv = lbc->lcrr & LCRR_CLKDIV; 1603e79b588SDetlev Zundel lbc_mhz = sysinfo.freqSystemBus / 1000000 / clkdiv; 1615d108ac8SSergei Poselenov 1623e79b588SDetlev Zundel /* Disable PLL bypass for Local Bus Clock >= 66 MHz */ 1633e79b588SDetlev Zundel if (lbc_mhz >= 66) 1643e79b588SDetlev Zundel lcrr &= ~LCRR_DBYP; /* DLL Enabled */ 1653e79b588SDetlev Zundel else 1663e79b588SDetlev Zundel lcrr |= LCRR_DBYP; /* DLL Bypass */ 1673e79b588SDetlev Zundel 1683e79b588SDetlev Zundel out_be32 (&lbc->lcrr, lcrr); 1693e79b588SDetlev Zundel asm ("sync;isync;msync"); 1703e79b588SDetlev Zundel 1713e79b588SDetlev Zundel out_be32 (&lbc->ltesr, 0xffffffff); /* Clear LBC error interrupts */ 1723e79b588SDetlev Zundel out_be32 (&lbc->lteir, 0xffffffff); /* Enable LBC error interrupts */ 1733e79b588SDetlev Zundel out_be32 (&ecm->eedr, 0xffffffff); /* Clear ecm errors */ 1743e79b588SDetlev Zundel out_be32 (&ecm->eeer, 0xffffffff); /* Enable ecm errors */ 1753e79b588SDetlev Zundel 1763e79b588SDetlev Zundel /* Init UPMA for FPGA access */ 1773e79b588SDetlev Zundel out_be32 (&lbc->mamr, 0x44440); /* Use a customer-supplied value */ 1783e79b588SDetlev Zundel upmconfig (UPMA, (uint *)UPMTableA, sizeof(UPMTableA)/sizeof(int)); 179e64987a8SAnatolij Gustschin 180e64987a8SAnatolij Gustschin /* Init UPMB for Lime controller access */ 181e64987a8SAnatolij Gustschin out_be32 (&lbc->mbmr, 0x444440); /* Use a customer-supplied value */ 182e64987a8SAnatolij Gustschin upmconfig (UPMB, (uint *)UPMTableB, sizeof(UPMTableB)/sizeof(int)); 183e64987a8SAnatolij Gustschin } 1845d108ac8SSergei Poselenov 1855d108ac8SSergei Poselenov #if defined(CONFIG_PCI) 1865d108ac8SSergei Poselenov /* 1875d108ac8SSergei Poselenov * Initialize PCI Devices, report devices found. 1885d108ac8SSergei Poselenov */ 1895d108ac8SSergei Poselenov 1905d108ac8SSergei Poselenov #ifndef CONFIG_PCI_PNP 1915d108ac8SSergei Poselenov static struct pci_config_table pci_mpc85xxads_config_table[] = { 1925d108ac8SSergei Poselenov {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 1935d108ac8SSergei Poselenov PCI_IDSEL_NUMBER, PCI_ANY_ID, 1945d108ac8SSergei Poselenov pci_cfgfunc_config_device, {PCI_ENET0_IOADDR, 1955d108ac8SSergei Poselenov PCI_ENET0_MEMADDR, 1965d108ac8SSergei Poselenov PCI_COMMAND_MEMORY | 1975d108ac8SSergei Poselenov PCI_COMMAND_MASTER}}, 1985d108ac8SSergei Poselenov {} 1995d108ac8SSergei Poselenov }; 2005d108ac8SSergei Poselenov #endif 2015d108ac8SSergei Poselenov 2025d108ac8SSergei Poselenov 2035d108ac8SSergei Poselenov static struct pci_controller hose = { 2045d108ac8SSergei Poselenov #ifndef CONFIG_PCI_PNP 2055d108ac8SSergei Poselenov config_table:pci_mpc85xxads_config_table, 2065d108ac8SSergei Poselenov #endif 2075d108ac8SSergei Poselenov }; 2085d108ac8SSergei Poselenov 2095d108ac8SSergei Poselenov #endif /* CONFIG_PCI */ 2105d108ac8SSergei Poselenov 2115d108ac8SSergei Poselenov 2125d108ac8SSergei Poselenov void pci_init_board (void) 2135d108ac8SSergei Poselenov { 2145d108ac8SSergei Poselenov #ifdef CONFIG_PCI 2155d108ac8SSergei Poselenov pci_mpc85xx_init (&hose); 2165d108ac8SSergei Poselenov #endif /* CONFIG_PCI */ 2175d108ac8SSergei Poselenov } 2185d108ac8SSergei Poselenov 2195d108ac8SSergei Poselenov #ifdef CONFIG_BOARD_EARLY_INIT_R 2205d108ac8SSergei Poselenov int board_early_init_r (void) 2215d108ac8SSergei Poselenov { 2226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 2233e79b588SDetlev Zundel 2243e79b588SDetlev Zundel /* set and reset the GPIO pin 2 which will reset the W83782G chip */ 2253e79b588SDetlev Zundel out_8((unsigned char*)&gur->gpoutdr, 0x3F ); 2263e79b588SDetlev Zundel out_be32((unsigned int*)&gur->gpiocr, 0x200 ); /* enable GPOut */ 2273e79b588SDetlev Zundel udelay(200); 2283e79b588SDetlev Zundel out_8( (unsigned char*)&gur->gpoutdr, 0x1F ); 2293e79b588SDetlev Zundel 2305d108ac8SSergei Poselenov return (0); 2315d108ac8SSergei Poselenov } 2325d108ac8SSergei Poselenov #endif /* CONFIG_BOARD_EARLY_INIT_R */ 233e18575d5SSergei Poselenov 234e18575d5SSergei Poselenov #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) 235e18575d5SSergei Poselenov void 236e18575d5SSergei Poselenov ft_board_setup(void *blob, bd_t *bd) 237e18575d5SSergei Poselenov { 2383e79b588SDetlev Zundel u32 val[12]; 2393e79b588SDetlev Zundel int rc, i = 0; 240e18575d5SSergei Poselenov 241e18575d5SSergei Poselenov ft_cpu_setup(blob, bd); 242e18575d5SSergei Poselenov 2433e79b588SDetlev Zundel /* Fixup NOR FLASH mapping */ 2443e79b588SDetlev Zundel val[i++] = 0; /* chip select number */ 2453e79b588SDetlev Zundel val[i++] = 0; /* always 0 */ 2463e79b588SDetlev Zundel val[i++] = gd->bd->bi_flashstart; 2473e79b588SDetlev Zundel val[i++] = gd->bd->bi_flashsize; 2483e79b588SDetlev Zundel 2496d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (mb862xx.frameAdrs == CONFIG_SYS_LIME_BASE) { 250e64987a8SAnatolij Gustschin /* Fixup LIME mapping */ 251e64987a8SAnatolij Gustschin val[i++] = 2; /* chip select number */ 252e64987a8SAnatolij Gustschin val[i++] = 0; /* always 0 */ 2536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_LIME_BASE; 2546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_LIME_SIZE; 255e64987a8SAnatolij Gustschin } 256e64987a8SAnatolij Gustschin 2573e79b588SDetlev Zundel /* Fixup FPGA mapping */ 2583e79b588SDetlev Zundel val[i++] = 3; /* chip select number */ 2593e79b588SDetlev Zundel val[i++] = 0; /* always 0 */ 2606d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_FPGA_BASE; 2616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD val[i++] = CONFIG_SYS_FPGA_SIZE; 262e18575d5SSergei Poselenov 263e18575d5SSergei Poselenov rc = fdt_find_and_setprop(blob, "/localbus", "ranges", 2643e79b588SDetlev Zundel val, i * sizeof(u32), 1); 265e18575d5SSergei Poselenov if (rc) 2663e79b588SDetlev Zundel printf("Unable to update localbus ranges, err=%s\n", 267e18575d5SSergei Poselenov fdt_strerror(rc)); 268e18575d5SSergei Poselenov } 269e18575d5SSergei Poselenov #endif /* defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) */ 270e64987a8SAnatolij Gustschin 2716d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_SRST ((CONFIG_SYS_LIME_BASE) + 0x01FC002C) 2726d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CCF ((CONFIG_SYS_LIME_BASE) + 0x01FC0038) 2736d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_MMR ((CONFIG_SYS_LIME_BASE) + 0x01FCFFFC) 274e64987a8SAnatolij Gustschin /* Lime clock frequency */ 2756d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CLK_100MHZ 0x00000 2766d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CLK_133MHZ 0x10000 277e64987a8SAnatolij Gustschin /* SDRAM parameter */ 2786d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_MMR_VALUE 0x4157BA63 279e64987a8SAnatolij Gustschin 280e64987a8SAnatolij Gustschin #define DISPLAY_WIDTH 800 281e64987a8SAnatolij Gustschin #define DISPLAY_HEIGHT 480 282e64987a8SAnatolij Gustschin #define DEFAULT_BRIGHTNESS 25 283e64987a8SAnatolij Gustschin #define BACKLIGHT_ENABLE (1 << 31) 284e64987a8SAnatolij Gustschin 285e64987a8SAnatolij Gustschin static const gdc_regs init_regs [] = 286e64987a8SAnatolij Gustschin { 287e64987a8SAnatolij Gustschin {0x0100, 0x00010f00}, 288e64987a8SAnatolij Gustschin {0x0020, 0x801901df}, 289e64987a8SAnatolij Gustschin {0x0024, 0x00000000}, 290e64987a8SAnatolij Gustschin {0x0028, 0x00000000}, 291e64987a8SAnatolij Gustschin {0x002c, 0x00000000}, 292e64987a8SAnatolij Gustschin {0x0110, 0x00000000}, 293e64987a8SAnatolij Gustschin {0x0114, 0x00000000}, 294e64987a8SAnatolij Gustschin {0x0118, 0x01df0320}, 295e64987a8SAnatolij Gustschin {0x0004, 0x041f0000}, 296e64987a8SAnatolij Gustschin {0x0008, 0x031f031f}, 297e64987a8SAnatolij Gustschin {0x000c, 0x017f0349}, 298e64987a8SAnatolij Gustschin {0x0010, 0x020c0000}, 299e64987a8SAnatolij Gustschin {0x0014, 0x01df01e9}, 300e64987a8SAnatolij Gustschin {0x0018, 0x00000000}, 301e64987a8SAnatolij Gustschin {0x001c, 0x01e00320}, 302e64987a8SAnatolij Gustschin {0x0100, 0x80010f00}, 303e64987a8SAnatolij Gustschin {0x0, 0x0} 304e64987a8SAnatolij Gustschin }; 305e64987a8SAnatolij Gustschin 306e64987a8SAnatolij Gustschin const gdc_regs *board_get_regs (void) 307e64987a8SAnatolij Gustschin { 308e64987a8SAnatolij Gustschin return init_regs; 309e64987a8SAnatolij Gustschin } 310e64987a8SAnatolij Gustschin 3116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_CID ((CONFIG_SYS_LIME_BASE) + 0x01FC00F0) 3126d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_LIME_REV ((CONFIG_SYS_LIME_BASE) + 0x01FF8084) 313fb661ea4Su-boot@bugs.denx.de int lime_probe(void) 314fb661ea4Su-boot@bugs.denx.de { 3156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD volatile ccsr_lbc_t *memctl = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); 316fb661ea4Su-boot@bugs.denx.de uint cfg_br2; 317fb661ea4Su-boot@bugs.denx.de uint cfg_or2; 318fb661ea4Su-boot@bugs.denx.de uint reg; 319fb661ea4Su-boot@bugs.denx.de 320fb661ea4Su-boot@bugs.denx.de cfg_br2 = memctl->br2; 321fb661ea4Su-boot@bugs.denx.de cfg_or2 = memctl->or2; 322fb661ea4Su-boot@bugs.denx.de 323fb661ea4Su-boot@bugs.denx.de /* Configure GPCM for CS2 */ 324fb661ea4Su-boot@bugs.denx.de memctl->br2 = 0; 325fb661ea4Su-boot@bugs.denx.de memctl->or2 = 0xfc000410; 3266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD memctl->br2 = (CONFIG_SYS_LIME_BASE) | 0x00001901; 327fb661ea4Su-boot@bugs.denx.de 328fb661ea4Su-boot@bugs.denx.de /* Try to access GDC ID/Revision registers */ 3296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)CONFIG_SYS_LIME_CID); 3306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)CONFIG_SYS_LIME_CID); 331fb661ea4Su-boot@bugs.denx.de if (reg == 0x303) { 3326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)CONFIG_SYS_LIME_REV); 3336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)CONFIG_SYS_LIME_REV); 334fb661ea4Su-boot@bugs.denx.de reg = ((reg & ~0xff) == 0x20050100) ? 1 : 0; 335fb661ea4Su-boot@bugs.denx.de } else 336fb661ea4Su-boot@bugs.denx.de reg = 0; 337fb661ea4Su-boot@bugs.denx.de 338fb661ea4Su-boot@bugs.denx.de /* Restore previous CS2 configuration */ 339fb661ea4Su-boot@bugs.denx.de memctl->br2 = 0; 340fb661ea4Su-boot@bugs.denx.de memctl->or2 = cfg_or2; 341fb661ea4Su-boot@bugs.denx.de memctl->br2 = cfg_br2; 342fb661ea4Su-boot@bugs.denx.de return reg; 343fb661ea4Su-boot@bugs.denx.de } 344fb661ea4Su-boot@bugs.denx.de 345e64987a8SAnatolij Gustschin /* Returns Lime base address */ 346e64987a8SAnatolij Gustschin unsigned int board_video_init (void) 347e64987a8SAnatolij Gustschin { 348fb661ea4Su-boot@bugs.denx.de if (!lime_probe()) 349e64987a8SAnatolij Gustschin return 0; 350e64987a8SAnatolij Gustschin 351e64987a8SAnatolij Gustschin /* 352e64987a8SAnatolij Gustschin * Reset Lime controller 353e64987a8SAnatolij Gustschin */ 3546d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)CONFIG_SYS_LIME_SRST, 0x1); 355e64987a8SAnatolij Gustschin udelay(200); 356e64987a8SAnatolij Gustschin 357e64987a8SAnatolij Gustschin /* Set Lime clock to 133MHz */ 3586d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)CONFIG_SYS_LIME_CCF, CONFIG_SYS_LIME_CLK_133MHZ); 359e64987a8SAnatolij Gustschin /* Delay required */ 360e64987a8SAnatolij Gustschin udelay(300); 361e64987a8SAnatolij Gustschin /* Set memory parameters */ 3626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)CONFIG_SYS_LIME_MMR, CONFIG_SYS_LIME_MMR_VALUE); 363e64987a8SAnatolij Gustschin 364e64987a8SAnatolij Gustschin mb862xx.winSizeX = DISPLAY_WIDTH; 365e64987a8SAnatolij Gustschin mb862xx.winSizeY = DISPLAY_HEIGHT; 366e64987a8SAnatolij Gustschin mb862xx.gdfIndex = GDF_15BIT_555RGB; 367e64987a8SAnatolij Gustschin mb862xx.gdfBytesPP = 2; 368e64987a8SAnatolij Gustschin 3696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD return CONFIG_SYS_LIME_BASE; 370e64987a8SAnatolij Gustschin } 371e64987a8SAnatolij Gustschin 372e64987a8SAnatolij Gustschin #define W83782D_REG_CFG 0x40 373e64987a8SAnatolij Gustschin #define W83782D_REG_BANK_SEL 0x4e 374e64987a8SAnatolij Gustschin #define W83782D_REG_ADCCLK 0x4b 375e64987a8SAnatolij Gustschin #define W83782D_REG_BEEP_CTRL 0x4d 376e64987a8SAnatolij Gustschin #define W83782D_REG_BEEP_CTRL2 0x57 377e64987a8SAnatolij Gustschin #define W83782D_REG_PWMOUT1 0x5b 378e64987a8SAnatolij Gustschin #define W83782D_REG_VBAT 0x5d 379e64987a8SAnatolij Gustschin 380e64987a8SAnatolij Gustschin static int w83782d_hwmon_init(void) 381e64987a8SAnatolij Gustschin { 382e64987a8SAnatolij Gustschin u8 buf; 383e64987a8SAnatolij Gustschin 3846d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 1, &buf, 1)) 385e64987a8SAnatolij Gustschin return -1; 386e64987a8SAnatolij Gustschin 3876d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 0x80); 3886d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BANK_SEL, 0); 3896d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_ADCCLK, 0x40); 390e64987a8SAnatolij Gustschin 3916d0f6bcfSJean-Christophe PLAGNIOL-VILLARD buf = i2c_reg_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL); 3926d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL, 393e64987a8SAnatolij Gustschin buf | 0x80); 3946d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_BEEP_CTRL2, 0); 3956d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_PWMOUT1, 0x47); 3966d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_VBAT, 0x01); 397e64987a8SAnatolij Gustschin 3986d0f6bcfSJean-Christophe PLAGNIOL-VILLARD buf = i2c_reg_read(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG); 3996d0f6bcfSJean-Christophe PLAGNIOL-VILLARD i2c_reg_write(CONFIG_SYS_I2C_W83782G_ADDR, W83782D_REG_CFG, 400e64987a8SAnatolij Gustschin (buf & 0xf4) | 0x01); 401e64987a8SAnatolij Gustschin return 0; 402e64987a8SAnatolij Gustschin } 403e64987a8SAnatolij Gustschin 404e64987a8SAnatolij Gustschin static void board_backlight_brightness(int br) 405e64987a8SAnatolij Gustschin { 406e64987a8SAnatolij Gustschin u32 reg; 407e64987a8SAnatolij Gustschin u8 buf; 408e64987a8SAnatolij Gustschin u8 old_buf; 409e64987a8SAnatolij Gustschin 410e64987a8SAnatolij Gustschin /* Select bank 0 */ 4116d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_read(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &old_buf, 1)) 412e64987a8SAnatolij Gustschin goto err; 413e64987a8SAnatolij Gustschin else 414e64987a8SAnatolij Gustschin buf = old_buf & 0xf8; 415e64987a8SAnatolij Gustschin 4166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &buf, 1)) 417e64987a8SAnatolij Gustschin goto err; 418e64987a8SAnatolij Gustschin 419e64987a8SAnatolij Gustschin if (br > 0) { 420e64987a8SAnatolij Gustschin /* PWMOUT1 duty cycle ctrl */ 421e64987a8SAnatolij Gustschin buf = 255 / (100 / br); 4226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x5b, 1, &buf, 1)) 423e64987a8SAnatolij Gustschin goto err; 424e64987a8SAnatolij Gustschin 425e64987a8SAnatolij Gustschin /* LEDs on */ 4266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c)); 427e64987a8SAnatolij Gustschin if (!(reg & BACKLIGHT_ENABLE)); 4286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c), 429e64987a8SAnatolij Gustschin reg | BACKLIGHT_ENABLE); 430e64987a8SAnatolij Gustschin } else { 431e64987a8SAnatolij Gustschin buf = 0; 4326d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x5b, 1, &buf, 1)) 433e64987a8SAnatolij Gustschin goto err; 434e64987a8SAnatolij Gustschin 435e64987a8SAnatolij Gustschin /* LEDs off */ 4366d0f6bcfSJean-Christophe PLAGNIOL-VILLARD reg = in_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c)); 437e64987a8SAnatolij Gustschin reg &= ~BACKLIGHT_ENABLE; 4386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD out_be32((void *)(CONFIG_SYS_FPGA_BASE + 0x0c), reg); 439e64987a8SAnatolij Gustschin } 440e64987a8SAnatolij Gustschin /* Restore previous bank setting */ 4416d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (i2c_write(CONFIG_SYS_I2C_W83782G_ADDR, 0x4e, 1, &old_buf, 1)) 442e64987a8SAnatolij Gustschin goto err; 443e64987a8SAnatolij Gustschin 444e64987a8SAnatolij Gustschin return; 445e64987a8SAnatolij Gustschin err: 446e64987a8SAnatolij Gustschin printf("W83782G I2C access failed\n"); 447e64987a8SAnatolij Gustschin } 448e64987a8SAnatolij Gustschin 449e64987a8SAnatolij Gustschin void board_backlight_switch (int flag) 450e64987a8SAnatolij Gustschin { 451e64987a8SAnatolij Gustschin char * param; 452e64987a8SAnatolij Gustschin int rc; 453e64987a8SAnatolij Gustschin 454e64987a8SAnatolij Gustschin if (w83782d_hwmon_init()) 455e64987a8SAnatolij Gustschin printf ("hwmon IC init failed\n"); 456e64987a8SAnatolij Gustschin 457e64987a8SAnatolij Gustschin if (flag) { 458e64987a8SAnatolij Gustschin param = getenv("brightness"); 459e64987a8SAnatolij Gustschin rc = param ? simple_strtol(param, NULL, 10) : -1; 460e64987a8SAnatolij Gustschin if (rc < 0) 461e64987a8SAnatolij Gustschin rc = DEFAULT_BRIGHTNESS; 462e64987a8SAnatolij Gustschin } else { 463e64987a8SAnatolij Gustschin rc = 0; 464e64987a8SAnatolij Gustschin } 465e64987a8SAnatolij Gustschin board_backlight_brightness(rc); 466e64987a8SAnatolij Gustschin } 467e64987a8SAnatolij Gustschin 468e64987a8SAnatolij Gustschin #if defined(CONFIG_CONSOLE_EXTRA_INFO) 469e64987a8SAnatolij Gustschin /* 470e64987a8SAnatolij Gustschin * Return text to be printed besides the logo. 471e64987a8SAnatolij Gustschin */ 472e64987a8SAnatolij Gustschin void video_get_info_str (int line_number, char *info) 473e64987a8SAnatolij Gustschin { 474e64987a8SAnatolij Gustschin if (line_number == 1) { 475e64987a8SAnatolij Gustschin strcpy (info, " Board: Socrates"); 476e64987a8SAnatolij Gustschin } else { 477e64987a8SAnatolij Gustschin info [0] = '\0'; 478e64987a8SAnatolij Gustschin } 479e64987a8SAnatolij Gustschin } 480e64987a8SAnatolij Gustschin #endif 481