| 
					
				 | 
			
			
				@@ -162,3 +162,134 @@ static struct platform_device dns323_nor_flash = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		.platform_data	= &dns323_nor_flash_data, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	.resource	= &dns323_nor_flash_resource, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.num_resources	= 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/**************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Ethernet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct mv643xx_eth_platform_data dns323_eth_data = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.phy_addr = MV643XX_ETH_PHY_ADDR(8), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* dns323_parse_hex_*() taken from tsx09-common.c; should a common copy of these 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * functions be kept somewhere? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int __init dns323_parse_hex_nibble(char n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (n >= '0' && n <= '9') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return n - '0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (n >= 'A' && n <= 'F') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return n - 'A' + 10; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (n >= 'a' && n <= 'f') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return n - 'a' + 10; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int __init dns323_parse_hex_byte(const char *b) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int hi; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int lo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hi = dns323_parse_hex_nibble(b[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lo = dns323_parse_hex_nibble(b[1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (hi < 0 || lo < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return (hi << 4) | lo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int __init dns323_read_mac_addr(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	u_int8_t addr[6]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char *mac_page; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* MAC address is stored as a regular ol' string in /dev/mtdblock4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * (0x007d0000-0x00800000) starting at offset 196480 (0x2ff80). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	mac_page = ioremap(DNS323_NOR_BOOT_BASE + 0x7d0000 + 196480, 1024); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!mac_page) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return -ENOMEM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* Sanity check the string we're looking at */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for (i = 0; i < 5; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (*(mac_page + (i * 3) + 2) != ':') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			goto error_fail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for (i = 0; i < 6; i++)	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int byte; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		byte = dns323_parse_hex_byte(mac_page + (i * 3)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (byte < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			goto error_fail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		addr[i] = byte; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	iounmap(mac_page); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	printk("DNS-323: Found ethernet MAC address: "); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for (i = 0; i < 6; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	memcpy(dns323_eth_data.mac_addr, addr, 6); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+error_fail: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	iounmap(mac_page); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return -EINVAL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/**************************************************************************** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * GPIO LEDs (simple - doesn't use hardware blinking support) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct gpio_led dns323ab_leds[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.name = "power:blue", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio = DNS323_GPIO_LED_POWER2, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.default_trigger = "default-on", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.name = "right:amber", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio = DNS323_GPIO_LED_RIGHT_AMBER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.active_low = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.name = "left:amber", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio = DNS323_GPIO_LED_LEFT_AMBER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.active_low = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct gpio_led dns323c_leds[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.name = "power:blue", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio = DNS323C_GPIO_LED_POWER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.default_trigger = "timer", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.active_low = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.name = "right:amber", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio = DNS323C_GPIO_LED_RIGHT_AMBER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.active_low = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.name = "left:amber", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.gpio = DNS323C_GPIO_LED_LEFT_AMBER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		.active_low = 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct gpio_led_platform_data dns323ab_led_data = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.num_leds	= ARRAY_SIZE(dns323ab_leds), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.leds		= dns323ab_leds, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	.gpio_blink_set = orion_gpio_led_blink_set, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 |