From: Paul Butler <paul.but...@windriver.com>

- Added the RapidIO management options
- Added the rio device to the axm55xx
- Created the rio architecture support for arm
- Added a file to support the RAPIDIO Bus registration

Signed-off-by: Paul Butler <paul.but...@windriver.com>
---
 arch/arm/Kconfig                 |   18 +++++++++
 arch/arm/boot/dts/axm55xx.dts    |   16 ++++++++
 arch/arm/include/asm/axxia-rio.h |   82 ++++++++++++++++++++++++++++++++++++++
 arch/arm/include/asm/rio.h       |   33 +++++++++++++++
 arch/arm/mach-axxia/Makefile     |    1 +
 arch/arm/mach-axxia/clock.c      |    5 +++
 arch/arm/mach-axxia/rapidio.c    |   44 ++++++++++++++++++++
 7 files changed, 199 insertions(+)
 create mode 100644 arch/arm/include/asm/axxia-rio.h
 create mode 100644 arch/arm/include/asm/rio.h
 create mode 100644 arch/arm/mach-axxia/rapidio.c

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index c796752..e7f2815 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -345,6 +345,7 @@ config ARCH_AXXIA
        select PCI
        select PCI_DOMAINS if PCI
        select ARCH_SUPPORTS_MSI if PCI
+        select HAS_RAPIDIO if (!PREEMPT_RTB)
        help
          This enables support for the LSI Axxia boards.
 
@@ -2359,3 +2360,20 @@ source "security/Kconfig"
 source "crypto/Kconfig"
 
 source "lib/Kconfig"
+
+menu "RapidIO management options"
+
+config HAS_RAPIDIO
+       bool
+       default n
+
+config RAPIDIO
+       bool "RapidIO support"
+       depends on HAS_RAPIDIO || PCI
+       help
+         If you say Y here, the kernel will include drivers and
+         infrastructure code to support RapidIO interconnect devices.
+
+source "drivers/rapidio/Kconfig"
+
+endmenu
diff --git a/arch/arm/boot/dts/axm55xx.dts b/arch/arm/boot/dts/axm55xx.dts
index aac791d..7ecb177 100644
--- a/arch/arm/boot/dts/axm55xx.dts
+++ b/arch/arm/boot/dts/axm55xx.dts
@@ -35,6 +35,7 @@
                serial0   = &axxia_serial0;
                timer     = &axxia_timers;
                ethernet0 = &axxia_femac0;
+               rapidio0  = &rio0;
        };
 
        cpus {
@@ -423,6 +424,21 @@
                reg = <0x20 0x10098000 0 0x3000>;
                interrupts = <0 45 4>;
        };
