Commit 64ebda3a authored by Olof Johansson's avatar Olof Johansson

Merge tag 'arm/soc/for-4.4/rpi-dt-v2' of https://github.com/Broadcom/stblinux into next/dt

This pull request contains the DT changes for BCM2835 in 4.4.  It
pulls in clk/clk-bcm2835 (which Stephen Boyd has said would be stable)
because the DT changes to enable the clock driver need the driver
itself to be present. These changes include the following:

- Eric Anholt, moves the bcm2835 clock driver under bcm/ where it belongs with
  other Broadcom clock providers drivers, defines the binding for new clock
  driver, adds support for programming the BCM2835 audio domain, adds the DDC I2C
  controller to Device Tree, and finally migrates the Device Tree to use the new
  clock driver binding

- Lubomir Rintel adds support for the Raspberry Pi Model A+ and B revision 2, and
  remove the I2S controller which is non-existent on Raspberry Pi Model B

- Stefan Wahren adds an uart0 label for referencing the UART adapter

* tag 'arm/soc/for-4.4/rpi-dt-v2' of https://github.com/Broadcom/stblinux:
  ARM: bcm2835: Add the DDC I2C controller to the device tree.
  ARM: bcm2835: Switch to using the new clock driver support.
  ARM: bcm2835: dt: Add Raspberry Pi Model A+
  ARM: bcm2835: dt: Add Raspberry Pi Model B rev2
  ARM: bcm2835: dt: Raspberry Pi Model B had no I2S
  ARM: bcm2835: add label for uart0
  clk: bcm2835: Add support for programming the audio domain clocks
  clk: bcm2835: Add binding docs for the new platform clock driver.
  clk: bcm2835: Move under bcm/ with other Broadcom SoC clk drivers.
