[RFC PATCH] Very minimal bcm2708 support for linux-next
Stephen Warren
swarren at wwwdotorg.org
Tue May 29 23:45:35 EDT 2012
(RFC - not for commit yet)
---
First off, let me say that I think it's great people have started porting
the BCM2708 support to later kernels such as 3.4, cleaned it up, worked
on DT support, etc.
Personally, my /primary/ aim is to get as much BCM2708 support as possible
into mainline Linux, rather than working with even up-to-date downstream
kernels. This is mainly because I'm already involved in upstreaming another
ARM SoC, so am interested in upstream, but also because my RPi use-cases
don't need any of the graphics-related stuff that's likely to be a very
long pole in the upstreaming process. So, a mainline kernel could be usable
for me very soon.
Given all that, I decided to try to extract the minimum code from the rpi-
linear branch to get the system at least partially booting, and excluding
anything that I thought would need more discussion or rework during the
upstreaming process. The patch below is what I came up with. It boots
to the point where the timer is initialized, at least if you enable
earlyprintk. I stopped didn't add the timer stuff in yet, because I wanted
to resolve the comments I made on the timer DT binding before working on
that.
TO DO:
* Add correct git authorship, signed-off-by tags, etc. based on some more
git research.
* Remove mem and bootargs values once the bootloader is enhanced to fill
these in.
Changes relative to the rpi-linear branch:
* IO_ADDRESS() macro in hardware.h changed to push the virtual address of
the static mapping to the end of the vmalloc area, with the hope of
reducing vmalloc virtual address fragmentation. We should probably explore
drastically cutting down on the size of the statically mapped areas too,
or even completely eliminating them (except for the debug UART for
DEBUG_L) but that could come in a later patch.
What are people's thoughts on this? I'm not sure whether people are
intending to keeping working on downstream kernels that track the latest
upstream as much as possible, or were planning on starting this upstream
process themselves anyway or ...? If needed, I do have a kernel.org
account and am known to the ARM SoC maintainers, and hence volunteer to
maintain the RPi patch tree for linux-next if desired, taking patches from
whoever sends them, once they've passed review on the rpi mailing list.
arch/arm/Kconfig | 20 +++++
arch/arm/Makefile | 1 +
arch/arm/boot/dts/bcm2835-rpi-a.dts | 12 +++
arch/arm/boot/dts/bcm2835-rpi-b.dts | 12 +++
arch/arm/boot/dts/bcm2835.dtsi | 10 +++
arch/arm/configs/bcm2708_defconfig | 105 ++++++++++++++++++++++
arch/arm/mach-bcm2708/Kconfig | 11 +++
arch/arm/mach-bcm2708/Makefile | 1 +
arch/arm/mach-bcm2708/Makefile.boot | 5 ++
arch/arm/mach-bcm2708/bcm2708.c | 87 ++++++++++++++++++
arch/arm/mach-bcm2708/include/mach/debug-macro.S | 22 +++++
arch/arm/mach-bcm2708/include/mach/hardware.h | 32 +++++++
arch/arm/mach-bcm2708/include/mach/timex.h | 26 ++++++
arch/arm/mach-bcm2708/include/mach/uncompress.h | 57 ++++++++++++
14 files changed, 401 insertions(+)
create mode 100644 arch/arm/boot/dts/bcm2835-rpi-a.dts
create mode 100644 arch/arm/boot/dts/bcm2835-rpi-b.dts
create mode 100644 arch/arm/boot/dts/bcm2835.dtsi
create mode 100644 arch/arm/configs/bcm2708_defconfig
create mode 100644 arch/arm/mach-bcm2708/Kconfig
create mode 100644 arch/arm/mach-bcm2708/Makefile
create mode 100644 arch/arm/mach-bcm2708/Makefile.boot
create mode 100644 arch/arm/mach-bcm2708/bcm2708.c
create mode 100644 arch/arm/mach-bcm2708/include/mach/debug-macro.S
create mode 100644 arch/arm/mach-bcm2708/include/mach/hardware.h
create mode 100644 arch/arm/mach-bcm2708/include/mach/timex.h
create mode 100644 arch/arm/mach-bcm2708/include/mach/uncompress.h
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 70e0198..54344d1 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -329,6 +329,24 @@ config ARCH_AT91
This enables support for systems based on Atmel
AT91RM9200 and AT91SAM9* processors.
+config ARCH_BCM2708
+ bool "Broadcom BCM2708 family"
+ select CPU_V6
+ select ARM_AMBA
+ select COMMON_CLK
+ select CLKDEV_LOOKUP
+ select ARM_TIMER_SP804
+ select GENERIC_CLOCKEVENTS
+ select ARM_ERRATA_411920
+ select USE_OF
+ select SPARSE_IRQ
+ select MULTI_IRQ_HANDLER
+ select WATCHDOG
+ select ARCH_WANT_OPTIONAL_GPIOLIB
+ select MACH_BCM2708
+ help
+ This enables support for the Broadcom BCM2708 SoC series.
+
config ARCH_BCMRING
bool "Broadcom BCMRING"
depends on MMU
@@ -988,6 +1006,8 @@ endchoice
#
source "arch/arm/mach-at91/Kconfig"
+source "arch/arm/mach-bcm2708/Kconfig"
+
source "arch/arm/mach-bcmring/Kconfig"
source "arch/arm/mach-clps711x/Kconfig"
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 0298b00..9a6bb21 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -133,6 +133,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
# Machine directory name. This list is sorted alphanumerically
# by CONFIG_* macro name.
machine-$(CONFIG_ARCH_AT91) := at91
+machine-$(CONFIG_ARCH_BCM2708) := bcm2708
machine-$(CONFIG_ARCH_BCMRING) := bcmring
machine-$(CONFIG_ARCH_CLPS711X) := clps711x
machine-$(CONFIG_ARCH_CNS3XXX) := cns3xxx
diff --git a/arch/arm/boot/dts/bcm2835-rpi-a.dts b/arch/arm/boot/dts/bcm2835-rpi-a.dts
new file mode 100644
index 0000000..92bb956
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts
@@ -0,0 +1,12 @@
+/dts-v1/;
+/memreserve/ 0x0c000000 0x04000000;
+/include/ "bcm2835.dtsi"
+
+/ {
+ model = "Raspberry Pi Model A";
+ compatible = "raspberrypi,model-a", "broadcom,bcm2835", "broadcom,bcm2708";
+
+ memory {
+ reg = <0 0x10000000>;
+ };
+};
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts
new file mode 100644
index 0000000..7e43197
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
@@ -0,0 +1,12 @@
+/dts-v1/;
+/memreserve/ 0x0c000000 0x04000000;
+/include/ "bcm2835.dtsi"
+
+/ {
+ model = "Raspberry Pi Model B";
+ compatible = "raspberrypi,model-b", "broadcom,bcm2835", "broadcom,bcm2708";
+
+ memory {
+ reg = <0 0x10000000>;
+ };
+};
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi
new file mode 100644
index 0000000..221a49a
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2835.dtsi
@@ -0,0 +1,10 @@
+/include/ "skeleton.dtsi"
+
+/ {
+ compatible = "broadcom,bcm2835", "broadcom,bcm2708";
+ model = "BCM2835";
+
+ chosen {
+ bootargs = "earlyprintk"; /* Set by VideoCore */
+ };
+};
diff --git a/arch/arm/configs/bcm2708_defconfig b/arch/arm/configs/bcm2708_defconfig
new file mode 100644
index 0000000..8682815
--- /dev/null
+++ b/arch/arm/configs/bcm2708_defconfig
@@ -0,0 +1,105 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_FHANDLE=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_CGROUP_MEM_RES_CTLR=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_NAMESPACES=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_EMBEDDED=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_JUMP_LABEL=y
+# CONFIG_BLOCK is not set
+CONFIG_ARCH_BCM2708=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_COMPACTION=y
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_CLEANCACHE=y
+CONFIG_SECCOMP=y
+CONFIG_CC_STACKPROTECTOR=y
+CONFIG_KEXEC=y
+CONFIG_CRASH_DUMP=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_SUSPEND is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_STANDALONE is not set
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_SERIO is not set
+# CONFIG_VT is not set
+# CONFIG_UNIX98_PTYS is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=48
+CONFIG_SERIAL_8250_RUNTIME_UARTS=32
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_AMBA_PL010=y
+CONFIG_SERIAL_AMBA_PL010_CONSOLE=y
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_TTY_PRINTK=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_HWMON is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_IOMMU_SUPPORT is not set
+# CONFIG_FILE_LOCKING is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_INOTIFY_USER is not set
+# CONFIG_PROC_FS is not set
+# CONFIG_SYSFS is not set
+# CONFIG_MISC_FILESYSTEMS is not set
+# CONFIG_PROTECTED_LINKS is not set
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_UNUSED_SYMBOLS=y
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_BOOT_PRINTK_DELAY=y
+CONFIG_SCHED_TRACER=y
+CONFIG_STACK_TRACER=y
+CONFIG_FUNCTION_PROFILER=y
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_KGDB=y
+CONFIG_KGDB_KDB=y
+CONFIG_TEST_KSTRTOX=y
+CONFIG_STRICT_DEVMEM=y
+CONFIG_DEBUG_LL=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+# CONFIG_XZ_DEC_SPARC is not set
diff --git a/arch/arm/mach-bcm2708/Kconfig b/arch/arm/mach-bcm2708/Kconfig
new file mode 100644
index 0000000..72a21eb
--- /dev/null
+++ b/arch/arm/mach-bcm2708/Kconfig
@@ -0,0 +1,11 @@
+menu "Broadcom BCM2708 Implementations"
+ depends on ARCH_BCM2708
+
+config BCM2708_NOL2CACHE
+ bool "Videocore L2 cache disable"
+ depends on MACH_BCM2708
+ default n
+ help
+ Do not allow ARM to use GPU's L2 cache. Requires disable_l2cache in config.txt.
+
+endmenu
diff --git a/arch/arm/mach-bcm2708/Makefile b/arch/arm/mach-bcm2708/Makefile
new file mode 100644
index 0000000..1b1455c
--- /dev/null
+++ b/arch/arm/mach-bcm2708/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_BCM2708) += bcm2708.o
diff --git a/arch/arm/mach-bcm2708/Makefile.boot b/arch/arm/mach-bcm2708/Makefile.boot
new file mode 100644
index 0000000..0831fd1
--- /dev/null
+++ b/arch/arm/mach-bcm2708/Makefile.boot
@@ -0,0 +1,5 @@
+ zreladdr-y := 0x00008000
+params_phys-y := 0x00000100
+initrd_phys-y := 0x00800000
+
+dtb-y += bcm2835-rpi-b.dtb
diff --git a/arch/arm/mach-bcm2708/bcm2708.c b/arch/arm/mach-bcm2708/bcm2708.c
new file mode 100644
index 0000000..fa74ae7
--- /dev/null
+++ b/arch/arm/mach-bcm2708/bcm2708.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2010 Broadcom
+ *
+ * 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.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+#include <asm/system.h>
+#include <asm/exception.h>
+#include <mach/hardware.h>
+#include <asm/hardware/timer-sp.h>
+#include <asm/setup.h>
+
+static struct map_desc bcm2708_io_desc[] __initdata = {
+ {
+ .virtual = IO_ADDRESS(BCM2708_PERIPH_BASE),
+ .pfn = __phys_to_pfn(BCM2708_PERIPH_BASE),
+ .length = BCM2708_PERIPH_SIZE,
+ .type = MT_DEVICE
+ },
+};
+
+void __init bcm2708_map_io(void)
+{
+ iotable_init(bcm2708_io_desc, ARRAY_SIZE(bcm2708_io_desc));
+}
+
+void __init bcm2708_init_irq(void)
+{
+}
+
+asmlinkage void __exception_irq_entry bcm2708_handle_irq(struct pt_regs *regs)
+{
+}
+
+void __init bcm2708_init(void)
+{
+ int ret;
+
+ ret = of_platform_populate(NULL, of_default_bus_match_table, NULL,
+ NULL);
+ if (ret) {
+ pr_err("of_platform_populate failed: %d\n", ret);
+ BUG();
+ }
+}
+
+static void __init bcm2708_timer_init(void)
+{
+}
+
+struct sys_timer bcm2708_timer = {
+ .init = bcm2708_timer_init
+};
+
+static const char * const bcm2708_compat[] = {
+ "broadcom,bcm2708",
+ NULL
+};
+
+DT_MACHINE_START(BCM2708, "BCM2708")
+ .map_io = bcm2708_map_io,
+ .init_irq = bcm2708_init_irq,
+ .handle_irq = bcm2708_handle_irq,
+ .init_machine = bcm2708_init,
+ .timer = &bcm2708_timer,
+ .dt_compat = bcm2708_compat
+MACHINE_END
diff --git a/arch/arm/mach-bcm2708/include/mach/debug-macro.S b/arch/arm/mach-bcm2708/include/mach/debug-macro.S
new file mode 100644
index 0000000..2dcd1d5
--- /dev/null
+++ b/arch/arm/mach-bcm2708/include/mach/debug-macro.S
@@ -0,0 +1,22 @@
+/* arch/arm/mach-bcm2708/include/mach/debug-macro.S
+ *
+ * Debugging macro include header
+ *
+ * Copyright (C) 2010 Broadcom
+ * Copyright (C) 1994-1999 Russell King
+ * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
+ *
+ * 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.
+ *
+*/
+
+#include <mach/hardware.h>
+
+ .macro addruart, rp, rv, tmp
+ ldr \rp, =BCM2708_DEBUG_BASE
+ ldr \rv, =IO_ADDRESS(BCM2708_DEBUG_BASE)
+ .endm
+
+#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-bcm2708/include/mach/hardware.h b/arch/arm/mach-bcm2708/include/mach/hardware.h
new file mode 100644
index 0000000..1c7d57e
--- /dev/null
+++ b/arch/arm/mach-bcm2708/include/mach/hardware.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2010 Broadcom
+ *
+ * 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.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+#include <asm/sizes.h>
+
+#define BCM2708_PERIPH_BASE 0x20000000
+#define BCM2708_PERIPH_SIZE SZ_16M
+#define BCM2708_DEBUG_BASE 0x20201000
+#define BCM2708_DEBUG_CLOCK 3000000
+
+/* macros to get at IO space when running virtually */
+#define IO_ADDRESS(x) (((x) - BCM2708_PERIPH_BASE) - \
+ BCM2708_PERIPH_SIZE + 0xff000000)
+
+#endif
diff --git a/arch/arm/mach-bcm2708/include/mach/timex.h b/arch/arm/mach-bcm2708/include/mach/timex.h
new file mode 100644
index 0000000..ca67219
--- /dev/null
+++ b/arch/arm/mach-bcm2708/include/mach/timex.h
@@ -0,0 +1,26 @@
+/*
+ * BCM2708 system clock frequency
+ *
+ * Copyright (C) 2010 Broadcom
+ *
+ * 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.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __ASM_ARCH_TIMEX_H
+#define __ASM_ARCH_TIMEX_H
+
+#define CLOCK_TICK_RATE (1000000)
+
+#endif
diff --git a/arch/arm/mach-bcm2708/include/mach/uncompress.h b/arch/arm/mach-bcm2708/include/mach/uncompress.h
new file mode 100644
index 0000000..0d56a21
--- /dev/null
+++ b/arch/arm/mach-bcm2708/include/mach/uncompress.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2010 Broadcom
+ * Copyright (C) 2003 ARM Limited
+ *
+ * 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.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <linux/io.h>
+#include <linux/amba/serial.h>
+#include <mach/hardware.h>
+
+#define UART_BAUD 115200
+#define UART0_BASE BCM2708_DEBUG_BASE
+#define UART0_CLOCK BCM2708_DEBUG_CLOCK
+
+#define BCM2708_UART_DR (UART0_BASE + UART01x_DR)
+#define BCM2708_UART_FR (UART0_BASE + UART01x_FR)
+#define BCM2708_UART_CR (UART0_BASE + UART011_CR)
+
+/*
+ * This does not append a newline
+ */
+static inline void putc(int c)
+{
+ while (__raw_readl(BCM2708_UART_FR) & UART01x_FR_TXFF)
+ barrier();
+
+ __raw_writel(c, BCM2708_UART_DR);
+}
+
+static inline void flush(void)
+{
+ int fr;
+
+ do {
+ fr = __raw_readl(BCM2708_UART_FR);
+ barrier();
+ } while ((fr & (UART011_FR_TXFE | UART01x_FR_BUSY)) != UART011_FR_TXFE);
+}
+
+/*
+ * nothing to do
+ */
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
--
1.7.9.5
More information about the linux-rpi-kernel
mailing list