ARM: add infra-structure for BCM2708/BCM2835 and Raspberry Pi
Subsystems (6)
PATCH v3 1/5 ARM: add infra-structure for BCM2708/BCM2835 and Raspberry Pi
From: Simon Arlott <[email protected]>
The BCM2708 is an ARM SoC from Broadcom. It is the primary SoC in a series which contains the BCM2835 amongst other variants. This patch adds very basic support for this series of SoCs, under the BCM2708 name.
http://www.broadcom.com/products/BCM2835
http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pd
Note that the documentation in the latter .pdf assumes the MMU setup that's used on the "VideoCore" companion processor, and does not document physical peripheral addresses. Subtract 0x5e000000 to obtain the physical addresses.
The BCM2835 SoC is used in the Raspberry Pi. This patch also adds a minimal device tree for this board; enough to see some very early kernel boot messages through earlyprintk. However, this patch does not yet provide a useful booting system.
This patch was extracted from git://github.com/lp0/linux.git branch rpi-split from 3-4 months ago, and significantly stripped down and modified since.
---
This version is enough to get to "Kernel panic - not syncing: No init found." I haven't tested yet, but I expect that using an initrd should work.
v3:
* Added DT binding documentation for the SoC itself.
* Changed patch subject from "support" to "infra-structure", and added to the commit description, to indicate that the patch isn't adding complete support for the SoC/board.
* Added all S-o-b tags from downstream, now that I have permission to fix them up to be valid.
* Changed patch author to Simon Arlott, now I have permission to change his email address to something valid.
* Limited my (c) additions to files I created; the other changes turnd out to be trivial.
v2:
* Rename *_BASE to *_PHYS to match Simon's rpi-split branch.
* Remove #define UART_BAUD since it isn't used.
* Don't select WATCHDOG from ARCH_BCM2708
* Remove 8250 and PL010 serial ports from bcm2708_defconfig
* Remove <mach/hardware.h>
* Rename common.c back to bcm2708.c; matches downstream and is preferred naming style.
--- Documentation/devicetree/bindings/arm/bcm2708.txt | 15 ++++ arch/arm/Kconfig | 18 ++++ arch/arm/Makefile | 1 + arch/arm/boot/dts/bcm2835-rpi-b.dts | 12 +++ arch/arm/boot/dts/bcm2835.dtsi | 10 +++ arch/arm/configs/bcm2708_defconfig | 93 +++++++++++++++++++++ arch/arm/mach-bcm2708/Makefile | 1 + arch/arm/mach-bcm2708/Makefile.boot | 5 ++ arch/arm/mach-bcm2708/bcm2708.c | 77 +++++++++++++++++ arch/arm/mach-bcm2708/include/mach/bcm2708_soc.h | 29 +++++++ arch/arm/mach-bcm2708/include/mach/debug-macro.S | 21 +++++ arch/arm/mach-bcm2708/include/mach/timex.h | 26 ++++++ arch/arm/mach-bcm2708/include/mach/uncompress.h | 45 ++++++++++ 13 files changed, 353 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/bcm2708.txt 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/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/bcm2708_soc.h create mode 100644 arch/arm/mach-bcm2708/include/mach/debug-macro.S create mode 100644 arch/arm/mach-bcm2708/include/mach/timex.h create mode 100644 arch/arm/mach-bcm2708/include/mach/uncompress.h
Documentation/devicetree/bindings/arm/bcm2708.txt new file +15 -0
@@ -0,0 +1,15 @@ +Broadcom BCM2708 device tree bindings +------------------------------------------- + +Boards with the BCM2708 SoC, or another SoC in the BCM2708 family, shall have +the following properties: + +Required root node property: + +compatible = "broadcom,bcm2708"; + +Boards with BCM2835 SoC shall *additionally* have the following properties: + +Required root node property: + +compatible = "broadcom,bcm2835";
arch/arm/Kconfig +18 -0
@@ -349,6 +349,24 @@ config ARCH_AT91 This enables support for systems based on Atmel AT91RM9200 and AT91SAM9* processors. +config ARCH_BCM2708 + bool "Broadcom BCM2708 family" + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_AMBA + select ARM_ERRATA_411920 + select ARM_TIMER_SP804 + select CLKDEV_LOOKUP + select COMMON_CLK + select CPU_V6 + select GENERIC_CLOCKEVENTS + select MULTI_IRQ_HANDLER + select SPARSE_IRQ + select USE_OF + help + This enables support for the Broadcom BCM2708 SoC series. The + BCM2835 is one such SoC in this series. The Raspberry Pi uses + the BCM2835. + config ARCH_BCMRING bool "Broadcom BCMRING" depends on MMU
arch/arm/Makefile +1 -0
@@ -136,6 +136,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
arch/arm/boot/dts/bcm2835-rpi-b.dts new file +12 -0
@@ -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>; + }; +};
arch/arm/boot/dts/bcm2835.dtsi new file +10 -0
@@ -0,0 +1,10 @@ +/include/ "skeleton.dtsi" + +/ { + compatible = "broadcom,bcm2835", "broadcom,bcm2708"; + model = "BCM2835"; + + chosen { + bootargs = "earlyprintk"; + }; +};
arch/arm/configs/bcm2708_defconfig new file +93 -0
93 lines not on this page · raw message
arch/arm/mach-bcm2708/Makefile new file +1 -0
@@ -0,0 +1 @@ +obj-y += bcm2708.o
arch/arm/mach-bcm2708/Makefile.boot new file +5 -0
@@ -0,0 +1,5 @@ + zreladdr-y := 0x00008000 +params_phys-y := 0x00000100 +initrd_phys-y := 0x00800000 + +dtb-y += bcm2835-rpi-b.dtb
arch/arm/mach-bcm2708/bcm2708.c new file +77 -0
77 lines not on this page · raw message
arch/arm/mach-bcm2708/include/mach/bcm2708_soc.h new file +29 -0
@@ -0,0 +1,29 @@ +/* +* Copyright (C) 2012 Stephen Warren +* +* Derived from code: +* 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. +*/ + +#ifndef __MACH_BCM2708_BCM2708_SOC_H__ +#define __MACH_BCM2708_BCM2708_SOC_H__ + +#include <asm/sizes.h> + +#define BCM2708_PERIPH_PHYS 0x20000000 +#define BCM2708_PERIPH_VIRT 0xf0000000 +#define BCM2708_PERIPH_SIZE SZ_16M +#define BCM2708_DEBUG_PHYS 0x20201000 +#define BCM2708_DEBUG_VIRT 0xf0201000 + +#endif
arch/arm/mach-bcm2708/include/mach/debug-macro.S new file +21 -0
@@ -0,0 +1,21 @@ +/* + * 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/bcm2708_soc.h> + + .macro addruart, rp, rv, tmp + ldr \rp, =BCM2708_DEBUG_PHYS + ldr \rv, =BCM2708_DEBUG_VIRT + .endm + +#include <asm/hardware/debug-pl01x.S>
arch/arm/mach-bcm2708/include/mach/timex.h new file +26 -0
@@ -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
arch/arm/mach-bcm2708/include/mach/uncompress.h new file +45 -0
45 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v3 2/5 ARM: bcm2708: add interrupt controller driver
From: Simon Arlott <[email protected]>
The BCM2708 contains a custom interrupt controller, which supports 72 interrupt sources using a 2-level register scheme. The interrupt controller, or the HW block containing it, is referred to occasionally as "armctrl" in the SoC documentation, hence the symbol naming in the code.
This patch was extracted from git://github.com/lp0/linux.git branch rpi-split as of 2012/09/08, and modified as follows:
* Added devicetree documentation, and hence removed list of IRQs from bcm2835.dtsi.
* Changed shift in MAKE_HWIRQ() and HWIRQ_BANK() from 8 to 5 to reduce the size of the hwirq space, and pass the total size of the hwirq space to irq_domain_add_linear(), rather than just the number of valid hwirqs; the two are different due to the hwirq space being sparse.
* Added the interrupt controller DT node to the top-level of the DT, rather than nesting it inside a /axi node. Hence, changed the reg value since /axi had a ranges property. This seems simpler to me, but I'm not sure if everyone will like this change or not.
* Don't set struct irq_domain_ops.map = irq_domain_simple_map, hence removing the need to patch include/linux/irqdomain.h or kernel/irq/irqdomain.c.
* Removed unused IS_VALID_BANK()/IS_VALID_IRQ() macros.
* Renamed armctrl_handle_irq() to prevent possible symbol clashes.
* Made armctrl_of_init() static.
* Removed comment "Each bank is registered as a separate interrupt controller" since this is no longer true.
* Removed FSF address from license header.
* Added my name to copyright header.
--
v3: New patch.
TODO: Should of_address_to_resource(), ioremap(), request_mem_region() in armctrl_of_init() be collapsed into of_iomap(). This wouldn't request the region, but a quick grep implies that's quite common with DT.
--- .../arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt | 110 +++++++++ arch/arm/boot/dts/bcm2835.dtsi | 8 + arch/arm/mach-bcm2708/Makefile | 1 + arch/arm/mach-bcm2708/bcm2708.c | 12 +- arch/arm/mach-bcm2708/irq.c | 234 ++++++++++++++++++++ arch/arm/mach-bcm2708/irq.h | 27 +++ 6 files changed, 383 insertions(+), 9 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt create mode 100644 arch/arm/mach-bcm2708/irq.c create mode 100644 arch/arm/mach-bcm2708/irq.h
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt new file +110 -0
@@ -0,0 +1,110 @@ +BCM2708 Top-Level ("ARMCTRL") Interrupt Controller + +The BCM2708 contains a custom top-level interrupt controller, which supports +72 interrupt sources using a 2-level register scheme. The interrupt +controller, or the HW block containing it, is referred to occasionally +as "armctrl" in the SoC documentation, hence naming of this binding. + +Required properties: + +- compatible : should be "broadcom,bcm2708-armctrl-ic.txt" +- reg : Specifies base physical address and size of the registers. +- interrupt-controller : Identifies the node as an interrupt controller +- #interrupt-cells : Specifies the number of cells needed to encode an + interrupt source. The value shall be 2. + + The 1st cell is the interrupt bank; 0 for interrupts in the "IRQ basic + pending" register, or 1/2 respectively for interrupts in the "IRQ pending + 1/2" register. + + The 2nd cell contains the interrupt number within the bank. Valid values + are 0..7 for bank 0, and 0..31 for bank 1. + +The interrupt sources are as follows, for the BCM2835 derivative SoC at least: + +Bank 0: +0: ARM_TIMER +1: ARM_MAILBOX +2: ARM_DOORBELL_0 +3: ARM_DOORBELL_1 +4: VPU0_HALTED +5: VPU1_HALTED +6: ILLEGAL_TYPE0 +7: ILLEGAL_TYPE1 + +Bank 1: +0: TIMER0 +1: TIMER1 +2: TIMER2 +3: TIMER3 +4: CODEC0 +5: CODEC1 +6: CODEC2 +7: VC_JPEG +8: ISP +9: VC_USB +10: VC_3D +11: TRANSPOSER +12: MULTICORESYNC0 +13: MULTICORESYNC1 +14: MULTICORESYNC2 +15: MULTICORESYNC3 +16: DMA0 +17: DMA1 +18: VC_DMA2 +19: VC_DMA3 +20: DMA4 +21: DMA5 +22: DMA6 +23: DMA7 +24: DMA8 +25: DMA9 +26: DMA10 +27: DMA11 +28: DMA12 +29: AUX +30: ARM +31: VPUDMA + +Bank 2: +0: HOSTPORT +1: VIDEOSCALER +2: CCP2TX +3: SDC +4: DSI0 +5: AVE +6: CAM0 +7: CAM1 +8: HDMI0 +9: HDMI1 +10: PIXELVALVE1 +11: I2CSPISLV +12: DSI1 +13: PWA0 +14: PWA1 +15: CPR +16: SMI +17: GPIO0 +18: GPIO1 +19: GPIO2 +20: GPIO3 +21: VC_I2C +22: VC_SPI +23: VC_I2SPCM +24: VC_SDIO +25: VC_UART +26: SLIMBUS +27: VEC +28: CPG +29: RNG +30: VC_ARASANSDIO +31: AVSPMON + +Example: + +intc: interrupt-controller { + compatible = "broadcom,bcm2708-armctrl-ic"; + reg = <0x2000b200 0x200>; + interrupt-controller; + #interrupt-cells = <2>; +};
arch/arm/boot/dts/bcm2835.dtsi +8 -0
@@ -3,8 +3,16 @@ / { compatible = "broadcom,bcm2835", "broadcom,bcm2708"; model = "BCM2835"; + interrupt-parent = <&intc>; chosen { bootargs = "earlyprintk"; }; + + intc: interrupt-controller { + compatible = "broadcom,bcm2708-armctrl-ic"; + reg = <0x2000b200 0x200>; + interrupt-controller; + #interrupt-cells = <2>; + }; };
arch/arm/mach-bcm2708/Makefile +1 -0
@@ -1 +1,2 @@ obj-y += bcm2708.o +obj-y += irq.o
arch/arm/mach-bcm2708/bcm2708.c +3 -9
@@ -22,6 +22,8 @@#include <mach/bcm2708_soc.h> +#include "irq.h" +static struct map_desc io_map__initdata = { .virtual =BCM2708_PERIPH_VIRT , .pfn =__phys_to_pfn (BCM2708_PERIPH_PHYS ),
@@ -34,14 +36,6 @@ void __init bcm2708_map_io(void)iotable_init (&io_map,1 ); } -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;
@@ -70,7 +64,7 @@ static const char * const bcm2708_compat[] = {DT_MACHINE_START (BCM2708 ,"BCM2708" ) .map_io = bcm2708_map_io, .init_irq = bcm2708_init_irq, - .handle_irq = bcm2708_handle_irq, + .handle_irq = bcm2708_armctrl_handle_irq, .init_machine = bcm2708_init, .timer = &bcm2708_timer, .dt_compat = bcm2708_compat
arch/arm/mach-bcm2708/irq.c new file +234 -0
234 lines not on this page · raw message
arch/arm/mach-bcm2708/irq.h new file +27 -0
@@ -0,0 +1,27 @@ +/* +* 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 __BCM2708_IRQ_H +#define __BCM2708_IRQ_H + +extern void bcm2708_init_irq (void ); + +extern asmlinkage void __exception_irq_entry bcm2708_armctrl_handle_irq( +struct pt_regs *regs); + +#endif
Signature · 1 line
1.7.9.5
PATCH v3 2/5 ARM: bcm2708: add interrupt controller driver
Quoted 11 lines · Stephen Warren
From: Simon Arlott <[email protected]>
The BCM2708 contains a custom interrupt controller, which supports 72 interrupt sources using a 2-level register scheme. The interrupt controller, or the HW block containing it, is referred to occasionally as "armctrl" in the SoC documentation, hence the symbol naming in the code.
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:
Quoted 6 lines
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift inMAKE_HWIRQ()andHWIRQ_BANK()from 8 to 5 to reduce the size of the hwirq space, and pass the total size of the hwirq space toirq_domain_add_linear(), rather than just the number of valid hwirqs; the two are different due to the hwirq space being sparse.
If the IRQ space is very sparse, isn't it better to use a tree domain rather than a linear one?
Quoted 4 lines
* Added the interrupt controller DT node to the top-level of the DT, rather than nesting it inside a /axi node. Hence, changed the reg value since /axi had a ranges property. This seems simpler to me, but I'm not sure if everyone will like this change or not.
The layout should follow what the hardware looks like. If the interrupt controller is connected through axi, then I'd suggest describing it there unless there is a strong reason not to. The interrupt-parent property of the root node can easily point anywhere.
Quoted 3 lines
TODO: Should
of_address_to_resource(),ioremap(),request_mem_region()inarmctrl_of_init()be collapsed intoof_iomap(). This wouldn't request the region, but a quick grep implies that's quite common with DT.
Yes, that sounds reasonable.
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt
Quoted 5 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt new file +0
-0
The bindings are normally grouped by subsystem, not by manufacturer or soc, because a lot of components end up getting reused by other people. For some reason, we have put a lot of interrupt controller bindings into the arm subdirectory, so you can keep doing this, but I would not create a hierarchy below that.
I think it would be even better if we could put them all into bindings/interrupt-controller or similar.
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt line 6
Quoted 7 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt new file +6
-0@@ -0,0 +1,110 @@ +BCM2708 Top-Level ("ARMCTRL") Interrupt Controller + +The BCM2708 contains a custom top-level interrupt controller, which supports +72 interrupt sources using a 2-level register scheme. The interrupt +controller, or the HW block containing it, is referred to occasionally +as "armctrl" in the SoC documentation, hence naming of this binding.
Do we actually know that BCM2708 has the same one, or could it be present just on bcm2835? It seem hard to find any information about bcm2708, so I don't feel too good about using that name in bindings.
arch/arm/mach-bcm2708/irq.c
Quoted 5 lines
arch/arm/mach-bcm2708/irq.c new file +0
-0
We're starting to put interrupt controller drivers into drivers/irqchip in v3.7, so maybe you can put this one there too. We will get a trivial merge conflict with the Makefile, but that's ok IMHO.
Quoted 12 lines
arch/arm/mach-bcm2708/irq.c new file +12
-0+asmlinkage void __exception_irq_entry bcm2708_armctrl_handle_irq( +struct pt_regs *regs) +{ +u32 stat, irq; + +while ((stat =readl_relaxed (intc.pending[0 ]) &BANK0_VALID_MASK )) { +if (stat &BANK0_HWIRQ_MASK ) { + irq =MAKE_HWIRQ (0 ,ffs (stat &BANK0_HWIRQ_MASK ) -1 ); +handle_IRQ (irq_linear_revmap (intc.domain, irq), regs); + }else if (stat &SHORTCUT1_MASK ) { +armctrl_handle_shortcut (1 , regs, stat &SHORTCUT1_MASK ); + }else if (stat &SHORTCUT2_MASK ) {
arch/arm/mach-bcm2708/irq.c line 234
Quoted 10 lines
arch/arm/mach-bcm2708/irq.c new file +10
-0+armctrl_handle_shortcut (2 , regs, stat &SHORTCUT2_MASK ); + }else if (stat &BANK1_HWIRQ ) { +armctrl_handle_bank (1 , regs); + }else if (stat &BANK2_HWIRQ ) { +armctrl_handle_bank (2 , regs); + }else { +BUG (); + } + } +}
I'm not sure if readl_relaxed() is appropriate here, or if you need readl(). If you have an MSI type interrupt signaling the completion of a DMA, you need to ensure ordering between the data transfer and the interrupt notification.
Arnd
PATCH v3 2/5 ARM: bcm2708: add interrupt controller driver
Quoted 19 lines · Arnd Bergmann
Quoted 11 lines · Stephen Warren
From: Simon Arlott <[email protected]>
The BCM2708 contains a custom interrupt controller, which supports 72 interrupt sources using a 2-level register scheme. The interrupt controller, or the HW block containing it, is referred to occasionally as "armctrl" in the SoC documentation, hence the symbol naming in the code.
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:Quoted 6 lines
* Added devicetree documentation, and hence removed list of IRQs from
bcm2835.dtsi.
* Changed shift inMAKE_HWIRQ()andHWIRQ_BANK()from 8 to 5 to reduce the size of the hwirq space, and pass the total size of the hwirq space toirq_domain_add_linear(), rather than just the number of valid hwirqs; the two are different due to the hwirq space being sparse.
Quoted 2 lines
If the IRQ space is very sparse, isn't it better to use a tree domain rather than a linear one?
It's not very sparse. There are 3 banks, each containing up to 32 interrupts. However, the first bank actually only has 8 interrupts plus 2 cascade inputs (which are hidden inside the interrupt controller driver and so not exposed). So, it's more like there's one gap in the middle. I don't know much about the tree domain, but I figure it's probably not worth it.
Quoted 9 lines
Quoted 4 lines
* Added the interrupt controller DT node to the top-level of the DT, rather than nesting it inside a /axi node. Hence, changed the reg value since /axi had a ranges property. This seems simpler to me, but I'm not sure if everyone will like this change or not.
The layout should follow what the hardware looks like. If the interrupt controller is connected through axi, then I'd suggest describing it there unless there is a strong reason not to. The interrupt-parent property of the root node can easily point anywhere.
The problem is that there's no documentation of the actual bus structure. Simon's original patch placed all peripherals under a single top-level /axi bus/node, but the documentation mentions all of AXI, APB, and AHB in passing, but doesn't explicitly describe which peripherals are on which bus etc. I think I'd rather not represent the bus structure in the .dtsi file at all, rather than represent just part of the structure and hence be misleading.
Quoted 11 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt line 6
Quoted 7 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt new file +6
-0@@ -0,0 +1,110 @@ +BCM2708 Top-Level ("ARMCTRL") Interrupt Controller + +The BCM2708 contains a custom top-level interrupt controller, which supports +72 interrupt sources using a 2-level register scheme. The interrupt +controller, or the HW block containing it, is referred to occasionally +as "armctrl" in the SoC documentation, hence naming of this binding.Do we actually know that BCM2708 has the same one, or could it be present just on bcm2835? It seem hard to find any information about bcm2708, so I don't feel too good about using that name in bindings.
I don't know anything at all about the BCM2708 really. Perhaps Dom at Broadcom can fill in some details?
A similar discussion was apparently held downstream, and IIRC the reported decision there was that BCM2708 was the "parent" of a family of SoCs, so they made all the DT stuff compatible with both 2708 and 2835. Given the lack of documentation, I'd be quite happy to rework all of this to say just BCM2835 instead, and drop any reference to BCM2708 at all. Should I just go ahead and do that?
Quoted 19 lines
Quoted 19 lines
arch/arm/mach-bcm2708/irq.c new file +19
-0+asmlinkage void __exception_irq_entry bcm2708_armctrl_handle_irq( +struct pt_regs *regs) +{ +u32 stat, irq; + +while ((stat =readl_relaxed (intc.pending[0 ]) &BANK0_VALID_MASK )) { +if (stat &BANK0_HWIRQ_MASK ) { + irq =MAKE_HWIRQ (0 ,ffs (stat &BANK0_HWIRQ_MASK ) -1 ); +handle_IRQ (irq_linear_revmap (intc.domain, irq), regs); + }else if (stat &SHORTCUT1_MASK ) { +armctrl_handle_shortcut (1 , regs, stat &SHORTCUT1_MASK ); + }else if (stat &SHORTCUT2_MASK ) { +armctrl_handle_shortcut (2 , regs, stat &SHORTCUT2_MASK ); + }else if (stat &BANK1_HWIRQ ) { +armctrl_handle_bank (1 , regs); + }else if (stat &BANK2_HWIRQ ) { +armctrl_handle_bank (2 , regs); + }else { +BUG ();
Quoted 8 lines
arch/arm/mach-bcm2708/irq.c line 132
Quoted 3 lines
arch/arm/mach-bcm2708/irq.c new file +3
-0+ } + } +}I'm not sure if
readl_relaxed()is appropriate here, or if you needreadl(). If you have an MSI type interrupt signaling the completion of a DMA, you need to ensure ordering between the data transfer and the interrupt notification.
I did wonder about this. I suppose it would be safe to globally replace all readl/writel_relaxed with plain readl/writel, and fix this up later if we can justify it. Should I go ahead and do that?
PATCH v3 2/5 ARM: bcm2708: add interrupt controller driver
Quoted 10 lines · Stephen Warren
Quoted 2 lines · Arnd Bergmann
If the IRQ space is very sparse, isn't it better to use a tree domain rather than a linear one?
It's not very sparse. There are 3 banks, each containing up to 32 interrupts. However, the first bank actually only has 8 interrupts plus 2 cascade inputs (which are hidden inside the interrupt controller driver and so not exposed). So, it's more like there's one gap in the middle. I don't know much about the tree domain, but I figure it's probably not worth it.
Ok, makes sense.
Quoted 10 lines
Quoted 9 lines
Quoted 4 lines
* Added the interrupt controller DT node to the top-level of the DT, rather than nesting it inside a /axi node. Hence, changed the reg value since /axi had a ranges property. This seems simpler to me, but I'm not sure if everyone will like this change or not.
The layout should follow what the hardware looks like. If the interrupt controller is connected through axi, then I'd suggest describing it there unless there is a strong reason not to. The interrupt-parent property of the root node can easily point anywhere.
Quoted 7 lines
The problem is that there's no documentation of the actual bus structure. Simon's original patch placed all peripherals under a single top-level /axi bus/node, but the documentation mentions all of AXI, APB, and AHB in passing, but doesn't explicitly describe which peripherals are on which bus etc. I think I'd rather not represent the bus structure in the .dtsi file at all, rather than represent just part of the structure and hence be misleading.
Ok.
Quoted 15 lines
Quoted 11 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt line 6
Quoted 7 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt new file +6
-0@@ -0,0 +1,110 @@ +BCM2708 Top-Level ("ARMCTRL") Interrupt Controller + +The BCM2708 contains a custom top-level interrupt controller, which supports +72 interrupt sources using a 2-level register scheme. The interrupt +controller, or the HW block containing it, is referred to occasionally +as "armctrl" in the SoC documentation, hence naming of this binding.Do we actually know that BCM2708 has the same one, or could it be present just on bcm2835? It seem hard to find any information about bcm2708, so I don't feel too good about using that name in bindings.
I don't know anything at all about the BCM2708 really. Perhaps Dom at Broadcom can fill in some details?
Quoted 6 lines
A similar discussion was apparently held downstream, and IIRC the reported decision there was that BCM2708 was the "parent" of a family of SoCs, so they made all the DT stuff compatible with both 2708 and 2835. Given the lack of documentation, I'd be quite happy to rework all of this to say just BCM2835 instead, and drop any reference to BCM2708 at all. Should I just go ahead and do that?
That's probably safer, yes.
Quoted 28 lines
Quoted 19 lines
Quoted 19 lines
arch/arm/mach-bcm2708/irq.c new file +19
-0+asmlinkage void __exception_irq_entry bcm2708_armctrl_handle_irq( +struct pt_regs *regs) +{ +u32 stat, irq; + +while ((stat =readl_relaxed (intc.pending[0 ]) &BANK0_VALID_MASK )) { +if (stat &BANK0_HWIRQ_MASK ) { + irq =MAKE_HWIRQ (0 ,ffs (stat &BANK0_HWIRQ_MASK ) -1 ); +handle_IRQ (irq_linear_revmap (intc.domain, irq), regs); + }else if (stat &SHORTCUT1_MASK ) { +armctrl_handle_shortcut (1 , regs, stat &SHORTCUT1_MASK ); + }else if (stat &SHORTCUT2_MASK ) { +armctrl_handle_shortcut (2 , regs, stat &SHORTCUT2_MASK ); + }else if (stat &BANK1_HWIRQ ) { +armctrl_handle_bank (1 , regs); + }else if (stat &BANK2_HWIRQ ) { +armctrl_handle_bank (2 , regs); + }else { +BUG ();Quoted 8 lines
arch/arm/mach-bcm2708/irq.c line 132
Quoted 3 lines
arch/arm/mach-bcm2708/irq.c new file +3
-0+ } + } +}I'm not sure if
readl_relaxed()is appropriate here, or if you needreadl(). If you have an MSI type interrupt signaling the completion of a DMA, you need to ensure ordering between the data transfer and the interrupt notification.
Quoted 3 lines
I did wonder about this. I suppose it would be safe to globally replace all readl/writel_relaxed with plain readl/writel, and fix this up later if we can justify it. Should I go ahead and do that?
The synchronizations can be a bit expensive, so in the interrupt controller driver it makes sense to use at least writel_relaxed, which should always be fine because you don't have to worry about outgoing DMAs.
Even for incoming DMA, I think there is only a need for the non-relaxed version if we're actually dealing with MSI interrupts, because regular level and edge triggered interrupts have no form of synchronization between DMA completion and interrupt delivery anyway.
Arnd
PATCH v3 2/5 ARM: bcm2708: add interrupt controller driver
Quoted 18 lines · Arnd Bergmann
Quoted 17 lines · Stephen Warren
Quoted 11 lines · Arnd Bergmann
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt line 6
Quoted 7 lines
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-armctrl-ic.txt new file +6
-0@@ -0,0 +1,110 @@ +BCM2708 Top-Level ("ARMCTRL") Interrupt Controller + +The BCM2708 contains a custom top-level interrupt controller, which supports +72 interrupt sources using a 2-level register scheme. The interrupt +controller, or the HW block containing it, is referred to occasionally +as "armctrl" in the SoC documentation, hence naming of this binding.Do we actually know that BCM2708 has the same one, or could it be present just on bcm2835? It seem hard to find any information about bcm2708, so I don't feel too good about using that name in bindings.
I don't know anything at all about the BCM2708 really. Perhaps Dom at Broadcom can fill in some details?
Quoted 8 lines
Quoted 6 lines
A similar discussion was apparently held downstream, and IIRC the reported decision there was that BCM2708 was the "parent" of a family of SoCs, so they made all the DT stuff compatible with both 2708 and 2835. Given the lack of documentation, I'd be quite happy to rework all of this to say just BCM2835 instead, and drop any reference to BCM2708 at all. Should I just go ahead and do that?
That's probably safer, yes.
Sounds good. For reference, I found:
https://github.com/raspberrypi/linux/issues/22
... where it sounds like BCM2708 isn't actually a chip at all, but a family name, so that supports this change.
Quoted 28 lines
Quoted 28 lines
Quoted 27 lines
Quoted 12 lines
arch/arm/mach-bcm2708/irq.c new file +12
-0+asmlinkage void __exception_irq_entry bcm2708_armctrl_handle_irq( +struct pt_regs *regs) +{ +u32 stat, irq; + +while ((stat =readl_relaxed (intc.pending[0 ]) &BANK0_VALID_MASK )) { +if (stat &BANK0_HWIRQ_MASK ) { + irq =MAKE_HWIRQ (0 ,ffs (stat &BANK0_HWIRQ_MASK ) -1 ); +handle_IRQ (irq_linear_revmap (intc.domain, irq), regs); + }else if (stat &SHORTCUT1_MASK ) { +armctrl_handle_shortcut (1 , regs, stat &SHORTCUT1_MASK ); + }else if (stat &SHORTCUT2_MASK ) {arch/arm/mach-bcm2708/irq.c line 234
Quoted 10 lines
arch/arm/mach-bcm2708/irq.c new file +10
-0+armctrl_handle_shortcut (2 , regs, stat &SHORTCUT2_MASK ); + }else if (stat &BANK1_HWIRQ ) { +armctrl_handle_bank (1 , regs); + }else if (stat &BANK2_HWIRQ ) { +armctrl_handle_bank (2 , regs); + }else { +BUG (); + } + } +}I'm not sure if
readl_relaxed()is appropriate here, or if you needreadl(). If you have an MSI type interrupt signaling the completion of a DMA, you need to ensure ordering between the data transfer and the interrupt notification.
Quoted 7 lines
Quoted 3 lines
I did wonder about this. I suppose it would be safe to globally replace all readl/writel_relaxed with plain readl/writel, and fix this up later if we can justify it. Should I go ahead and do that?
The synchronizations can be a bit expensive, so in the interrupt controller driver it makes sense to use at least
writel_relaxed, which should always be fine because you don't have to worry about outgoing DMAs.
Thinking some more about this - I doubt there are any MSI-style interrupts; there's certainly no PCI/PCIe on the Raspberry Pi board, and none documented in the SoC itself (although admittedly only a small subset of the SoC is publicly documented). I guess it's easiest just to leave that code as-is, and fix it up if the hardware ever turns out to be more complex, and actually have MSI.
PATCH v3 3/5 ARM: bcm2708: add system timer
In reply to Stephen WarrenFrom: Simon Arlott <[email protected]>
The System Timer peripheral provides four 32-bit timer channels and a single 64-bit free running counter. Each channel has an output compare register, which is compared against the 32 least significant bits of the free running counter values, and generates an interrupt.
Timer 3 is used as the Linux timer.
The BCM2708 also contains an SP804-based timer module. However, it apparently has significant differences from the standard SP804 IP block, and Broadcom's documentation recommends using the system timer instead.
This patch was extracted from git://github.com/lp0/linux.git branch rpi-split as of 2012/09/08, and modified as follows:
* Moved struct sys_timer bcm2708_timer into time.c to encapsulate it more.
* Added DT binding docs.
* Moved to drivers/clocksource/. This looks like the desired location for such code now.
* Simplified bcm2708_time_init() to find one matching node and operate on it, rather than looping over all matching nodes. This seems more consistent with other clocksource code.
* Renamed struct bcm2708_timer.index to match_mask to better represent its purpose.
* s/printk(PR_INFO/pr_info(/
---
v3: New patch.
TODO: Should of_address_to_resource(), ioremap(), request_mem_region() in bcm2708_time_init() be collapsed into of_iomap(). This wouldn't request the region, but a quick grep implies that's quite common with DT.
--- .../arm/bcm2708/broadcom,bcm2708-system-timer.txt | 22 +++ arch/arm/boot/dts/bcm2835.dtsi | 7 + arch/arm/mach-bcm2708/bcm2708.c | 10 +- drivers/clocksource/Makefile | 1 + drivers/clocksource/bcm2708_timer.c | 170 ++++++++++++++++++++ include/linux/bcm2708_timer.h | 22 +++ 6 files changed, 223 insertions(+), 9 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-system-timer.txt create mode 100644 drivers/clocksource/bcm2708_timer.c create mode 100644 include/linux/bcm2708_timer.h
Documentation/devicetree/bindings/arm/bcm2708/broadcom,bcm2708-system-timer.txt new file +22 -0
@@ -0,0 +1,22 @@ +BCM2708 System Timer + +The System Timer peripheral provides four 32-bit timer channels and a +single 64-bit free running counter. Each channel has an output compare +register, which is compared against the 32 least significant bits of the +free running counter values, and generates an interrupt. + +Required properties: + +- compatible : should be "broadcom,bcm2708-system-timer.txt" +- reg : Specifies base physical address and size of the registers. +- interrupts : A list of 4 interrupt sinks; one per timer channel. +- clock-frequency : The frequency of the clock that drives the counter, in Hz. + +Example: + +timer { + compatible = "broadcom,bcm2835-system-timer", "broadcom,bcm2708-system-timer"; + reg = <0x20003000 0x1000>; + interrupts = <1 0>, <1 1>, <1 2>, <1 3>; + clock-frequency = <1000000>; +};
arch/arm/boot/dts/bcm2835.dtsi +7 -0
@@ -9,6 +9,13 @@ bootargs = "earlyprintk"; }; + timer { + compatible = "broadcom,bcm2835-system-timer", "broadcom,bcm2708-system-timer"; + reg = <0x20003000 0x1000>; + interrupts = <1 0>, <1 1>, <1 2>, <1 3>; + clock-frequency = <1000000>; + }; + intc: interrupt-controller { compatible = "broadcom,bcm2708-armctrl-ic"; reg = <0x2000b200 0x200>;
arch/arm/mach-bcm2708/bcm2708.c +1 -9
@@ -14,10 +14,10 @@#include <linux/init.h> #include <linux/of_platform.h> +#include <linux/bcm2708_timer.h> #include <asm/mach/arch.h> #include <asm/mach/map.h> -#include <asm/mach/time.h> #include <asm/exception.h> #include <mach/bcm2708_soc.h>
@@ -48,14 +48,6 @@ void __init bcm2708_init(void) } } -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
drivers/clocksource/Makefile +1 -0
@@ -14,3 +14,4 @@ obj-$(CONFIG_DW_APB_TIMER_OF) += dw_apb_timer_of.o obj-$(CONFIG_CLKSRC_DBX500_PRCMU) += clksrc-dbx500-prcmu.o obj-$(CONFIG_ARMADA_370_XP_TIMER) += time-armada-370-xp.o obj-$(CONFIG_CLKSRC_ARM_GENERIC) += arm_generic.o +obj-$(CONFIG_ARCH_BCM2708) += bcm2708_timer.o
drivers/clocksource/bcm2708_timer.c new file +170 -0
170 lines not on this page · raw message
include/linux/bcm2708_timer.h new file +22 -0
@@ -0,0 +1,22 @@ +/* +* Copyright 2012 Simon Arlott +* +* 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. +*/ + +#ifndef __BCM2708_TIMER_H +#define __BCM2708_TIMER_H + +#include <asm/mach/time.h> + +extern struct sys_timer bcm2708_timer; + +#endif
Signature · 1 line
1.7.9.5
PATCH v3 3/5 ARM: bcm2708: add system timer
Quoted 27 lines · Stephen Warren
From: Simon Arlott <[email protected]>
The System Timer peripheral provides four 32-bit timer channels and a single 64-bit free running counter. Each channel has an output compare register, which is compared against the 32 least significant bits of the free running counter values, and generates an interrupt.
Timer 3 is used as the Linux timer.
The BCM2708 also contains an SP804-based timer module. However, it apparently has significant differences from the standard SP804 IP block, and Broadcom's documentation recommends using the system timer instead.
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:* Moved struct
sys_timerbcm2708_timerintotime.cto encapsulate it more.
* Added DT binding docs.
* Moved todrivers/clocksource/. This looks like the desired location for such code now.
* Simplifiedbcm2708_time_init()to find one matching node and operate on it, rather than looping over all matching nodes. This seems more consistent with other clocksource code.
* Renamed struct bcm2708_timer.index tomatch_maskto better represent its purpose.
* s/printk(PR_INFO/pr_info(/
Quoted 5 lines
Signed-off-by Chris Boot <[email protected]>Signed-off-by Simon Arlott <[email protected]>Signed-off-by Dom Cobley <[email protected]>Signed-off-by Dom Cobley <[email protected]>Signed-off-by Stephen Warren <[email protected]>
Looks good to me, but I think the use of of_iomap() would be a good simplification of the init function.
Arnd
PATCH v3 4/5 ARM: bcm2708: add stub clock driver
In reply to Stephen WarrenFrom: Simon Arlott <[email protected]>
This patch adds a minimal stub clock driver for the BCM2708. Its sole purpose is to allow the PL011 AMBA clk_get() API calls to provide something that looks enough like a clock that the driver probes and operates correctly.
This patch was extracted from git://github.com/lp0/linux.git branch rpi-split as of 2012/09/08, and modified as follows:
* Modified .dev_id for UART clocks to match UART DT node names.
--
v3: New patch.
--- arch/arm/mach-bcm2708/Makefile | 1 + arch/arm/mach-bcm2708/bcm2708.c | 3 +++ arch/arm/mach-bcm2708/clock.c | 53 +++++++++++++++++++++++++++++++++++++++ arch/arm/mach-bcm2708/clock.h | 24 ++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 arch/arm/mach-bcm2708/clock.c create mode 100644 arch/arm/mach-bcm2708/clock.h
arch/arm/mach-bcm2708/Makefile +1 -0
@@ -1,2 +1,3 @@ obj-y += bcm2708.o +obj-y += clock.o obj-y += irq.o
arch/arm/mach-bcm2708/bcm2708.c +3 -0
@@ -22,6 +22,7 @@#include <mach/bcm2708_soc.h> +#include "clock.h" #include "irq.h" static struct map_desc io_map__initdata = {
@@ -40,6 +41,8 @@ void __init bcm2708_init(void) {int ret; +bcm2708_init_clocks (); + ret =of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL );if (ret) {
arch/arm/mach-bcm2708/clock.c new file +53 -0
53 lines not on this page · raw message
arch/arm/mach-bcm2708/clock.h new file +24 -0
@@ -0,0 +1,24 @@ +/* +* 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 __BCM2708_CLOCK_H +#define __BCM2708_CLOCK_H + +void __init bcm2708_init_clocks (void ); + +#endif
Signature · 1 line
1.7.9.5
PATCH v3 4/5 ARM: bcm2708: add stub clock driver
Quoted 19 lines · Stephen Warren
From: Simon Arlott <[email protected]>
This patch adds a minimal stub clock driver for the BCM2708. Its sole purpose is to allow the PL011 AMBA
clk_get()API calls to provide something that looks enough like a clock that the driver probes and operates correctly.This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:* Modified .dev_id for UART clocks to match UART DT node names.
Signed-off-by Chris Boot <[email protected]>Signed-off-by Simon Arlott <[email protected]>Signed-off-by Dom Cobley <[email protected]>Signed-off-by Dom Cobley <[email protected]>Signed-off-by Stephen Warren <[email protected]>--
v3: New patch.
Quoted 8 lines
--- arch/arm/mach-bcm2708/Makefile | 1 + arch/arm/mach-bcm2708/bcm2708.c | 3 +++ arch/arm/mach-bcm2708/clock.c | 53 +++++++++++++++++++++++++++++++++++++++ arch/arm/mach-bcm2708/clock.h | 24 ++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 arch/arm/mach-bcm2708/clock.c create mode 100644 arch/arm/mach-bcm2708/clock.h
I think you should keep Mike on Cc for clock related patches. I also wonder whether this file should go into drivers/clk right away, since that is where it would end up when it grows into a full clock driver.
Arnd
PATCH v3 5/5 ARM: bcm2708: instantiate console UART
In reply to Stephen WarrenFrom: Simon Arlott <[email protected]>
This patch was extracted from git://github.com/lp0/linux.git branch rpi-split as of 2012/09/08, and modified as follows:
* Modified UART DT node to use a unit-address to differentiate UART node names, rather than using different base names "uart0" and "uart1". Note that UART 1 (the Broadcom "mini UART") is not yet present, but I'm naming the DT node in anticipation that it will be added.
--
v3: New patch.
--- arch/arm/boot/dts/bcm2835.dtsi | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
arch/arm/boot/dts/bcm2835.dtsi +8 -1
@@ -6,7 +6,7 @@ interrupt-parent = <&intc>; chosen { - bootargs = "earlyprintk"; + bootargs = "earlyprintk console=ttyAMA0"; }; timer {
@@ -22,4 +22,11 @@ interrupt-controller; #interrupt-cells = <2>; }; + + uart at 20201000 { + compatible = "broadcom,bcm2835-pl011", "broadcom,bcm2708-pl011", "arm,pl011", "arm,primecell"; + reg = <0x20201000 0x1000>; + interrupts = <2 25>; + clock-frequency = <3000000>; + }; };
Signature · 1 line
1.7.9.5
PATCH v3 5/5 ARM: bcm2708: instantiate console UART
Quoted 10 lines · Stephen Warren
From: Simon Arlott <[email protected]>
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:* Modified UART DT node to use a unit-address to differentiate UART node names, rather than using different base names "uart0" and "uart1". Note that UART 1 (the Broadcom "mini UART") is not yet present, but I'm naming the DT node in anticipation that it will be added.
Shouldn't the selection be done using an alias like this?
aliases {
serial0 = &/uart at 20201000;
};
ArndPATCH v3 5/5 ARM: bcm2708: instantiate console UART
Quoted 12 lines · Arnd Bergmann
Quoted 10 lines · Stephen Warren
From: Simon Arlott <[email protected]>
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:* Modified UART DT node to use a unit-address to differentiate UART node names, rather than using different base names "uart0" and "uart1". Note that UART 1 (the Broadcom "mini UART") is not yet present, but I'm naming the DT node in anticipation that it will be added.
Quoted 5 lines
Shouldn't the selection be done using an alias like this?
aliases { serial0 = &/uart at 20201000; };
The "differentiate" was more "ensure that node names in DT are unique" than anything to do with user-visible selection/identification.
I can certainly add the alias if you want, but I don't know what benefit it will have, since I've never used aliases before.
PATCH v3 5/5 ARM: bcm2708: instantiate console UART
Quoted 19 lines · Stephen Warren
Quoted 12 lines · Arnd Bergmann
Quoted 10 lines · Stephen Warren
From: Simon Arlott <[email protected]>
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split as of 2012/09/08, and modified as follows:* Modified UART DT node to use a unit-address to differentiate UART node names, rather than using different base names "uart0" and "uart1". Note that UART 1 (the Broadcom "mini UART") is not yet present, but I'm naming the DT node in anticipation that it will be added.
Quoted 5 lines
Shouldn't the selection be done using an alias like this?
aliases { serial0 = &/uart at 20201000; };
Quoted 5 lines
The "differentiate" was more "ensure that node names in DT are unique" than anything to do with user-visible selection/identification.
I can certainly add the alias if you want, but I don't know what benefit it will have, since I've never used aliases before.
The idea of the aliases is that you can identify which port to use if one passes an argument like "console=ttyS0" or opens a specific /dev/tty* device node. I believe we don't actually use it that way at the moment though.
Arnd
PATCH v3 1/5 ARM: add infra-structure for BCM2708/BCM2835 and Raspberry Pi
In reply to Stephen WarrenQuoted 25 lines · Stephen Warren
From: Simon Arlott <[email protected]>
The BCM2708 is an ARM SoC from Broadcom. It is the primary SoC in a series which contains the BCM2835 amongst other variants. This patch adds very basic support for this series of SoCs, under the BCM2708 name.
http://www.broadcom.com/products/BCM2835
http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdNote that the documentation in the latter .pdf assumes the MMU setup that's used on the "VideoCore" companion processor, and does not document physical peripheral addresses. Subtract
0x5e000000to obtain the physical addresses.The BCM2835 SoC is used in the Raspberry Pi. This patch also adds a minimal device tree for this board; enough to see some very early kernel boot messages through earlyprintk. However, this patch does not yet provide a useful booting system.
This patch was extracted from
git://github.com/lp0/linux.gitbranch rpi-split from 3-4 months ago, and significantly stripped down and modified since.
Quoted 5 lines
Signed-off-by Chris Boot <[email protected]>Signed-off-by Simon Arlott <[email protected]>Signed-off-by Dom Cobley <[email protected]>Signed-off-by Dom Cobley <[email protected]>Signed-off-by Stephen Warren <[email protected]>
PATCH v3 1/5 ARM: add infra-structure for BCM2708/BCM2835 and Raspberry Pi
In reply to Stephen WarrenHi Stephen,
Quoted 13 lines · Stephen Warren
From: Simon Arlott <[email protected]>
Documentation/devicetree/bindings/arm/bcm2708.txt new file +5
-0@@ -0,0 +1,15 @@ +Broadcom BCM2708 device tree bindings +------------------------------------------- + +Boards with the BCM2708 SoC, or another SoC in the BCM2708 family, shall have +the following properties:
Documentation/devicetree/bindings/arm/bcm2708.txt line 15
Quoted 10 lines
Documentation/devicetree/bindings/arm/bcm2708.txt new file +10
-0+ +Required root node property: + +compatible = "broadcom,bcm2708"; + +Boards with BCM2835 SoC shall *additionally* have the following properties: + +Required root node property: + +compatible = "broadcom,bcm2835";
Please update also the vendor prefixes index at Documentation/devicetree/bindings/vendor-prefixes.txt.
BTW is it possible to change it to "bcm"?
Regards,
Domenico
-----[ Domenico Andreoli, aka cavok
--[ http://cavokz.wordpress.com/gpgkey/
---[ 3A0F 2F80 F79C 678A 8936 4FEE 0677 9033 A20E BC50
PATCH v3 1/5 ARM: add infra-structure for BCM2708/BCM2835 and Raspberry Pi
Quoted 21 lines · Domenico Andreoli
Hi Stephen,
Quoted 18 lines · Stephen Warren
From: Simon Arlott <[email protected]>
Documentation/devicetree/bindings/arm/bcm2708.txt new file +10
-0@@ -0,0 +1,15 @@ +Broadcom BCM2708 device tree bindings +------------------------------------------- + +Boards with the BCM2708 SoC, or another SoC in the BCM2708 family, shall have +the following properties: + +Required root node property: + +compatible = "broadcom,bcm2708"; +
Quoted 8 lines
Documentation/devicetree/bindings/arm/bcm2708.txt line 15
Quoted 5 lines
Documentation/devicetree/bindings/arm/bcm2708.txt new file +5
-0+Boards with BCM2835 SoC shall *additionally* have the following properties: + +Required root node property: + +compatible = "broadcom,bcm2835";Please update also the vendor prefixes index at
Documentation/devicetree/bindings/vendor-prefixes.txt.
Oops, yes, I forgot that.
Quoted 1 line
BTW is it possible to change it to "bcm"?
I believe standard practice is to use the stock ticker symbol if not using the full company name, so that'd be "brcm". Does anyone have an objection? I'll assume not and make the change...
PATCH v3 1/5 ARM: add infra-structure for BCM2708/BCM2835 and Raspberry Pi
Quoted 5 lines · Stephen Warren
Quoted 1 line
BTW is it possible to change it to "bcm"?
I believe standard practice is to use the stock ticker symbol if not using the full company name, so that'd be "brcm". Does anyone have an objection? I'll assume not and make the change...
Yeah, "brcm," is the appropriate prefix in this case.
-Olof