Signed-off-by: default avatarOlof Johansson <olof@lixom.net>
parents 5f760486 121432c7
Broadcom BCM2835 CPRMAN clocks
This binding uses the common clock binding:
Documentation/devicetree/bindings/clock/clock-bindings.txt
The CPRMAN clock controller generates clocks in the audio power domain
of the BCM2835. There is a level of PLLs deriving from an external
oscillator, a level of PLL dividers that produce channels off of the
few PLLs, and a level of mostly-generic clock generators sourcing from
the PLL channels. Most other hardware components source from the
clock generators, but a few (like the ARM or HDMI) will source from
the PLL dividers directly.
Required properties:
- compatible: Should be "brcm,bcm2835-cprman"
- #clock-cells: Should be <1>. The permitted clock-specifier values can be
found in include/dt-bindings/clock/bcm2835.h
- reg: Specifies base physical address and size of the registers
- clocks: The external oscillator clock phandle
Example:
clk_osc: clock@3 {
compatible = "fixed-clock";
reg = <3>;
#clock-cells = <0>;
clock-output-names = "osc";
clock-frequency = <19200000>;
};
clocks: cprman@7e101000 {
compatible = "brcm,bcm2835-cprman";
#clock-cells = <1>;
reg = <0x7e101000 0x2000>;
clocks = <&clk_osc>;
};
i2c0: i2c@7e205000 {
compatible = "brcm,bcm2835-i2c";
reg = <0x7e205000 0x1000>;
interrupts = <2 21>;
clocks = <&clocks BCM2835_CLOCK_VPU>;
#address-cells = <1>;
#size-cells = <0>;
};
...@@ -58,7 +58,9 @@ dtb-$(CONFIG_ARCH_AXXIA) += \ ...@@ -58,7 +58,9 @@ dtb-$(CONFIG_ARCH_AXXIA) += \
axm5516-amarillo.dtb axm5516-amarillo.dtb
dtb-$(CONFIG_ARCH_BCM2835) += \ dtb-$(CONFIG_ARCH_BCM2835) += \
bcm2835-rpi-b.dtb \ bcm2835-rpi-b.dtb \
bcm2835-rpi-b-plus.dtb bcm2835-rpi-b-rev2.dtb \
bcm2835-rpi-b-plus.dtb \
bcm2835-rpi-a-plus.dtb
dtb-$(CONFIG_ARCH_BCM_5301X) += \ dtb-$(CONFIG_ARCH_BCM_5301X) += \
bcm4708-asus-rt-ac56u.dtb \ bcm4708-asus-rt-ac56u.dtb \
bcm4708-asus-rt-ac68u.dtb \ bcm4708-asus-rt-ac68u.dtb \
......
/dts-v1/;
#include "bcm2835-rpi.dtsi"
/ {
compatible = "raspberrypi,model-a-plus", "brcm,bcm2835";
model = "Raspberry Pi Model A+";
leds {
act {
gpios = <&gpio 47 0>;
};
pwr {
label = "PWR";
gpios = <&gpio 35 0>;
default-state = "keep";
linux,default-trigger = "default-on";
};
};
};
&gpio {
pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
/* I2S interface */
i2s_alt0: i2s_alt0 {
brcm,pins = <18 19 20 21>;
brcm,function = <BCM2835_FSEL_ALT0>;
};
};
/dts-v1/;
#include "bcm2835-rpi.dtsi"
/ {
compatible = "raspberrypi,model-b-rev2", "brcm,bcm2835";
model = "Raspberry Pi Model B rev2";
leds {
act {
gpios = <&gpio 16 1>;
};
};
};
&gpio {
pinctrl-0 = <&gpioout &alt0 &i2s_alt2 &alt3>;
/* I2S interface */
i2s_alt2: i2s_alt2 {
brcm,pins = <28 29 30 31>;
brcm,function = <BCM2835_FSEL_ALT2>;
};
};
...@@ -13,11 +13,5 @@ act { ...@@ -13,11 +13,5 @@ act {
}; };
&gpio { &gpio {
pinctrl-0 = <&gpioout &alt0 &i2s_alt2 &alt3>; pinctrl-0 = <&gpioout &alt0 &alt3>;
/* I2S interface */
i2s_alt2: i2s_alt2 {
brcm,pins = <28 29 30 31>;
brcm,function = <BCM2835_FSEL_ALT2>;
};
}; };
...@@ -52,6 +52,10 @@ &i2c1 { ...@@ -52,6 +52,10 @@ &i2c1 {
clock-frequency = <100000>; clock-frequency = <100000>;
}; };
&i2c2 {
status = "okay";
};
&sdhci { &sdhci {
status = "okay"; status = "okay";
bus-width = <4>; bus-width = <4>;
......
#include <dt-bindings/pinctrl/bcm2835.h> #include <dt-bindings/pinctrl/bcm2835.h>
#include <dt-bindings/clock/bcm2835.h>
#include "skeleton.dtsi" #include "skeleton.dtsi"
/ { / {
...@@ -21,6 +22,10 @@ timer@7e003000 { ...@@ -21,6 +22,10 @@ timer@7e003000 {
compatible = "brcm,bcm2835-system-timer"; compatible = "brcm,bcm2835-system-timer";
reg = <0x7e003000 0x1000>; reg = <0x7e003000 0x1000>;
interrupts = <1 0>, <1 1>, <1 2>, <1 3>; interrupts = <1 0>, <1 1>, <1 2>, <1 3>;
/* This could be a reference to BCM2835_CLOCK_TIMER,
* but we don't have the driver using the common clock
* support yet.
*/
clock-frequency = <1000000>; clock-frequency = <1000000>;
}; };
...@@ -57,6 +62,17 @@ watchdog@7e100000 { ...@@ -57,6 +62,17 @@ watchdog@7e100000 {
reg = <0x7e100000 0x28>; reg = <0x7e100000 0x28>;
}; };
clocks: cprman@7e101000 {
compatible = "brcm,bcm2835-cprman";
#clock-cells = <1>;
reg = <0x7e101000 0x2000>;
/* CPRMAN derives everything from the platform's
* oscillator.
*/
clocks = <&clk_osc>;
};
rng@7e104000 { rng@7e104000 {
compatible = "brcm,bcm2835-rng"; compatible = "brcm,bcm2835-rng";
reg = <0x7e104000 0x10>; reg = <0x7e104000 0x10>;
...@@ -92,11 +108,13 @@ gpio: gpio@7e200000 { ...@@ -92,11 +108,13 @@ gpio: gpio@7e200000 {
#interrupt-cells = <2>; #interrupt-cells = <2>;
}; };
uart@7e201000 { uart0: uart@7e201000 {
compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell"; compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell";
reg = <0x7e201000 0x1000>; reg = <0x7e201000 0x1000>;
interrupts = <2 25>; interrupts = <2 25>;
clock-frequency = <3000000>; clocks = <&clocks BCM2835_CLOCK_UART>,
<&clocks BCM2835_CLOCK_VPU>;
clock-names = "uartclk", "apb_pclk";
arm,primecell-periphid = <0x00241011>; arm,primecell-periphid = <0x00241011>;
}; };
...@@ -115,7 +133,7 @@ spi: spi@7e204000 { ...@@ -115,7 +133,7 @@ spi: spi@7e204000 {
compatible = "brcm,bcm2835-spi"; compatible = "brcm,bcm2835-spi";
reg = <0x7e204000 0x1000>; reg = <0x7e204000 0x1000>;
interrupts = <2 22>; interrupts = <2 22>;
clocks = <&clk_spi>; clocks = <&clocks BCM2835_CLOCK_VPU>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
status = "disabled"; status = "disabled";
...@@ -125,7 +143,7 @@ i2c0: i2c@7e205000 { ...@@ -125,7 +143,7 @@ i2c0: i2c@7e205000 {
compatible = "brcm,bcm2835-i2c"; compatible = "brcm,bcm2835-i2c";
reg = <0x7e205000 0x1000>; reg = <0x7e205000 0x1000>;
interrupts = <2 21>; interrupts = <2 21>;
clocks = <&clk_i2c>; clocks = <&clocks BCM2835_CLOCK_VPU>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
status = "disabled"; status = "disabled";
...@@ -135,7 +153,7 @@ sdhci: sdhci@7e300000 { ...@@ -135,7 +153,7 @@ sdhci: sdhci@7e300000 {
compatible = "brcm,bcm2835-sdhci"; compatible = "brcm,bcm2835-sdhci";
reg = <0x7e300000 0x100>; reg = <0x7e300000 0x100>;
interrupts = <2 30>; interrupts = <2 30>;
clocks = <&clk_mmc>; clocks = <&clocks BCM2835_CLOCK_EMMC>;
status = "disabled"; status = "disabled";
}; };
...@@ -143,7 +161,17 @@ i2c1: i2c@7e804000 { ...@@ -143,7 +161,17 @@ i2c1: i2c@7e804000 {
compatible = "brcm,bcm2835-i2c"; compatible = "brcm,bcm2835-i2c";
reg = <0x7e804000 0x1000>; reg = <0x7e804000 0x1000>;
interrupts = <2 21>; interrupts = <2 21>;
clocks = <&clk_i2c>; clocks = <&clocks BCM2835_CLOCK_VPU>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled";
};
i2c2: i2c@7e805000 {
compatible = "brcm,bcm2835-i2c";
reg = <0x7e805000 0x1000>;
interrupts = <2 21>;
clocks = <&clocks BCM2835_CLOCK_VPU>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
status = "disabled"; status = "disabled";
...@@ -165,28 +193,14 @@ clocks { ...@@ -165,28 +193,14 @@ clocks {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clk_mmc: clock@0 { /* The oscillator is the root of the clock tree. */
clk_osc: clock@3 {
compatible = "fixed-clock"; compatible = "fixed-clock";
reg = <0>; reg = <3>;
#clock-cells = <0>; #clock-cells = <0>;
clock-output-names = "mmc"; clock-output-names = "osc";
clock-frequency = <100000000>; clock-frequency = <19200000>;
}; };
clk_i2c: clock@1 {
compatible = "fixed-clock";
reg = <1>;
#clock-cells = <0>;
clock-output-names = "i2c";
clock-frequency = <250000000>;
};
clk_spi: clock@2 {
compatible = "fixed-clock";
reg = <2>;
#clock-cells = <0>;
clock-output-names = "spi";
clock-frequency = <250000000>;
};
}; };
}; };
...@@ -19,7 +19,6 @@ endif ...@@ -19,7 +19,6 @@ endif
obj-$(CONFIG_MACH_ASM9260) += clk-asm9260.o obj-$(CONFIG_MACH_ASM9260) += clk-asm9260.o
obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN) += clk-axi-clkgen.o obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN) += clk-axi-clkgen.o
obj-$(CONFIG_ARCH_AXXIA) += clk-axm5516.o obj-$(CONFIG_ARCH_AXXIA) += clk-axm5516.o
obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835.o
obj-$(CONFIG_COMMON_CLK_CDCE706) += clk-cdce706.o obj-$(CONFIG_COMMON_CLK_CDCE706) += clk-cdce706.o
obj-$(CONFIG_ARCH_CLPS711X) += clk-clps711x.o obj-$(CONFIG_ARCH_CLPS711X) += clk-clps711x.o
obj-$(CONFIG_ARCH_EFM32) += clk-efm32gg.o obj-$(CONFIG_ARCH_EFM32) += clk-efm32gg.o
......
...@@ -3,4 +3,5 @@ obj-$(CONFIG_CLK_BCM_KONA) += clk-kona-setup.o ...@@ -3,4 +3,5 @@ obj-$(CONFIG_CLK_BCM_KONA) += clk-kona-setup.o
obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm281xx.o obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm281xx.o
obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm21664.o obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm21664.o
obj-$(CONFIG_COMMON_CLK_IPROC) += clk-iproc-armpll.o clk-iproc-pll.o clk-iproc-asiu.o obj-$(CONFIG_COMMON_CLK_IPROC) += clk-iproc-armpll.o clk-iproc-pll.o clk-iproc-asiu.o
obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835.o
obj-$(CONFIG_ARCH_BCM_CYGNUS) += clk-cygnus.o obj-$(CONFIG_ARCH_BCM_CYGNUS) += clk-cygnus.o
This diff is collapsed.
/*
* Copyright (C) 2010 Broadcom
* Copyright (C) 2012 Stephen Warren
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/clk-provider.h>
#include <linux/clkdev.h>
#include <linux/clk/bcm2835.h>
#include <linux/of.h>
/*
* These are fixed clocks. They're probably not all root clocks and it may
* be possible to turn them on and off but until this is mapped out better
* it's the only way they can be used.
*/
void __init bcm2835_init_clocks(void)
{
struct clk *clk;
int ret;
clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, CLK_IS_ROOT,
126000000);
if (IS_ERR(clk))
pr_err("apb_pclk not registered\n");
clk = clk_register_fixed_rate(NULL, "uart0_pclk", NULL, CLK_IS_ROOT,
3000000);
if (IS_ERR(clk))
pr_err("uart0_pclk not registered\n");
ret = clk_register_clkdev(clk, NULL, "20201000.uart");
if (ret)
pr_err("uart0_pclk alias not registered\n");
clk = clk_register_fixed_rate(NULL, "uart1_pclk", NULL, CLK_IS_ROOT,
125000000);
if (IS_ERR(clk))
pr_err("uart1_pclk not registered\n");
ret = clk_register_clkdev(clk, NULL, "20215000.uart");
if (ret)
pr_err("uart1_pclk alias not registered\n");
}
/*
* Copyright (C) 2015 Broadcom Corporation
*
* 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 version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#define BCM2835_PLLA 0
#define BCM2835_PLLB 1
#define BCM2835_PLLC 2
#define BCM2835_PLLD 3
#define BCM2835_PLLH 4
#define BCM2835_PLLA_CORE 5
#define BCM2835_PLLA_PER 6
#define BCM2835_PLLB_ARM 7
#define BCM2835_PLLC_CORE0 8
#define BCM2835_PLLC_CORE1 9
#define BCM2835_PLLC_CORE2 10
#define BCM2835_PLLC_PER 11
#define BCM2835_PLLD_CORE 12
#define BCM2835_PLLD_PER 13
#define BCM2835_PLLH_RCAL 14
#define BCM2835_PLLH_AUX 15
#define BCM2835_PLLH_PIX 16
#define BCM2835_CLOCK_TIMER 17
#define BCM2835_CLOCK_OTP 18
#define BCM2835_CLOCK_UART 19
#define BCM2835_CLOCK_VPU 20
#define BCM2835_CLOCK_V3D 21
#define BCM2835_CLOCK_ISP 22
#define BCM2835_CLOCK_H264 23
#define BCM2835_CLOCK_VEC 24
#define BCM2835_CLOCK_HSM 25
#define BCM2835_CLOCK_SDRAM 26
#define BCM2835_CLOCK_TSENS 27
#define BCM2835_CLOCK_EMMC 28
#define BCM2835_CLOCK_PERI_IMAGE 29
#define BCM2835_CLOCK_COUNT 30
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment