| /* | 
 |  * Helper functions for the SPI-3 bridge FPGA on the Radisys ENP2611 | 
 |  * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org> | 
 |  * Dedicated to Marija Kulikova. | 
 |  * | 
 |  * 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. | 
 |  */ | 
 |  | 
 | #include <linux/module.h> | 
 | #include <linux/delay.h> | 
 | #include <asm/io.h> | 
 | #include "caleb.h" | 
 |  | 
 | #define CALEB_IDLO		0x00 | 
 | #define CALEB_IDHI		0x01 | 
 | #define CALEB_RID		0x02 | 
 | #define CALEB_RESET		0x03 | 
 | #define CALEB_INTREN0		0x04 | 
 | #define CALEB_INTREN1		0x05 | 
 | #define CALEB_INTRSTAT0		0x06 | 
 | #define CALEB_INTRSTAT1		0x07 | 
 | #define CALEB_PORTEN		0x08 | 
 | #define CALEB_BURST		0x09 | 
 | #define CALEB_PORTPAUS		0x0A | 
 | #define CALEB_PORTPAUSD		0x0B | 
 | #define CALEB_PHY0RX		0x10 | 
 | #define CALEB_PHY1RX		0x11 | 
 | #define CALEB_PHY0TX		0x12 | 
 | #define CALEB_PHY1TX		0x13 | 
 | #define CALEB_IXPRX_HI_CNTR	0x15 | 
 | #define CALEB_PHY0RX_HI_CNTR	0x16 | 
 | #define CALEB_PHY1RX_HI_CNTR	0x17 | 
 | #define CALEB_IXPRX_CNTR	0x18 | 
 | #define CALEB_PHY0RX_CNTR	0x19 | 
 | #define CALEB_PHY1RX_CNTR	0x1A | 
 | #define CALEB_IXPTX_CNTR	0x1B | 
 | #define CALEB_PHY0TX_CNTR	0x1C | 
 | #define CALEB_PHY1TX_CNTR	0x1D | 
 | #define CALEB_DEBUG0		0x1E | 
 | #define CALEB_DEBUG1		0x1F | 
 |  | 
 |  | 
 | static u8 caleb_reg_read(int reg) | 
 | { | 
 | 	u8 value; | 
 |  | 
 | 	value = *((volatile u8 *)(ENP2611_CALEB_VIRT_BASE + reg)); | 
 |  | 
 | //	printk(KERN_INFO "caleb_reg_read(%d) = %.2x\n", reg, value); | 
 |  | 
 | 	return value; | 
 | } | 
 |  | 
 | static void caleb_reg_write(int reg, u8 value) | 
 | { | 
 | 	u8 dummy; | 
 |  | 
 | //	printk(KERN_INFO "caleb_reg_write(%d, %.2x)\n", reg, value); | 
 |  | 
 | 	*((volatile u8 *)(ENP2611_CALEB_VIRT_BASE + reg)) = value; | 
 |  | 
 | 	dummy = *((volatile u8 *)ENP2611_CALEB_VIRT_BASE); | 
 | 	__asm__ __volatile__("mov %0, %0" : "+r" (dummy)); | 
 | } | 
 |  | 
 |  | 
 | void caleb_reset(void) | 
 | { | 
 | 	/* | 
 | 	 * Perform a chip reset. | 
 | 	 */ | 
 | 	caleb_reg_write(CALEB_RESET, 0x02); | 
 | 	udelay(1); | 
 |  | 
 | 	/* | 
 | 	 * Enable all interrupt sources.  This is needed to get | 
 | 	 * meaningful results out of the status bits (register 6 | 
 | 	 * and 7.) | 
 | 	 */ | 
 | 	caleb_reg_write(CALEB_INTREN0, 0xff); | 
 | 	caleb_reg_write(CALEB_INTREN1, 0x07); | 
 |  | 
 | 	/* | 
 | 	 * Set RX and TX FIFO thresholds to 1.5kb. | 
 | 	 */ | 
 | 	caleb_reg_write(CALEB_PHY0RX, 0x11); | 
 | 	caleb_reg_write(CALEB_PHY1RX, 0x11); | 
 | 	caleb_reg_write(CALEB_PHY0TX, 0x11); | 
 | 	caleb_reg_write(CALEB_PHY1TX, 0x11); | 
 |  | 
 | 	/* | 
 | 	 * Program SPI-3 burst size. | 
 | 	 */ | 
 | 	caleb_reg_write(CALEB_BURST, 0);	// 64-byte RBUF mpackets | 
 | //	caleb_reg_write(CALEB_BURST, 1);	// 128-byte RBUF mpackets | 
 | //	caleb_reg_write(CALEB_BURST, 2);	// 256-byte RBUF mpackets | 
 | } | 
 |  | 
 | void caleb_enable_rx(int port) | 
 | { | 
 | 	u8 temp; | 
 |  | 
 | 	temp = caleb_reg_read(CALEB_PORTEN); | 
 | 	temp |= 1 << port; | 
 | 	caleb_reg_write(CALEB_PORTEN, temp); | 
 | } | 
 |  | 
 | void caleb_disable_rx(int port) | 
 | { | 
 | 	u8 temp; | 
 |  | 
 | 	temp = caleb_reg_read(CALEB_PORTEN); | 
 | 	temp &= ~(1 << port); | 
 | 	caleb_reg_write(CALEB_PORTEN, temp); | 
 | } | 
 |  | 
 | void caleb_enable_tx(int port) | 
 | { | 
 | 	u8 temp; | 
 |  | 
 | 	temp = caleb_reg_read(CALEB_PORTEN); | 
 | 	temp |= 1 << (port + 4); | 
 | 	caleb_reg_write(CALEB_PORTEN, temp); | 
 | } | 
 |  | 
 | void caleb_disable_tx(int port) | 
 | { | 
 | 	u8 temp; | 
 |  | 
 | 	temp = caleb_reg_read(CALEB_PORTEN); | 
 | 	temp &= ~(1 << (port + 4)); | 
 | 	caleb_reg_write(CALEB_PORTEN, temp); | 
 | } |