Factor out SC520 sub-features
Moved sub-features of the SC520 code which is currently selectively compiled using #ifdef out of sc520.c into individual files selectively compiled via the makefile Signed-off-by: Graeme Russ <graeme.russ at gmail.com>
This commit is contained in:
		
							parent
							
								
									abf0cd3dff
								
							
						
					
					
						commit
						6d7f610b09
					
				|  | @ -32,6 +32,10 @@ include $(TOPDIR)/config.mk | ||||||
| LIB	:= $(obj)lib$(SOC).a | LIB	:= $(obj)lib$(SOC).a | ||||||
| 
 | 
 | ||||||
| COBJS-$(CONFIG_SYS_SC520) += sc520.o | COBJS-$(CONFIG_SYS_SC520) += sc520.o | ||||||
|  | COBJS-$(CONFIG_SYS_SC520_SSI) += sc520_ssi.o | ||||||
|  | COBJS-$(CONFIG_SYS_SC520_TIMER) += sc520_timer.o | ||||||
|  | COBJS-$(CONFIG_PCI) += sc520_pci.o | ||||||
|  | 
 | ||||||
| SOBJS-$(CONFIG_SYS_SC520) += sc520_asm.o | SOBJS-$(CONFIG_SYS_SC520) += sc520_asm.o | ||||||
| 
 | 
 | ||||||
| SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) | SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) | ||||||
|  |  | ||||||
|  | @ -24,15 +24,8 @@ | ||||||
| /* stuff specific for the sc520,
 | /* stuff specific for the sc520,
 | ||||||
|  * but idependent of implementation */ |  * but idependent of implementation */ | ||||||
| 
 | 
 | ||||||
| #include <config.h> |  | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <config.h> |  | ||||||
| #include <pci.h> |  | ||||||
| #ifdef CONFIG_SYS_SC520_SSI |  | ||||||
| #include <asm/ic/ssi.h> |  | ||||||
| #endif |  | ||||||
| #include <asm/io.h> | #include <asm/io.h> | ||||||
| #include <asm/pci.h> |  | ||||||
| #include <asm/ic/sc520.h> | #include <asm/ic/sc520.h> | ||||||
| 
 | 
 | ||||||
| DECLARE_GLOBAL_DATA_PTR; | DECLARE_GLOBAL_DATA_PTR; | ||||||
|  | @ -50,13 +43,6 @@ DECLARE_GLOBAL_DATA_PTR; | ||||||
|  * |  * | ||||||
|  * void init_sc520(void) |  * void init_sc520(void) | ||||||
|  * unsigned long init_sc520_dram(void) |  * unsigned long init_sc520_dram(void) | ||||||
|  * void pci_sc520_init(struct pci_controller *hose) |  | ||||||
|  * |  | ||||||
|  * void reset_timer(void) |  | ||||||
|  * ulong get_timer(ulong base) |  | ||||||
|  * void set_timer(ulong t) |  | ||||||
|  * void udelay(unsigned long usec) |  | ||||||
|  * |  | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| static u32 mmcr_base= 0xfffef000; | static u32 mmcr_base= 0xfffef000; | ||||||
|  | @ -241,269 +227,6 @@ unsigned long init_sc520_dram(void) | ||||||
| 	return dram_present; | 	return dram_present; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_PCI |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static struct { |  | ||||||
| 	u8 priority; |  | ||||||
| 	u16 level_reg; |  | ||||||
| 	u8 level_bit; |  | ||||||
| } sc520_irq[] = { |  | ||||||
| 	{ SC520_IRQ0,  SC520_MPICMODE,  0x01 }, |  | ||||||
| 	{ SC520_IRQ1,  SC520_MPICMODE,  0x02 }, |  | ||||||
| 	{ SC520_IRQ2,  SC520_SL1PICMODE, 0x02 }, |  | ||||||
| 	{ SC520_IRQ3,  SC520_MPICMODE,  0x08 }, |  | ||||||
| 	{ SC520_IRQ4,  SC520_MPICMODE,  0x10 }, |  | ||||||
| 	{ SC520_IRQ5,  SC520_MPICMODE,  0x20 }, |  | ||||||
| 	{ SC520_IRQ6,  SC520_MPICMODE,  0x40 }, |  | ||||||
| 	{ SC520_IRQ7,  SC520_MPICMODE,  0x80 }, |  | ||||||
| 
 |  | ||||||
| 	{ SC520_IRQ8,  SC520_SL1PICMODE, 0x01 }, |  | ||||||
| 	{ SC520_IRQ9,  SC520_SL1PICMODE, 0x02 }, |  | ||||||
| 	{ SC520_IRQ10, SC520_SL1PICMODE, 0x04 }, |  | ||||||
| 	{ SC520_IRQ11, SC520_SL1PICMODE, 0x08 }, |  | ||||||
| 	{ SC520_IRQ12, SC520_SL1PICMODE, 0x10 }, |  | ||||||
| 	{ SC520_IRQ13, SC520_SL1PICMODE, 0x20 }, |  | ||||||
| 	{ SC520_IRQ14, SC520_SL1PICMODE, 0x40 }, |  | ||||||
| 	{ SC520_IRQ15, SC520_SL1PICMODE, 0x80 } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /* The interrupt used for PCI INTA-INTD  */ |  | ||||||
| int sc520_pci_ints[15] = { |  | ||||||
| 	-1, -1, -1, -1, -1, -1, -1, -1, |  | ||||||
| 		-1, -1, -1, -1, -1, -1, -1 |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /* utility function to configure a pci interrupt */ |  | ||||||
| int pci_sc520_set_irq(int pci_pin, int irq) |  | ||||||
| { |  | ||||||
| 	int i; |  | ||||||
| 
 |  | ||||||
| # if 1 |  | ||||||
| 	printf("set_irq(): map INT%c to IRQ%d\n", pci_pin + 'A', irq); |  | ||||||
| #endif |  | ||||||
| 	if (irq < 0 || irq > 15) { |  | ||||||
| 		return -1; /* illegal irq */ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (pci_pin < 0 || pci_pin > 15) { |  | ||||||
| 		return -1; /* illegal pci int pin */ |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* first disable any non-pci interrupt source that use
 |  | ||||||
| 	 * this level */ |  | ||||||
| 	for (i=SC520_GPTMR0MAP;i<=SC520_GP10IMAP;i++) { |  | ||||||
| 		if (i>=SC520_PCIINTAMAP&&i<=SC520_PCIINTDMAP) { |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
| 		if (read_mmcr_byte(i) == sc520_irq[irq].priority) { |  | ||||||
| 			write_mmcr_byte(i, SC520_IRQ_DISABLED); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* Set the trigger to level */ |  | ||||||
| 	write_mmcr_byte(sc520_irq[irq].level_reg, |  | ||||||
| 			read_mmcr_byte(sc520_irq[irq].level_reg) | sc520_irq[irq].level_bit); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	if (pci_pin < 4) { |  | ||||||
| 		/* PCI INTA-INTD */ |  | ||||||
| 		/* route the interrupt */ |  | ||||||
| 		write_mmcr_byte(SC520_PCIINTAMAP + pci_pin, sc520_irq[irq].priority); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	} else { |  | ||||||
| 		/* GPIRQ0-GPIRQ10 used for additional PCI INTS */ |  | ||||||
| 		write_mmcr_byte(SC520_GP0IMAP + pci_pin - 4, sc520_irq[irq].priority); |  | ||||||
| 
 |  | ||||||
| 		/* also set the polarity in this case */ |  | ||||||
| 		write_mmcr_word(SC520_INTPINPOL, |  | ||||||
| 				read_mmcr_word(SC520_INTPINPOL) | (1 << (pci_pin-4))); |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* register the pin */ |  | ||||||
| 	sc520_pci_ints[pci_pin] = irq; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	return 0; /* OK */ |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void pci_sc520_init(struct pci_controller *hose) |  | ||||||
| { |  | ||||||
| 	hose->first_busno = 0; |  | ||||||
| 	hose->last_busno = 0xff; |  | ||||||
| 
 |  | ||||||
| 	/* System memory space */ |  | ||||||
| 	pci_set_region(hose->regions + 0, |  | ||||||
| 		       SC520_PCI_MEMORY_BUS, |  | ||||||
| 		       SC520_PCI_MEMORY_PHYS, |  | ||||||
| 		       SC520_PCI_MEMORY_SIZE, |  | ||||||
| 		       PCI_REGION_MEM | PCI_REGION_SYS_MEMORY); |  | ||||||
| 
 |  | ||||||
| 	/* PCI memory space */ |  | ||||||
| 	pci_set_region(hose->regions + 1, |  | ||||||
| 		       SC520_PCI_MEM_BUS, |  | ||||||
| 		       SC520_PCI_MEM_PHYS, |  | ||||||
| 		       SC520_PCI_MEM_SIZE, |  | ||||||
| 		       PCI_REGION_MEM); |  | ||||||
| 
 |  | ||||||
| 	/* ISA/PCI memory space */ |  | ||||||
| 	pci_set_region(hose->regions + 2, |  | ||||||
| 		       SC520_ISA_MEM_BUS, |  | ||||||
| 		       SC520_ISA_MEM_PHYS, |  | ||||||
| 		       SC520_ISA_MEM_SIZE, |  | ||||||
| 		       PCI_REGION_MEM); |  | ||||||
| 
 |  | ||||||
| 	/* PCI I/O space */ |  | ||||||
| 	pci_set_region(hose->regions + 3, |  | ||||||
| 		       SC520_PCI_IO_BUS, |  | ||||||
| 		       SC520_PCI_IO_PHYS, |  | ||||||
| 		       SC520_PCI_IO_SIZE, |  | ||||||
| 		       PCI_REGION_IO); |  | ||||||
| 
 |  | ||||||
| 	/* ISA/PCI I/O space */ |  | ||||||
| 	pci_set_region(hose->regions + 4, |  | ||||||
| 		       SC520_ISA_IO_BUS, |  | ||||||
| 		       SC520_ISA_IO_PHYS, |  | ||||||
| 		       SC520_ISA_IO_SIZE, |  | ||||||
| 		       PCI_REGION_IO); |  | ||||||
| 
 |  | ||||||
| 	hose->region_count = 5; |  | ||||||
| 
 |  | ||||||
| 	pci_setup_type1(hose, |  | ||||||
| 			SC520_REG_ADDR, |  | ||||||
| 			SC520_REG_DATA); |  | ||||||
| 
 |  | ||||||
| 	pci_register_hose(hose); |  | ||||||
| 
 |  | ||||||
| 	hose->last_busno = pci_hose_scan(hose); |  | ||||||
| 
 |  | ||||||
| 	/* enable target memory acceses on host brige */ |  | ||||||
| 	pci_write_config_word(0, PCI_COMMAND, |  | ||||||
| 			      PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_SYS_SC520_TIMER |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void reset_timer(void) |  | ||||||
| { |  | ||||||
| 	write_mmcr_word(SC520_GPTMR0CNT, 0); |  | ||||||
| 	write_mmcr_word(SC520_GPTMR0CTL, 0x6001); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ulong get_timer(ulong base) |  | ||||||
| { |  | ||||||
| 	/* fixme: 30 or 33 */ |  | ||||||
| 	return	read_mmcr_word(SC520_GPTMR0CNT) / 33; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void set_timer(ulong t) |  | ||||||
| { |  | ||||||
| 	/* FixMe: use two cascade coupled timers */ |  | ||||||
| 	write_mmcr_word(SC520_GPTMR0CTL, 0x4001); |  | ||||||
| 	write_mmcr_word(SC520_GPTMR0CNT, t*33); |  | ||||||
| 	write_mmcr_word(SC520_GPTMR0CTL, 0x6001); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void udelay(unsigned long usec) |  | ||||||
| { |  | ||||||
| 	int m=0; |  | ||||||
| 	long u; |  | ||||||
| 
 |  | ||||||
| 	read_mmcr_word(SC520_SWTMRMILLI); |  | ||||||
| 	read_mmcr_word(SC520_SWTMRMICRO); |  | ||||||
| 
 |  | ||||||
| #if 0 |  | ||||||
| 	/* do not enable this line, udelay is used in the serial driver -> recursion */ |  | ||||||
| 	printf("udelay: %ld m.u %d.%d  tm.tu %d.%d\n", usec, m, u, tm, tu); |  | ||||||
| #endif |  | ||||||
| 	while (1) { |  | ||||||
| 
 |  | ||||||
| 		m += read_mmcr_word(SC520_SWTMRMILLI); |  | ||||||
| 		u = read_mmcr_word(SC520_SWTMRMICRO) + (m * 1000); |  | ||||||
| 
 |  | ||||||
| 		if (usec <= u) { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| int ssi_set_interface(int freq, int lsb_first, int inv_clock, int inv_phase) |  | ||||||
| { |  | ||||||
| 	u8 temp=0; |  | ||||||
| 
 |  | ||||||
| 	if (freq >= 8192) { |  | ||||||
| 		temp |= CTL_CLK_SEL_4; |  | ||||||
| 	} else if (freq >= 4096) { |  | ||||||
| 		temp |= CTL_CLK_SEL_8; |  | ||||||
| 	} else if (freq >= 2048) { |  | ||||||
| 		temp |= CTL_CLK_SEL_16; |  | ||||||
| 	} else if (freq >= 1024) { |  | ||||||
| 		temp |= CTL_CLK_SEL_32; |  | ||||||
| 	} else if (freq >= 512) { |  | ||||||
| 		temp |= CTL_CLK_SEL_64; |  | ||||||
| 	} else if (freq >= 256) { |  | ||||||
| 		temp |= CTL_CLK_SEL_128; |  | ||||||
| 	} else if (freq >= 128) { |  | ||||||
| 		temp |= CTL_CLK_SEL_256; |  | ||||||
| 	} else { |  | ||||||
| 		temp |= CTL_CLK_SEL_512; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (!lsb_first) { |  | ||||||
| 		temp |= MSBF_ENB; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (inv_clock) { |  | ||||||
| 		temp |= CLK_INV_ENB; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (inv_phase) { |  | ||||||
| 		temp |= PHS_INV_ENB; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	write_mmcr_byte(SC520_SSICTL, temp); |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| u8 ssi_txrx_byte(u8 data) |  | ||||||
| { |  | ||||||
| 	write_mmcr_byte(SC520_SSIXMIT, data); |  | ||||||
| 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); |  | ||||||
| 	write_mmcr_byte(SC520_SSICMD, SSICMD_CMD_SEL_XMITRCV); |  | ||||||
| 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); |  | ||||||
| 	return read_mmcr_byte(SC520_SSIRCV); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void ssi_tx_byte(u8 data) |  | ||||||
| { |  | ||||||
| 	write_mmcr_byte(SC520_SSIXMIT, data); |  | ||||||
| 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); |  | ||||||
| 	write_mmcr_byte(SC520_SSICMD, SSICMD_CMD_SEL_XMIT); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| u8 ssi_rx_byte(void) |  | ||||||
| { |  | ||||||
| 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); |  | ||||||
| 	write_mmcr_byte(SC520_SSICMD, SSICMD_CMD_SEL_RCV); |  | ||||||
| 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); |  | ||||||
| 	return read_mmcr_byte(SC520_SSIRCV); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #ifdef CONFIG_SYS_SC520_RESET | #ifdef CONFIG_SYS_SC520_RESET | ||||||
| void reset_cpu(ulong addr) | void reset_cpu(ulong addr) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -0,0 +1,171 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2002 | ||||||
|  |  * Daniel Engström, Omicron Ceti AB <daniel@omicron.se>. | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* stuff specific for the sc520, but independent of implementation */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <pci.h> | ||||||
|  | #include <asm/pci.h> | ||||||
|  | #include <asm/ic/sc520.h> | ||||||
|  | 
 | ||||||
|  | static struct { | ||||||
|  | 	u8 priority; | ||||||
|  | 	u16 level_reg; | ||||||
|  | 	u8 level_bit; | ||||||
|  | } sc520_irq[] = { | ||||||
|  | 	{ SC520_IRQ0,  SC520_MPICMODE,  0x01 }, | ||||||
|  | 	{ SC520_IRQ1,  SC520_MPICMODE,  0x02 }, | ||||||
|  | 	{ SC520_IRQ2,  SC520_SL1PICMODE, 0x02 }, | ||||||
|  | 	{ SC520_IRQ3,  SC520_MPICMODE,  0x08 }, | ||||||
|  | 	{ SC520_IRQ4,  SC520_MPICMODE,  0x10 }, | ||||||
|  | 	{ SC520_IRQ5,  SC520_MPICMODE,  0x20 }, | ||||||
|  | 	{ SC520_IRQ6,  SC520_MPICMODE,  0x40 }, | ||||||
|  | 	{ SC520_IRQ7,  SC520_MPICMODE,  0x80 }, | ||||||
|  | 
 | ||||||
|  | 	{ SC520_IRQ8,  SC520_SL1PICMODE, 0x01 }, | ||||||
|  | 	{ SC520_IRQ9,  SC520_SL1PICMODE, 0x02 }, | ||||||
|  | 	{ SC520_IRQ10, SC520_SL1PICMODE, 0x04 }, | ||||||
|  | 	{ SC520_IRQ11, SC520_SL1PICMODE, 0x08 }, | ||||||
|  | 	{ SC520_IRQ12, SC520_SL1PICMODE, 0x10 }, | ||||||
|  | 	{ SC520_IRQ13, SC520_SL1PICMODE, 0x20 }, | ||||||
|  | 	{ SC520_IRQ14, SC520_SL1PICMODE, 0x40 }, | ||||||
|  | 	{ SC520_IRQ15, SC520_SL1PICMODE, 0x80 } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* The interrupt used for PCI INTA-INTD  */ | ||||||
|  | int sc520_pci_ints[15] = { | ||||||
|  | 	-1, -1, -1, -1, -1, -1, -1, -1, | ||||||
|  | 		-1, -1, -1, -1, -1, -1, -1 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* utility function to configure a pci interrupt */ | ||||||
|  | int pci_sc520_set_irq(int pci_pin, int irq) | ||||||
|  | { | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | # if 1 | ||||||
|  | 	printf("set_irq(): map INT%c to IRQ%d\n", pci_pin + 'A', irq); | ||||||
|  | #endif | ||||||
|  | 	if (irq < 0 || irq > 15) { | ||||||
|  | 		return -1; /* illegal irq */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (pci_pin < 0 || pci_pin > 15) { | ||||||
|  | 		return -1; /* illegal pci int pin */ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* first disable any non-pci interrupt source that use
 | ||||||
|  | 	 * this level */ | ||||||
|  | 	for (i=SC520_GPTMR0MAP;i<=SC520_GP10IMAP;i++) { | ||||||
|  | 		if (i>=SC520_PCIINTAMAP&&i<=SC520_PCIINTDMAP) { | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		if (read_mmcr_byte(i) == sc520_irq[irq].priority) { | ||||||
|  | 			write_mmcr_byte(i, SC520_IRQ_DISABLED); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Set the trigger to level */ | ||||||
|  | 	write_mmcr_byte(sc520_irq[irq].level_reg, | ||||||
|  | 			read_mmcr_byte(sc520_irq[irq].level_reg) | sc520_irq[irq].level_bit); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	if (pci_pin < 4) { | ||||||
|  | 		/* PCI INTA-INTD */ | ||||||
|  | 		/* route the interrupt */ | ||||||
|  | 		write_mmcr_byte(SC520_PCIINTAMAP + pci_pin, sc520_irq[irq].priority); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	} else { | ||||||
|  | 		/* GPIRQ0-GPIRQ10 used for additional PCI INTS */ | ||||||
|  | 		write_mmcr_byte(SC520_GP0IMAP + pci_pin - 4, sc520_irq[irq].priority); | ||||||
|  | 
 | ||||||
|  | 		/* also set the polarity in this case */ | ||||||
|  | 		write_mmcr_word(SC520_INTPINPOL, | ||||||
|  | 				read_mmcr_word(SC520_INTPINPOL) | (1 << (pci_pin-4))); | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* register the pin */ | ||||||
|  | 	sc520_pci_ints[pci_pin] = irq; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	return 0; /* OK */ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void pci_sc520_init(struct pci_controller *hose) | ||||||
|  | { | ||||||
|  | 	hose->first_busno = 0; | ||||||
|  | 	hose->last_busno = 0xff; | ||||||
|  | 
 | ||||||
|  | 	/* System memory space */ | ||||||
|  | 	pci_set_region(hose->regions + 0, | ||||||
|  | 		       SC520_PCI_MEMORY_BUS, | ||||||
|  | 		       SC520_PCI_MEMORY_PHYS, | ||||||
|  | 		       SC520_PCI_MEMORY_SIZE, | ||||||
|  | 		       PCI_REGION_MEM | PCI_REGION_MEMORY); | ||||||
|  | 
 | ||||||
|  | 	/* PCI memory space */ | ||||||
|  | 	pci_set_region(hose->regions + 1, | ||||||
|  | 		       SC520_PCI_MEM_BUS, | ||||||
|  | 		       SC520_PCI_MEM_PHYS, | ||||||
|  | 		       SC520_PCI_MEM_SIZE, | ||||||
|  | 		       PCI_REGION_MEM); | ||||||
|  | 
 | ||||||
|  | 	/* ISA/PCI memory space */ | ||||||
|  | 	pci_set_region(hose->regions + 2, | ||||||
|  | 		       SC520_ISA_MEM_BUS, | ||||||
|  | 		       SC520_ISA_MEM_PHYS, | ||||||
|  | 		       SC520_ISA_MEM_SIZE, | ||||||
|  | 		       PCI_REGION_MEM); | ||||||
|  | 
 | ||||||
|  | 	/* PCI I/O space */ | ||||||
|  | 	pci_set_region(hose->regions + 3, | ||||||
|  | 		       SC520_PCI_IO_BUS, | ||||||
|  | 		       SC520_PCI_IO_PHYS, | ||||||
|  | 		       SC520_PCI_IO_SIZE, | ||||||
|  | 		       PCI_REGION_IO); | ||||||
|  | 
 | ||||||
|  | 	/* ISA/PCI I/O space */ | ||||||
|  | 	pci_set_region(hose->regions + 4, | ||||||
|  | 		       SC520_ISA_IO_BUS, | ||||||
|  | 		       SC520_ISA_IO_PHYS, | ||||||
|  | 		       SC520_ISA_IO_SIZE, | ||||||
|  | 		       PCI_REGION_IO); | ||||||
|  | 
 | ||||||
|  | 	hose->region_count = 5; | ||||||
|  | 
 | ||||||
|  | 	pci_setup_type1(hose, | ||||||
|  | 			SC520_REG_ADDR, | ||||||
|  | 			SC520_REG_DATA); | ||||||
|  | 
 | ||||||
|  | 	pci_register_hose(hose); | ||||||
|  | 
 | ||||||
|  | 	hose->last_busno = pci_hose_scan(hose); | ||||||
|  | 
 | ||||||
|  | 	/* enable target memory acceses on host brige */ | ||||||
|  | 	pci_write_config_word(0, PCI_COMMAND, | ||||||
|  | 			      PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,92 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2002 | ||||||
|  |  * Daniel Engström, Omicron Ceti AB <daniel@omicron.se>. | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* stuff specific for the sc520, but independent of implementation */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <asm/ic/ssi.h> | ||||||
|  | #include <asm/ic/sc520.h> | ||||||
|  | 
 | ||||||
|  | int ssi_set_interface(int freq, int lsb_first, int inv_clock, int inv_phase) | ||||||
|  | { | ||||||
|  | 	u8 temp=0; | ||||||
|  | 
 | ||||||
|  | 	if (freq >= 8192) { | ||||||
|  | 		temp |= CTL_CLK_SEL_4; | ||||||
|  | 	} else if (freq >= 4096) { | ||||||
|  | 		temp |= CTL_CLK_SEL_8; | ||||||
|  | 	} else if (freq >= 2048) { | ||||||
|  | 		temp |= CTL_CLK_SEL_16; | ||||||
|  | 	} else if (freq >= 1024) { | ||||||
|  | 		temp |= CTL_CLK_SEL_32; | ||||||
|  | 	} else if (freq >= 512) { | ||||||
|  | 		temp |= CTL_CLK_SEL_64; | ||||||
|  | 	} else if (freq >= 256) { | ||||||
|  | 		temp |= CTL_CLK_SEL_128; | ||||||
|  | 	} else if (freq >= 128) { | ||||||
|  | 		temp |= CTL_CLK_SEL_256; | ||||||
|  | 	} else { | ||||||
|  | 		temp |= CTL_CLK_SEL_512; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!lsb_first) { | ||||||
|  | 		temp |= MSBF_ENB; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (inv_clock) { | ||||||
|  | 		temp |= CLK_INV_ENB; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (inv_phase) { | ||||||
|  | 		temp |= PHS_INV_ENB; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	write_mmcr_byte(SC520_SSICTL, temp); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | u8 ssi_txrx_byte(u8 data) | ||||||
|  | { | ||||||
|  | 	write_mmcr_byte(SC520_SSIXMIT, data); | ||||||
|  | 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); | ||||||
|  | 	write_mmcr_byte(SC520_SSICMD, SSICMD_CMD_SEL_XMITRCV); | ||||||
|  | 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); | ||||||
|  | 	return read_mmcr_byte(SC520_SSIRCV); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void ssi_tx_byte(u8 data) | ||||||
|  | { | ||||||
|  | 	write_mmcr_byte(SC520_SSIXMIT, data); | ||||||
|  | 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); | ||||||
|  | 	write_mmcr_byte(SC520_SSICMD, SSICMD_CMD_SEL_XMIT); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | u8 ssi_rx_byte(void) | ||||||
|  | { | ||||||
|  | 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); | ||||||
|  | 	write_mmcr_byte(SC520_SSICMD, SSICMD_CMD_SEL_RCV); | ||||||
|  | 	while ((read_mmcr_byte(SC520_SSISTA)) & SSISTA_BSY); | ||||||
|  | 	return read_mmcr_byte(SC520_SSIRCV); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,73 @@ | ||||||
|  | /*
 | ||||||
|  |  * (C) Copyright 2002 | ||||||
|  |  * Daniel Engström, Omicron Ceti AB <daniel@omicron.se>. | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* stuff specific for the sc520, but independent of implementation */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <asm/interrupt.h> | ||||||
|  | #include <asm/ic/sc520.h> | ||||||
|  | 
 | ||||||
|  | void reset_timer(void) | ||||||
|  | { | ||||||
|  | 	write_mmcr_word(SC520_GPTMR0CNT, 0); | ||||||
|  | 	write_mmcr_word(SC520_GPTMR0CTL, 0x6001); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ulong get_timer(ulong base) | ||||||
|  | { | ||||||
|  | 	/* fixme: 30 or 33 */ | ||||||
|  | 	return	read_mmcr_word(SC520_GPTMR0CNT) / 33; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void set_timer(ulong t) | ||||||
|  | { | ||||||
|  | 	/* FixMe: use two cascade coupled timers */ | ||||||
|  | 	write_mmcr_word(SC520_GPTMR0CTL, 0x4001); | ||||||
|  | 	write_mmcr_word(SC520_GPTMR0CNT, t*33); | ||||||
|  | 	write_mmcr_word(SC520_GPTMR0CTL, 0x6001); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void udelay(unsigned long usec) | ||||||
|  | { | ||||||
|  | 	int m=0; | ||||||
|  | 	long u; | ||||||
|  | 
 | ||||||
|  | 	read_mmcr_word(SC520_SWTMRMILLI); | ||||||
|  | 	read_mmcr_word(SC520_SWTMRMICRO); | ||||||
|  | 
 | ||||||
|  | #if 0 | ||||||
|  | 	/* do not enable this line, udelay is used in the serial driver -> recursion */ | ||||||
|  | 	printf("udelay: %ld m.u %d.%d  tm.tu %d.%d\n", usec, m, u, tm, tu); | ||||||
|  | #endif | ||||||
|  | 	while (1) { | ||||||
|  | 
 | ||||||
|  | 		m += read_mmcr_word(SC520_SWTMRMILLI); | ||||||
|  | 		u = read_mmcr_word(SC520_SWTMRMICRO) + (m * 1000); | ||||||
|  | 
 | ||||||
|  | 		if (usec <= u) { | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue