sh: pci: Rewrite SH7751 PCI support to follow SH7780.
This follows the similar sort of scheme that the refactored SH7780 code uses, using a 64MB CS3 mapping to handle the window0 case, and simply discarding window1. This vastly simplifies the code, and allows most of the board-specific setup to go die. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
@@ -23,7 +23,8 @@ config PCI_NEW
|
|||||||
bool
|
bool
|
||||||
depends on PCI
|
depends on PCI
|
||||||
default y if CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7780 || \
|
default y if CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7780 || \
|
||||||
CPU_SUBTYPE_SH7785 || CPU_SH5
|
CPU_SUBTYPE_SH7785 || CPU_SH5 || \
|
||||||
|
CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R
|
||||||
|
|
||||||
# This is also board-specific
|
# This is also board-specific
|
||||||
config PCI_AUTO
|
config PCI_AUTO
|
||||||
|
@@ -16,7 +16,7 @@ obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \
|
|||||||
pci-dreamcast.o
|
pci-dreamcast.o
|
||||||
obj-$(CONFIG_SH_SECUREEDGE5410) += ops-snapgear.o
|
obj-$(CONFIG_SH_SECUREEDGE5410) += ops-snapgear.o
|
||||||
obj-$(CONFIG_SH_RTS7751R2D) += ops-rts7751r2d.o fixups-rts7751r2d.o
|
obj-$(CONFIG_SH_RTS7751R2D) += ops-rts7751r2d.o fixups-rts7751r2d.o
|
||||||
obj-$(CONFIG_SH_SH03) += ops-sh03.o fixups-sh03.o
|
obj-$(CONFIG_SH_SH03) += fixups-sh03.o
|
||||||
obj-$(CONFIG_SH_HIGHLANDER) += fixups-r7780rp.o
|
obj-$(CONFIG_SH_HIGHLANDER) += fixups-r7780rp.o
|
||||||
obj-$(CONFIG_SH_SH7785LCR) += fixups-r7780rp.o
|
obj-$(CONFIG_SH_SH7785LCR) += fixups-r7780rp.o
|
||||||
obj-$(CONFIG_SH_SDK7780) += fixups-sdk7780.o
|
obj-$(CONFIG_SH_SDK7780) += fixups-sdk7780.o
|
||||||
|
@@ -15,37 +15,6 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include "pci-sh4.h"
|
#include "pci-sh4.h"
|
||||||
|
|
||||||
static struct resource sh7751_io_resource = {
|
|
||||||
.name = "SH7751 IO",
|
|
||||||
.start = SH7751_PCI_IO_BASE,
|
|
||||||
.end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_IO
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource sh7751_mem_resource = {
|
|
||||||
.name = "SH7751 mem",
|
|
||||||
.start = SH7751_PCI_MEMORY_BASE,
|
|
||||||
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM
|
|
||||||
};
|
|
||||||
|
|
||||||
struct pci_channel board_pci_channels[] = {
|
|
||||||
{ sh7751_pci_init, &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0x3ff},
|
|
||||||
{NULL, NULL, NULL, 0, 0},
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sh4_pci_address_map sh7751_pci_map = {
|
|
||||||
.window0 = {
|
|
||||||
.base = SH7751_CS3_BASE_ADDR,
|
|
||||||
.size = (64 << 20), /* 64MB */
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init pcibios_init_platform(void)
|
|
||||||
{
|
|
||||||
return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
int pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
int pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@@ -21,36 +21,3 @@ int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
|||||||
{
|
{
|
||||||
return lboxre2_irq_tab[slot];
|
return lboxre2_irq_tab[slot];
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct resource sh7751_io_resource = {
|
|
||||||
.name = "SH7751_IO",
|
|
||||||
.start = SH7751_PCI_IO_BASE ,
|
|
||||||
.end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_IO
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource sh7751_mem_resource = {
|
|
||||||
.name = "SH7751_mem",
|
|
||||||
.start = SH7751_PCI_MEMORY_BASE,
|
|
||||||
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct pci_ops sh7751_pci_ops;
|
|
||||||
|
|
||||||
struct pci_channel board_pci_channels[] = {
|
|
||||||
{ sh7751_pci_init, &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
|
|
||||||
{ NULL, NULL, NULL, 0, 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sh4_pci_address_map sh7751_pci_map = {
|
|
||||||
.window0 = {
|
|
||||||
.base = SH7751_CS3_BASE_ADDR,
|
|
||||||
.size = 0x04000000,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init pcibios_init_platform(void)
|
|
||||||
{
|
|
||||||
return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
|
|
||||||
}
|
|
||||||
|
@@ -29,37 +29,3 @@ int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
|||||||
{
|
{
|
||||||
return rts7751r2d_irq_tab[slot];
|
return rts7751r2d_irq_tab[slot];
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct resource sh7751_io_resource = {
|
|
||||||
.name = "SH7751_IO",
|
|
||||||
.start = 0x4000,
|
|
||||||
.end = SH7751_PCI_IO_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_IO
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource sh7751_mem_resource = {
|
|
||||||
.name = "SH7751_mem",
|
|
||||||
.start = SH7751_PCI_MEMORY_BASE,
|
|
||||||
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct pci_ops sh7751_pci_ops;
|
|
||||||
|
|
||||||
struct pci_channel board_pci_channels[] = {
|
|
||||||
{ sh7751_pci_init, &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
|
|
||||||
{ NULL, NULL, NULL, 0, 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sh4_pci_address_map sh7751_pci_map = {
|
|
||||||
.window0 = {
|
|
||||||
.base = SH7751_CS3_BASE_ADDR,
|
|
||||||
.size = 0x04000000,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init pcibios_init_platform(void)
|
|
||||||
{
|
|
||||||
return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* linux/arch/sh/drivers/pci/ops-sh03.c
|
|
||||||
*
|
|
||||||
* PCI initialization for the Interface CTP/PCI-SH03 board
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
#include "pci-sh7751.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Description: This function sets up and initializes the pcic, sets
|
|
||||||
* up the BARS, maps the DRAM into the address space etc, etc.
|
|
||||||
*/
|
|
||||||
int __init pcibios_init_platform(void)
|
|
||||||
{
|
|
||||||
__set_io_port_base(SH7751_PCI_IO_BASE);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct resource sh7751_io_resource = {
|
|
||||||
.name = "SH03 IO",
|
|
||||||
.start = SH7751_PCI_IO_BASE,
|
|
||||||
.end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_IO
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource sh7751_mem_resource = {
|
|
||||||
.name = "SH03 mem",
|
|
||||||
.start = SH7751_PCI_MEMORY_BASE,
|
|
||||||
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct pci_ops sh4_pci_ops;
|
|
||||||
|
|
||||||
struct pci_channel board_pci_channels[] = {
|
|
||||||
{ sh7751_pci_init, &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
|
|
||||||
{ NULL, NULL, NULL, 0, 0 },
|
|
||||||
};
|
|
||||||
|
|
@@ -18,55 +18,6 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include "pci-sh4.h"
|
#include "pci-sh4.h"
|
||||||
|
|
||||||
#define SNAPGEAR_PCI_IO 0x4000
|
|
||||||
#define SNAPGEAR_PCI_MEM 0xfd000000
|
|
||||||
|
|
||||||
/* PCI: default LOCAL memory window sizes (seen from PCI bus) */
|
|
||||||
#define SNAPGEAR_LSR0_SIZE (64*(1<<20)) //64MB
|
|
||||||
#define SNAPGEAR_LSR1_SIZE (64*(1<<20)) //64MB
|
|
||||||
|
|
||||||
static struct resource sh7751_io_resource = {
|
|
||||||
.name = "SH7751 IO",
|
|
||||||
.start = SNAPGEAR_PCI_IO,
|
|
||||||
.end = SNAPGEAR_PCI_IO + (64*1024) - 1, /* 64KiB I/O */
|
|
||||||
.flags = IORESOURCE_IO,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource sh7751_mem_resource = {
|
|
||||||
.name = "SH7751 mem",
|
|
||||||
.start = SNAPGEAR_PCI_MEM,
|
|
||||||
.end = SNAPGEAR_PCI_MEM + (64*1024*1024) - 1, /* 64MiB mem */
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct pci_channel board_pci_channels[] = {
|
|
||||||
{ sh7751_pci_init, &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
|
|
||||||
{ 0, }
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sh4_pci_address_map sh7751_pci_map = {
|
|
||||||
.window0 = {
|
|
||||||
.base = SH7751_CS2_BASE_ADDR,
|
|
||||||
.size = SNAPGEAR_LSR0_SIZE,
|
|
||||||
},
|
|
||||||
|
|
||||||
.window1 = {
|
|
||||||
.base = SH7751_CS2_BASE_ADDR,
|
|
||||||
.size = SNAPGEAR_LSR1_SIZE,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the SnapGear PCI interface
|
|
||||||
* Setup hardware to be Central Funtion
|
|
||||||
* Copy the BSR regs to the PCI interface
|
|
||||||
* Setup PCI windows into local RAM
|
|
||||||
*/
|
|
||||||
int __init pcibios_init_platform(void)
|
|
||||||
{
|
|
||||||
return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
|
|
||||||
}
|
|
||||||
|
|
||||||
int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
||||||
{
|
{
|
||||||
int irq = -1;
|
int irq = -1;
|
||||||
|
@@ -36,39 +36,3 @@ int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
|
|||||||
|
|
||||||
return irq;
|
return irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct resource sh7751_io_resource = {
|
|
||||||
.name = "SH7751_IO",
|
|
||||||
.start = SH7751_PCI_IO_BASE,
|
|
||||||
.end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_IO
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct resource sh7751_mem_resource = {
|
|
||||||
.name = "SH7751_mem",
|
|
||||||
.start = SH7751_PCI_MEMORY_BASE,
|
|
||||||
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
|
||||||
.flags = IORESOURCE_MEM
|
|
||||||
};
|
|
||||||
|
|
||||||
struct pci_channel board_pci_channels[] = {
|
|
||||||
{ sh7751_pci_init, &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
|
|
||||||
{ NULL, NULL, NULL, 0, 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct sh4_pci_address_map sh7751_pci_map = {
|
|
||||||
.window0 = {
|
|
||||||
.base = SH7751_CS2_BASE_ADDR,
|
|
||||||
.size = SH7751_MEM_REGION_SIZE*2, /* cs2 and cs3 */
|
|
||||||
},
|
|
||||||
|
|
||||||
.window1 = {
|
|
||||||
.base = SH7751_CS2_BASE_ADDR,
|
|
||||||
.size = SH7751_MEM_REGION_SIZE*2,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init pcibios_init_platform(void)
|
|
||||||
{
|
|
||||||
return sh7751_pcic_init(&board_pci_channels[0], &sh7751_pci_map);
|
|
||||||
}
|
|
||||||
|
@@ -1,43 +1,86 @@
|
|||||||
/*
|
/*
|
||||||
* Low-Level PCI Support for the SH7751
|
* Low-Level PCI Support for the SH7751
|
||||||
*
|
*
|
||||||
* Dustin McIntire (dustin@sensoria.com)
|
* Copyright (C) 2003 - 2009 Paul Mundt
|
||||||
* Derived from arch/i386/kernel/pci-*.c which bore the message:
|
* Copyright (C) 2001 Dustin McIntire
|
||||||
* (c) 1999--2000 Martin Mares <mj@ucw.cz>
|
|
||||||
*
|
*
|
||||||
* Ported to the new API by Paul Mundt <lethal@linux-sh.org>
|
* With cleanup by Paul van Gool <pvangool@mimotech.com>, 2003.
|
||||||
* With cleanup by Paul van Gool <pvangool@mimotech.com>
|
|
||||||
*
|
|
||||||
* May be copied or modified under the terms of the GNU General Public
|
|
||||||
* License. See linux/COPYING for more information.
|
|
||||||
*
|
*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
*/
|
*/
|
||||||
#undef DEBUG
|
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/io.h>
|
||||||
#include "pci-sh4.h"
|
#include "pci-sh4.h"
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
/*
|
static int __init __area_sdram_check(struct pci_channel *chan,
|
||||||
* Initialization. Try all known PCI access methods. Note that we support
|
unsigned int area)
|
||||||
* using both PCI BIOS and direct access: in such cases, we use I/O ports
|
|
||||||
* to access config space.
|
|
||||||
*
|
|
||||||
* Note that the platform specific initialization (BSC registers, and memory
|
|
||||||
* space mapping) will be called via the platform defined function
|
|
||||||
* pcibios_init_platform().
|
|
||||||
*/
|
|
||||||
int __init sh7751_pci_init(struct pci_channel *chan)
|
|
||||||
{
|
{
|
||||||
|
unsigned long word;
|
||||||
|
|
||||||
|
word = __raw_readl(SH7751_BCR1);
|
||||||
|
/* check BCR for SDRAM in area */
|
||||||
|
if (((word >> area) & 1) == 0) {
|
||||||
|
printk("PCI: Area %d is not configured for SDRAM. BCR1=0x%lx\n",
|
||||||
|
area, word);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pci_write_reg(chan, word, SH4_PCIBCR1);
|
||||||
|
|
||||||
|
word = __raw_readw(SH7751_BCR2);
|
||||||
|
/* check BCR2 for 32bit SDRAM interface*/
|
||||||
|
if (((word >> (area << 1)) & 0x3) != 0x3) {
|
||||||
|
printk("PCI: Area %d is not 32 bit SDRAM. BCR2=0x%lx\n",
|
||||||
|
area, word);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pci_write_reg(chan, word, SH4_PCIBCR2);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct resource sh7751_io_resource = {
|
||||||
|
.name = "SH7751_IO",
|
||||||
|
.start = SH7751_PCI_IO_BASE,
|
||||||
|
.end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1,
|
||||||
|
.flags = IORESOURCE_IO
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource sh7751_mem_resource = {
|
||||||
|
.name = "SH7785_mem",
|
||||||
|
.start = SH7751_PCI_MEMORY_BASE,
|
||||||
|
.end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
|
||||||
|
.flags = IORESOURCE_MEM
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct pci_channel sh7751_pci_controller = {
|
||||||
|
.pci_ops = &sh4_pci_ops,
|
||||||
|
.mem_resource = &sh7751_mem_resource,
|
||||||
|
.mem_offset = 0x00000000,
|
||||||
|
.io_resource = &sh7751_io_resource,
|
||||||
|
.io_offset = 0x00000000,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct sh4_pci_address_map sh7751_pci_map = {
|
||||||
|
.window0 = {
|
||||||
|
.base = SH7751_CS3_BASE_ADDR,
|
||||||
|
.size = 0x04000000,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init sh7751_pci_init(void)
|
||||||
|
{
|
||||||
|
struct pci_channel *chan = &sh7751_pci_controller;
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
|
u32 word, reg;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pr_debug("PCI: Starting intialization.\n");
|
printk(KERN_NOTICE "PCI: Starting intialization.\n");
|
||||||
|
|
||||||
chan->reg_base = 0xfe200000;
|
chan->reg_base = 0xfe200000;
|
||||||
|
|
||||||
@@ -52,41 +95,6 @@ int __init sh7751_pci_init(struct pci_channel *chan)
|
|||||||
if ((ret = sh4_pci_check_direct(chan)) != 0)
|
if ((ret = sh4_pci_check_direct(chan)) != 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return pcibios_init_platform();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init __area_sdram_check(struct pci_channel *chan,
|
|
||||||
unsigned int area)
|
|
||||||
{
|
|
||||||
u32 word;
|
|
||||||
|
|
||||||
word = ctrl_inl(SH7751_BCR1);
|
|
||||||
/* check BCR for SDRAM in area */
|
|
||||||
if (((word >> area) & 1) == 0) {
|
|
||||||
printk("PCI: Area %d is not configured for SDRAM. BCR1=0x%x\n",
|
|
||||||
area, word);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pci_write_reg(chan, word, SH4_PCIBCR1);
|
|
||||||
|
|
||||||
word = (u16)ctrl_inw(SH7751_BCR2);
|
|
||||||
/* check BCR2 for 32bit SDRAM interface*/
|
|
||||||
if (((word >> (area << 1)) & 0x3) != 0x3) {
|
|
||||||
printk("PCI: Area %d is not 32 bit SDRAM. BCR2=0x%x\n",
|
|
||||||
area, word);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pci_write_reg(chan, word, SH4_PCIBCR2);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __init sh7751_pcic_init(struct pci_channel *chan,
|
|
||||||
struct sh4_pci_address_map *map)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
u32 word;
|
|
||||||
|
|
||||||
/* Set the BCR's to enable PCI access */
|
/* Set the BCR's to enable PCI access */
|
||||||
reg = ctrl_inl(SH7751_BCR1);
|
reg = ctrl_inl(SH7751_BCR1);
|
||||||
reg |= 0x80000;
|
reg |= 0x80000;
|
||||||
@@ -112,21 +120,13 @@ int __init sh7751_pcic_init(struct pci_channel *chan,
|
|||||||
|
|
||||||
/* Set IO and Mem windows to local address
|
/* Set IO and Mem windows to local address
|
||||||
* Make PCI and local address the same for easy 1 to 1 mapping
|
* Make PCI and local address the same for easy 1 to 1 mapping
|
||||||
* Window0 = map->window0.size @ non-cached area base = SDRAM
|
|
||||||
* Window1 = map->window1.size @ cached area base = SDRAM
|
|
||||||
*/
|
*/
|
||||||
word = map->window0.size - 1;
|
word = sh7751_pci_map.window0.size - 1;
|
||||||
pci_write_reg(chan, word, SH4_PCILSR0);
|
pci_write_reg(chan, word, SH4_PCILSR0);
|
||||||
word = map->window1.size - 1;
|
|
||||||
pci_write_reg(chan, word, SH4_PCILSR1);
|
|
||||||
/* Set the values on window 0 PCI config registers */
|
/* Set the values on window 0 PCI config registers */
|
||||||
word = P2SEGADDR(map->window0.base);
|
word = P2SEGADDR(sh7751_pci_map.window0.base);
|
||||||
pci_write_reg(chan, word, SH4_PCILAR0);
|
pci_write_reg(chan, word, SH4_PCILAR0);
|
||||||
pci_write_reg(chan, word, SH7751_PCICONF5);
|
pci_write_reg(chan, word, SH7751_PCICONF5);
|
||||||
/* Set the values on window 1 PCI config registers */
|
|
||||||
word = PHYSADDR(map->window1.base);
|
|
||||||
pci_write_reg(chan, word, SH4_PCILAR1);
|
|
||||||
pci_write_reg(chan, word, SH7751_PCICONF6);
|
|
||||||
|
|
||||||
/* Set the local 16MB PCI memory space window to
|
/* Set the local 16MB PCI memory space window to
|
||||||
* the lowest PCI mapped address
|
* the lowest PCI mapped address
|
||||||
@@ -144,7 +144,7 @@ int __init sh7751_pcic_init(struct pci_channel *chan,
|
|||||||
/* Set PCI WCRx, BCRx's, copy from BSC locations */
|
/* Set PCI WCRx, BCRx's, copy from BSC locations */
|
||||||
|
|
||||||
/* check BCR for SDRAM in specified area */
|
/* check BCR for SDRAM in specified area */
|
||||||
switch (map->window0.base) {
|
switch (sh7751_pci_map.window0.base) {
|
||||||
case SH7751_CS0_BASE_ADDR: word = __area_sdram_check(chan, 0); break;
|
case SH7751_CS0_BASE_ADDR: word = __area_sdram_check(chan, 0); break;
|
||||||
case SH7751_CS1_BASE_ADDR: word = __area_sdram_check(chan, 1); break;
|
case SH7751_CS1_BASE_ADDR: word = __area_sdram_check(chan, 1); break;
|
||||||
case SH7751_CS2_BASE_ADDR: word = __area_sdram_check(chan, 2); break;
|
case SH7751_CS2_BASE_ADDR: word = __area_sdram_check(chan, 2); break;
|
||||||
@@ -179,5 +179,10 @@ int __init sh7751_pcic_init(struct pci_channel *chan,
|
|||||||
word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM;
|
word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM;
|
||||||
pci_write_reg(chan, word, SH4_PCICR);
|
pci_write_reg(chan, word, SH4_PCICR);
|
||||||
|
|
||||||
|
__set_io_port_base(SH7751_PCI_IO_BASE);
|
||||||
|
|
||||||
|
register_pci_controller(chan);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
arch_initcall(sh7751_pci_init);
|
||||||
|
@@ -57,7 +57,7 @@
|
|||||||
#define SH7751_PCICONF2_SCC 0x00FF0000 /* Sub-Class Code */
|
#define SH7751_PCICONF2_SCC 0x00FF0000 /* Sub-Class Code */
|
||||||
#define SH7751_PCICONF2_RLPI 0x0000FF00 /* Programming Interface */
|
#define SH7751_PCICONF2_RLPI 0x0000FF00 /* Programming Interface */
|
||||||
#define SH7751_PCICONF2_REV 0x000000FF /* Revision ID */
|
#define SH7751_PCICONF2_REV 0x000000FF /* Revision ID */
|
||||||
#define SH7751_PCICONF3 0xC /* PCI Config Reg 3 */
|
#define SH7751_PCICONF3 0xC /* PCI Config Reg 3 */
|
||||||
#define SH7751_PCICONF3_BIST7 0x80000000 /* Bist Supported */
|
#define SH7751_PCICONF3_BIST7 0x80000000 /* Bist Supported */
|
||||||
#define SH7751_PCICONF3_BIST6 0x40000000 /* Bist Executing */
|
#define SH7751_PCICONF3_BIST6 0x40000000 /* Bist Executing */
|
||||||
#define SH7751_PCICONF3_BIST3_0 0x0F000000 /* Bist Passed */
|
#define SH7751_PCICONF3_BIST3_0 0x0F000000 /* Bist Passed */
|
||||||
@@ -72,12 +72,12 @@
|
|||||||
#define SH7751_PCICONF5_BASE 0xFFFFFFF0 /* Mem Space Base Addr */
|
#define SH7751_PCICONF5_BASE 0xFFFFFFF0 /* Mem Space Base Addr */
|
||||||
#define SH7751_PCICONF5_LAP 0x00000008 /* Prefetch Enabled */
|
#define SH7751_PCICONF5_LAP 0x00000008 /* Prefetch Enabled */
|
||||||
#define SH7751_PCICONF5_LAT 0x00000006 /* Local Memory type */
|
#define SH7751_PCICONF5_LAT 0x00000006 /* Local Memory type */
|
||||||
#define SH7751_PCICONF5_ASI 0x00000001 /* Address Space Type */
|
#define SH7751_PCICONF5_ASI 0x00000001 /* Address Space Type */
|
||||||
#define SH7751_PCICONF6 0x18 /* PCI Config Reg 6 */
|
#define SH7751_PCICONF6 0x18 /* PCI Config Reg 6 */
|
||||||
#define SH7751_PCICONF6_BASE 0xFFFFFFF0 /* Mem Space Base Addr */
|
#define SH7751_PCICONF6_BASE 0xFFFFFFF0 /* Mem Space Base Addr */
|
||||||
#define SH7751_PCICONF6_LAP 0x00000008 /* Prefetch Enabled */
|
#define SH7751_PCICONF6_LAP 0x00000008 /* Prefetch Enabled */
|
||||||
#define SH7751_PCICONF6_LAT 0x00000006 /* Local Memory type */
|
#define SH7751_PCICONF6_LAT 0x00000006 /* Local Memory type */
|
||||||
#define SH7751_PCICONF6_ASI 0x00000001 /* Address Space Type */
|
#define SH7751_PCICONF6_ASI 0x00000001 /* Address Space Type */
|
||||||
/* PCICONF7 - PCICONF10 are undefined */
|
/* PCICONF7 - PCICONF10 are undefined */
|
||||||
#define SH7751_PCICONF11 0x2C /* PCI Config Reg 11 */
|
#define SH7751_PCICONF11 0x2C /* PCI Config Reg 11 */
|
||||||
#define SH7751_PCICONF11_SSID 0xFFFF0000 /* Subsystem ID */
|
#define SH7751_PCICONF11_SSID 0xFFFF0000 /* Subsystem ID */
|
||||||
@@ -126,11 +126,4 @@
|
|||||||
#define SH7751_CS5_BASE_ADDR (SH7751_CS4_BASE_ADDR + SH7751_MEM_REGION_SIZE)
|
#define SH7751_CS5_BASE_ADDR (SH7751_CS4_BASE_ADDR + SH7751_MEM_REGION_SIZE)
|
||||||
#define SH7751_CS6_BASE_ADDR (SH7751_CS5_BASE_ADDR + SH7751_MEM_REGION_SIZE)
|
#define SH7751_CS6_BASE_ADDR (SH7751_CS5_BASE_ADDR + SH7751_MEM_REGION_SIZE)
|
||||||
|
|
||||||
struct sh4_pci_address_map;
|
|
||||||
|
|
||||||
/* arch/sh/drivers/pci/pci-sh7751.c */
|
|
||||||
int sh7751_pci_init(struct pci_channel *chan);
|
|
||||||
int sh7751_pcic_init(struct pci_channel *chan,
|
|
||||||
struct sh4_pci_address_map *map);
|
|
||||||
|
|
||||||
#endif /* _PCI_SH7751_H_ */
|
#endif /* _PCI_SH7751_H_ */
|
||||||
|
Reference in New Issue
Block a user