|
@@ -239,3 +239,106 @@ struct sys_timer orion5x_timer = {
|
|
void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name)
|
|
void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name)
|
|
{
|
|
{
|
|
orion5x_pcie_id(dev, rev);
|
|
orion5x_pcie_id(dev, rev);
|
|
|
|
+
|
|
|
|
+ if (*dev == MV88F5281_DEV_ID) {
|
|
|
|
+ if (*rev == MV88F5281_REV_D2) {
|
|
|
|
+ *dev_name = "MV88F5281-D2";
|
|
|
|
+ } else if (*rev == MV88F5281_REV_D1) {
|
|
|
|
+ *dev_name = "MV88F5281-D1";
|
|
|
|
+ } else if (*rev == MV88F5281_REV_D0) {
|
|
|
|
+ *dev_name = "MV88F5281-D0";
|
|
|
|
+ } else {
|
|
|
|
+ *dev_name = "MV88F5281-Rev-Unsupported";
|
|
|
|
+ }
|
|
|
|
+ } else if (*dev == MV88F5182_DEV_ID) {
|
|
|
|
+ if (*rev == MV88F5182_REV_A2) {
|
|
|
|
+ *dev_name = "MV88F5182-A2";
|
|
|
|
+ } else {
|
|
|
|
+ *dev_name = "MV88F5182-Rev-Unsupported";
|
|
|
|
+ }
|
|
|
|
+ } else if (*dev == MV88F5181_DEV_ID) {
|
|
|
|
+ if (*rev == MV88F5181_REV_B1) {
|
|
|
|
+ *dev_name = "MV88F5181-Rev-B1";
|
|
|
|
+ } else if (*rev == MV88F5181L_REV_A1) {
|
|
|
|
+ *dev_name = "MV88F5181L-Rev-A1";
|
|
|
|
+ } else {
|
|
|
|
+ *dev_name = "MV88F5181(L)-Rev-Unsupported";
|
|
|
|
+ }
|
|
|
|
+ } else if (*dev == MV88F6183_DEV_ID) {
|
|
|
|
+ if (*rev == MV88F6183_REV_B0) {
|
|
|
|
+ *dev_name = "MV88F6183-Rev-B0";
|
|
|
|
+ } else {
|
|
|
|
+ *dev_name = "MV88F6183-Rev-Unsupported";
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ *dev_name = "Device-Unknown";
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void __init orion5x_init(void)
|
|
|
|
+{
|
|
|
|
+ char *dev_name;
|
|
|
|
+ u32 dev, rev;
|
|
|
|
+
|
|
|
|
+ orion5x_id(&dev, &rev, &dev_name);
|
|
|
|
+ printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, orion5x_tclk);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Setup Orion address map
|
|
|
|
+ */
|
|
|
|
+ orion5x_setup_cpu_mbus_bridge();
|
|
|
|
+
|
|
|
|
+ /* Setup root of clk tree */
|
|
|
|
+ clk_init();
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Don't issue "Wait for Interrupt" instruction if we are
|
|
|
|
+ * running on D0 5281 silicon.
|
|
|
|
+ */
|
|
|
|
+ if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) {
|
|
|
|
+ printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n");
|
|
|
|
+ disable_hlt();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * The 5082/5181l/5182/6082/6082l/6183 have crypto
|
|
|
|
+ * while 5180n/5181/5281 don't have crypto.
|
|
|
|
+ */
|
|
|
|
+ if ((dev == MV88F5181_DEV_ID && rev >= MV88F5181L_REV_A0) ||
|
|
|
|
+ dev == MV88F5182_DEV_ID || dev == MV88F6183_DEV_ID)
|
|
|
|
+ orion5x_crypto_init();
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Register watchdog driver
|
|
|
|
+ */
|
|
|
|
+ orion5x_wdt_init();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void orion5x_restart(char mode, const char *cmd)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * Enable and issue soft reset
|
|
|
|
+ */
|
|
|
|
+ orion5x_setbits(RSTOUTn_MASK, (1 << 2));
|
|
|
|
+ orion5x_setbits(CPU_SOFT_RESET, 1);
|
|
|
|
+ mdelay(200);
|
|
|
|
+ orion5x_clrbits(CPU_SOFT_RESET, 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Many orion-based systems have buggy bootloader implementations.
|
|
|
|
+ * This is a common fixup for bogus memory tags.
|
|
|
|
+ */
|
|
|
|
+void __init tag_fixup_mem32(struct tag *t, char **from,
|
|
|
|
+ struct meminfo *meminfo)
|
|
|
|
+{
|
|
|
|
+ for (; t->hdr.size; t = tag_next(t))
|
|
|
|
+ if (t->hdr.tag == ATAG_MEM &&
|
|
|
|
+ (!t->u.mem.size || t->u.mem.size & ~PAGE_MASK ||
|
|
|
|
+ t->u.mem.start & ~PAGE_MASK)) {
|
|
|
|
+ printk(KERN_WARNING
|
|
|
|
+ "Clearing invalid memory bank %dKB@0x%08x\n",
|
|
|
|
+ t->u.mem.size / 1024, t->u.mem.start);
|
|
|
|
+ t->hdr.tag = 0;
|
|
|
|
+ }
|
|
|
|
+}
|