[PATCH 1/3] picoxcell: support for Picochip picoxcell devices

Grant Likely glikely at secretlab.ca
Sat Aug 20 02:31:40 EDT 2011


On 11-08-09 03:10 AM, Jamie Iles wrote:
> picoXcell is a family of femtocell devices with an ARM application
> processor and picoArray DSP processor array.
>
> This patch adds support for picoXcell boards to be booted using the
> device tree registering the VIC's, UART's and timers.
>
> Signed-off-by: Jamie Iles<jamie at jamieiles.com>
> ---
>
> The thing I'm least certain about here is the VIC handling.  As we have
> two VIC's that aren't cascaded (wire-OR'd instead) there needs to be a
> way for the entry macros to decode to the correct DT IRQ numbers.
> Originally I had two VIC nodes with each one having an irq-start
> property to denote the Linux IRQ number but that's a bit gross.
> Instead, in this patch I've group the two VIC node's into a single
> vic-pair node so that it looks like one controller that handles 64
> sources.
>
>   .../devicetree/bindings/arm/picoxcell.txt          |   27 ++++
>   arch/arm/Kconfig                                   |   18 +++
>   arch/arm/Makefile                                  |    1 +
>   arch/arm/mach-picoxcell/Makefile                   |    3 +
>   arch/arm/mach-picoxcell/Makefile.boot              |    1 +
>   arch/arm/mach-picoxcell/common.c                   |   72 +++++++++++
>   arch/arm/mach-picoxcell/common.h                   |   18 +++
>   arch/arm/mach-picoxcell/include/mach/debug-macro.S |   35 +++++
>   arch/arm/mach-picoxcell/include/mach/entry-macro.S |   19 +++
>   arch/arm/mach-picoxcell/include/mach/gpio.h        |   17 +++
>   arch/arm/mach-picoxcell/include/mach/hardware.h    |   21 +++
>   arch/arm/mach-picoxcell/include/mach/io.h          |   30 +++++
>   arch/arm/mach-picoxcell/include/mach/irqs.h        |   25 ++++
>   arch/arm/mach-picoxcell/include/mach/map.h         |   25 ++++
>   arch/arm/mach-picoxcell/include/mach/memory.h      |   17 +++
>   .../mach-picoxcell/include/mach/picoxcell_soc.h    |   25 ++++
>   arch/arm/mach-picoxcell/include/mach/system.h      |   31 +++++
>   arch/arm/mach-picoxcell/include/mach/timex.h       |   25 ++++
>   arch/arm/mach-picoxcell/include/mach/uncompress.h  |   60 +++++++++
>   arch/arm/mach-picoxcell/include/mach/vmalloc.h     |   18 +++
>   arch/arm/mach-picoxcell/io.c                       |   56 ++++++++
>   arch/arm/mach-picoxcell/time.c                     |  132 ++++++++++++++++++++
>   22 files changed, 676 insertions(+), 0 deletions(-)
>   create mode 100644 Documentation/devicetree/bindings/arm/picoxcell.txt
>   create mode 100644 arch/arm/mach-picoxcell/Makefile
>   create mode 100644 arch/arm/mach-picoxcell/Makefile.boot
>   create mode 100644 arch/arm/mach-picoxcell/common.c
>   create mode 100644 arch/arm/mach-picoxcell/common.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/debug-macro.S
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/entry-macro.S
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/gpio.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/hardware.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/io.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/irqs.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/map.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/memory.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/picoxcell_soc.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/system.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/timex.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/uncompress.h
>   create mode 100644 arch/arm/mach-picoxcell/include/mach/vmalloc.h
>   create mode 100644 arch/arm/mach-picoxcell/io.c
>   create mode 100644 arch/arm/mach-picoxcell/time.c
>
> diff --git a/Documentation/devicetree/bindings/arm/picoxcell.txt b/Documentation/devicetree/bindings/arm/picoxcell.txt
> new file mode 100644
> index 0000000..406c144
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/arm/picoxcell.txt
> @@ -0,0 +1,27 @@
> +Picochip picoXcell device tree bindings.
> +========================================
> +
> +Required root node properties:
> +    - compatible:
> +	- "picochip,pc7302-pc3x3" : PC7302 development board with PC3X3 device.
> +	- "picochip,3x3" : picoXcell PC3X3 device based board.

"picochip,pc3x3" perhaps?

> +	- "picochip,3x2" : picoXcell PC3X2 device based board.
> +
> +Timers required properties:
> +    - compatible = "picochip,picoxcell-timer"

This looks overly generic. It should specify the exact implementation 
(soc): "picochip,pc3x3-timer" perhaps?

> +    - interrupts : The single IRQ line for the timer.
> +    - clock-freq : The frequency in HZ of the timer.
> +    - reg : The register bank for the timer.
> +
> +Note: two timers are required - one for the scheduler clock and one for the
> +event tick/NOHZ.
> +
> +VIC required properties:
> +    - compatible = "arm,pl192-vic-pair".
> +    - interrupt-controller.
> +    - reg : The register bank for the devices.  Picoxcell has two VIC's and the
> +      IRQ outputs are wire-OR'd together so we effectively have a combined
> +      controller that handles 64 IRQ's.  The first reg tuple is the register
> +      bank of the VIC that generates IRQ's 0->31 and the second tuple handles
> +      IRQ's 32->63.

If they are two separate devices, then it probably should still be 
represented as two separate device tree nodes.  Linux can take care of 
assigning a range of linux irq numbers to each VIC.

> +    - #interrupt-cells : Must be 1.
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 199722b..fcfa4b4 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -609,6 +609,24 @@ config ARCH_TEGRA
>   	  This enables support for NVIDIA Tegra based systems (Tegra APX,
>   	  Tegra 6xx and Tegra 2 series).
>
> +config ARCH_PICOXCELL
> +	bool "Picochip picoXcell"
> +	select ARM_PATCH_PHYS_VIRT
> +	select NO_IOPORT
> +	select ARM_VIC
> +	select CPU_V6K
> +	select DW_APB_TIMER
> +	select GENERIC_CLOCKEVENTS
> +	select HAVE_SCHED_CLOCK
> +	select HAVE_TCM
> +	select USE_OF
> +	select GENERIC_GPIO
> +	select ARCH_REQUIRE_GPIOLIB
> +	help
> +	  This enables support for systems based on the Picochip picoXcell
> +	  family of Femtocell devices.  The picoxcell support requires device tree
> +	  for all boards.
> +
>   config ARCH_PNX4008
>   	bool "Philips Nexperia PNX4008 Mobile"
>   	select CPU_ARM926T
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index 0677b86..071134a 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -167,6 +167,7 @@ machine-$(CONFIG_ARCH_OMAP2)		:= omap2
>   machine-$(CONFIG_ARCH_OMAP3)		:= omap2
>   machine-$(CONFIG_ARCH_OMAP4)		:= omap2
>   machine-$(CONFIG_ARCH_ORION5X)		:= orion5x
> +machine-$(CONFIG_ARCH_PICOXCELL)	:= picoxcell
>   machine-$(CONFIG_ARCH_PNX4008)		:= pnx4008
>   machine-$(CONFIG_ARCH_PRIMA2)		:= prima2
>   machine-$(CONFIG_ARCH_PXA)		:= pxa
> diff --git a/arch/arm/mach-picoxcell/Makefile b/arch/arm/mach-picoxcell/Makefile
> new file mode 100644
> index 0000000..c550b63
> --- /dev/null
> +++ b/arch/arm/mach-picoxcell/Makefile
> @@ -0,0 +1,3 @@
> +obj-y	:= common.o
> +obj-y	+= time.o
> +obj-y	+= io.o
> diff --git a/arch/arm/mach-picoxcell/Makefile.boot b/arch/arm/mach-picoxcell/Makefile.boot
> new file mode 100644
> index 0000000..b327175
> --- /dev/null
> +++ b/arch/arm/mach-picoxcell/Makefile.boot
> @@ -0,0 +1 @@
> +zreladdr-y := 0x00008000
> diff --git a/arch/arm/mach-picoxcell/common.c b/arch/arm/mach-picoxcell/common.c
> new file mode 100644
> index 0000000..b529050
> --- /dev/null
> +++ b/arch/arm/mach-picoxcell/common.c
> @@ -0,0 +1,72 @@
> +/*
> + * Copyright (c) 2011 Picochip Ltd., Jamie Iles
> + *
> + * 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.
> + *
> + * All enquiries to support at picochip.com
> + */
> +#include<linux/irq.h>
> +#include<linux/irqdomain.h>
> +#include<linux/of.h>
> +#include<linux/of_address.h>
> +#include<linux/of_platform.h>
> +
> +#include<asm/mach/arch.h>
> +#include<asm/hardware/vic.h>
> +
> +#include<mach/map.h>
> +#include<mach/picoxcell_soc.h>
> +
> +#include "common.h"
> +
> +static void __init picoxcell_init_machine(void)
> +{
> +	const struct of_device_id bus_ids[] = {
> +		{ .compatible = "simple-bus" },
> +		{ /* Sentinel */ }
> +	};

You don't need to device one here.  There is now a default bus id table 
called of_default_bus_match_table.

> +
> +	of_platform_bus_probe(NULL, bus_ids, NULL);

Use of_platform_populate() (as you already mentioned that you're going 
to change).

> +}
> +
> +static const char *picoxcell_dt_match[] = {
> +	"picochip,pc3x2",
> +	"picochip,pc3x3",
> +	NULL
> +};
> +
> +static const struct of_device_id vic_of_match[] = {
> +	{ .compatible = "arm,pl192-vic-pair" },
> +	{ /* Sentinel */ }
> +};
> +
> +static void __init picoxcell_init_irq(void)
> +{
> +	struct device_node *np = of_find_matching_node(NULL, vic_of_match);
> +	void __iomem *regs;
> +
> +	if (!np)
> +		panic("unable to find vic");
> +
> +	regs = of_iomap(np, 0);
> +	if (!regs)
> +		panic("unable to map regs for vic0");
> +	vic_init(regs, 0, ~0, 0);
> +
> +	regs = of_iomap(np, 1);
> +	if (!regs)
> +		panic("unable to map regs for vic1");
> +	vic_init(regs, 32, ~0, 0);
> +
> +	irq_domain_add_simple(np, 0);
> +}
> +
> +DT_MACHINE_START(PICOXCELL, "Picochip picoXcell")
> +	.map_io		= picoxcell_map_io,
> +	.init_irq	= picoxcell_init_irq,
> +	.timer		=&picoxcell_timer,
> +	.init_machine	= picoxcell_init_machine,
> +	.dt_compat	= picoxcell_dt_match,
> +MACHINE_END

Otherwise looks okay to me.

g.




More information about the linux-arm-kernel mailing list