Message ID | 1397072736-10793-4-git-send-email-matthias.bgg@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Matthias, On 09/04/2014 19:45, Matthias Brugger wrote: > This adds a generic devicetree board file and a dtsi for boards > based on the MT6589 SoCs from Mediatek. > > Apart from the generic parts (gic, clocks) the only component > currently supported are the timers. > > Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> > --- > .../devicetree/bindings/vendor-prefixes.txt | 1 + > arch/arm/Kconfig | 2 + > arch/arm/Makefile | 1 + > arch/arm/boot/dts/mtk6589.dtsi | 105 ++++++++++++++++++++ > arch/arm/mach-mediatek/Kconfig | 14 +++ > arch/arm/mach-mediatek/Makefile | 1 + > arch/arm/mach-mediatek/mediatek.c | 40 ++++++++ > 7 files changed, 164 insertions(+) > create mode 100644 arch/arm/boot/dts/mtk6589.dtsi > create mode 100644 arch/arm/mach-mediatek/Kconfig > create mode 100644 arch/arm/mach-mediatek/Makefile > create mode 100644 arch/arm/mach-mediatek/mediatek.c > > diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt > index 0f01c9b..af48801 100644 > --- a/Documentation/devicetree/bindings/vendor-prefixes.txt > +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt > @@ -67,6 +67,7 @@ linux Linux-specific binding > lsi LSI Corp. (LSI Logic) > marvell Marvell Technology Group Ltd. > maxim Maxim Integrated Products > +mediatek MediaTek Inc. > microchip Microchip Technology Inc. > mosaixtech Mosaix Technologies, Inc. > moxa Moxa > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 5db05f6a..04d46ec 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -995,6 +995,8 @@ source "arch/arm/mach-mv78xx0/Kconfig" > > source "arch/arm/mach-imx/Kconfig" > > +source "arch/arm/mach-mediatek/Kconfig" > + > source "arch/arm/mach-mxs/Kconfig" > > source "arch/arm/mach-netx/Kconfig" > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 41c1931..8ce9774 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -170,6 +170,7 @@ machine-$(CONFIG_ARCH_MSM) += msm > machine-$(CONFIG_ARCH_MV78XX0) += mv78xx0 > machine-$(CONFIG_ARCH_MVEBU) += mvebu > machine-$(CONFIG_ARCH_MXC) += imx > +machine-$(CONFIG_ARCH_MEDIATEK) += mediatek > machine-$(CONFIG_ARCH_MXS) += mxs > machine-$(CONFIG_ARCH_NETX) += netx > machine-$(CONFIG_ARCH_NOMADIK) += nomadik > diff --git a/arch/arm/boot/dts/mtk6589.dtsi b/arch/arm/boot/dts/mtk6589.dtsi > new file mode 100644 > index 0000000..6dbb74f > --- /dev/null > +++ b/arch/arm/boot/dts/mtk6589.dtsi > @@ -0,0 +1,105 @@ > +/* > + * Copyright (c) 2014 MundoReader S.L. > + * Author: Matthias Brugger <matthias.bgg@gmail.com> > + * > + * 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. > + */ > + > +#include <dt-bindings/interrupt-controller/irq.h> > +#include <dt-bindings/interrupt-controller/arm-gic.h> > +#include "skeleton.dtsi" > + > +/ { > + compatible = "mediatek,mt6589"; > + interrupt-parent = <&gic>; > + > + cpus { > + #address-cells = <1>; > + #size-cells = <0>; > + > + cpu@0 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x0>; > + }; > + cpu@1 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x1>; > + }; > + cpu@2 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x2>; > + }; > + cpu@3 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x3>; > + }; > + > + }; > + > + clocks { > + #address-cells = <1>; > + #size-cells = <1>; > + ranges; > + > + system_clk: system_clk { > + compatible = "fixed-clock"; > + clock-frequency = <13000000>; > + #clock-cells = <0>; > + clock-output-names = "system_clk"; > + }; Is it really a fixed clock without any parent, or do you declare it as a fixed clock because you don't have any clock common framework support yet? > + > + rtc_clk: rtc_clk { > + compatible = "fixed-clock"; > + clock-frequency = <32000>; > + #clock-cells = <0>; > + clock-output-names = "rtc_clk"; > + }; > + }; > + > + soc { > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "simple-bus"; > + clock-ranges; > + ranges; > + > + gic: interrupt-controller@10212000 { > + compatible = "arm,cortex-a9-gic"; > + interrupt-controller; > + #interrupt-cells = <3>; > + reg = <0x10211000 0x1000>, > + <0x10212000 0x1000>; > + }; > + > + L2: l2-cache-controller@1020e000 { > + compatible = "arm,pl310-cache"; > + reg = <0x1020e000 0x1000>; > + cache-unified; > + cache-level = <2>; > + }; > + > + timer: timer@10008000 { > + compatible = "mediatek,mtk6589-timer"; > + reg = <0x10008000 0x80>; > + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>; > + clocks = <&system_clk>, <&rtc_clk>; > + clock-names = "sys_clk", "rtc_clk"; > + }; > + }; > +}; > diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig > new file mode 100644 > index 0000000..c0139ca > --- /dev/null > +++ b/arch/arm/mach-mediatek/Kconfig > @@ -0,0 +1,14 @@ > +config ARCH_MEDIATEK > + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 > + select ARCH_REQUIRE_GPIOLIB > + select ARM_GIC > + select CACHE_L2X0 > + select HAVE_ARM_TWD if LOCAL_TIMERS LOCAL_TIMERS no longer exist > + select HAVE_SMP > + select LOCAL_TIMERS if SMP ditto so what about this instead: select HAVE_ARM_TWD if SMP The rest of this patch looks good. Thanks, Gregory > + select COMMON_CLK > + select GENERIC_CLOCKEVENTS > + select MTK_TIMER > + select CLKSRC_MMIO > + help > + Support for Mediatek Cortex-A7 Quad-Core-SoC MT6589. > diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile > new file mode 100644 > index 0000000..43e619f > --- /dev/null > +++ b/arch/arm/mach-mediatek/Makefile > @@ -0,0 +1 @@ > +obj-$(CONFIG_ARCH_MEDIATEK) += mediatek.o > diff --git a/arch/arm/mach-mediatek/mediatek.c b/arch/arm/mach-mediatek/mediatek.c > new file mode 100644 > index 0000000..f630403 > --- /dev/null > +++ b/arch/arm/mach-mediatek/mediatek.c > @@ -0,0 +1,40 @@ > +/* > + * Device Tree support for Mediatek SoCs > + * > + * Copyright (c) 2014 MundoReader S.L. > + * Author: Matthias Brugger <matthias.bgg@gmail.com> > + * > + * 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. > + */ > + > +#include <linux/kernel.h> > +#include <linux/init.h> > +#include <linux/of_platform.h> > +#include <linux/irqchip.h> > +#include <asm/mach/arch.h> > +#include <asm/mach/map.h> > +#include <asm/hardware/cache-l2x0.h> > + > +static void __init mediatek_dt_init(void) > +{ > + l2x0_of_init(0, ~0); > + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > +} > + > +static const char * const mediatek_board_dt_compat[] = { > + "mediatek,mt6589", > + NULL, > +}; > + > +DT_MACHINE_START(MEDIATEK_DT, "Mediatek Cortex-A7 (Device Tree)") > + .init_machine = mediatek_dt_init, > + .dt_compat = mediatek_board_dt_compat, > +MACHINE_END >
On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: > This adds a generic devicetree board file and a dtsi for boards > based on the MT6589 SoCs from Mediatek. > > Apart from the generic parts (gic, clocks) the only component > currently supported are the timers. > > Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> > --- > .../devicetree/bindings/vendor-prefixes.txt | 1 + > arch/arm/Kconfig | 2 + > arch/arm/Makefile | 1 + > arch/arm/boot/dts/mtk6589.dtsi | 105 ++++++++++++++++++++ Please add an actual board so your dts file can actually be built. > arch/arm/mach-mediatek/Kconfig | 14 +++ > arch/arm/mach-mediatek/Makefile | 1 + > arch/arm/mach-mediatek/mediatek.c | 40 ++++++++ > 7 files changed, 164 insertions(+) > create mode 100644 arch/arm/boot/dts/mtk6589.dtsi > create mode 100644 arch/arm/mach-mediatek/Kconfig > create mode 100644 arch/arm/mach-mediatek/Makefile > create mode 100644 arch/arm/mach-mediatek/mediatek.c > > diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt > index 0f01c9b..af48801 100644 > --- a/Documentation/devicetree/bindings/vendor-prefixes.txt > +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt > @@ -67,6 +67,7 @@ linux Linux-specific binding > lsi LSI Corp. (LSI Logic) > marvell Marvell Technology Group Ltd. > maxim Maxim Integrated Products > +mediatek MediaTek Inc. > microchip Microchip Technology Inc. > mosaixtech Mosaix Technologies, Inc. > moxa Moxa > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 5db05f6a..04d46ec 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -995,6 +995,8 @@ source "arch/arm/mach-mv78xx0/Kconfig" > > source "arch/arm/mach-imx/Kconfig" > > +source "arch/arm/mach-mediatek/Kconfig" > + > source "arch/arm/mach-mxs/Kconfig" > > source "arch/arm/mach-netx/Kconfig" > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 41c1931..8ce9774 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -170,6 +170,7 @@ machine-$(CONFIG_ARCH_MSM) += msm > machine-$(CONFIG_ARCH_MV78XX0) += mv78xx0 > machine-$(CONFIG_ARCH_MVEBU) += mvebu > machine-$(CONFIG_ARCH_MXC) += imx > +machine-$(CONFIG_ARCH_MEDIATEK) += mediatek > machine-$(CONFIG_ARCH_MXS) += mxs > machine-$(CONFIG_ARCH_NETX) += netx > machine-$(CONFIG_ARCH_NOMADIK) += nomadik > diff --git a/arch/arm/boot/dts/mtk6589.dtsi b/arch/arm/boot/dts/mtk6589.dtsi > new file mode 100644 > index 0000000..6dbb74f > --- /dev/null > +++ b/arch/arm/boot/dts/mtk6589.dtsi > @@ -0,0 +1,105 @@ > +/* > + * Copyright (c) 2014 MundoReader S.L. > + * Author: Matthias Brugger <matthias.bgg@gmail.com> > + * > + * 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. > + */ > + > +#include <dt-bindings/interrupt-controller/irq.h> > +#include <dt-bindings/interrupt-controller/arm-gic.h> > +#include "skeleton.dtsi" > + > +/ { > + compatible = "mediatek,mt6589"; Please document this compatible property. > + interrupt-parent = <&gic>; > + > + cpus { > + #address-cells = <1>; > + #size-cells = <0>; > + > + cpu@0 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x0>; > + }; > + cpu@1 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x1>; > + }; > + cpu@2 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x2>; > + }; > + cpu@3 { > + device_type = "cpu"; > + compatible = "arm,cortex-a7"; > + next-level-cache = <&L2>; > + reg = <0x3>; > + }; > + > + }; > + > + clocks { > + #address-cells = <1>; > + #size-cells = <1>; > + ranges; > + > + system_clk: system_clk { > + compatible = "fixed-clock"; > + clock-frequency = <13000000>; > + #clock-cells = <0>; > + clock-output-names = "system_clk"; > + }; > + > + rtc_clk: rtc_clk { > + compatible = "fixed-clock"; > + clock-frequency = <32000>; > + #clock-cells = <0>; > + clock-output-names = "rtc_clk"; > + }; > + }; > + > + soc { > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "simple-bus"; > + clock-ranges; > + ranges; > + > + gic: interrupt-controller@10212000 { > + compatible = "arm,cortex-a9-gic"; A7 is GICv2. You are missing the various virtualization extension properties. > + interrupt-controller; > + #interrupt-cells = <3>; > + reg = <0x10211000 0x1000>, > + <0x10212000 0x1000>; > + }; > + > + L2: l2-cache-controller@1020e000 { > + compatible = "arm,pl310-cache"; Really? An A7 normally has a built-in L2, not a PL310. > + reg = <0x1020e000 0x1000>; > + cache-unified; > + cache-level = <2>; > + }; > + > + timer: timer@10008000 { > + compatible = "mediatek,mtk6589-timer"; > + reg = <0x10008000 0x80>; > + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>; > + clocks = <&system_clk>, <&rtc_clk>; > + clock-names = "sys_clk", "rtc_clk"; > + }; > + }; > +}; > diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig > new file mode 100644 > index 0000000..c0139ca > --- /dev/null > +++ b/arch/arm/mach-mediatek/Kconfig > @@ -0,0 +1,14 @@ > +config ARCH_MEDIATEK > + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 > + select ARCH_REQUIRE_GPIOLIB Then where is your GPIO driver? > + select ARM_GIC > + select CACHE_L2X0 > + select HAVE_ARM_TWD if LOCAL_TIMERS > + select HAVE_SMP Not needed now (going into 3.15). > + select LOCAL_TIMERS if SMP > + select COMMON_CLK ditto > + select GENERIC_CLOCKEVENTS ditto > + select MTK_TIMER > + select CLKSRC_MMIO This belongs with your timer kconfig
On Wednesday 09 April 2014 21:45:35 Matthias Brugger wrote: > This adds a generic devicetree board file and a dtsi for boards > based on the MT6589 SoCs from Mediatek. > > Apart from the generic parts (gic, clocks) the only component > currently supported are the timers. > > Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> Hi Matthias, First of all, I'm really glad to see this get started, thanks for looking into these! Do you know how similar the MT6589 is to the later chips like MT65x2 and MT6588? What are the on-chip devices like, is it mostly licensed IP blocks from designware and others that we already have drivers for, or all new drivers? > +#include <asm/hardware/cache-l2x0.h> > + > +static void __init mediatek_dt_init(void) > +{ > + l2x0_of_init(0, ~0); > + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > +} I hope that with all the cleanup work that Russell has done in the past few weeks, we can manage to kill off the call to l2x0_of_init() here and have it done by core architecture code instead. That would let you have an empty machine file, unless you have other things you will need to add in the future. Arnd
2014-04-09 22:26 GMT+02:00 Gregory CLEMENT <gregory.clement@free-electrons.com>: > Hi Matthias, > > On 09/04/2014 19:45, Matthias Brugger wrote: >> This adds a generic devicetree board file and a dtsi for boards >> based on the MT6589 SoCs from Mediatek. >> >> Apart from the generic parts (gic, clocks) the only component >> currently supported are the timers. >> >> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> >> --- >> .../devicetree/bindings/vendor-prefixes.txt | 1 + >> arch/arm/Kconfig | 2 + >> arch/arm/Makefile | 1 + >> arch/arm/boot/dts/mtk6589.dtsi | 105 ++++++++++++++++++++ >> arch/arm/mach-mediatek/Kconfig | 14 +++ >> arch/arm/mach-mediatek/Makefile | 1 + >> arch/arm/mach-mediatek/mediatek.c | 40 ++++++++ >> 7 files changed, 164 insertions(+) >> create mode 100644 arch/arm/boot/dts/mtk6589.dtsi >> create mode 100644 arch/arm/mach-mediatek/Kconfig >> create mode 100644 arch/arm/mach-mediatek/Makefile >> create mode 100644 arch/arm/mach-mediatek/mediatek.c >> >> diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt >> index 0f01c9b..af48801 100644 >> --- a/Documentation/devicetree/bindings/vendor-prefixes.txt >> +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt >> @@ -67,6 +67,7 @@ linux Linux-specific binding >> lsi LSI Corp. (LSI Logic) >> marvell Marvell Technology Group Ltd. >> maxim Maxim Integrated Products >> +mediatek MediaTek Inc. >> microchip Microchip Technology Inc. >> mosaixtech Mosaix Technologies, Inc. >> moxa Moxa >> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >> index 5db05f6a..04d46ec 100644 >> --- a/arch/arm/Kconfig >> +++ b/arch/arm/Kconfig >> @@ -995,6 +995,8 @@ source "arch/arm/mach-mv78xx0/Kconfig" >> >> source "arch/arm/mach-imx/Kconfig" >> >> +source "arch/arm/mach-mediatek/Kconfig" >> + >> source "arch/arm/mach-mxs/Kconfig" >> >> source "arch/arm/mach-netx/Kconfig" >> diff --git a/arch/arm/Makefile b/arch/arm/Makefile >> index 41c1931..8ce9774 100644 >> --- a/arch/arm/Makefile >> +++ b/arch/arm/Makefile >> @@ -170,6 +170,7 @@ machine-$(CONFIG_ARCH_MSM) += msm >> machine-$(CONFIG_ARCH_MV78XX0) += mv78xx0 >> machine-$(CONFIG_ARCH_MVEBU) += mvebu >> machine-$(CONFIG_ARCH_MXC) += imx >> +machine-$(CONFIG_ARCH_MEDIATEK) += mediatek >> machine-$(CONFIG_ARCH_MXS) += mxs >> machine-$(CONFIG_ARCH_NETX) += netx >> machine-$(CONFIG_ARCH_NOMADIK) += nomadik >> diff --git a/arch/arm/boot/dts/mtk6589.dtsi b/arch/arm/boot/dts/mtk6589.dtsi >> new file mode 100644 >> index 0000000..6dbb74f >> --- /dev/null >> +++ b/arch/arm/boot/dts/mtk6589.dtsi >> @@ -0,0 +1,105 @@ >> +/* >> + * Copyright (c) 2014 MundoReader S.L. >> + * Author: Matthias Brugger <matthias.bgg@gmail.com> >> + * >> + * 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. >> + */ >> + >> +#include <dt-bindings/interrupt-controller/irq.h> >> +#include <dt-bindings/interrupt-controller/arm-gic.h> >> +#include "skeleton.dtsi" >> + >> +/ { >> + compatible = "mediatek,mt6589"; >> + interrupt-parent = <&gic>; >> + >> + cpus { >> + #address-cells = <1>; >> + #size-cells = <0>; >> + >> + cpu@0 { >> + device_type = "cpu"; >> + compatible = "arm,cortex-a7"; >> + next-level-cache = <&L2>; >> + reg = <0x0>; >> + }; >> + cpu@1 { >> + device_type = "cpu"; >> + compatible = "arm,cortex-a7"; >> + next-level-cache = <&L2>; >> + reg = <0x1>; >> + }; >> + cpu@2 { >> + device_type = "cpu"; >> + compatible = "arm,cortex-a7"; >> + next-level-cache = <&L2>; >> + reg = <0x2>; >> + }; >> + cpu@3 { >> + device_type = "cpu"; >> + compatible = "arm,cortex-a7"; >> + next-level-cache = <&L2>; >> + reg = <0x3>; >> + }; >> + >> + }; >> + >> + clocks { >> + #address-cells = <1>; >> + #size-cells = <1>; >> + ranges; >> + >> + system_clk: system_clk { >> + compatible = "fixed-clock"; >> + clock-frequency = <13000000>; >> + #clock-cells = <0>; >> + clock-output-names = "system_clk"; >> + }; > > Is it really a fixed clock without any parent, or do you > declare it as a fixed clock because you don't have any clock > common framework support yet? I don't have any common clock framework support yet. > >> + >> + rtc_clk: rtc_clk { >> + compatible = "fixed-clock"; >> + clock-frequency = <32000>; >> + #clock-cells = <0>; >> + clock-output-names = "rtc_clk"; >> + }; >> + }; >> + >> + soc { >> + #address-cells = <1>; >> + #size-cells = <1>; >> + compatible = "simple-bus"; >> + clock-ranges; >> + ranges; >> + >> + gic: interrupt-controller@10212000 { >> + compatible = "arm,cortex-a9-gic"; >> + interrupt-controller; >> + #interrupt-cells = <3>; >> + reg = <0x10211000 0x1000>, >> + <0x10212000 0x1000>; >> + }; >> + >> + L2: l2-cache-controller@1020e000 { >> + compatible = "arm,pl310-cache"; >> + reg = <0x1020e000 0x1000>; >> + cache-unified; >> + cache-level = <2>; >> + }; >> + >> + timer: timer@10008000 { >> + compatible = "mediatek,mtk6589-timer"; >> + reg = <0x10008000 0x80>; >> + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>; >> + clocks = <&system_clk>, <&rtc_clk>; >> + clock-names = "sys_clk", "rtc_clk"; >> + }; >> + }; >> +}; >> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >> new file mode 100644 >> index 0000000..c0139ca >> --- /dev/null >> +++ b/arch/arm/mach-mediatek/Kconfig >> @@ -0,0 +1,14 @@ >> +config ARCH_MEDIATEK >> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >> + select ARCH_REQUIRE_GPIOLIB >> + select ARM_GIC >> + select CACHE_L2X0 >> + select HAVE_ARM_TWD if LOCAL_TIMERS > > LOCAL_TIMERS no longer exist > >> + select HAVE_SMP >> + select LOCAL_TIMERS if SMP > ditto > > so what about this instead: > > select HAVE_ARM_TWD if SMP > > > The rest of this patch looks good. > > Thanks, > > Gregory > >> + select COMMON_CLK >> + select GENERIC_CLOCKEVENTS >> + select MTK_TIMER >> + select CLKSRC_MMIO >> + help >> + Support for Mediatek Cortex-A7 Quad-Core-SoC MT6589. >> diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile >> new file mode 100644 >> index 0000000..43e619f >> --- /dev/null >> +++ b/arch/arm/mach-mediatek/Makefile >> @@ -0,0 +1 @@ >> +obj-$(CONFIG_ARCH_MEDIATEK) += mediatek.o >> diff --git a/arch/arm/mach-mediatek/mediatek.c b/arch/arm/mach-mediatek/mediatek.c >> new file mode 100644 >> index 0000000..f630403 >> --- /dev/null >> +++ b/arch/arm/mach-mediatek/mediatek.c >> @@ -0,0 +1,40 @@ >> +/* >> + * Device Tree support for Mediatek SoCs >> + * >> + * Copyright (c) 2014 MundoReader S.L. >> + * Author: Matthias Brugger <matthias.bgg@gmail.com> >> + * >> + * 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. >> + */ >> + >> +#include <linux/kernel.h> >> +#include <linux/init.h> >> +#include <linux/of_platform.h> >> +#include <linux/irqchip.h> >> +#include <asm/mach/arch.h> >> +#include <asm/mach/map.h> >> +#include <asm/hardware/cache-l2x0.h> >> + >> +static void __init mediatek_dt_init(void) >> +{ >> + l2x0_of_init(0, ~0); >> + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); >> +} >> + >> +static const char * const mediatek_board_dt_compat[] = { >> + "mediatek,mt6589", >> + NULL, >> +}; >> + >> +DT_MACHINE_START(MEDIATEK_DT, "Mediatek Cortex-A7 (Device Tree)") >> + .init_machine = mediatek_dt_init, >> + .dt_compat = mediatek_board_dt_compat, >> +MACHINE_END >> > > > -- > Gregory Clement, Free Electrons > Kernel, drivers, real-time and embedded Linux > development, consulting, training and support. > http://free-electrons.com
On 10/04/2014 08:29, Matthias Brugger wrote: > 2014-04-09 22:26 GMT+02:00 Gregory CLEMENT <gregory.clement@free-electrons.com>: >> Hi Matthias, >> >> On 09/04/2014 19:45, Matthias Brugger wrote: >>> This adds a generic devicetree board file and a dtsi for boards >>> based on the MT6589 SoCs from Mediatek. >>> >>> Apart from the generic parts (gic, clocks) the only component >>> currently supported are the timers. >>> >>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> >>> --- >>> .../devicetree/bindings/vendor-prefixes.txt | 1 + >>> arch/arm/Kconfig | 2 + >>> arch/arm/Makefile | 1 + >>> arch/arm/boot/dts/mtk6589.dtsi | 105 ++++++++++++++++++++ >>> arch/arm/mach-mediatek/Kconfig | 14 +++ >>> arch/arm/mach-mediatek/Makefile | 1 + >>> arch/arm/mach-mediatek/mediatek.c | 40 ++++++++ >>> 7 files changed, 164 insertions(+) >>> create mode 100644 arch/arm/boot/dts/mtk6589.dtsi >>> create mode 100644 arch/arm/mach-mediatek/Kconfig >>> create mode 100644 arch/arm/mach-mediatek/Makefile >>> create mode 100644 arch/arm/mach-mediatek/mediatek.c >>> >>> diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt >>> index 0f01c9b..af48801 100644 >>> --- a/Documentation/devicetree/bindings/vendor-prefixes.txt >>> +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt >>> @@ -67,6 +67,7 @@ linux Linux-specific binding >>> lsi LSI Corp. (LSI Logic) >>> marvell Marvell Technology Group Ltd. >>> maxim Maxim Integrated Products >>> +mediatek MediaTek Inc. >>> microchip Microchip Technology Inc. >>> mosaixtech Mosaix Technologies, Inc. >>> moxa Moxa >>> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig >>> index 5db05f6a..04d46ec 100644 >>> --- a/arch/arm/Kconfig >>> +++ b/arch/arm/Kconfig >>> @@ -995,6 +995,8 @@ source "arch/arm/mach-mv78xx0/Kconfig" >>> >>> source "arch/arm/mach-imx/Kconfig" >>> >>> +source "arch/arm/mach-mediatek/Kconfig" >>> + >>> source "arch/arm/mach-mxs/Kconfig" >>> >>> source "arch/arm/mach-netx/Kconfig" >>> diff --git a/arch/arm/Makefile b/arch/arm/Makefile >>> index 41c1931..8ce9774 100644 >>> --- a/arch/arm/Makefile >>> +++ b/arch/arm/Makefile >>> @@ -170,6 +170,7 @@ machine-$(CONFIG_ARCH_MSM) += msm >>> machine-$(CONFIG_ARCH_MV78XX0) += mv78xx0 >>> machine-$(CONFIG_ARCH_MVEBU) += mvebu >>> machine-$(CONFIG_ARCH_MXC) += imx >>> +machine-$(CONFIG_ARCH_MEDIATEK) += mediatek >>> machine-$(CONFIG_ARCH_MXS) += mxs >>> machine-$(CONFIG_ARCH_NETX) += netx >>> machine-$(CONFIG_ARCH_NOMADIK) += nomadik >>> diff --git a/arch/arm/boot/dts/mtk6589.dtsi b/arch/arm/boot/dts/mtk6589.dtsi >>> new file mode 100644 >>> index 0000000..6dbb74f >>> --- /dev/null >>> +++ b/arch/arm/boot/dts/mtk6589.dtsi >>> @@ -0,0 +1,105 @@ >>> +/* >>> + * Copyright (c) 2014 MundoReader S.L. >>> + * Author: Matthias Brugger <matthias.bgg@gmail.com> >>> + * >>> + * 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. >>> + */ >>> + >>> +#include <dt-bindings/interrupt-controller/irq.h> >>> +#include <dt-bindings/interrupt-controller/arm-gic.h> >>> +#include "skeleton.dtsi" >>> + >>> +/ { >>> + compatible = "mediatek,mt6589"; >>> + interrupt-parent = <&gic>; >>> + >>> + cpus { >>> + #address-cells = <1>; >>> + #size-cells = <0>; >>> + >>> + cpu@0 { >>> + device_type = "cpu"; >>> + compatible = "arm,cortex-a7"; >>> + next-level-cache = <&L2>; >>> + reg = <0x0>; >>> + }; >>> + cpu@1 { >>> + device_type = "cpu"; >>> + compatible = "arm,cortex-a7"; >>> + next-level-cache = <&L2>; >>> + reg = <0x1>; >>> + }; >>> + cpu@2 { >>> + device_type = "cpu"; >>> + compatible = "arm,cortex-a7"; >>> + next-level-cache = <&L2>; >>> + reg = <0x2>; >>> + }; >>> + cpu@3 { >>> + device_type = "cpu"; >>> + compatible = "arm,cortex-a7"; >>> + next-level-cache = <&L2>; >>> + reg = <0x3>; >>> + }; >>> + >>> + }; >>> + >>> + clocks { >>> + #address-cells = <1>; >>> + #size-cells = <1>; >>> + ranges; >>> + >>> + system_clk: system_clk { >>> + compatible = "fixed-clock"; >>> + clock-frequency = <13000000>; >>> + #clock-cells = <0>; >>> + clock-output-names = "system_clk"; >>> + }; >> >> Is it really a fixed clock without any parent, or do you >> declare it as a fixed clock because you don't have any clock >> common framework support yet? > > I don't have any common clock framework support yet. So maybe you should provide one (even a very simple one). Pretending a clock is a fixed clock and ignoring its parents will be problematic when you will add the common clock framework support because the device tree is supposed to be stable and you won't be able to change it then. Thanks, Gregory > >> >>> + >>> + rtc_clk: rtc_clk { >>> + compatible = "fixed-clock"; >>> + clock-frequency = <32000>; >>> + #clock-cells = <0>; >>> + clock-output-names = "rtc_clk"; >>> + }; >>> + }; >>> + >>> + soc { >>> + #address-cells = <1>; >>> + #size-cells = <1>; >>> + compatible = "simple-bus"; >>> + clock-ranges; >>> + ranges; >>> + >>> + gic: interrupt-controller@10212000 { >>> + compatible = "arm,cortex-a9-gic"; >>> + interrupt-controller; >>> + #interrupt-cells = <3>; >>> + reg = <0x10211000 0x1000>, >>> + <0x10212000 0x1000>; >>> + }; >>> + >>> + L2: l2-cache-controller@1020e000 { >>> + compatible = "arm,pl310-cache"; >>> + reg = <0x1020e000 0x1000>; >>> + cache-unified; >>> + cache-level = <2>; >>> + }; >>> + >>> + timer: timer@10008000 { >>> + compatible = "mediatek,mtk6589-timer"; >>> + reg = <0x10008000 0x80>; >>> + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>; >>> + clocks = <&system_clk>, <&rtc_clk>; >>> + clock-names = "sys_clk", "rtc_clk"; >>> + }; >>> + }; >>> +}; >>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >>> new file mode 100644 >>> index 0000000..c0139ca >>> --- /dev/null >>> +++ b/arch/arm/mach-mediatek/Kconfig >>> @@ -0,0 +1,14 @@ >>> +config ARCH_MEDIATEK >>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >>> + select ARCH_REQUIRE_GPIOLIB >>> + select ARM_GIC >>> + select CACHE_L2X0 >>> + select HAVE_ARM_TWD if LOCAL_TIMERS >> >> LOCAL_TIMERS no longer exist >> >>> + select HAVE_SMP >>> + select LOCAL_TIMERS if SMP >> ditto >> >> so what about this instead: >> >> select HAVE_ARM_TWD if SMP >> >> >> The rest of this patch looks good. >> >> Thanks, >> >> Gregory >> >>> + select COMMON_CLK >>> + select GENERIC_CLOCKEVENTS >>> + select MTK_TIMER >>> + select CLKSRC_MMIO >>> + help >>> + Support for Mediatek Cortex-A7 Quad-Core-SoC MT6589. >>> diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile >>> new file mode 100644 >>> index 0000000..43e619f >>> --- /dev/null >>> +++ b/arch/arm/mach-mediatek/Makefile >>> @@ -0,0 +1 @@ >>> +obj-$(CONFIG_ARCH_MEDIATEK) += mediatek.o >>> diff --git a/arch/arm/mach-mediatek/mediatek.c b/arch/arm/mach-mediatek/mediatek.c >>> new file mode 100644 >>> index 0000000..f630403 >>> --- /dev/null >>> +++ b/arch/arm/mach-mediatek/mediatek.c >>> @@ -0,0 +1,40 @@ >>> +/* >>> + * Device Tree support for Mediatek SoCs >>> + * >>> + * Copyright (c) 2014 MundoReader S.L. >>> + * Author: Matthias Brugger <matthias.bgg@gmail.com> >>> + * >>> + * 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. >>> + */ >>> + >>> +#include <linux/kernel.h> >>> +#include <linux/init.h> >>> +#include <linux/of_platform.h> >>> +#include <linux/irqchip.h> >>> +#include <asm/mach/arch.h> >>> +#include <asm/mach/map.h> >>> +#include <asm/hardware/cache-l2x0.h> >>> + >>> +static void __init mediatek_dt_init(void) >>> +{ >>> + l2x0_of_init(0, ~0); >>> + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); >>> +} >>> + >>> +static const char * const mediatek_board_dt_compat[] = { >>> + "mediatek,mt6589", >>> + NULL, >>> +}; >>> + >>> +DT_MACHINE_START(MEDIATEK_DT, "Mediatek Cortex-A7 (Device Tree)") >>> + .init_machine = mediatek_dt_init, >>> + .dt_compat = mediatek_board_dt_compat, >>> +MACHINE_END >>> >> >> >> -- >> Gregory Clement, Free Electrons >> Kernel, drivers, real-time and embedded Linux >> development, consulting, training and support. >> http://free-electrons.com > > >
A couple of things on top of Rob's comments: On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: > On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: >> This adds a generic devicetree board file and a dtsi for boards >> based on the MT6589 SoCs from Mediatek. >> >> Apart from the generic parts (gic, clocks) the only component >> currently supported are the timers. >> >> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> [...] >> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >> new file mode 100644 >> index 0000000..c0139ca >> --- /dev/null >> +++ b/arch/arm/mach-mediatek/Kconfig >> @@ -0,0 +1,14 @@ >> +config ARCH_MEDIATEK >> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >> + select ARCH_REQUIRE_GPIOLIB > > Then where is your GPIO driver? > >> + select ARM_GIC >> + select CACHE_L2X0 >> + select HAVE_ARM_TWD if LOCAL_TIMERS Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing node). >> + select HAVE_SMP > > Not needed now (going into 3.15). > >> + select LOCAL_TIMERS if SMP No, A7 always have the arch timers. Thanks, M.
2014-04-10 9:36 GMT+02:00 Arnd Bergmann <arnd@arndb.de>: > On Wednesday 09 April 2014 21:45:35 Matthias Brugger wrote: >> This adds a generic devicetree board file and a dtsi for boards >> based on the MT6589 SoCs from Mediatek. >> >> Apart from the generic parts (gic, clocks) the only component >> currently supported are the timers. >> >> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> > > Hi Matthias, > > First of all, I'm really glad to see this get started, thanks for looking > into these! > > Do you know how similar the MT6589 is to the later chips like MT65x2 > and MT6588? What are the on-chip devices like, is it mostly licensed > IP blocks from designware and others that we already have drivers for, > or all new drivers? Actually I don't have any information about the MT6589. For MT6572 I had a deeper look on the GPT and the UART which seem to be the same in both SoCs. But they don't look like IP blocks from any other vendor. Most of the other on-chip devices look quite similar. In any case don't trust me too much, as I'm just doing my first steps on an effort like this. > >> +#include <asm/hardware/cache-l2x0.h> >> + >> +static void __init mediatek_dt_init(void) >> +{ >> + l2x0_of_init(0, ~0); >> + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); >> +} > > I hope that with all the cleanup work that Russell has done in the > past few weeks, we can manage to kill off the call to l2x0_of_init() > here and have it done by core architecture code instead. That would > let you have an empty machine file, unless you have other things you > will need to add in the future. > > Arnd
Hi Gregory, Am Donnerstag, 10. April 2014, 08:46:03 schrieb Gregory CLEMENT: > On 10/04/2014 08:29, Matthias Brugger wrote: > > 2014-04-09 22:26 GMT+02:00 Gregory CLEMENT <gregory.clement@free- electrons.com>: > >> Hi Matthias, > >> > >> On 09/04/2014 19:45, Matthias Brugger wrote: > >>> diff --git a/arch/arm/boot/dts/mtk6589.dtsi > >>> b/arch/arm/boot/dts/mtk6589.dtsi new file mode 100644 > >>> index 0000000..6dbb74f > >>> --- /dev/null > >>> +++ b/arch/arm/boot/dts/mtk6589.dtsi > >>> @@ -0,0 +1,105 @@ > >>> +/* > >>> + * Copyright (c) 2014 MundoReader S.L. > >>> + * Author: Matthias Brugger <matthias.bgg@gmail.com> > >>> + * > >>> + * 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. > >>> + */ > >>> + > >>> +#include <dt-bindings/interrupt-controller/irq.h> > >>> +#include <dt-bindings/interrupt-controller/arm-gic.h> > >>> +#include "skeleton.dtsi" > >>> + > >>> +/ { > >>> + compatible = "mediatek,mt6589"; > >>> + interrupt-parent = <&gic>; > >>> + > >>> + cpus { > >>> + #address-cells = <1>; > >>> + #size-cells = <0>; > >>> + > >>> + cpu@0 { > >>> + device_type = "cpu"; > >>> + compatible = "arm,cortex-a7"; > >>> + next-level-cache = <&L2>; > >>> + reg = <0x0>; > >>> + }; > >>> + cpu@1 { > >>> + device_type = "cpu"; > >>> + compatible = "arm,cortex-a7"; > >>> + next-level-cache = <&L2>; > >>> + reg = <0x1>; > >>> + }; > >>> + cpu@2 { > >>> + device_type = "cpu"; > >>> + compatible = "arm,cortex-a7"; > >>> + next-level-cache = <&L2>; > >>> + reg = <0x2>; > >>> + }; > >>> + cpu@3 { > >>> + device_type = "cpu"; > >>> + compatible = "arm,cortex-a7"; > >>> + next-level-cache = <&L2>; > >>> + reg = <0x3>; > >>> + }; > >>> + > >>> + }; > >>> + > >>> + clocks { > >>> + #address-cells = <1>; > >>> + #size-cells = <1>; > >>> + ranges; > >>> + > >>> + system_clk: system_clk { > >>> + compatible = "fixed-clock"; > >>> + clock-frequency = <13000000>; > >>> + #clock-cells = <0>; > >>> + clock-output-names = "system_clk"; > >>> + }; > >> > >> Is it really a fixed clock without any parent, or do you > >> declare it as a fixed clock because you don't have any clock > >> common framework support yet? > > > > I don't have any common clock framework support yet. > > So maybe you should provide one (even a very simple one). > > Pretending a clock is a fixed clock and ignoring its parents > will be problematic when you will add the common clock framework > support because the device tree is supposed to be stable and you won't > be able to change it then. personally I think the danger of introducing unsuitable bindings/precedents for a clock controller before it is fully understood is higher. I'd just rename the clock above to something like dummy130m like sunxi also does for example, to reflect its unfinished state and when the clock controller is present later on change the supplying clock of the timer. Or maybe I'm overlooking something here :-) Heiko
On Thursday 10 April 2014 08:46:03 Gregory CLEMENT wrote: > >> > >> Is it really a fixed clock without any parent, or do you > >> declare it as a fixed clock because you don't have any clock > >> common framework support yet? > > > > I don't have any common clock framework support yet. > > So maybe you should provide one (even a very simple one). > > Pretending a clock is a fixed clock and ignoring its parents > will be problematic when you will add the common clock framework > support because the device tree is supposed to be stable and you won't > be able to change it then. But is this actually a problem here? The current device tree file will keep working even if the proper driver is there, you just need to update both the driver and the dts file in order to actually use the clocks at run-time. I guess it comes down to the question of whether we want to handle old kernels with new device trees again, which would be broken here. Arnd
2014-04-10 11:01 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: > A couple of things on top of Rob's comments: > > On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: >> On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: >>> This adds a generic devicetree board file and a dtsi for boards >>> based on the MT6589 SoCs from Mediatek. >>> >>> Apart from the generic parts (gic, clocks) the only component >>> currently supported are the timers. >>> >>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> > > [...] > >>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >>> new file mode 100644 >>> index 0000000..c0139ca >>> --- /dev/null >>> +++ b/arch/arm/mach-mediatek/Kconfig >>> @@ -0,0 +1,14 @@ >>> +config ARCH_MEDIATEK >>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >>> + select ARCH_REQUIRE_GPIOLIB >> >> Then where is your GPIO driver? >> >>> + select ARM_GIC >>> + select CACHE_L2X0 >>> + select HAVE_ARM_TWD if LOCAL_TIMERS > > Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing > node). I considered this, but the timer wasn't able to get it's clock frequency: "Architected timer frequency not available Division by zero in kernel." > >>> + select HAVE_SMP >> >> Not needed now (going into 3.15). >> >>> + select LOCAL_TIMERS if SMP > > No, A7 always have the arch timers. > > Thanks, > > M. > -- > Jazz is not dead. It just smells funny.
On 11/04/14 10:11, Matthias Brugger wrote: > 2014-04-10 11:01 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: >> A couple of things on top of Rob's comments: >> >> On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: >>> On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: >>>> This adds a generic devicetree board file and a dtsi for boards >>>> based on the MT6589 SoCs from Mediatek. >>>> >>>> Apart from the generic parts (gic, clocks) the only component >>>> currently supported are the timers. >>>> >>>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> >> >> [...] >> >>>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >>>> new file mode 100644 >>>> index 0000000..c0139ca >>>> --- /dev/null >>>> +++ b/arch/arm/mach-mediatek/Kconfig >>>> @@ -0,0 +1,14 @@ >>>> +config ARCH_MEDIATEK >>>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >>>> + select ARCH_REQUIRE_GPIOLIB >>> >>> Then where is your GPIO driver? >>> >>>> + select ARM_GIC >>>> + select CACHE_L2X0 >>>> + select HAVE_ARM_TWD if LOCAL_TIMERS >> >> Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing >> node). > > I considered this, but the timer wasn't able to get it's clock frequency: > "Architected timer frequency not available > Division by zero in kernel." This is because your bootloader/firmware is utterly broken, and doesn't set CNTFRQ (it must be set on all CPUs, from secure mode). As a *workaround*, you can set the timer frequency in the timer node, but that's just a hack, and will prevent virtual machines from running on such hardware. M.
On Fri, Apr 11, 2014 at 10:43:30AM +0100, Marc Zyngier wrote: > On 11/04/14 10:11, Matthias Brugger wrote: > > 2014-04-10 11:01 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: > >> A couple of things on top of Rob's comments: > >> > >> On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: > >>> On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: > >>>> This adds a generic devicetree board file and a dtsi for boards > >>>> based on the MT6589 SoCs from Mediatek. > >>>> > >>>> Apart from the generic parts (gic, clocks) the only component > >>>> currently supported are the timers. > >>>> > >>>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> > >> > >> [...] > >> > >>>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig > >>>> new file mode 100644 > >>>> index 0000000..c0139ca > >>>> --- /dev/null > >>>> +++ b/arch/arm/mach-mediatek/Kconfig > >>>> @@ -0,0 +1,14 @@ > >>>> +config ARCH_MEDIATEK > >>>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 > >>>> + select ARCH_REQUIRE_GPIOLIB > >>> > >>> Then where is your GPIO driver? > >>> > >>>> + select ARM_GIC > >>>> + select CACHE_L2X0 > >>>> + select HAVE_ARM_TWD if LOCAL_TIMERS > >> > >> Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing > >> node). > > > > I considered this, but the timer wasn't able to get it's clock frequency: > > "Architected timer frequency not available > > Division by zero in kernel." > > This is because your bootloader/firmware is utterly broken, and doesn't > set CNTFRQ (it must be set on all CPUs, from secure mode). As a > *workaround*, you can set the timer frequency in the timer node, but > that's just a hack, and will prevent virtual machines from running on > such hardware. Is it? From what I understood from ARM's ARM, CNTFRQ must be set during the system boot, but even though the arch timer driver can fetch the frequency from clock-frequency, I don't see anywhere that it actually writes to CNTFRQ whatever it retrieved. But I'm probably missing something here... Maxime
2014-04-11 11:43 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: > On 11/04/14 10:11, Matthias Brugger wrote: >> 2014-04-10 11:01 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: >>> A couple of things on top of Rob's comments: >>> >>> On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: >>>> On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: >>>>> This adds a generic devicetree board file and a dtsi for boards >>>>> based on the MT6589 SoCs from Mediatek. >>>>> >>>>> Apart from the generic parts (gic, clocks) the only component >>>>> currently supported are the timers. >>>>> >>>>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> >>> >>> [...] >>> >>>>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >>>>> new file mode 100644 >>>>> index 0000000..c0139ca >>>>> --- /dev/null >>>>> +++ b/arch/arm/mach-mediatek/Kconfig >>>>> @@ -0,0 +1,14 @@ >>>>> +config ARCH_MEDIATEK >>>>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >>>>> + select ARCH_REQUIRE_GPIOLIB >>>> >>>> Then where is your GPIO driver? >>>> >>>>> + select ARM_GIC >>>>> + select CACHE_L2X0 >>>>> + select HAVE_ARM_TWD if LOCAL_TIMERS >>> >>> Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing >>> node). >> >> I considered this, but the timer wasn't able to get it's clock frequency: >> "Architected timer frequency not available >> Division by zero in kernel." > > This is because your bootloader/firmware is utterly broken, and doesn't > set CNTFRQ (it must be set on all CPUs, from secure mode). As a > *workaround*, you can set the timer frequency in the timer node, but > that's just a hack, and will prevent virtual machines from running on > such hardware. The last days I tried to get the ARM_ARCH_TIMER working, but I wasn't able to do so. I set the frequency in the DT node. But reading CNTP_TVAL at the end of arch_timer_init, it always returns the same value. When reading CNTPCT at the same place, returns zero. As far as I understand CNTPCT will be always incremented, am I right? Consequently, when calling mdelay in arch_timer_init the system hangs. So can it be, that the timers are not working due to a screwed up chip design? Or do I miss something here? > > M. > -- > Jazz is not dead. It just smells funny...
On 15/04/14 17:09, Matthias Brugger wrote: > 2014-04-11 11:43 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: >> On 11/04/14 10:11, Matthias Brugger wrote: >>> 2014-04-10 11:01 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: >>>> A couple of things on top of Rob's comments: >>>> >>>> On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: >>>>> On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: >>>>>> This adds a generic devicetree board file and a dtsi for boards >>>>>> based on the MT6589 SoCs from Mediatek. >>>>>> >>>>>> Apart from the generic parts (gic, clocks) the only component >>>>>> currently supported are the timers. >>>>>> >>>>>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> >>>> >>>> [...] >>>> >>>>>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >>>>>> new file mode 100644 >>>>>> index 0000000..c0139ca >>>>>> --- /dev/null >>>>>> +++ b/arch/arm/mach-mediatek/Kconfig >>>>>> @@ -0,0 +1,14 @@ >>>>>> +config ARCH_MEDIATEK >>>>>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >>>>>> + select ARCH_REQUIRE_GPIOLIB >>>>> >>>>> Then where is your GPIO driver? >>>>> >>>>>> + select ARM_GIC >>>>>> + select CACHE_L2X0 >>>>>> + select HAVE_ARM_TWD if LOCAL_TIMERS >>>> >>>> Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing >>>> node). >>> >>> I considered this, but the timer wasn't able to get it's clock frequency: >>> "Architected timer frequency not available >>> Division by zero in kernel." >> >> This is because your bootloader/firmware is utterly broken, and doesn't >> set CNTFRQ (it must be set on all CPUs, from secure mode). As a >> *workaround*, you can set the timer frequency in the timer node, but >> that's just a hack, and will prevent virtual machines from running on >> such hardware. > > The last days I tried to get the ARM_ARCH_TIMER working, but I wasn't > able to do so. > I set the frequency in the DT node. > But reading CNTP_TVAL at the end of arch_timer_init, it always returns > the same value. > When reading CNTPCT at the same place, returns zero. > As far as I understand CNTPCT will be always incremented, am I right? > > Consequently, when calling mdelay in arch_timer_init the system hangs. > > So can it be, that the timers are not working due to a screwed up chip > design? Or do I miss something here? That would indicate that the clock that feeds into the timer is gated. Other SoC vendors have done the same thing. Do you have access to documentation describing the clock tree? Of course, a broken design is always possible, but let's not think of the worse just yet... ;-) Thanks, M.
2014-04-15 18:40 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: > On 15/04/14 17:09, Matthias Brugger wrote: >> 2014-04-11 11:43 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: >>> On 11/04/14 10:11, Matthias Brugger wrote: >>>> 2014-04-10 11:01 GMT+02:00 Marc Zyngier <marc.zyngier@arm.com>: >>>>> A couple of things on top of Rob's comments: >>>>> >>>>> On Wed, Apr 09 2014 at 10:50:33 pm BST, Rob Herring <robherring2@gmail.com> wrote: >>>>>> On Wed, Apr 9, 2014 at 2:45 PM, Matthias Brugger <matthias.bgg@gmail.com> wrote: >>>>>>> This adds a generic devicetree board file and a dtsi for boards >>>>>>> based on the MT6589 SoCs from Mediatek. >>>>>>> >>>>>>> Apart from the generic parts (gic, clocks) the only component >>>>>>> currently supported are the timers. >>>>>>> >>>>>>> Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> >>>>> >>>>> [...] >>>>> >>>>>>> diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig >>>>>>> new file mode 100644 >>>>>>> index 0000000..c0139ca >>>>>>> --- /dev/null >>>>>>> +++ b/arch/arm/mach-mediatek/Kconfig >>>>>>> @@ -0,0 +1,14 @@ >>>>>>> +config ARCH_MEDIATEK >>>>>>> + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 >>>>>>> + select ARCH_REQUIRE_GPIOLIB >>>>>> >>>>>> Then where is your GPIO driver? >>>>>> >>>>>>> + select ARM_GIC >>>>>>> + select CACHE_L2X0 >>>>>>> + select HAVE_ARM_TWD if LOCAL_TIMERS >>>>> >>>>> Hell no! ;-) ARM_ARCH_TIMER is the way (please also add the missing >>>>> node). >>>> >>>> I considered this, but the timer wasn't able to get it's clock frequency: >>>> "Architected timer frequency not available >>>> Division by zero in kernel." >>> >>> This is because your bootloader/firmware is utterly broken, and doesn't >>> set CNTFRQ (it must be set on all CPUs, from secure mode). As a >>> *workaround*, you can set the timer frequency in the timer node, but >>> that's just a hack, and will prevent virtual machines from running on >>> such hardware. >> >> The last days I tried to get the ARM_ARCH_TIMER working, but I wasn't >> able to do so. >> I set the frequency in the DT node. >> But reading CNTP_TVAL at the end of arch_timer_init, it always returns >> the same value. >> When reading CNTPCT at the same place, returns zero. >> As far as I understand CNTPCT will be always incremented, am I right? >> >> Consequently, when calling mdelay in arch_timer_init the system hangs. >> >> So can it be, that the timers are not working due to a screwed up chip >> design? Or do I miss something here? > > That would indicate that the clock that feeds into the timer is gated. > Other SoC vendors have done the same thing. Do you have access to > documentation describing the clock tree? > > Of course, a broken design is always possible, but let's not think of > the worse just yet... ;-) The clock tree documentation is really spare but I tried to made some changes to the registers which controls the clock gates and the DCMs. But with no luck. So for me it looks like a broken design :( It looks like we need the global timer from mediatek. I will try to update the patch series with the comments given and send a v2 the next days. > > Thanks, > > M. > -- > Jazz is not dead. It just smells funny...
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt index 0f01c9b..af48801 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.txt +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt @@ -67,6 +67,7 @@ linux Linux-specific binding lsi LSI Corp. (LSI Logic) marvell Marvell Technology Group Ltd. maxim Maxim Integrated Products +mediatek MediaTek Inc. microchip Microchip Technology Inc. mosaixtech Mosaix Technologies, Inc. moxa Moxa diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5db05f6a..04d46ec 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -995,6 +995,8 @@ source "arch/arm/mach-mv78xx0/Kconfig" source "arch/arm/mach-imx/Kconfig" +source "arch/arm/mach-mediatek/Kconfig" + source "arch/arm/mach-mxs/Kconfig" source "arch/arm/mach-netx/Kconfig" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 41c1931..8ce9774 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -170,6 +170,7 @@ machine-$(CONFIG_ARCH_MSM) += msm machine-$(CONFIG_ARCH_MV78XX0) += mv78xx0 machine-$(CONFIG_ARCH_MVEBU) += mvebu machine-$(CONFIG_ARCH_MXC) += imx +machine-$(CONFIG_ARCH_MEDIATEK) += mediatek machine-$(CONFIG_ARCH_MXS) += mxs machine-$(CONFIG_ARCH_NETX) += netx machine-$(CONFIG_ARCH_NOMADIK) += nomadik diff --git a/arch/arm/boot/dts/mtk6589.dtsi b/arch/arm/boot/dts/mtk6589.dtsi new file mode 100644 index 0000000..6dbb74f --- /dev/null +++ b/arch/arm/boot/dts/mtk6589.dtsi @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2014 MundoReader S.L. + * Author: Matthias Brugger <matthias.bgg@gmail.com> + * + * 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. + */ + +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/interrupt-controller/arm-gic.h> +#include "skeleton.dtsi" + +/ { + compatible = "mediatek,mt6589"; + interrupt-parent = <&gic>; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + next-level-cache = <&L2>; + reg = <0x0>; + }; + cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + next-level-cache = <&L2>; + reg = <0x1>; + }; + cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + next-level-cache = <&L2>; + reg = <0x2>; + }; + cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a7"; + next-level-cache = <&L2>; + reg = <0x3>; + }; + + }; + + clocks { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + system_clk: system_clk { + compatible = "fixed-clock"; + clock-frequency = <13000000>; + #clock-cells = <0>; + clock-output-names = "system_clk"; + }; + + rtc_clk: rtc_clk { + compatible = "fixed-clock"; + clock-frequency = <32000>; + #clock-cells = <0>; + clock-output-names = "rtc_clk"; + }; + }; + + soc { + #address-cells = <1>; + #size-cells = <1>; + compatible = "simple-bus"; + clock-ranges; + ranges; + + gic: interrupt-controller@10212000 { + compatible = "arm,cortex-a9-gic"; + interrupt-controller; + #interrupt-cells = <3>; + reg = <0x10211000 0x1000>, + <0x10212000 0x1000>; + }; + + L2: l2-cache-controller@1020e000 { + compatible = "arm,pl310-cache"; + reg = <0x1020e000 0x1000>; + cache-unified; + cache-level = <2>; + }; + + timer: timer@10008000 { + compatible = "mediatek,mtk6589-timer"; + reg = <0x10008000 0x80>; + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>; + clocks = <&system_clk>, <&rtc_clk>; + clock-names = "sys_clk", "rtc_clk"; + }; + }; +}; diff --git a/arch/arm/mach-mediatek/Kconfig b/arch/arm/mach-mediatek/Kconfig new file mode 100644 index 0000000..c0139ca --- /dev/null +++ b/arch/arm/mach-mediatek/Kconfig @@ -0,0 +1,14 @@ +config ARCH_MEDIATEK + bool "Mediatek MT6589 SoC" if ARCH_MULTI_V7 + select ARCH_REQUIRE_GPIOLIB + select ARM_GIC + select CACHE_L2X0 + select HAVE_ARM_TWD if LOCAL_TIMERS + select HAVE_SMP + select LOCAL_TIMERS if SMP + select COMMON_CLK + select GENERIC_CLOCKEVENTS + select MTK_TIMER + select CLKSRC_MMIO + help + Support for Mediatek Cortex-A7 Quad-Core-SoC MT6589. diff --git a/arch/arm/mach-mediatek/Makefile b/arch/arm/mach-mediatek/Makefile new file mode 100644 index 0000000..43e619f --- /dev/null +++ b/arch/arm/mach-mediatek/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ARCH_MEDIATEK) += mediatek.o diff --git a/arch/arm/mach-mediatek/mediatek.c b/arch/arm/mach-mediatek/mediatek.c new file mode 100644 index 0000000..f630403 --- /dev/null +++ b/arch/arm/mach-mediatek/mediatek.c @@ -0,0 +1,40 @@ +/* + * Device Tree support for Mediatek SoCs + * + * Copyright (c) 2014 MundoReader S.L. + * Author: Matthias Brugger <matthias.bgg@gmail.com> + * + * 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. + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/of_platform.h> +#include <linux/irqchip.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/hardware/cache-l2x0.h> + +static void __init mediatek_dt_init(void) +{ + l2x0_of_init(0, ~0); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char * const mediatek_board_dt_compat[] = { + "mediatek,mt6589", + NULL, +}; + +DT_MACHINE_START(MEDIATEK_DT, "Mediatek Cortex-A7 (Device Tree)") + .init_machine = mediatek_dt_init, + .dt_compat = mediatek_board_dt_compat, +MACHINE_END
This adds a generic devicetree board file and a dtsi for boards based on the MT6589 SoCs from Mediatek. Apart from the generic parts (gic, clocks) the only component currently supported are the timers. Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com> --- .../devicetree/bindings/vendor-prefixes.txt | 1 + arch/arm/Kconfig | 2 + arch/arm/Makefile | 1 + arch/arm/boot/dts/mtk6589.dtsi | 105 ++++++++++++++++++++ arch/arm/mach-mediatek/Kconfig | 14 +++ arch/arm/mach-mediatek/Makefile | 1 + arch/arm/mach-mediatek/mediatek.c | 40 ++++++++ 7 files changed, 164 insertions(+) create mode 100644 arch/arm/boot/dts/mtk6589.dtsi create mode 100644 arch/arm/mach-mediatek/Kconfig create mode 100644 arch/arm/mach-mediatek/Makefile create mode 100644 arch/arm/mach-mediatek/mediatek.c