uboot/board/prodrive/p3p440/p3p440.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2005
   3 * Stefan Roese, DENX Software Engineering, sr@denx.de.
   4 *
   5 * Copyright (C) 2002 Scott McNutt <smcnutt@artesyncp.com>
   6 *
   7 * See file CREDITS for list of people who contributed to this
   8 * project.
   9 *
  10 * This program is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU General Public License as
  12 * published by the Free Software Foundation; either version 2 of
  13 * the License, or (at your option) any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; if not, write to the Free Software
  22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  23 * MA 02111-1307 USA
  24 */
  25
  26#include <common.h>
  27#include <asm/processor.h>
  28#include <command.h>
  29
  30#include "p3p440.h"
  31
  32DECLARE_GLOBAL_DATA_PTR;
  33
  34void set_led(int color)
  35{
  36        switch (color) {
  37        case LED_OFF:
  38                out32(GPIO0_OR,  in32(GPIO0_OR) & ~CONFIG_SYS_LED_GREEN & ~CONFIG_SYS_LED_RED);
  39                break;
  40
  41        case LED_GREEN:
  42                out32(GPIO0_OR,  (in32(GPIO0_OR) | CONFIG_SYS_LED_GREEN) & ~CONFIG_SYS_LED_RED);
  43                break;
  44
  45        case LED_RED:
  46                out32(GPIO0_OR,  (in32(GPIO0_OR) | CONFIG_SYS_LED_RED) & ~CONFIG_SYS_LED_GREEN);
  47                break;
  48
  49        case LED_ORANGE:
  50                out32(GPIO0_OR,  in32(GPIO0_OR) | CONFIG_SYS_LED_GREEN | CONFIG_SYS_LED_RED);
  51                break;
  52        }
  53}
  54
  55static int is_monarch(void)
  56{
  57        out32(GPIO0_OR,  in32(GPIO0_OR) & ~CONFIG_SYS_GPIO_RDY);
  58        udelay(1000);
  59
  60        if (in32(GPIO0_IR) & CONFIG_SYS_MONARCH_IO)
  61                return 0;
  62        else
  63                return 1;
  64}
  65
  66static void wait_for_pci_ready(void)
  67{
  68        /*
  69         * Configure EREADY_IO as input
  70         */
  71        out32(GPIO0_TCR, in32(GPIO0_TCR) & ~CONFIG_SYS_EREADY_IO);
  72        udelay(1000);
  73
  74        for (;;) {
  75                if (in32(GPIO0_IR) & CONFIG_SYS_EREADY_IO)
  76                        return;
  77        }
  78
  79}
  80
  81int board_early_init_f(void)
  82{
  83        uint reg;
  84
  85        /*--------------------------------------------------------------------
  86         * Setup the external bus controller/chip selects
  87         *-------------------------------------------------------------------*/
  88        mtdcr(EBC0_CFGADDR, EBC0_CFG);
  89        reg = mfdcr(EBC0_CFGDATA);
  90        mtdcr(EBC0_CFGDATA, reg | 0x04000000);  /* Set ATC */
  91
  92        /*--------------------------------------------------------------------
  93         * Setup pin multiplexing (GPIO/IRQ...)
  94         *-------------------------------------------------------------------*/
  95        mtdcr(CPC0_GPIO, 0x03F01F80);
  96
  97        out32(GPIO0_ODR, 0x00000000);   /* no open drain pins      */
  98        out32(GPIO0_TCR, CONFIG_SYS_GPIO_RDY | CONFIG_SYS_EREADY_IO | CONFIG_SYS_LED_RED | CONFIG_SYS_LED_GREEN);
  99        out32(GPIO0_OR,  CONFIG_SYS_GPIO_RDY);
 100
 101        /*--------------------------------------------------------------------
 102         * Setup the interrupt controller polarities, triggers, etc.
 103         *-------------------------------------------------------------------*/
 104        mtdcr(UIC0SR, 0xffffffff);      /* clear all */
 105        mtdcr(UIC0ER, 0x00000000);      /* disable all */
 106        mtdcr(UIC0CR, 0x00000001);      /* UIC1 crit is critical */
 107        mtdcr(UIC0PR, 0xfffffe13);      /* per ref-board manual */
 108        mtdcr(UIC0TR, 0x01c00008);      /* per ref-board manual */
 109        mtdcr(UIC0VR, 0x00000001);      /* int31 highest, base=0x000 */
 110        mtdcr(UIC0SR, 0xffffffff);      /* clear all */
 111
 112        mtdcr(UIC1SR, 0xffffffff);      /* clear all */
 113        mtdcr(UIC1ER, 0x00000000);      /* disable all */
 114        mtdcr(UIC1CR, 0x00000000);      /* all non-critical */
 115        mtdcr(UIC1PR, 0xffffe0ff);      /* per ref-board manual */
 116        mtdcr(UIC1TR, 0x00ffc000);      /* per ref-board manual */
 117        mtdcr(UIC1VR, 0x00000001);      /* int31 highest, base=0x000 */
 118        mtdcr(UIC1SR, 0xffffffff);      /* clear all */
 119
 120        return 0;
 121}
 122
 123int checkboard(void)
 124{
 125        char *s = getenv("serial#");
 126
 127        printf("Board: P3P440");
 128        if (s != NULL) {
 129                puts(", serial# ");
 130                puts(s);
 131        }
 132
 133        if (is_monarch()) {
 134                puts(", Monarch");
 135        } else {
 136                puts(", None-Monarch");
 137        }
 138
 139        putc('\n');
 140
 141        return (0);
 142}
 143
 144int misc_init_r (void)
 145{
 146        /*
 147         * Adjust flash start and offset to detected values
 148         */
 149        gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize;
 150        gd->bd->bi_flashoffset = 0;
 151
 152        /*
 153         * Check if only one FLASH bank is available
 154         */
 155        if (gd->bd->bi_flashsize != CONFIG_SYS_MAX_FLASH_BANKS * (0 - CONFIG_SYS_FLASH0)) {
 156                mtebc(PB1CR, 0);                        /* disable cs */
 157                mtebc(PB1AP, 0);
 158                mtebc(PB2CR, 0);                        /* disable cs */
 159                mtebc(PB2AP, 0);
 160                mtebc(PB3CR, 0);                        /* disable cs */
 161                mtebc(PB3AP, 0);
 162        }
 163
 164        return 0;
 165}
 166
 167/*************************************************************************
 168 *  pci_pre_init
 169 *
 170 *  This routine is called just prior to registering the hose and gives
 171 *  the board the opportunity to check things. Returning a value of zero
 172 *  indicates that things are bad & PCI initialization should be aborted.
 173 *
 174 *      Different boards may wish to customize the pci controller structure
 175 *      (add regions, override default access routines, etc) or perform
 176 *      certain pre-initialization actions.
 177 *
 178 ************************************************************************/
 179#if defined(CONFIG_PCI)
 180int pci_pre_init(struct pci_controller *hose)
 181{
 182        unsigned long strap;
 183
 184        /*--------------------------------------------------------------------------+
 185         *      The P3P440 board is always configured as the host & requires the
 186         *      PCI arbiter to be disabled because it's an PMC module.
 187         *--------------------------------------------------------------------------*/
 188        strap = mfdcr(CPC0_STRP1);
 189        if (strap & 0x00100000) {
 190                printf("PCI: CPC0_STRP1[PAE] set.\n");
 191                return 0;
 192        }
 193
 194        return 1;
 195}
 196#endif  /* defined(CONFIG_PCI) */
 197
 198/*************************************************************************
 199 *  pci_target_init
 200 *
 201 *      The bootstrap configuration provides default settings for the pci
 202 *      inbound map (PIM). But the bootstrap config choices are limited and
 203 *      may not be sufficient for a given board.
 204 *
 205 ************************************************************************/
 206#if defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT)
 207void pci_target_init(struct pci_controller *hose)
 208{
 209        /*--------------------------------------------------------------------------+
 210         * Disable everything
 211         *--------------------------------------------------------------------------*/
 212        out32r(PCIL0_PIM0SA, 0);        /* disable */
 213        out32r(PCIL0_PIM1SA, 0);        /* disable */
 214        out32r(PCIL0_PIM2SA, 0);        /* disable */
 215        out32r(PCIL0_EROMBA, 0);        /* disable expansion rom */
 216
 217        /*--------------------------------------------------------------------------+
 218         * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440 strapping
 219         * options to not support sizes such as 128/256 MB.
 220         *--------------------------------------------------------------------------*/
 221        out32r(PCIL0_PIM0LAL, CONFIG_SYS_SDRAM_BASE);
 222        out32r(PCIL0_PIM0LAH, 0);
 223        out32r(PCIL0_PIM0SA, ~(gd->ram_size - 1) | 1);
 224
 225        out32r(PCIL0_BAR0, 0);
 226
 227        /*--------------------------------------------------------------------------+
 228         * Program the board's subsystem id/vendor id
 229         *--------------------------------------------------------------------------*/
 230        out16r(PCIL0_SBSYSVID, CONFIG_SYS_PCI_SUBSYS_VENDORID);
 231        out16r(PCIL0_SBSYSID, CONFIG_SYS_PCI_SUBSYS_DEVICEID);
 232
 233        out16r(PCIL0_CMD, in16r(PCIL0_CMD) | PCI_COMMAND_MEMORY);
 234}
 235#endif                          /* defined(CONFIG_PCI) && defined(CONFIG_SYS_PCI_TARGET_INIT) */
 236
 237/*************************************************************************
 238 *  is_pci_host
 239 *
 240 *      This routine is called to determine if a pci scan should be
 241 *      performed. With various hardware environments (especially cPCI and
 242 *      PPMC) it's insufficient to depend on the state of the arbiter enable
 243 *      bit in the strap register, or generic host/adapter assumptions.
 244 *
 245 *      Rather than hard-code a bad assumption in the general 440 code, the
 246 *      440 pci code requires the board to decide at runtime.
 247 *
 248 *      Return 0 for adapter mode, non-zero for host (monarch) mode.
 249 *
 250 *
 251 ************************************************************************/
 252#if defined(CONFIG_PCI)
 253int is_pci_host(struct pci_controller *hose)
 254{
 255        if (is_monarch()) {
 256                wait_for_pci_ready();
 257                return 1;               /* return 1 for host controller */
 258        } else {
 259                return 0;               /* return 0 for adapter controller */
 260        }
 261}
 262#endif                          /* defined(CONFIG_PCI) */
 263