+
+        rio0: rapidio {
+                index = <0>;
+                status = "disabled";
+                #address-cells = <2>;
+                #size-cells = <2>;
+                compatible = "axxia,rapidio-delta";
+                device_type = "rapidio";
+                reg = <0x0020 0x20142000 0x0 0x1000>; /* SRIO Conf 0 region */
+                ranges = <0x0 0x0 0x0031 0x00000000 0x0 0x40000000>;
+                linkdown-reset = <0x0200 0x100 0x0020 0x10000000 0x0 
0x000010000>;
+                interrupts = <0 89 4>;
+                outb-dmes = <2 0x00000003 1 0x00000000>;
+        };
+
 };
 
 /*
diff --git a/arch/arm/include/asm/axxia-rio.h b/arch/arm/include/asm/axxia-rio.h
new file mode 100644
index 0000000..f244c85
--- /dev/null
+++ b/arch/arm/include/asm/axxia-rio.h
@@ -0,0 +1,82 @@
+/*
+ * RapidIO support for LSI Axxia parts
+ *
+ */
+#ifndef __ASM_AXXIA_RIO_H__
+#define __ASM_AXXIA_RIO_H__
+
+/* Constants, Macros, etc. */
+
+#define AXXIA_RIO_SMALL_SYSTEM
+
+#define AXXIA_RIO_SYSMEM_BARRIER()
+
+#define AXXIA_RIO_DISABLE_MACHINE_CHECK()
+#define AXXIA_RIO_ENABLE_MACHINE_CHECK()
+#define AXXIA_RIO_IF_MACHINE_CHECK(mcsr)       (mcsr = 0)
+
+#define IN_SRIO8(a, v, ec)     {v = inb((long unsigned int)a); ec = 0;}
+#define IN_SRIO16(a, v, ec)    {v = inw((long unsigned int)a); ec = 0;}
+#define IN_SRIO32(a, v, ec)    {v = inl((long unsigned int)a); ec = 0;}
+
+#define OUT_SRIO8(a, v)                outb_p(v, (long unsigned int) a)
+#define OUT_SRIO16(a, v)       outw_p(v, (long unsigned int) a)
+#define OUT_SRIO32(a, v)       outl_p(v, (long unsigned int) a)
+
+#define _SWAP32(x)     ((((x) & 0x000000FF) << 24) | (((x) & 0x0000FF00) <<  
8) | (((x) & 0x00FF0000) >> 8) | (((x) & 0xFF000000) >> 24))
+#define CORRECT_GRIO(a)                _SWAP32(a)
+#define CORRECT_RAB(a)         (a)
+
+/* ACP RIO board-specific stuff */
+
+extern int axxia_rio_apio_enable(struct rio_mport *mport, u32 mask, u32 bits);
+extern int axxia_rio_apio_disable(struct rio_mport *mport);
+extern int axxia_rio_rpio_enable(struct rio_mport *mport, u32 mask, u32 bits);
+extern int axxia_rio_rpio_disable(struct rio_mport *mport);
+
+extern int axxia_rapidio_board_init(void);
+
+
+/*****************************/
+/* ACP RIO operational stuff */
+/*****************************/
+
+/**
+ * CNTLZW - Count leading zeros word
+ * @val: value from which count number of leading zeros
+ *
+ * Return: number of zeros
+ */
+static inline u32 CNTLZW(u32 val)
+{
+       int n = 0;
+       if (val == 0)
+               return 32;
+       if ((val & 0xFFFF0000) == 0)
+               n += 16; val = val << 16;
+               /* 1111 1111 1111 1111 0000 0000 0000 0000
+               // 16 bits from left are zero! so we omit 16 left bits */
+       if ((val & 0xFF000000) == 0)
+               n = n + 8; val = val << 8;
+               /* 8 left bits are 0 */
+       if ((val & 0xF0000000) == 0)
+               n = n + 4; val = val << 4;
+               /* 4 left bits are 0 */
+       if ((val & 0xC0000000) == 0)
+               n = n + 2, val = val << 2;
+               /* 110000....0 2 left bits are zero */
+       if ((val & 0x80000000) == 0)
+               n = n + 1, val = val << 1;
+               /* first left bit is zero */
+       return n;
+}
+
+static inline unsigned long get_tb(void)
+{
+       unsigned int value;
+       /* Read CCNT Register (cyclecount) */
+       asm volatile ("MRC p15, 0, %0, c9, c13, 0\t\n" : "=r"(value));
+       return value;
+}
+
+#endif /* __ASM_AXXIA_RIO_H__ */
diff --git a/arch/arm/include/asm/rio.h b/arch/arm/include/asm/rio.h
new file mode 100644
index 0000000..10da207
--- /dev/null
+++ b/arch/arm/include/asm/rio.h
@@ -0,0 +1,33 @@
+/*
+ * RapidIO architecture support
+ *
+ * Copyright 2005 MontaVista Software, Inc.
+ * Matt Porter <mpor...@kernel.crashing.org>
+ *
+ * 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.
+ */
+
+#ifndef ASM_ARM_RIO_H
+#define ASM_ARM_RIO_H
+
+#include <asm/io.h>
+
+extern void platform_rio_init(void);
+
+#if defined(CONFIG_AXXIA_RIO)
+
+#define rio_in_8(src, dst)      ({ insb((long unsigned int)src, dst, 8); 0; })
+#define rio_in_be16(src, dst)   ({ insw((long unsigned int)src, dst, 16); 0; })
+#define rio_in_be32(src, dst)   ({ insl((long unsigned int)src, dst, 32); 0; })
+
+#define out_8(dst, val)         outb_p(val, (long unsigned int)(dst))
+#define out_be16(dst, val)      outw_p(val, (long unsigned int)(dst))
+
+#endif
+
+#define iosync()
+
+#endif
diff --git a/arch/arm/mach-axxia/Makefile b/arch/arm/mach-axxia/Makefile
index 0459a1f..2e9ddf7 100644
--- a/arch/arm/mach-axxia/Makefile
+++ b/arch/arm/mach-axxia/Makefile
@@ -9,6 +9,7 @@ obj-y                                   += timers.o
 obj-y                                  += pci.o
 obj-y                                  += ddr_retention.o
 obj-$(CONFIG_I2C)                      += i2c.o
+obj-$(CONFIG_AXXIA_RIO)                        += rapidio.o
 obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
 obj-$(CONFIG_ARCH_AXXIA_GIC)           += axxia-gic.o
 obj-$(CONFIG_HOTPLUG_CPU)              += hotplug.o
diff --git a/arch/arm/mach-axxia/clock.c b/arch/arm/mach-axxia/clock.c
index 49ca80b..4232277 100644
--- a/arch/arm/mach-axxia/clock.c
+++ b/arch/arm/mach-axxia/clock.c
@@ -64,6 +64,11 @@ axxia_init_clocks(void)
        clk_register_clkdev(clk, NULL, "2010082000.uart");
        /* PL011 UART3 */
        clk_register_clkdev(clk, NULL, "2010083000.uart");
+       /* I2C */
+       clk_register_clkdev(clk, NULL, "2010084000.i2c");
+       clk_register_clkdev(clk, NULL, "2010085000.i2c");
+       clk_register_clkdev(clk, NULL, "2010086000.i2c");
+       clk_register_clkdev(clk, NULL, "2010087000.i2c");
        /* PL022 SSP */
        clk_register_clkdev(clk, NULL, "ssp");
 
diff --git a/arch/arm/mach-axxia/rapidio.c b/arch/arm/mach-axxia/rapidio.c
new file mode 100644
index 0000000..a9da46b
--- /dev/null
+++ b/arch/arm/mach-axxia/rapidio.c
@@ -0,0 +1,44 @@
+/*
+ * linux/arch/arm/mach-axxia/rapidio.c
+ *
+ * Helper module for board specific RAPIDIO bus registration
+ *
+ * Copyright (C) 2013 LSI Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+
+
+/**
+ * axxia_rapidio_board_init -
+ *   Perform board-specific initialization to support use of RapidIO busses
+ *
+ * Returns 0 on success or an error code.
+ */
+int
+axxia_rapidio_board_init(void)
+{
+       return 0;
+}
-- 
1.7.9.5

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to