|
@@ -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,
|
|
|
+};
|