|
@@ -585,3 +585,136 @@ static int __init dns323_identify_rev(void)
|
|
|
|
|
|
static void __init dns323_init(void)
|
|
|
{
|
|
|
+ /* Setup basic Orion functions. Need to be called early. */
|
|
|
+ orion5x_init();
|
|
|
+
|
|
|
+ /* Identify revision */
|
|
|
+ system_rev = dns323_identify_rev();
|
|
|
+ pr_info("DNS-323: Identified HW revision %c1\n", 'A' + system_rev);
|
|
|
+
|
|
|
+ /* Just to be tricky, the 5182 has a completely different
|
|
|
+ * set of MPP modes to the 5181.
|
|
|
+ */
|
|
|
+ switch(system_rev) {
|
|
|
+ case DNS323_REV_A1:
|
|
|
+ orion5x_mpp_conf(dns323a_mpp_modes);
|
|
|
+ writel(0, MPP_DEV_CTRL); /* DEV_D[31:16] */
|
|
|
+ break;
|
|
|
+ case DNS323_REV_B1:
|
|
|
+ orion5x_mpp_conf(dns323b_mpp_modes);
|
|
|
+ break;
|
|
|
+ case DNS323_REV_C1:
|
|
|
+ orion5x_mpp_conf(dns323c_mpp_modes);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* setup flash mapping
|
|
|
+ * CS3 holds a 8 MB Spansion S29GL064M90TFIR4
|
|
|
+ */
|
|
|
+ orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE);
|
|
|
+ platform_device_register(&dns323_nor_flash);
|
|
|
+
|
|
|
+ /* Sort out LEDs, Buttons and i2c devices */
|
|
|
+ switch(system_rev) {
|
|
|
+ case DNS323_REV_A1:
|
|
|
+ /* The 5181 power LED is active low and requires
|
|
|
+ * DNS323_GPIO_LED_POWER1 to also be low.
|
|
|
+ */
|
|
|
+ dns323ab_leds[0].active_low = 1;
|
|
|
+ gpio_request(DNS323_GPIO_LED_POWER1, "Power Led Enable");
|
|
|
+ gpio_direction_output(DNS323_GPIO_LED_POWER1, 0);
|
|
|
+ /* Fall through */
|
|
|
+ case DNS323_REV_B1:
|
|
|
+ i2c_register_board_info(0, dns323ab_i2c_devices,
|
|
|
+ ARRAY_SIZE(dns323ab_i2c_devices));
|
|
|
+ break;
|
|
|
+ case DNS323_REV_C1:
|
|
|
+ /* Hookup LEDs & Buttons */
|
|
|
+ dns323_gpio_leds.dev.platform_data = &dns323c_led_data;
|
|
|
+ dns323_button_device.dev.platform_data = &dns323c_button_data;
|
|
|
+
|
|
|
+ /* Hookup i2c devices and fan driver */
|
|
|
+ i2c_register_board_info(0, dns323c_i2c_devices,
|
|
|
+ ARRAY_SIZE(dns323c_i2c_devices));
|
|
|
+ platform_device_register_simple("dns323c-fan", 0, NULL, 0);
|
|
|
+
|
|
|
+ /* Register fixup for the PHY LEDs */
|
|
|
+ phy_register_fixup_for_uid(MARVELL_PHY_ID_88E1118,
|
|
|
+ MARVELL_PHY_ID_MASK,
|
|
|
+ dns323c_phy_fixup);
|
|
|
+ }
|
|
|
+
|
|
|
+ platform_device_register(&dns323_gpio_leds);
|
|
|
+ platform_device_register(&dns323_button_device);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Configure peripherals.
|
|
|
+ */
|
|
|
+ if (dns323_read_mac_addr() < 0)
|
|
|
+ printk("DNS-323: Failed to read MAC address\n");
|
|
|
+ orion5x_ehci0_init();
|
|
|
+ orion5x_eth_init(&dns323_eth_data);
|
|
|
+ orion5x_i2c_init();
|
|
|
+ orion5x_uart0_init();
|
|
|
+
|
|
|
+ /* Remaining GPIOs */
|
|
|
+ switch(system_rev) {
|
|
|
+ case DNS323_REV_A1:
|
|
|
+ /* Poweroff GPIO */
|
|
|
+ if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
|
|
|
+ gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
|
|
|
+ pr_err("DNS-323: failed to setup power-off GPIO\n");
|
|
|
+ pm_power_off = dns323a_power_off;
|
|
|
+ break;
|
|
|
+ case DNS323_REV_B1:
|
|
|
+ /* 5182 built-in SATA init */
|
|
|
+ orion5x_sata_init(&dns323_sata_data);
|
|
|
+
|
|
|
+ /* The DNS323 rev B1 has flag to indicate the system is up.
|
|
|
+ * Without this flag set, power LED will flash and cannot be
|
|
|
+ * controlled via leds-gpio.
|
|
|
+ */
|
|
|
+ if (gpio_request(DNS323_GPIO_SYSTEM_UP, "SYS_READY") == 0)
|
|
|
+ gpio_direction_output(DNS323_GPIO_SYSTEM_UP, 1);
|
|
|
+
|
|
|
+ /* Poweroff GPIO */
|
|
|
+ if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
|
|
|
+ gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
|
|
|
+ pr_err("DNS-323: failed to setup power-off GPIO\n");
|
|
|
+ pm_power_off = dns323b_power_off;
|
|
|
+ break;
|
|
|
+ case DNS323_REV_C1:
|
|
|
+ /* 5182 built-in SATA init */
|
|
|
+ orion5x_sata_init(&dns323_sata_data);
|
|
|
+
|
|
|
+ /* Poweroff GPIO */
|
|
|
+ if (gpio_request(DNS323C_GPIO_POWER_OFF, "POWEROFF") != 0 ||
|
|
|
+ gpio_direction_output(DNS323C_GPIO_POWER_OFF, 0) != 0)
|
|
|
+ pr_err("DNS-323: failed to setup power-off GPIO\n");
|
|
|
+ pm_power_off = dns323c_power_off;
|
|
|
+
|
|
|
+ /* Now, -this- should theorically be done by the sata_mv driver
|
|
|
+ * once I figure out what's going on there. Maybe the behaviour
|
|
|
+ * of the LEDs should be somewhat passed via the platform_data.
|
|
|
+ * for now, just whack the register and make the LEDs happy
|
|
|
+ *
|
|
|
+ * Note: AFAIK, rev B1 needs the same treatement but I'll let
|
|
|
+ * somebody else test it.
|
|
|
+ */
|
|
|
+ writel(0x5, ORION5X_SATA_VIRT_BASE + 0x2c);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* Warning: D-Link uses a wrong mach-type (=526) in their bootloader */
|
|
|
+MACHINE_START(DNS323, "D-Link DNS-323")
|
|
|
+ /* Maintainer: Herbert Valerio Riedel <hvr@gnu.org> */
|
|
|
+ .atag_offset = 0x100,
|
|
|
+ .init_machine = dns323_init,
|
|
|
+ .map_io = orion5x_map_io,
|
|
|
+ .init_early = orion5x_init_early,
|
|
|
+ .init_irq = orion5x_init_irq,
|
|
|
+ .timer = &orion5x_timer,
|
|
|
+ .fixup = tag_fixup_mem32,
|
|
|
+ .restart = orion5x_restart,
|
|
|
+MACHINE_END
|