Merge branch 'next/soc' into next/dt
authorOlof Johansson <olof@lixom.net>
Tue, 5 Feb 2013 21:19:03 +0000 (13:19 -0800)
committerOlof Johansson <olof@lixom.net>
Tue, 5 Feb 2013 21:19:03 +0000 (13:19 -0800)
215 files changed:
Documentation/devicetree/bindings/arm/sirf.txt
Documentation/devicetree/bindings/arm/vt8500.txt
Documentation/devicetree/bindings/clock/imx31-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/nvidia,tegra30-car.txt [new file with mode: 0644]
Documentation/devicetree/bindings/usb/nvidia,tegra20-ehci.txt
Documentation/devicetree/bindings/usb/nvidia,tegra20-usb-phy.txt [new file with mode: 0644]
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/dove.dtsi
arch/arm/boot/dts/emev2.dtsi
arch/arm/boot/dts/imx31.dtsi
arch/arm/boot/dts/marco-evb.dts [new file with mode: 0644]
arch/arm/boot/dts/marco.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sh73a0-reference.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sh73a0.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tegra114-dalmore.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra114-pluto.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra114.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tegra20-harmony.dts
arch/arm/boot/dts/tegra20-paz00.dts
arch/arm/boot/dts/tegra20-seaboard.dts
arch/arm/boot/dts/tegra20-trimslice.dts
arch/arm/boot/dts/tegra20-ventana.dts
arch/arm/boot/dts/tegra20.dtsi
arch/arm/boot/dts/tegra30.dtsi
arch/arm/boot/dts/wm8850-w70v2.dts [new file with mode: 0644]
arch/arm/boot/dts/wm8850.dtsi [new file with mode: 0644]
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/kirkwood_defconfig
arch/arm/configs/mvebu_defconfig
arch/arm/configs/prima2_defconfig
arch/arm/include/asm/cputype.h
arch/arm/include/asm/smp_scu.h
arch/arm/include/debug/imx.S
arch/arm/include/debug/vt8500.S [new file with mode: 0644]
arch/arm/kernel/perf_event.c
arch/arm/kernel/perf_event_cpu.c
arch/arm/kernel/perf_event_v6.c
arch/arm/kernel/perf_event_v7.c
arch/arm/kernel/perf_event_xscale.c
arch/arm/mach-bcm2835/bcm2835.c
arch/arm/mach-davinci/board-da830-evm.c
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-davinci/board-mityomapl138.c
arch/arm/mach-davinci/clock.c
arch/arm/mach-davinci/clock.h
arch/arm/mach-davinci/da850.c
arch/arm/mach-davinci/devices-da8xx.c
arch/arm/mach-davinci/include/mach/clock.h
arch/arm/mach-davinci/include/mach/da8xx.h
arch/arm/mach-davinci/include/mach/psc.h
arch/arm/mach-davinci/psc.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/Makefile.boot
arch/arm/mach-imx/clk-imx27.c
arch/arm/mach-imx/clk-imx31.c
arch/arm/mach-imx/clk-imx35.c
arch/arm/mach-imx/clk-imx6q.c
arch/arm/mach-imx/common.h
arch/arm/mach-imx/cpu-imx5.c
arch/arm/mach-imx/cpuidle-imx6q.c [new file with mode: 0644]
arch/arm/mach-imx/cpuidle.h
arch/arm/mach-imx/devices-imx50.h [deleted file]
arch/arm/mach-imx/devices/Kconfig
arch/arm/mach-imx/devices/platform-fec.c
arch/arm/mach-imx/devices/platform-imx-i2c.c
arch/arm/mach-imx/devices/platform-imx-uart.c
arch/arm/mach-imx/gpc.c
arch/arm/mach-imx/hardware.h
arch/arm/mach-imx/imx31-dt.c
arch/arm/mach-imx/iomux-mx50.h [deleted file]
arch/arm/mach-imx/lluart.c [deleted file]
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-imx/mach-mx50_rdp.c [deleted file]
arch/arm/mach-imx/mach-mx51_3ds.c [deleted file]
arch/arm/mach-imx/mm-imx5.c
arch/arm/mach-imx/mx50.h [deleted file]
arch/arm/mach-imx/mxc.h
arch/arm/mach-imx/platsmp.c
arch/arm/mach-imx/pm-imx5.c
arch/arm/mach-imx/time.c
arch/arm/mach-kirkwood/Makefile
arch/arm/mach-kirkwood/board-dt.c
arch/arm/mach-kirkwood/common.c
arch/arm/mach-kirkwood/common.h
arch/arm/mach-kirkwood/cpuidle.c [deleted file]
arch/arm/mach-kirkwood/include/mach/kirkwood.h
arch/arm/mach-kirkwood/pcie.c
arch/arm/mach-omap2/omap-smp.c
arch/arm/mach-omap2/omap44xx.h
arch/arm/mach-prima2/Kconfig
arch/arm/mach-prima2/Makefile
arch/arm/mach-prima2/common.c
arch/arm/mach-prima2/common.h
arch/arm/mach-prima2/headsmp.S [new file with mode: 0644]
arch/arm/mach-prima2/hotplug.c [new file with mode: 0644]
arch/arm/mach-prima2/include/mach/irqs.h
arch/arm/mach-prima2/include/mach/uart.h
arch/arm/mach-prima2/include/mach/uncompress.h
arch/arm/mach-prima2/irq.c
arch/arm/mach-prima2/l2x0.c
arch/arm/mach-prima2/platsmp.c [new file with mode: 0644]
arch/arm/mach-prima2/rstc.c
arch/arm/mach-prima2/rtciobrg.c
arch/arm/mach-prima2/timer-marco.c [new file with mode: 0644]
arch/arm/mach-prima2/timer-prima2.c [new file with mode: 0644]
arch/arm/mach-prima2/timer.c [deleted file]
arch/arm/mach-shmobile/Makefile
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/clock-r8a7740.c
arch/arm/mach-shmobile/clock-r8a7779.c
arch/arm/mach-shmobile/clock-sh7372.c
arch/arm/mach-shmobile/clock-sh73a0.c
arch/arm/mach-shmobile/headsmp-sh73a0.S [new file with mode: 0644]
arch/arm/mach-shmobile/hotplug.c
arch/arm/mach-shmobile/include/mach/common.h
arch/arm/mach-shmobile/intc-sh73a0.c
arch/arm/mach-shmobile/pm-r8a7740.c
arch/arm/mach-shmobile/pm-sh73a0.c [new file with mode: 0644]
arch/arm/mach-shmobile/setup-r8a7740.c
arch/arm/mach-shmobile/setup-r8a7779.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-shmobile/sleep-sh7372.S
arch/arm/mach-shmobile/smp-sh73a0.c
arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/apbio.c
arch/arm/mach-tegra/board-dt-tegra114.c [new file with mode: 0644]
arch/arm/mach-tegra/board-dt-tegra20.c
arch/arm/mach-tegra/board-dt-tegra30.c
arch/arm/mach-tegra/board.h
arch/arm/mach-tegra/clock.c [deleted file]
arch/arm/mach-tegra/clock.h [deleted file]
arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/common.h
arch/arm/mach-tegra/cpu-tegra.c
arch/arm/mach-tegra/cpuidle-tegra114.c [new file with mode: 0644]
arch/arm/mach-tegra/cpuidle-tegra20.c
arch/arm/mach-tegra/cpuidle-tegra30.c
arch/arm/mach-tegra/cpuidle.c
arch/arm/mach-tegra/cpuidle.h
arch/arm/mach-tegra/flowctrl.c
arch/arm/mach-tegra/flowctrl.h
arch/arm/mach-tegra/fuse.c
arch/arm/mach-tegra/fuse.h
arch/arm/mach-tegra/headsmp.S
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/include/mach/clk.h [deleted file]
arch/arm/mach-tegra/iomap.h
arch/arm/mach-tegra/irq.c
arch/arm/mach-tegra/irq.h [new file with mode: 0644]
arch/arm/mach-tegra/pcie.c
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-tegra/pm.c
arch/arm/mach-tegra/powergate.c
arch/arm/mach-tegra/reset-handler.S [new file with mode: 0644]
arch/arm/mach-tegra/reset.c
arch/arm/mach-tegra/sleep-tegra20.S
arch/arm/mach-tegra/sleep-tegra30.S
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.h
arch/arm/mach-tegra/tegra20_clocks.c [deleted file]
arch/arm/mach-tegra/tegra20_clocks.h [deleted file]
arch/arm/mach-tegra/tegra20_clocks_data.c [deleted file]
arch/arm/mach-tegra/tegra30_clocks.c [deleted file]
arch/arm/mach-tegra/tegra30_clocks.h [deleted file]
arch/arm/mach-tegra/tegra30_clocks_data.c [deleted file]
arch/arm/mach-tegra/tegra_cpu_car.h [deleted file]
arch/arm/mach-tegra/timer.c [deleted file]
arch/arm/mach-vt8500/Kconfig
arch/arm/mach-vt8500/include/mach/debug-macro.S [deleted file]
arch/arm/mach-vt8500/include/mach/timex.h [deleted file]
arch/arm/mach-vt8500/include/mach/uncompress.h [deleted file]
arch/arm/mach-vt8500/vt8500.c
arch/arm/plat-orion/mpp.c
drivers/clk/Makefile
drivers/clk/clk-bcm2835.c
drivers/clk/tegra/Makefile [new file with mode: 0644]
drivers/clk/tegra/clk-audio-sync.c [new file with mode: 0644]
drivers/clk/tegra/clk-divider.c [new file with mode: 0644]
drivers/clk/tegra/clk-periph-gate.c [new file with mode: 0644]
drivers/clk/tegra/clk-periph.c [new file with mode: 0644]
drivers/clk/tegra/clk-pll-out.c [new file with mode: 0644]
drivers/clk/tegra/clk-pll.c [new file with mode: 0644]
drivers/clk/tegra/clk-super.c [new file with mode: 0644]
drivers/clk/tegra/clk-tegra20.c [new file with mode: 0644]
drivers/clk/tegra/clk-tegra30.c [new file with mode: 0644]
drivers/clk/tegra/clk.c [new file with mode: 0644]
drivers/clk/tegra/clk.h [new file with mode: 0644]
drivers/clocksource/Makefile
drivers/clocksource/tegra20_timer.c [new file with mode: 0644]
drivers/cpuidle/Kconfig
drivers/cpuidle/Makefile
drivers/cpuidle/cpuidle-kirkwood.c [new file with mode: 0644]
drivers/dma/tegra20-apb-dma.c
drivers/gpu/drm/tegra/dc.c
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/tegra/hdmi.c
drivers/i2c/busses/i2c-tegra.c
drivers/input/keyboard/tegra-kbc.c
drivers/rtc/Kconfig
drivers/spi/spi-tegra20-sflash.c
drivers/spi/spi-tegra20-slink.c
drivers/staging/nvec/TODO
drivers/staging/nvec/nvec.c
drivers/usb/host/ehci-tegra.c
drivers/usb/phy/tegra_usb_phy.c
include/linux/clk/tegra.h [new file with mode: 0644]
include/linux/tegra-soc.h [new file with mode: 0644]
include/linux/usb/tegra_usb_phy.h
sound/soc/tegra/tegra30_ahub.c

index 1881e1c6dda59aea8d1c0076a70481eaec3a59fd..c6ba6d3c747fda7947a0e9263fa6f4ed7a73c341 100644 (file)
@@ -1,3 +1,9 @@
-prima2 "cb" evaluation board
+CSR SiRFprimaII and SiRFmarco device tree bindings.
+========================================
+
 Required root node properties:
-    - compatible = "sirf,prima2-cb", "sirf,prima2";
+    - compatible:
+    - "sirf,prima2-cb" : prima2 "cb" evaluation board
+    - "sirf,marco-cb" : marco "cb" evaluation board
+    - "sirf,prima2" : prima2 device based board
+    - "sirf,marco" : marco device based board
index d657832c6819e167e1b757ab43e12839b70aa569..87dc1ddf47709ff4b46bf9f8fa5a078f482941d4 100644 (file)
@@ -12,3 +12,11 @@ compatible = "wm,wm8505";
 Boards with the Wondermedia WM8650 SoC shall have the following properties:
 Required root node property:
 compatible = "wm,wm8650";
+
+Boards with the Wondermedia WM8750 SoC shall have the following properties:
+Required root node property:
+compatible = "wm,wm8750";
+
+Boards with the Wondermedia WM8850 SoC shall have the following properties:
+Required root node property:
+compatible = "wm,wm8850";
diff --git a/Documentation/devicetree/bindings/clock/imx31-clock.txt b/Documentation/devicetree/bindings/clock/imx31-clock.txt
new file mode 100644 (file)
index 0000000..19df842
--- /dev/null
@@ -0,0 +1,91 @@
+* Clock bindings for Freescale i.MX31
+
+Required properties:
+- compatible: Should be "fsl,imx31-ccm"
+- reg: Address and length of the register set
+- interrupts: Should contain CCM interrupt
+- #clock-cells: Should be <1>
+
+The clock consumer should specify the desired clock by having the clock
+ID in its "clocks" phandle cell.  The following is a full list of i.MX31
+clocks and IDs.
+
+       Clock               ID
+       -----------------------
+       dummy                0
+       ckih                 1
+       ckil                 2
+       mpll                 3
+       spll                 4
+       upll                 5
+       mcu_main             6
+       hsp                  7
+       ahb                  8
+       nfc                  9
+       ipg                  10
+       per_div              11
+       per                  12
+       csi_sel              13
+       fir_sel              14
+       csi_div              15
+       usb_div_pre          16
+       usb_div_post         17
+       fir_div_pre          18
+       fir_div_post         19
+       sdhc1_gate           20
+       sdhc2_gate           21
+       gpt_gate             22
+       epit1_gate           23
+       epit2_gate           24
+       iim_gate             25
+       ata_gate             26
+       sdma_gate            27
+       cspi3_gate           28
+       rng_gate             29
+       uart1_gate           30
+       uart2_gate           31
+       ssi1_gate            32
+       i2c1_gate            33
+       i2c2_gate            34
+       i2c3_gate            35
+       hantro_gate          36
+       mstick1_gate         37
+       mstick2_gate         38
+       csi_gate             39
+       rtc_gate             40
+       wdog_gate            41
+       pwm_gate             42
+       sim_gate             43
+       ect_gate             44
+       usb_gate             45
+       kpp_gate             46
+       ipu_gate             47
+       uart3_gate           48
+       uart4_gate           49
+       uart5_gate           50
+       owire_gate           51
+       ssi2_gate            52
+       cspi1_gate           53
+       cspi2_gate           54
+       gacc_gate            55
+       emi_gate             56
+       rtic_gate            57
+       firi_gate            58
+
+Examples:
+
+clks: ccm@53f80000{
+       compatible = "fsl,imx31-ccm";
+       reg = <0x53f80000 0x4000>;
+       interrupts = <0 31 0x04 0 53 0x04>;
+       #clock-cells = <1>;
+};
+
+uart1: serial@43f90000 {
+       compatible = "fsl,imx31-uart", "fsl,imx21-uart";
+       reg = <0x43f90000 0x4000>;
+       interrupts = <45>;
+       clocks = <&clks 10>, <&clks 30>;
+       clock-names = "ipg", "per";
+       status = "disabled";
+};
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra20-car.txt
new file mode 100644 (file)
index 0000000..0921fac
--- /dev/null
@@ -0,0 +1,205 @@
+NVIDIA Tegra20 Clock And Reset Controller
+
+This binding uses the common clock binding:
+Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
+for muxing and gating Tegra's clocks, and setting their rates.
+
+Required properties :
+- compatible : Should be "nvidia,tegra20-car"
+- reg : Should contain CAR registers location and length
+- clocks : Should contain phandle and clock specifiers for two clocks:
+  the 32 KHz "32k_in", and the board-specific oscillator "osc".
+- #clock-cells : Should be 1.
+  In clock consumers, this cell represents the clock ID exposed by the CAR.
+
+  The first 96 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB
+  registers. These IDs often match those in the CAR's RST_DEVICES registers,
+  but not in all cases. Some bits in CLK_OUT_ENB affect multiple clocks. In
+  this case, those clocks are assigned IDs above 95 in order to highlight
+  this issue. Implementations that interpret these clock IDs as bit values
+  within the CLK_OUT_ENB or RST_DEVICES registers should be careful to
+  explicitly handle these special cases.
+
+  The balance of the clocks controlled by the CAR are assigned IDs of 96 and
+  above.
+
+  0    cpu
+  1    unassigned
+  2    unassigned
+  3    ac97
+  4    rtc
+  5    tmr
+  6    uart1
+  7    unassigned      (register bit affects uart2 and vfir)
+  8    gpio
+  9    sdmmc2
+  10   unassigned      (register bit affects spdif_in and spdif_out)
+  11   i2s1
+  12   i2c1
+  13   ndflash
+  14   sdmmc1
+  15   sdmmc4
+  16   twc
+  17   pwm
+  18   i2s2
+  19   epp
+  20   unassigned      (register bit affects vi and vi_sensor)
+  21   2d
+  22   usbd
+  23   isp
+  24   3d
+  25   ide
+  26   disp2
+  27   disp1
+  28   host1x
+  29   vcp
+  30   unassigned
+  31   cache2
+
+  32   mem
+  33   ahbdma
+  34   apbdma
+  35   unassigned
+  36   kbc
+  37   stat_mon
+  38   pmc
+  39   fuse
+  40   kfuse
+  41   sbc1
+  42   snor
+  43   spi1
+  44   sbc2
+  45   xio
+  46   sbc3
+  47   dvc
+  48   dsi
+  49   unassigned      (register bit affects tvo and cve)
+  50   mipi
+  51   hdmi
+  52   csi
+  53   tvdac
+  54   i2c2
+  55   uart3
+  56   unassigned
+  57   emc
+  58   usb2
+  59   usb3
+  60   mpe
+  61   vde
+  62   bsea
+  63   bsev
+
+  64   speedo
+  65   uart4
+  66   uart5
+  67   i2c3
+  68   sbc4
+  69   sdmmc3
+  70   pcie
+  71   owr
+  72   afi
+  73   csite
+  74   unassigned
+  75   avpucq
+  76   la
+  77   unassigned
+  78   unassigned
+  79   unassigned
+  80   unassigned
+  81   unassigned
+  82   unassigned
+  83   unassigned
+  84   irama
+  85   iramb
+  86   iramc
+  87   iramd
+  88   cram2
+  89   audio_2x        a/k/a audio_2x_sync_clk
+  90   clk_d
+  91   unassigned
+  92   sus
+  93   cdev1
+  94   cdev2
+  95   unassigned
+
+  96   uart2
+  97   vfir
+  98   spdif_in
+  99   spdif_out
+  100  vi
+  101  vi_sensor
+  102  tvo
+  103  cve
+  104  osc
+  105  clk_32k         a/k/a clk_s
+  106  clk_m
+  107  sclk
+  108  cclk
+  109  hclk
+  110  pclk
+  111  blink
+  112  pll_a
+  113  pll_a_out0
+  114  pll_c
+  115  pll_c_out1
+  116  pll_d
+  117  pll_d_out0
+  118  pll_e
+  119  pll_m
+  120  pll_m_out1
+  121  pll_p
+  122  pll_p_out1
+  123  pll_p_out2
+  124  pll_p_out3
+  125  pll_p_out4
+  126  pll_s
+  127  pll_u
+  128  pll_x
+  129  cop             a/k/a avp
+  130  audio           a/k/a audio_sync_clk
+  131  pll_ref
+  132  twd
+
+Example SoC include file:
+
+/ {
+       tegra_car: clock {
+               compatible = "nvidia,tegra20-car";
+               reg = <0x60006000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       usb@c5004000 {
+               clocks = <&tegra_car 58>; /* usb2 */
+       };
+};
+
+Example board file:
+
+/ {
+       clocks {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               osc: clock@0 {
+                       compatible = "fixed-clock";
+                       reg = <0>;
+                       #clock-cells = <0>;
+                       clock-frequency = <12000000>;
+               };
+
+               clk_32k: clock@1 {
+                       compatible = "fixed-clock";
+                       reg = <1>;
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+               };
+       };
+
+       &tegra_car {
+               clocks = <&clk_32k> <&osc>;
+       };
+};
diff --git a/Documentation/devicetree/bindings/clock/nvidia,tegra30-car.txt b/Documentation/devicetree/bindings/clock/nvidia,tegra30-car.txt
new file mode 100644 (file)
index 0000000..f3da3be
--- /dev/null
@@ -0,0 +1,262 @@
+NVIDIA Tegra30 Clock And Reset Controller
+
+This binding uses the common clock binding:
+Documentation/devicetree/bindings/clock/clock-bindings.txt
+
+The CAR (Clock And Reset) Controller on Tegra is the HW module responsible
+for muxing and gating Tegra's clocks, and setting their rates.
+
+Required properties :
+- compatible : Should be "nvidia,tegra30-car"
+- reg : Should contain CAR registers location and length
+- clocks : Should contain phandle and clock specifiers for two clocks:
+  the 32 KHz "32k_in", and the board-specific oscillator "osc".
+- #clock-cells : Should be 1.
+  In clock consumers, this cell represents the clock ID exposed by the CAR.
+
+  The first 130 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB
+  registers. These IDs often match those in the CAR's RST_DEVICES registers,
+  but not in all cases. Some bits in CLK_OUT_ENB affect multiple clocks. In
+  this case, those clocks are assigned IDs above 160 in order to highlight
+  this issue. Implementations that interpret these clock IDs as bit values
+  within the CLK_OUT_ENB or RST_DEVICES registers should be careful to
+  explicitly handle these special cases.
+
+  The balance of the clocks controlled by the CAR are assigned IDs of 160 and
+  above.
+
+  0    cpu
+  1    unassigned
+  2    unassigned
+  3    unassigned
+  4    rtc
+  5    timer
+  6    uarta
+  7    unassigned      (register bit affects uartb and vfir)
+  8    gpio
+  9    sdmmc2
+  10   unassigned      (register bit affects spdif_in and spdif_out)
+  11   i2s1
+  12   i2c1
+  13   ndflash
+  14   sdmmc1
+  15   sdmmc4
+  16   unassigned
+  17   pwm
+  18   i2s2
+  19   epp
+  20   unassigned      (register bit affects vi and vi_sensor)
+  21   2d
+  22   usbd
+  23   isp
+  24   3d
+  25   unassigned
+  26   disp2
+  27   disp1
+  28   host1x
+  29   vcp
+  30   i2s0
+  31   cop_cache
+
+  32   mc
+  33   ahbdma
+  34   apbdma
+  35   unassigned
+  36   kbc
+  37   statmon
+  38   pmc
+  39   unassigned      (register bit affects fuse and fuse_burn)
+  40   kfuse
+  41   sbc1
+  42   nor
+  43   unassigned
+  44   sbc2
+  45   unassigned
+  46   sbc3
+  47   i2c5
+  48   dsia
+  49   unassigned      (register bit affects cve and tvo)
+  50   mipi
+  51   hdmi
+  52   csi
+  53   tvdac
+  54   i2c2
+  55   uartc
+  56   unassigned
+  57   emc
+  58   usb2
+  59   usb3
+  60   mpe
+  61   vde
+  62   bsea
+  63   bsev
+
+  64   speedo
+  65   uartd
+  66   uarte
+  67   i2c3
+  68   sbc4
+  69   sdmmc3
+  70   pcie
+  71   owr
+  72   afi
+  73   csite
+  74   pciex
+  75   avpucq
+  76   la
+  77   unassigned
+  78   unassigned
+  79   dtv
+  80   ndspeed
+  81   i2cslow
+  82   dsib
+  83   unassigned
+  84   irama
+  85   iramb
+  86   iramc
+  87   iramd
+  88   cram2
+  89   unassigned
+  90   audio_2x        a/k/a audio_2x_sync_clk
+  91   unassigned
+  92   csus
+  93   cdev2
+  94   cdev1
+  95   unassigned
+
+  96   cpu_g
+  97   cpu_lp
+  98   3d2
+  99   mselect
+  100  tsensor
+  101  i2s3
+  102  i2s4
+  103  i2c4
+  104  sbc5
+  105  sbc6
+  106  d_audio
+  107  apbif
+  108  dam0
+  109  dam1
+  110  dam2
+  111  hda2codec_2x
+  112  atomics
+  113  audio0_2x
+  114  audio1_2x
+  115  audio2_2x
+  116  audio3_2x
+  117  audio4_2x
+  118  audio5_2x
+  119  actmon
+  120  extern1
+  121  extern2
+  122  extern3
+  123  sata_oob
+  124  sata
+  125  hda
+  127  se
+  128  hda2hdmi
+  129  sata_cold
+
+  160  uartb
+  161  vfir
+  162  spdif_in
+  163  spdif_out
+  164  vi
+  165  vi_sensor
+  166  fuse
+  167  fuse_burn
+  168  cve
+  169  tvo
+
+  170  clk_32k
+  171  clk_m
+  172  clk_m_div2
+  173  clk_m_div4
+  174  pll_ref
+  175  pll_c
+  176  pll_c_out1
+  177  pll_m
+  178  pll_m_out1
+  179  pll_p
+  180  pll_p_out1
+  181  pll_p_out2
+  182  pll_p_out3
+  183  pll_p_out4
+  184  pll_a
+  185  pll_a_out0
+  186  pll_d
+  187  pll_d_out0
+  188  pll_d2
+  189  pll_d2_out0
+  190  pll_u
+  191  pll_x
+  192  pll_x_out0
+  193  pll_e
+  194  spdif_in_sync
+  195  i2s0_sync
+  196  i2s1_sync
+  197  i2s2_sync
+  198  i2s3_sync
+  199  i2s4_sync
+  200  vimclk
+  201  audio0
+  202  audio1
+  203  audio2
+  204  audio3
+  205  audio4
+  206  audio5
+  207  clk_out_1 (extern1)
+  208  clk_out_2 (extern2)
+  209  clk_out_3 (extern3)
+  210  sclk
+  211  blink
+  212  cclk_g
+  213  cclk_lp
+  214  twd
+  215  cml0
+  216  cml1
+  217  hclk
+  218  pclk
+
+Example SoC include file:
+
+/ {
+       tegra_car: clock {
+               compatible = "nvidia,tegra30-car";
+               reg = <0x60006000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       usb@c5004000 {
+               clocks = <&tegra_car 58>; /* usb2 */
+       };
+};
+
+Example board file:
+
+/ {
+       clocks {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               osc: clock@0 {
+                       compatible = "fixed-clock";
+                       reg = <0>;
+                       #clock-cells = <0>;
+                       clock-frequency = <12000000>;
+               };
+
+               clk_32k: clock@1 {
+                       compatible = "fixed-clock";
+                       reg = <1>;
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+               };
+       };
+
+       &tegra_car {
+               clocks = <&clk_32k> <&osc>;
+       };
+};
index e9b005dc762538073f553cf6a0af0f964017e7e0..34c952883276c32d46cc7643f4e90a482707102b 100644 (file)
@@ -11,6 +11,7 @@ Required properties :
  - phy_type : Should be one of "ulpi" or "utmi".
  - nvidia,vbus-gpio : If present, specifies a gpio that needs to be
    activated for the bus to be powered.
+ - nvidia,phy : phandle of the PHY instance, the controller is connected to.
 
 Required properties for phy_type == ulpi:
   - nvidia,phy-reset-gpio : The GPIO used to reset the PHY.
@@ -27,3 +28,5 @@ Optional properties:
     registers are accessed through the APB_MISC base address instead of
     the USB controller. Since this is a legacy issue it probably does not
     warrant a compatible string of its own.
+  - nvidia,needs-double-reset : boolean is to be set for some of the Tegra2
+    USB ports, which need reset twice due to hardware issues.
diff --git a/Documentation/devicetree/bindings/usb/nvidia,tegra20-usb-phy.txt b/Documentation/devicetree/bindings/usb/nvidia,tegra20-usb-phy.txt
new file mode 100644 (file)
index 0000000..6bdaba2
--- /dev/null
@@ -0,0 +1,17 @@
+Tegra SOC USB PHY
+
+The device node for Tegra SOC USB PHY:
+
+Required properties :
+ - compatible : Should be "nvidia,tegra20-usb-phy".
+ - reg : Address and length of the register set for the USB PHY interface.
+ - phy_type : Should be one of "ulpi" or "utmi".
+
+Required properties for phy_type == ulpi:
+  - nvidia,phy-reset-gpio : The GPIO used to reset the PHY.
+
+Optional properties:
+  - nvidia,has-legacy-mode : boolean indicates whether this controller can
+    operate in legacy mode (as APX 2500 / 2600). In legacy mode some
+    registers are accessed through the APB_MISC base address instead of
+    the USB controller.
\ No newline at end of file
index 42ee64e68c438a57a4ac3d5557b73c8528bc61f6..b70ee954f69fb4d0038c585268fe6a9f099537fb 100644 (file)
@@ -393,6 +393,7 @@ config ARCH_GEMINI
 config ARCH_SIRF
        bool "CSR SiRF"
        select ARCH_REQUIRE_GPIOLIB
+       select AUTO_ZRELADDR
        select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select GENERIC_IRQ_CHIP
@@ -642,6 +643,7 @@ config ARCH_TEGRA
        select ARCH_HAS_CPUFREQ
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
+       select CLKSRC_OF
        select COMMON_CLK
        select GENERIC_CLOCKEVENTS
        select GENERIC_GPIO
@@ -951,22 +953,6 @@ config ARCH_OMAP
        help
          Support for TI's OMAP platform (OMAP1/2/3/4).
 
-config ARCH_VT8500_SINGLE
-       bool "VIA/WonderMedia 85xx"
-       select ARCH_HAS_CPUFREQ
-       select ARCH_REQUIRE_GPIOLIB
-       select CLKDEV_LOOKUP
-       select COMMON_CLK
-       select CPU_ARM926T
-       select GENERIC_CLOCKEVENTS
-       select GENERIC_GPIO
-       select HAVE_CLK
-       select MULTI_IRQ_HANDLER
-       select SPARSE_IRQ
-       select USE_OF
-       help
-         Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
-
 endchoice
 
 menu "Multiple platform selection"
index 661030d6bc6c3d10f3ca35f6b8125d21adac7389..0cc8e3652b0eb566adfe7f8a470b16b6b2c11c43 100644 (file)
@@ -219,12 +219,12 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on i.MX51.
 
-       config DEBUG_IMX50_IMX53_UART
-               bool "i.MX50 and i.MX53 Debug UART"
-               depends on SOC_IMX50 || SOC_IMX53
+       config DEBUG_IMX53_UART
+               bool "i.MX53 Debug UART"
+               depends on SOC_IMX53
                help
                  Say Y here if you want kernel low-level debugging support
-                 on i.MX50 or i.MX53.
+                 on i.MX53.
 
        config DEBUG_IMX6Q_UART
                bool "i.MX6Q Debug UART"
@@ -386,6 +386,20 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on Tegra based platforms.
 
+       config DEBUG_SIRFPRIMA2_UART1
+               bool "Kernel low-level debugging messages via SiRFprimaII UART1"
+               depends on ARCH_PRIMA2
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to the uart1 port on SiRFprimaII devices.
+
+       config DEBUG_SIRFMARCO_UART1
+               bool "Kernel low-level debugging messages via SiRFmarco UART1"
+               depends on ARCH_MARCO
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to the uart1 port on SiRFmarco devices.
+
        config DEBUG_VEXPRESS_UART0_DETECT
                bool "Autodetect UART0 on Versatile Express Cortex-A core tiles"
                depends on ARCH_VEXPRESS && CPU_CP15_MMU
@@ -412,6 +426,13 @@ choice
                  of the tiles using the RS1 memory map, including all new A-class
                  core tiles, FPGA-based SMMs and software models.
 
+       config DEBUG_VT8500_UART0
+               bool "Use UART0 on VIA/Wondermedia SoCs"
+               depends on ARCH_VT8500
+               help
+                 This option selects UART0 on VIA/Wondermedia System-on-a-chip
+                 devices, including VT8500, WM8505, WM8650 and WM8850.
+
        config DEBUG_LL_UART_NONE
                bool "No low-level debugging UART"
                depends on !ARCH_MULTIPLATFORM
@@ -497,7 +518,7 @@ config DEBUG_LL_INCLUDE
                                 DEBUG_IMX21_IMX27_UART || \
                                 DEBUG_IMX31_IMX35_UART || \
                                 DEBUG_IMX51_UART || \
-                                DEBUG_IMX50_IMX53_UART ||\
+                                DEBUG_IMX53_UART ||\
                                 DEBUG_IMX6Q_UART
        default "debug/highbank.S" if DEBUG_HIGHBANK_UART
        default "debug/mvebu.S" if DEBUG_MVEBU_UART
@@ -506,6 +527,7 @@ config DEBUG_LL_INCLUDE
        default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1
        default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \
                DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1
+       default "debug/vt8500.S" if DEBUG_VT8500_UART0
        default "debug/tegra.S" if DEBUG_TEGRA_UART
        default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1
        default "mach/debug-macro.S"
index 3d115dcb3461cfd860ea3fb5f26c3384a52d1013..ca683a66b498c4e6fe0c78e2542f05c2a2a63f89 100644 (file)
@@ -73,6 +73,7 @@ dtb-$(CONFIG_ARCH_KIRKWOOD) += kirkwood-dns320.dtb \
        kirkwood-ts219-6281.dtb \
        kirkwood-ts219-6282.dtb \
        kirkwood-openblocks_a6.dtb
+dtb-$(CONFIG_ARCH_MARCO) += marco-evb.dtb
 dtb-$(CONFIG_ARCH_MSM) += msm8660-surf.dtb \
        msm8960-cdp.dtb
 dtb-$(CONFIG_ARCH_MVEBU) += armada-370-db.dtb \
@@ -144,7 +145,9 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
        tegra20-ventana.dtb \
        tegra20-whistler.dtb \
        tegra30-cardhu-a02.dtb \
-       tegra30-cardhu-a04.dtb
+       tegra30-cardhu-a04.dtb \
+       tegra114-dalmore.dtb \
+       tegra114-pluto.dtb
 dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
        vexpress-v2p-ca9.dtb \
        vexpress-v2p-ca15-tc1.dtb \
@@ -152,7 +155,8 @@ dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
        xenvm-4.2.dtb
 dtb-$(CONFIG_ARCH_VT8500) += vt8500-bv07.dtb \
        wm8505-ref.dtb \
-       wm8650-mid.dtb
+       wm8650-mid.dtb \
+       wm8850-w70v2.dtb
 dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb
 
 targets += dtbs
index 42eac1ff3cc82a02c5f52fddba478e76d83548d8..740630f9cd6584544dbc1d6ef2f26a6f6befe365 100644 (file)
@@ -93,6 +93,7 @@
                        reg = <0xd0400 0x20>;
                        ngpios = <32>;
                        interrupt-controller;
+                       #interrupt-cells = <2>;
                        interrupts = <12>, <13>, <14>, <60>;
                };
 
                        reg = <0xd0420 0x20>;
                        ngpios = <32>;
                        interrupt-controller;
+                       #interrupt-cells = <2>;
                        interrupts = <61>;
                };
 
index eb504a6c0f4a3641fd3ad3ea684286a5d2eaa61a..c8a8c08b48ddc8608f4686150b6e1280a5f33dd3 100644 (file)
        interrupt-parent = <&gic>;
 
        cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
                cpu@0 {
+                       device_type = "cpu";
                        compatible = "arm,cortex-a9";
+                       reg = <0>;
                };
                cpu@1 {
+                       device_type = "cpu";
                        compatible = "arm,cortex-a9";
+                       reg = <1>;
                };
        };
 
index eef7099f3e3c160853e18161b64b53fa5b19f23b..454c2d175402cc87240be1a2acfe9588c2383ded 100644 (file)
@@ -45,6 +45,8 @@
                                compatible = "fsl,imx31-uart", "fsl,imx21-uart";
                                reg = <0x43f90000 0x4000>;
                                interrupts = <45>;
+                               clocks = <&clks 10>, <&clks 30>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx31-uart", "fsl,imx21-uart";
                                reg = <0x43f94000 0x4000>;
                                interrupts = <32>;
+                               clocks = <&clks 10>, <&clks 31>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                        uart4: serial@43fb0000 {
                                compatible = "fsl,imx31-uart", "fsl,imx21-uart";
                                reg = <0x43fb0000 0x4000>;
+                               clocks = <&clks 10>, <&clks 49>;
+                               clock-names = "ipg", "per";
                                interrupts = <46>;
                                status = "disabled";
                        };
@@ -66,6 +72,8 @@
                                compatible = "fsl,imx31-uart", "fsl,imx21-uart";
                                reg = <0x43fb4000 0x4000>;
                                interrupts = <47>;
+                               clocks = <&clks 10>, <&clks 50>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
                };
                                compatible = "fsl,imx31-uart", "fsl,imx21-uart";
                                reg = <0x5000c000 0x4000>;
                                interrupts = <18>;
+                               clocks = <&clks 10>, <&clks 48>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
+
+                       clks: ccm@53f80000{
+                               compatible = "fsl,imx31-ccm";
+                               reg = <0x53f80000 0x4000>;
+                               interrupts = <0 31 0x04 0 53 0x04>;
+                               #clock-cells = <1>;
+                       };
                };
        };
 };
diff --git a/arch/arm/boot/dts/marco-evb.dts b/arch/arm/boot/dts/marco-evb.dts
new file mode 100644 (file)
index 0000000..5130aea
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * DTS file for CSR SiRFmarco Evaluation Board
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+/dts-v1/;
+
+/include/ "marco.dtsi"
+
+/ {
+       model = "CSR SiRFmarco Evaluation Board";
+       compatible = "sirf,marco-cb", "sirf,marco";
+
+       memory {
+               reg = <0x40000000 0x60000000>;
+       };
+
+       axi {
+               peri-iobg {
+                       uart1: uart@cc060000 {
+                               status = "okay";
+                       };
+                       uart2: uart@cc070000 {
+                               status = "okay";
+                       };
+                       i2c0: i2c@cc0e0000 {
+                             status = "okay";
+                             fpga-cpld@4d {
+                                     compatible = "sirf,fpga-cpld";
+                                     reg = <0x4d>;
+                             };
+                       };
+                       spi1: spi@cc170000 {
+                               status = "okay";
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&spi1_pins_a>;
+                               spi@0 {
+                                       compatible = "spidev";
+                                       reg = <0>;
+                                       spi-max-frequency = <1000000>;
+                               };
+                       };
+                       pci-iobg {
+                               sd0: sdhci@cd000000 {
+                                       bus-width = <8>;
+                                       status = "okay";
+                               };
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/marco.dtsi b/arch/arm/boot/dts/marco.dtsi
new file mode 100644 (file)
index 0000000..1579c34
--- /dev/null
@@ -0,0 +1,756 @@
+/*
+ * DTS file for CSR SiRFmarco SoC
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+/include/ "skeleton.dtsi"
+/ {
+       compatible = "sirf,marco";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       interrupt-parent = <&gic>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+       };
+
+       axi {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x40000000 0x40000000 0xa0000000>;
+
+               l2-cache-controller@c0030000 {
+                       compatible = "sirf,marco-pl310-cache", "arm,pl310-cache";
+                       reg = <0xc0030000 0x1000>;
+                       interrupts = <0 59 0>;
+                       arm,tag-latency = <1 1 1>;
+                       arm,data-latency = <1 1 1>;
+                       arm,filter-ranges = <0x40000000 0x80000000>;
+               };
+
+               gic: interrupt-controller@c0011000 {
+                       compatible = "arm,cortex-a9-gic";
+                       interrupt-controller;
+                       #interrupt-cells = <3>;
+                       reg = <0xc0011000 0x1000>,
+                             <0xc0010100 0x0100>;
+               };
+
+               rstc-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc2000000 0xc2000000 0x1000000>;
+
+                       reset-controller@c2000000 {
+                               compatible = "sirf,marco-rstc";
+                               reg = <0xc2000000 0x10000>;
+                       };
+               };
+
+               sys-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc3000000 0xc3000000 0x1000000>;
+
+                       clock-controller@c3000000 {
+                               compatible = "sirf,marco-clkc";
+                               reg = <0xc3000000 0x1000>;
+                               interrupts = <0 3 0>;
+                       };
+
+                       rsc-controller@c3010000 {
+                               compatible = "sirf,marco-rsc";
+                               reg = <0xc3010000 0x1000>;
+                       };
+               };
+
+               mem-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc4000000 0xc4000000 0x1000000>;
+
+                       memory-controller@c4000000 {
+                               compatible = "sirf,marco-memc";
+                               reg = <0xc4000000 0x10000>;
+                               interrupts = <0 27 0>;
+                       };
+               };
+
+               disp-iobg0 {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc5000000 0xc5000000 0x1000000>;
+
+                       display0@c5000000 {
+                               compatible = "sirf,marco-lcd";
+                               reg = <0xc5000000 0x10000>;
+                               interrupts = <0 30 0>;
+                       };
+
+                       vpp0@c5010000 {
+                               compatible = "sirf,marco-vpp";
+                               reg = <0xc5010000 0x10000>;
+                               interrupts = <0 31 0>;
+                       };
+               };
+
+               disp-iobg1 {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc6000000 0xc6000000 0x1000000>;
+
+                       display1@c6000000 {
+                               compatible = "sirf,marco-lcd";
+                               reg = <0xc6000000 0x10000>;
+                               interrupts = <0 62 0>;
+                       };
+
+                       vpp1@c6010000 {
+                               compatible = "sirf,marco-vpp";
+                               reg = <0xc6010000 0x10000>;
+                               interrupts = <0 63 0>;
+                       };
+               };
+
+               graphics-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc8000000 0xc8000000 0x1000000>;
+
+                       graphics@c8000000 {
+                               compatible = "powervr,sgx540";
+                               reg = <0xc8000000 0x1000000>;
+                               interrupts = <0 6 0>;
+                       };
+               };
+
+               multimedia-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xc9000000 0xc9000000 0x1000000>;
+
+                       multimedia@a0000000 {
+                               compatible = "sirf,marco-video-codec";
+                               reg = <0xc9000000 0x1000000>;
+                               interrupts = <0 5 0>;
+                       };
+               };
+
+               dsp-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xca000000 0xca000000 0x2000000>;
+
+                       dspif@ca000000 {
+                               compatible = "sirf,marco-dspif";
+                               reg = <0xca000000 0x10000>;
+                               interrupts = <0 9 0>;
+                       };
+
+                       gps@ca010000 {
+                               compatible = "sirf,marco-gps";
+                               reg = <0xca010000 0x10000>;
+                               interrupts = <0 7 0>;
+                       };
+
+                       dsp@cb000000 {
+                               compatible = "sirf,marco-dsp";
+                               reg = <0xcb000000 0x1000000>;
+                               interrupts = <0 8 0>;
+                       };
+               };
+
+               peri-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xcc000000 0xcc000000 0x2000000>;
+
+                       timer@cc020000 {
+                               compatible = "sirf,marco-tick";
+                               reg = <0xcc020000 0x1000>;
+                               interrupts = <0 0 0>,
+                                          <0 1 0>,
+                                          <0 2 0>,
+                                          <0 49 0>,
+                                          <0 50 0>,
+                                          <0 51 0>;
+                       };
+
+                       nand@cc030000 {
+                               compatible = "sirf,marco-nand";
+                               reg = <0xcc030000 0x10000>;
+                               interrupts = <0 41 0>;
+                       };
+
+                       audio@cc040000 {
+                               compatible = "sirf,marco-audio";
+                               reg = <0xcc040000 0x10000>;
+                               interrupts = <0 35 0>;
+                       };
+
+                       uart0: uart@cc050000 {
+                               cell-index = <0>;
+                               compatible = "sirf,marco-uart";
+                               reg = <0xcc050000 0x1000>;
+                               interrupts = <0 17 0>;
+                               fifosize = <128>;
+                               status = "disabled";
+                       };
+
+                       uart1: uart@cc060000 {
+                               cell-index = <1>;
+                               compatible = "sirf,marco-uart";
+                               reg = <0xcc060000 0x1000>;
+                               interrupts = <0 18 0>;
+                               fifosize = <32>;
+                               status = "disabled";
+                       };
+
+                       uart2: uart@cc070000 {
+                               cell-index = <2>;
+                               compatible = "sirf,marco-uart";
+                               reg = <0xcc070000 0x1000>;
+                               interrupts = <0 19 0>;
+                               fifosize = <128>;
+                               status = "disabled";
+                       };
+
+                       uart3: uart@cc190000 {
+                               cell-index = <3>;
+                               compatible = "sirf,marco-uart";
+                               reg = <0xcc190000 0x1000>;
+                               interrupts = <0 66 0>;
+                               fifosize = <128>;
+                               status = "disabled";
+                       };
+
+                       uart4: uart@cc1a0000 {
+                               cell-index = <4>;
+                               compatible = "sirf,marco-uart";
+                               reg = <0xcc1a0000 0x1000>;
+                               interrupts = <0 69 0>;
+                               fifosize = <128>;
+                               status = "disabled";
+                       };
+
+                       usp0: usp@cc080000 {
+                               cell-index = <0>;
+                               compatible = "sirf,marco-usp";
+                               reg = <0xcc080000 0x10000>;
+                               interrupts = <0 20 0>;
+                               status = "disabled";
+                       };
+
+                       usp1: usp@cc090000 {
+                               cell-index = <1>;
+                               compatible = "sirf,marco-usp";
+                               reg = <0xcc090000 0x10000>;
+                               interrupts = <0 21 0>;
+                               status = "disabled";
+                       };
+
+                       usp2: usp@cc0a0000 {
+                               cell-index = <2>;
+                               compatible = "sirf,marco-usp";
+                               reg = <0xcc0a0000 0x10000>;
+                               interrupts = <0 22 0>;
+                               status = "disabled";
+                       };
+
+                       dmac0: dma-controller@cc0b0000 {
+                               cell-index = <0>;
+                               compatible = "sirf,marco-dmac";
+                               reg = <0xcc0b0000 0x10000>;
+                               interrupts = <0 12 0>;
+                       };
+
+                       dmac1: dma-controller@cc160000 {
+                               cell-index = <1>;
+                               compatible = "sirf,marco-dmac";
+                               reg = <0xcc160000 0x10000>;
+                               interrupts = <0 13 0>;
+                       };
+
+                       vip@cc0c0000 {
+                               compatible = "sirf,marco-vip";
+                               reg = <0xcc0c0000 0x10000>;
+                       };
+
+                       spi0: spi@cc0d0000 {
+                               cell-index = <0>;
+                               compatible = "sirf,marco-spi";
+                               reg = <0xcc0d0000 0x10000>;
+                               interrupts = <0 15 0>;
+                               sirf,spi-num-chipselects = <1>;
+                               cs-gpios = <&gpio 0 0>;
+                               sirf,spi-dma-rx-channel = <25>;
+                               sirf,spi-dma-tx-channel = <20>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               status = "disabled";
+                       };
+
+                       spi1: spi@cc170000 {
+                               cell-index = <1>;
+                               compatible = "sirf,marco-spi";
+                               reg = <0xcc170000 0x10000>;
+                               interrupts = <0 16 0>;
+                               sirf,spi-num-chipselects = <1>;
+                               cs-gpios = <&gpio 0 0>;
+                               sirf,spi-dma-rx-channel = <12>;
+                               sirf,spi-dma-tx-channel = <13>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               status = "disabled";
+                       };
+
+                       i2c0: i2c@cc0e0000 {
+                               cell-index = <0>;
+                               compatible = "sirf,marco-i2c";
+                               reg = <0xcc0e0000 0x10000>;
+                               interrupts = <0 24 0>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               status = "disabled";
+                       };
+
+                       i2c1: i2c@cc0f0000 {
+                               cell-index = <1>;
+                               compatible = "sirf,marco-i2c";
+                               reg = <0xcc0f0000 0x10000>;
+                               interrupts = <0 25 0>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               status = "disabled";
+                       };
+
+                       tsc@cc110000 {
+                               compatible = "sirf,marco-tsc";
+                               reg = <0xcc110000 0x10000>;
+                               interrupts = <0 33 0>;
+                       };
+
+                       gpio: pinctrl@cc120000 {
+                               #gpio-cells = <2>;
+                               #interrupt-cells = <2>;
+                               compatible = "sirf,marco-pinctrl";
+                               reg = <0xcc120000 0x10000>;
+                               interrupts = <0 43 0>,
+                                          <0 44 0>,
+                                          <0 45 0>,
+                                          <0 46 0>,
+                                          <0 47 0>;
+                               gpio-controller;
+                               interrupt-controller;
+
+                               lcd_16pins_a: lcd0_0 {
+                                       lcd {
+                                               sirf,pins = "lcd_16bitsgrp";
+                                               sirf,function = "lcd_16bits";
+                                       };
+                               };
+                               lcd_18pins_a: lcd0_1 {
+                                       lcd {
+                                               sirf,pins = "lcd_18bitsgrp";
+                                               sirf,function = "lcd_18bits";
+                                       };
+                               };
+                               lcd_24pins_a: lcd0_2 {
+                                       lcd {
+                                               sirf,pins = "lcd_24bitsgrp";
+                                               sirf,function = "lcd_24bits";
+                                       };
+                               };
+                               lcdrom_pins_a: lcdrom0_0 {
+                                       lcd {
+                                               sirf,pins = "lcdromgrp";
+                                               sirf,function = "lcdrom";
+                                       };
+                               };
+                               uart0_pins_a: uart0_0 {
+                                       uart {
+                                               sirf,pins = "uart0grp";
+                                               sirf,function = "uart0";
+                                       };
+                               };
+                               uart1_pins_a: uart1_0 {
+                                       uart {
+                                               sirf,pins = "uart1grp";
+                                               sirf,function = "uart1";
+                                       };
+                               };
+                               uart2_pins_a: uart2_0 {
+                                       uart {
+                                               sirf,pins = "uart2grp";
+                                               sirf,function = "uart2";
+                                       };
+                               };
+                               uart2_noflow_pins_a: uart2_1 {
+                                       uart {
+                                               sirf,pins = "uart2_nostreamctrlgrp";
+                                               sirf,function = "uart2_nostreamctrl";
+                                       };
+                               };
+                               spi0_pins_a: spi0_0 {
+                                       spi {
+                                               sirf,pins = "spi0grp";
+                                               sirf,function = "spi0";
+                                       };
+                               };
+                               spi1_pins_a: spi1_0 {
+                                       spi {
+                                               sirf,pins = "spi1grp";
+                                               sirf,function = "spi1";
+                                       };
+                               };
+                               i2c0_pins_a: i2c0_0 {
+                                       i2c {
+                                               sirf,pins = "i2c0grp";
+                                               sirf,function = "i2c0";
+                                       };
+                               };
+                               i2c1_pins_a: i2c1_0 {
+                                       i2c {
+                                               sirf,pins = "i2c1grp";
+                                               sirf,function = "i2c1";
+                                       };
+                               };
+                               pwm0_pins_a: pwm0_0 {
+                                       pwm {
+                                               sirf,pins = "pwm0grp";
+                                               sirf,function = "pwm0";
+                                       };
+                               };
+                               pwm1_pins_a: pwm1_0 {
+                                       pwm {
+                                               sirf,pins = "pwm1grp";
+                                               sirf,function = "pwm1";
+                                       };
+                               };
+                               pwm2_pins_a: pwm2_0 {
+                                       pwm {
+                                               sirf,pins = "pwm2grp";
+                                               sirf,function = "pwm2";
+                                       };
+                               };
+                               pwm3_pins_a: pwm3_0 {
+                                       pwm {
+                                               sirf,pins = "pwm3grp";
+                                               sirf,function = "pwm3";
+                                       };
+                               };
+                               gps_pins_a: gps_0 {
+                                       gps {
+                                               sirf,pins = "gpsgrp";
+                                               sirf,function = "gps";
+                                       };
+                               };
+                               vip_pins_a: vip_0 {
+                                       vip {
+                                               sirf,pins = "vipgrp";
+                                               sirf,function = "vip";
+                                       };
+                               };
+                               sdmmc0_pins_a: sdmmc0_0 {
+                                       sdmmc0 {
+                                               sirf,pins = "sdmmc0grp";
+                                               sirf,function = "sdmmc0";
+                                       };
+                               };
+                               sdmmc1_pins_a: sdmmc1_0 {
+                                       sdmmc1 {
+                                               sirf,pins = "sdmmc1grp";
+                                               sirf,function = "sdmmc1";
+                                       };
+                               };
+                               sdmmc2_pins_a: sdmmc2_0 {
+                                       sdmmc2 {
+                                               sirf,pins = "sdmmc2grp";
+                                               sirf,function = "sdmmc2";
+                                       };
+                               };
+                               sdmmc3_pins_a: sdmmc3_0 {
+                                       sdmmc3 {
+                                               sirf,pins = "sdmmc3grp";
+                                               sirf,function = "sdmmc3";
+                                       };
+                               };
+                               sdmmc4_pins_a: sdmmc4_0 {
+                                       sdmmc4 {
+                                               sirf,pins = "sdmmc4grp";
+                                               sirf,function = "sdmmc4";
+                                       };
+                               };
+                               sdmmc5_pins_a: sdmmc5_0 {
+                                       sdmmc5 {
+                                               sirf,pins = "sdmmc5grp";
+                                               sirf,function = "sdmmc5";
+                                       };
+                               };
+                               i2s_pins_a: i2s_0 {
+                                       i2s {
+                                               sirf,pins = "i2sgrp";
+                                               sirf,function = "i2s";
+                                       };
+                               };
+                               ac97_pins_a: ac97_0 {
+                                       ac97 {
+                                               sirf,pins = "ac97grp";
+                                               sirf,function = "ac97";
+                                       };
+                               };
+                               nand_pins_a: nand_0 {
+                                       nand {
+                                               sirf,pins = "nandgrp";
+                                               sirf,function = "nand";
+                                       };
+                               };
+                               usp0_pins_a: usp0_0 {
+                                       usp0 {
+                                               sirf,pins = "usp0grp";
+                                               sirf,function = "usp0";
+                                       };
+                               };
+                               usp1_pins_a: usp1_0 {
+                                       usp1 {
+                                               sirf,pins = "usp1grp";
+                                               sirf,function = "usp1";
+                                       };
+                               };
+                               usp2_pins_a: usp2_0 {
+                                       usp2 {
+                                               sirf,pins = "usp2grp";
+                                               sirf,function = "usp2";
+                                       };
+                               };
+                               usb0_utmi_drvbus_pins_a: usb0_utmi_drvbus_0 {
+                                       usb0_utmi_drvbus {
+                                               sirf,pins = "usb0_utmi_drvbusgrp";
+                                               sirf,function = "usb0_utmi_drvbus";
+                                       };
+                               };
+                               usb1_utmi_drvbus_pins_a: usb1_utmi_drvbus_0 {
+                                       usb1_utmi_drvbus {
+                                               sirf,pins = "usb1_utmi_drvbusgrp";
+                                               sirf,function = "usb1_utmi_drvbus";
+                                       };
+                               };
+                               warm_rst_pins_a: warm_rst_0 {
+                                       warm_rst {
+                                               sirf,pins = "warm_rstgrp";
+                                               sirf,function = "warm_rst";
+                                       };
+                               };
+                               pulse_count_pins_a: pulse_count_0 {
+                                       pulse_count {
+                                               sirf,pins = "pulse_countgrp";
+                                               sirf,function = "pulse_count";
+                                       };
+                               };
+                               cko0_rst_pins_a: cko0_rst_0 {
+                                       cko0_rst {
+                                               sirf,pins = "cko0_rstgrp";
+                                               sirf,function = "cko0_rst";
+                                       };
+                               };
+                               cko1_rst_pins_a: cko1_rst_0 {
+                                       cko1_rst {
+                                               sirf,pins = "cko1_rstgrp";
+                                               sirf,function = "cko1_rst";
+                                       };
+                               };
+                       };
+
+                       pwm@cc130000 {
+                               compatible = "sirf,marco-pwm";
+                               reg = <0xcc130000 0x10000>;
+                       };
+
+                       efusesys@cc140000 {
+                               compatible = "sirf,marco-efuse";
+                               reg = <0xcc140000 0x10000>;
+                       };
+
+                       pulsec@cc150000 {
+                               compatible = "sirf,marco-pulsec";
+                               reg = <0xcc150000 0x10000>;
+                               interrupts = <0 48 0>;
+                       };
+
+                       pci-iobg {
+                               compatible = "sirf,marco-pciiobg", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0xcd000000 0xcd000000 0x1000000>;
+
+                               sd0: sdhci@cd000000 {
+                                       cell-index = <0>;
+                                       compatible = "sirf,marco-sdhc";
+                                       reg = <0xcd000000 0x100000>;
+                                       interrupts = <0 38 0>;
+                                       status = "disabled";
+                               };
+
+                               sd1: sdhci@cd100000 {
+                                       cell-index = <1>;
+                                       compatible = "sirf,marco-sdhc";
+                                       reg = <0xcd100000 0x100000>;
+                                       interrupts = <0 38 0>;
+                                       status = "disabled";
+                               };
+
+                               sd2: sdhci@cd200000 {
+                                       cell-index = <2>;
+                                       compatible = "sirf,marco-sdhc";
+                                       reg = <0xcd200000 0x100000>;
+                                       interrupts = <0 23 0>;
+                                       status = "disabled";
+                               };
+
+                               sd3: sdhci@cd300000 {
+                                       cell-index = <3>;
+                                       compatible = "sirf,marco-sdhc";
+                                       reg = <0xcd300000 0x100000>;
+                                       interrupts = <0 23 0>;
+                                       status = "disabled";
+                               };
+
+                               sd4: sdhci@cd400000 {
+                                       cell-index = <4>;
+                                       compatible = "sirf,marco-sdhc";
+                                       reg = <0xcd400000 0x100000>;
+                                       interrupts = <0 39 0>;
+                                       status = "disabled";
+                               };
+
+                               sd5: sdhci@cd500000 {
+                                       cell-index = <5>;
+                                       compatible = "sirf,marco-sdhc";
+                                       reg = <0xcd500000 0x100000>;
+                                       interrupts = <0 39 0>;
+                                       status = "disabled";
+                               };
+
+                               pci-copy@cd900000 {
+                                       compatible = "sirf,marco-pcicp";
+                                       reg = <0xcd900000 0x100000>;
+                                       interrupts = <0 40 0>;
+                               };
+
+                               rom-interface@cda00000 {
+                                       compatible = "sirf,marco-romif";
+                                       reg = <0xcda00000 0x100000>;
+                               };
+                       };
+               };
+
+               rtc-iobg {
+                       compatible = "sirf,marco-rtciobg", "sirf-marco-rtciobg-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0xc1000000 0x10000>;
+
+                       gpsrtc@1000 {
+                               compatible = "sirf,marco-gpsrtc";
+                               reg = <0x1000 0x1000>;
+                               interrupts = <0 55 0>,
+                                          <0 56 0>,
+                                          <0 57 0>;
+                       };
+
+                       sysrtc@2000 {
+                               compatible = "sirf,marco-sysrtc";
+                               reg = <0x2000 0x1000>;
+                               interrupts = <0 52 0>,
+                                          <0 53 0>,
+                                          <0 54 0>;
+                       };
+
+                       pwrc@3000 {
+                               compatible = "sirf,marco-pwrc";
+                               reg = <0x3000 0x1000>;
+                               interrupts = <0 32 0>;
+                       };
+               };
+
+               uus-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xce000000 0xce000000 0x1000000>;
+
+                       usb0: usb@ce000000 {
+                               compatible = "chipidea,ci13611a-marco";
+                               reg = <0xce000000 0x10000>;
+                               interrupts = <0 10 0>;
+                       };
+
+                       usb1: usb@ce010000 {
+                               compatible = "chipidea,ci13611a-marco";
+                               reg = <0xce010000 0x10000>;
+                               interrupts = <0 11 0>;
+                       };
+
+                       security@ce020000 {
+                               compatible = "sirf,marco-security";
+                               reg = <0xce020000 0x10000>;
+                               interrupts = <0 42 0>;
+                       };
+               };
+
+               can-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xd0000000 0xd0000000 0x1000000>;
+
+                       can0: can@d0000000 {
+                               compatible = "sirf,marco-can";
+                               reg = <0xd0000000 0x10000>;
+                       };
+
+                       can1: can@d0010000 {
+                               compatible = "sirf,marco-can";
+                               reg = <0xd0010000 0x10000>;
+                       };
+               };
+
+               lvds-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xd1000000 0xd1000000 0x1000000>;
+
+                       lvds@d1000000 {
+                               compatible = "sirf,marco-lvds";
+                               reg = <0xd1000000 0x10000>;
+                               interrupts = <0 64 0>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/sh73a0-reference.dtsi b/arch/arm/boot/dts/sh73a0-reference.dtsi
new file mode 100644 (file)
index 0000000..d4bb012
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Device Tree Source for the SH73A0 SoC
+ *
+ * Copyright (C) 2012 Renesas Solutions Corp.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+/include/ "sh73a0.dtsi"
+
+/ {
+       compatible = "renesas,sh73a0";
+
+       mmcif: mmcif@0x10010000 {
+               compatible = "renesas,sh-mmcif";
+               reg = <0xe6bd0000 0x100>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 140 0x4
+                             0 141 0x4>;
+               reg-io-width = <4>;
+       };
+};
diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi
new file mode 100644 (file)
index 0000000..8a59465
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Device Tree Source for the SH73A0 SoC
+ *
+ * Copyright (C) 2012 Renesas Solutions Corp.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+/include/ "skeleton.dtsi"
+
+/ {
+       compatible = "renesas,sh73a0";
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+       };
+
+       gic: interrupt-controller@f0001000 {
+               compatible = "arm,cortex-a9-gic";
+               #interrupt-cells = <3>;
+               #address-cells = <1>;
+               interrupt-controller;
+               reg = <0xf0001000 0x1000>,
+                     <0xf0000100 0x100>;
+       };
+
+       i2c0: i2c@0xe6820000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xe6820000 0x425>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 167 0x4
+                             0 168 0x4
+                             0 169 0x4
+                             0 170 0x4>;
+       };
+
+       i2c1: i2c@0xe6822000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xe6822000 0x425>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 51 0x4
+                             0 52 0x4
+                             0 53 0x4
+                             0 54 0x4>;
+       };
+
+       i2c2: i2c@0xe6824000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xe6824000 0x425>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 171 0x4
+                             0 172 0x4
+                             0 173 0x4
+                             0 174 0x4>;
+       };
+
+       i2c3: i2c@0xe6826000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xe6826000 0x425>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 183 0x4
+                             0 184 0x4
+                             0 185 0x4
+                             0 186 0x4>;
+       };
+
+       i2c4: i2c@0xe6828000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xe6828000 0x425>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 187 0x4
+                             0 188 0x4
+                             0 189 0x4
+                             0 190 0x4>;
+       };
+};
diff --git a/arch/arm/boot/dts/tegra114-dalmore.dts b/arch/arm/boot/dts/tegra114-dalmore.dts
new file mode 100644 (file)
index 0000000..a30aca6
--- /dev/null
@@ -0,0 +1,21 @@
+/dts-v1/;
+
+/include/ "tegra114.dtsi"
+
+/ {
+       model = "NVIDIA Tegra114 Dalmore evaluation board";
+       compatible = "nvidia,dalmore", "nvidia,tegra114";
+
+       memory {
+               reg = <0x80000000 0x40000000>;
+       };
+
+       serial@70006300 {
+               status = "okay";
+               clock-frequency = <408000000>;
+       };
+
+       pmc {
+               nvidia,invert-interrupt;
+       };
+};
diff --git a/arch/arm/boot/dts/tegra114-pluto.dts b/arch/arm/boot/dts/tegra114-pluto.dts
new file mode 100644 (file)
index 0000000..9bea8f5
--- /dev/null
@@ -0,0 +1,21 @@
+/dts-v1/;
+
+/include/ "tegra114.dtsi"
+
+/ {
+       model = "NVIDIA Tegra114 Pluto evaluation board";
+       compatible = "nvidia,pluto", "nvidia,tegra114";
+
+       memory {
+               reg = <0x80000000 0x40000000>;
+       };
+
+       serial@70006300 {
+               status = "okay";
+               clock-frequency = <408000000>;
+       };
+
+       pmc {
+               nvidia,invert-interrupt;
+       };
+};
diff --git a/arch/arm/boot/dts/tegra114.dtsi b/arch/arm/boot/dts/tegra114.dtsi
new file mode 100644 (file)
index 0000000..1dfaf28
--- /dev/null
@@ -0,0 +1,153 @@
+/include/ "skeleton.dtsi"
+
+/ {
+       compatible = "nvidia,tegra114";
+       interrupt-parent = <&gic>;
+
+       gic: interrupt-controller {
+               compatible = "arm,cortex-a15-gic";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0x50041000 0x1000>,
+                     <0x50042000 0x1000>,
+                     <0x50044000 0x2000>,
+                     <0x50046000 0x2000>;
+               interrupts = <1 9 0xf04>;
+       };
+
+       timer@60005000 {
+               compatible = "nvidia,tegra114-timer", "nvidia,tegra20-timer";
+               reg = <0x60005000 0x400>;
+               interrupts = <0 0 0x04
+                             0 1 0x04
+                             0 41 0x04
+                             0 42 0x04
+                             0 121 0x04
+                             0 122 0x04>;
+       };
+
+       tegra_car: clock {
+               compatible = "nvidia,tegra114-car, nvidia,tegra30-car";
+               reg = <0x60006000 0x1000>;
+               #clock-cells = <1>;
+       };
+
+       ahb: ahb {
+               compatible = "nvidia,tegra114-ahb", "nvidia,tegra30-ahb";
+               reg = <0x6000c004 0x14c>;
+       };
+
+       gpio: gpio {
+               compatible = "nvidia,tegra114-gpio", "nvidia,tegra30-gpio";
+               reg = <0x6000d000 0x1000>;
+               interrupts = <0 32 0x04
+                             0 33 0x04
+                             0 34 0x04
+                             0 35 0x04
+                             0 55 0x04
+                             0 87 0x04
+                             0 89 0x04
+                             0 125 0x04>;
+               #gpio-cells = <2>;
+               gpio-controller;
+               #interrupt-cells = <2>;
+               interrupt-controller;
+       };
+
+       pinmux: pinmux {
+               compatible = "nvidia,tegra114-pinmux";
+               reg = <0x70000868 0x148         /* Pad control registers */
+                      0x70003000 0x40c>;       /* Mux registers */
+       };
+
+       serial@70006000 {
+               compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
+               reg = <0x70006000 0x40>;
+               reg-shift = <2>;
+               interrupts = <0 36 0x04>;
+               status = "disabled";
+       };
+
+       serial@70006040 {
+               compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
+               reg = <0x70006040 0x40>;
+               reg-shift = <2>;
+               interrupts = <0 37 0x04>;
+               status = "disabled";
+       };
+
+       serial@70006200 {
+               compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
+               reg = <0x70006200 0x100>;
+               reg-shift = <2>;
+               interrupts = <0 46 0x04>;
+               status = "disabled";
+       };
+
+       serial@70006300 {
+               compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
+               reg = <0x70006300 0x100>;
+               reg-shift = <2>;
+               interrupts = <0 90 0x04>;
+               status = "disabled";
+       };
+
+       rtc {
+               compatible = "nvidia,tegra114-rtc", "nvidia,tegra20-rtc";
+               reg = <0x7000e000 0x100>;
+               interrupts = <0 2 0x04>;
+       };
+
+       pmc {
+               compatible = "nvidia,tegra114-pmc", "nvidia,tegra30-pmc";
+               reg = <0x7000e400 0x400>;
+       };
+
+       iommu {
+               compatible = "nvidia,tegra114-smmu", "nvidia,tegra30-smmu";
+               reg = <0x7000f010 0x02c
+                      0x7000f1f0 0x010
+                      0x7000f228 0x074>;
+               nvidia,#asids = <4>;
+               dma-window = <0 0x40000000>;
+               nvidia,swgroups = <0x18659fe>;
+               nvidia,ahb = <&ahb>;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <1>;
+               };
+
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <2>;
+               };
+
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <3>;
+               };
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <1 13 0xf08>,
+                            <1 14 0xf08>,
+                            <1 11 0xf08>,
+                            <1 10 0xf08>;
+       };
+};
index 43eb72af894823d294cbf3ca951b9a3e498088c2..2b4169702c8d61068b88f6365adf2b6d1ac8c242 100644 (file)
                status = "okay";
        };
 
+       usb-phy@c5004400 {
+               nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */
+       };
+
        sdhci@c8000200 {
                status = "okay";
                cd-gpios = <&gpio 69 0>; /* gpio PI5 */
index 6a93d1404c76d367577b82e10ff75648f1481f4e..11b30db63ff2b3795c8b9455f7b613320cf3165f 100644 (file)
                clock-frequency = <80000>;
                request-gpios = <&gpio 170 0>; /* gpio PV2 */
                slave-addr = <138>;
+               clocks = <&tegra_car 67>, <&tegra_car 124>;
+               clock-names = "div-clk", "fast-clk";
        };
 
        i2c@7000d000 {
                status = "okay";
        };
 
+       usb-phy@c5004400 {
+               nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */
+       };
+
        sdhci@c8000000 {
                status = "okay";
                cd-gpios = <&gpio 173 0>; /* gpio PV5 */
index 420459825b46d680f076fde49a307209eaf8780d..607bf0c6bf9cc9fe7e4c70e45bd004bf72993b68 100644 (file)
                status = "okay";
        };
 
+       usb-phy@c5004400 {
+               nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */
+       };
+
        sdhci@c8000000 {
                status = "okay";
                power-gpios = <&gpio 86 0>; /* gpio PK6 */
index b70b4cb754c8bd1e60b6d7768e3de0eb83d6186a..e47cf6a58b6f4b870acdd1dd8b37178b1ef7ff59 100644 (file)
                status = "okay";
        };
 
+       usb-phy@c5004400 {
+               nvidia,phy-reset-gpio = <&gpio 168 0>; /* gpio PV0 */
+       };
+
        sdhci@c8000000 {
                status = "okay";
                bus-width = <4>;
index adc47547eaaee94115cb9991bcc5782c7cdffefe..f6c61d10fd2781f055a249b30443359e05614a62 100644 (file)
                status = "okay";
        };
 
+       usb-phy@c5004400 {
+               nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */
+       };
+
        sdhci@c8000000 {
                status = "okay";
                power-gpios = <&gpio 86 0>; /* gpio PK6 */
index b8effa1cbda7331078d9d85bcc3d7a9bf9a891d3..2e7c83c7253bc3c8925c77a7171ad53fb18f0b1d 100644 (file)
@@ -9,6 +9,7 @@
                reg = <0x50000000 0x00024000>;
                interrupts = <0 65 0x04   /* mpcore syncpt */
                              0 67 0x04>; /* mpcore general */
+               clocks = <&tegra_car 28>;
 
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "nvidia,tegra20-mpe";
                        reg = <0x54040000 0x00040000>;
                        interrupts = <0 68 0x04>;
+                       clocks = <&tegra_car 60>;
                };
 
                vi {
                        compatible = "nvidia,tegra20-vi";
                        reg = <0x54080000 0x00040000>;
                        interrupts = <0 69 0x04>;
+                       clocks = <&tegra_car 100>;
                };
 
                epp {
                        compatible = "nvidia,tegra20-epp";
                        reg = <0x540c0000 0x00040000>;
                        interrupts = <0 70 0x04>;
+                       clocks = <&tegra_car 19>;
                };
 
                isp {
                        compatible = "nvidia,tegra20-isp";
                        reg = <0x54100000 0x00040000>;
                        interrupts = <0 71 0x04>;
+                       clocks = <&tegra_car 23>;
                };
 
                gr2d {
                        compatible = "nvidia,tegra20-gr2d";
                        reg = <0x54140000 0x00040000>;
                        interrupts = <0 72 0x04>;
+                       clocks = <&tegra_car 21>;
                };
 
                gr3d {
                        compatible = "nvidia,tegra20-gr3d";
                        reg = <0x54180000 0x00040000>;
+                       clocks = <&tegra_car 24>;
                };
 
                dc@54200000 {
                        compatible = "nvidia,tegra20-dc";
                        reg = <0x54200000 0x00040000>;
                        interrupts = <0 73 0x04>;
+                       clocks = <&tegra_car 27>, <&tegra_car 121>;
+                       clock-names = "disp1", "parent";
 
                        rgb {
                                status = "disabled";
@@ -64,6 +73,8 @@
                        compatible = "nvidia,tegra20-dc";
                        reg = <0x54240000 0x00040000>;
                        interrupts = <0 74 0x04>;
+                       clocks = <&tegra_car 26>, <&tegra_car 121>;
+                       clock-names = "disp2", "parent";
 
                        rgb {
                                status = "disabled";
@@ -74,6 +85,8 @@
                        compatible = "nvidia,tegra20-hdmi";
                        reg = <0x54280000 0x00040000>;
                        interrupts = <0 75 0x04>;
+                       clocks = <&tegra_car 51>, <&tegra_car 117>;
+                       clock-names = "hdmi", "parent";
                        status = "disabled";
                };
 
                        compatible = "nvidia,tegra20-tvo";
                        reg = <0x542c0000 0x00040000>;
                        interrupts = <0 76 0x04>;
+                       clocks = <&tegra_car 102>;
                        status = "disabled";
                };
 
                dsi {
                        compatible = "nvidia,tegra20-dsi";
                        reg = <0x54300000 0x00040000>;
+                       clocks = <&tegra_car 48>;
                        status = "disabled";
                };
        };
                              0 42 0x04>;
        };
 
+       tegra_car: clock {
+               compatible = "nvidia,tegra20-car";
+               reg = <0x60006000 0x1000>;
+               #clock-cells = <1>;
+       };
+
        apbdma: dma {
                compatible = "nvidia,tegra20-apbdma";
                reg = <0x6000a000 0x1200>;
                              0 117 0x04
                              0 118 0x04
                              0 119 0x04>;
+               clocks = <&tegra_car 34>;
        };
 
        ahb {
                reg = <0x70002800 0x200>;
                interrupts = <0 13 0x04>;
                nvidia,dma-request-selector = <&apbdma 2>;
+               clocks = <&tegra_car 11>;
                status = "disabled";
        };
 
                reg = <0x70002a00 0x200>;
                interrupts = <0 3 0x04>;
                nvidia,dma-request-selector = <&apbdma 1>;
+               clocks = <&tegra_car 18>;
                status = "disabled";
        };
 
                reg = <0x70006000 0x40>;
                reg-shift = <2>;
                interrupts = <0 36 0x04>;
+               clocks = <&tegra_car 6>;
                status = "disabled";
        };
 
                reg = <0x70006040 0x40>;
                reg-shift = <2>;
                interrupts = <0 37 0x04>;
+               clocks = <&tegra_car 96>;
                status = "disabled";
        };
 
                reg = <0x70006200 0x100>;
                reg-shift = <2>;
                interrupts = <0 46 0x04>;
+               clocks = <&tegra_car 55>;
                status = "disabled";
        };
 
                reg = <0x70006300 0x100>;
                reg-shift = <2>;
                interrupts = <0 90 0x04>;
+               clocks = <&tegra_car 65>;
                status = "disabled";
        };
 
                reg = <0x70006400 0x100>;
                reg-shift = <2>;
                interrupts = <0 91 0x04>;
+               clocks = <&tegra_car 66>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra20-pwm";
                reg = <0x7000a000 0x100>;
                #pwm-cells = <2>;
+               clocks = <&tegra_car 17>;
        };
 
        rtc {
                interrupts = <0 38 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 12>, <&tegra_car 124>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 11>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 43>;
                status = "disabled";
        };
 
                interrupts = <0 84 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 54>, <&tegra_car 124>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                interrupts = <0 92 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 67>, <&tegra_car 124>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                interrupts = <0 53 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 47>, <&tegra_car 124>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 15>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 41>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 16>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 44>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 17>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 46>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 18>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 68>;
                status = "disabled";
        };
 
                #size-cells = <0>;
        };
 
+       phy1: usb-phy@c5000400 {
+               compatible = "nvidia,tegra20-usb-phy";
+               reg = <0xc5000400 0x3c00>;
+               phy_type = "utmi";
+               nvidia,has-legacy-mode;
+               clocks = <&tegra_car 22>, <&tegra_car 127>;
+               clock-names = "phy", "pll_u";
+       };
+
+       phy2: usb-phy@c5004400 {
+               compatible = "nvidia,tegra20-usb-phy";
+               reg = <0xc5004400 0x3c00>;
+               phy_type = "ulpi";
+               clocks = <&tegra_car 94>, <&tegra_car 127>;
+               clock-names = "phy", "pll_u";
+       };
+
+       phy3: usb-phy@c5008400 {
+               compatible = "nvidia,tegra20-usb-phy";
+               reg = <0xc5008400 0x3C00>;
+               phy_type = "utmi";
+               clocks = <&tegra_car 22>, <&tegra_car 127>;
+               clock-names = "phy", "pll_u";
+       };
+
        usb@c5000000 {
                compatible = "nvidia,tegra20-ehci", "usb-ehci";
                reg = <0xc5000000 0x4000>;
                interrupts = <0 20 0x04>;
                phy_type = "utmi";
                nvidia,has-legacy-mode;
+               clocks = <&tegra_car 22>;
+               nvidia,needs-double-reset;
+               nvidia,phy = <&phy1>;
                status = "disabled";
        };
 
                reg = <0xc5004000 0x4000>;
                interrupts = <0 21 0x04>;
                phy_type = "ulpi";
+               clocks = <&tegra_car 58>;
+               nvidia,phy = <&phy2>;
                status = "disabled";
        };
 
                reg = <0xc5008000 0x4000>;
                interrupts = <0 97 0x04>;
                phy_type = "utmi";
+               clocks = <&tegra_car 59>;
+               nvidia,phy = <&phy3>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra20-sdhci";
                reg = <0xc8000000 0x200>;
                interrupts = <0 14 0x04>;
+               clocks = <&tegra_car 14>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra20-sdhci";
                reg = <0xc8000200 0x200>;
                interrupts = <0 15 0x04>;
+               clocks = <&tegra_car 9>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra20-sdhci";
                reg = <0xc8000400 0x200>;
                interrupts = <0 19 0x04>;
+               clocks = <&tegra_car 69>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra20-sdhci";
                reg = <0xc8000600 0x200>;
                interrupts = <0 31 0x04>;
+               clocks = <&tegra_car 15>;
                status = "disabled";
        };
 
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+       };
+
        pmu {
                compatible = "arm,cortex-a9-pmu";
                interrupts = <0 56 0x04
index 529fdb82dfdb9683405a02c86e42e0850590f633..2de8b919d78c20908d2638a087cacd89548e0c44 100644 (file)
@@ -9,6 +9,7 @@
                reg = <0x50000000 0x00024000>;
                interrupts = <0 65 0x04   /* mpcore syncpt */
                              0 67 0x04>; /* mpcore general */
+               clocks = <&tegra_car 28>;
 
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "nvidia,tegra30-mpe";
                        reg = <0x54040000 0x00040000>;
                        interrupts = <0 68 0x04>;
+                       clocks = <&tegra_car 60>;
                };
 
                vi {
                        compatible = "nvidia,tegra30-vi";
                        reg = <0x54080000 0x00040000>;
                        interrupts = <0 69 0x04>;
+                       clocks = <&tegra_car 164>;
                };
 
                epp {
                        compatible = "nvidia,tegra30-epp";
                        reg = <0x540c0000 0x00040000>;
                        interrupts = <0 70 0x04>;
+                       clocks = <&tegra_car 19>;
                };
 
                isp {
                        compatible = "nvidia,tegra30-isp";
                        reg = <0x54100000 0x00040000>;
                        interrupts = <0 71 0x04>;
+                       clocks = <&tegra_car 23>;
                };
 
                gr2d {
                        compatible = "nvidia,tegra30-gr2d";
                        reg = <0x54140000 0x00040000>;
                        interrupts = <0 72 0x04>;
+                       clocks = <&tegra_car 21>;
                };
 
                gr3d {
                        compatible = "nvidia,tegra30-gr3d";
                        reg = <0x54180000 0x00040000>;
+                       clocks = <&tegra_car 24 &tegra_car 98>;
+                       clock-names = "3d", "3d2";
                };
 
                dc@54200000 {
                        compatible = "nvidia,tegra30-dc";
                        reg = <0x54200000 0x00040000>;
                        interrupts = <0 73 0x04>;
+                       clocks = <&tegra_car 27>, <&tegra_car 179>;
+                       clock-names = "disp1", "parent";
 
                        rgb {
                                status = "disabled";
@@ -64,6 +74,8 @@
                        compatible = "nvidia,tegra30-dc";
                        reg = <0x54240000 0x00040000>;
                        interrupts = <0 74 0x04>;
+                       clocks = <&tegra_car 26>, <&tegra_car 179>;
+                       clock-names = "disp2", "parent";
 
                        rgb {
                                status = "disabled";
@@ -74,6 +86,8 @@
                        compatible = "nvidia,tegra30-hdmi";
                        reg = <0x54280000 0x00040000>;
                        interrupts = <0 75 0x04>;
+                       clocks = <&tegra_car 51>, <&tegra_car 189>;
+                       clock-names = "hdmi", "parent";
                        status = "disabled";
                };
 
                        compatible = "nvidia,tegra30-tvo";
                        reg = <0x542c0000 0x00040000>;
                        interrupts = <0 76 0x04>;
+                       clocks = <&tegra_car 169>;
                        status = "disabled";
                };
 
                dsi {
                        compatible = "nvidia,tegra30-dsi";
                        reg = <0x54300000 0x00040000>;
+                       clocks = <&tegra_car 48>;
                        status = "disabled";
                };
        };
                              0 122 0x04>;
        };
 
+       tegra_car: clock {
+               compatible = "nvidia,tegra30-car";
+               reg = <0x60006000 0x1000>;
+               #clock-cells = <1>;
+       };
+
        apbdma: dma {
                compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma";
                reg = <0x6000a000 0x1400>;
                              0 141 0x04
                              0 142 0x04
                              0 143 0x04>;
+               clocks = <&tegra_car 34>;
        };
 
        ahb: ahb {
                reg = <0x70006000 0x40>;
                reg-shift = <2>;
                interrupts = <0 36 0x04>;
+               clocks = <&tegra_car 6>;
                status = "disabled";
        };
 
                reg = <0x70006040 0x40>;
                reg-shift = <2>;
                interrupts = <0 37 0x04>;
+               clocks = <&tegra_car 160>;
                status = "disabled";
        };
 
                reg = <0x70006200 0x100>;
                reg-shift = <2>;
                interrupts = <0 46 0x04>;
+               clocks = <&tegra_car 55>;
                status = "disabled";
        };
 
                reg = <0x70006300 0x100>;
                reg-shift = <2>;
                interrupts = <0 90 0x04>;
+               clocks = <&tegra_car 65>;
                status = "disabled";
        };
 
                reg = <0x70006400 0x100>;
                reg-shift = <2>;
                interrupts = <0 91 0x04>;
+               clocks = <&tegra_car 66>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra30-pwm", "nvidia,tegra20-pwm";
                reg = <0x7000a000 0x100>;
                #pwm-cells = <2>;
+               clocks = <&tegra_car 17>;
        };
 
        rtc {
                interrupts = <0 38 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 12>, <&tegra_car 182>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                interrupts = <0 84 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 54>, <&tegra_car 182>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                interrupts = <0 92 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 67>, <&tegra_car 182>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                interrupts = <0 120 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 103>, <&tegra_car 182>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                interrupts = <0 53 0x04>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 47>, <&tegra_car 182>;
+               clock-names = "div-clk", "fast-clk";
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 15>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 41>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 16>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 44>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 17>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 46>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 18>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 68>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 27>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 104>;
                status = "disabled";
        };
 
                nvidia,dma-request-selector = <&apbdma 28>;
                #address-cells = <1>;
                #size-cells = <0>;
+               clocks = <&tegra_car 105>;
                status = "disabled";
        };
 
                       0x70080200 0x100>;
                interrupts = <0 103 0x04>;
                nvidia,dma-request-selector = <&apbdma 1>;
-
+               clocks = <&tegra_car 106>, <&tegra_car 107>, <&tegra_car 30>,
+                        <&tegra_car 11>, <&tegra_car 18>, <&tegra_car 101>,
+                        <&tegra_car 102>, <&tegra_car 108>, <&tegra_car 109>,
+                        <&tegra_car 110>, <&tegra_car 162>;
+               clock-names = "d_audio", "apbif", "i2s0", "i2s1", "i2s2",
+                             "i2s3", "i2s4", "dam0", "dam1", "dam2",
+                             "spdif_in";
                ranges;
                #address-cells = <1>;
                #size-cells = <1>;
                        compatible = "nvidia,tegra30-i2s";
                        reg = <0x70080300 0x100>;
                        nvidia,ahub-cif-ids = <4 4>;
+                       clocks = <&tegra_car 30>;
                        status = "disabled";
                };
 
                        compatible = "nvidia,tegra30-i2s";
                        reg = <0x70080400 0x100>;
                        nvidia,ahub-cif-ids = <5 5>;
+                       clocks = <&tegra_car 11>;
                        status = "disabled";
                };
 
                        compatible = "nvidia,tegra30-i2s";
                        reg = <0x70080500 0x100>;
                        nvidia,ahub-cif-ids = <6 6>;
+                       clocks = <&tegra_car 18>;
                        status = "disabled";
                };
 
                        compatible = "nvidia,tegra30-i2s";
                        reg = <0x70080600 0x100>;
                        nvidia,ahub-cif-ids = <7 7>;
+                       clocks = <&tegra_car 101>;
                        status = "disabled";
                };
 
                        compatible = "nvidia,tegra30-i2s";
                        reg = <0x70080700 0x100>;
                        nvidia,ahub-cif-ids = <8 8>;
+                       clocks = <&tegra_car 102>;
                        status = "disabled";
                };
        };
                compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
                reg = <0x78000000 0x200>;
                interrupts = <0 14 0x04>;
+               clocks = <&tegra_car 14>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
                reg = <0x78000200 0x200>;
                interrupts = <0 15 0x04>;
+               clocks = <&tegra_car 9>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
                reg = <0x78000400 0x200>;
                interrupts = <0 19 0x04>;
+               clocks = <&tegra_car 69>;
                status = "disabled";
        };
 
                compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
                reg = <0x78000600 0x200>;
                interrupts = <0 31 0x04>;
+               clocks = <&tegra_car 15>;
                status = "disabled";
        };
 
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <2>;
+               };
+
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <3>;
+               };
+       };
+
        pmu {
                compatible = "arm,cortex-a9-pmu";
                interrupts = <0 144 0x04
diff --git a/arch/arm/boot/dts/wm8850-w70v2.dts b/arch/arm/boot/dts/wm8850-w70v2.dts
new file mode 100644 (file)
index 0000000..fcc660c
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * wm8850-w70v2.dts
+ *  - Device tree file for Wondermedia WM8850 Tablet
+ *  - 'W70-V2' mainboard
+ *  - HongLianYing 'HLY070ML268-21A' 7" LCD panel
+ *
+ * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz>
+ *
+ * Licensed under GPLv2 or later
+ */
+
+/dts-v1/;
+/include/ "wm8850.dtsi"
+
+/ {
+       model = "Wondermedia WM8850-W70v2 Tablet";
+
+       /*
+        * Display node is based on Sascha Hauer's patch on dri-devel.
+        * Added a bpp property to calculate the size of the framebuffer
+        * until the binding is formalized.
+        */
+       display: display@0 {
+               modes {
+                       mode0: mode@0 {
+                               hactive = <800>;
+                               vactive = <480>;
+                               hback-porch = <88>;
+                               hfront-porch = <40>;
+                               hsync-len = <0>;
+                               vback-porch = <32>;
+                               vfront-porch = <11>;
+                               vsync-len = <1>;
+                               clock = <0>;    /* unused but required */
+                               bpp = <16>;     /* non-standard but required */
+                       };
+               };
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm 0 50000 1>;        /* duty inverted */
+
+               brightness-levels = <0 40 60 80 100 130 190 255>;
+               default-brightness-level = <5>;
+       };
+};
diff --git a/arch/arm/boot/dts/wm8850.dtsi b/arch/arm/boot/dts/wm8850.dtsi
new file mode 100644 (file)
index 0000000..e8cbfdc
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * wm8850.dtsi - Device tree file for Wondermedia WM8850 SoC
+ *
+ * Copyright (C) 2012 Tony Prisk <linux@prisktech.co.nz>
+ *
+ * Licensed under GPLv2 or later
+ */
+
+/include/ "skeleton.dtsi"
+
+/ {
+       compatible = "wm,wm8850";
+
+       aliases {
+               serial0 = &uart0;
+               serial1 = &uart1;
+               serial2 = &uart2;
+               serial3 = &uart3;
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               ranges;
+               interrupt-parent = <&intc0>;
+
+               intc0: interrupt-controller@d8140000 {
+                       compatible = "via,vt8500-intc";
+                       interrupt-controller;
+                       reg = <0xd8140000 0x10000>;
+                       #interrupt-cells = <1>;
+               };
+
+               /* Secondary IC cascaded to intc0 */
+               intc1: interrupt-controller@d8150000 {
+                       compatible = "via,vt8500-intc";
+                       interrupt-controller;
+                       #interrupt-cells = <1>;
+                       reg = <0xD8150000 0x10000>;
+                       interrupts = <56 57 58 59 60 61 62 63>;
+               };
+
+               gpio: gpio-controller@d8110000 {
+                       compatible = "wm,wm8650-gpio";
+                       gpio-controller;
+                       reg = <0xd8110000 0x10000>;
+                       #gpio-cells = <3>;
+               };
+
+               pmc@d8130000 {
+                       compatible = "via,vt8500-pmc";
+                       reg = <0xd8130000 0x1000>;
+
+                       clocks {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               ref25: ref25M {
+                                       #clock-cells = <0>;
+                                       compatible = "fixed-clock";
+                                       clock-frequency = <25000000>;
+                               };
+
+                               ref24: ref24M {
+                                       #clock-cells = <0>;
+                                       compatible = "fixed-clock";
+                                       clock-frequency = <24000000>;
+                               };
+
+                               plla: plla {
+                                       #clock-cells = <0>;
+                                       compatible = "wm,wm8750-pll-clock";
+                                       clocks = <&ref25>;
+                                       reg = <0x200>;
+                               };
+
+                               pllb: pllb {
+                                       #clock-cells = <0>;
+                                       compatible = "wm,wm8750-pll-clock";
+                                       clocks = <&ref25>;
+                                       reg = <0x204>;
+                               };
+
+                               clkuart0: uart0 {
+                                       #clock-cells = <0>;
+                                       compatible = "via,vt8500-device-clock";
+                                       clocks = <&ref24>;
+                                       enable-reg = <0x254>;
+                                       enable-bit = <24>;
+                               };
+
+                               clkuart1: uart1 {
+                                       #clock-cells = <0>;
+                                       compatible = "via,vt8500-device-clock";
+                                       clocks = <&ref24>;
+                                       enable-reg = <0x254>;
+                                       enable-bit = <25>;
+                               };
+
+                                clkuart2: uart2 {
+                                        #clock-cells = <0>;
+                                        compatible = "via,vt8500-device-clock";
+                                        clocks = <&ref24>;
+                                        enable-reg = <0x254>;
+                                        enable-bit = <26>;
+                                };
+
+                                clkuart3: uart3 {
+                                        #clock-cells = <0>;
+                                        compatible = "via,vt8500-device-clock";
+                                        clocks = <&ref24>;
+                                        enable-reg = <0x254>;
+                                        enable-bit = <27>;
+                                };
+
+                               clkpwm: pwm {
+                                       #clock-cells = <0>;
+                                       compatible = "via,vt8500-device-clock";
+                                       clocks = <&pllb>;
+                                       divisor-reg = <0x350>;
+                                       enable-reg = <0x250>;
+                                       enable-bit = <17>;
+                               };
+
+                               clksdhc: sdhc {
+                                       #clock-cells = <0>;
+                                       compatible = "via,vt8500-device-clock";
+                                       clocks = <&pllb>;
+                                       divisor-reg = <0x330>;
+                                       divisor-mask = <0x3f>;
+                                       enable-reg = <0x250>;
+                                       enable-bit = <0>;
+                               };
+                       };
+               };
+
+               fb@d8051700 {
+                       compatible = "wm,wm8505-fb";
+                       reg = <0xd8051700 0x200>;
+                       display = <&display>;
+                       default-mode = <&mode0>;
+               };
+
+               ge_rops@d8050400 {
+                       compatible = "wm,prizm-ge-rops";
+                       reg = <0xd8050400 0x100>;
+               };
+
+               pwm: pwm@d8220000 {
+                       #pwm-cells = <3>;
+                       compatible = "via,vt8500-pwm";
+                       reg = <0xd8220000 0x100>;
+                       clocks = <&clkpwm>;
+               };
+
+               timer@d8130100 {
+                       compatible = "via,vt8500-timer";
+                       reg = <0xd8130100 0x28>;
+                       interrupts = <36>;
+               };
+
+               ehci@d8007900 {
+                       compatible = "via,vt8500-ehci";
+                       reg = <0xd8007900 0x200>;
+                       interrupts = <26>;
+               };
+
+               uhci@d8007b00 {
+                       compatible = "platform-uhci";
+                       reg = <0xd8007b00 0x200>;
+                       interrupts = <26>;
+               };
+
+               uhci@d8008d00 {
+                       compatible = "platform-uhci";
+                       reg = <0xd8008d00 0x200>;
+                       interrupts = <26>;
+               };
+
+               uart0: uart@d8200000 {
+                       compatible = "via,vt8500-uart";
+                       reg = <0xd8200000 0x1040>;
+                       interrupts = <32>;
+                       clocks = <&clkuart0>;
+               };
+
+               uart1: uart@d82b0000 {
+                       compatible = "via,vt8500-uart";
+                       reg = <0xd82b0000 0x1040>;
+                       interrupts = <33>;
+                       clocks = <&clkuart1>;
+               };
+
+                uart2: uart@d8210000 {
+                        compatible = "via,vt8500-uart";
+                        reg = <0xd8210000 0x1040>;
+                        interrupts = <47>;
+                        clocks = <&clkuart2>;
+                };
+
+                uart3: uart@d82c0000 {
+                        compatible = "via,vt8500-uart";
+                        reg = <0xd82c0000 0x1040>;
+                        interrupts = <50>;
+                        clocks = <&clkuart3>;
+                };
+
+               rtc@d8100000 {
+                       compatible = "via,vt8500-rtc";
+                       reg = <0xd8100000 0x10000>;
+                       interrupts = <48>;
+               };
+
+               sdhc@d800a000 {
+                       compatible = "wm,wm8505-sdhc";
+                       reg = <0xd800a000 0x1000>;
+                       interrupts = <20 21>;
+                       clocks = <&clksdhc>;
+                       bus-width = <4>;
+                       sdon-inverted;
+               };
+       };
+};
index 69667133321fa613db076367c1f8bc2620261cd0..d946372c4300c2a1b74728e12d031207fa8d8120 100644 (file)
@@ -19,6 +19,7 @@ CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_ARCH_MXC=y
 CONFIG_ARCH_MULTI_V6=y
 CONFIG_ARCH_MULTI_V7=y
+CONFIG_MACH_IMX31_DT=y
 CONFIG_MACH_MX31LILLY=y
 CONFIG_MACH_MX31LITE=y
 CONFIG_MACH_PCM037=y
@@ -32,7 +33,6 @@ CONFIG_MACH_PCM043=y
 CONFIG_MACH_MX35_3DS=y
 CONFIG_MACH_VPR200=y
 CONFIG_MACH_IMX51_DT=y
-CONFIG_MACH_MX51_3DS=y
 CONFIG_MACH_EUKREA_CPUIMX51SD=y
 CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
index 93f3794ba5cb8d66c0db6cb1ba393ed2710f1552..13482ea58b09e2007e140b87b66ac151938b036c 100644 (file)
@@ -56,6 +56,7 @@ CONFIG_AEABI=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_KIRKWOOD=y
 CONFIG_NET=y
 CONFIG_PACKET=y
 CONFIG_UNIX=y
index b5bc96cb65a79d87c2f65814e9cc4fecd69e4df1..cbd91bce1ca9f13ebbb0da7a4eb92ec2f42724b8 100644 (file)
@@ -33,6 +33,8 @@ CONFIG_MVNETA=y
 CONFIG_MARVELL_PHY=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_I2C=y
+CONFIG_I2C_MV64XXX=y
 CONFIG_SERIAL_8250_DW=y
 CONFIG_GPIOLIB=y
 CONFIG_GPIO_SYSFS=y
index 6a936c7c078afe7f56d0ade48de1dd5ff925cc08..002a1ceadceb635f65b1e5523ecdb7f4e74710a6 100644 (file)
@@ -11,6 +11,9 @@ CONFIG_PARTITION_ADVANCED=y
 CONFIG_BSD_DISKLABEL=y
 CONFIG_SOLARIS_X86_PARTITION=y
 CONFIG_ARCH_SIRF=y
+# CONFIG_SWP_EMULATE is not set
+CONFIG_SMP=y
+CONFIG_SCHED_MC=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_KEXEC=y
index a59dcb5ab5fce4ab92f8c372248c3a482d1507dc..ad41ec2471e87e7ac5cdf71839b764532e116d06 100644 (file)
@@ -64,6 +64,24 @@ extern unsigned int processor_id;
 #define read_cpuid_ext(reg) 0
 #endif
 
+#define ARM_CPU_IMP_ARM                        0x41
+#define ARM_CPU_IMP_INTEL              0x69
+
+#define ARM_CPU_PART_ARM1136           0xB360
+#define ARM_CPU_PART_ARM1156           0xB560
+#define ARM_CPU_PART_ARM1176           0xB760
+#define ARM_CPU_PART_ARM11MPCORE       0xB020
+#define ARM_CPU_PART_CORTEX_A8         0xC080
+#define ARM_CPU_PART_CORTEX_A9         0xC090
+#define ARM_CPU_PART_CORTEX_A5         0xC050
+#define ARM_CPU_PART_CORTEX_A15                0xC0F0
+#define ARM_CPU_PART_CORTEX_A7         0xC070
+
+#define ARM_CPU_XSCALE_ARCH_MASK       0xe000
+#define ARM_CPU_XSCALE_ARCH_V1         0x2000
+#define ARM_CPU_XSCALE_ARCH_V2         0x4000
+#define ARM_CPU_XSCALE_ARCH_V3         0x6000
+
 /*
  * The CPU ID never changes at run time, so we might as well tell the
  * compiler that it's constant.  Use this function to read the CPU ID
@@ -74,6 +92,21 @@ static inline unsigned int __attribute_const__ read_cpuid_id(void)
        return read_cpuid(CPUID_ID);
 }
 
+static inline unsigned int __attribute_const__ read_cpuid_implementor(void)
+{
+       return (read_cpuid_id() & 0xFF000000) >> 24;
+}
+
+static inline unsigned int __attribute_const__ read_cpuid_part_number(void)
+{
+       return read_cpuid_id() & 0xFFF0;
+}
+
+static inline unsigned int __attribute_const__ xscale_cpu_arch_version(void)
+{
+       return read_cpuid_part_number() & ARM_CPU_XSCALE_ARCH_MASK;
+}
+
 static inline unsigned int __attribute_const__ read_cpuid_cachetype(void)
 {
        return read_cpuid(CPUID_CACHETYPE);
index 4eb6d005ffaa4b625c9f86fc8532b046d0cf1f6a..006f02681cd8e240738efb823cc904d16abaea6e 100644 (file)
@@ -6,6 +6,23 @@
 #define SCU_PM_POWEROFF        3
 
 #ifndef __ASSEMBLER__
+
+#include <asm/cputype.h>
+
+static inline bool scu_a9_has_base(void)
+{
+       return read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9;
+}
+
+static inline unsigned long scu_a9_get_base(void)
+{
+       unsigned long pa;
+
+       asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (pa));
+
+       return pa;
+}
+
 unsigned int scu_get_core_count(void __iomem *);
 void scu_enable(void __iomem *);
 int scu_power_mode(void __iomem *, unsigned int);
index 0c4e17d4d359a42cb372341045068f7dc44462c6..c6f294cf18f0cf2a6d821a8ae7ed921af9cbaa8e 100644 (file)
@@ -34,7 +34,7 @@
 #define UART_PADDR     0x43f90000
 #elif defined (CONFIG_DEBUG_IMX51_UART)
 #define UART_PADDR     0x73fbc000
-#elif defined (CONFIG_DEBUG_IMX50_IMX53_UART)
+#elif defined (CONFIG_DEBUG_IMX53_UART)
 #define UART_PADDR     0x53fbc000
 #elif defined (CONFIG_DEBUG_IMX6Q_UART)
 #define UART_PADDR     IMX6Q_DEBUG_UART_BASE
diff --git a/arch/arm/include/debug/vt8500.S b/arch/arm/include/debug/vt8500.S
new file mode 100644 (file)
index 0000000..0e0ca08
--- /dev/null
@@ -0,0 +1,37 @@
+/* 
+ * Debugging macro include header
+ *
+ *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com>
+ *    Moved from arch/arm/mach-vt8500/include/mach/debug-macro.S
+ *    Minor changes for readability.
+ *
+ * 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.
+ */
+
+#define DEBUG_LL_PHYS_BASE             0xD8000000
+#define DEBUG_LL_VIRT_BASE             0xF8000000
+#define DEBUG_LL_UART_OFFSET           0x00200000
+
+#if defined(CONFIG_DEBUG_VT8500_UART0)
+       .macro  addruart, rp, rv, tmp
+       mov     \rp,      #DEBUG_LL_UART_OFFSET
+       orr     \rv, \rp, #DEBUG_LL_VIRT_BASE
+       orr     \rp, \rp, #DEBUG_LL_PHYS_BASE
+       .endm
+
+       .macro  senduart,rd,rx
+       strb    \rd, [\rx, #0]
+       .endm
+
+       .macro  busyuart,rd,rx
+1001:  ldr     \rd, [\rx, #0x1c]
+       ands    \rd, \rd, #0x2
+       bne     1001b
+       .endm
+
+       .macro  waituart,rd,rx
+       .endm
+
+#endif
index f9e8657dd24122cf67362e4def103d41cfd25329..31e0eb353cd80a1bf3c02dfe6c4b7c5b1112bec4 100644 (file)
@@ -149,12 +149,6 @@ again:
 static void
 armpmu_read(struct perf_event *event)
 {
-       struct hw_perf_event *hwc = &event->hw;
-
-       /* Don't read disabled counters! */
-       if (hwc->idx < 0)
-               return;
-
        armpmu_event_update(event);
 }
 
@@ -207,8 +201,6 @@ armpmu_del(struct perf_event *event, int flags)
        struct hw_perf_event *hwc = &event->hw;
        int idx = hwc->idx;
 
-       WARN_ON(idx < 0);
-
        armpmu_stop(event, PERF_EF_UPDATE);
        hw_events->events[idx] = NULL;
        clear_bit(idx, hw_events->used_mask);
@@ -358,7 +350,7 @@ __hw_perf_event_init(struct perf_event *event)
 {
        struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
        struct hw_perf_event *hwc = &event->hw;
-       int mapping, err;
+       int mapping;
 
        mapping = armpmu->map_event(event);
 
@@ -407,14 +399,12 @@ __hw_perf_event_init(struct perf_event *event)
                local64_set(&hwc->period_left, hwc->sample_period);
        }
 
-       err = 0;
        if (event->group_leader != event) {
-               err = validate_group(event);
-               if (err)
+               if (validate_group(event) != 0);
                        return -EINVAL;
        }
 
-       return err;
+       return 0;
 }
 
 static int armpmu_event_init(struct perf_event *event)
index 5f6620684e255cb7e8e5b34d36e31771682e8e40..1f2740e3dbc028c062c134d58ceb6344f2045d36 100644 (file)
@@ -147,7 +147,7 @@ static void cpu_pmu_init(struct arm_pmu *cpu_pmu)
        cpu_pmu->free_irq       = cpu_pmu_free_irq;
 
        /* Ensure the PMU has sane values out of reset. */
-       if (cpu_pmu && cpu_pmu->reset)
+       if (cpu_pmu->reset)
                on_each_cpu(cpu_pmu->reset, cpu_pmu, 1);
 }
 
@@ -201,48 +201,46 @@ static struct platform_device_id cpu_pmu_plat_device_ids[] = {
 static int probe_current_pmu(struct arm_pmu *pmu)
 {
        int cpu = get_cpu();
-       unsigned long cpuid = read_cpuid_id();
-       unsigned long implementor = (cpuid & 0xFF000000) >> 24;
-       unsigned long part_number = (cpuid & 0xFFF0);
+       unsigned long implementor = read_cpuid_implementor();
+       unsigned long part_number = read_cpuid_part_number();
        int ret = -ENODEV;
 
        pr_info("probing PMU on CPU %d\n", cpu);
 
        /* ARM Ltd CPUs. */
-       if (0x41 == implementor) {
+       if (implementor == ARM_CPU_IMP_ARM) {
                switch (part_number) {
-               case 0xB360:    /* ARM1136 */
-               case 0xB560:    /* ARM1156 */
-               case 0xB760:    /* ARM1176 */
+               case ARM_CPU_PART_ARM1136:
+               case ARM_CPU_PART_ARM1156:
+               case ARM_CPU_PART_ARM1176:
                        ret = armv6pmu_init(pmu);
                        break;
-               case 0xB020:    /* ARM11mpcore */
+               case ARM_CPU_PART_ARM11MPCORE:
                        ret = armv6mpcore_pmu_init(pmu);
                        break;
-               case 0xC080:    /* Cortex-A8 */
+               case ARM_CPU_PART_CORTEX_A8:
                        ret = armv7_a8_pmu_init(pmu);
                        break;
-               case 0xC090:    /* Cortex-A9 */
+               case ARM_CPU_PART_CORTEX_A9:
                        ret = armv7_a9_pmu_init(pmu);
                        break;
-               case 0xC050:    /* Cortex-A5 */
+               case ARM_CPU_PART_CORTEX_A5:
                        ret = armv7_a5_pmu_init(pmu);
                        break;
-               case 0xC0F0:    /* Cortex-A15 */
+               case ARM_CPU_PART_CORTEX_A15:
                        ret = armv7_a15_pmu_init(pmu);
                        break;
-               case 0xC070:    /* Cortex-A7 */
+               case ARM_CPU_PART_CORTEX_A7:
                        ret = armv7_a7_pmu_init(pmu);
                        break;
                }
        /* Intel CPUs [xscale]. */
-       } else if (0x69 == implementor) {
-               part_number = (cpuid >> 13) & 0x7;
-               switch (part_number) {
-               case 1:
+       } else if (implementor == ARM_CPU_IMP_INTEL) {
+               switch (xscale_cpu_arch_version()) {
+               case ARM_CPU_XSCALE_ARCH_V1:
                        ret = xscale1pmu_init(pmu);
                        break;
-               case 2:
+               case ARM_CPU_XSCALE_ARCH_V2:
                        ret = xscale2pmu_init(pmu);
                        break;
                }
@@ -279,17 +277,22 @@ static int cpu_pmu_device_probe(struct platform_device *pdev)
        }
 
        if (ret) {
-               pr_info("failed to register PMU devices!");
-               kfree(pmu);
-               return ret;
+               pr_info("failed to probe PMU!");
+               goto out_free;
        }
 
        cpu_pmu = pmu;
        cpu_pmu->plat_device = pdev;
        cpu_pmu_init(cpu_pmu);
-       armpmu_register(cpu_pmu, PERF_TYPE_RAW);
+       ret = armpmu_register(cpu_pmu, PERF_TYPE_RAW);
 
-       return 0;
+       if (!ret)
+               return 0;
+
+out_free:
+       pr_info("failed to register PMU devices!");
+       kfree(pmu);
+       return ret;
 }
 
 static struct platform_driver cpu_pmu_driver = {
index 041d0526a2885fb424bd58716af0c10e29e95419..03664b0e8fa426ae444d70834e6a263427f31fdf 100644 (file)
@@ -106,7 +106,7 @@ static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                },
                [C(OP_WRITE)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
-                       [C(RESULT_MISS)]        = ARMV6_PERFCTR_ICACHE_MISS,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
@@ -259,7 +259,7 @@ static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                },
                [C(OP_WRITE)] = {
                        [C(RESULT_ACCESS)]  = CACHE_OP_UNSUPPORTED,
-                       [C(RESULT_MISS)]    = ARMV6MPCORE_PERFCTR_ICACHE_MISS,
+                       [C(RESULT_MISS)]    = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]  = CACHE_OP_UNSUPPORTED,
index 4fbc757d9cffd6daebd6dd070047d2cfe1ff5e06..8c79a9e70b83d1dd31afdca93addae57c7c9c0cb 100644 (file)
@@ -157,8 +157,8 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                        [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
                },
                [C(OP_WRITE)] = {
-                       [C(RESULT_ACCESS)]      = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS,
-                       [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
@@ -282,7 +282,7 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                },
                [C(OP_WRITE)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
-                       [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
@@ -399,8 +399,8 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                        [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
                },
                [C(OP_WRITE)] = {
-                       [C(RESULT_ACCESS)]      = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
-                       [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                /*
                 * The prefetch counters don't differentiate between the I
@@ -527,8 +527,8 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                        [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
                },
                [C(OP_WRITE)] = {
-                       [C(RESULT_ACCESS)]      = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
-                       [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
@@ -651,8 +651,8 @@ static const unsigned armv7_a7_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                        [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
                },
                [C(OP_WRITE)] = {
-                       [C(RESULT_ACCESS)]      = ARMV7_PERFCTR_L1_ICACHE_ACCESS,
-                       [C(RESULT_MISS)]        = ARMV7_PERFCTR_L1_ICACHE_REFILL,
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
index 2b0fe30ec12e11715b834b13ee8998c043e2463d..63990c42fac9318131a35f93a573c99f53d0bd7b 100644 (file)
@@ -83,7 +83,7 @@ static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
                },
                [C(OP_WRITE)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
-                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_ICACHE_MISS,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
                },
                [C(OP_PREFETCH)] = {
                        [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
index 176d2d24782d7d83b4e3f89719f386f8b51aeefc..1a446a164c8c23efb99881a7c7459f5b1a78763a 100644 (file)
 #include <mach/bcm2835_soc.h>
 
 #define PM_RSTC                                0x1c
+#define PM_RSTS                                0x20
 #define PM_WDOG                                0x24
 
 #define PM_PASSWORD                    0x5a000000
 #define PM_RSTC_WRCFG_MASK             0x00000030
 #define PM_RSTC_WRCFG_FULL_RESET       0x00000020
+#define PM_RSTS_HADWRH_SET             0x00000040
 
 static void __iomem *wdt_regs;
 
@@ -67,6 +69,29 @@ static void bcm2835_restart(char mode, const char *cmd)
        mdelay(1);
 }
 
+/*
+ * We can't really power off, but if we do the normal reset scheme, and
+ * indicate to bootcode.bin not to reboot, then most of the chip will be
+ * powered off.
+ */
+static void bcm2835_power_off(void)
+{
+       u32 val;
+
+       /*
+        * We set the watchdog hard reset bit here to distinguish this reset
+        * from the normal (full) reset. bootcode.bin will not reboot after a
+        * hard reset.
+        */
+       val = readl_relaxed(wdt_regs + PM_RSTS);
+       val &= ~PM_RSTC_WRCFG_MASK;
+       val |= PM_PASSWORD | PM_RSTS_HADWRH_SET;
+       writel_relaxed(val, wdt_regs + PM_RSTS);
+
+       /* Continue with normal reset mechanism */
+       bcm2835_restart(0, "");
+}
+
 static struct map_desc io_map __initdata = {
        .virtual = BCM2835_PERIPH_VIRT,
        .pfn = __phys_to_pfn(BCM2835_PERIPH_PHYS),
@@ -84,6 +109,9 @@ static void __init bcm2835_init(void)
        int ret;
 
        bcm2835_setup_restart();
+       if (wdt_regs)
+               pm_power_off = bcm2835_power_off;
+
        bcm2835_init_clocks();
 
        ret = of_platform_populate(NULL, of_default_bus_match_table, NULL,
index e3742716cbaa9945348eaf73c243fc74e0d21491..6da25eebf9110f3548fa8f803f0d81bf7e330b4e 100644 (file)
@@ -652,8 +652,13 @@ static __init void da830_evm_init(void)
        if (ret)
                pr_warning("da830_evm_init: rtc setup failed: %d\n", ret);
 
-       ret = da8xx_register_spi(0, da830evm_spi_info,
-                                ARRAY_SIZE(da830evm_spi_info));
+       ret = spi_register_board_info(da830evm_spi_info,
+                                     ARRAY_SIZE(da830evm_spi_info));
+       if (ret)
+               pr_warn("%s: spi info registration failed: %d\n", __func__,
+                       ret);
+
+       ret = da8xx_register_spi_bus(0, ARRAY_SIZE(da830evm_spi_info));
        if (ret)
                pr_warning("da830_evm_init: spi 0 registration failed: %d\n",
                           ret);
index 3b3356097bb00f59686914402436cc830fc1f9f2..3a76a47df39c17a9d2d6c0d5207928f39aeb03de 100644 (file)
@@ -1565,8 +1565,13 @@ static __init void da850_evm_init(void)
 
        da850_vpif_init();
 
-       ret = da8xx_register_spi(1, da850evm_spi_info,
-                                ARRAY_SIZE(da850evm_spi_info));
+       ret = spi_register_board_info(da850evm_spi_info,
+                                     ARRAY_SIZE(da850evm_spi_info));
+       if (ret)
+               pr_warn("%s: spi info registration failed: %d\n", __func__,
+                       ret);
+
+       ret = da8xx_register_spi_bus(1, ARRAY_SIZE(da850evm_spi_info));
        if (ret)
                pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
                                ret);
index b0df578bf744c8c88ffc4a1e687270fc9a91f5c7..9549d53aa63f0489f741a6a7f43b83b9a2505a05 100644 (file)
@@ -529,8 +529,13 @@ static void __init mityomapl138_init(void)
 
        mityomapl138_setup_nand();
 
-       ret = da8xx_register_spi(1, mityomapl138_spi_flash_info,
-                              ARRAY_SIZE(mityomapl138_spi_flash_info));
+       ret = spi_register_board_info(mityomapl138_spi_flash_info,
+                                     ARRAY_SIZE(mityomapl138_spi_flash_info));
+       if (ret)
+               pr_warn("spi info registration failed: %d\n", ret);
+
+       ret = da8xx_register_spi_bus(1,
+                                    ARRAY_SIZE(mityomapl138_spi_flash_info));
        if (ret)
                pr_warning("spi 1 registration failed: %d\n", ret);
 
index 34668ead53c73b1c70ee0b09261ba74ff8a3627b..d458558ee84a436a0506835c3ca9bdfa722798de 100644 (file)
@@ -52,6 +52,40 @@ static void __clk_disable(struct clk *clk)
                __clk_disable(clk->parent);
 }
 
+int davinci_clk_reset(struct clk *clk, bool reset)
+{
+       unsigned long flags;
+
+       if (clk == NULL || IS_ERR(clk))
+               return -EINVAL;
+
+       spin_lock_irqsave(&clockfw_lock, flags);
+       if (clk->flags & CLK_PSC)
+               davinci_psc_reset(clk->gpsc, clk->lpsc, reset);
+       spin_unlock_irqrestore(&clockfw_lock, flags);
+
+       return 0;
+}
+EXPORT_SYMBOL(davinci_clk_reset);
+
+int davinci_clk_reset_assert(struct clk *clk)
+{
+       if (clk == NULL || IS_ERR(clk) || !clk->reset)
+               return -EINVAL;
+
+       return clk->reset(clk, true);
+}
+EXPORT_SYMBOL(davinci_clk_reset_assert);
+
+int davinci_clk_reset_deassert(struct clk *clk)
+{
+       if (clk == NULL || IS_ERR(clk) || !clk->reset)
+               return -EINVAL;
+
+       return clk->reset(clk, false);
+}
+EXPORT_SYMBOL(davinci_clk_reset_deassert);
+
 int clk_enable(struct clk *clk)
 {
        unsigned long flags;
@@ -535,7 +569,7 @@ int davinci_set_refclk_rate(unsigned long rate)
 }
 
 int __init davinci_clk_init(struct clk_lookup *clocks)
-  {
+{
        struct clk_lookup *c;
        struct clk *clk;
        size_t num_clocks = 0;
@@ -576,6 +610,9 @@ int __init davinci_clk_init(struct clk_lookup *clocks)
                if (clk->lpsc)
                        clk->flags |= CLK_PSC;
 
+               if (clk->flags & PSC_LRST)
+                       clk->reset = davinci_clk_reset;
+
                clk_register(clk);
                num_clocks++;
 
index 46f0f1bf1a4ce9b71fd9cc88af7dcc1a3a8e2fe9..8694b395fc92602a60355bb35bd414f0137b041c 100644 (file)
@@ -103,6 +103,7 @@ struct clk {
        unsigned long (*recalc) (struct clk *);
        int (*set_rate) (struct clk *clk, unsigned long rate);
        int (*round_rate) (struct clk *clk, unsigned long rate);
+       int (*reset) (struct clk *clk, bool reset);
 };
 
 /* Clock flags: SoC-specific flags start at BIT(16) */
@@ -112,6 +113,7 @@ struct clk {
 #define PRE_PLL                        BIT(4) /* source is before PLL mult/div */
 #define PSC_SWRSTDISABLE       BIT(5) /* Disable state is SwRstDisable */
 #define PSC_FORCE              BIT(6) /* Force module state transtition */
+#define PSC_LRST               BIT(8) /* Use local reset on enable/disable */
 
 #define CLK(dev, con, ck)      \
        {                       \
@@ -126,6 +128,7 @@ int davinci_set_pllrate(struct pll_data *pll, unsigned int prediv,
 int davinci_set_sysclk_rate(struct clk *clk, unsigned long rate);
 int davinci_set_refclk_rate(unsigned long rate);
 int davinci_simple_set_rate(struct clk *clk, unsigned long rate);
+int davinci_clk_reset(struct clk *clk, bool reset);
 
 extern struct platform_device davinci_wdt_device;
 extern void davinci_watchdog_reset(struct platform_device *);
index 6b9154e9f9080f082442b85915d8092af06866b5..0c4a26ddebba03ec3f082ea96735551bf474d819 100644 (file)
@@ -76,6 +76,13 @@ static struct clk pll0_aux_clk = {
        .flags          = CLK_PLL | PRE_PLL,
 };
 
+static struct clk pll0_sysclk1 = {
+       .name           = "pll0_sysclk1",
+       .parent         = &pll0_clk,
+       .flags          = CLK_PLL,
+       .div_reg        = PLLDIV1,
+};
+
 static struct clk pll0_sysclk2 = {
        .name           = "pll0_sysclk2",
        .parent         = &pll0_clk,
@@ -368,10 +375,19 @@ static struct clk sata_clk = {
        .flags          = PSC_FORCE,
 };
 
+static struct clk dsp_clk = {
+       .name           = "dsp",
+       .parent         = &pll0_sysclk1,
+       .domain         = DAVINCI_GPSC_DSPDOMAIN,
+       .lpsc           = DA8XX_LPSC0_GEM,
+       .flags          = PSC_LRST | PSC_FORCE,
+};
+
 static struct clk_lookup da850_clks[] = {
        CLK(NULL,               "ref",          &ref_clk),
        CLK(NULL,               "pll0",         &pll0_clk),
        CLK(NULL,               "pll0_aux",     &pll0_aux_clk),
+       CLK(NULL,               "pll0_sysclk1", &pll0_sysclk1),
        CLK(NULL,               "pll0_sysclk2", &pll0_sysclk2),
        CLK(NULL,               "pll0_sysclk3", &pll0_sysclk3),
        CLK(NULL,               "pll0_sysclk4", &pll0_sysclk4),
@@ -413,6 +429,7 @@ static struct clk_lookup da850_clks[] = {
        CLK("spi_davinci.1",    NULL,           &spi1_clk),
        CLK("vpif",             NULL,           &vpif_clk),
        CLK("ahci",             NULL,           &sata_clk),
+       CLK("davinci-rproc.0",  NULL,           &dsp_clk),
        CLK(NULL,               NULL,           NULL),
 };
 
index 2d5502d84a223aaf9b0a05ccb80d284393c9a815..aa402bc160c80d3e329b008560bb0bc4974f57d7 100644 (file)
@@ -751,7 +751,7 @@ void __iomem * __init da8xx_get_mem_ctlr(void)
 
        da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);
        if (!da8xx_ddr2_ctlr_base)
-               pr_warning("%s: Unable to map DDR2 controller", __func__);
+               pr_warn("%s: Unable to map DDR2 controller", __func__);
 
        return da8xx_ddr2_ctlr_base;
 }
@@ -832,7 +832,7 @@ static struct resource da8xx_spi1_resources[] = {
        },
 };
 
-struct davinci_spi_platform_data da8xx_spi_pdata[] = {
+static struct davinci_spi_platform_data da8xx_spi_pdata[] = {
        [0] = {
                .version        = SPI_VERSION_2,
                .intr_line      = 1,
@@ -866,20 +866,12 @@ static struct platform_device da8xx_spi_device[] = {
        },
 };
 
-int __init da8xx_register_spi(int instance, const struct spi_board_info *info,
-                             unsigned len)
+int __init da8xx_register_spi_bus(int instance, unsigned num_chipselect)
 {
-       int ret;
-
        if (instance < 0 || instance > 1)
                return -EINVAL;
 
-       ret = spi_register_board_info(info, len);
-       if (ret)
-               pr_warning("%s: failed to register board info for spi %d :"
-                          " %d\n", __func__, instance, ret);
-
-       da8xx_spi_pdata[instance].num_chipselect = len;
+       da8xx_spi_pdata[instance].num_chipselect = num_chipselect;
 
        if (instance == 1 && cpu_is_davinci_da850()) {
                da8xx_spi1_resources[0].start = DA850_SPI1_BASE;
index a3b040219876646eeaf91de4bbe71e3590f6ef3b..3e8af6a0b64c6aac9f92202a0c732417167005db 100644 (file)
@@ -18,4 +18,7 @@ struct clk;
 extern int clk_register(struct clk *clk);
 extern void clk_unregister(struct clk *clk);
 
+int davinci_clk_reset_assert(struct clk *c);
+int davinci_clk_reset_deassert(struct clk *c);
+
 #endif
index 700d311c6854f0abc3054d4a732fbf8fc522a418..1b14aea403104bf743c05ca1c54a37dd4e6534fb 100644 (file)
@@ -82,8 +82,7 @@ void __init da850_init(void);
 int da830_register_edma(struct edma_rsv_info *rsv);
 int da850_register_edma(struct edma_rsv_info *rsv[2]);
 int da8xx_register_i2c(int instance, struct davinci_i2c_platform_data *pdata);
-int da8xx_register_spi(int instance,
-               const struct spi_board_info *info, unsigned len);
+int da8xx_register_spi_bus(int instance, unsigned num_chipselect);
 int da8xx_register_watchdog(void);
 int da8xx_register_usb20(unsigned mA, unsigned potpgt);
 int da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata);
@@ -110,7 +109,6 @@ extern struct platform_device da8xx_serial_device;
 extern struct emac_platform_data da8xx_emac_pdata;
 extern struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata;
 extern struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata;
-extern struct davinci_spi_platform_data da8xx_spi_pdata[];
 
 extern struct platform_device da8xx_wdt_device;
 
index 40a0027838e81601427fbb2bc7ff04311e5300ad..0a22710493fd27f5cc2f8178741fdb0fcc1de666 100644 (file)
 
 #define MDSTAT_STATE_MASK      0x3f
 #define PDSTAT_STATE_MASK      0x1f
+#define MDCTL_LRST             BIT(8)
 #define MDCTL_FORCE            BIT(31)
 #define PDCTL_NEXT             BIT(0)
 #define PDCTL_EPCGOOD          BIT(8)
 #ifndef __ASSEMBLER__
 
 extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id);
+extern void davinci_psc_reset(unsigned int ctlr, unsigned int id,
+               bool reset);
 extern void davinci_psc_config(unsigned int domain, unsigned int ctlr,
                unsigned int id, bool enable, u32 flags);
 
index d7e210f4b55c85d7e2a2fc4831fb3f0a77f72990..82fdc69d5728c7e897851d1a7ccb91a22e06cb32 100644 (file)
@@ -35,7 +35,7 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
        struct davinci_soc_info *soc_info = &davinci_soc_info;
 
        if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) {
-               pr_warning("PSC: Bad psc data: 0x%x[%d]\n",
+               pr_warn("PSC: Bad psc data: 0x%x[%d]\n",
                                (int)soc_info->psc_bases, ctlr);
                return 0;
        }
@@ -48,6 +48,31 @@ int __init davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id)
        return mdstat & BIT(12);
 }
 
+/* Control "reset" line associated with PSC domain */
+void davinci_psc_reset(unsigned int ctlr, unsigned int id, bool reset)
+{
+       u32 mdctl;
+       void __iomem *psc_base;
+       struct davinci_soc_info *soc_info = &davinci_soc_info;
+
+       if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) {
+               pr_warn("PSC: Bad psc data: 0x%x[%d]\n",
+                               (int)soc_info->psc_bases, ctlr);
+               return;
+       }
+
+       psc_base = ioremap(soc_info->psc_bases[ctlr], SZ_4K);
+
+       mdctl = readl(psc_base + MDCTL + 4 * id);
+       if (reset)
+               mdctl &= ~MDCTL_LRST;
+       else
+               mdctl |= MDCTL_LRST;
+       writel(mdctl, psc_base + MDCTL + 4 * id);
+
+       iounmap(psc_base);
+}
+
 /* Enable or disable a PSC domain */
 void davinci_psc_config(unsigned int domain, unsigned int ctlr,
                unsigned int id, bool enable, u32 flags)
@@ -58,7 +83,7 @@ void davinci_psc_config(unsigned int domain, unsigned int ctlr,
        u32 next_state = PSC_STATE_ENABLE;
 
        if (!soc_info->psc_bases || (ctlr >= soc_info->psc_bases_num)) {
-               pr_warning("PSC: Bad psc data: 0x%x[%d]\n",
+               pr_warn("PSC: Bad psc data: 0x%x[%d]\n",
                                (int)soc_info->psc_bases, ctlr);
                return;
        }
index 0a2349dc70184021e268db86ef9c3cb0e966f8a3..7b11d3329e81dee99447f87277b7b6309d795354 100644 (file)
@@ -95,9 +95,6 @@ config MACH_MX27
 config ARCH_MX5
        bool
 
-config ARCH_MX50
-       bool
-
 config ARCH_MX51
        bool
 
@@ -164,11 +161,6 @@ config SOC_IMX5
        select CPU_V7
        select MXC_TZIC
 
-config SOC_IMX50
-       bool
-       select ARCH_MX50
-       select SOC_IMX5
-
 config SOC_IMX51
        bool
        select ARCH_MX5
@@ -738,25 +730,10 @@ endif
 
 if ARCH_MULTI_V7
 
-comment "i.MX5 platforms:"
-
-config MACH_MX50_RDP
-       bool "Support MX50 reference design platform"
-       depends on BROKEN
-       select IMX_HAVE_PLATFORM_IMX_I2C
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select IMX_HAVE_PLATFORM_SPI_IMX
-       select SOC_IMX50
-       help
-         Include support for MX50 reference design platform (RDP) board. This
-         includes specific configurations for the board and its peripherals.
-
 comment "i.MX51 machines:"
 
 config MACH_IMX51_DT
        bool "Support i.MX51 platforms from device tree"
-       select MACH_MX51_BABBAGE
        select SOC_IMX51
        help
          Include support for Freescale i.MX51 based platforms
@@ -777,19 +754,6 @@ config MACH_MX51_BABBAGE
          u-boot. This includes specific configurations for the board and its
          peripherals.
 
-config MACH_MX51_3DS
-       bool "Support MX51PDK (3DS)"
-       select IMX_HAVE_PLATFORM_IMX2_WDT
-       select IMX_HAVE_PLATFORM_IMX_KEYPAD
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select IMX_HAVE_PLATFORM_SPI_IMX
-       select MXC_DEBUG_BOARD
-       select SOC_IMX51
-       help
-         Include support for MX51PDK (3DS) platform. This includes specific
-         configurations for the board and its peripherals.
-
 config MACH_EUKREA_CPUIMX51SD
        bool "Support Eukrea CPUIMX51SD module"
        select IMX_HAVE_PLATFORM_FSL_USB2_UDC
index 0634b3152c24ca6918ba6584c8da914fd5d7dacf..c4ce0906d76a557f36632789526abf9d03efb8b7 100644 (file)
@@ -28,7 +28,11 @@ obj-$(CONFIG_MXC_ULPI) += ulpi.o
 obj-$(CONFIG_MXC_USE_EPIT) += epit.o
 obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o
 obj-$(CONFIG_CPU_FREQ_IMX)    += cpufreq.o
-obj-$(CONFIG_CPU_IDLE) += cpuidle.o
+
+ifeq ($(CONFIG_CPU_IDLE),y)
+obj-y += cpuidle.o
+obj-$(CONFIG_SOC_IMX6Q) += cpuidle-imx6q.o
+endif
 
 ifdef CONFIG_SND_IMX_SOC
 obj-y += ssi-fiq.o
@@ -88,7 +92,6 @@ obj-$(CONFIG_MACH_EUKREA_CPUIMX35SD) += mach-cpuimx35.o
 obj-$(CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD) += eukrea_mbimxsd35-baseboard.o
 obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o
 
-obj-$(CONFIG_DEBUG_LL) += lluart.o
 obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o
 obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o
 obj-$(CONFIG_HAVE_IMX_SRC) += src.o
@@ -103,10 +106,8 @@ endif
 
 # i.MX5 based machines
 obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o
-obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o
 obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o
 obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd51-baseboard.o
-obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o
 
 obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o
 obj-$(CONFIG_SOC_IMX53) += mach-imx53.o
index b27815de8473326788c96d08e2e57de1a54ec608..41ba1bb0437bf095914c59227dd0665d2616f71c 100644 (file)
@@ -22,10 +22,6 @@ zreladdr-$(CONFIG_SOC_IMX35) += 0x80008000
 params_phys-$(CONFIG_SOC_IMX35)        := 0x80000100
 initrd_phys-$(CONFIG_SOC_IMX35)        := 0x80800000
 
-zreladdr-$(CONFIG_SOC_IMX50)   += 0x70008000
-params_phys-$(CONFIG_SOC_IMX50)        := 0x70000100
-initrd_phys-$(CONFIG_SOC_IMX50)        := 0x70800000
-
 zreladdr-$(CONFIG_SOC_IMX51)   += 0x90008000
 params_phys-$(CONFIG_SOC_IMX51)        := 0x90000100
 initrd_phys-$(CONFIG_SOC_IMX51)        := 0x90800000
index 1ffe3b534e51562aca68b587c383bb3df00b38a8..d24b0d68e83fec3beee96dc6b80c2088160f1a62 100644 (file)
@@ -62,7 +62,7 @@ static const char *clko_sel_clks[] = {
        "32k", "usb_div", "dptc",
 };
 
-static const char *ssi_sel_clks[] = { "spll", "mpll", };
+static const char *ssi_sel_clks[] = { "spll_gate", "mpll", };
 
 enum mx27_clks {
        dummy, ckih, ckil, mpll, spll, mpll_main2, ahb, ipg, nfc_div, per1_div,
@@ -82,7 +82,7 @@ enum mx27_clks {
        csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate,
        uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate,
        uart2_ipg_gate, uart1_ipg_gate, ckih_div1p5, fpm, mpll_osc_sel,
-       mpll_sel, clk_max
+       mpll_sel, spll_gate, clk_max
 };
 
 static struct clk *clk[clk_max];
@@ -104,6 +104,7 @@ int __init mx27_clocks_init(unsigned long fref)
                        ARRAY_SIZE(mpll_sel_clks));
        clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
        clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0);
+       clk[spll_gate] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
        clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3);
 
        if (mx27_revision() >= IMX_CHIP_REVISION_2_0) {
@@ -121,7 +122,7 @@ int __init mx27_clocks_init(unsigned long fref)
        clk[per4_div] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6);
        clk[vpu_sel] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks));
        clk[vpu_div] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 6);
-       clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 28, 3);
+       clk[usb_div] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 28, 3);
        clk[cpu_sel] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));
        clk[clko_sel] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));
        if (mx27_revision() >= IMX_CHIP_REVISION_2_0)
index 16ccbd41dea9da4b830787b11e099dff7a19a141..b5b65f3efaf1c30651686f9d79ee004318815b66 100644 (file)
@@ -34,8 +34,8 @@ static const char *csi_sel[] = { "upll", "spll", };
 static const char *fir_sel[] = { "mcu_main", "upll", "spll" };
 
 enum mx31_clks {
-       ckih, ckil, mpll, spll, upll, mcu_main, hsp, ahb, nfc, ipg, per_div,
-       per, csi, fir, csi_div, usb_div_pre, usb_div_post, fir_div_pre,
+       dummy, ckih, ckil, mpll, spll, upll, mcu_main, hsp, ahb, nfc, ipg,
+       per_div, per, csi, fir, csi_div, usb_div_pre, usb_div_post, fir_div_pre,
        fir_div_post, sdhc1_gate, sdhc2_gate, gpt_gate, epit1_gate, epit2_gate,
        iim_gate, ata_gate, sdma_gate, cspi3_gate, rng_gate, uart1_gate,
        uart2_gate, ssi1_gate, i2c1_gate, i2c2_gate, i2c3_gate, hantro_gate,
@@ -46,12 +46,15 @@ enum mx31_clks {
 };
 
 static struct clk *clk[clk_max];
+static struct clk_onecell_data clk_data;
 
 int __init mx31_clocks_init(unsigned long fref)
 {
        void __iomem *base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR);
        int i;
+       struct device_node *np;
 
+       clk[dummy] = imx_clk_fixed("dummy", 0);
        clk[ckih] = imx_clk_fixed("ckih", fref);
        clk[ckil] = imx_clk_fixed("ckil", 32768);
        clk[mpll] = imx_clk_pllv1("mpll", "ckih", base + MXC_CCM_MPCTL);
@@ -116,6 +119,14 @@ int __init mx31_clocks_init(unsigned long fref)
                        pr_err("imx31 clk %d: register failed with %ld\n",
                                i, PTR_ERR(clk[i]));
 
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx31-ccm");
+
+       if (np) {
+               clk_data.clks = clk;
+               clk_data.clk_num = ARRAY_SIZE(clk);
+               of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+       }
+
        clk_register_clkdev(clk[gpt_gate], "per", "imx-gpt.0");
        clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0");
        clk_register_clkdev(clk[cspi1_gate], NULL, "imx31-cspi.0");
index f0727e80815dc7adcb7ed2f1fbfcb43723fbd91a..74e3a34d78b80a25be2edeb9afcc2f027f610368 100644 (file)
@@ -67,13 +67,13 @@ enum mx35_clks {
 
 static struct clk *clk[clk_max];
 
-int __init mx35_clocks_init()
+int __init mx35_clocks_init(void)
 {
        void __iomem *base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR);
        u32 pdr0, consumer_sel, hsp_sel;
        struct arm_ahb_div *aad;
        unsigned char *hsp_div;
-       int i;
+       u32 i;
 
        pdr0 = __raw_readl(base + MXC_CCM_PDR0);
        consumer_sel = (pdr0 >> 16) & 0xf;
index c0c4e723b7f5dee0a34526fd280cab2e8b3966b1..540138c4606c41e0bf70c175f2ceea188c63936a 100644 (file)
 #define BM_CLPCR_MASK_SCU_IDLE         (0x1 << 26)
 #define BM_CLPCR_MASK_L2CC_IDLE                (0x1 << 27)
 
+#define CGPR                           0x64
+#define BM_CGPR_CHICKEN_BIT            (0x1 << 17)
+
 static void __iomem *ccm_base;
 
-void __init imx6q_clock_map_io(void) { }
+void imx6q_set_chicken_bit(void)
+{
+       u32 val = readl_relaxed(ccm_base + CGPR);
+
+       val |= BM_CGPR_CHICKEN_BIT;
+       writel_relaxed(val, ccm_base + CGPR);
+}
 
 int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)
 {
@@ -68,6 +77,7 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)
                break;
        case WAIT_UNCLOCKED:
                val |= 0x1 << BP_CLPCR_LPM;
+               val |= BM_CLPCR_ARM_CLK_DIS_ON_LPM;
                break;
        case STOP_POWER_ON:
                val |= 0x2 << BP_CLPCR_LPM;
index e17dbc50c85f1c4372169db28d6ed11ab50bf1a8..5a800bfcec5b9e67bbf20b6b7001a70867c28482 100644 (file)
@@ -21,7 +21,6 @@ extern void mx25_map_io(void);
 extern void mx27_map_io(void);
 extern void mx31_map_io(void);
 extern void mx35_map_io(void);
-extern void mx50_map_io(void);
 extern void mx51_map_io(void);
 extern void mx53_map_io(void);
 extern void imx1_init_early(void);
@@ -30,7 +29,6 @@ extern void imx25_init_early(void);
 extern void imx27_init_early(void);
 extern void imx31_init_early(void);
 extern void imx35_init_early(void);
-extern void imx50_init_early(void);
 extern void imx51_init_early(void);
 extern void imx53_init_early(void);
 extern void mxc_init_irq(void __iomem *);
@@ -41,7 +39,6 @@ extern void mx25_init_irq(void);
 extern void mx27_init_irq(void);
 extern void mx31_init_irq(void);
 extern void mx35_init_irq(void);
-extern void mx50_init_irq(void);
 extern void mx51_init_irq(void);
 extern void mx53_init_irq(void);
 extern void imx1_soc_init(void);
@@ -50,7 +47,6 @@ extern void imx25_soc_init(void);
 extern void imx27_soc_init(void);
 extern void imx31_soc_init(void);
 extern void imx35_soc_init(void);
-extern void imx50_soc_init(void);
 extern void imx51_soc_init(void);
 extern void imx51_init_late(void);
 extern void imx53_init_late(void);
@@ -109,26 +105,22 @@ void tzic_handle_irq(struct pt_regs *);
 #define imx27_handle_irq avic_handle_irq
 #define imx31_handle_irq avic_handle_irq
 #define imx35_handle_irq avic_handle_irq
-#define imx50_handle_irq tzic_handle_irq
 #define imx51_handle_irq tzic_handle_irq
 #define imx53_handle_irq tzic_handle_irq
 
 extern void imx_enable_cpu(int cpu, bool enable);
 extern void imx_set_cpu_jump(int cpu, void *jump_addr);
-#ifdef CONFIG_DEBUG_LL
-extern void imx_lluart_map_io(void);
-#else
-static inline void imx_lluart_map_io(void) {}
-#endif
 extern void v7_cpu_resume(void);
 extern u32 *pl310_get_save_ptr(void);
 #ifdef CONFIG_SMP
 extern void v7_secondary_startup(void);
 extern void imx_scu_map_io(void);
 extern void imx_smp_prepare(void);
+extern void imx_scu_standby_enable(void);
 #else
 static inline void imx_scu_map_io(void) {}
 static inline void imx_smp_prepare(void) {}
+static inline void imx_scu_standby_enable(void) {}
 #endif
 extern void imx_enable_cpu(int cpu, bool enable);
 extern void imx_set_cpu_jump(int cpu, void *jump_addr);
@@ -138,7 +130,7 @@ extern void imx_gpc_init(void);
 extern void imx_gpc_pre_suspend(void);
 extern void imx_gpc_post_resume(void);
 extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
-extern void imx6q_clock_map_io(void);
+extern void imx6q_set_chicken_bit(void);
 
 extern void imx_cpu_die(unsigned int cpu);
 extern int imx_cpu_kill(unsigned int cpu);
index d88760014ff96ab46277d3ef97e4f592105b5dbb..d7ce72252a4e6b34d5416e387c3bf1b02f7c6c2b 100644 (file)
@@ -22,7 +22,6 @@
 static int mx5_cpu_rev = -1;
 
 #define IIM_SREV 0x24
-#define MX50_HW_ADADIG_DIGPROG 0xB0
 
 static int get_mx51_srev(void)
 {
@@ -108,41 +107,3 @@ int mx53_revision(void)
        return mx5_cpu_rev;
 }
 EXPORT_SYMBOL(mx53_revision);
-
-static int get_mx50_srev(void)
-{
-       void __iomem *anatop = ioremap(MX50_ANATOP_BASE_ADDR, SZ_8K);
-       u32 rev;
-
-       if (!anatop) {
-               mx5_cpu_rev = -EINVAL;
-               return 0;
-       }
-
-       rev = readl(anatop + MX50_HW_ADADIG_DIGPROG);
-       rev &= 0xff;
-
-       iounmap(anatop);
-       if (rev == 0x0)
-               return IMX_CHIP_REVISION_1_0;
-       else if (rev == 0x1)
-               return IMX_CHIP_REVISION_1_1;
-       return 0;
-}
-
-/*
- * Returns:
- *     the silicon revision of the cpu
- *     -EINVAL - not a mx50
- */
-int mx50_revision(void)
-{
-       if (!cpu_is_mx50())
-               return -EINVAL;
-
-       if (mx5_cpu_rev == -1)
-               mx5_cpu_rev = get_mx50_srev();
-
-       return mx5_cpu_rev;
-}
-EXPORT_SYMBOL(mx50_revision);
diff --git a/arch/arm/mach-imx/cpuidle-imx6q.c b/arch/arm/mach-imx/cpuidle-imx6q.c
new file mode 100644 (file)
index 0000000..d533e26
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ *
+ * 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 <linux/clockchips.h>
+#include <linux/cpuidle.h>
+#include <linux/module.h>
+#include <asm/cpuidle.h>
+#include <asm/proc-fns.h>
+
+#include "common.h"
+#include "cpuidle.h"
+
+static atomic_t master = ATOMIC_INIT(0);
+static DEFINE_SPINLOCK(master_lock);
+
+static int imx6q_enter_wait(struct cpuidle_device *dev,
+                           struct cpuidle_driver *drv, int index)
+{
+       int cpu = dev->cpu;
+
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu);
+
+       if (atomic_inc_return(&master) == num_online_cpus()) {
+               /*
+                * With this lock, we prevent other cpu to exit and enter
+                * this function again and become the master.
+                */
+               if (!spin_trylock(&master_lock))
+                       goto idle;
+               imx6q_set_lpm(WAIT_UNCLOCKED);
+               cpu_do_idle();
+               imx6q_set_lpm(WAIT_CLOCKED);
+               spin_unlock(&master_lock);
+               goto done;
+       }
+
+idle:
+       cpu_do_idle();
+done:
+       atomic_dec(&master);
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu);
+
+       return index;
+}
+
+/*
+ * For each cpu, setup the broadcast timer because local timer
+ * stops for the states other than WFI.
+ */
+static void imx6q_setup_broadcast_timer(void *arg)
+{
+       int cpu = smp_processor_id();
+
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu);
+}
+
+static struct cpuidle_driver imx6q_cpuidle_driver = {
+       .name = "imx6q_cpuidle",
+       .owner = THIS_MODULE,
+       .en_core_tk_irqen = 1,
+       .states = {
+               /* WFI */
+               ARM_CPUIDLE_WFI_STATE,
+               /* WAIT */
+               {
+                       .exit_latency = 50,
+                       .target_residency = 75,
+                       .flags = CPUIDLE_FLAG_TIME_VALID,
+                       .enter = imx6q_enter_wait,
+                       .name = "WAIT",
+                       .desc = "Clock off",
+               },
+       },
+       .state_count = 2,
+       .safe_state_index = 0,
+};
+
+int __init imx6q_cpuidle_init(void)
+{
+       /* Need to enable SCU standby for entering WAIT modes */
+       imx_scu_standby_enable();
+
+       /* Set chicken bit to get a reliable WAIT mode support */
+       imx6q_set_chicken_bit();
+
+       /* Configure the broadcast timer on each cpu */
+       on_each_cpu(imx6q_setup_broadcast_timer, NULL, 1);
+
+       return imx_cpuidle_init(&imx6q_cpuidle_driver);
+}
index bc932d1af37279ae3c4f3faa4dc0138745a0bda1..e092d1359d94e2f73bcf40432eb7924b59e1c1a9 100644 (file)
 
 #ifdef CONFIG_CPU_IDLE
 extern int imx_cpuidle_init(struct cpuidle_driver *drv);
+extern int imx6q_cpuidle_init(void);
 #else
 static inline int imx_cpuidle_init(struct cpuidle_driver *drv)
 {
        return -ENODEV;
 }
+static inline int imx6q_cpuidle_init(void)
+{
+       return -ENODEV;
+}
 #endif
diff --git a/arch/arm/mach-imx/devices-imx50.h b/arch/arm/mach-imx/devices-imx50.h
deleted file mode 100644 (file)
index 2c29039..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
- */
-
-/*
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include "devices/devices-common.h"
-
-extern const struct imx_imx_uart_1irq_data imx50_imx_uart_data[];
-#define imx50_add_imx_uart(id, pdata)  \
-       imx_add_imx_uart_1irq(&imx50_imx_uart_data[id], pdata)
-
-extern const struct imx_fec_data imx50_fec_data;
-#define imx50_add_fec(pdata)   \
-       imx_add_fec(&imx50_fec_data, pdata)
-
-extern const struct imx_imx_i2c_data imx50_imx_i2c_data[];
-#define imx50_add_imx_i2c(id, pdata)   \
-       imx_add_imx_i2c(&imx50_imx_i2c_data[id], pdata)
index 9a8f1ca7bcb1870245c143b75ea874815b2a3d50..9b9ba1f4ffe134f52f92e45a4cfd96fd2cd74a0f 100644 (file)
@@ -1,6 +1,6 @@
 config IMX_HAVE_PLATFORM_FEC
        bool
-       default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX50 || SOC_IMX51 || SOC_IMX53
+       default y if ARCH_MX25 || SOC_IMX27 || SOC_IMX35 || SOC_IMX51 || SOC_IMX53
 
 config IMX_HAVE_PLATFORM_FLEXCAN
        bool
index 2cb188ad9a0a614422892a7ef64396bacdead050..63eba08f87b1a0941b9b003f330197dc2e331330 100644 (file)
@@ -35,12 +35,6 @@ const struct imx_fec_data imx35_fec_data __initconst =
        imx_fec_data_entry_single(MX35, "imx27-fec");
 #endif
 
-#ifdef CONFIG_SOC_IMX50
-/* i.mx50 has the i.mx25 type fec */
-const struct imx_fec_data imx50_fec_data __initconst =
-       imx_fec_data_entry_single(MX50, "imx25-fec");
-#endif
-
 #ifdef CONFIG_SOC_IMX51
 /* i.mx51 has the i.mx27 type fec */
 const struct imx_fec_data imx51_fec_data __initconst =
index 8e30e5703cd204fadda337789bd292a9d14929d5..57d342e85c2fa5621f334c26d667beacb286f9a6 100644 (file)
@@ -70,16 +70,6 @@ const struct imx_imx_i2c_data imx35_imx_i2c_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX50
-const struct imx_imx_i2c_data imx50_imx_i2c_data[] __initconst = {
-#define imx50_imx_i2c_data_entry(_id, _hwid)                           \
-       imx_imx_i2c_data_entry(MX50, "imx21-i2c", _id, _hwid, SZ_4K)
-       imx50_imx_i2c_data_entry(0, 1),
-       imx50_imx_i2c_data_entry(1, 2),
-       imx50_imx_i2c_data_entry(2, 3),
-};
-#endif /* ifdef CONFIG_SOC_IMX51 */
-
 #ifdef CONFIG_SOC_IMX51
 const struct imx_imx_i2c_data imx51_imx_i2c_data[] __initconst = {
 #define imx51_imx_i2c_data_entry(_id, _hwid)                           \
index 67bf866a2cb6642008a78b968943ebf3bd4750f5..faac4aa6ca6d0dc3d109b40160ac4d310cac5750 100644 (file)
@@ -94,18 +94,6 @@ const struct imx_imx_uart_1irq_data imx35_imx_uart_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX35 */
 
-#ifdef CONFIG_SOC_IMX50
-const struct imx_imx_uart_1irq_data imx50_imx_uart_data[] __initconst = {
-#define imx50_imx_uart_data_entry(_id, _hwid)                          \
-       imx_imx_uart_1irq_data_entry(MX50, _id, _hwid, SZ_4K)
-       imx50_imx_uart_data_entry(0, 1),
-       imx50_imx_uart_data_entry(1, 2),
-       imx50_imx_uart_data_entry(2, 3),
-       imx50_imx_uart_data_entry(3, 4),
-       imx50_imx_uart_data_entry(4, 5),
-};
-#endif /* ifdef CONFIG_SOC_IMX50 */
-
 #ifdef CONFIG_SOC_IMX51
 const struct imx_imx_uart_1irq_data imx51_imx_uart_data[] __initconst = {
 #define imx51_imx_uart_data_entry(_id, _hwid)                          \
index ff24920699e45d9afa1f4c2554a98fde6ee5284f..a96ccc7f50123ad5470be6af6d4e2f6edb0e4920 100644 (file)
@@ -101,11 +101,16 @@ static void imx_gpc_irq_mask(struct irq_data *d)
 void __init imx_gpc_init(void)
 {
        struct device_node *np;
+       int i;
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpc");
        gpc_base = of_iomap(np, 0);
        WARN_ON(!gpc_base);
 
+       /* Initially mask all interrupts */
+       for (i = 0; i < IMR_NUM; i++)
+               writel_relaxed(~0, gpc_base + GPC_IMR1 + i * 4);
+
        /* Register GPC as the secondary interrupt controller behind GIC */
        gic_arch_extn.irq_mask = imx_gpc_irq_mask;
        gic_arch_extn.irq_unmask = imx_gpc_irq_unmask;
index 3ce7fa3bd43fbcefa6561c6a555e5e9b3254a7d1..911e9b31b03f76f19ef9ad60c7380654f785d313 100644 (file)
  *     AVIC    0x68000000+0x100000     ->      0xf5800000+0x100000
  *     X_MEMC  0xb8000000+0x010000     ->      0xf5c00000+0x010000
  *     SPBA0   0x50000000+0x100000     ->      0xf5400000+0x100000
- * mx50:
- *     TZIC    0x0fffc000+0x004000     ->      0xf4bfc000+0x004000
- *     AIPS1   0x53f00000+0x100000     ->      0xf5700000+0x100000
- *     SPBA0   0x50000000+0x100000     ->      0xf5400000+0x100000
- *     AIPS2   0x63f00000+0x100000     ->      0xf5300000+0x100000
  * mx51:
  *     TZIC    0x0fffc000+0x004000     ->      0xf4bfc000+0x004000
  *     IRAM    0x1ffe0000+0x020000     ->      0xf4fe0000+0x020000
 #include "mxc.h"
 
 #include "mx6q.h"
-#include "mx50.h"
 #include "mx51.h"
 #include "mx53.h"
 #include "mx3x.h"
index f9a6909600972a0e0b474f0b068d9fdd3d0cd9fb..00737eb4e00d7439da839c0d5bd834f53e43584e 100644 (file)
 #include "common.h"
 #include "mx31.h"
 
-static const struct of_dev_auxdata imx31_auxdata_lookup[] __initconst = {
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART1_BASE_ADDR,
-                       "imx21-uart.0", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART2_BASE_ADDR,
-                       "imx21-uart.1", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART3_BASE_ADDR,
-                       "imx21-uart.2", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART4_BASE_ADDR,
-                       "imx21-uart.3", NULL),
-       OF_DEV_AUXDATA("fsl,imx31-uart", MX31_UART5_BASE_ADDR,
-                       "imx21-uart.4", NULL),
-       { /* sentinel */ }
-};
-
 static void __init imx31_dt_init(void)
 {
-       of_platform_populate(NULL, of_default_bus_match_table,
-                            imx31_auxdata_lookup, NULL);
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
 static const char *imx31_dt_board_compat[] __initdata = {
diff --git a/arch/arm/mach-imx/iomux-mx50.h b/arch/arm/mach-imx/iomux-mx50.h
deleted file mode 100644 (file)
index 00f56e0..0000000
+++ /dev/null
@@ -1,977 +0,0 @@
-/*
- * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
- *
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __MACH_IOMUX_MX50_H__
-#define __MACH_IOMUX_MX50_H__
-
-#include "iomux-v3.h"
-
-#define MX50_ELCDIF_PAD_CTRL   (PAD_CTL_PKE | PAD_CTL_DSE_HIGH)
-
-#define MX50_SD_PAD_CTRL       (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \
-                                       PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_HIGH)
-
-#define MX50_UART_PAD_CTRL     (PAD_CTL_DSE_HIGH | PAD_CTL_PKE)
-
-#define MX50_I2C_PAD_CTRL      (PAD_CTL_ODE | PAD_CTL_DSE_HIGH | \
-                                       PAD_CTL_PUS_100K_UP | PAD_CTL_HYS)
-
-#define MX50_USB_PAD_CTRL      (PAD_CTL_PKE | PAD_CTL_PUE | \
-                                       PAD_CTL_DSE_HIGH | PAD_CTL_PUS_47K_UP)
-
-#define MX50_FEC_PAD_CTRL      (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \
-                                       PAD_CTL_PUS_22K_UP | PAD_CTL_ODE | \
-                                       PAD_CTL_DSE_HIGH)
-
-#define MX50_OWIRE_PAD_CTRL    (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \
-                                       PAD_CTL_PUS_100K_UP | PAD_CTL_ODE | \
-                                       PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST)
-
-#define MX50_KEYPAD_CTRL        (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \
-                                       PAD_CTL_PUS_100K_UP | PAD_CTL_DSE_HIGH)
-
-#define MX50_CSPI_SS_PAD       (PAD_CTL_PKE | PAD_CTL_PUE | \
-                                       PAD_CTL_PUS_22K_UP | PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_COL0__KEY_COL0    IOMUX_PAD(0x2CC, 0x20, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL0__GPIO_4_0    IOMUX_PAD(0x2CC, 0x20, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL0__NANDF_CLE   IOMUX_PAD(0x2CC, 0x20, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_ROW0__KEY_ROW0    IOMUX_PAD(0x2D0, 0x24, 0, 0x0, 0, MX50_KEYPAD_CTRL)
-#define MX50_PAD_KEY_ROW0__GPIO_4_1    IOMUX_PAD(0x2D0, 0x24, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_ROW0__NANDF_ALE   IOMUX_PAD(0x2D0, 0x24, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_COL1__KEY_COL1    IOMUX_PAD(0x2D4, 0x28, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL1__GPIO_4_2    IOMUX_PAD(0x2D4, 0x28, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL1__NANDF_CE0   IOMUX_PAD(0x2D4, 0x28, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_ROW1__KEY_ROW1    IOMUX_PAD(0x2D8, 0x2C, 0, 0x0, 0, MX50_KEYPAD_CTRL)
-#define MX50_PAD_KEY_ROW1__GPIO_4_3    IOMUX_PAD(0x2D8, 0x2C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_ROW1__NANDF_CE1   IOMUX_PAD(0x2D8, 0x2C, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_COL2__KEY_COL2    IOMUX_PAD(0x2DC, 0x30, 0, 0x0, 0, MX50_KEYPAD_CTRL)
-#define MX50_PAD_KEY_COL2__GPIO_4_4    IOMUX_PAD(0x2DC, 0x30, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL2__NANDF_CE2   IOMUX_PAD(0x2DC, 0x30, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_ROW2__KEY_ROW2    IOMUX_PAD(0x2E0, 0x34, 0, 0x0, 0, MX50_KEYPAD_CTRL)
-#define MX50_PAD_KEY_ROW2__GPIO_4_5    IOMUX_PAD(0x2E0, 0x34, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_ROW2__NANDF_CE3   IOMUX_PAD(0x2E0, 0x34, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_KEY_COL3__KEY_COL3    IOMUX_PAD(0x2E4, 0x38, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL3__GPIO_4_6    IOMUX_PAD(0x2E4, 0x38, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_COL3__NANDF_READY IOMUX_PAD(0x2E4, 0x38, 2, 0x7b4, 0, PAD_CTL_PKE | \
-                                                       PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
-#define MX50_PAD_KEY_COL3__SDMA_EXT0   IOMUX_PAD(0x2E4, 0x38, 6, 0x7b8, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_KEY_ROW3__KEY_ROW3    IOMUX_PAD(0x2E8, 0x3C, 0, 0x0, 0, MX50_KEYPAD_CTRL)
-#define MX50_PAD_KEY_ROW3__GPIO_4_7    IOMUX_PAD(0x2E8, 0x3C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_KEY_ROW3__NANDF_DQS   IOMUX_PAD(0x2E8, 0x3C, 2, 0x7b0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_KEY_ROW3__SDMA_EXT1   IOMUX_PAD(0x2E8, 0x3C, 6, 0x7bc, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_I2C1_SCL__I2C1_SCL    IOMUX_PAD(0x2EC, 0x40, IOMUX_CONFIG_SION, 0x0, 0, \
-                                                       MX50_I2C_PAD_CTRL)
-#define MX50_PAD_I2C1_SCL__GPIO_6_18   IOMUX_PAD(0x2EC, 0x40, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C1_SCL__UART2_TXD   IOMUX_PAD(0x2EC, 0x40, 2, 0x0, 0, MX50_UART_PAD_CTRL)
-
-#define MX50_PAD_I2C1_SDA__I2C1_SDA    IOMUX_PAD(0x2F0, 0x44, IOMUX_CONFIG_SION, 0x0, 0, \
-                                                       MX50_I2C_PAD_CTRL)
-#define MX50_PAD_I2C1_SDA__GPIO_6_19   IOMUX_PAD(0x2F0, 0x44, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C1_SDA__UART2_RXD   IOMUX_PAD(0x2F0, 0x44, 2, 0x7cc, 1, MX50_UART_PAD_CTRL)
-
-#define MX50_PAD_I2C2_SCL__I2C2_SCL    IOMUX_PAD(0x2F4, 0x48, IOMUX_CONFIG_SION, 0x0, 0, \
-                                                       MX50_I2C_PAD_CTRL)
-#define MX50_PAD_I2C2_SCL__GPIO_6_20   IOMUX_PAD(0x2F4, 0x48, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C2_SCL__UART2_CTS   IOMUX_PAD(0x2F4, 0x48, 2, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_I2C2_SCL__DCDC_OK     IOMUX_PAD(0x2F4, 0x48, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_I2C2_SDA__I2C2_SDA    IOMUX_PAD(0x2F8, 0x4C, IOMUX_CONFIG_SION, 0x0, 0, \
-                                                       MX50_I2C_PAD_CTRL)
-#define MX50_PAD_I2C2_SDA__GPIO_6_21   IOMUX_PAD(0x2F8, 0x4C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C2_SDA__UART2_RTS   IOMUX_PAD(0x2F8, 0x4C, 2, 0x7c8, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_I2C2_SDA__PWRSTABLE   IOMUX_PAD(0x2F8, 0x4C, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_I2C3_SCL__I2C3_SCL    IOMUX_PAD(0x2FC, 0x50, IOMUX_CONFIG_SION, 0x0, 0, \
-                                                       MX50_I2C_PAD_CTRL)
-#define MX50_PAD_I2C3_SCL__GPIO_6_22   IOMUX_PAD(0x2FC, 0x50, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SCL__FEC_MDC     IOMUX_PAD(0x2FC, 0x50, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_I2C3_SCL__PMIC_RDY    IOMUX_PAD(0x2FC, 0x50, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SCL__GPT_CAPIN1  IOMUX_PAD(0x2FC, 0x50, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SCL__USBOTG_OC   IOMUX_PAD(0x2FC, 0x50, 7, 0x7E8, 0, MX50_USB_PAD_CTRL)
-
-#define MX50_PAD_I2C3_SDA__I2C3_SDA    IOMUX_PAD(0x300, 0x54, IOMUX_CONFIG_SION, 0x0, 0, \
-                                                               MX50_I2C_PAD_CTRL)
-#define MX50_PAD_I2C3_SDA__GPIO_6_23   IOMUX_PAD(0x300, 0x54, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SDA__FEC_MDIO    IOMUX_PAD(0x300, 0x54, 2, 0x774, 0, MX50_FEC_PAD_CTRL)
-#define MX50_PAD_I2C3_SDA__PWRFAIL_INT IOMUX_PAD(0x300, 0x54, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SDA__ALARM_DEB   IOMUX_PAD(0x300, 0x54, 4, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SDA__GPT_CAPIN1  IOMUX_PAD(0x300, 0x54, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_I2C3_SDA__USBOTG_PWR  IOMUX_PAD(0x300, 0x54, 7, 0x0, 0, \
-                                                       PAD_CTL_PKE | PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_PWM1__PWM1_PWMO       IOMUX_PAD(0x304, 0x58, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_PWM1__GPIO_6_24       IOMUX_PAD(0x304, 0x58, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_PWM1__USBOTG_OC       IOMUX_PAD(0x304, 0x58, 2, 0x7E8, 1, MX50_USB_PAD_CTRL)
-#define MX50_PAD_PWM1__GPT_CMPOUT1     IOMUX_PAD(0x304, 0x58, 5, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PWM2__PWM2_PWMO       IOMUX_PAD(0x308, 0x5C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_PWM2__GPIO_6_25       IOMUX_PAD(0x308, 0x5C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_PWM2__USBOTG_PWR      IOMUX_PAD(0x308, 0x5C, 2, 0x0, 0, \
-                                                       PAD_CTL_PKE | PAD_CTL_DSE_HIGH)
-#define MX50_PAD_PWM2__DCDC_PWM                IOMUX_PAD(0x308, 0x5C, 4, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_PWM2__GPT_CMPOUT2     IOMUX_PAD(0x308, 0x5C, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_PWM2__ANY_PU_RST      IOMUX_PAD(0x308, 0x5C, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_OWIRE__OWIRE          IOMUX_PAD(0x30C, 0x60, 0, 0x0, 0, MX50_OWIRE_PAD_CTRL)
-#define MX50_PAD_OWIRE__GPIO_6_26      IOMUX_PAD(0x30C, 0x60, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_OWIRE__USBH1_OC       IOMUX_PAD(0x30C, 0x60, 2, 0x0, 0, MX50_USB_PAD_CTRL)
-#define MX50_PAD_OWIRE__SSI_EXT1_CLK   IOMUX_PAD(0x30C, 0x60, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_OWIRE__EPDC_PWRIRQ    IOMUX_PAD(0x30C, 0x60, 4, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_OWIRE__GPT_CMPOUT3    IOMUX_PAD(0x30C, 0x60, 5, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPITO__EPITO          IOMUX_PAD(0x310, 0x64, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPITO__GPIO_6_27      IOMUX_PAD(0x310, 0x64, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPITO__USBH1_PWR      IOMUX_PAD(0x310, 0x64, 2, 0x0, 0, \
-                                                       PAD_CTL_PKE | PAD_CTL_DSE_HIGH)
-#define MX50_PAD_EPITO__SSI_EXT2_CLK   IOMUX_PAD(0x310, 0x64, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPITO__TOG_EN         IOMUX_PAD(0x310, 0x64, 4, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPITO__GPT_CLKIN      IOMUX_PAD(0x310, 0x64, 5, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_WDOG__WDOG            IOMUX_PAD(0x314, 0x68, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_WDOG__GPIO_6_28       IOMUX_PAD(0x314, 0x68, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_WDOG__WDOG_RST                IOMUX_PAD(0x314, 0x68, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_WDOG__XTAL32K         IOMUX_PAD(0x314, 0x68, 6, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SSI_TXFS__SSI_TXFS    IOMUX_PAD(0x318, 0x6C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_TXFS__GPIO_6_0    IOMUX_PAD(0x318, 0x6C, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SSI_TXC__SSI_TXC      IOMUX_PAD(0x31C, 0x70, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_TXC__GPIO_6_1     IOMUX_PAD(0x31C, 0x70, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SSI_TXD__SSI_TXD      IOMUX_PAD(0x320, 0x74, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_TXD__GPIO_6_2     IOMUX_PAD(0x320, 0x74, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_TXD__CSPI_RDY     IOMUX_PAD(0x320, 0x74, 4, 0x6e8, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SSI_RXD__SSI_RXD      IOMUX_PAD(0x324, 0x78, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXD__GPIO_6_3     IOMUX_PAD(0x324, 0x78, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXD__CSPI_SS3     IOMUX_PAD(0x324, 0x78, 4, 0x6f4, 0, MX50_CSPI_SS_PAD)
-
-#define MX50_PAD_SSI_RXFS__AUD3_RXFS   IOMUX_PAD(0x328, 0x7C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXFS__GPIO_6_4    IOMUX_PAD(0x328, 0x7C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXFS__UART5_TXD   IOMUX_PAD(0x328, 0x7C, 2, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_SSI_RXFS__WEIM_D6     IOMUX_PAD(0x328, 0x7C, 3, 0x804, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXFS__CSPI_SS2    IOMUX_PAD(0x328, 0x7C, 4, 0x6f0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_SSI_RXFS__FEC_COL     IOMUX_PAD(0x328, 0x7C, 5, 0x770, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SSI_RXFS__FEC_MDC     IOMUX_PAD(0x328, 0x7C, 6, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_SSI_RXC__AUD3_RXC     IOMUX_PAD(0x32C, 0x80, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXC__GPIO_6_5     IOMUX_PAD(0x32C, 0x80, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXC__UART5_RXD    IOMUX_PAD(0x32C, 0x80, 2, 0x7e4, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_SSI_RXC__WEIM_D7      IOMUX_PAD(0x32C, 0x80, 3, 0x808, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXC__CSPI_SS1     IOMUX_PAD(0x32C, 0x80, 4, 0x6ec, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_SSI_RXC__FEC_RX_CLK   IOMUX_PAD(0x32C, 0x80, 5, 0x780, 0, NO_PAD_CTRL)
-#define MX50_PAD_SSI_RXC__FEC_MDIO     IOMUX_PAD(0x32C, 0x80, 6, 0x774, 1, MX50_FEC_PAD_CTRL)
-
-#define MX50_PAD_UART1_TXD__UART1_TXD  IOMUX_PAD(0x330, 0x84, 0, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART1_TXD__GPIO_6_6   IOMUX_PAD(0x330, 0x84, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_UART1_RXD__UART1_RXD  IOMUX_PAD(0x334, 0x88, 0, 0x7c4, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART1_RXD__GPIO_6_7   IOMUX_PAD(0x334, 0x88, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_UART1_CTS__UART1_CTS  IOMUX_PAD(0x338, 0x8C, 0, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART1_CTS__GPIO_6_8   IOMUX_PAD(0x338, 0x8C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART1_CTS__UART5_TXD  IOMUX_PAD(0x338, 0x8C, 2, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART1_CTS__SD4_D4     IOMUX_PAD(0x338, 0x8C, 4, 0x760, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART1_CTS__SD4_CMD    IOMUX_PAD(0x338, 0x8C, 5, 0x74c, 0, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_UART1_RTS__UART1_RTS  IOMUX_PAD(0x33C, 0x90, 0, 0x7c0, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART1_RTS__GPIO_6_9   IOMUX_PAD(0x33C, 0x90, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART1_RTS__UART5_RXD  IOMUX_PAD(0x33C, 0x90, 2, 0x7e4, 3, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART1_RTS__SD4_D5     IOMUX_PAD(0x33C, 0x90, 4, 0x764, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART1_RTS__SD4_CLK    IOMUX_PAD(0x33C, 0x90, 5, 0x748, 0, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_UART2_TXD__UART2_TXD  IOMUX_PAD(0x340, 0x94, 0, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART2_TXD__GPIO_6_10  IOMUX_PAD(0x340, 0x94, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART2_TXD__SD4_D6     IOMUX_PAD(0x340, 0x94, 4, 0x768, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART2_TXD__SD4_D4     IOMUX_PAD(0x340, 0x94, 5, 0x760, 1, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_UART2_RXD__UART2_RXD  IOMUX_PAD(0x344, 0x98, 0, 0x7cc, 3, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART2_RXD__GPIO_6_11  IOMUX_PAD(0x344, 0x98, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART2_RXD__SD4_D7     IOMUX_PAD(0x344, 0x98, 4, 0x76c, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART2_RXD__SD4_D5     IOMUX_PAD(0x344, 0x98, 5, 0x764, 1, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_UART2_CTS__UART2_CTS  IOMUX_PAD(0x348, 0x9C, 0, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART2_CTS__GPIO_6_12  IOMUX_PAD(0x348, 0x9C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART2_CTS__SD4_CMD    IOMUX_PAD(0x348, 0x9C, 4, 0x74c, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART2_CTS__SD4_D6     IOMUX_PAD(0x348, 0x9C, 5, 0x768, 1, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_UART2_RTS__UART2_RTS  IOMUX_PAD(0x34C, 0xA0, 0, 0x7c8, 3, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART2_RTS__GPIO_6_13  IOMUX_PAD(0x34C, 0xA0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART2_RTS__SD4_CLK    IOMUX_PAD(0x34C, 0xA0, 4, 0x748, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART2_RTS__SD4_D7     IOMUX_PAD(0x34C, 0xA0, 5, 0x76c, 1, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_UART3_TXD__UART3_TXD  IOMUX_PAD(0x350, 0xA4, 0, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART3_TXD__GPIO_6_14  IOMUX_PAD(0x350, 0xA4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART3_TXD__SD1_D4     IOMUX_PAD(0x350, 0xA4, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART3_TXD__SD4_D0     IOMUX_PAD(0x350, 0xA4, 4, 0x750, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART3_TXD__SD2_WP     IOMUX_PAD(0x350, 0xA4, 5, 0x744, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART3_TXD__WEIM_D12   IOMUX_PAD(0x350, 0xA4, 6, 0x81c, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_UART3_RXD__UART3_RXD  IOMUX_PAD(0x354, 0xA8, 0, 0x7d4, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART3_RXD__GPIO_6_15  IOMUX_PAD(0x354, 0xA8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART3_RXD__SD1_D5     IOMUX_PAD(0x354, 0xA8, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART3_RXD__SD4_D1     IOMUX_PAD(0x354, 0xA8, 4, 0x754, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART3_RXD__SD2_CD     IOMUX_PAD(0x354, 0xA8, 5, 0x740, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART3_RXD__WEIM_D13   IOMUX_PAD(0x354, 0xA8, 6, 0x820, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_UART4_TXD__UART4_TXD  IOMUX_PAD(0x358, 0xAC, 0, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART4_TXD__GPIO_6_16  IOMUX_PAD(0x358, 0xAC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART4_TXD__UART3_CTS  IOMUX_PAD(0x358, 0xAC, 2, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART4_TXD__SD1_D6     IOMUX_PAD(0x358, 0xAC, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART4_TXD__SD4_D2     IOMUX_PAD(0x358, 0xAC, 4, 0x758, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART4_TXD__SD2_LCTL   IOMUX_PAD(0x358, 0xAC, 5, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART4_TXD__WEIM_D14   IOMUX_PAD(0x358, 0xAC, 6, 0x824, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_UART4_RXD__UART4_RXD  IOMUX_PAD(0x35C, 0xB0, 0, 0x7dc, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART4_RXD__GPIO_6_17  IOMUX_PAD(0x35C, 0xB0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_UART4_RXD__UART3_RTS  IOMUX_PAD(0x35C, 0xB0, 2, 0x7d0, 1, MX50_UART_PAD_CTRL)
-#define MX50_PAD_UART4_RXD__SD1_D7     IOMUX_PAD(0x35C, 0xB0, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART4_RXD__SD4_D3     IOMUX_PAD(0x35C, 0xB0, 4, 0x75c, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART4_RXD__SD1_LCTL   IOMUX_PAD(0x35C, 0xB0, 5, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_UART4_RXD__WEIM_D15   IOMUX_PAD(0x35C, 0xB0, 6, 0x828, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_CSPI_SCLK__CSPI_SCLK  IOMUX_PAD(0x360, 0xB4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_CSPI_SCLK__GPIO_4_8   IOMUX_PAD(0x360, 0xB4, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_CSPI_MOSI__CSPI_MOSI  IOMUX_PAD(0x364, 0xB8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_CSPI_MOSI__GPIO_4_9   IOMUX_PAD(0x364, 0xB8, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_CSPI_MISO__CSPI_MISO  IOMUX_PAD(0x368, 0xBC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_CSPI_MISO__GPIO_4_10  IOMUX_PAD(0x368, 0xBC, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_CSPI_SS0__CSPI_SS0    IOMUX_PAD(0x36C, 0xC0, 0, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_CSPI_SS0__GPIO_4_11   IOMUX_PAD(0x36C, 0xC0, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI1_SCLK__ECSPI1_SCLK      IOMUX_PAD(0x370, 0xC4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SCLK__GPIO_4_12                IOMUX_PAD(0x370, 0xC4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SCLK__CSPI_RDY         IOMUX_PAD(0x370, 0xC4, 2, 0x6e8, 1, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SCLK__ECSPI2_RDY       IOMUX_PAD(0x370, 0xC4, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SCLK__UART3_RTS                IOMUX_PAD(0x370, 0xC4, 4, 0x7d0, 2, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SCLK__EPDC_SDCE6       IOMUX_PAD(0x370, 0xC4, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SCLK__WEIM_D8          IOMUX_PAD(0x370, 0xC4, 7, 0x80c, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI1_MOSI__ECSPI1_MOSI      IOMUX_PAD(0x374, 0xC8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MOSI__GPIO_4_13                IOMUX_PAD(0x374, 0xC8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MOSI__CSPI_SS1         IOMUX_PAD(0x374, 0xC8, 2, 0x6ec, 1, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_MOSI__ECSPI2_SS1       IOMUX_PAD(0x374, 0xC8, 3, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_MOSI__UART3_CTS                IOMUX_PAD(0x374, 0xC8, 4, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MOSI__EPDC_SDCE7       IOMUX_PAD(0x374, 0xC8, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MOSI__WEIM_D9          IOMUX_PAD(0x374, 0xC8, 7, 0x810, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI1_MISO__ECSPI1_MISO      IOMUX_PAD(0x378, 0xCC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MISO__GPIO_4_14                IOMUX_PAD(0x378, 0xCC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MISO__CSPI_SS2         IOMUX_PAD(0x378, 0xCC, 2, 0x6f0, 1, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_MISO__ECSPI2_SS2       IOMUX_PAD(0x378, 0xCC, 3, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_MISO__UART4_RTS                IOMUX_PAD(0x378, 0xCC, 4, 0x7d8, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MISO__EPDC_SDCE8       IOMUX_PAD(0x378, 0xCC, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_MISO__WEIM_D10         IOMUX_PAD(0x378, 0xCC, 7, 0x814, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI1_SS0__ECSPI1_SS0                IOMUX_PAD(0x37C, 0xD0, 0, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_SS0__GPIO_4_15         IOMUX_PAD(0x37C, 0xD0, 1, 0x0, 0, PAD_CTL_PUS_100K_UP)
-#define MX50_PAD_ECSPI1_SS0__CSPI_SS3          IOMUX_PAD(0x37C, 0xD0, 2, 0x6f4, 1, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_SS0__ECSPI2_SS3                IOMUX_PAD(0x37C, 0xD0, 3, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI1_SS0__UART4_CTS         IOMUX_PAD(0x37C, 0xD0, 4, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SS0__EPDC_SDCE9                IOMUX_PAD(0x37C, 0xD0, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI1_SS0__WEIM_D11          IOMUX_PAD(0x37C, 0xD0, 7, 0x818, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI2_SCLK__ECSPI2_SCLK      IOMUX_PAD(0x380, 0xD4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__GPIO_4_16                IOMUX_PAD(0x380, 0xD4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__ELCDIF_WR                IOMUX_PAD(0x380, 0xD4, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__ECSPI1_RDY       IOMUX_PAD(0x380, 0xD4, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__UART5_RTS                IOMUX_PAD(0x380, 0xD4, 4, 0x7e0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__ELCDIF_DOTCLK    IOMUX_PAD(0x380, 0xD4, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__NANDF_CEN4       IOMUX_PAD(0x380, 0xD4, 6, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SCLK__WEIM_D8          IOMUX_PAD(0x380, 0xD4, 7, 0x80c, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI2_MOSI__ECSPI2_MOSI      IOMUX_PAD(0x384, 0xD8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MOSI__GPIO_4_17                IOMUX_PAD(0x384, 0xD8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MOSI__ELCDIF_RD                IOMUX_PAD(0x384, 0xD8, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MOSI__ECSPI1_SS1       IOMUX_PAD(0x384, 0xD8, 3, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI2_MOSI__UART5_CTS                IOMUX_PAD(0x384, 0xD8, 4, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MOSI__ELCDIF_EN                IOMUX_PAD(0x384, 0xD8, 5, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MOSI__NANDF_CEN5       IOMUX_PAD(0x384, 0xD8, 6, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MOSI__WEIM_D9          IOMUX_PAD(0x384, 0xD8, 7, 0x810, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI2_MISO__ECSPI2_MISO      IOMUX_PAD(0x388, 0xDC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MISO__GPIO_4_18                IOMUX_PAD(0x388, 0xDC, 1, 0x0, 0, PAD_CTL_PUS_100K_UP)
-#define MX50_PAD_ECSPI2_MISO__ELCDIF_RS                IOMUX_PAD(0x388, 0xDC, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MISO__ECSPI1_SS2       IOMUX_PAD(0x388, 0xDC, 3, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI2_MISO__UART5_TXD                IOMUX_PAD(0x388, 0xDC, 4, 0x0, 0, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MISO__ELCDIF_VSYNC     IOMUX_PAD(0x388, 0xDC, 5, 0x73c, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MISO__NANDF_CEN6       IOMUX_PAD(0x388, 0xDC, 6, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_MISO__WEIM_D10         IOMUX_PAD(0x388, 0xDC, 7, 0x814, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_ECSPI2_SS0__ECSPI2_SS0                IOMUX_PAD(0x38C, 0xE0, 0, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI2_SS0__GPIO_4_19         IOMUX_PAD(0x38C, 0xE0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SS0__ELCDIF_CS         IOMUX_PAD(0x38C, 0xE0, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SS0__ECSPI1_SS3                IOMUX_PAD(0x38C, 0xE0, 3, 0x0, 0, MX50_CSPI_SS_PAD)
-#define MX50_PAD_ECSPI2_SS0__UART5_RXD         IOMUX_PAD(0x38C, 0xE0, 4, 0x7e4, 5, MX50_UART_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SS0__ELCDIF_HSYNC      IOMUX_PAD(0x38C, 0xE0, 5, 0x6f8, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SS0__NANDF_CEN7                IOMUX_PAD(0x38C, 0xE0, 6, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_ECSPI2_SS0__WEIM_D11          IOMUX_PAD(0x38C, 0xE0, 7, 0x818, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_SD1_CLK__SD1_CLK      IOMUX_PAD(0x390, 0xE4, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD1_CLK__GPIO_5_0     IOMUX_PAD(0x390, 0xE4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD1_CLK__CLKO         IOMUX_PAD(0x390, 0xE4, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD1_CMD__SD1_CMD      IOMUX_PAD(0x394, 0xE8, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD1_CMD__GPIO_5_1     IOMUX_PAD(0x394, 0xE8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD1_CMD__CLKO2                IOMUX_PAD(0x394, 0xE8, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD1_D0__SD1_D0                IOMUX_PAD(0x398, 0xEC, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD1_D0__GPIO_5_2      IOMUX_PAD(0x398, 0xEC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD1_D0__PLL1_BYP      IOMUX_PAD(0x398, 0xEC, 7, 0x6dc, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD1_D1__SD1_D1                IOMUX_PAD(0x39C, 0xF0, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD1_D1__GPIO_5_3      IOMUX_PAD(0x39C, 0xF0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD1_D1__PLL2_BYP      IOMUX_PAD(0x39C, 0xF0, 7, 0x6e0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD1_D2__SD1_D2                IOMUX_PAD(0x3A0, 0xF4, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD1_D2__GPIO_5_4      IOMUX_PAD(0x3A0, 0xF4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD1_D2__PLL3_BYP      IOMUX_PAD(0x3A0, 0xF4, 7, 0x6e4, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD1_D3__SD1_D3                IOMUX_PAD(0x3A4, 0xF8, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD1_D3__GPIO_5_5      IOMUX_PAD(0x3A4, 0xF8, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_CLK__SD2_CLK      IOMUX_PAD(0x3A8, 0xFC, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_CLK__GPIO_5_6     IOMUX_PAD(0x3A8, 0xFC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_CLK__MSHC_SCLK    IOMUX_PAD(0x3A8, 0xFC, 2, 0x0, 0, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_SD2_CMD__SD2_CMD      IOMUX_PAD(0x3AC, 0x100, IOMUX_CONFIG_SION, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_CMD__GPIO_5_7     IOMUX_PAD(0x3AC, 0x100, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_CMD__MSHC_BS      IOMUX_PAD(0x3AC, 0x100, 2, 0x0, 0, MX50_SD_PAD_CTRL)
-
-#define MX50_PAD_SD2_D0__SD2_D0                IOMUX_PAD(0x3B0, 0x104, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D0__GPIO_5_8      IOMUX_PAD(0x3B0, 0x104, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D0__MSHC_D0       IOMUX_PAD(0x3B0, 0x104, 2, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D0__KEY_COL4      IOMUX_PAD(0x3B0, 0x104, 3, 0x790, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D1__SD2_D1                IOMUX_PAD(0x3B4, 0x108, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D1__GPIO_5_9      IOMUX_PAD(0x3B4, 0x108, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D1__MSHC_D1       IOMUX_PAD(0x3B4, 0x108, 2, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D1__KEY_ROW4      IOMUX_PAD(0x3B4, 0x108, 3, 0x7a0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D2__SD2_D2                IOMUX_PAD(0x3B8, 0x10C, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D2__GPIO_5_10     IOMUX_PAD(0x3B8, 0x10C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D2__MSHC_D2       IOMUX_PAD(0x3B8, 0x10C, 2, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D2__KEY_COL5      IOMUX_PAD(0x3B8, 0x10C, 3, 0x794, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D3__SD2_D3                IOMUX_PAD(0x3BC, 0x110, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D3__GPIO_5_11     IOMUX_PAD(0x3BC, 0x110, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D3__MSHC_D3       IOMUX_PAD(0x3BC, 0x110, 2, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D3__KEY_ROW5      IOMUX_PAD(0x3BC, 0x110, 3, 0x7a4, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D4__SD2_D4                IOMUX_PAD(0x3C0, 0x114, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D4__GPIO_5_12     IOMUX_PAD(0x3C0, 0x114, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D4__AUD4_RXFS     IOMUX_PAD(0x3C0, 0x114, 2, 0x6d0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D4__KEY_COL6      IOMUX_PAD(0x3C0, 0x114, 3, 0x798, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D4__WEIM_D0       IOMUX_PAD(0x3C0, 0x114, 4, 0x7ec, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D4__CCM_OUT0      IOMUX_PAD(0x3C0, 0x114, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D5__SD2_D5                IOMUX_PAD(0x3C4, 0x118, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D5__GPIO_5_13     IOMUX_PAD(0x3C4, 0x118, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D5__AUD4_RXC      IOMUX_PAD(0x3C4, 0x118, 2, 0x6cc, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D5__KEY_ROW6      IOMUX_PAD(0x3C4, 0x118, 3, 0x7a8, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D5__WEIM_D1       IOMUX_PAD(0x3C4, 0x118, 4, 0x7f0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D5__CCM_OUT1      IOMUX_PAD(0x3C4, 0x118, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D6__SD2_D6                IOMUX_PAD(0x3C8, 0x11C, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D6__GPIO_5_14     IOMUX_PAD(0x3C8, 0x11C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D6__AUD4_RXD      IOMUX_PAD(0x3C8, 0x11C, 2, 0x6c4, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D6__KEY_COL7      IOMUX_PAD(0x3C8, 0x11C, 3, 0x79c, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D6__WEIM_D2       IOMUX_PAD(0x3C8, 0x11C, 4, 0x7f4, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D6__CCM_OUT2      IOMUX_PAD(0x3C8, 0x11C, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_D7__SD2_D7                IOMUX_PAD(0x3CC, 0x120, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_D7__GPIO_5_15     IOMUX_PAD(0x3CC, 0x120, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D7__AUD4_TXFS     IOMUX_PAD(0x3CC, 0x120, 2, 0x6d8, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D7__KEY_ROW7      IOMUX_PAD(0x3CC, 0x120, 3, 0x7ac, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D7__WEIM_D3       IOMUX_PAD(0x3CC, 0x120, 4, 0x7f8, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_D7__CCM_STOP      IOMUX_PAD(0x3CC, 0x120, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_WP__SD2_WP                IOMUX_PAD(0x3D0, 0x124, 0, 0x744, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_WP__GPIO_5_16     IOMUX_PAD(0x3D0, 0x124, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_WP__AUD4_TXD      IOMUX_PAD(0x3D0, 0x124, 2, 0x6c8, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_WP__WEIM_D4       IOMUX_PAD(0x3D0, 0x124, 4, 0x7fc, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_WP__CCM_WAIT      IOMUX_PAD(0x3D0, 0x124, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD2_CD__SD2_CD                IOMUX_PAD(0x3D4, 0x128, 0, 0x740, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD2_CD__GPIO_5_17     IOMUX_PAD(0x3D4, 0x128, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_CD__AUD4_TXC      IOMUX_PAD(0x3D4, 0x128, 2, 0x6d4, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_CD__WEIM_D5       IOMUX_PAD(0x3D4, 0x128, 4, 0x800, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD2_CD__CCM_REF_EN    IOMUX_PAD(0x3D4, 0x128, 7, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_ON_REQ__PMIC_ON_REQ      IOMUX_PAD(0x3D8, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_STBY_REQ__PMIC_STBY_REQ  IOMUX_PAD(0x3DC, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_PORT_B__PMIC_PORT_B      IOMUX_PAD(0x3E0, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_BOOT_MODE1__PMIC_BOOT_MODE1      IOMUX_PAD(0x3E4, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_RESET_IN_B__PMIC_RESET_IN_B      IOMUX_PAD(0x3E8, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_BOOT_MODE0__PMIC_BOOT_MODE0      IOMUX_PAD(0x3EC, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_TEST_MODE__PMIC_TEST_MODE        IOMUX_PAD(0x3F0, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_JTAG_TMS__PMIC_JTAG_TMS  IOMUX_PAD(0x3F4, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_JTAG_MOD__PMIC_JTAG_MOD  IOMUX_PAD(0x3F8, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_JTAG_TRSTB__PMIC_JTAG_TRSTB      IOMUX_PAD(0x3FC, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_JTAG_TDI__PMIC_JTAG_TDI  IOMUX_PAD(0x400, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_JTAG_TCK__PMIC_JTAG_TCK  IOMUX_PAD(0x404, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_PMIC_JTAG_TDO__PMIC_JTAG_TDO  IOMUX_PAD(0x408, 0, 0, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D0__DISP_D0      IOMUX_PAD(0x40C, 0x12C, 0, 0x6fc, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D0__GPIO_2_0     IOMUX_PAD(0x40C, 0x12C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D0__FEC_TXCLK    IOMUX_PAD(0x40C, 0x12C, 2, 0x78c, 0, PAD_CTL_HYS | PAD_CTL_PKE)
-
-#define MX50_PAD_DISP_D1__DISP_D1      IOMUX_PAD(0x410, 0x130, 0, 0x700, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D1__GPIO_2_1     IOMUX_PAD(0x410, 0x130, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D1__FEC_RX_ER    IOMUX_PAD(0x410, 0x130, 2, 0x788, 0, PAD_CTL_HYS | PAD_CTL_PKE)
-#define MX50_PAD_DISP_D1__WEIM_A17     IOMUX_PAD(0x410, 0x130, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D2__DISP_D2      IOMUX_PAD(0x414, 0x134, 0, 0x704, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D2__GPIO_2_2     IOMUX_PAD(0x414, 0x134, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D2__FEC_RX_DV    IOMUX_PAD(0x414, 0x134, 2, 0x784, 0, PAD_CTL_HYS | PAD_CTL_PKE)
-#define MX50_PAD_DISP_D2__WEIM_A18     IOMUX_PAD(0x414, 0x134, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D3__DISP_D3      IOMUX_PAD(0x418, 0x138, 0, 0x708, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D3__GPIO_2_3     IOMUX_PAD(0x418, 0x138, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D3__FEC_RXD1     IOMUX_PAD(0x418, 0x138, 2, 0x77C, 0, PAD_CTL_HYS | PAD_CTL_PKE)
-#define MX50_PAD_DISP_D3__WEIM_A19     IOMUX_PAD(0x418, 0x138, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D3__FEC_COL      IOMUX_PAD(0x418, 0x138, 4, 0x770, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D4__DISP_D4      IOMUX_PAD(0x41C, 0x13C, 0, 0x70c, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D4__GPIO_2_4     IOMUX_PAD(0x41C, 0x13C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D4__FEC_RXD0     IOMUX_PAD(0x41C, 0x13C, 2, 0x778, 0, PAD_CTL_HYS | PAD_CTL_PKE)
-#define MX50_PAD_DISP_D4__WEIM_A20     IOMUX_PAD(0x41C, 0x13C, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D5__DISP_D5      IOMUX_PAD(0x420, 0x140, 0, 0x710, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D5__GPIO_2_5     IOMUX_PAD(0x420, 0x140, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D5__FEC_TX_EN    IOMUX_PAD(0x420, 0x140, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_DISP_D5__WEIM_A21     IOMUX_PAD(0x420, 0x140, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D6__DISP_D6      IOMUX_PAD(0x424, 0x144, 0, 0x714, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D6__GPIO_2_6     IOMUX_PAD(0x424, 0x144, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D6__FEC_TXD1     IOMUX_PAD(0x424, 0x144, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_DISP_D6__WEIM_A22     IOMUX_PAD(0x424, 0x144, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D6__FEC_RX_CLK   IOMUX_PAD(0x424, 0x144, 4, 0x780, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D7__DISP_D7      IOMUX_PAD(0x428, 0x148, 0, 0x718, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D7__GPIO_2_7     IOMUX_PAD(0x428, 0x148, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D7__FEC_TXD0     IOMUX_PAD(0x428, 0x148, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_DISP_D7__WEIM_A23     IOMUX_PAD(0x428, 0x148, 3, 0x0, 0, NO_PAD_CTRL)
-
-
-#define MX50_PAD_DISP_WR__ELCDIF_WR    IOMUX_PAD(0x42C, 0x14C, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_WR__GPIO_2_16    IOMUX_PAD(0x42C, 0x14C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_WR__ELCDIF_PIXCLK        IOMUX_PAD(0x42C, 0x14C, 2, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_WR__WEIM_A24     IOMUX_PAD(0x42C, 0x14C, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_RD__ELCDIF_RD    IOMUX_PAD(0x430, 0x150, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_RD__GPIO_2_19    IOMUX_PAD(0x430, 0x150, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_RD__ELCDIF_EN    IOMUX_PAD(0x430, 0x150, 2, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_RD__WEIM_A25     IOMUX_PAD(0x430, 0x150, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_RS__ELCDIF_RS    IOMUX_PAD(0x434, 0x154, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_RS__GPIO_2_17    IOMUX_PAD(0x434, 0x154, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_RS__ELCDIF_VSYNC IOMUX_PAD(0x434, 0x154, 2, 0x73c, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_RS__WEIM_A26     IOMUX_PAD(0x434, 0x154, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_CS__ELCDIF_CS    IOMUX_PAD(0x438, 0x158, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_CS__GPIO_2_21    IOMUX_PAD(0x438, 0x158, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_CS__ELCDIF_HSYNC IOMUX_PAD(0x438, 0x158, 2, 0x6f8, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_CS__WEIM_A27     IOMUX_PAD(0x438, 0x158, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_CS__WEIM_CS3     IOMUX_PAD(0x438, 0x158, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_BUSY__ELCDIF_HSYNC       IOMUX_PAD(0x43C, 0x15C, 0, 0x6f8, 2, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_BUSY__GPIO_2_18          IOMUX_PAD(0x43C, 0x15C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_BUSY__WEIM_CS3           IOMUX_PAD(0x43C, 0x15C, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_RESET__ELCDIF_RST        IOMUX_PAD(0x440, 0x160, 0, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_RESET__GPIO_2_20 IOMUX_PAD(0x440, 0x160, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_RESET__WEIM_CS3  IOMUX_PAD(0x440, 0x160, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_CMD__SD3_CMD      IOMUX_PAD(0x444, 0x164, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_CMD__GPIO_5_18    IOMUX_PAD(0x444, 0x164, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_CMD__NANDF_WRN    IOMUX_PAD(0x444, 0x164, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_CMD__SSP_CMD      IOMUX_PAD(0x444, 0x164, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_CLK__SD3_CLK      IOMUX_PAD(0x448, 0x168, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_CLK__GPIO_5_19    IOMUX_PAD(0x448, 0x168, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_CLK__NANDF_RDN    IOMUX_PAD(0x448, 0x168, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_CLK__SSP_CLK      IOMUX_PAD(0x448, 0x168, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D0__SD3_D0                IOMUX_PAD(0x44C, 0x16C, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D0__GPIO_5_20     IOMUX_PAD(0x44C, 0x16C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D0__NANDF_D4      IOMUX_PAD(0x44C, 0x16C, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D0__SSP_D0                IOMUX_PAD(0x44C, 0x16C, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD3_D0__PLL1_BYP      IOMUX_PAD(0x44C, 0x16C, 7, 0x6dc, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D1__SD3_D1                IOMUX_PAD(0x450, 0x170, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D1__GPIO_5_21     IOMUX_PAD(0x450, 0x170, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D1__NANDF_D5      IOMUX_PAD(0x450, 0x170, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D1__PLL2_BYP      IOMUX_PAD(0x450, 0x170, 7, 0x6e0, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D2__SD3_D2                IOMUX_PAD(0x454, 0x174, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D2__GPIO_5_22     IOMUX_PAD(0x454, 0x174, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D2__NANDF_D6      IOMUX_PAD(0x454, 0x174, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D2__SSP_D2                IOMUX_PAD(0x454, 0x174, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD3_D2__PLL3_BYP      IOMUX_PAD(0x454, 0x174, 7, 0x6e4, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D3__SD3_D3                IOMUX_PAD(0x458, 0x178, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D3__GPIO_5_23     IOMUX_PAD(0x458, 0x178, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D3__NANDF_D7      IOMUX_PAD(0x458, 0x178, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D3__SSP_D3                IOMUX_PAD(0x458, 0x178, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D4__SD3_D4                IOMUX_PAD(0x45C, 0x17C, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D4__GPIO_5_24     IOMUX_PAD(0x45C, 0x17C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D4__NANDF_D0      IOMUX_PAD(0x45C, 0x17C, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D4__SSP_D4                IOMUX_PAD(0x45C, 0x17C, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D5__SD3_D5                IOMUX_PAD(0x460, 0x180, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D5__GPIO_5_25     IOMUX_PAD(0x460, 0x180, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D5__NANDF_D1      IOMUX_PAD(0x460, 0x180, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D5__SSP_D5                IOMUX_PAD(0x460, 0x180, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D6__SD3_D6                IOMUX_PAD(0x464, 0x184, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D6__GPIO_5_26     IOMUX_PAD(0x464, 0x184, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D6__NANDF_D2      IOMUX_PAD(0x464, 0x184, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D6__SSP_D6                IOMUX_PAD(0x464, 0x184, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_D7__SD3_D7                IOMUX_PAD(0x468, 0x188, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_D7__GPIO_5_27     IOMUX_PAD(0x468, 0x188, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_D7__NANDF_D3      IOMUX_PAD(0x468, 0x188, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_D7__SSP_D7                IOMUX_PAD(0x468, 0x188, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_SD3_WP__SD3_WP                IOMUX_PAD(0x46C, 0x18C, 0, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_WP__GPIO_5_28     IOMUX_PAD(0x46C, 0x18C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_SD3_WP__NANDF_RESETN  IOMUX_PAD(0x46C, 0x18C, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_SD3_WP__SSP_CD                IOMUX_PAD(0x46C, 0x18C, 3, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_SD3_WP__SD4_LCTL      IOMUX_PAD(0x46C, 0x18C, 4, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_SD3_WP__WEIM_CS3      IOMUX_PAD(0x46C, 0x18C, 5, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D8__DISP_D8      IOMUX_PAD(0x470, 0x190, 0, 0x71c, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D8__GPIO_2_8     IOMUX_PAD(0x470, 0x190, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D8__NANDF_CLE    IOMUX_PAD(0x470, 0x190, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D8__SD1_LCTL     IOMUX_PAD(0x470, 0x190, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D8__SD4_CMD      IOMUX_PAD(0x470, 0x190, 4, 0x74c, 2, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D8__KEY_COL4     IOMUX_PAD(0x470, 0x190, 5, 0x790, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D8__FEC_TX_CLK   IOMUX_PAD(0x470, 0x190, 6, 0x78c, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D9__DISP_D9      IOMUX_PAD(0x474, 0x194, 0, 0x720, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D9__GPIO_2_9     IOMUX_PAD(0x474, 0x194, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D9__NANDF_ALE    IOMUX_PAD(0x474, 0x194, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D9__SD2_LCTL     IOMUX_PAD(0x474, 0x194, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D9__SD4_CLK      IOMUX_PAD(0x474, 0x194, 4, 0x748, 2, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D9__KEY_ROW4     IOMUX_PAD(0x474, 0x194, 5, 0x7a0, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D9__FEC_RX_ER    IOMUX_PAD(0x474, 0x194, 6, 0x788, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D10__DISP_D10    IOMUX_PAD(0x478, 0x198, 0, 0x724, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D10__GPIO_2_10   IOMUX_PAD(0x478, 0x198, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D10__NANDF_CEN0  IOMUX_PAD(0x478, 0x198, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D10__SD3_LCTL    IOMUX_PAD(0x478, 0x198, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D10__SD4_D0      IOMUX_PAD(0x478, 0x198, 4, 0x750, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D10__KEY_COL5    IOMUX_PAD(0x478, 0x198, 5, 0x794, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D10__FEC_RX_DV   IOMUX_PAD(0x478, 0x198, 6, 0x784, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D11__DISP_D11    IOMUX_PAD(0x47C, 0x19C, 0, 0x728, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D11__GPIO_2_11   IOMUX_PAD(0x47C, 0x19C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D11__NANDF_CEN1  IOMUX_PAD(0x47C, 0x19C, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D11__SD4_D1      IOMUX_PAD(0x47C, 0x19C, 4, 0x754, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D11__KEY_ROW5    IOMUX_PAD(0x47C, 0x19C, 5, 0x7a4, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D11__FEC_RDAT1   IOMUX_PAD(0x47C, 0x19C, 6, 0x77c, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D12__DISP_D12    IOMUX_PAD(0x480, 0x1A0, 0, 0x72c, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D12__GPIO_2_12   IOMUX_PAD(0x480, 0x1A0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D12__NANDF_CEN2  IOMUX_PAD(0x480, 0x1A0, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D12__SD1_CD      IOMUX_PAD(0x480, 0x1A0, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D12__SD4_D2      IOMUX_PAD(0x480, 0x1A0, 4, 0x758, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D12__KEY_COL6    IOMUX_PAD(0x480, 0x1A0, 5, 0x798, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D12__FEC_RDAT0   IOMUX_PAD(0x480, 0x1A0, 6, 0x778, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D13__DISP_D13    IOMUX_PAD(0x484, 0x1A4, 0, 0x730, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D13__GPIO_2_13   IOMUX_PAD(0x484, 0x1A4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D13__NANDF_CEN3  IOMUX_PAD(0x484, 0x1A4, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D13__SD3_CD      IOMUX_PAD(0x484, 0x1A4, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D13__SD4_D3      IOMUX_PAD(0x484, 0x1A4, 4, 0x75c, 1, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D13__KEY_ROW6    IOMUX_PAD(0x484, 0x1A4, 5, 0x7a8, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D13__FEC_TX_EN   IOMUX_PAD(0x484, 0x1A4, 6, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D14__DISP_D14    IOMUX_PAD(0x488, 0x1A8, 0, 0x734, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D14__GPIO_2_14   IOMUX_PAD(0x488, 0x1A8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D14__NANDF_RDY0  IOMUX_PAD(0x488, 0x1A8, 2, 0x7b4, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D14__SD1_WP      IOMUX_PAD(0x488, 0x1A8, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D14__SD4_WP      IOMUX_PAD(0x488, 0x1A8, 4, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D14__KEY_COL7    IOMUX_PAD(0x488, 0x1A8, 5, 0x79c, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D14__FEC_TDAT1   IOMUX_PAD(0x488, 0x1A8, 6, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_DISP_D15__DISP_D15    IOMUX_PAD(0x48C, 0x1AC, 0, 0x738, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_DISP_D15__GPIO_2_15   IOMUX_PAD(0x48C, 0x1AC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D15__NANDF_DQS   IOMUX_PAD(0x48C, 0x1AC, 2, 0x7b0, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D15__SD3_RST     IOMUX_PAD(0x48C, 0x1AC, 3, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D15__SD4_CD      IOMUX_PAD(0x48C, 0x1AC, 4, 0x0, 0, MX50_SD_PAD_CTRL)
-#define MX50_PAD_DISP_D15__KEY_ROW7    IOMUX_PAD(0x48C, 0x1AC, 5, 0x7ac, 1, NO_PAD_CTRL)
-#define MX50_PAD_DISP_D15__FEC_TDAT0   IOMUX_PAD(0x48C, 0x1AC, 6, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D0__EPDC_D0      IOMUX_PAD(0x54C, 0x1B0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D0__GPIO_3_0     IOMUX_PAD(0x54C, 0x1B0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D0__WEIM_D0      IOMUX_PAD(0x54C, 0x1B0, 2, 0x7ec, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D0__ELCDIF_RS    IOMUX_PAD(0x54C, 0x1B0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_D0__ELCDIF_PIXCLK        IOMUX_PAD(0x54C, 0x1B0, 4, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D1__EPDC_D1      IOMUX_PAD(0x550, 0x1B4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D1__GPIO_3_1     IOMUX_PAD(0x550, 0x1B4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D1__WEIM_D1      IOMUX_PAD(0x550, 0x1B4, 2, 0x7f0, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D1__ELCDIF_CS    IOMUX_PAD(0x550, 0x1B4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_D1__ELCDIF_EN    IOMUX_PAD(0x550, 0x1B4, 4, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D2__EPDC_D2      IOMUX_PAD(0x554, 0x1B8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D2__GPIO_3_2     IOMUX_PAD(0x554, 0x1B8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D2__WEIM_D2      IOMUX_PAD(0x554, 0x1B8, 2, 0x7f4, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D2__ELCDIF_WR    IOMUX_PAD(0x554, 0x1B8, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_D2__ELCDIF_VSYNC IOMUX_PAD(0x554, 0x1B8, 4, 0x73c, 2, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D3__EPDC_D3      IOMUX_PAD(0x558, 0x1BC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D3__GPIO_3_3     IOMUX_PAD(0x558, 0x1BC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D3__WEIM_D3      IOMUX_PAD(0x558, 0x1BC, 2, 0x7f8, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D3__ELCDIF_RD    IOMUX_PAD(0x558, 0x1BC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_D3__ELCDIF_HSYNC IOMUX_PAD(0x558, 0x1BC, 4, 0x6f8, 3, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D4__EPDC_D4      IOMUX_PAD(0x55C, 0x1C0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D4__GPIO_3_4     IOMUX_PAD(0x55C, 0x1C0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D4__WEIM_D4      IOMUX_PAD(0x55C, 0x1C0, 2, 0x7fc, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D5__EPDC_D5      IOMUX_PAD(0x560, 0x1C4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D5__GPIO_3_5     IOMUX_PAD(0x560, 0x1C4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D5__WEIM_D5      IOMUX_PAD(0x560, 0x1C4, 2, 0x800, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D6__EPDC_D6      IOMUX_PAD(0x564, 0x1C8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D6__GPIO_3_6     IOMUX_PAD(0x564, 0x1C8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D6__WEIM_D6      IOMUX_PAD(0x564, 0x1C8, 2, 0x804, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D7__EPDC_D7      IOMUX_PAD(0x568, 0x1CC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D7__GPIO_3_7     IOMUX_PAD(0x568, 0x1CC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D7__WEIM_D7      IOMUX_PAD(0x568, 0x1CC, 2, 0x808, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D8__EPDC_D8      IOMUX_PAD(0x56C, 0x1D0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D8__GPIO_3_8     IOMUX_PAD(0x56C, 0x1D0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D8__WEIM_D8      IOMUX_PAD(0x56C, 0x1D0, 2, 0x80c, 2, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D8__ELCDIF_D24   IOMUX_PAD(0x56C, 0x1D0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D9__EPDC_D9      IOMUX_PAD(0x570, 0x1D4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D9__GPIO_3_9     IOMUX_PAD(0x570, 0x1D4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D9__WEIM_D9      IOMUX_PAD(0x570, 0x1D4, 2, 0x810, 2, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D9__ELCDIF_D25   IOMUX_PAD(0x570, 0x1D4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D10__EPDC_D10    IOMUX_PAD(0x574, 0x1D8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D10__GPIO_3_10   IOMUX_PAD(0x574, 0x1D8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D10__WEIM_D10    IOMUX_PAD(0x574, 0x1D8, 2, 0x814, 2, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D10__ELCDIF_D26  IOMUX_PAD(0x574, 0x1D8, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D11__EPDC_D11    IOMUX_PAD(0x578, 0x1DC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D11__GPIO_3_11   IOMUX_PAD(0x578, 0x1DC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D11__WEIM_D11    IOMUX_PAD(0x578, 0x1DC, 2, 0x818, 2, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D11__ELCDIF_D27  IOMUX_PAD(0x578, 0x1DC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D12__EPDC_D12    IOMUX_PAD(0x57C, 0x1E0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D12__GPIO_3_12   IOMUX_PAD(0x57C, 0x1E0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D12__WEIM_D12    IOMUX_PAD(0x57C, 0x1E0, 2, 0x81c, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D12__ELCDIF_D28  IOMUX_PAD(0x57C, 0x1E0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D13__EPDC_D13    IOMUX_PAD(0x580, 0x1E4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D13__GPIO_3_13   IOMUX_PAD(0x580, 0x1E4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D13__WEIM_D13    IOMUX_PAD(0x580, 0x1E4, 2, 0x820, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D13__ELCDIF_D29  IOMUX_PAD(0x580, 0x1E4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D14__EPDC_D14    IOMUX_PAD(0x584, 0x1E8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D14__GPIO_3_14   IOMUX_PAD(0x584, 0x1E8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D14__WEIM_D14    IOMUX_PAD(0x584, 0x1E8, 2, 0x824, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D14__ELCDIF_D30  IOMUX_PAD(0x584, 0x1E8, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_D14__AUD6_TXD    IOMUX_PAD(0x584, 0x1E8, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_D15__EPDC_D15    IOMUX_PAD(0x588, 0x1EC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D15__GPIO_3_15   IOMUX_PAD(0x588, 0x1EC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D15__WEIM_D15    IOMUX_PAD(0x588, 0x1EC, 2, 0x828, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_D15__ELCDIF_D31  IOMUX_PAD(0x588, 0x1EC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_D15__AUD6_TXC    IOMUX_PAD(0x588, 0x1EC, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_GDCLK__EPDC_GDCLK        IOMUX_PAD(0x58C, 0x1F0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDCLK__GPIO_3_16 IOMUX_PAD(0x58C, 0x1F0, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDCLK__WEIM_D16  IOMUX_PAD(0x58C, 0x1F0, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDCLK__ELCDIF_D16        IOMUX_PAD(0x58C, 0x1F0, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_GDCLK__AUD6_TXFS IOMUX_PAD(0x58C, 0x1F0, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_GDSP__EPDC_GDSP  IOMUX_PAD(0x590, 0x1F4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDSP__GPIO_3_17  IOMUX_PAD(0x590, 0x1F4, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDSP__WEIM_D17   IOMUX_PAD(0x590, 0x1F4, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDSP__ELCDIF_D17 IOMUX_PAD(0x590, 0x1F4, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_GDSP__AUD6_RXD   IOMUX_PAD(0x590, 0x1F4, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_GDOE__EPDC_GDOE  IOMUX_PAD(0x594, 0x1F8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDOE__GPIO_3_18  IOMUX_PAD(0x594, 0x1F8, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDOE__WEIM_D18   IOMUX_PAD(0x594, 0x1F8, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDOE__ELCDIF_D18 IOMUX_PAD(0x594, 0x1F8, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_GDOE__AUD6_RXC   IOMUX_PAD(0x594, 0x1F8, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_GDRL__EPDC_GDRL  IOMUX_PAD(0x598, 0x1FC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDRL__GPIO_3_19  IOMUX_PAD(0x598, 0x1FC, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDRL__WEIM_D19   IOMUX_PAD(0x598, 0x1FC, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_GDRL__ELCDIF_D19 IOMUX_PAD(0x598, 0x1FC, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_GDRL__AUD6_RXFS  IOMUX_PAD(0x598, 0x1FC, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCLK__EPDC_SDCLK        IOMUX_PAD(0x59C, 0x200, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLK__GPIO_3_20 IOMUX_PAD(0x59C, 0x200, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLK__WEIM_D20  IOMUX_PAD(0x59C, 0x200, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLK__ELCDIF_D20        IOMUX_PAD(0x59C, 0x200, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLK__AUD5_TXD  IOMUX_PAD(0x59C, 0x200, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDOEZ__EPDC_SDOEZ        IOMUX_PAD(0x5A0, 0x204, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOEZ__GPIO_3_21 IOMUX_PAD(0x5A0, 0x204, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOEZ__WEIM_D21  IOMUX_PAD(0x5A0, 0x204, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOEZ__ELCDIF_D21        IOMUX_PAD(0x5A0, 0x204, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOEZ__AUD5_TXC  IOMUX_PAD(0x5A0, 0x204, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDOED__EPDC_SDOED        IOMUX_PAD(0x5A4, 0x208, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOED__GPIO_3_22 IOMUX_PAD(0x5A4, 0x208, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOED__WEIM_D22  IOMUX_PAD(0x5A4, 0x208, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOED__ELCDIF_D22        IOMUX_PAD(0x5A4, 0x208, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOED__AUD5_TXFS IOMUX_PAD(0x5A4, 0x208, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDOE__EPDC_SDOE  IOMUX_PAD(0x5A8, 0x20C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOE__GPIO_3_23  IOMUX_PAD(0x5A8, 0x20C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOE__WEIM_D23   IOMUX_PAD(0x5A8, 0x20C, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOE__ELCDIF_D23 IOMUX_PAD(0x5A8, 0x20C, 3, 0x0, 0, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDOE__AUD5_RXD   IOMUX_PAD(0x5A8, 0x20C, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDLE__EPDC_SDLE  IOMUX_PAD(0x5AC, 0x210, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDLE__GPIO_3_24  IOMUX_PAD(0x5AC, 0x210, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDLE__WEIM_D24   IOMUX_PAD(0x5AC, 0x210, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDLE__ELCDIF_D8  IOMUX_PAD(0x5AC, 0x210, 3, 0x71c, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDLE__AUD5_RXC   IOMUX_PAD(0x5AC, 0x210, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCLKN__EPDC_SDCLKN      IOMUX_PAD(0x5B0, 0x214, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLKN__GPIO_3_25                IOMUX_PAD(0x5B0, 0x214, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLKN__WEIM_D25         IOMUX_PAD(0x5B0, 0x214, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLKN__ELCDIF_D9                IOMUX_PAD(0x5B0, 0x214, 3, 0x720, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCLKN__AUD5_RXFS                IOMUX_PAD(0x5B0, 0x214, 4, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDSHR__EPDC_SDSHR        IOMUX_PAD(0x5B4, 0x218, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDSHR__GPIO_3_26 IOMUX_PAD(0x5B4, 0x218, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDSHR__WEIM_D26  IOMUX_PAD(0x5B4, 0x218, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDSHR__ELCDIF_D10        IOMUX_PAD(0x5B4, 0x218, 3, 0x724, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_SDSHR__AUD4_TXD  IOMUX_PAD(0x5B4, 0x218, 4, 0x6c8, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_PWRCOM__EPDC_PWRCOM      IOMUX_PAD(0x5B8, 0x21C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCOM__GPIO_3_27                IOMUX_PAD(0x5B8, 0x21C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCOM__WEIM_D27         IOMUX_PAD(0x5B8, 0x21C, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCOM__ELCDIF_D11       IOMUX_PAD(0x5B8, 0x21C, 3, 0x728, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCOM__AUD4_TXC         IOMUX_PAD(0x5B8, 0x21C, 4, 0x6d4, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_PWRSTAT__EPDC_PWRSTAT    IOMUX_PAD(0x5BC, 0x220, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRSTAT__GPIO_3_28       IOMUX_PAD(0x5BC, 0x220, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRSTAT__WEIM_D28                IOMUX_PAD(0x5BC, 0x220, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRSTAT__ELCDIF_D12      IOMUX_PAD(0x5BC, 0x220, 3, 0x72c, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRSTAT__AUD4_TXFS       IOMUX_PAD(0x5BC, 0x220, 4, 0x6d8, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_PWRCTRL0__EPDC_PWRCTRL0  IOMUX_PAD(0x5C0, 0x224, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL0__GPIO_3_29      IOMUX_PAD(0x5C0, 0x224, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL0__WEIM_D29       IOMUX_PAD(0x5C0, 0x224, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL0__ELCDIF_D13     IOMUX_PAD(0x5C0, 0x224, 3, 0x730, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL0__AUD4_RXD       IOMUX_PAD(0x5C0, 0x224, 4, 0x6c4, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_PWRCTRL1__EPDC_PWRCTRL1  IOMUX_PAD(0x5C4, 0x228, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL1__GPIO_3_30      IOMUX_PAD(0x5C4, 0x228, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL1__WEIM_D30       IOMUX_PAD(0x5C4, 0x228, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL1__ELCDIF_D14     IOMUX_PAD(0x5C4, 0x228, 3, 0x734, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL1__AUD4_RXC       IOMUX_PAD(0x5C4, 0x228, 4, 0x6cc, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_PWRCTRL2__EPDC_PWRCTRL2  IOMUX_PAD(0x5C8, 0x22C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL2__GPIO_3_31      IOMUX_PAD(0x5C8, 0x22C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL2__WEIM_D31       IOMUX_PAD(0x5C8, 0x22C, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL2__ELCDIF_D15     IOMUX_PAD(0x5C8, 0x22C, 3, 0x738, 1, MX50_ELCDIF_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL2__AUD4_RXFS      IOMUX_PAD(0x5C8, 0x22C, 4, 0x6d0, 1, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL2__SDMA_EXT0      IOMUX_PAD(0x5C8, 0x22C, 6, 0x7b8, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_PWRCTRL3__PWRCTRL3       IOMUX_PAD(0x5CC, 0x230, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL3__GPIO_4_20      IOMUX_PAD(0x5CC, 0x230, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL3__WEIM_EB2       IOMUX_PAD(0x5CC, 0x230, 2, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_PWRCTRL3__SDMA_EXT1      IOMUX_PAD(0x5CC, 0x230, 6, 0x7bc, 1, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_VCOM0__EPDC_VCOM0        IOMUX_PAD(0x5D0, 0x234, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_VCOM0__GPIO_4_21 IOMUX_PAD(0x5D0, 0x234, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_VCOM0__WEIM_EB3  IOMUX_PAD(0x5D0, 0x234, 2, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_VCOM1__EPDC_VCOM1        IOMUX_PAD(0x5D4, 0x238, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_VCOM1__GPIO_4_22 IOMUX_PAD(0x5D4, 0x238, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_VCOM1__WEIM_CS3  IOMUX_PAD(0x5D4, 0x238, 2, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EPDC_BDR0__EPDC_BDR0  IOMUX_PAD(0x5D8, 0x23C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_BDR0__GPIO_4_23  IOMUX_PAD(0x5D8, 0x23C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_BDR0__ELCDIF_D7  IOMUX_PAD(0x5D8, 0x23C, 3, 0x718, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_BDR1__EPDC_BDR1  IOMUX_PAD(0x5DC, 0x240, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_BDR1__GPIO_4_24  IOMUX_PAD(0x5DC, 0x240, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_BDR1__ELCDIF_D6  IOMUX_PAD(0x5DC, 0x240, 3, 0x714, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCE0__EPDC_SDCE0        IOMUX_PAD(0x5E0, 0x244, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE0__GPIO_4_25 IOMUX_PAD(0x5E0, 0x244, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE0__ELCDIF_D5 IOMUX_PAD(0x5E0, 0x244, 3, 0x710, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCE1__EPDC_SDCE1        IOMUX_PAD(0x5E4, 0x248, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE1__GPIO_4_26 IOMUX_PAD(0x5E4, 0x248, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE1__ELCDIF_D4 IOMUX_PAD(0x5E4, 0x248, 2, 0x70c, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCE2__EPDC_SDCE2                IOMUX_PAD(0x5E8, 0x24C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE2__GPIO_4_27         IOMUX_PAD(0x5E8, 0x24C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE2__ELCDIF_DAT3       IOMUX_PAD(0x5E8, 0x24C, 3, 0x708, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCE3__EPDC_SDCE3        IOMUX_PAD(0x5EC, 0x250, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE3__GPIO_4_28 IOMUX_PAD(0x5EC, 0x250, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE3__ELCDIF_D2 IOMUX_PAD(0x5EC, 0x250, 3, 0x704, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCE4__EPDC_SDCE4        IOMUX_PAD(0x5F0, 0x254, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE4__GPIO_4_29 IOMUX_PAD(0x5F0, 0x254, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE4__ELCDIF_D1 IOMUX_PAD(0x5F0, 0x254, 3, 0x700, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EPDC_SDCE5__EPDC_SDCE5        IOMUX_PAD(0x5F4, 0x258, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE5__GPIO_4_30 IOMUX_PAD(0x5F4, 0x258, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EPDC_SDCE5__ELCDIF_D0 IOMUX_PAD(0x5F4, 0x258, 3, 0x6fc, 1, MX50_ELCDIF_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA0__WEIM_A0      IOMUX_PAD(0x5F8, 0x25C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA0__GPIO_1_0     IOMUX_PAD(0x5F8, 0x25C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA0__KEY_COL4     IOMUX_PAD(0x5f8, 0x25C, 3, 0x790, 2, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA1__WEIM_A1      IOMUX_PAD(0x5FC, 0x260, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA1__GPIO_1_1     IOMUX_PAD(0x5FC, 0x260, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA1__KEY_ROW4     IOMUX_PAD(0x5fc, 0x260, 3, 0x7a0, 2, MX50_KEYPAD_CTRL)
-
-#define MX50_PAD_EIM_DA2__WEIM_A2      IOMUX_PAD(0x600, 0x264, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA2__GPIO_1_2     IOMUX_PAD(0x600, 0x264, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA2__KEY_COL5     IOMUX_PAD(0x600, 0x264, 3, 0x794, 2, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA3__WEIM_A3      IOMUX_PAD(0x604, 0x268, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA3__GPIO_1_3     IOMUX_PAD(0x604, 0x268, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA3__KEY_ROW5     IOMUX_PAD(0x604, 0x268, 3, 0x7a4, 2, MX50_KEYPAD_CTRL)
-
-#define MX50_PAD_EIM_DA4__WEIM_A4      IOMUX_PAD(0x608, 0x26C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA4__GPIO_1_4     IOMUX_PAD(0x608, 0x26C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA4__KEY_COL6     IOMUX_PAD(0x608, 0x26C, 3, 0x798, 2, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA5__WEIM_A5      IOMUX_PAD(0x60C, 0x270, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA5__GPIO_1_5     IOMUX_PAD(0x60C, 0x270, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA5__KEY_ROW6     IOMUX_PAD(0x60C, 0x270, 3, 0x7a8, 2, MX50_KEYPAD_CTRL)
-
-#define MX50_PAD_EIM_DA6__WEIM_A6      IOMUX_PAD(0x610, 0x274, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA6__GPIO_1_6     IOMUX_PAD(0x610, 0x274, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA6__KEY_COL7     IOMUX_PAD(0x610, 0x274, 3, 0x79c, 2, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA7__WEIM_A7      IOMUX_PAD(0x614, 0x278, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA7__GPIO_1_7     IOMUX_PAD(0x614, 0x278, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA7__KEY_ROW7     IOMUX_PAD(0x614, 0x278, 3, 0x7ac, 2, MX50_KEYPAD_CTRL)
-
-#define MX50_PAD_EIM_DA8__WEIM_A8      IOMUX_PAD(0x618, 0x27C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA8__GPIO_1_8     IOMUX_PAD(0x618, 0x27C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA8__NANDF_CLE    IOMUX_PAD(0x618, 0x27C, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_EIM_DA9__WEIM_A9      IOMUX_PAD(0x61C, 0x280, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA9__GPIO_1_9     IOMUX_PAD(0x61C, 0x280, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA9__NANDF_ALE    IOMUX_PAD(0x61C, 0x280, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_EIM_DA10__WEIM_A10    IOMUX_PAD(0x620, 0x284, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA10__GPIO_1_10   IOMUX_PAD(0x620, 0x284, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA10__NANDF_CE0   IOMUX_PAD(0x620, 0x284, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_EIM_DA11__WEIM_A11    IOMUX_PAD(0x624, 0x288, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA11__GPIO_1_11   IOMUX_PAD(0x624, 0x288, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA11__NANDF_CE1   IOMUX_PAD(0x624, 0x288, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-
-#define MX50_PAD_EIM_DA12__WEIM_A12    IOMUX_PAD(0x628, 0x28C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA12__GPIO_1_12   IOMUX_PAD(0x628, 0x28C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA12__NANDF_CE2   IOMUX_PAD(0x628, 0x28C, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_EIM_DA12__EPDC_SDCE6  IOMUX_PAD(0x628, 0x28C, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA13__WEIM_A13    IOMUX_PAD(0x62C, 0x290, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA13__GPIO_1_13   IOMUX_PAD(0x62C, 0x290, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA13__NANDF_CE3   IOMUX_PAD(0x62C, 0x290, 2, 0x0, 0, PAD_CTL_DSE_HIGH)
-#define MX50_PIN_EIM_DA13__EPDC_SDCE7  IOMUX_PAD(0x62C, 0x290, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA14__WEIM_A14    IOMUX_PAD(0x630, 0x294, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA14__GPIO_1_14   IOMUX_PAD(0x630, 0x294, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA14__NANDF_READY IOMUX_PAD(0x630, 0x294, 2, 0x7B4, 2, PAD_CTL_PKE | \
-                                                       PAD_CTL_PUE | PAD_CTL_PUS_100K_UP)
-#define MX50_PAD_EIM_DA14__EPDC_SDCE8  IOMUX_PAD(0x630, 0x294, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_DA15__WEIM_A15    IOMUX_PAD(0x634, 0x298, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_DA15__GPIO_1_15   IOMUX_PAD(0x634, 0x298, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PIN_EIM_DA15__NANDF_DQS   IOMUX_PAD(0x634, 0x298, 2, 0x7B0, 2, PAD_CTL_DSE_HIGH)
-#define MX50_PAD_EIM_DA15__EPDC_SDCE9  IOMUX_PAD(0x634, 0x298, 3, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_CS2__WEIM_CS2     IOMUX_PAD(0x638, 0x29C, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_CS2__GPIO_1_16    IOMUX_PAD(0x638, 0x29C, 1, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_CS2__WEIM_A27     IOMUX_PAD(0x638, 0x29C, 2, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_CS1__WEIM_CS1     IOMUX_PAD(0x63C, 0x2A0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_CS1__GPIO_1_17    IOMUX_PAD(0x63C, 0x2A0, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_CS0__WEIM_CS0     IOMUX_PAD(0x640, 0x2A4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_CS0__GPIO_1_18    IOMUX_PAD(0x640, 0x2A4, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_EB0__WEIM_EB0     IOMUX_PAD(0x644, 0x2A8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_EB0__GPIO_1_19    IOMUX_PAD(0x644, 0x2A8, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_EB1__WEIM_EB1     IOMUX_PAD(0x648, 0x2AC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_EB1__GPIO_1_20    IOMUX_PAD(0x648, 0x2AC, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_WAIT__WEIM_WAIT   IOMUX_PAD(0x64C, 0x2B0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_WAIT__GPIO_1_21   IOMUX_PAD(0x64C, 0x2B0, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_BCLK__WEIM_BCLK   IOMUX_PAD(0x650, 0x2B4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_BCLK__GPIO_1_22   IOMUX_PAD(0x650, 0x2B4, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_RDY__WEIM_RDY     IOMUX_PAD(0x654, 0x2B8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_RDY__GPIO_1_23    IOMUX_PAD(0x654, 0x2B8, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_OE__WEIM_OE       IOMUX_PAD(0x658, 0x2BC, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_OE__GPIO_1_24     IOMUX_PAD(0x658, 0x2BC, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_RW__WEIM_RW       IOMUX_PAD(0x65C, 0x2C0, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_RW__GPIO_1_25     IOMUX_PAD(0x65C, 0x2C0, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_LBA__WEIM_LBA     IOMUX_PAD(0x660, 0x2C4, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_LBA__GPIO_1_26    IOMUX_PAD(0x660, 0x2C4, 1, 0x0, 0, NO_PAD_CTRL)
-
-#define MX50_PAD_EIM_CRE__WEIM_CRE     IOMUX_PAD(0x664, 0x2C8, 0, 0x0, 0, NO_PAD_CTRL)
-#define MX50_PAD_EIM_CRE__GPIO_1_27    IOMUX_PAD(0x664, 0x2C8, 1, 0x0, 0, NO_PAD_CTRL)
-
-#endif /* __MACH_IOMUX_MX50_H__ */
diff --git a/arch/arm/mach-imx/lluart.c b/arch/arm/mach-imx/lluart.c
deleted file mode 100644 (file)
index 2fdc9bf..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2011 Freescale Semiconductor, Inc.
- * Copyright 2011 Linaro Ltd.
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-#include <linux/init.h>
-#include <asm/page.h>
-#include <asm/sizes.h>
-#include <asm/mach/map.h>
-
-#include "hardware.h"
-
-#define IMX6Q_UART1_BASE_ADDR  0x02020000
-#define IMX6Q_UART2_BASE_ADDR  0x021e8000
-#define IMX6Q_UART3_BASE_ADDR  0x021ec000
-#define IMX6Q_UART4_BASE_ADDR  0x021f0000
-#define IMX6Q_UART5_BASE_ADDR  0x021f4000
-
-/*
- * IMX6Q_UART_BASE_ADDR is put in the middle to force the expansion
- * of IMX6Q_UART##n##_BASE_ADDR.
- */
-#define IMX6Q_UART_BASE_ADDR(n)        IMX6Q_UART##n##_BASE_ADDR
-#define IMX6Q_UART_BASE(n)     IMX6Q_UART_BASE_ADDR(n)
-#define IMX6Q_DEBUG_UART_BASE  IMX6Q_UART_BASE(CONFIG_DEBUG_IMX6Q_UART_PORT)
-
-static struct map_desc imx_lluart_desc = {
-#ifdef CONFIG_DEBUG_IMX6Q_UART
-       .virtual        = IMX_IO_P2V(IMX6Q_DEBUG_UART_BASE),
-       .pfn            = __phys_to_pfn(IMX6Q_DEBUG_UART_BASE),
-       .length         = 0x4000,
-       .type           = MT_DEVICE,
-#endif
-};
-
-void __init imx_lluart_map_io(void)
-{
-       if (imx_lluart_desc.virtual)
-               iotable_init(&imx_lluart_desc, 1);
-}
index 8d3d06e0e8a19a527e89ffedf75ba50ecd652477..1786b2d1257eb0f77b92564f93f07f17b8fbdf65 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/clk.h>
 #include <linux/clkdev.h>
-#include <linux/cpuidle.h>
 #include <linux/delay.h>
 #include <linux/export.h>
 #include <linux/init.h>
 #include <linux/regmap.h>
 #include <linux/micrel_phy.h>
 #include <linux/mfd/syscon.h>
-#include <asm/cpuidle.h>
 #include <asm/smp_twd.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/arch.h>
+#include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <asm/system_misc.h>
 
@@ -201,24 +200,20 @@ static void __init imx6q_init_machine(void)
        imx6q_1588_init();
 }
 
-static struct cpuidle_driver imx6q_cpuidle_driver = {
-       .name                   = "imx6q_cpuidle",
-       .owner                  = THIS_MODULE,
-       .en_core_tk_irqen       = 1,
-       .states[0]              = ARM_CPUIDLE_WFI_STATE,
-       .state_count            = 1,
-};
-
 static void __init imx6q_init_late(void)
 {
-       imx_cpuidle_init(&imx6q_cpuidle_driver);
+       /*
+        * WAIT mode is broken on TO 1.0 and 1.1, so there is no point
+        * to run cpuidle on them.
+        */
+       if (imx6q_revision() > IMX_CHIP_REVISION_1_1)
+               imx6q_cpuidle_init();
 }
 
 static void __init imx6q_map_io(void)
 {
-       imx_lluart_map_io();
+       debug_ll_io_init();
        imx_scu_map_io();
-       imx6q_clock_map_io();
 }
 
 static void __init imx6q_init_irq(void)
diff --git a/arch/arm/mach-imx/mach-mx50_rdp.c b/arch/arm/mach-imx/mach-mx50_rdp.c
deleted file mode 100644 (file)
index 8937902..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
- */
-
-/*
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-
-#include <asm/irq.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "common.h"
-#include "devices-imx50.h"
-#include "hardware.h"
-#include "iomux-mx50.h"
-
-#define FEC_EN         IMX_GPIO_NR(6, 23)
-#define FEC_RESET_B    IMX_GPIO_NR(4, 12)
-
-static iomux_v3_cfg_t mx50_rdp_pads[] __initdata = {
-       /* SD1 */
-       MX50_PAD_ECSPI2_SS0__GPIO_4_19,
-       MX50_PAD_EIM_CRE__GPIO_1_27,
-       MX50_PAD_SD1_CMD__SD1_CMD,
-
-       MX50_PAD_SD1_CLK__SD1_CLK,
-       MX50_PAD_SD1_D0__SD1_D0,
-       MX50_PAD_SD1_D1__SD1_D1,
-       MX50_PAD_SD1_D2__SD1_D2,
-       MX50_PAD_SD1_D3__SD1_D3,
-
-       /* SD2 */
-       MX50_PAD_SD2_CD__GPIO_5_17,
-       MX50_PAD_SD2_WP__GPIO_5_16,
-       MX50_PAD_SD2_CMD__SD2_CMD,
-       MX50_PAD_SD2_CLK__SD2_CLK,
-       MX50_PAD_SD2_D0__SD2_D0,
-       MX50_PAD_SD2_D1__SD2_D1,
-       MX50_PAD_SD2_D2__SD2_D2,
-       MX50_PAD_SD2_D3__SD2_D3,
-       MX50_PAD_SD2_D4__SD2_D4,
-       MX50_PAD_SD2_D5__SD2_D5,
-       MX50_PAD_SD2_D6__SD2_D6,
-       MX50_PAD_SD2_D7__SD2_D7,
-
-       /* SD3 */
-       MX50_PAD_SD3_CMD__SD3_CMD,
-       MX50_PAD_SD3_CLK__SD3_CLK,
-       MX50_PAD_SD3_D0__SD3_D0,
-       MX50_PAD_SD3_D1__SD3_D1,
-       MX50_PAD_SD3_D2__SD3_D2,
-       MX50_PAD_SD3_D3__SD3_D3,
-       MX50_PAD_SD3_D4__SD3_D4,
-       MX50_PAD_SD3_D5__SD3_D5,
-       MX50_PAD_SD3_D6__SD3_D6,
-       MX50_PAD_SD3_D7__SD3_D7,
-
-       /* PWR_INT */
-       MX50_PAD_ECSPI2_MISO__GPIO_4_18,
-
-       /* UART pad setting */
-       MX50_PAD_UART1_TXD__UART1_TXD,
-       MX50_PAD_UART1_RXD__UART1_RXD,
-       MX50_PAD_UART1_RTS__UART1_RTS,
-       MX50_PAD_UART2_TXD__UART2_TXD,
-       MX50_PAD_UART2_RXD__UART2_RXD,
-       MX50_PAD_UART2_CTS__UART2_CTS,
-       MX50_PAD_UART2_RTS__UART2_RTS,
-
-       MX50_PAD_I2C1_SCL__I2C1_SCL,
-       MX50_PAD_I2C1_SDA__I2C1_SDA,
-       MX50_PAD_I2C2_SCL__I2C2_SCL,
-       MX50_PAD_I2C2_SDA__I2C2_SDA,
-
-       MX50_PAD_EPITO__USBH1_PWR,
-       /* Need to comment below line if
-        * one needs to debug owire.
-        */
-       MX50_PAD_OWIRE__USBH1_OC,
-       /* using gpio to control otg pwr */
-       MX50_PAD_PWM2__GPIO_6_25,
-       MX50_PAD_I2C3_SCL__USBOTG_OC,
-
-       MX50_PAD_SSI_RXC__FEC_MDIO,
-       MX50_PAD_SSI_RXFS__FEC_MDC,
-       MX50_PAD_DISP_D0__FEC_TXCLK,
-       MX50_PAD_DISP_D1__FEC_RX_ER,
-       MX50_PAD_DISP_D2__FEC_RX_DV,
-       MX50_PAD_DISP_D3__FEC_RXD1,
-       MX50_PAD_DISP_D4__FEC_RXD0,
-       MX50_PAD_DISP_D5__FEC_TX_EN,
-       MX50_PAD_DISP_D6__FEC_TXD1,
-       MX50_PAD_DISP_D7__FEC_TXD0,
-       MX50_PAD_I2C3_SDA__GPIO_6_23,
-       MX50_PAD_ECSPI1_SCLK__GPIO_4_12,
-
-       MX50_PAD_CSPI_SS0__CSPI_SS0,
-       MX50_PAD_ECSPI1_MOSI__CSPI_SS1,
-       MX50_PAD_CSPI_MOSI__CSPI_MOSI,
-       MX50_PAD_CSPI_MISO__CSPI_MISO,
-
-       /* SGTL500_OSC_EN */
-       MX50_PAD_UART1_CTS__GPIO_6_8,
-
-       /* SGTL_AMP_SHDN */
-       MX50_PAD_UART3_RXD__GPIO_6_15,
-
-       /* Keypad */
-       MX50_PAD_KEY_COL0__KEY_COL0,
-       MX50_PAD_KEY_ROW0__KEY_ROW0,
-       MX50_PAD_KEY_COL1__KEY_COL1,
-       MX50_PAD_KEY_ROW1__KEY_ROW1,
-       MX50_PAD_KEY_COL2__KEY_COL2,
-       MX50_PAD_KEY_ROW2__KEY_ROW2,
-       MX50_PAD_KEY_COL3__KEY_COL3,
-       MX50_PAD_KEY_ROW3__KEY_ROW3,
-       MX50_PAD_EIM_DA0__KEY_COL4,
-       MX50_PAD_EIM_DA1__KEY_ROW4,
-       MX50_PAD_EIM_DA2__KEY_COL5,
-       MX50_PAD_EIM_DA3__KEY_ROW5,
-       MX50_PAD_EIM_DA4__KEY_COL6,
-       MX50_PAD_EIM_DA5__KEY_ROW6,
-       MX50_PAD_EIM_DA6__KEY_COL7,
-       MX50_PAD_EIM_DA7__KEY_ROW7,
-       /*EIM pads */
-       MX50_PAD_EIM_DA8__GPIO_1_8,
-       MX50_PAD_EIM_DA9__GPIO_1_9,
-       MX50_PAD_EIM_DA10__GPIO_1_10,
-       MX50_PAD_EIM_DA11__GPIO_1_11,
-       MX50_PAD_EIM_DA12__GPIO_1_12,
-       MX50_PAD_EIM_DA13__GPIO_1_13,
-       MX50_PAD_EIM_DA14__GPIO_1_14,
-       MX50_PAD_EIM_DA15__GPIO_1_15,
-       MX50_PAD_EIM_CS2__GPIO_1_16,
-       MX50_PAD_EIM_CS1__GPIO_1_17,
-       MX50_PAD_EIM_CS0__GPIO_1_18,
-       MX50_PAD_EIM_EB0__GPIO_1_19,
-       MX50_PAD_EIM_EB1__GPIO_1_20,
-       MX50_PAD_EIM_WAIT__GPIO_1_21,
-       MX50_PAD_EIM_BCLK__GPIO_1_22,
-       MX50_PAD_EIM_RDY__GPIO_1_23,
-       MX50_PAD_EIM_OE__GPIO_1_24,
-};
-
-/* Serial ports */
-static const struct imxuart_platform_data uart_pdata __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static const struct fec_platform_data fec_data __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-static inline void mx50_rdp_fec_reset(void)
-{
-       gpio_request(FEC_EN, "fec-en");
-       gpio_direction_output(FEC_EN, 0);
-       gpio_request(FEC_RESET_B, "fec-reset_b");
-       gpio_direction_output(FEC_RESET_B, 0);
-       msleep(1);
-       gpio_set_value(FEC_RESET_B, 1);
-}
-
-static const struct imxi2c_platform_data i2c_data __initconst = {
-       .bitrate = 100000,
-};
-
-/*
- * Board specific initialization.
- */
-static void __init mx50_rdp_board_init(void)
-{
-       imx50_soc_init();
-
-       mxc_iomux_v3_setup_multiple_pads(mx50_rdp_pads,
-                                       ARRAY_SIZE(mx50_rdp_pads));
-
-       imx50_add_imx_uart(0, &uart_pdata);
-       imx50_add_imx_uart(1, &uart_pdata);
-       mx50_rdp_fec_reset();
-       imx50_add_fec(&fec_data);
-       imx50_add_imx_i2c(0, &i2c_data);
-       imx50_add_imx_i2c(1, &i2c_data);
-       imx50_add_imx_i2c(2, &i2c_data);
-}
-
-static void __init mx50_rdp_timer_init(void)
-{
-       mx50_clocks_init(32768, 24000000, 22579200);
-}
-
-MACHINE_START(MX50_RDP, "Freescale MX50 Reference Design Platform")
-       .map_io = mx50_map_io,
-       .init_early = imx50_init_early,
-       .init_irq = mx50_init_irq,
-       .handle_irq = imx50_handle_irq,
-       .init_time      = mx50_rdp_timer_init,
-       .init_machine = mx50_rdp_board_init,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c
deleted file mode 100644 (file)
index 2d23651..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright (C) 2010 Jason Wang <jason77.wang@gmail.com>
- *
- * The code contained herein is licensed under the GNU General Public
- * License. You may obtain a copy of the GNU General Public License
- * Version 2 or later at the following locations:
- *
- * http://www.opensource.org/licenses/gpl-license.html
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-#include <linux/irq.h>
-#include <linux/platform_device.h>
-#include <linux/spi/spi.h>
-#include <linux/gpio.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "3ds_debugboard.h"
-#include "common.h"
-#include "devices-imx51.h"
-#include "hardware.h"
-#include "iomux-mx51.h"
-
-#define MX51_3DS_ECSPI2_CS     (GPIO_PORTC + 28)
-
-static iomux_v3_cfg_t mx51_3ds_pads[] = {
-       /* UART1 */
-       MX51_PAD_UART1_RXD__UART1_RXD,
-       MX51_PAD_UART1_TXD__UART1_TXD,
-       MX51_PAD_UART1_RTS__UART1_RTS,
-       MX51_PAD_UART1_CTS__UART1_CTS,
-
-       /* UART2 */
-       MX51_PAD_UART2_RXD__UART2_RXD,
-       MX51_PAD_UART2_TXD__UART2_TXD,
-       MX51_PAD_EIM_D25__UART2_CTS,
-       MX51_PAD_EIM_D26__UART2_RTS,
-
-       /* UART3 */
-       MX51_PAD_UART3_RXD__UART3_RXD,
-       MX51_PAD_UART3_TXD__UART3_TXD,
-       MX51_PAD_EIM_D24__UART3_CTS,
-       MX51_PAD_EIM_D27__UART3_RTS,
-
-       /* CPLD PARENT IRQ PIN */
-       MX51_PAD_GPIO1_6__GPIO1_6,
-
-       /* KPP */
-       MX51_PAD_KEY_ROW0__KEY_ROW0,
-       MX51_PAD_KEY_ROW1__KEY_ROW1,
-       MX51_PAD_KEY_ROW2__KEY_ROW2,
-       MX51_PAD_KEY_ROW3__KEY_ROW3,
-       MX51_PAD_KEY_COL0__KEY_COL0,
-       MX51_PAD_KEY_COL1__KEY_COL1,
-       MX51_PAD_KEY_COL2__KEY_COL2,
-       MX51_PAD_KEY_COL3__KEY_COL3,
-       MX51_PAD_KEY_COL4__KEY_COL4,
-       MX51_PAD_KEY_COL5__KEY_COL5,
-
-       /* eCSPI2 */
-       MX51_PAD_NANDF_RB2__ECSPI2_SCLK,
-       MX51_PAD_NANDF_RB3__ECSPI2_MISO,
-       MX51_PAD_NANDF_D15__ECSPI2_MOSI,
-       MX51_PAD_NANDF_D12__GPIO3_28,
-};
-
-/* Serial ports */
-static const struct imxuart_platform_data uart_pdata __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static int mx51_3ds_board_keymap[] = {
-       KEY(0, 0, KEY_1),
-       KEY(0, 1, KEY_2),
-       KEY(0, 2, KEY_3),
-       KEY(0, 3, KEY_F1),
-       KEY(0, 4, KEY_UP),
-       KEY(0, 5, KEY_F2),
-
-       KEY(1, 0, KEY_4),
-       KEY(1, 1, KEY_5),
-       KEY(1, 2, KEY_6),
-       KEY(1, 3, KEY_LEFT),
-       KEY(1, 4, KEY_SELECT),
-       KEY(1, 5, KEY_RIGHT),
-
-       KEY(2, 0, KEY_7),
-       KEY(2, 1, KEY_8),
-       KEY(2, 2, KEY_9),
-       KEY(2, 3, KEY_F3),
-       KEY(2, 4, KEY_DOWN),
-       KEY(2, 5, KEY_F4),
-
-       KEY(3, 0, KEY_0),
-       KEY(3, 1, KEY_OK),
-       KEY(3, 2, KEY_ESC),
-       KEY(3, 3, KEY_ENTER),
-       KEY(3, 4, KEY_MENU),
-       KEY(3, 5, KEY_BACK)
-};
-
-static const struct matrix_keymap_data mx51_3ds_map_data __initconst = {
-       .keymap         = mx51_3ds_board_keymap,
-       .keymap_size    = ARRAY_SIZE(mx51_3ds_board_keymap),
-};
-
-static int mx51_3ds_spi2_cs[] = {
-       MXC_SPI_CS(0),
-       MX51_3DS_ECSPI2_CS,
-};
-
-static const struct spi_imx_master mx51_3ds_ecspi2_pdata __initconst = {
-       .chipselect     = mx51_3ds_spi2_cs,
-       .num_chipselect = ARRAY_SIZE(mx51_3ds_spi2_cs),
-};
-
-static struct spi_board_info mx51_3ds_spi_nor_device[] = {
-       {
-        .modalias = "m25p80",
-        .max_speed_hz = 25000000,      /* max spi clock (SCK) speed in HZ */
-        .bus_num = 1,
-        .chip_select = 1,
-        .mode = SPI_MODE_0,
-        .platform_data = NULL,},
-};
-
-/*
- * Board specific initialization.
- */
-static void __init mx51_3ds_init(void)
-{
-       imx51_soc_init();
-
-       mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads,
-                                       ARRAY_SIZE(mx51_3ds_pads));
-
-       imx51_add_imx_uart(0, &uart_pdata);
-       imx51_add_imx_uart(1, &uart_pdata);
-       imx51_add_imx_uart(2, &uart_pdata);
-
-       imx51_add_ecspi(1, &mx51_3ds_ecspi2_pdata);
-       spi_register_board_info(mx51_3ds_spi_nor_device,
-                               ARRAY_SIZE(mx51_3ds_spi_nor_device));
-
-       if (mxc_expio_init(MX51_CS5_BASE_ADDR, IMX_GPIO_NR(1, 6)))
-               printk(KERN_WARNING "Init of the debugboard failed, all "
-                                   "devices on the board are unusable.\n");
-
-       imx51_add_sdhci_esdhc_imx(0, NULL);
-       imx51_add_imx_keypad(&mx51_3ds_map_data);
-       imx51_add_imx2_wdt(0);
-}
-
-static void __init mx51_3ds_timer_init(void)
-{
-       mx51_clocks_init(32768, 24000000, 22579200, 0);
-}
-
-MACHINE_START(MX51_3DS, "Freescale MX51 3-Stack Board")
-       /* Maintainer: Freescale Semiconductor, Inc. */
-       .atag_offset = 0x100,
-       .map_io = mx51_map_io,
-       .init_early = imx51_init_early,
-       .init_irq = mx51_init_irq,
-       .handle_irq = imx51_handle_irq,
-       .init_time      = mx51_3ds_timer_init,
-       .init_machine = mx51_3ds_init,
-       .init_late      = imx51_init_late,
-       .restart        = mxc_restart,
-MACHINE_END
index 79d71cf23a1da4a2375ec78d9bbe348274fd7abe..cf34994cfe28e978681d2f878dcde1d3a031b2e2 100644 (file)
 #include "hardware.h"
 #include "iomux-v3.h"
 
-/*
- * Define the MX50 memory map.
- */
-static struct map_desc mx50_io_desc[] __initdata = {
-       imx_map_entry(MX50, TZIC, MT_DEVICE),
-       imx_map_entry(MX50, SPBA0, MT_DEVICE),
-       imx_map_entry(MX50, AIPS1, MT_DEVICE),
-       imx_map_entry(MX50, AIPS2, MT_DEVICE),
-};
-
 /*
  * Define the MX51 memory map.
  */
@@ -59,11 +49,6 @@ static struct map_desc mx53_io_desc[] __initdata = {
  * system startup to create static physical to virtual memory mappings
  * for the IO modules.
  */
-void __init mx50_map_io(void)
-{
-       iotable_init(mx50_io_desc, ARRAY_SIZE(mx50_io_desc));
-}
-
 void __init mx51_map_io(void)
 {
        iotable_init(mx51_io_desc, ARRAY_SIZE(mx51_io_desc));
@@ -74,13 +59,6 @@ void __init mx53_map_io(void)
        iotable_init(mx53_io_desc, ARRAY_SIZE(mx53_io_desc));
 }
 
-void __init imx50_init_early(void)
-{
-       mxc_set_cpu_type(MXC_CPU_MX50);
-       mxc_iomux_v3_init(MX50_IO_ADDRESS(MX50_IOMUXC_BASE_ADDR));
-       mxc_arch_reset_init(MX50_IO_ADDRESS(MX50_WDOG_BASE_ADDR));
-}
-
 /*
  * The MIPI HSC unit has been removed from the i.MX51 Reference Manual by
  * the Freescale marketing division. However this did not remove the
@@ -115,11 +93,6 @@ void __init imx53_init_early(void)
        mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR));
 }
 
-void __init mx50_init_irq(void)
-{
-       tzic_init_irq(MX50_IO_ADDRESS(MX50_TZIC_BASE_ADDR));
-}
-
 void __init mx51_init_irq(void)
 {
        tzic_init_irq(MX51_IO_ADDRESS(MX51_TZIC_BASE_ADDR));
@@ -148,31 +121,10 @@ static struct sdma_platform_data imx51_sdma_pdata __initdata = {
        .script_addrs = &imx51_sdma_script,
 };
 
-static const struct resource imx50_audmux_res[] __initconst = {
-       DEFINE_RES_MEM(MX50_AUDMUX_BASE_ADDR, SZ_16K),
-};
-
 static const struct resource imx51_audmux_res[] __initconst = {
        DEFINE_RES_MEM(MX51_AUDMUX_BASE_ADDR, SZ_16K),
 };
 
-void __init imx50_soc_init(void)
-{
-       mxc_device_init();
-
-       /* i.mx50 has the i.mx35 type gpio */
-       mxc_register_gpio("imx35-gpio", 0, MX50_GPIO1_BASE_ADDR, SZ_16K, MX50_INT_GPIO1_LOW, MX50_INT_GPIO1_HIGH);
-       mxc_register_gpio("imx35-gpio", 1, MX50_GPIO2_BASE_ADDR, SZ_16K, MX50_INT_GPIO2_LOW, MX50_INT_GPIO2_HIGH);
-       mxc_register_gpio("imx35-gpio", 2, MX50_GPIO3_BASE_ADDR, SZ_16K, MX50_INT_GPIO3_LOW, MX50_INT_GPIO3_HIGH);
-       mxc_register_gpio("imx35-gpio", 3, MX50_GPIO4_BASE_ADDR, SZ_16K, MX50_INT_GPIO4_LOW, MX50_INT_GPIO4_HIGH);
-       mxc_register_gpio("imx35-gpio", 4, MX50_GPIO5_BASE_ADDR, SZ_16K, MX50_INT_GPIO5_LOW, MX50_INT_GPIO5_HIGH);
-       mxc_register_gpio("imx35-gpio", 5, MX50_GPIO6_BASE_ADDR, SZ_16K, MX50_INT_GPIO6_LOW, MX50_INT_GPIO6_HIGH);
-
-       /* i.mx50 has the i.mx31 type audmux */
-       platform_device_register_simple("imx31-audmux", 0, imx50_audmux_res,
-                                       ARRAY_SIZE(imx50_audmux_res));
-}
-
 void __init imx51_soc_init(void)
 {
        mxc_device_init();
diff --git a/arch/arm/mach-imx/mx50.h b/arch/arm/mach-imx/mx50.h
deleted file mode 100644 (file)
index 09ac19c..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-#ifndef __MACH_MX50_H__
-#define __MACH_MX50_H__
-
-/*
- * IROM
- */
-#define MX50_IROM_BASE_ADDR            0x0
-#define MX50_IROM_SIZE                 SZ_64K
-
-/* TZIC */
-#define MX50_TZIC_BASE_ADDR            0x0fffc000
-#define MX50_TZIC_SIZE                 SZ_16K
-
-/*
- * IRAM
- */
-#define MX50_IRAM_BASE_ADDR    0xf8000000      /* internal ram */
-#define MX50_IRAM_PARTITIONS   16
-#define MX50_IRAM_SIZE         (MX50_IRAM_PARTITIONS * SZ_8K)  /* 128KB */
-
-/*
- * Databahn
- */
-#define MX50_DATABAHN_BASE_ADDR                        0x14000000
-
-/*
- * Graphics Memory of GPU
- */
-#define MX50_GPU2D_BASE_ADDR           0x20000000
-
-#define MX50_DEBUG_BASE_ADDR           0x40000000
-#define MX50_DEBUG_SIZE                        SZ_1M
-#define MX50_ETB_BASE_ADDR             (MX50_DEBUG_BASE_ADDR + 0x00001000)
-#define MX50_ETM_BASE_ADDR             (MX50_DEBUG_BASE_ADDR + 0x00002000)
-#define MX50_TPIU_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x00003000)
-#define MX50_CTI0_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x00004000)
-#define MX50_CTI1_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x00005000)
-#define MX50_CTI2_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x00006000)
-#define MX50_CTI3_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x00007000)
-#define MX50_CORTEX_DBG_BASE_ADDR      (MX50_DEBUG_BASE_ADDR + 0x00008000)
-
-#define MX50_APBHDMA_BASE_ADDR         (MX50_DEBUG_BASE_ADDR + 0x01000000)
-#define MX50_OCOTP_CTRL_BASE_ADDR      (MX50_DEBUG_BASE_ADDR + 0x01002000)
-#define MX50_DIGCTL_BASE_ADDR          (MX50_DEBUG_BASE_ADDR + 0x01004000)
-#define MX50_GPMI_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x01006000)
-#define MX50_BCH_BASE_ADDR             (MX50_DEBUG_BASE_ADDR + 0x01008000)
-#define MX50_ELCDIF_BASE_ADDR          (MX50_DEBUG_BASE_ADDR + 0x0100a000)
-#define MX50_EPXP_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x0100c000)
-#define MX50_DCP_BASE_ADDR             (MX50_DEBUG_BASE_ADDR + 0x0100e000)
-#define MX50_EPDC_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x01010000)
-#define MX50_QOSC_BASE_ADDR            (MX50_DEBUG_BASE_ADDR + 0x01012000)
-#define MX50_PERFMON_BASE_ADDR         (MX50_DEBUG_BASE_ADDR + 0x01014000)
-#define MX50_SSP_BASE_ADDR             (MX50_DEBUG_BASE_ADDR + 0x01016000)
-#define MX50_ANATOP_BASE_ADDR          (MX50_DEBUG_BASE_ADDR + 0x01018000)
-#define MX50_NIC_BASE_ADDR             (MX50_DEBUG_BASE_ADDR + 0x08000000)
-
-/*
- * SPBA global module enabled #0
- */
-#define MX50_SPBA0_BASE_ADDR           0x50000000
-#define MX50_SPBA0_SIZE                        SZ_1M
-
-#define MX50_MMC_SDHC1_BASE_ADDR       (MX50_SPBA0_BASE_ADDR + 0x00004000)
-#define MX50_MMC_SDHC2_BASE_ADDR       (MX50_SPBA0_BASE_ADDR + 0x00008000)
-#define MX50_UART3_BASE_ADDR           (MX50_SPBA0_BASE_ADDR + 0x0000c000)
-#define MX50_CSPI1_BASE_ADDR           (MX50_SPBA0_BASE_ADDR + 0x00010000)
-#define MX50_SSI2_BASE_ADDR            (MX50_SPBA0_BASE_ADDR + 0x00014000)
-#define MX50_MMC_SDHC3_BASE_ADDR       (MX50_SPBA0_BASE_ADDR + 0x00020000)
-#define MX50_MMC_SDHC4_BASE_ADDR       (MX50_SPBA0_BASE_ADDR + 0x00024000)
-
-/*
- * AIPS 1
- */
-#define MX50_AIPS1_BASE_ADDR   0x53f00000
-#define MX50_AIPS1_SIZE                SZ_1M
-
-#define MX50_OTG_BASE_ADDR     (MX50_AIPS1_BASE_ADDR + 0x00080000)
-#define MX50_GPIO1_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x00084000)
-#define MX50_GPIO2_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x00088000)
-#define MX50_GPIO3_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x0008c000)
-#define MX50_GPIO4_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x00090000)
-#define MX50_KPP_BASE_ADDR     (MX50_AIPS1_BASE_ADDR + 0x00094000)
-#define MX50_WDOG_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x00098000)
-#define MX50_GPT1_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000a0000)
-#define MX50_SRTC_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000a4000)
-#define MX50_IOMUXC_BASE_ADDR  (MX50_AIPS1_BASE_ADDR + 0x000a8000)
-#define MX50_EPIT1_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x000ac000)
-#define MX50_PWM1_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000b4000)
-#define MX50_PWM2_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000b8000)
-#define MX50_UART1_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x000bc000)
-#define MX50_UART2_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x000c0000)
-#define MX50_SRC_BASE_ADDR     (MX50_AIPS1_BASE_ADDR + 0x000d0000)
-#define MX50_CCM_BASE_ADDR     (MX50_AIPS1_BASE_ADDR + 0x000d4000)
-#define MX50_GPC_BASE_ADDR     (MX50_AIPS1_BASE_ADDR + 0x000d8000)
-#define MX50_GPIO5_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x000dc000)
-#define MX50_GPIO6_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x000e0000)
-#define MX50_I2C3_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000ec000)
-#define MX50_UART4_BASE_ADDR   (MX50_AIPS1_BASE_ADDR + 0x000f0000)
-
-#define MX50_MSHC_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000f4000)
-#define MX50_RNGB_BASE_ADDR    (MX50_AIPS1_BASE_ADDR + 0x000f8000)
-
-/*
- * AIPS 2
- */
-#define MX50_AIPS2_BASE_ADDR   0x63f00000
-#define MX50_AIPS2_SIZE                SZ_1M
-
-#define MX50_PLL1_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x00080000)
-#define MX50_PLL2_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x00084000)
-#define MX50_PLL3_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x00088000)
-#define MX50_UART5_BASE_ADDR   (MX50_AIPS2_BASE_ADDR + 0x00090000)
-#define MX50_AHBMAX_BASE_ADDR  (MX50_AIPS2_BASE_ADDR + 0x00094000)
-#define MX50_ARM_BASE_ADDR     (MX50_AIPS2_BASE_ADDR + 0x000a0000)
-#define MX50_OWIRE_BASE_ADDR   (MX50_AIPS2_BASE_ADDR + 0x000a4000)
-#define MX50_CSPI2_BASE_ADDR   (MX50_AIPS2_BASE_ADDR + 0x000ac000)
-#define MX50_SDMA_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x000b0000)
-#define MX50_ROMCP_BASE_ADDR   (MX50_AIPS2_BASE_ADDR + 0x000b8000)
-#define MX50_CSPI3_BASE_ADDR   (MX50_AIPS2_BASE_ADDR + 0x000c0000)
-#define MX50_I2C2_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x000c4000)
-#define MX50_I2C1_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x000c8000)
-#define MX50_SSI1_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x000cc000)
-#define MX50_AUDMUX_BASE_ADDR  (MX50_AIPS2_BASE_ADDR + 0x000d0000)
-#define MX50_WEIM_BASE_ADDR    (MX50_AIPS2_BASE_ADDR + 0x000d8000)
-#define MX50_FEC_BASE_ADDR     (MX50_AIPS2_BASE_ADDR + 0x000ec000)
-
-/*
- * Memory regions and CS
- */
-#define MX50_CSD0_BASE_ADDR            0x70000000
-#define MX50_CSD1_BASE_ADDR            0xb0000000
-#define MX50_CS0_BASE_ADDR             0xf0000000
-
-#define MX50_IO_P2V(x)                 IMX_IO_P2V(x)
-#define MX50_IO_ADDRESS(x)             IOMEM(MX50_IO_P2V(x))
-
-/*
- * defines for SPBA modules
- */
-#define MX50_SPBA_SDHC1                0x04
-#define MX50_SPBA_SDHC2                0x08
-#define MX50_SPBA_UART3                0x0c
-#define MX50_SPBA_CSPI1                0x10
-#define MX50_SPBA_SSI2         0x14
-#define MX50_SPBA_SDHC3                0x20
-#define MX50_SPBA_SDHC4                0x24
-#define MX50_SPBA_SPDIF                0x28
-#define MX50_SPBA_ATA          0x30
-#define MX50_SPBA_SLIM         0x34
-#define MX50_SPBA_HSI2C                0x38
-#define MX50_SPBA_CTRL         0x3c
-
-/*
- * DMA request assignments
- */
-#define MX50_DMA_REQ_GPC               1
-#define MX50_DMA_REQ_ATA_UART4_RX      2
-#define MX50_DMA_REQ_ATA_UART4_TX      3
-#define MX50_DMA_REQ_CSPI1_RX          6
-#define MX50_DMA_REQ_CSPI1_TX          7
-#define MX50_DMA_REQ_CSPI2_RX          8
-#define MX50_DMA_REQ_CSPI2_TX          9
-#define MX50_DMA_REQ_I2C3_SDHC3                10
-#define MX50_DMA_REQ_SDHC4             11
-#define MX50_DMA_REQ_UART2_FIRI_RX     12
-#define MX50_DMA_REQ_UART2_FIRI_TX     13
-#define MX50_DMA_REQ_EXT0              14
-#define MX50_DMA_REQ_EXT1              15
-#define MX50_DMA_REQ_UART5_RX          16
-#define MX50_DMA_REQ_UART5_TX          17
-#define MX50_DMA_REQ_UART1_RX          18
-#define MX50_DMA_REQ_UART1_TX          19
-#define MX50_DMA_REQ_I2C1_SDHC1                20
-#define MX50_DMA_REQ_I2C2_SDHC2                21
-#define MX50_DMA_REQ_SSI2_RX2          22
-#define MX50_DMA_REQ_SSI2_TX2          23
-#define MX50_DMA_REQ_SSI2_RX1          24
-#define MX50_DMA_REQ_SSI2_TX1          25
-#define MX50_DMA_REQ_SSI1_RX2          26
-#define MX50_DMA_REQ_SSI1_TX2          27
-#define MX50_DMA_REQ_SSI1_RX1          28
-#define MX50_DMA_REQ_SSI1_TX1          29
-#define MX50_DMA_REQ_CSPI_RX           38
-#define MX50_DMA_REQ_CSPI_TX           39
-#define MX50_DMA_REQ_UART3_RX          42
-#define MX50_DMA_REQ_UART3_TX          43
-
-/*
- * Interrupt numbers
- */
-#include <asm/irq.h>
-#define MX50_INT_MMC_SDHC1     (NR_IRQS_LEGACY + 1)
-#define MX50_INT_MMC_SDHC2     (NR_IRQS_LEGACY + 2)
-#define MX50_INT_MMC_SDHC3     (NR_IRQS_LEGACY + 3)
-#define MX50_INT_MMC_SDHC4     (NR_IRQS_LEGACY + 4)
-#define MX50_INT_DAP           (NR_IRQS_LEGACY + 5)
-#define MX50_INT_SDMA          (NR_IRQS_LEGACY + 6)
-#define MX50_INT_IOMUX         (NR_IRQS_LEGACY + 7)
-#define MX50_INT_UART4         (NR_IRQS_LEGACY + 13)
-#define MX50_INT_USB_H1                (NR_IRQS_LEGACY + 14)
-#define MX50_INT_USB_OTG       (NR_IRQS_LEGACY + 18)
-#define MX50_INT_DATABAHN      (NR_IRQS_LEGACY + 19)
-#define MX50_INT_ELCDIF                (NR_IRQS_LEGACY + 20)
-#define MX50_INT_EPXP          (NR_IRQS_LEGACY + 21)
-#define MX50_INT_SRTC_NTZ      (NR_IRQS_LEGACY + 24)
-#define MX50_INT_SRTC_TZ       (NR_IRQS_LEGACY + 25)
-#define MX50_INT_EPDC          (NR_IRQS_LEGACY + 27)
-#define MX50_INT_NIC           (NR_IRQS_LEGACY + 28)
-#define MX50_INT_SSI1          (NR_IRQS_LEGACY + 29)
-#define MX50_INT_SSI2          (NR_IRQS_LEGACY + 30)
-#define MX50_INT_UART1         (NR_IRQS_LEGACY + 31)
-#define MX50_INT_UART2         (NR_IRQS_LEGACY + 32)
-#define MX50_INT_UART3         (NR_IRQS_LEGACY + 33)
-#define MX50_INT_RESV34                (NR_IRQS_LEGACY + 34)
-#define MX50_INT_RESV35                (NR_IRQS_LEGACY + 35)
-#define MX50_INT_CSPI1         (NR_IRQS_LEGACY + 36)
-#define MX50_INT_CSPI2         (NR_IRQS_LEGACY + 37)
-#define MX50_INT_CSPI          (NR_IRQS_LEGACY + 38)
-#define MX50_INT_GPT           (NR_IRQS_LEGACY + 39)
-#define MX50_INT_EPIT1         (NR_IRQS_LEGACY + 40)
-#define MX50_INT_GPIO1_INT7    (NR_IRQS_LEGACY + 42)
-#define MX50_INT_GPIO1_INT6    (NR_IRQS_LEGACY + 43)
-#define MX50_INT_GPIO1_INT5    (NR_IRQS_LEGACY + 44)
-#define MX50_INT_GPIO1_INT4    (NR_IRQS_LEGACY + 45)
-#define MX50_INT_GPIO1_INT3    (NR_IRQS_LEGACY + 46)
-#define MX50_INT_GPIO1_INT2    (NR_IRQS_LEGACY + 47)
-#define MX50_INT_GPIO1_INT1    (NR_IRQS_LEGACY + 48)
-#define MX50_INT_GPIO1_INT0    (NR_IRQS_LEGACY + 49)
-#define MX50_INT_GPIO1_LOW     (NR_IRQS_LEGACY + 50)
-#define MX50_INT_GPIO1_HIGH    (NR_IRQS_LEGACY + 51)
-#define MX50_INT_GPIO2_LOW     (NR_IRQS_LEGACY + 52)
-#define MX50_INT_GPIO2_HIGH    (NR_IRQS_LEGACY + 53)
-#define MX50_INT_GPIO3_LOW     (NR_IRQS_LEGACY + 54)
-#define MX50_INT_GPIO3_HIGH    (NR_IRQS_LEGACY + 55)
-#define MX50_INT_GPIO4_LOW     (NR_IRQS_LEGACY + 56)
-#define MX50_INT_GPIO4_HIGH    (NR_IRQS_LEGACY + 57)
-#define MX50_INT_WDOG1         (NR_IRQS_LEGACY + 58)
-#define MX50_INT_KPP           (NR_IRQS_LEGACY + 60)
-#define MX50_INT_PWM1          (NR_IRQS_LEGACY + 61)
-#define MX50_INT_I2C1          (NR_IRQS_LEGACY + 62)
-#define MX50_INT_I2C2          (NR_IRQS_LEGACY + 63)
-#define MX50_INT_I2C3          (NR_IRQS_LEGACY + 64)
-#define MX50_INT_RESV65                (NR_IRQS_LEGACY + 65)
-#define MX50_INT_DCDC          (NR_IRQS_LEGACY + 66)
-#define MX50_INT_THERMAL_ALARM (NR_IRQS_LEGACY + 67)
-#define MX50_INT_ANA3          (NR_IRQS_LEGACY + 68)
-#define MX50_INT_ANA4          (NR_IRQS_LEGACY + 69)
-#define MX50_INT_CCM1          (NR_IRQS_LEGACY + 71)
-#define MX50_INT_CCM2          (NR_IRQS_LEGACY + 72)
-#define MX50_INT_GPC1          (NR_IRQS_LEGACY + 73)
-#define MX50_INT_GPC2          (NR_IRQS_LEGACY + 74)
-#define MX50_INT_SRC           (NR_IRQS_LEGACY + 75)
-#define MX50_INT_NM            (NR_IRQS_LEGACY + 76)
-#define MX50_INT_PMU           (NR_IRQS_LEGACY + 77)
-#define MX50_INT_CTI_IRQ       (NR_IRQS_LEGACY + 78)
-#define MX50_INT_CTI1_TG0      (NR_IRQS_LEGACY + 79)
-#define MX50_INT_CTI1_TG1      (NR_IRQS_LEGACY + 80)
-#define MX50_INT_GPU2_IRQ      (NR_IRQS_LEGACY + 84)
-#define MX50_INT_GPU2_BUSY     (NR_IRQS_LEGACY + 85)
-#define MX50_INT_UART5         (NR_IRQS_LEGACY + 86)
-#define MX50_INT_FEC           (NR_IRQS_LEGACY + 87)
-#define MX50_INT_OWIRE         (NR_IRQS_LEGACY + 88)
-#define MX50_INT_CTI1_TG2      (NR_IRQS_LEGACY + 89)
-#define MX50_INT_SJC           (NR_IRQS_LEGACY + 90)
-#define MX50_INT_DCP_CHAN1_3   (NR_IRQS_LEGACY + 91)
-#define MX50_INT_DCP_CHAN0     (NR_IRQS_LEGACY + 92)
-#define MX50_INT_PWM2          (NR_IRQS_LEGACY + 94)
-#define MX50_INT_RNGB          (NR_IRQS_LEGACY + 97)
-#define MX50_INT_CTI1_TG3      (NR_IRQS_LEGACY + 98)
-#define MX50_INT_RAWNAND_BCH   (NR_IRQS_LEGACY + 100)
-#define MX50_INT_RAWNAND_GPMI  (NR_IRQS_LEGACY + 102)
-#define MX50_INT_GPIO5_LOW     (NR_IRQS_LEGACY + 103)
-#define MX50_INT_GPIO5_HIGH    (NR_IRQS_LEGACY + 104)
-#define MX50_INT_GPIO6_LOW     (NR_IRQS_LEGACY + 105)
-#define MX50_INT_GPIO6_HIGH    (NR_IRQS_LEGACY + 106)
-#define MX50_INT_MSHC          (NR_IRQS_LEGACY + 109)
-#define MX50_INT_APBHDMA_CHAN0 (NR_IRQS_LEGACY + 110)
-#define MX50_INT_APBHDMA_CHAN1 (NR_IRQS_LEGACY + 111)
-#define MX50_INT_APBHDMA_CHAN2 (NR_IRQS_LEGACY + 112)
-#define MX50_INT_APBHDMA_CHAN3 (NR_IRQS_LEGACY + 113)
-#define MX50_INT_APBHDMA_CHAN4 (NR_IRQS_LEGACY + 114)
-#define MX50_INT_APBHDMA_CHAN5 (NR_IRQS_LEGACY + 115)
-#define MX50_INT_APBHDMA_CHAN6 (NR_IRQS_LEGACY + 116)
-#define MX50_INT_APBHDMA_CHAN7 (NR_IRQS_LEGACY + 117)
-
-#if !defined(__ASSEMBLY__) && !defined(__MXC_BOOT_UNCOMPRESS)
-extern int mx50_revision(void);
-#endif
-
-#endif /* ifndef __MACH_MX50_H__ */
index d78298366a91ac6448f9c5ace816083d025a9631..7dce17a9fe6c154e58fd6e119694523b116df6f6 100644 (file)
@@ -32,7 +32,6 @@
 #define MXC_CPU_MX27           27
 #define MXC_CPU_MX31           31
 #define MXC_CPU_MX35           35
-#define MXC_CPU_MX50           50
 #define MXC_CPU_MX51           51
 #define MXC_CPU_MX53           53
 
@@ -126,18 +125,6 @@ extern unsigned int __mxc_cpu_type;
 # define cpu_is_mx35()         (0)
 #endif
 
-#ifdef CONFIG_SOC_IMX50
-# ifdef mxc_cpu_type
-#  undef mxc_cpu_type
-#  define mxc_cpu_type __mxc_cpu_type
-# else
-#  define mxc_cpu_type MXC_CPU_MX50
-# endif
-# define cpu_is_mx50()         (mxc_cpu_type == MXC_CPU_MX50)
-#else
-# define cpu_is_mx50()         (0)
-#endif
-
 #ifdef CONFIG_SOC_IMX51
 # ifdef mxc_cpu_type
 #  undef mxc_cpu_type
index b2872ec614a4c8f66af1b67bff9fa3737ba65fad..7c0b03f67b056d32ecd73d774f71d158638b5e9a 100644 (file)
@@ -20,6 +20,8 @@
 #include "common.h"
 #include "hardware.h"
 
+#define SCU_STANDBY_ENABLE     (1 << 5)
+
 static void __iomem *scu_base;
 
 static struct map_desc scu_io_desc __initdata = {
@@ -42,6 +44,14 @@ void __init imx_scu_map_io(void)
        scu_base = IMX_IO_ADDRESS(base);
 }
 
+void imx_scu_standby_enable(void)
+{
+       u32 val = readl_relaxed(scu_base);
+
+       val |= SCU_STANDBY_ENABLE;
+       writel_relaxed(val, scu_base);
+}
+
 static void __cpuinit imx_secondary_init(unsigned int cpu)
 {
        /*
index 2e063c2deb9e2078edbccdfb0a52fd8dca9c7284..f67fd7ee812773f8e49aecfd2d24f725bf806de3 100644 (file)
@@ -34,7 +34,7 @@
 
 /*
  * set cpu low power mode before WFI instruction. This function is called
- * mx5 because it can be used for mx50, mx51, and mx53.
+ * mx5 because it can be used for mx51, and mx53.
  */
 static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
 {
@@ -85,10 +85,7 @@ static void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
        __raw_writel(plat_lpc, MXC_CORTEXA8_PLAT_LPC);
        __raw_writel(ccm_clpcr, MXC_CCM_CLPCR);
        __raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR);
-
-       /* Enable NEON SRPG for all but MX50TO1.0. */
-       if (mx50_revision() != IMX_CHIP_REVISION_1_0)
-               __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);
+       __raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);
 
        if (stop_mode) {
                empgc0 |= MXC_SRPGCR_PCR;
index 62769df36db129d7f27508fa6c3d0d10800c42cf..fea91313678b25efb17e7342afb45013c2fa156f 100644 (file)
@@ -152,7 +152,8 @@ static int v2_set_next_event(unsigned long evt,
 
        __raw_writel(tcmp, timer_base + V2_TCMP);
 
-       return (int)(tcmp - __raw_readl(timer_base + V2_TCN)) < 0 ?
+       return evt < 0x7fffffff &&
+               (int)(tcmp - __raw_readl(timer_base + V2_TCN)) < 0 ?
                                -ETIME : 0;
 }
 
index 8d2e5a96247cb05305394d2ae94c01369f84a832..d6653095a1eb5f2c3acb6d40d93242b63e27ac39 100644 (file)
@@ -19,7 +19,6 @@ obj-$(CONFIG_MACH_NET2BIG_V2)         += netxbig_v2-setup.o lacie_v2-common.o
 obj-$(CONFIG_MACH_NET5BIG_V2)          += netxbig_v2-setup.o lacie_v2-common.o
 obj-$(CONFIG_MACH_T5325)               += t5325-setup.o
 
-obj-$(CONFIG_CPU_IDLE)                 += cpuidle.o
 obj-$(CONFIG_ARCH_KIRKWOOD_DT)         += board-dt.o
 obj-$(CONFIG_MACH_DREAMPLUG_DT)                += board-dreamplug.o
 obj-$(CONFIG_MACH_ICONNECT_DT)         += board-iconnect.o
index d4af5c191c24e49fd5f4d8bf092dc61230a898ae..95cc04d14b659ac6836e0279058a28ef14a3f33d 100644 (file)
@@ -98,6 +98,8 @@ static void __init kirkwood_dt_init(void)
        /* Setup root of clk tree */
        kirkwood_of_clk_init();
 
+       kirkwood_cpuidle_init();
+
 #ifdef CONFIG_KEXEC
        kexec_reinit = kirkwood_enable_pcie;
 #endif
index b5ad4dff6b12d1f95094591fe4202430d9f35edb..49792a0cd2d3d17f399ea96ee8f5369f49c3bb99 100644 (file)
@@ -499,6 +499,28 @@ void __init kirkwood_wdt_init(void)
        orion_wdt_init();
 }
 
+/*****************************************************************************
+ * CPU idle
+ ****************************************************************************/
+static struct resource kirkwood_cpuidle_resource[] = {
+       {
+               .flags  = IORESOURCE_MEM,
+               .start  = DDR_OPERATION_BASE,
+               .end    = DDR_OPERATION_BASE + 3,
+       },
+};
+
+static struct platform_device kirkwood_cpuidle = {
+       .name           = "kirkwood_cpuidle",
+       .id             = -1,
+       .resource       = kirkwood_cpuidle_resource,
+       .num_resources  = 1,
+};
+
+void __init kirkwood_cpuidle_init(void)
+{
+       platform_device_register(&kirkwood_cpuidle);
+}
 
 /*****************************************************************************
  * Time handling
@@ -667,6 +689,7 @@ void __init kirkwood_init(void)
        kirkwood_xor1_init();
        kirkwood_crypto_init();
 
+       kirkwood_cpuidle_init();
 #ifdef CONFIG_KEXEC
        kexec_reinit = kirkwood_enable_pcie;
 #endif
index 283ab611e8da1344d1372180e7ed8b2a1e8dc014..e956d0277dd186a7145e6c8badc108ba1f504f44 100644 (file)
@@ -50,6 +50,7 @@ void kirkwood_nand_init(struct mtd_partition *parts, int nr_parts, int delay);
 void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,
                            int (*dev_ready)(struct mtd_info *));
 void kirkwood_audio_init(void);
+void kirkwood_cpuidle_init(void);
 void kirkwood_restart(char, const char *);
 void kirkwood_clk_init(void);
 
diff --git a/arch/arm/mach-kirkwood/cpuidle.c b/arch/arm/mach-kirkwood/cpuidle.c
deleted file mode 100644 (file)
index f730467..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/cpuidle.c
- *
- * CPU idle Marvell Kirkwood SoCs
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- *
- * The cpu idle uses wait-for-interrupt and DDR self refresh in order
- * to implement two idle states -
- * #1 wait-for-interrupt
- * #2 wait-for-interrupt and DDR self refresh
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/cpuidle.h>
-#include <linux/io.h>
-#include <linux/export.h>
-#include <asm/proc-fns.h>
-#include <asm/cpuidle.h>
-#include <mach/kirkwood.h>
-
-#define KIRKWOOD_MAX_STATES    2
-
-/* Actual code that puts the SoC in different idle states */
-static int kirkwood_enter_idle(struct cpuidle_device *dev,
-                               struct cpuidle_driver *drv,
-                              int index)
-{
-       writel(0x7, DDR_OPERATION_BASE);
-       cpu_do_idle();
-
-       return index;
-}
-
-static struct cpuidle_driver kirkwood_idle_driver = {
-       .name                   = "kirkwood_idle",
-       .owner                  = THIS_MODULE,
-       .en_core_tk_irqen       = 1,
-       .states[0]              = ARM_CPUIDLE_WFI_STATE,
-       .states[1]              = {
-               .enter                  = kirkwood_enter_idle,
-               .exit_latency           = 10,
-               .target_residency       = 100000,
-               .flags                  = CPUIDLE_FLAG_TIME_VALID,
-               .name                   = "DDR SR",
-               .desc                   = "WFI and DDR Self Refresh",
-       },
-       .state_count = KIRKWOOD_MAX_STATES,
-};
-
-static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device);
-
-/* Initialize CPU idle by registering the idle states */
-static int kirkwood_init_cpuidle(void)
-{
-       struct cpuidle_device *device;
-
-       device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id());
-       device->state_count = KIRKWOOD_MAX_STATES;
-
-       cpuidle_register_driver(&kirkwood_idle_driver);
-       if (cpuidle_register_device(device)) {
-               pr_err("kirkwood_init_cpuidle: Failed registering\n");
-               return -EIO;
-       }
-       return 0;
-}
-
-device_initcall(kirkwood_init_cpuidle);
index 041653a04a9ccd0db3e8b99cbff4da6ea135f96b..a05563a31c95c41d8690243ab0bb34e302da793e 100644 (file)
@@ -60,8 +60,9 @@
  * Register Map
  */
 #define DDR_VIRT_BASE          (KIRKWOOD_REGS_VIRT_BASE + 0x00000)
+#define DDR_PHYS_BASE          (KIRKWOOD_REGS_PHYS_BASE + 0x00000)
 #define  DDR_WINDOW_CPU_BASE   (DDR_VIRT_BASE + 0x1500)
-#define DDR_OPERATION_BASE     (DDR_VIRT_BASE + 0x1418)
+#define DDR_OPERATION_BASE     (DDR_PHYS_BASE + 0x1418)
 
 #define DEV_BUS_PHYS_BASE      (KIRKWOOD_REGS_PHYS_BASE + 0x10000)
 #define DEV_BUS_VIRT_BASE      (KIRKWOOD_REGS_VIRT_BASE + 0x10000)
index a1c3ab6fc809da0061f01f15746d225a25b5645f..d96ad4c099726f8dc4706031d0da4f79556aaf44 100644 (file)
@@ -247,13 +247,9 @@ static struct hw_pci kirkwood_pci __initdata = {
 
 static void __init add_pcie_port(int index, void __iomem *base)
 {
-       pr_info("Kirkwood PCIe port %d: ", index);
-
-       if (orion_pcie_link_up(base)) {
-               pr_info("link up\n");
-               pcie_port_map[num_pcie_ports++] = index;
-       } else
-               pr_info("link down, ignoring\n");
+       pcie_port_map[num_pcie_ports++] = index;
+       pr_info("Kirkwood PCIe port %d: link %s\n", index,
+               orion_pcie_link_up(base) ? "up" : "down");
 }
 
 void __init kirkwood_pcie_init(unsigned int portmask)
index 361677983af0ea07d84667cd36da407317d684b8..d9727218dd0a3089792a1ef25737987ce9034f5b 100644 (file)
@@ -215,7 +215,7 @@ static void __init omap4_smp_init_cpus(void)
                 * Currently we can't call ioremap here because
                 * SoC detection won't work until after init_early.
                 */
-               scu_base =  OMAP2_L4_IO_ADDRESS(OMAP44XX_SCU_BASE);
+               scu_base =  OMAP2_L4_IO_ADDRESS(scu_a9_get_base());
                BUG_ON(!scu_base);
                ncores = scu_get_core_count(scu_base);
        } else if (cpu_id == CPU_CORTEX_A15) {
index 43b927b2e2e88df3afb5c50b45ff4723d605afa2..8a515bb746394b9a5ce6549b6aebd1e24fdf1cea 100644 (file)
@@ -40,7 +40,6 @@
 #define OMAP44XX_GIC_DIST_BASE         0x48241000
 #define OMAP44XX_GIC_CPU_BASE          0x48240100
 #define OMAP44XX_IRQ_GIC_START         32
-#define OMAP44XX_SCU_BASE              0x48240000
 #define OMAP44XX_LOCAL_TWD_BASE                0x48240600
 #define OMAP44XX_L2CACHE_BASE          0x48242000
 #define OMAP44XX_WKUPGEN_BASE          0x48281000
index 558ccfb8d45803b3c3f68cadea2cfdc7e5e69440..4f7379fe01e24c5f00c06e2ed92002db531250f4 100644 (file)
@@ -11,6 +11,16 @@ config ARCH_PRIMA2
        help
           Support for CSR SiRFSoC ARM Cortex A9 Platform
 
+config ARCH_MARCO
+       bool "CSR SiRFSoC MARCO ARM Cortex A9 Platform"
+       default y
+       select ARM_GIC
+       select CPU_V7
+       select HAVE_SMP
+       select SMP_ON_UP
+       help
+          Support for CSR SiRFSoC ARM Cortex A9 Platform
+
 endmenu
 
 config SIRF_IRQ
index fc9ce22e2b5a58f44c6de493f123f01f3808867a..bfe360cbd1774e27ba80d849273cf5be571f9248 100644 (file)
@@ -1,4 +1,3 @@
-obj-y := timer.o
 obj-y += rstc.o
 obj-y += common.o
 obj-y += rtciobrg.o
@@ -6,3 +5,7 @@ obj-$(CONFIG_DEBUG_LL) += lluart.o
 obj-$(CONFIG_CACHE_L2X0) += l2x0.o
 obj-$(CONFIG_SUSPEND) += pm.o sleep.o
 obj-$(CONFIG_SIRF_IRQ) += irq.o
+obj-$(CONFIG_SMP) += platsmp.o headsmp.o
+obj-$(CONFIG_HOTPLUG_CPU)  += hotplug.o
+obj-$(CONFIG_ARCH_PRIMA2) += timer-prima2.o
+obj-$(CONFIG_ARCH_MARCO) += timer-marco.o
index ed3570e5eb8fd34e08f1daf7c17a1d772eb80a0f..2d57aa479a7bea697176537028f9fbb7f10101f7 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/irqchip.h>
 #include <asm/sizes.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -30,6 +31,12 @@ void __init sirfsoc_init_late(void)
        sirfsoc_pm_init();
 }
 
+static __init void sirfsoc_map_io(void)
+{
+       sirfsoc_map_lluart();
+       sirfsoc_map_scu();
+}
+
 #ifdef CONFIG_ARCH_PRIMA2
 static const char *prima2_dt_match[] __initdata = {
        "sirf,prima2",
@@ -38,9 +45,12 @@ static const char *prima2_dt_match[] __initdata = {
 
 DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")
        /* Maintainer: Barry Song <baohua.song@csr.com> */
-       .map_io         = sirfsoc_map_lluart,
+       .map_io         = sirfsoc_map_io,
        .init_irq       = sirfsoc_of_irq_init,
-       .init_time      = sirfsoc_timer_init,
+       .init_time      = sirfsoc_prima2_timer_init,
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+       .handle_irq     = sirfsoc_handle_irq,
+#endif
        .dma_zone_size  = SZ_256M,
        .init_machine   = sirfsoc_mach_init,
        .init_late      = sirfsoc_init_late,
@@ -48,3 +58,22 @@ DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")
        .restart        = sirfsoc_restart,
 MACHINE_END
 #endif
+
+#ifdef CONFIG_ARCH_MARCO
+static const char *marco_dt_match[] __initdata = {
+       "sirf,marco",
+       NULL
+};
+
+DT_MACHINE_START(MARCO_DT, "Generic MARCO (Flattened Device Tree)")
+       /* Maintainer: Barry Song <baohua.song@csr.com> */
+       .smp            = smp_ops(sirfsoc_smp_ops),
+       .map_io         = sirfsoc_map_io,
+       .init_irq       = irqchip_init,
+       .init_time      = sirfsoc_marco_timer_init,
+       .init_machine   = sirfsoc_mach_init,
+       .init_late      = sirfsoc_init_late,
+       .dt_compat      = marco_dt_match,
+       .restart        = sirfsoc_restart,
+MACHINE_END
+#endif
index 9c75f124e3cf466942d45da141f3bbe1cc83baa8..b7c26b62e4a760c309904960ab24619d2f271acc 100644 (file)
 
 #include <linux/init.h>
 #include <asm/mach/time.h>
+#include <asm/exception.h>
 
-extern void sirfsoc_timer_init(void);
+extern void sirfsoc_prima2_timer_init(void);
+extern void sirfsoc_marco_timer_init(void);
+
+extern struct smp_operations   sirfsoc_smp_ops;
+extern void sirfsoc_secondary_startup(void);
+extern void sirfsoc_cpu_die(unsigned int cpu);
 
 extern void __init sirfsoc_of_irq_init(void);
 extern void __init sirfsoc_of_clk_init(void);
 extern void sirfsoc_restart(char, const char *);
+extern asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs);
 
 #ifndef CONFIG_DEBUG_LL
 static inline void sirfsoc_map_lluart(void)  {}
@@ -24,6 +31,12 @@ static inline void sirfsoc_map_lluart(void)  {}
 extern void __init sirfsoc_map_lluart(void);
 #endif
 
+#ifndef CONFIG_SMP
+static inline void sirfsoc_map_scu(void) {}
+#else
+extern void sirfsoc_map_scu(void);
+#endif
+
 #ifdef CONFIG_SUSPEND
 extern int sirfsoc_pm_init(void);
 #else
diff --git a/arch/arm/mach-prima2/headsmp.S b/arch/arm/mach-prima2/headsmp.S
new file mode 100644 (file)
index 0000000..6ec19d5
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Entry of the second core for CSR Marco dual-core SMP SoCs
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/linkage.h>
+#include <linux/init.h>
+
+       __INIT
+/*
+ * Cold boot and hardware reset show different behaviour,
+ * system will be always panic if we warm-reset the board
+ * Here we invalidate L1 of CPU1 to make sure there isn't
+ * uninitialized data written into memory later
+ */
+ENTRY(v7_invalidate_l1)
+       mov     r0, #0
+       mcr     p15, 0, r0, c7, c5, 0   @ invalidate I cache
+       mcr     p15, 2, r0, c0, c0, 0
+       mrc     p15, 1, r0, c0, c0, 0
+
+       ldr     r1, =0x7fff
+       and     r2, r1, r0, lsr #13
+
+       ldr     r1, =0x3ff
+
+       and     r3, r1, r0, lsr #3      @ NumWays - 1
+       add     r2, r2, #1              @ NumSets
+
+       and     r0, r0, #0x7
+       add     r0, r0, #4      @ SetShift
+
+       clz     r1, r3          @ WayShift
+       add     r4, r3, #1      @ NumWays
+1:     sub     r2, r2, #1      @ NumSets--
+       mov     r3, r4          @ Temp = NumWays
+2:     subs    r3, r3, #1      @ Temp--
+       mov     r5, r3, lsl r1
+       mov     r6, r2, lsl r0
+       orr     r5, r5, r6      @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
+       mcr     p15, 0, r5, c7, c6, 2
+       bgt     2b
+       cmp     r2, #0
+       bgt     1b
+       dsb
+       isb
+       mov     pc, lr
+ENDPROC(v7_invalidate_l1)
+
+/*
+ * SIRFSOC specific entry point for secondary CPUs.  This provides
+ * a "holding pen" into which all secondary cores are held until we're
+ * ready for them to initialise.
+ */
+ENTRY(sirfsoc_secondary_startup)
+       bl v7_invalidate_l1
+        mrc     p15, 0, r0, c0, c0, 5
+        and     r0, r0, #15
+        adr     r4, 1f
+        ldmia   r4, {r5, r6}
+        sub     r4, r4, r5
+        add     r6, r6, r4
+pen:    ldr     r7, [r6]
+        cmp     r7, r0
+        bne     pen
+
+        /*
+         * we've been released from the holding pen: secondary_stack
+         * should now contain the SVC stack for this core
+         */
+        b       secondary_startup
+ENDPROC(sirfsoc_secondary_startup)
+
+        .align
+1:      .long   .
+        .long   pen_release
diff --git a/arch/arm/mach-prima2/hotplug.c b/arch/arm/mach-prima2/hotplug.c
new file mode 100644 (file)
index 0000000..97c1ee5
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * CPU hotplug support for CSR Marco dual-core SMP SoCs
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/smp.h>
+
+#include <asm/cacheflush.h>
+#include <asm/smp_plat.h>
+
+static inline void platform_do_lowpower(unsigned int cpu)
+{
+       flush_cache_all();
+
+       /* we put the platform to just WFI */
+       for (;;) {
+               __asm__ __volatile__("dsb\n\t" "wfi\n\t"
+                       : : : "memory");
+               if (pen_release == cpu_logical_map(cpu)) {
+                       /*
+                        * OK, proper wakeup, we're done
+                        */
+                       break;
+               }
+       }
+}
+
+/*
+ * platform-specific code to shutdown a CPU
+ *
+ * Called with IRQs disabled
+ */
+void sirfsoc_cpu_die(unsigned int cpu)
+{
+       platform_do_lowpower(cpu);
+}
index f6014a07541f92d3a7a2d89d7d76a99847c9b7f6..b778a0f248ed1f0b39dd1ef272bbf28532ba54f8 100644 (file)
@@ -10,8 +10,8 @@
 #define __ASM_ARCH_IRQS_H
 
 #define SIRFSOC_INTENAL_IRQ_START  0
-#define SIRFSOC_INTENAL_IRQ_END    59
+#define SIRFSOC_INTENAL_IRQ_END    127
 #define SIRFSOC_GPIO_IRQ_START     (SIRFSOC_INTENAL_IRQ_END + 1)
-#define NR_IRQS        220
+#define NR_IRQS        288
 
 #endif
index c98b4d5ac24a4d566a3dfb54ab79f83cef9d56cb..c10510d01a440775844fe707fb98e15378d21cce 100644 (file)
 #define __MACH_PRIMA2_SIRFSOC_UART_H
 
 /* UART-1: used as serial debug port */
+#if defined(CONFIG_DEBUG_SIRFPRIMA2_UART1)
 #define SIRFSOC_UART1_PA_BASE          0xb0060000
+#elif defined(CONFIG_DEBUG_SIRFMARCO_UART1)
+#define SIRFSOC_UART1_PA_BASE          0xcc060000
+#else
+#define SIRFSOC_UART1_PA_BASE          0
+#endif
 #define SIRFSOC_UART1_VA_BASE          SIRFSOC_VA(0x060000)
 #define SIRFSOC_UART1_SIZE             SZ_4K
 
index 0c898fcf909c90b1b6ef4b124ced34e076f6fe7d..15f3edcfbb47a66d325a72a68d5bb655ecfed4c4 100644 (file)
@@ -25,6 +25,9 @@ static __inline__ void putc(char c)
         * during kernel decompression, all mappings are flat:
         *  virt_addr == phys_addr
         */
+       if (!SIRFSOC_UART1_PA_BASE)
+               return;
+
        while (__raw_readl((void __iomem *)SIRFSOC_UART1_PA_BASE + SIRFSOC_UART_TXFIFO_STATUS)
                & SIRFSOC_UART1_TXFIFO_FULL)
                barrier();
index 7dee9176e77a57ee6bac685cc06a274cca4e6f4f..6c0f3e9c43fbc949c94b0bbd533a18e9276dfd84 100644 (file)
@@ -9,17 +9,19 @@
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/irq.h>
-#include <mach/hardware.h>
-#include <asm/mach/irq.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/irqdomain.h>
 #include <linux/syscore_ops.h>
+#include <asm/mach/irq.h>
+#include <asm/exception.h>
+#include <mach/hardware.h>
 
 #define SIRFSOC_INT_RISC_MASK0          0x0018
 #define SIRFSOC_INT_RISC_MASK1          0x001C
 #define SIRFSOC_INT_RISC_LEVEL0         0x0020
 #define SIRFSOC_INT_RISC_LEVEL1         0x0024
+#define SIRFSOC_INIT_IRQ_ID            0x0038
 
 void __iomem *sirfsoc_intc_base;
 
@@ -52,6 +54,16 @@ static __init void sirfsoc_irq_init(void)
        writel_relaxed(0, sirfsoc_intc_base + SIRFSOC_INT_RISC_MASK1);
 }
 
+asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs)
+{
+       u32 irqstat, irqnr;
+
+       irqstat = readl_relaxed(sirfsoc_intc_base + SIRFSOC_INIT_IRQ_ID);
+       irqnr = irqstat & 0xff;
+
+       handle_IRQ(irqnr, regs);
+}
+
 static struct of_device_id intc_ids[]  = {
        { .compatible = "sirf,prima2-intc" },
        {},
index c99837797d76b6fb3d254c8aaa97cd860cd77e4e..cbcbe9cb094c480a928d22ad23642eec3ecc0178 100644 (file)
 #include <linux/of.h>
 #include <asm/hardware/cache-l2x0.h>
 
-static struct of_device_id prima2_l2x0_ids[]  = {
-       { .compatible = "sirf,prima2-pl310-cache" },
+struct l2x0_aux
+{
+       u32 val;
+       u32 mask;
+};
+
+static struct l2x0_aux prima2_l2x0_aux __initconst = {
+       .val = 2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT,
+       .mask = 0,
+};
+
+static struct l2x0_aux marco_l2x0_aux __initconst = {
+       .val = (2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) |
+               (1 << L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT),
+       .mask = L2X0_AUX_CTRL_MASK,
+};
+
+static struct of_device_id sirf_l2x0_ids[] __initconst = {
+       { .compatible = "sirf,prima2-pl310-cache", .data = &prima2_l2x0_aux, },
+       { .compatible = "sirf,marco-pl310-cache", .data = &marco_l2x0_aux, },
        {},
 };
 
 static int __init sirfsoc_l2x0_init(void)
 {
        struct device_node *np;
+       const struct l2x0_aux *aux;
 
-       np = of_find_matching_node(NULL, prima2_l2x0_ids);
+       np = of_find_matching_node(NULL, sirf_l2x0_ids);
        if (np) {
-               pr_info("Initializing prima2 L2 cache\n");
-               return l2x0_of_init(0x40000, 0);
+               aux = of_match_node(sirf_l2x0_ids, np)->data;
+               return l2x0_of_init(aux->val, aux->mask);
        }
 
        return 0;
diff --git a/arch/arm/mach-prima2/platsmp.c b/arch/arm/mach-prima2/platsmp.c
new file mode 100644 (file)
index 0000000..4b78831
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * plat smp support for CSR Marco dual-core SMP SoCs
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/irqchip/arm-gic.h>
+#include <asm/page.h>
+#include <asm/mach/map.h>
+#include <asm/smp_plat.h>
+#include <asm/smp_scu.h>
+#include <asm/cacheflush.h>
+#include <asm/cputype.h>
+#include <mach/map.h>
+
+#include "common.h"
+
+static void __iomem *scu_base;
+static void __iomem *rsc_base;
+
+static DEFINE_SPINLOCK(boot_lock);
+
+static struct map_desc scu_io_desc __initdata = {
+       .length         = SZ_4K,
+       .type           = MT_DEVICE,
+};
+
+void __init sirfsoc_map_scu(void)
+{
+       unsigned long base;
+
+       /* Get SCU base */
+       asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (base));
+
+       scu_io_desc.virtual = SIRFSOC_VA(base);
+       scu_io_desc.pfn = __phys_to_pfn(base);
+       iotable_init(&scu_io_desc, 1);
+
+       scu_base = (void __iomem *)SIRFSOC_VA(base);
+}
+
+static void __cpuinit sirfsoc_secondary_init(unsigned int cpu)
+{
+       /*
+        * if any interrupts are already enabled for the primary
+        * core (e.g. timer irq), then they will not have been enabled
+        * for us: do so
+        */
+       gic_secondary_init(0);
+
+       /*
+        * let the primary processor know we're out of the
+        * pen, then head off into the C entry point
+        */
+       pen_release = -1;
+       smp_wmb();
+
+       /*
+        * Synchronise with the boot thread.
+        */
+       spin_lock(&boot_lock);
+       spin_unlock(&boot_lock);
+}
+
+static struct of_device_id rsc_ids[]  = {
+       { .compatible = "sirf,marco-rsc" },
+       {},
+};
+
+static int __cpuinit sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       unsigned long timeout;
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, rsc_ids);
+       if (!np)
+               return -ENODEV;
+
+       rsc_base = of_iomap(np, 0);
+       if (!rsc_base)
+               return -ENOMEM;
+
+       /*
+        * write the address of secondary startup into the sram register
+        * at offset 0x2C, then write the magic number 0x3CAF5D62 to the
+        * RSC register at offset 0x28, which is what boot rom code is
+        * waiting for. This would wake up the secondary core from WFE
+        */
+#define SIRFSOC_CPU1_JUMPADDR_OFFSET 0x2C
+       __raw_writel(virt_to_phys(sirfsoc_secondary_startup),
+               rsc_base + SIRFSOC_CPU1_JUMPADDR_OFFSET);
+
+#define SIRFSOC_CPU1_WAKEMAGIC_OFFSET 0x28
+       __raw_writel(0x3CAF5D62,
+               rsc_base + SIRFSOC_CPU1_WAKEMAGIC_OFFSET);
+
+       /* make sure write buffer is drained */
+       mb();
+
+       spin_lock(&boot_lock);
+
+       /*
+        * The secondary processor is waiting to be released from
+        * the holding pen - release it, then wait for it to flag
+        * that it has been released by resetting pen_release.
+        *
+        * Note that "pen_release" is the hardware CPU ID, whereas
+        * "cpu" is Linux's internal ID.
+        */
+       pen_release = cpu_logical_map(cpu);
+       __cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release));
+       outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1));
+
+       /*
+        * Send the secondary CPU SEV, thereby causing the boot monitor to read
+        * the JUMPADDR and WAKEMAGIC, and branch to the address found there.
+        */
+       dsb_sev();
+
+       timeout = jiffies + (1 * HZ);
+       while (time_before(jiffies, timeout)) {
+               smp_rmb();
+               if (pen_release == -1)
+                       break;
+
+               udelay(10);
+       }
+
+       /*
+        * now the secondary core is starting up let it run its
+        * calibrations, then wait for it to finish
+        */
+       spin_unlock(&boot_lock);
+
+       return pen_release != -1 ? -ENOSYS : 0;
+}
+
+static void __init sirfsoc_smp_prepare_cpus(unsigned int max_cpus)
+{
+       scu_enable(scu_base);
+}
+
+struct smp_operations sirfsoc_smp_ops __initdata = {
+        .smp_prepare_cpus       = sirfsoc_smp_prepare_cpus,
+        .smp_secondary_init     = sirfsoc_secondary_init,
+        .smp_boot_secondary     = sirfsoc_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_die                = sirfsoc_cpu_die,
+#endif
+};
index 762adb73ab7c9ece0de51b87f09cd6c5208f5576..435019ca0a4893f231b9f79c6cba8eb61e0f17e9 100644 (file)
@@ -19,6 +19,7 @@ static DEFINE_MUTEX(rstc_lock);
 
 static struct of_device_id rstc_ids[]  = {
        { .compatible = "sirf,prima2-rstc" },
+       { .compatible = "sirf,marco-rstc" },
        {},
 };
 
@@ -42,27 +43,37 @@ early_initcall(sirfsoc_of_rstc_init);
 
 int sirfsoc_reset_device(struct device *dev)
 {
-       const unsigned int *prop = of_get_property(dev->of_node, "reset-bit", NULL);
-       unsigned int reset_bit;
+       u32 reset_bit;
 
-       if (!prop)
-               return -ENODEV;
-
-       reset_bit = be32_to_cpup(prop);
+       if (of_property_read_u32(dev->of_node, "reset-bit", &reset_bit))
+               return -EINVAL;
 
        mutex_lock(&rstc_lock);
 
-       /*
-        * Writing 1 to this bit resets corresponding block. Writing 0 to this
-        * bit de-asserts reset signal of the corresponding block.
-        * datasheet doesn't require explicit delay between the set and clear
-        * of reset bit. it could be shorter if tests pass.
-        */
-       writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) | reset_bit,
-               sirfsoc_rstc_base + (reset_bit / 32) * 4);
-       msleep(10);
-       writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) & ~reset_bit,
-               sirfsoc_rstc_base + (reset_bit / 32) * 4);
+       if (of_device_is_compatible(dev->of_node, "sirf,prima2-rstc")) {
+               /*
+                * Writing 1 to this bit resets corresponding block. Writing 0 to this
+                * bit de-asserts reset signal of the corresponding block.
+                * datasheet doesn't require explicit delay between the set and clear
+                * of reset bit. it could be shorter if tests pass.
+                */
+               writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) | reset_bit,
+                       sirfsoc_rstc_base + (reset_bit / 32) * 4);
+               msleep(10);
+               writel(readl(sirfsoc_rstc_base + (reset_bit / 32) * 4) & ~reset_bit,
+                       sirfsoc_rstc_base + (reset_bit / 32) * 4);
+       } else {
+               /*
+                * For MARCO and POLO
+                * Writing 1 to SET register resets corresponding block. Writing 1 to CLEAR
+                * register de-asserts reset signal of the corresponding block.
+                * datasheet doesn't require explicit delay between the set and clear
+                * of reset bit. it could be shorter if tests pass.
+                */
+               writel(reset_bit, sirfsoc_rstc_base + (reset_bit / 32) * 8);
+               msleep(10);
+               writel(reset_bit, sirfsoc_rstc_base + (reset_bit / 32) * 8 + 4);
+       }
 
        mutex_unlock(&rstc_lock);
 
index 5573536021302b91f0d52048f14a94b3abfe3513..9f2da2eec4dc52bec9629b714d961010abe2529c 100644 (file)
@@ -104,6 +104,7 @@ EXPORT_SYMBOL_GPL(sirfsoc_rtc_iobrg_writel);
 
 static const struct of_device_id rtciobrg_ids[] = {
        { .compatible = "sirf,prima2-rtciobg" },
+       { .compatible = "sirf,marco-rtciobg" },
        {}
 };
 
diff --git a/arch/arm/mach-prima2/timer-marco.c b/arch/arm/mach-prima2/timer-marco.c
new file mode 100644 (file)
index 0000000..f4eea2e
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * System timer for CSR SiRFprimaII
+ *
+ * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/bitops.h>
+#include <linux/irq.h>
+#include <linux/clk.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_address.h>
+#include <asm/sched_clock.h>
+#include <asm/localtimer.h>
+#include <asm/mach/time.h>
+
+#include "common.h"
+
+#define SIRFSOC_TIMER_32COUNTER_0_CTRL                 0x0000
+#define SIRFSOC_TIMER_32COUNTER_1_CTRL                 0x0004
+#define SIRFSOC_TIMER_MATCH_0                          0x0018
+#define SIRFSOC_TIMER_MATCH_1                          0x001c
+#define SIRFSOC_TIMER_COUNTER_0                                0x0048
+#define SIRFSOC_TIMER_COUNTER_1                                0x004c
+#define SIRFSOC_TIMER_INTR_STATUS                      0x0060
+#define SIRFSOC_TIMER_WATCHDOG_EN                      0x0064
+#define SIRFSOC_TIMER_64COUNTER_CTRL                   0x0068
+#define SIRFSOC_TIMER_64COUNTER_LO                     0x006c
+#define SIRFSOC_TIMER_64COUNTER_HI                     0x0070
+#define SIRFSOC_TIMER_64COUNTER_LOAD_LO                        0x0074
+#define SIRFSOC_TIMER_64COUNTER_LOAD_HI                        0x0078
+#define SIRFSOC_TIMER_64COUNTER_RLATCHED_LO            0x007c
+#define SIRFSOC_TIMER_64COUNTER_RLATCHED_HI            0x0080
+
+#define SIRFSOC_TIMER_REG_CNT 6
+
+static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = {
+       SIRFSOC_TIMER_WATCHDOG_EN,
+       SIRFSOC_TIMER_32COUNTER_0_CTRL,
+       SIRFSOC_TIMER_32COUNTER_1_CTRL,
+       SIRFSOC_TIMER_64COUNTER_CTRL,
+       SIRFSOC_TIMER_64COUNTER_RLATCHED_LO,
+       SIRFSOC_TIMER_64COUNTER_RLATCHED_HI,
+};
+
+static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
+
+static void __iomem *sirfsoc_timer_base;
+static void __init sirfsoc_of_timer_map(void);
+
+/* disable count and interrupt */
+static inline void sirfsoc_timer_count_disable(int idx)
+{
+       writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) & ~0x7,
+               sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx);
+}
+
+/* enable count and interrupt */
+static inline void sirfsoc_timer_count_enable(int idx)
+{
+       writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx) | 0x7,
+               sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL + 4 * idx);
+}
+
+/* timer interrupt handler */
+static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *ce = dev_id;
+       int cpu = smp_processor_id();
+
+       /* clear timer interrupt */
+       writel_relaxed(BIT(cpu), sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS);
+
+       if (ce->mode == CLOCK_EVT_MODE_ONESHOT)
+               sirfsoc_timer_count_disable(cpu);
+
+       ce->event_handler(ce);
+
+       return IRQ_HANDLED;
+}
+
+/* read 64-bit timer counter */
+static cycle_t sirfsoc_timer_read(struct clocksource *cs)
+{
+       u64 cycles;
+
+       writel_relaxed((readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) |
+                       BIT(0)) & ~BIT(1), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
+
+       cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_HI);
+       cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_RLATCHED_LO);
+
+       return cycles;
+}
+
+static int sirfsoc_timer_set_next_event(unsigned long delta,
+       struct clock_event_device *ce)
+{
+       int cpu = smp_processor_id();
+
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0 +
+               4 * cpu);
+       writel_relaxed(delta, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0 +
+               4 * cpu);
+
+       /* enable the tick */
+       sirfsoc_timer_count_enable(cpu);
+
+       return 0;
+}
+
+static void sirfsoc_timer_set_mode(enum clock_event_mode mode,
+       struct clock_event_device *ce)
+{
+       switch (mode) {
+       case CLOCK_EVT_MODE_ONESHOT:
+               /* enable in set_next_event */
+               break;
+       default:
+               break;
+       }
+
+       sirfsoc_timer_count_disable(smp_processor_id());
+}
+
+static void sirfsoc_clocksource_suspend(struct clocksource *cs)
+{
+       int i;
+
+       for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++)
+               sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]);
+}
+
+static void sirfsoc_clocksource_resume(struct clocksource *cs)
+{
+       int i;
+
+       for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++)
+               writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]);
+
+       writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2],
+               sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO);
+       writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1],
+               sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI);
+
+       writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) |
+               BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
+}
+
+static struct clock_event_device sirfsoc_clockevent = {
+       .name = "sirfsoc_clockevent",
+       .rating = 200,
+       .features = CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode = sirfsoc_timer_set_mode,
+       .set_next_event = sirfsoc_timer_set_next_event,
+};
+
+static struct clocksource sirfsoc_clocksource = {
+       .name = "sirfsoc_clocksource",
+       .rating = 200,
+       .mask = CLOCKSOURCE_MASK(64),
+       .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+       .read = sirfsoc_timer_read,
+       .suspend = sirfsoc_clocksource_suspend,
+       .resume = sirfsoc_clocksource_resume,
+};
+
+static struct irqaction sirfsoc_timer_irq = {
+       .name = "sirfsoc_timer0",
+       .flags = IRQF_TIMER | IRQF_NOBALANCING,
+       .handler = sirfsoc_timer_interrupt,
+       .dev_id = &sirfsoc_clockevent,
+};
+
+#ifdef CONFIG_LOCAL_TIMERS
+
+static struct irqaction sirfsoc_timer1_irq = {
+       .name = "sirfsoc_timer1",
+       .flags = IRQF_TIMER | IRQF_NOBALANCING,
+       .handler = sirfsoc_timer_interrupt,
+};
+
+static int __cpuinit sirfsoc_local_timer_setup(struct clock_event_device *ce)
+{
+       /* Use existing clock_event for cpu 0 */
+       if (!smp_processor_id())
+               return 0;
+
+       ce->irq = sirfsoc_timer1_irq.irq;
+       ce->name = "local_timer";
+       ce->features = sirfsoc_clockevent.features;
+       ce->rating = sirfsoc_clockevent.rating;
+       ce->set_mode = sirfsoc_timer_set_mode;
+       ce->set_next_event = sirfsoc_timer_set_next_event;
+       ce->shift = sirfsoc_clockevent.shift;
+       ce->mult = sirfsoc_clockevent.mult;
+       ce->max_delta_ns = sirfsoc_clockevent.max_delta_ns;
+       ce->min_delta_ns = sirfsoc_clockevent.min_delta_ns;
+
+       sirfsoc_timer1_irq.dev_id = ce;
+       BUG_ON(setup_irq(ce->irq, &sirfsoc_timer1_irq));
+       irq_set_affinity(sirfsoc_timer1_irq.irq, cpumask_of(1));
+
+       clockevents_register_device(ce);
+       return 0;
+}
+
+static void sirfsoc_local_timer_stop(struct clock_event_device *ce)
+{
+       sirfsoc_timer_count_disable(1);
+
+       remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq);
+}
+
+static struct local_timer_ops sirfsoc_local_timer_ops __cpuinitdata = {
+       .setup  = sirfsoc_local_timer_setup,
+       .stop   = sirfsoc_local_timer_stop,
+};
+#endif /* CONFIG_LOCAL_TIMERS */
+
+static void __init sirfsoc_clockevent_init(void)
+{
+       clockevents_calc_mult_shift(&sirfsoc_clockevent, CLOCK_TICK_RATE, 60);
+
+       sirfsoc_clockevent.max_delta_ns =
+               clockevent_delta2ns(-2, &sirfsoc_clockevent);
+       sirfsoc_clockevent.min_delta_ns =
+               clockevent_delta2ns(2, &sirfsoc_clockevent);
+
+       sirfsoc_clockevent.cpumask = cpumask_of(0);
+       clockevents_register_device(&sirfsoc_clockevent);
+#ifdef CONFIG_LOCAL_TIMERS
+       local_timer_register(&sirfsoc_local_timer_ops);
+#endif
+}
+
+/* initialize the kernel jiffy timer source */
+void __init sirfsoc_marco_timer_init(void)
+{
+       unsigned long rate;
+       u32 timer_div;
+       struct clk *clk;
+
+       /* initialize clocking early, we want to set the OS timer */
+       sirfsoc_of_clk_init();
+
+       /* timer's input clock is io clock */
+       clk = clk_get_sys("io", NULL);
+
+       BUG_ON(IS_ERR(clk));
+       rate = clk_get_rate(clk);
+
+       BUG_ON(rate < CLOCK_TICK_RATE);
+       BUG_ON(rate % CLOCK_TICK_RATE);
+
+       sirfsoc_of_timer_map();
+
+       /* Initialize the timer dividers */
+       timer_div = rate / CLOCK_TICK_RATE - 1;
+       writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
+       writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_0_CTRL);
+       writel_relaxed(timer_div << 16, sirfsoc_timer_base + SIRFSOC_TIMER_32COUNTER_1_CTRL);
+
+       /* Initialize timer counters to 0 */
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_LO);
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_LOAD_HI);
+       writel_relaxed(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL) |
+               BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_0);
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_1);
+
+       /* Clear all interrupts */
+       writel_relaxed(0xFFFF, sirfsoc_timer_base + SIRFSOC_TIMER_INTR_STATUS);
+
+       BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE));
+
+       BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq));
+
+       sirfsoc_clockevent_init();
+}
+
+static struct of_device_id timer_ids[] = {
+       { .compatible = "sirf,marco-tick" },
+       {},
+};
+
+static void __init sirfsoc_of_timer_map(void)
+{
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, timer_ids);
+       if (!np)
+               return;
+       sirfsoc_timer_base = of_iomap(np, 0);
+       if (!sirfsoc_timer_base)
+               panic("unable to map timer cpu registers\n");
+
+       sirfsoc_timer_irq.irq = irq_of_parse_and_map(np, 0);
+       if (!sirfsoc_timer_irq.irq)
+               panic("No irq passed for timer0 via DT\n");
+
+#ifdef CONFIG_LOCAL_TIMERS
+       sirfsoc_timer1_irq.irq = irq_of_parse_and_map(np, 1);
+       if (!sirfsoc_timer1_irq.irq)
+               panic("No irq passed for timer1 via DT\n");
+#endif
+
+       of_node_put(np);
+}
diff --git a/arch/arm/mach-prima2/timer-prima2.c b/arch/arm/mach-prima2/timer-prima2.c
new file mode 100644 (file)
index 0000000..6da584f
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * System timer for CSR SiRFprimaII
+ *
+ * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/bitops.h>
+#include <linux/irq.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <mach/map.h>
+#include <asm/sched_clock.h>
+#include <asm/mach/time.h>
+
+#include "common.h"
+
+#define SIRFSOC_TIMER_COUNTER_LO       0x0000
+#define SIRFSOC_TIMER_COUNTER_HI       0x0004
+#define SIRFSOC_TIMER_MATCH_0          0x0008
+#define SIRFSOC_TIMER_MATCH_1          0x000C
+#define SIRFSOC_TIMER_MATCH_2          0x0010
+#define SIRFSOC_TIMER_MATCH_3          0x0014
+#define SIRFSOC_TIMER_MATCH_4          0x0018
+#define SIRFSOC_TIMER_MATCH_5          0x001C
+#define SIRFSOC_TIMER_STATUS           0x0020
+#define SIRFSOC_TIMER_INT_EN           0x0024
+#define SIRFSOC_TIMER_WATCHDOG_EN      0x0028
+#define SIRFSOC_TIMER_DIV              0x002C
+#define SIRFSOC_TIMER_LATCH            0x0030
+#define SIRFSOC_TIMER_LATCHED_LO       0x0034
+#define SIRFSOC_TIMER_LATCHED_HI       0x0038
+
+#define SIRFSOC_TIMER_WDT_INDEX                5
+
+#define SIRFSOC_TIMER_LATCH_BIT         BIT(0)
+
+#define SIRFSOC_TIMER_REG_CNT 11
+
+static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = {
+       SIRFSOC_TIMER_MATCH_0, SIRFSOC_TIMER_MATCH_1, SIRFSOC_TIMER_MATCH_2,
+       SIRFSOC_TIMER_MATCH_3, SIRFSOC_TIMER_MATCH_4, SIRFSOC_TIMER_MATCH_5,
+       SIRFSOC_TIMER_INT_EN, SIRFSOC_TIMER_WATCHDOG_EN, SIRFSOC_TIMER_DIV,
+       SIRFSOC_TIMER_LATCHED_LO, SIRFSOC_TIMER_LATCHED_HI,
+};
+
+static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
+
+static void __iomem *sirfsoc_timer_base;
+static void __init sirfsoc_of_timer_map(void);
+
+/* timer0 interrupt handler */
+static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *ce = dev_id;
+
+       WARN_ON(!(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_STATUS) & BIT(0)));
+
+       /* clear timer0 interrupt */
+       writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS);
+
+       ce->event_handler(ce);
+
+       return IRQ_HANDLED;
+}
+
+/* read 64-bit timer counter */
+static cycle_t sirfsoc_timer_read(struct clocksource *cs)
+{
+       u64 cycles;
+
+       /* latch the 64-bit timer counter */
+       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
+       cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_HI);
+       cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO);
+
+       return cycles;
+}
+
+static int sirfsoc_timer_set_next_event(unsigned long delta,
+       struct clock_event_device *ce)
+{
+       unsigned long now, next;
+
+       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
+       now = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO);
+       next = now + delta;
+       writel_relaxed(next, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0);
+       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
+       now = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO);
+
+       return next - now > delta ? -ETIME : 0;
+}
+
+static void sirfsoc_timer_set_mode(enum clock_event_mode mode,
+       struct clock_event_device *ce)
+{
+       u32 val = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN);
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               WARN_ON(1);
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               writel_relaxed(val | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN);
+               break;
+       case CLOCK_EVT_MODE_SHUTDOWN:
+               writel_relaxed(val & ~BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN);
+               break;
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_RESUME:
+               break;
+       }
+}
+
+static void sirfsoc_clocksource_suspend(struct clocksource *cs)
+{
+       int i;
+
+       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
+
+       for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++)
+               sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]);
+}
+
+static void sirfsoc_clocksource_resume(struct clocksource *cs)
+{
+       int i;
+
+       for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++)
+               writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]);
+
+       writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
+       writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);
+}
+
+static struct clock_event_device sirfsoc_clockevent = {
+       .name = "sirfsoc_clockevent",
+       .rating = 200,
+       .features = CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode = sirfsoc_timer_set_mode,
+       .set_next_event = sirfsoc_timer_set_next_event,
+};
+
+static struct clocksource sirfsoc_clocksource = {
+       .name = "sirfsoc_clocksource",
+       .rating = 200,
+       .mask = CLOCKSOURCE_MASK(64),
+       .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+       .read = sirfsoc_timer_read,
+       .suspend = sirfsoc_clocksource_suspend,
+       .resume = sirfsoc_clocksource_resume,
+};
+
+static struct irqaction sirfsoc_timer_irq = {
+       .name = "sirfsoc_timer0",
+       .flags = IRQF_TIMER,
+       .irq = 0,
+       .handler = sirfsoc_timer_interrupt,
+       .dev_id = &sirfsoc_clockevent,
+};
+
+/* Overwrite weak default sched_clock with more precise one */
+static u32 notrace sirfsoc_read_sched_clock(void)
+{
+       return (u32)(sirfsoc_timer_read(NULL) & 0xffffffff);
+}
+
+static void __init sirfsoc_clockevent_init(void)
+{
+       sirfsoc_clockevent.cpumask = cpumask_of(0);
+       clockevents_config_and_register(&sirfsoc_clockevent, CLOCK_TICK_RATE,
+                                       2, -2);
+}
+
+/* initialize the kernel jiffy timer source */
+void __init sirfsoc_prima2_timer_init(void)
+{
+       unsigned long rate;
+       struct clk *clk;
+
+       /* initialize clocking early, we want to set the OS timer */
+       sirfsoc_of_clk_init();
+
+       /* timer's input clock is io clock */
+       clk = clk_get_sys("io", NULL);
+
+       BUG_ON(IS_ERR(clk));
+
+       rate = clk_get_rate(clk);
+
+       BUG_ON(rate < CLOCK_TICK_RATE);
+       BUG_ON(rate % CLOCK_TICK_RATE);
+
+       sirfsoc_of_timer_map();
+
+       writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV);
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
+       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);
+       writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS);
+
+       BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE));
+
+       setup_sched_clock(sirfsoc_read_sched_clock, 32, CLOCK_TICK_RATE);
+
+       BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq));
+
+       sirfsoc_clockevent_init();
+}
+
+static struct of_device_id timer_ids[] = {
+       { .compatible = "sirf,prima2-tick" },
+       {},
+};
+
+static void __init sirfsoc_of_timer_map(void)
+{
+       struct device_node *np;
+       const unsigned int *intspec;
+
+       np = of_find_matching_node(NULL, timer_ids);
+       if (!np)
+               return;
+       sirfsoc_timer_base = of_iomap(np, 0);
+       if (!sirfsoc_timer_base)
+               panic("unable to map timer cpu registers\n");
+
+       /* Get the interrupts property */
+       intspec = of_get_property(np, "interrupts", NULL);
+       BUG_ON(!intspec);
+       sirfsoc_timer_irq.irq = be32_to_cpup(intspec);
+
+       of_node_put(np);
+}
diff --git a/arch/arm/mach-prima2/timer.c b/arch/arm/mach-prima2/timer.c
deleted file mode 100644 (file)
index a7a2c19..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * System timer for CSR SiRFprimaII
- *
- * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
- *
- * Licensed under GPLv2 or later.
- */
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/clockchips.h>
-#include <linux/clocksource.h>
-#include <linux/bitops.h>
-#include <linux/irq.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <mach/map.h>
-#include <asm/sched_clock.h>
-#include <asm/mach/time.h>
-
-#include "common.h"
-
-#define SIRFSOC_TIMER_COUNTER_LO       0x0000
-#define SIRFSOC_TIMER_COUNTER_HI       0x0004
-#define SIRFSOC_TIMER_MATCH_0          0x0008
-#define SIRFSOC_TIMER_MATCH_1          0x000C
-#define SIRFSOC_TIMER_MATCH_2          0x0010
-#define SIRFSOC_TIMER_MATCH_3          0x0014
-#define SIRFSOC_TIMER_MATCH_4          0x0018
-#define SIRFSOC_TIMER_MATCH_5          0x001C
-#define SIRFSOC_TIMER_STATUS           0x0020
-#define SIRFSOC_TIMER_INT_EN           0x0024
-#define SIRFSOC_TIMER_WATCHDOG_EN      0x0028
-#define SIRFSOC_TIMER_DIV              0x002C
-#define SIRFSOC_TIMER_LATCH            0x0030
-#define SIRFSOC_TIMER_LATCHED_LO       0x0034
-#define SIRFSOC_TIMER_LATCHED_HI       0x0038
-
-#define SIRFSOC_TIMER_WDT_INDEX                5
-
-#define SIRFSOC_TIMER_LATCH_BIT         BIT(0)
-
-#define SIRFSOC_TIMER_REG_CNT 11
-
-static const u32 sirfsoc_timer_reg_list[SIRFSOC_TIMER_REG_CNT] = {
-       SIRFSOC_TIMER_MATCH_0, SIRFSOC_TIMER_MATCH_1, SIRFSOC_TIMER_MATCH_2,
-       SIRFSOC_TIMER_MATCH_3, SIRFSOC_TIMER_MATCH_4, SIRFSOC_TIMER_MATCH_5,
-       SIRFSOC_TIMER_INT_EN, SIRFSOC_TIMER_WATCHDOG_EN, SIRFSOC_TIMER_DIV,
-       SIRFSOC_TIMER_LATCHED_LO, SIRFSOC_TIMER_LATCHED_HI,
-};
-
-static u32 sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT];
-
-static void __iomem *sirfsoc_timer_base;
-static void __init sirfsoc_of_timer_map(void);
-
-/* timer0 interrupt handler */
-static irqreturn_t sirfsoc_timer_interrupt(int irq, void *dev_id)
-{
-       struct clock_event_device *ce = dev_id;
-
-       WARN_ON(!(readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_STATUS) & BIT(0)));
-
-       /* clear timer0 interrupt */
-       writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS);
-
-       ce->event_handler(ce);
-
-       return IRQ_HANDLED;
-}
-
-/* read 64-bit timer counter */
-static cycle_t sirfsoc_timer_read(struct clocksource *cs)
-{
-       u64 cycles;
-
-       /* latch the 64-bit timer counter */
-       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
-       cycles = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_HI);
-       cycles = (cycles << 32) | readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO);
-
-       return cycles;
-}
-
-static int sirfsoc_timer_set_next_event(unsigned long delta,
-       struct clock_event_device *ce)
-{
-       unsigned long now, next;
-
-       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
-       now = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO);
-       next = now + delta;
-       writel_relaxed(next, sirfsoc_timer_base + SIRFSOC_TIMER_MATCH_0);
-       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
-       now = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_LATCHED_LO);
-
-       return next - now > delta ? -ETIME : 0;
-}
-
-static void sirfsoc_timer_set_mode(enum clock_event_mode mode,
-       struct clock_event_device *ce)
-{
-       u32 val = readl_relaxed(sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN);
-       switch (mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               WARN_ON(1);
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-               writel_relaxed(val | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN);
-               break;
-       case CLOCK_EVT_MODE_SHUTDOWN:
-               writel_relaxed(val & ~BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_INT_EN);
-               break;
-       case CLOCK_EVT_MODE_UNUSED:
-       case CLOCK_EVT_MODE_RESUME:
-               break;
-       }
-}
-
-static void sirfsoc_clocksource_suspend(struct clocksource *cs)
-{
-       int i;
-
-       writel_relaxed(SIRFSOC_TIMER_LATCH_BIT, sirfsoc_timer_base + SIRFSOC_TIMER_LATCH);
-
-       for (i = 0; i < SIRFSOC_TIMER_REG_CNT; i++)
-               sirfsoc_timer_reg_val[i] = readl_relaxed(sirfsoc_timer_base + sirfsoc_timer_reg_list[i]);
-}
-
-static void sirfsoc_clocksource_resume(struct clocksource *cs)
-{
-       int i;
-
-       for (i = 0; i < SIRFSOC_TIMER_REG_CNT - 2; i++)
-               writel_relaxed(sirfsoc_timer_reg_val[i], sirfsoc_timer_base + sirfsoc_timer_reg_list[i]);
-
-       writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 2], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
-       writel_relaxed(sirfsoc_timer_reg_val[SIRFSOC_TIMER_REG_CNT - 1], sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);
-}
-
-static struct clock_event_device sirfsoc_clockevent = {
-       .name = "sirfsoc_clockevent",
-       .rating = 200,
-       .features = CLOCK_EVT_FEAT_ONESHOT,
-       .set_mode = sirfsoc_timer_set_mode,
-       .set_next_event = sirfsoc_timer_set_next_event,
-};
-
-static struct clocksource sirfsoc_clocksource = {
-       .name = "sirfsoc_clocksource",
-       .rating = 200,
-       .mask = CLOCKSOURCE_MASK(64),
-       .flags = CLOCK_SOURCE_IS_CONTINUOUS,
-       .read = sirfsoc_timer_read,
-       .suspend = sirfsoc_clocksource_suspend,
-       .resume = sirfsoc_clocksource_resume,
-};
-
-static struct irqaction sirfsoc_timer_irq = {
-       .name = "sirfsoc_timer0",
-       .flags = IRQF_TIMER,
-       .irq = 0,
-       .handler = sirfsoc_timer_interrupt,
-       .dev_id = &sirfsoc_clockevent,
-};
-
-/* Overwrite weak default sched_clock with more precise one */
-static u32 notrace sirfsoc_read_sched_clock(void)
-{
-       return (u32)(sirfsoc_timer_read(NULL) & 0xffffffff);
-}
-
-static void __init sirfsoc_clockevent_init(void)
-{
-       sirfsoc_clockevent.cpumask = cpumask_of(0);
-       clockevents_config_and_register(&sirfsoc_clockevent, CLOCK_TICK_RATE,
-                                       2, -2);
-}
-
-/* initialize the kernel jiffy timer source */
-void __init sirfsoc_timer_init(void)
-{
-       unsigned long rate;
-       struct clk *clk;
-
-       /* initialize clocking early, we want to set the OS timer */
-       sirfsoc_of_clk_init();
-
-       /* timer's input clock is io clock */
-       clk = clk_get_sys("io", NULL);
-
-       BUG_ON(IS_ERR(clk));
-
-       rate = clk_get_rate(clk);
-
-       BUG_ON(rate < CLOCK_TICK_RATE);
-       BUG_ON(rate % CLOCK_TICK_RATE);
-
-       sirfsoc_of_timer_map();
-
-       writel_relaxed(rate / CLOCK_TICK_RATE / 2 - 1, sirfsoc_timer_base + SIRFSOC_TIMER_DIV);
-       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_LO);
-       writel_relaxed(0, sirfsoc_timer_base + SIRFSOC_TIMER_COUNTER_HI);
-       writel_relaxed(BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_STATUS);
-
-       BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE));
-
-       setup_sched_clock(sirfsoc_read_sched_clock, 32, CLOCK_TICK_RATE);
-
-       BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq));
-
-       sirfsoc_clockevent_init();
-}
-
-static struct of_device_id timer_ids[] = {
-       { .compatible = "sirf,prima2-tick" },
-       {},
-};
-
-void __init sirfsoc_of_timer_map(void)
-{
-       struct device_node *np;
-       const unsigned int *intspec;
-
-       np = of_find_matching_node(NULL, timer_ids);
-       if (!np)
-               panic("unable to find compatible timer node in dtb\n");
-       sirfsoc_timer_base = of_iomap(np, 0);
-       if (!sirfsoc_timer_base)
-               panic("unable to map timer cpu registers\n");
-
-       /* Get the interrupts property */
-       intspec = of_get_property(np, "interrupts", NULL);
-       BUG_ON(!intspec);
-       sirfsoc_timer_irq.irq = be32_to_cpup(intspec);
-
-       of_node_put(np);
-}
index 0b7147928aa3ef0d0638afde9296edf5fe043a43..700e6623aa86169a315871be1d9e6a432a31f42f 100644 (file)
@@ -15,7 +15,7 @@ obj-$(CONFIG_ARCH_EMEV2)      += setup-emev2.o clock-emev2.o
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_HOTPLUG_CPU)      += hotplug.o
-smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o
+smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-sh73a0.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o
 
@@ -37,6 +37,7 @@ obj-$(CONFIG_ARCH_SHMOBILE)   += pm-rmobile.o
 obj-$(CONFIG_ARCH_SH7372)      += pm-sh7372.o sleep-sh7372.o
 obj-$(CONFIG_ARCH_R8A7740)     += pm-r8a7740.o
 obj-$(CONFIG_ARCH_R8A7779)     += pm-r8a7779.o
+obj-$(CONFIG_ARCH_SH73A0)      += pm-sh73a0.o
 
 # Board objects
 obj-$(CONFIG_MACH_AP4EVB)      += board-ap4evb.o
index e7912447ad504f86e9ae4535b60e5adbb72c6860..65731370da81808c162abea79cfb1632b0363165 100644 (file)
@@ -1181,6 +1181,8 @@ static void __init eva_init(void)
        rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device);
        if (usb)
                rmobile_add_device_to_domain("A3SP", usb);
+
+       r8a7740_pm_init();
 }
 
 static void __init eva_earlytimer_init(void)
index ac9428530d7b5254b30ad33e9b81e1dd458e47c6..363c6edfa3cda53c7ef9df6e8cd18e1868802e48 100644 (file)
@@ -772,6 +772,8 @@ static void __init kzm_init(void)
 
        sh73a0_add_standard_devices();
        platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices));
+
+       sh73a0_pm_init();
 }
 
 static void kzm9g_restart(char mode, const char *cmd)
index eac49d59782f3a66df3de2994f2d95e8a66b2c10..19ce885a3b4372af27579b3eeb68446c9b8cfcb7 100644 (file)
@@ -581,10 +581,14 @@ static struct clk_lookup lookups[] = {
 
        /* MSTP32 clocks */
        CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0",    &mstp_clks[MSTP100]),
-       CLKDEV_DEV_ID("sh_tmu.1",               &mstp_clks[MSTP111]),
+       CLKDEV_DEV_ID("sh_tmu.3",               &mstp_clks[MSTP111]),
+       CLKDEV_DEV_ID("sh_tmu.4",               &mstp_clks[MSTP111]),
+       CLKDEV_DEV_ID("sh_tmu.5",               &mstp_clks[MSTP111]),
        CLKDEV_DEV_ID("i2c-sh_mobile.0",        &mstp_clks[MSTP116]),
        CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1",    &mstp_clks[MSTP117]),
        CLKDEV_DEV_ID("sh_tmu.0",               &mstp_clks[MSTP125]),
+       CLKDEV_DEV_ID("sh_tmu.1",               &mstp_clks[MSTP125]),
+       CLKDEV_DEV_ID("sh_tmu.2",               &mstp_clks[MSTP125]),
        CLKDEV_DEV_ID("sh_mobile_ceu.0",        &mstp_clks[MSTP127]),
        CLKDEV_DEV_ID("sh_mobile_ceu.1",        &mstp_clks[MSTP128]),
 
index c019609da660c07567c4cd9551bba1ea1d492a86..202370de32f0818db28b981e2f7e9098a2f64715 100644 (file)
@@ -161,7 +161,8 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
        CLKDEV_DEV_ID("ohci-platform.0", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
        CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */
-       CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP016]), /* TMU01 */
+       CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP015]), /* TMU01 */
+       CLKDEV_DEV_ID("sh_tmu.2", &mstp_clks[MSTP014]), /* TMU02 */
        CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
        CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */
        CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */
index 3ca6757b129ad7da9be7b8654e61402b8647f012..45d21fe317f4706f9f0f1c75645522917f415fe5 100644 (file)
@@ -544,6 +544,7 @@ static struct clk_lookup lookups[] = {
 
        /* MSTP32 clocks */
        CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* IIC2 */
+       CLKDEV_DEV_ID("fff30000.i2c", &mstp_clks[MSTP001]), /* IIC2 */
        CLKDEV_DEV_ID("spi_sh_msiof.0", &mstp_clks[MSTP000]), /* MSIOF0 */
        CLKDEV_DEV_ID("uio_pdrv_genirq.4", &mstp_clks[MSTP131]), /* VEU3 */
        CLKDEV_DEV_ID("uio_pdrv_genirq.3", &mstp_clks[MSTP130]), /* VEU2 */
@@ -556,6 +557,7 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX0 */
        CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1", &mstp_clks[MSTP117]), /* LCDC1 */
        CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* IIC0 */
+       CLKDEV_DEV_ID("fff20000.i2c", &mstp_clks[MSTP116]), /* IIC0 */
        CLKDEV_DEV_ID("sh_mobile_meram.0", &mstp_clks[MSTP113]), /* MERAM */
        CLKDEV_DEV_ID("uio_pdrv_genirq.5", &mstp_clks[MSTP106]), /* JPU */
        CLKDEV_DEV_ID("uio_pdrv_genirq.0", &mstp_clks[MSTP101]), /* VPU */
@@ -577,18 +579,25 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP200]), /* SCIFA4 */
        CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI2 */
        CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* IIC1 */
+       CLKDEV_DEV_ID("e6c20000.i2c", &mstp_clks[MSTP323]), /* IIC1 */
        CLKDEV_DEV_ID("r8a66597_hcd.0", &mstp_clks[MSTP322]), /* USB0 */
        CLKDEV_DEV_ID("r8a66597_udc.0", &mstp_clks[MSTP322]), /* USB0 */
        CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP322]), /* USB0 */
        CLKDEV_DEV_ID("sh_flctl.0", &mstp_clks[MSTP315]), /* FLCTL */
        CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
+       CLKDEV_DEV_ID("e6850000.sdhi", &mstp_clks[MSTP314]), /* SDHI0 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
+       CLKDEV_DEV_ID("e6860000.sdhi", &mstp_clks[MSTP313]), /* SDHI1 */
        CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMC */
+       CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMC */
        CLKDEV_DEV_ID("sh-mipi-dsi.1", &mstp_clks[MSTP423]), /* DSITX1 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), /* SDHI2 */
+       CLKDEV_DEV_ID("e6870000.sdhi", &mstp_clks[MSTP415]), /* SDHI2 */
        CLKDEV_DEV_ID("sh-mobile-hdmi", &mstp_clks[MSTP413]), /* HDMI */
        CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* IIC3 */
+       CLKDEV_DEV_ID("e6d20000.i2c", &mstp_clks[MSTP411]), /* IIC3 */
        CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* IIC4 */
+       CLKDEV_DEV_ID("e6d30000.i2c", &mstp_clks[MSTP410]), /* IIC4 */
        CLKDEV_DEV_ID("sh-dma-engine.4", &mstp_clks[MSTP407]), /* USB-DMAC1 */
        CLKDEV_DEV_ID("r8a66597_hcd.1", &mstp_clks[MSTP406]), /* USB1 */
        CLKDEV_DEV_ID("r8a66597_udc.1", &mstp_clks[MSTP406]), /* USB1 */
index 516ff7f3e4344bb92020b800cada9ddfe03a9a3f..afa5423a0f93871351669830a07dddbaf808b616 100644 (file)
@@ -264,17 +264,17 @@ enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
        SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags)
 
 static struct clk div4_clks[DIV4_NR] = {
-       [DIV4_I] = DIV4(FRQCRA, 20, 0xfff, CLK_ENABLE_ON_INIT),
-       [DIV4_ZG] = DIV4(FRQCRA, 16, 0xbff, CLK_ENABLE_ON_INIT),
-       [DIV4_M3] = DIV4(FRQCRA, 12, 0xfff, CLK_ENABLE_ON_INIT),
-       [DIV4_B] = DIV4(FRQCRA, 8, 0xfff, CLK_ENABLE_ON_INIT),
-       [DIV4_M1] = DIV4(FRQCRA, 4, 0xfff, 0),
-       [DIV4_M2] = DIV4(FRQCRA, 0, 0xfff, 0),
-       [DIV4_Z] = DIV4(FRQCRB, 24, 0xbff, 0),
-       [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xfff, 0),
-       [DIV4_ZT] = DIV4(FRQCRB, 16, 0xfff, 0),
-       [DIV4_ZX] = DIV4(FRQCRB, 12, 0xfff, 0),
-       [DIV4_HP] = DIV4(FRQCRB, 4, 0xfff, 0),
+       [DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT),
+       [DIV4_ZG] = DIV4(FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT),
+       [DIV4_M3] = DIV4(FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT),
+       [DIV4_B] = DIV4(FRQCRA, 8, 0xdff, CLK_ENABLE_ON_INIT),
+       [DIV4_M1] = DIV4(FRQCRA, 4, 0x1dff, 0),
+       [DIV4_M2] = DIV4(FRQCRA, 0, 0x1dff, 0),
+       [DIV4_Z] = DIV4(FRQCRB, 24, 0x97f, 0),
+       [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xdff, 0),
+       [DIV4_ZT] = DIV4(FRQCRB, 16, 0xdff, 0),
+       [DIV4_ZX] = DIV4(FRQCRB, 12, 0xdff, 0),
+       [DIV4_HP] = DIV4(FRQCRB, 4, 0xdff, 0),
 };
 
 enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1,
@@ -525,6 +525,13 @@ static struct clk mstp_clks[MSTP_NR] = {
        [MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */
 };
 
+/* The lookups structure below includes duplicate entries for some clocks
+ * with alternate names.
+ * - The traditional name used when a device is initialised with platform data
+ * - The name used when a device is initialised using device tree
+ * The longer-term aim is to remove these duplicates, and indeed the
+ * lookups table entirely, by describing clocks using device tree.
+ */
 static struct clk_lookup lookups[] = {
        /* main clocks */
        CLKDEV_CON_ID("r_clk", &r_clk),
@@ -545,6 +552,7 @@ static struct clk_lookup lookups[] = {
 
        /* MSTP32 clocks */
        CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */
+       CLKDEV_DEV_ID("e6824000.i2c", &mstp_clks[MSTP001]), /* I2C2 */
        CLKDEV_DEV_ID("sh_mobile_ceu.1", &mstp_clks[MSTP129]), /* CEU1 */
        CLKDEV_DEV_ID("sh-mobile-csi2.1", &mstp_clks[MSTP128]), /* CSI2-RX1 */
        CLKDEV_DEV_ID("sh_mobile_ceu.0", &mstp_clks[MSTP127]), /* CEU0 */
@@ -553,6 +561,7 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP125]), /* TMU01 */
        CLKDEV_DEV_ID("sh-mipi-dsi.0", &mstp_clks[MSTP118]), /* DSITX */
        CLKDEV_DEV_ID("i2c-sh_mobile.0", &mstp_clks[MSTP116]), /* I2C0 */
+       CLKDEV_DEV_ID("e6820000.i2c", &mstp_clks[MSTP116]), /* I2C0 */
        CLKDEV_DEV_ID("sh_mobile_lcdc_fb.0", &mstp_clks[MSTP100]), /* LCDC0 */
        CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP219]), /* SCIFA7 */
        CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), /* SY-DMAC */
@@ -569,17 +578,21 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh_fsi2", &mstp_clks[MSTP328]), /* FSI */
        CLKDEV_DEV_ID("sh_irda.0", &mstp_clks[MSTP325]), /* IrDA */
        CLKDEV_DEV_ID("i2c-sh_mobile.1", &mstp_clks[MSTP323]), /* I2C1 */
+       CLKDEV_DEV_ID("e6822000.i2c", &mstp_clks[MSTP323]), /* I2C1 */
        CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */
        CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
        CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */
+       CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
        CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */
        CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */
        CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */
        CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */
        CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */
+       CLKDEV_DEV_ID("e6826000.i2c", &mstp_clks[MSTP411]), /* I2C3 */
        CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */
+       CLKDEV_DEV_ID("e6828000.i2c", &mstp_clks[MSTP410]), /* I2C4 */
        CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */
 };
 
diff --git a/arch/arm/mach-shmobile/headsmp-sh73a0.S b/arch/arm/mach-shmobile/headsmp-sh73a0.S
new file mode 100644 (file)
index 0000000..bec4c0d
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * SMP support for SoC sh73a0
+ *
+ * Copyright (C) 2012 Bastian Hecht
+ *
+ * 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/linkage.h>
+#include <linux/init.h>
+#include <asm/memory.h>
+
+       __CPUINIT
+/*
+ * Reset vector for secondary CPUs.
+ *
+ * First we turn on L1 cache coherency for our CPU. Then we jump to
+ * shmobile_invalidate_start that invalidates the cache and hands over control
+ * to the common ARM startup code.
+ * This function will be mapped to address 0 by the SBAR register.
+ * A normal branch is out of range here so we need a long jump. We jump to
+ * the physical address as the MMU is still turned off.
+ */
+       .align  12
+ENTRY(sh73a0_secondary_vector)
+       mrc     p15, 0, r0, c0, c0, 5   @ read MIPDR
+       and     r0, r0, #3              @ mask out cpu ID
+       lsl     r0, r0, #3              @ we will shift by cpu_id * 8 bits
+       mov     r1, #0xf0000000         @ SCU base address
+       ldr     r2, [r1, #8]            @ SCU Power Status Register
+       mov     r3, #3
+       bic     r2, r2, r3, lsl r0      @ Clear bits of our CPU (Run Mode)
+       str     r2, [r1, #8]            @ write back
+
+       ldr     pc, 1f
+1:     .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET
+ENDPROC(sh73a0_secondary_vector)
index b09a0bdbf8135c127d354aa1d313de485c7f1348..a1524e3367b005ea0ed783ea74cc43a93c922017 100644 (file)
@@ -56,6 +56,12 @@ int shmobile_cpu_disable(unsigned int cpu)
        return cpu == 0 ? -EPERM : 0;
 }
 
+int shmobile_cpu_disable_any(unsigned int cpu)
+{
+       cpumask_clear_cpu(cpu, &dead_cpus);
+       return 0;
+}
+
 int shmobile_cpu_is_dead(unsigned int cpu)
 {
        return cpumask_test_cpu(cpu, &dead_cpus);
index a57439eec11a32ce22d7a85e7ec1290acbd90bd1..e48606d8a2be31214168c0616ae6bc9d81ddc458 100644 (file)
@@ -23,6 +23,8 @@ extern void sh7372_map_io(void);
 extern void sh7372_earlytimer_init(void);
 extern void sh7372_add_early_devices(void);
 extern void sh7372_add_standard_devices(void);
+extern void sh7372_add_early_devices_dt(void);
+extern void sh7372_add_standard_devices_dt(void);
 extern void sh7372_clock_init(void);
 extern void sh7372_pinmux_init(void);
 extern void sh7372_pm_init(void);
@@ -32,12 +34,17 @@ extern struct clk sh7372_extal1_clk;
 extern struct clk sh7372_extal2_clk;
 
 extern void sh73a0_init_irq(void);
+extern void sh73a0_init_irq_dt(void);
 extern void sh73a0_map_io(void);
 extern void sh73a0_earlytimer_init(void);
 extern void sh73a0_add_early_devices(void);
+extern void sh73a0_add_early_devices_dt(void);
 extern void sh73a0_add_standard_devices(void);
+extern void sh73a0_add_standard_devices_dt(void);
 extern void sh73a0_clock_init(void);
 extern void sh73a0_pinmux_init(void);
+extern void sh73a0_pm_init(void);
+extern void sh73a0_secondary_vector(void);
 extern struct clk sh73a0_extal1_clk;
 extern struct clk sh73a0_extal2_clk;
 extern struct clk sh73a0_extcki_clk;
@@ -49,6 +56,7 @@ extern void r8a7740_add_early_devices(void);
 extern void r8a7740_add_standard_devices(void);
 extern void r8a7740_clock_init(u8 md_ck);
 extern void r8a7740_pinmux_init(void);
+extern void r8a7740_pm_init(void);
 
 extern void r8a7779_init_irq(void);
 extern void r8a7779_map_io(void);
@@ -76,6 +84,7 @@ static inline int shmobile_cpuidle_init(void) { return 0; }
 
 extern void shmobile_cpu_die(unsigned int cpu);
 extern int shmobile_cpu_disable(unsigned int cpu);
+extern int shmobile_cpu_disable_any(unsigned int cpu);
 
 #ifdef CONFIG_HOTPLUG_CPU
 extern int shmobile_cpu_is_dead(unsigned int cpu);
index 978369973be49e8e296104f165c3acad85f4ee3d..91faba666d462916ec37822450b127674e8446db 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/irq.h>
 #include <linux/io.h>
 #include <linux/sh_intc.h>
+#include <linux/irqchip.h>
 #include <linux/irqchip/arm-gic.h>
 #include <mach/intc.h>
 #include <mach/irqs.h>
@@ -315,11 +316,6 @@ static int intca_gic_set_type(struct irq_data *data, unsigned int type)
        return irq_cbp(irq_set_type, to_intca_reloc_irq(data), type);
 }
 
-static int intca_gic_set_wake(struct irq_data *data, unsigned int on)
-{
-       return irq_cbp(irq_set_wake, to_intca_reloc_irq(data), on);
-}
-
 #ifdef CONFIG_SMP
 static int intca_gic_set_affinity(struct irq_data *data,
                                  const struct cpumask *cpumask,
@@ -339,7 +335,7 @@ struct irq_chip intca_gic_irq_chip = {
        .irq_disable            = intca_gic_disable,
        .irq_shutdown           = intca_gic_disable,
        .irq_set_type           = intca_gic_set_type,
-       .irq_set_wake           = intca_gic_set_wake,
+       .irq_set_wake           = sh73a0_set_wake,
 #ifdef CONFIG_SMP
        .irq_set_affinity       = intca_gic_set_affinity,
 #endif
@@ -464,3 +460,11 @@ void __init sh73a0_init_irq(void)
        sh73a0_pint1_cascade.handler = sh73a0_pint1_demux;
        setup_irq(gic_spi(34), &sh73a0_pint1_cascade);
 }
+
+#ifdef CONFIG_OF
+void __init sh73a0_init_irq_dt(void)
+{
+       irqchip_init();
+       gic_arch_extn.irq_set_wake = sh73a0_set_wake;
+}
+#endif
index 21e5316d2d881aea42b507334b9fcedd139c760d..40b87aa1d44859e1295451a944254254b77823c7 100644 (file)
@@ -9,7 +9,9 @@
  * for more details.
  */
 #include <linux/console.h>
+#include <linux/suspend.h>
 #include <mach/pm-rmobile.h>
+#include <mach/common.h>
 
 #ifdef CONFIG_PM
 static int r8a7740_pd_a4s_suspend(void)
@@ -58,3 +60,23 @@ void __init r8a7740_init_pm_domains(void)
 }
 
 #endif /* CONFIG_PM */
+
+#ifdef CONFIG_SUSPEND
+static int r8a7740_enter_suspend(suspend_state_t suspend_state)
+{
+       cpu_do_idle();
+       return 0;
+}
+
+static void r8a7740_suspend_init(void)
+{
+       shmobile_suspend_ops.enter = r8a7740_enter_suspend;
+}
+#else
+static void r8a7740_suspend_init(void) {}
+#endif
+
+void __init r8a7740_pm_init(void)
+{
+       r8a7740_suspend_init();
+}
diff --git a/arch/arm/mach-shmobile/pm-sh73a0.c b/arch/arm/mach-shmobile/pm-sh73a0.c
new file mode 100644 (file)
index 0000000..99086e9
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * sh73a0 Power management support
+ *
+ *  Copyright (C) 2012 Bastian Hecht <hechtb+renesas@gmail.com>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+
+#include <linux/suspend.h>
+#include <mach/common.h>
+
+#ifdef CONFIG_SUSPEND
+static int sh73a0_enter_suspend(suspend_state_t suspend_state)
+{
+       cpu_do_idle();
+       return 0;
+}
+
+static void sh73a0_suspend_init(void)
+{
+       shmobile_suspend_ops.enter = sh73a0_enter_suspend;
+}
+#else
+static void sh73a0_suspend_init(void) {}
+#endif
+
+void __init sh73a0_pm_init(void)
+{
+       sh73a0_suspend_init();
+}
index 03c69f9979aa124ee485489d7f37832a65953da2..847567d554879bc31096641011900e55dbad6429 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/serial_sci.h>
 #include <linux/sh_dma.h>
 #include <linux/sh_timer.h>
-#include <linux/dma-mapping.h>
 #include <mach/dma-register.h>
 #include <mach/r8a7740.h>
 #include <mach/pm-rmobile.h>
@@ -262,6 +261,97 @@ static struct platform_device cmt10_device = {
        .num_resources  = ARRAY_SIZE(cmt10_resources),
 };
 
+/* TMU */
+static struct sh_timer_config tmu00_platform_data = {
+       .name = "TMU00",
+       .channel_offset = 0x4,
+       .timer_bit = 0,
+       .clockevent_rating = 200,
+};
+
+static struct resource tmu00_resources[] = {
+       [0] = {
+               .name   = "TMU00",
+               .start  = 0xfff80008,
+               .end    = 0xfff80014 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xe80),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device tmu00_device = {
+       .name           = "sh_tmu",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &tmu00_platform_data,
+       },
+       .resource       = tmu00_resources,
+       .num_resources  = ARRAY_SIZE(tmu00_resources),
+};
+
+static struct sh_timer_config tmu01_platform_data = {
+       .name = "TMU01",
+       .channel_offset = 0x10,
+       .timer_bit = 1,
+       .clocksource_rating = 200,
+};
+
+static struct resource tmu01_resources[] = {
+       [0] = {
+               .name   = "TMU01",
+               .start  = 0xfff80014,
+               .end    = 0xfff80020 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xea0),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device tmu01_device = {
+       .name           = "sh_tmu",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &tmu01_platform_data,
+       },
+       .resource       = tmu01_resources,
+       .num_resources  = ARRAY_SIZE(tmu01_resources),
+};
+
+static struct sh_timer_config tmu02_platform_data = {
+       .name = "TMU02",
+       .channel_offset = 0x1C,
+       .timer_bit = 2,
+       .clocksource_rating = 200,
+};
+
+static struct resource tmu02_resources[] = {
+       [0] = {
+               .name   = "TMU02",
+               .start  = 0xfff80020,
+               .end    = 0xfff8002C - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xec0),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device tmu02_device = {
+       .name           = "sh_tmu",
+       .id             = 2,
+       .dev = {
+               .platform_data  = &tmu02_platform_data,
+       },
+       .resource       = tmu02_resources,
+       .num_resources  = ARRAY_SIZE(tmu02_resources),
+};
+
 static struct platform_device *r8a7740_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
@@ -273,6 +363,9 @@ static struct platform_device *r8a7740_early_devices[] __initdata = {
        &scif7_device,
        &scifb_device,
        &cmt10_device,
+       &tmu00_device,
+       &tmu01_device,
+       &tmu02_device,
 };
 
 /* DMA */
index a181ced09e45a8766df72a259fbda313b7660382..7e87ab3eb8d361842ff599b852886a565c145624 100644 (file)
@@ -66,8 +66,7 @@ static struct plat_sci_port scif0_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(88), gic_spi(88),
-                           gic_spi(88), gic_spi(88) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(88)),
 };
 
 static struct platform_device scif0_device = {
@@ -84,8 +83,7 @@ static struct plat_sci_port scif1_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(89), gic_spi(89),
-                           gic_spi(89), gic_spi(89) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(89)),
 };
 
 static struct platform_device scif1_device = {
@@ -102,8 +100,7 @@ static struct plat_sci_port scif2_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(90), gic_spi(90),
-                           gic_spi(90), gic_spi(90) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(90)),
 };
 
 static struct platform_device scif2_device = {
@@ -120,8 +117,7 @@ static struct plat_sci_port scif3_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(91), gic_spi(91),
-                           gic_spi(91), gic_spi(91) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(91)),
 };
 
 static struct platform_device scif3_device = {
@@ -138,8 +134,7 @@ static struct plat_sci_port scif4_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(92), gic_spi(92),
-                           gic_spi(92), gic_spi(92) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(92)),
 };
 
 static struct platform_device scif4_device = {
@@ -156,8 +151,7 @@ static struct plat_sci_port scif5_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = { gic_spi(93), gic_spi(93),
-                           gic_spi(93), gic_spi(93) },
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(93)),
 };
 
 static struct platform_device scif5_device = {
index 8c2d6424f470a1bc5938163669b082455f5c4ddb..f7ecb0bc1beca876e5f725c819546061c2432743 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/platform_device.h>
+#include <linux/of_platform.h>
 #include <linux/delay.h>
 #include <linux/input.h>
 #include <linux/io.h>
@@ -754,7 +755,7 @@ static struct platform_device pmu_device = {
        .resource       = pmu_resources,
 };
 
-static struct platform_device *sh73a0_early_devices[] __initdata = {
+static struct platform_device *sh73a0_early_devices_dt[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
@@ -765,6 +766,9 @@ static struct platform_device *sh73a0_early_devices[] __initdata = {
        &scif7_device,
        &scif8_device,
        &cmt10_device,
+};
+
+static struct platform_device *sh73a0_early_devices[] __initdata = {
        &tmu00_device,
        &tmu01_device,
 };
@@ -787,6 +791,8 @@ void __init sh73a0_add_standard_devices(void)
        /* Clear software reset bit on SY-DMAC module */
        __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
 
+       platform_add_devices(sh73a0_early_devices_dt,
+                           ARRAY_SIZE(sh73a0_early_devices_dt));
        platform_add_devices(sh73a0_early_devices,
                            ARRAY_SIZE(sh73a0_early_devices));
        platform_add_devices(sh73a0_late_devices,
@@ -805,9 +811,63 @@ void __init sh73a0_earlytimer_init(void)
 
 void __init sh73a0_add_early_devices(void)
 {
+       early_platform_add_devices(sh73a0_early_devices_dt,
+                                  ARRAY_SIZE(sh73a0_early_devices_dt));
        early_platform_add_devices(sh73a0_early_devices,
                                   ARRAY_SIZE(sh73a0_early_devices));
 
        /* setup early console here as well */
        shmobile_setup_console();
 }
+
+#ifdef CONFIG_USE_OF
+
+/* Please note that the clock initialisation shcheme used in
+ * sh73a0_add_early_devices_dt() and sh73a0_add_standard_devices_dt()
+ * does not work with SMP as there is a yet to be resolved lock-up in
+ * workqueue initialisation.
+ *
+ * CONFIG_SMP should be disabled when using this code.
+ */
+
+void __init sh73a0_add_early_devices_dt(void)
+{
+       shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */
+
+       early_platform_add_devices(sh73a0_early_devices_dt,
+                                  ARRAY_SIZE(sh73a0_early_devices_dt));
+
+       /* setup early console here as well */
+       shmobile_setup_console();
+}
+
+static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = {
+       {},
+};
+
+void __init sh73a0_add_standard_devices_dt(void)
+{
+       /* clocks are setup late during boot in the case of DT */
+       sh73a0_clock_init();
+
+       platform_add_devices(sh73a0_early_devices_dt,
+                            ARRAY_SIZE(sh73a0_early_devices_dt));
+       of_platform_populate(NULL, of_default_bus_match_table,
+                            sh73a0_auxdata_lookup, NULL);
+}
+
+static const char *sh73a0_boards_compat_dt[] __initdata = {
+       "renesas,sh73a0",
+       NULL,
+};
+
+DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
+       .map_io         = sh73a0_map_io,
+       .init_early     = sh73a0_add_early_devices_dt,
+       .nr_irqs        = NR_IRQS_LEGACY,
+       .init_irq       = sh73a0_init_irq_dt,
+       .init_machine   = sh73a0_add_standard_devices_dt,
+       .init_time      = shmobile_timer_init,
+       .dt_compat      = sh73a0_boards_compat_dt,
+MACHINE_END
+#endif /* CONFIG_USE_OF */
index 1d564674451d5c887adfffe45546cc1943388f57..a9df53b69ab8ead409fe78352f3c707f6a2ade1f 100644 (file)
@@ -59,16 +59,18 @@ sh7372_do_idle_sysc:
        mcr     p15, 0, r0, c1, c0, 0
        isb
 
+       /*
+        * Clean and invalidate data cache again.
+        */
+       ldr     r1, kernel_flush
+       blx     r1
+
        /* disable L2 cache in the aux control register */
        mrc     p15, 0, r10, c1, c0, 1
        bic     r10, r10, #2
        mcr     p15, 0, r10, c1, c0, 1
+       isb
 
-       /*
-        * Invalidate data cache again.
-        */
-       ldr     r1, kernel_flush
-       blx     r1
        /*
         * The kernel doesn't interwork: v7_flush_dcache_all in particluar will
         * always return in Thumb state when CONFIG_THUMB2_KERNEL is enabled.
index 5c5bcb595350e33f898e5597b6955f55c1be1b8c..acb46a94ccdfb8ec967ed5e52e5a9593f531c414 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/delay.h>
 #include <linux/irqchip/arm-gic.h>
 #include <mach/common.h>
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 #include <mach/sh73a0.h>
 #include <asm/smp_scu.h>
 #define SBAR           IOMEM(0xe6180020)
 #define APARMBAREA     IOMEM(0xe6f10020)
 
+#define PSTR_SHUTDOWN_MODE     3
+
 static void __iomem *scu_base_addr(void)
 {
        return (void __iomem *)0xf0000000;
 }
 
-static DEFINE_SPINLOCK(scu_lock);
-static unsigned long tmp;
-
 #ifdef CONFIG_HAVE_ARM_TWD
 static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);
 void __init sh73a0_register_twd(void)
@@ -52,20 +52,6 @@ void __init sh73a0_register_twd(void)
 }
 #endif
 
-static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)
-{
-       void __iomem *scu_base = scu_base_addr();
-
-       spin_lock(&scu_lock);
-       tmp = __raw_readl(scu_base + 8);
-       tmp &= ~clr;
-       tmp |= set;
-       spin_unlock(&scu_lock);
-
-       /* disable cache coherency after releasing the lock */
-       __raw_writel(tmp, scu_base + 8);
-}
-
 static unsigned int __init sh73a0_get_core_count(void)
 {
        void __iomem *scu_base = scu_base_addr();
@@ -82,9 +68,6 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct
 {
        cpu = cpu_logical_map(cpu);
 
-       /* enable cache coherency */
-       modify_scu_cpu_psr(0, 3 << (cpu * 8));
-
        if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3)
                __raw_writel(1 << cpu, WUPCR);  /* wake up */
        else
@@ -95,16 +78,14 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct
 
 static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)
 {
-       int cpu = cpu_logical_map(0);
-
        scu_enable(scu_base_addr());
 
-       /* Map the reset vector (in headsmp.S) */
+       /* Map the reset vector (in headsmp-sh73a0.S) */
        __raw_writel(0, APARMBAREA);      /* 4k */
-       __raw_writel(__pa(shmobile_secondary_vector), SBAR);
+       __raw_writel(__pa(sh73a0_secondary_vector), SBAR);
 
-       /* enable cache coherency on CPU0 */
-       modify_scu_cpu_psr(0, 3 << (cpu * 8));
+       /* enable cache coherency on booting CPU */
+       scu_power_mode(scu_base_addr(), SCU_PM_NORMAL);
 }
 
 static void __init sh73a0_smp_init_cpus(void)
@@ -114,16 +95,20 @@ static void __init sh73a0_smp_init_cpus(void)
        shmobile_smp_init_cpus(ncores);
 }
 
-static int __maybe_unused sh73a0_cpu_kill(unsigned int cpu)
+#ifdef CONFIG_HOTPLUG_CPU
+static int sh73a0_cpu_kill(unsigned int cpu)
 {
+
        int k;
+       u32 pstr;
 
-       /* this function is running on another CPU than the offline target,
-        * here we need wait for shutdown code in platform_cpu_die() to
-        * finish before asking SoC-specific code to power off the CPU core.
+       /*
+        * wait until the power status register confirms the shutdown of the
+        * offline target
         */
        for (k = 0; k < 1000; k++) {
-               if (shmobile_cpu_is_dead(cpu))
+               pstr = (__raw_readl(PSTR) >> (4 * cpu)) & 3;
+               if (pstr == PSTR_SHUTDOWN_MODE)
                        return 1;
 
                mdelay(1);
@@ -132,6 +117,23 @@ static int __maybe_unused sh73a0_cpu_kill(unsigned int cpu)
        return 0;
 }
 
+static void sh73a0_cpu_die(unsigned int cpu)
+{
+       /*
+        * The ARM MPcore does not issue a cache coherency request for the L1
+        * cache when powering off single CPUs. We must take care of this and
+        * further caches.
+        */
+       dsb();
+       flush_cache_all();
+
+       /* Set power off mode. This takes the CPU out of the MP cluster */
+       scu_power_mode(scu_base_addr(), SCU_PM_POWEROFF);
+
+       /* Enter shutdown mode */
+       cpu_do_idle();
+}
+#endif /* CONFIG_HOTPLUG_CPU */
 
 struct smp_operations sh73a0_smp_ops __initdata = {
        .smp_init_cpus          = sh73a0_smp_init_cpus,
@@ -140,7 +142,7 @@ struct smp_operations sh73a0_smp_ops __initdata = {
        .smp_boot_secondary     = sh73a0_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_kill               = sh73a0_cpu_kill,
-       .cpu_die                = shmobile_cpu_die,
-       .cpu_disable            = shmobile_cpu_disable,
+       .cpu_die                = sh73a0_cpu_die,
+       .cpu_disable            = shmobile_cpu_disable_any,
 #endif
 };
index b442f15fd01a8b7d49b14337c68896486da66cce..bde8197c8db8dfc5adc209b3309025c921b399db 100644 (file)
@@ -4,11 +4,12 @@ comment "NVIDIA Tegra options"
 
 config ARCH_TEGRA_2x_SOC
        bool "Enable support for Tegra20 family"
+       select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP
        select ARCH_REQUIRE_GPIOLIB
        select ARM_ERRATA_720789
-       select ARM_ERRATA_742230
+       select ARM_ERRATA_742230 if SMP
        select ARM_ERRATA_751472
-       select ARM_ERRATA_754327
+       select ARM_ERRATA_754327 if SMP
        select ARM_ERRATA_764369 if SMP
        select ARM_GIC
        select CPU_FREQ_TABLE if CPU_FREQ
@@ -44,6 +45,18 @@ config ARCH_TEGRA_3x_SOC
          Support for NVIDIA Tegra T30 processor family, based on the
          ARM CortexA9MP CPU and the ARM PL310 L2 cache controller
 
+config ARCH_TEGRA_114_SOC
+       bool "Enable support for Tegra114 family"
+       select ARM_GIC
+       select CPU_V7
+       select ARM_L1_CACHE_SHIFT_6
+       select ARM_ARCH_TIMER
+       select PINCTRL
+       select PINCTRL_TEGRA114
+       help
+         Support for NVIDIA Tegra T114 processor family, based on the
+         ARM CortexA15MP CPU
+
 config TEGRA_PCI
        bool "PCI Express support"
        depends on ARCH_TEGRA_2x_SOC
index 0979e8bba78ae1c2d632ecd07f0092cce6f64a98..f6b46ae2b7f868829310fa22295d251eda20b95b 100644 (file)
@@ -1,39 +1,38 @@
 obj-y                                   += common.o
 obj-y                                   += io.o
 obj-y                                   += irq.o
-obj-y                                   += clock.o
-obj-y                                   += timer.o
 obj-y                                  += fuse.o
 obj-y                                  += pmc.o
 obj-y                                  += flowctrl.o
 obj-y                                  += powergate.o
 obj-y                                  += apbio.o
 obj-y                                  += pm.o
+obj-y                                  += reset.o
+obj-y                                  += reset-handler.o
+obj-y                                  += sleep.o
 obj-$(CONFIG_CPU_IDLE)                 += cpuidle.o
-obj-$(CONFIG_CPU_IDLE)                 += sleep.o
-obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra20_clocks.o
-obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra20_clocks_data.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += tegra20_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += tegra2_emc.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += sleep-tegra20.o
 ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += cpuidle-tegra20.o
 endif
-obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += tegra30_clocks.o
-obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += tegra30_clocks_data.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += tegra30_speedo.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += sleep-tegra30.o
 ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += cpuidle-tegra30.o
 endif
 obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
-obj-$(CONFIG_SMP)                       += reset.o
 obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
 obj-$(CONFIG_CPU_FREQ)                  += cpu-tegra.o
 obj-$(CONFIG_TEGRA_PCI)                        += pcie.o
 
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += board-dt-tegra20.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += board-dt-tegra30.o
+obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += board-dt-tegra114.o
+ifeq ($(CONFIG_CPU_IDLE),y)
+obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += cpuidle-tegra114.o
+endif
 
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += board-harmony-pcie.o
 
index d091675ba376bd8a2dd23c0ae1b4c4578e874b95..d7aa52ea6cfcb7fa92f98a703b5b17914585fa36 100644 (file)
@@ -38,7 +38,7 @@ static void tegra_apb_writel_direct(u32 value, unsigned long offset);
 static struct dma_chan *tegra_apb_dma_chan;
 static struct dma_slave_config dma_sconfig;
 
-bool tegra_apb_dma_init(void)
+static bool tegra_apb_dma_init(void)
 {
        dma_cap_mask_t mask;
 
diff --git a/arch/arm/mach-tegra/board-dt-tegra114.c b/arch/arm/mach-tegra/board-dt-tegra114.c
new file mode 100644 (file)
index 0000000..3ed17ce
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * NVIDIA Tegra114 device tree board support
+ *
+ * Copyright (C) 2013 NVIDIA Corporation
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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/of.h>
+#include <linux/of_platform.h>
+#include <linux/clocksource.h>
+
+#include <asm/mach/arch.h>
+#include <asm/hardware/gic.h>
+
+#include "board.h"
+#include "common.h"
+
+static void __init tegra114_dt_init(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static const char * const tegra114_dt_board_compat[] = {
+       "nvidia,tegra114",
+       NULL,
+};
+
+DT_MACHINE_START(TEGRA114_DT, "NVIDIA Tegra114 (Flattened Device Tree)")
+       .smp            = smp_ops(tegra_smp_ops),
+       .map_io         = tegra_map_common_io,
+       .init_early     = tegra30_init_early,
+       .init_irq       = tegra_dt_init_irq,
+       .handle_irq     = gic_handle_irq,
+       .init_time      = clocksource_of_init,
+       .init_machine   = tegra114_dt_init,
+       .init_late      = tegra_init_late,
+       .restart        = tegra_assert_system_reset,
+       .dt_compat      = tegra114_dt_board_compat,
+MACHINE_END
index 5ed81bab2d4bb4eb6aaf561200c400cc8d1cc506..a0edf2510280b60e559c50dce3731927a11de635 100644 (file)
@@ -15,6 +15,7 @@
  *
  */
 
+#include <linux/clocksource.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <asm/setup.h>
 
 #include "board.h"
-#include "clock.h"
 #include "common.h"
 #include "iomap.h"
 
-struct tegra_ehci_platform_data tegra_ehci1_pdata = {
+static struct tegra_ehci_platform_data tegra_ehci1_pdata = {
        .operating_mode = TEGRA_USB_OTG,
        .power_down_on_bus_suspend = 1,
        .vbus_gpio = -1,
 };
 
-struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {
+static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {
        .reset_gpio = -1,
        .clk = "cdev2",
 };
 
-struct tegra_ehci_platform_data tegra_ehci2_pdata = {
+static struct tegra_ehci_platform_data tegra_ehci2_pdata = {
        .phy_config = &tegra_ehci2_ulpi_phy_config,
        .operating_mode = TEGRA_USB_HOST,
        .power_down_on_bus_suspend = 1,
        .vbus_gpio = -1,
 };
 
-struct tegra_ehci_platform_data tegra_ehci3_pdata = {
+static struct tegra_ehci_platform_data tegra_ehci3_pdata = {
        .operating_mode = TEGRA_USB_HOST,
        .power_down_on_bus_suspend = 1,
        .vbus_gpio = -1,
 };
 
-struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC1_BASE, "sdhci-tegra.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC2_BASE, "sdhci-tegra.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC3_BASE, "sdhci-tegra.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC4_BASE, "sdhci-tegra.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C_BASE, "tegra-i2c.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C2_BASE, "tegra-i2c.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C3_BASE, "tegra-i2c.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c-dvc", TEGRA_DVC_BASE, "tegra-i2c.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra20-i2s.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S2_BASE, "tegra20-i2s.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-das", TEGRA_APB_MISC_DAS_BASE, "tegra20-das", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB_BASE, "tegra-ehci.0",
+static struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
+       OF_DEV_AUXDATA("nvidia,tegra20-ehci", 0xC5000000, "tegra-ehci.0",
                       &tegra_ehci1_pdata),
-       OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB2_BASE, "tegra-ehci.1",
+       OF_DEV_AUXDATA("nvidia,tegra20-ehci", 0xC5004000, "tegra-ehci.1",
                       &tegra_ehci2_pdata),
-       OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2",
+       OF_DEV_AUXDATA("nvidia,tegra20-ehci", 0xC5008000, "tegra-ehci.2",
                       &tegra_ehci3_pdata),
-       OF_DEV_AUXDATA("nvidia,tegra20-apbdma", TEGRA_APB_DMA_BASE, "tegra-apbdma", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-pwm", TEGRA_PWFM_BASE, "tegra-pwm", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sflash", 0x7000c380, "spi", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-slink", 0x7000D400, "spi_tegra.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-slink", 0x7000D600, "spi_tegra.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-slink", 0x7000D800, "spi_tegra.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-slink", 0x7000DA00, "spi_tegra.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-host1x", 0x50000000, "host1x", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-dc", 0x54200000, "tegradc.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-dc", 0x54240000, "tegradc.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-hdmi", 0x54280000, "hdmi", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-dsi", 0x54300000, "dsi", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-tvo", 0x542c0000, "tvo", NULL),
        {}
 };
 
-static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "uarta",      "pll_p",        216000000,      true },
-       { "uartd",      "pll_p",        216000000,      true },
-       { "usbd",       "clk_m",        12000000,       false },
-       { "usb2",       "clk_m",        12000000,       false },
-       { "usb3",       "clk_m",        12000000,       false },
-       { "pll_a",      "pll_p_out1",   56448000,       true },
-       { "pll_a_out0", "pll_a",        11289600,       true },
-       { "cdev1",      NULL,           0,              true },
-       { "blink",      "clk_32k",      32768,          true },
-       { "i2s1",       "pll_a_out0",   11289600,       false},
-       { "i2s2",       "pll_a_out0",   11289600,       false},
-       { "sdmmc1",     "pll_p",        48000000,       false},
-       { "sdmmc3",     "pll_p",        48000000,       false},
-       { "sdmmc4",     "pll_p",        48000000,       false},
-       { "spi",        "pll_p",        20000000,       false },
-       { "sbc1",       "pll_p",        100000000,      false },
-       { "sbc2",       "pll_p",        100000000,      false },
-       { "sbc3",       "pll_p",        100000000,      false },
-       { "sbc4",       "pll_p",        100000000,      false },
-       { "host1x",     "pll_c",        150000000,      false },
-       { "disp1",      "pll_p",        600000000,      false },
-       { "disp2",      "pll_p",        600000000,      false },
-       { NULL,         NULL,           0,              0},
-};
-
 static void __init tegra_dt_init(void)
 {
-       tegra_clk_init_from_table(tegra_dt_clk_init_table);
-
        /*
         * Finished with the static registrations now; fill in the missing
         * devices
@@ -200,7 +147,7 @@ DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)")
        .smp            = smp_ops(tegra_smp_ops),
        .init_early     = tegra20_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra_dt_init,
        .init_late      = tegra_dt_init_late,
        .restart        = tegra_assert_system_reset,
index 12dc2ddeca640914c694d92a0735813de37c6591..bf68567e549d6e011d266eca8e11efe88942cf1e 100644 (file)
@@ -23,6 +23,7 @@
  *
  */
 
+#include <linux/clocksource.h>
 #include <linux/kernel.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <asm/mach/arch.h>
 
 #include "board.h"
-#include "clock.h"
 #include "common.h"
 #include "iomap.h"
 
-struct of_dev_auxdata tegra30_auxdata_lookup[] __initdata = {
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", 0x78000000, "sdhci-tegra.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", 0x78000200, "sdhci-tegra.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", 0x78000400, "sdhci-tegra.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-sdhci", 0x78000600, "sdhci-tegra.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C000, "tegra-i2c.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C400, "tegra-i2c.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C500, "tegra-i2c.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000C700, "tegra-i2c.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra20-i2c", 0x7000D000, "tegra-i2c.4", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-ahub", 0x70080000, "tegra30-ahub", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-apbdma", 0x6000a000, "tegra-apbdma", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-pwm", TEGRA_PWFM_BASE, "tegra-pwm", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-slink", 0x7000D400, "spi_tegra.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-slink", 0x7000D600, "spi_tegra.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-slink", 0x7000D800, "spi_tegra.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-slink", 0x7000DA00, "spi_tegra.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-slink", 0x7000DC00, "spi_tegra.4", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-slink", 0x7000DE00, "spi_tegra.5", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-host1x", 0x50000000, "host1x", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-dc", 0x54200000, "tegradc.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-dc", 0x54240000, "tegradc.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-hdmi", 0x54280000, "hdmi", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-dsi", 0x54300000, "dsi", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-tvo", 0x542c0000, "tvo", NULL),
-       {}
-};
-
-static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "uarta",      "pll_p",        408000000,      true },
-       { "pll_a",      "pll_p_out1",   564480000,      true },
-       { "pll_a_out0", "pll_a",        11289600,       true },
-       { "extern1",    "pll_a_out0",   0,              true },
-       { "clk_out_1",  "extern1",      0,              true },
-       { "blink",      "clk_32k",      32768,          true },
-       { "i2s0",       "pll_a_out0",   11289600,       false},
-       { "i2s1",       "pll_a_out0",   11289600,       false},
-       { "i2s2",       "pll_a_out0",   11289600,       false},
-       { "i2s3",       "pll_a_out0",   11289600,       false},
-       { "i2s4",       "pll_a_out0",   11289600,       false},
-       { "sdmmc1",     "pll_p",        48000000,       false},
-       { "sdmmc3",     "pll_p",        48000000,       false},
-       { "sdmmc4",     "pll_p",        48000000,       false},
-       { "sbc1",       "pll_p",        100000000,      false},
-       { "sbc2",       "pll_p",        100000000,      false},
-       { "sbc3",       "pll_p",        100000000,      false},
-       { "sbc4",       "pll_p",        100000000,      false},
-       { "sbc5",       "pll_p",        100000000,      false},
-       { "sbc6",       "pll_p",        100000000,      false},
-       { "host1x",     "pll_c",        150000000,      false},
-       { "disp1",      "pll_p",        600000000,      false},
-       { "disp2",      "pll_p",        600000000,      false},
-       { NULL,         NULL,           0,              0},
-};
-
 static void __init tegra30_dt_init(void)
 {
-       tegra_clk_init_from_table(tegra_dt_clk_init_table);
-
-       of_platform_populate(NULL, of_default_bus_match_table,
-                               tegra30_auxdata_lookup, NULL);
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
 static const char *tegra30_dt_board_compat[] = {
@@ -111,7 +52,7 @@ DT_MACHINE_START(TEGRA30_DT, "NVIDIA Tegra30 (Flattened Device Tree)")
        .map_io         = tegra_map_common_io,
        .init_early     = tegra30_init_early,
        .init_irq       = tegra_dt_init_irq,
-       .init_time      = tegra_init_timer,
+       .init_time      = clocksource_of_init,
        .init_machine   = tegra30_dt_init,
        .init_late      = tegra_init_late,
        .restart        = tegra_assert_system_reset,
index 744cdd246f6a26ccb00b52f7c16811548f3f585a..da8f5a3c424023b9754b99f1b4b0c647df01c879 100644 (file)
@@ -55,5 +55,4 @@ static inline int harmony_pcie_init(void) { return 0; }
 
 void __init tegra_paz00_wifikill_init(void);
 
-extern void tegra_init_timer(void);
 #endif
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
deleted file mode 100644 (file)
index 867bf8b..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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/clk.h>
-#include <linux/clkdev.h>
-#include <linux/init.h>
-#include <linux/list.h>
-#include <linux/module.h>
-#include <linux/sched.h>
-#include <linux/seq_file.h>
-#include <linux/slab.h>
-
-#include "board.h"
-#include "clock.h"
-#include "tegra_cpu_car.h"
-
-/* Global data of Tegra CPU CAR ops */
-struct tegra_cpu_car_ops *tegra_cpu_car_ops;
-
-/*
- * Locking:
- *
- * An additional mutex, clock_list_lock, is used to protect the list of all
- * clocks.
- *
- */
-static DEFINE_MUTEX(clock_list_lock);
-static LIST_HEAD(clocks);
-
-void tegra_clk_add(struct clk *clk)
-{
-       struct clk_tegra *c = to_clk_tegra(__clk_get_hw(clk));
-
-       mutex_lock(&clock_list_lock);
-       list_add(&c->node, &clocks);
-       mutex_unlock(&clock_list_lock);
-}
-
-struct clk *tegra_get_clock_by_name(const char *name)
-{
-       struct clk_tegra *c;
-       struct clk *ret = NULL;
-       mutex_lock(&clock_list_lock);
-       list_for_each_entry(c, &clocks, node) {
-               if (strcmp(__clk_get_name(c->hw.clk), name) == 0) {
-                       ret = c->hw.clk;
-                       break;
-               }
-       }
-       mutex_unlock(&clock_list_lock);
-       return ret;
-}
-
-static int tegra_clk_init_one_from_table(struct tegra_clk_init_table *table)
-{
-       struct clk *c;
-       struct clk *p;
-       struct clk *parent;
-
-       int ret = 0;
-
-       c = tegra_get_clock_by_name(table->name);
-
-       if (!c) {
-               pr_warn("Unable to initialize clock %s\n",
-                       table->name);
-               return -ENODEV;
-       }
-
-       parent = clk_get_parent(c);
-
-       if (table->parent) {
-               p = tegra_get_clock_by_name(table->parent);
-               if (!p) {
-                       pr_warn("Unable to find parent %s of clock %s\n",
-                               table->parent, table->name);
-                       return -ENODEV;
-               }
-
-               if (parent != p) {
-                       ret = clk_set_parent(c, p);
-                       if (ret) {
-                               pr_warn("Unable to set parent %s of clock %s: %d\n",
-                                       table->parent, table->name, ret);
-                               return -EINVAL;
-                       }
-               }
-       }
-
-       if (table->rate && table->rate != clk_get_rate(c)) {
-               ret = clk_set_rate(c, table->rate);
-               if (ret) {
-                       pr_warn("Unable to set clock %s to rate %lu: %d\n",
-                               table->name, table->rate, ret);
-                       return -EINVAL;
-               }
-       }
-
-       if (table->enabled) {
-               ret = clk_prepare_enable(c);
-               if (ret) {
-                       pr_warn("Unable to enable clock %s: %d\n",
-                               table->name, ret);
-                       return -EINVAL;
-               }
-       }
-
-       return 0;
-}
-
-void tegra_clk_init_from_table(struct tegra_clk_init_table *table)
-{
-       for (; table->name; table++)
-               tegra_clk_init_one_from_table(table);
-}
-
-void tegra_periph_reset_deassert(struct clk *c)
-{
-       struct clk_tegra *clk = to_clk_tegra(__clk_get_hw(c));
-       BUG_ON(!clk->reset);
-       clk->reset(__clk_get_hw(c), false);
-}
-EXPORT_SYMBOL(tegra_periph_reset_deassert);
-
-void tegra_periph_reset_assert(struct clk *c)
-{
-       struct clk_tegra *clk = to_clk_tegra(__clk_get_hw(c));
-       BUG_ON(!clk->reset);
-       clk->reset(__clk_get_hw(c), true);
-}
-EXPORT_SYMBOL(tegra_periph_reset_assert);
-
-/* Several extended clock configuration bits (e.g., clock routing, clock
- * phase control) are included in PLL and peripheral clock source
- * registers. */
-int tegra_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
-{
-       int ret = 0;
-       struct clk_tegra *clk = to_clk_tegra(__clk_get_hw(c));
-
-       if (!clk->clk_cfg_ex) {
-               ret = -ENOSYS;
-               goto out;
-       }
-       ret = clk->clk_cfg_ex(__clk_get_hw(c), p, setting);
-
-out:
-       return ret;
-}
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h
deleted file mode 100644 (file)
index 2aa37f5..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * arch/arm/mach-tegra/include/mach/clock.h
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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_TEGRA_CLOCK_H
-#define __MACH_TEGRA_CLOCK_H
-
-#include <linux/clk-provider.h>
-#include <linux/clkdev.h>
-#include <linux/list.h>
-
-#include <mach/clk.h>
-
-#define DIV_BUS                        (1 << 0)
-#define DIV_U71                        (1 << 1)
-#define DIV_U71_FIXED          (1 << 2)
-#define DIV_2                  (1 << 3)
-#define DIV_U16                        (1 << 4)
-#define PLL_FIXED              (1 << 5)
-#define PLL_HAS_CPCON          (1 << 6)
-#define MUX                    (1 << 7)
-#define PLLD                   (1 << 8)
-#define PERIPH_NO_RESET                (1 << 9)
-#define PERIPH_NO_ENB          (1 << 10)
-#define PERIPH_EMC_ENB         (1 << 11)
-#define PERIPH_MANUAL_RESET    (1 << 12)
-#define PLL_ALT_MISC_REG       (1 << 13)
-#define PLLU                   (1 << 14)
-#define PLLX                    (1 << 15)
-#define MUX_PWM                 (1 << 16)
-#define MUX8                    (1 << 17)
-#define DIV_U71_UART            (1 << 18)
-#define MUX_CLK_OUT             (1 << 19)
-#define PLLM                    (1 << 20)
-#define DIV_U71_INT             (1 << 21)
-#define DIV_U71_IDLE            (1 << 22)
-#define ENABLE_ON_INIT         (1 << 28)
-#define PERIPH_ON_APB           (1 << 29)
-
-struct clk_tegra;
-#define to_clk_tegra(_hw) container_of(_hw, struct clk_tegra, hw)
-
-struct clk_mux_sel {
-       struct clk      *input;
-       u32             value;
-};
-
-struct clk_pll_freq_table {
-       unsigned long   input_rate;
-       unsigned long   output_rate;
-       u16             n;
-       u16             m;
-       u8              p;
-       u8              cpcon;
-};
-
-enum clk_state {
-       UNINITIALIZED = 0,
-       ON,
-       OFF,
-};
-
-struct clk_tegra {
-       /* node for master clocks list */
-       struct list_head        node;   /* node for list of all clocks */
-       struct clk_lookup       lookup;
-       struct clk_hw           hw;
-
-       bool                    set;
-       unsigned long           fixed_rate;
-       unsigned long           max_rate;
-       unsigned long           min_rate;
-       u32                     flags;
-       const char              *name;
-
-       enum clk_state          state;
-       u32                     div;
-       u32                     mul;
-
-       u32                             reg;
-       u32                             reg_shift;
-
-       struct list_head                shared_bus_list;
-
-       union {
-               struct {
-                       unsigned int                    clk_num;
-               } periph;
-               struct {
-                       unsigned long                   input_min;
-                       unsigned long                   input_max;
-                       unsigned long                   cf_min;
-                       unsigned long                   cf_max;
-                       unsigned long                   vco_min;
-                       unsigned long                   vco_max;
-                       const struct clk_pll_freq_table *freq_table;
-                       int                             lock_delay;
-                       unsigned long                   fixed_rate;
-               } pll;
-               struct {
-                       u32                             sel;
-                       u32                             reg_mask;
-               } mux;
-               struct {
-                       struct clk                      *main;
-                       struct clk                      *backup;
-               } cpu;
-               struct {
-                       struct list_head                node;
-                       bool                            enabled;
-                       unsigned long                   rate;
-               } shared_bus_user;
-       } u;
-
-       void (*reset)(struct clk_hw *, bool);
-       int (*clk_cfg_ex)(struct clk_hw *, enum tegra_clk_ex_param, u32);
-};
-
-struct clk_duplicate {
-       const char *name;
-       struct clk_lookup lookup;
-};
-
-struct tegra_clk_init_table {
-       const char *name;
-       const char *parent;
-       unsigned long rate;
-       bool enabled;
-};
-
-void tegra_clk_add(struct clk *c);
-void tegra2_init_clocks(void);
-void tegra30_init_clocks(void);
-struct clk *tegra_get_clock_by_name(const char *name);
-void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
-
-#endif
index 3599959517b3059b63277163d5f6ab8e7c67b854..46c071861c4eab9c2f173adc6f9ef8efe3914935 100644 (file)
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/irqchip.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/hardware/cache-l2x0.h>
 
 #include <mach/powergate.h>
 
 #include "board.h"
-#include "clock.h"
 #include "common.h"
 #include "fuse.h"
 #include "iomap.h"
@@ -36,6 +36,7 @@
 #include "apbio.h"
 #include "sleep.h"
 #include "pm.h"
+#include "reset.h"
 
 /*
  * Storage for debug-macro.S's state.
@@ -58,6 +59,7 @@ u32 tegra_uart_config[4] = {
 #ifdef CONFIG_OF
 void __init tegra_dt_init_irq(void)
 {
+       tegra_clocks_init();
        tegra_init_irq();
        irqchip_init();
 }
@@ -73,43 +75,6 @@ void tegra_assert_system_reset(char mode, const char *cmd)
        writel_relaxed(reg, reset);
 }
 
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
-static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "clk_m",      NULL,           0,              true },
-       { "pll_p",      "clk_m",        216000000,      true },
-       { "pll_p_out1", "pll_p",        28800000,       true },
-       { "pll_p_out2", "pll_p",        48000000,       true },
-       { "pll_p_out3", "pll_p",        72000000,       true },
-       { "pll_p_out4", "pll_p",        24000000,       true },
-       { "pll_c",      "clk_m",        600000000,      true },
-       { "pll_c_out1", "pll_c",        120000000,      true },
-       { "sclk",       "pll_c_out1",   120000000,      true },
-       { "hclk",       "sclk",         120000000,      true },
-       { "pclk",       "hclk",         60000000,       true },
-       { "csite",      NULL,           0,              true },
-       { "emc",        NULL,           0,              true },
-       { "cpu",        NULL,           0,              true },
-       { NULL,         NULL,           0,              0},
-};
-#endif
-
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
-static __initdata struct tegra_clk_init_table tegra30_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "clk_m",      NULL,           0,              true },
-       { "pll_p",      "pll_ref",      408000000,      true },
-       { "pll_p_out1", "pll_p",        9600000,        true },
-       { "pll_p_out4", "pll_p",        102000000,      true },
-       { "sclk",       "pll_p_out4",   102000000,      true },
-       { "hclk",       "sclk",         102000000,      true },
-       { "pclk",       "hclk",         51000000,       true },
-       { "csite",      NULL,           0,              true },
-       { NULL,         NULL,           0,              0},
-};
-#endif
-
-
 static void __init tegra_init_cache(void)
 {
 #ifdef CONFIG_CACHE_L2X0
@@ -131,10 +96,9 @@ static void __init tegra_init_cache(void)
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
 void __init tegra20_init_early(void)
 {
+       tegra_cpu_reset_handler_init();
        tegra_apb_io_init();
        tegra_init_fuse();
-       tegra2_init_clocks();
-       tegra_clk_init_from_table(tegra20_clk_init_table);
        tegra_init_cache();
        tegra_pmc_init();
        tegra_powergate_init();
@@ -144,10 +108,9 @@ void __init tegra20_init_early(void)
 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
 void __init tegra30_init_early(void)
 {
+       tegra_cpu_reset_handler_init();
        tegra_apb_io_init();
        tegra_init_fuse();
-       tegra30_init_clocks();
-       tegra_clk_init_from_table(tegra30_clk_init_table);
        tegra_init_cache();
        tegra_pmc_init();
        tegra_powergate_init();
index 02f71b4f1e51d54eda5a8ccaba52c666f887898c..32f8eb3fe344958d395d89b17785b38f17f06673 100644 (file)
@@ -1,4 +1,5 @@
 extern struct smp_operations tegra_smp_ops;
 
+extern int tegra_cpu_kill(unsigned int cpu);
 extern void tegra_cpu_die(unsigned int cpu);
 extern int tegra_cpu_disable(unsigned int cpu);
index a74d3c7d2e26836beac265f15db1c3c69b1575c7..ebffed67e2f5b6a60e0d83e6d4a7b097e9b56cbd 100644 (file)
@@ -214,24 +214,6 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
        if (policy->cpu >= NUM_CPUS)
                return -EINVAL;
 
-       cpu_clk = clk_get_sys(NULL, "cpu");
-       if (IS_ERR(cpu_clk))
-               return PTR_ERR(cpu_clk);
-
-       pll_x_clk = clk_get_sys(NULL, "pll_x");
-       if (IS_ERR(pll_x_clk))
-               return PTR_ERR(pll_x_clk);
-
-       pll_p_clk = clk_get_sys(NULL, "pll_p");
-       if (IS_ERR(pll_p_clk))
-               return PTR_ERR(pll_p_clk);
-
-       emc_clk = clk_get_sys("cpu", "emc");
-       if (IS_ERR(emc_clk)) {
-               clk_put(cpu_clk);
-               return PTR_ERR(emc_clk);
-       }
-
        clk_prepare_enable(emc_clk);
        clk_prepare_enable(cpu_clk);
 
@@ -256,8 +238,6 @@ static int tegra_cpu_exit(struct cpufreq_policy *policy)
 {
        cpufreq_frequency_table_cpuinfo(policy, freq_table);
        clk_disable_unprepare(emc_clk);
-       clk_put(emc_clk);
-       clk_put(cpu_clk);
        return 0;
 }
 
@@ -278,12 +258,32 @@ static struct cpufreq_driver tegra_cpufreq_driver = {
 
 static int __init tegra_cpufreq_init(void)
 {
+       cpu_clk = clk_get_sys(NULL, "cpu");
+       if (IS_ERR(cpu_clk))
+               return PTR_ERR(cpu_clk);
+
+       pll_x_clk = clk_get_sys(NULL, "pll_x");
+       if (IS_ERR(pll_x_clk))
+               return PTR_ERR(pll_x_clk);
+
+       pll_p_clk = clk_get_sys(NULL, "pll_p_cclk");
+       if (IS_ERR(pll_p_clk))
+               return PTR_ERR(pll_p_clk);
+
+       emc_clk = clk_get_sys("cpu", "emc");
+       if (IS_ERR(emc_clk)) {
+               clk_put(cpu_clk);
+               return PTR_ERR(emc_clk);
+       }
+
        return cpufreq_register_driver(&tegra_cpufreq_driver);
 }
 
 static void __exit tegra_cpufreq_exit(void)
 {
         cpufreq_unregister_driver(&tegra_cpufreq_driver);
+       clk_put(emc_clk);
+       clk_put(cpu_clk);
 }
 
 
diff --git a/arch/arm/mach-tegra/cpuidle-tegra114.c b/arch/arm/mach-tegra/cpuidle-tegra114.c
new file mode 100644 (file)
index 0000000..0f4e8c4
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2013, NVIDIA Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/cpuidle.h>
+
+#include <asm/cpuidle.h>
+
+static struct cpuidle_driver tegra_idle_driver = {
+       .name = "tegra_idle",
+       .owner = THIS_MODULE,
+       .en_core_tk_irqen = 1,
+       .state_count = 1,
+       .states = {
+               [0] = ARM_CPUIDLE_WFI_STATE_PWR(600),
+       },
+};
+
+static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device);
+
+int __init tegra114_cpuidle_init(void)
+{
+       int ret;
+       unsigned int cpu;
+       struct cpuidle_device *dev;
+       struct cpuidle_driver *drv = &tegra_idle_driver;
+
+       ret = cpuidle_register_driver(&tegra_idle_driver);
+       if (ret) {
+               pr_err("CPUidle driver registration failed\n");
+               return ret;
+       }
+
+       for_each_possible_cpu(cpu) {
+               dev = &per_cpu(tegra_idle_device, cpu);
+               dev->cpu = cpu;
+
+               dev->state_count = drv->state_count;
+               ret = cpuidle_register_device(dev);
+               if (ret) {
+                       pr_err("CPU%u: CPUidle device registration failed\n",
+                               cpu);
+                       return ret;
+               }
+       }
+       return 0;
+}
index d32e8b0dbd4f30976fbbbec591b9698b7e60dd80..825ced4f7a404a48adc8861e35930a024aff30b2 100644 (file)
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/cpuidle.h>
+#include <linux/cpu_pm.h>
+#include <linux/clockchips.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/cpuidle.h>
+#include <asm/proc-fns.h>
+#include <asm/suspend.h>
+#include <asm/smp_plat.h>
+
+#include "pm.h"
+#include "sleep.h"
+#include "iomap.h"
+#include "irq.h"
+#include "flowctrl.h"
+
+#ifdef CONFIG_PM_SLEEP
+static bool abort_flag;
+static atomic_t abort_barrier;
+static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
+                                   struct cpuidle_driver *drv,
+                                   int index);
+#endif
+
+static struct cpuidle_state tegra_idle_states[] = {
+       [0] = ARM_CPUIDLE_WFI_STATE_PWR(600),
+#ifdef CONFIG_PM_SLEEP
+       [1] = {
+               .enter                  = tegra20_idle_lp2_coupled,
+               .exit_latency           = 5000,
+               .target_residency       = 10000,
+               .power_usage            = 0,
+               .flags                  = CPUIDLE_FLAG_TIME_VALID |
+                                         CPUIDLE_FLAG_COUPLED,
+               .name                   = "powered-down",
+               .desc                   = "CPU power gated",
+       },
+#endif
+};
 
 static struct cpuidle_driver tegra_idle_driver = {
        .name = "tegra_idle",
        .owner = THIS_MODULE,
        .en_core_tk_irqen = 1,
-       .state_count = 1,
-       .states = {
-               [0] = ARM_CPUIDLE_WFI_STATE_PWR(600),
-       },
 };
 
 static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device);
 
+#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_SMP
+static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
+
+static int tegra20_reset_sleeping_cpu_1(void)
+{
+       int ret = 0;
+
+       tegra_pen_lock();
+
+       if (readl(pmc + PMC_SCRATCH41) == CPU_RESETTABLE)
+               tegra20_cpu_shutdown(1);
+       else
+               ret = -EINVAL;
+
+       tegra_pen_unlock();
+
+       return ret;
+}
+
+static void tegra20_wake_cpu1_from_reset(void)
+{
+       tegra_pen_lock();
+
+       tegra20_cpu_clear_resettable();
+
+       /* enable cpu clock on cpu */
+       tegra_enable_cpu_clock(1);
+
+       /* take the CPU out of reset */
+       tegra_cpu_out_of_reset(1);
+
+       /* unhalt the cpu */
+       flowctrl_write_cpu_halt(1, 0);
+
+       tegra_pen_unlock();
+}
+
+static int tegra20_reset_cpu_1(void)
+{
+       if (!cpu_online(1) || !tegra20_reset_sleeping_cpu_1())
+               return 0;
+
+       tegra20_wake_cpu1_from_reset();
+       return -EBUSY;
+}
+#else
+static inline void tegra20_wake_cpu1_from_reset(void)
+{
+}
+
+static inline int tegra20_reset_cpu_1(void)
+{
+       return 0;
+}
+#endif
+
+static bool tegra20_cpu_cluster_power_down(struct cpuidle_device *dev,
+                                          struct cpuidle_driver *drv,
+                                          int index)
+{
+       struct cpuidle_state *state = &drv->states[index];
+       u32 cpu_on_time = state->exit_latency;
+       u32 cpu_off_time = state->target_residency - state->exit_latency;
+
+       while (tegra20_cpu_is_resettable_soon())
+               cpu_relax();
+
+       if (tegra20_reset_cpu_1() || !tegra_cpu_rail_off_ready())
+               return false;
+
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu);
+
+       tegra_idle_lp2_last(cpu_on_time, cpu_off_time);
+
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
+
+       if (cpu_online(1))
+               tegra20_wake_cpu1_from_reset();
+
+       return true;
+}
+
+#ifdef CONFIG_SMP
+static bool tegra20_idle_enter_lp2_cpu_1(struct cpuidle_device *dev,
+                                        struct cpuidle_driver *drv,
+                                        int index)
+{
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu);
+
+       cpu_suspend(0, tegra20_sleep_cpu_secondary_finish);
+
+       tegra20_cpu_clear_resettable();
+
+       clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
+
+       return true;
+}
+#else
+static inline bool tegra20_idle_enter_lp2_cpu_1(struct cpuidle_device *dev,
+                                               struct cpuidle_driver *drv,
+                                               int index)
+{
+       return true;
+}
+#endif
+
+static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
+                                   struct cpuidle_driver *drv,
+                                   int index)
+{
+       u32 cpu = is_smp() ? cpu_logical_map(dev->cpu) : dev->cpu;
+       bool entered_lp2 = false;
+
+       if (tegra_pending_sgi())
+               ACCESS_ONCE(abort_flag) = true;
+
+       cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
+
+       if (abort_flag) {
+               cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
+               abort_flag = false;     /* clean flag for next coming */
+               return -EINTR;
+       }
+
+       local_fiq_disable();
+
+       tegra_set_cpu_in_lp2(cpu);
+       cpu_pm_enter();
+
+       if (cpu == 0)
+               entered_lp2 = tegra20_cpu_cluster_power_down(dev, drv, index);
+       else
+               entered_lp2 = tegra20_idle_enter_lp2_cpu_1(dev, drv, index);
+
+       cpu_pm_exit();
+       tegra_clear_cpu_in_lp2(cpu);
+
+       local_fiq_enable();
+
+       smp_rmb();
+
+       return entered_lp2 ? index : 0;
+}
+#endif
+
 int __init tegra20_cpuidle_init(void)
 {
        int ret;
@@ -44,6 +222,14 @@ int __init tegra20_cpuidle_init(void)
        struct cpuidle_device *dev;
        struct cpuidle_driver *drv = &tegra_idle_driver;
 
+#ifdef CONFIG_PM_SLEEP
+       tegra_tear_down_cpu = tegra20_tear_down_cpu;
+#endif
+
+       drv->state_count = ARRAY_SIZE(tegra_idle_states);
+       memcpy(drv->states, tegra_idle_states,
+                       drv->state_count * sizeof(drv->states[0]));
+
        ret = cpuidle_register_driver(&tegra_idle_driver);
        if (ret) {
                pr_err("CPUidle driver registration failed\n");
@@ -53,6 +239,9 @@ int __init tegra20_cpuidle_init(void)
        for_each_possible_cpu(cpu) {
                dev = &per_cpu(tegra_idle_device, cpu);
                dev->cpu = cpu;
+#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
+               dev->coupled_cpus = *cpu_possible_mask;
+#endif
 
                dev->state_count = drv->state_count;
                ret = cpuidle_register_device(dev);
index 5e8cbf5b799fe233a0a6f1da9a7d5f17b018a207..8b50cf4ddd6f04819e0c8a69bf4bf7eb9d28ddc5 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/cpuidle.h>
 #include <linux/cpu_pm.h>
 #include <linux/clockchips.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/cpuidle.h>
 #include <asm/proc-fns.h>
@@ -32,7 +33,6 @@
 
 #include "pm.h"
 #include "sleep.h"
-#include "tegra_cpu_car.h"
 
 #ifdef CONFIG_PM_SLEEP
 static int tegra30_idle_lp2(struct cpuidle_device *dev,
@@ -121,9 +121,9 @@ static inline bool tegra30_cpu_core_power_down(struct cpuidle_device *dev,
 }
 #endif
 
-static int __cpuinit tegra30_idle_lp2(struct cpuidle_device *dev,
-                                     struct cpuidle_driver *drv,
-                                     int index)
+static int tegra30_idle_lp2(struct cpuidle_device *dev,
+                           struct cpuidle_driver *drv,
+                           int index)
 {
        u32 cpu = is_smp() ? cpu_logical_map(dev->cpu) : dev->cpu;
        bool entered_lp2 = false;
index d0651397aec72827c7e1355c455f28fd8220c95a..4b744c4661e20d2cb4f809235e7e629143c7901a 100644 (file)
@@ -38,6 +38,9 @@ static int __init tegra_cpuidle_init(void)
        case TEGRA30:
                ret = tegra30_cpuidle_init();
                break;
+       case TEGRA114:
+               ret = tegra114_cpuidle_init();
+               break;
        default:
                ret = -ENODEV;
                break;
index 496204d34e559426cef2f157c29eec6b38e178a3..d733f75d02082e83950911765489fa6909103c56 100644 (file)
@@ -29,4 +29,10 @@ int tegra30_cpuidle_init(void);
 static inline int tegra30_cpuidle_init(void) { return -ENODEV; }
 #endif
 
+#ifdef CONFIG_ARCH_TEGRA_114_SOC
+int tegra114_cpuidle_init(void);
+#else
+static inline int tegra114_cpuidle_init(void) { return -ENODEV; }
+#endif
+
 #endif
index a2250ddae797bdfecc705cf6f389c924aaed4981..b477ef310dcd1781cab7df8b3c51eba950342e06 100644 (file)
 
 #include "flowctrl.h"
 #include "iomap.h"
+#include "fuse.h"
 
-u8 flowctrl_offset_halt_cpu[] = {
+static u8 flowctrl_offset_halt_cpu[] = {
        FLOW_CTRL_HALT_CPU0_EVENTS,
        FLOW_CTRL_HALT_CPU1_EVENTS,
        FLOW_CTRL_HALT_CPU1_EVENTS + 8,
        FLOW_CTRL_HALT_CPU1_EVENTS + 16,
 };
 
-u8 flowctrl_offset_cpu_csr[] = {
+static u8 flowctrl_offset_cpu_csr[] = {
        FLOW_CTRL_CPU0_CSR,
        FLOW_CTRL_CPU1_CSR,
        FLOW_CTRL_CPU1_CSR + 8,
@@ -75,11 +76,26 @@ void flowctrl_cpu_suspend_enter(unsigned int cpuid)
        int i;
 
        reg = flowctrl_read_cpu_csr(cpuid);
-       reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;       /* clear wfe bitmap */
-       reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;       /* clear wfi bitmap */
+       switch (tegra_chip_id) {
+       case TEGRA20:
+               /* clear wfe bitmap */
+               reg &= ~TEGRA20_FLOW_CTRL_CSR_WFE_BITMAP;
+               /* clear wfi bitmap */
+               reg &= ~TEGRA20_FLOW_CTRL_CSR_WFI_BITMAP;
+               /* pwr gating on wfe */
+               reg |= TEGRA20_FLOW_CTRL_CSR_WFE_CPU0 << cpuid;
+               break;
+       case TEGRA30:
+               /* clear wfe bitmap */
+               reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
+               /* clear wfi bitmap */
+               reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;
+               /* pwr gating on wfi */
+               reg |= TEGRA30_FLOW_CTRL_CSR_WFI_CPU0 << cpuid;
+               break;
+       }
        reg |= FLOW_CTRL_CSR_INTR_FLAG;                 /* clear intr flag */
        reg |= FLOW_CTRL_CSR_EVENT_FLAG;                /* clear event flag */
-       reg |= TEGRA30_FLOW_CTRL_CSR_WFI_CPU0 << cpuid; /* pwr gating on wfi */
        reg |= FLOW_CTRL_CSR_ENABLE;                    /* pwr gating */
        flowctrl_write_cpu_csr(cpuid, reg);
 
@@ -99,8 +115,20 @@ void flowctrl_cpu_suspend_exit(unsigned int cpuid)
 
        /* Disable powergating via flow controller for CPU0 */
        reg = flowctrl_read_cpu_csr(cpuid);
-       reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;       /* clear wfe bitmap */
-       reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;       /* clear wfi bitmap */
+       switch (tegra_chip_id) {
+       case TEGRA20:
+               /* clear wfe bitmap */
+               reg &= ~TEGRA20_FLOW_CTRL_CSR_WFE_BITMAP;
+               /* clear wfi bitmap */
+               reg &= ~TEGRA20_FLOW_CTRL_CSR_WFI_BITMAP;
+               break;
+       case TEGRA30:
+               /* clear wfe bitmap */
+               reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
+               /* clear wfi bitmap */
+               reg &= ~TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP;
+               break;
+       }
        reg &= ~FLOW_CTRL_CSR_ENABLE;                   /* clear enable */
        reg |= FLOW_CTRL_CSR_INTR_FLAG;                 /* clear intr */
        reg |= FLOW_CTRL_CSR_EVENT_FLAG;                /* clear event */
index 0798dec1832d5d8aa7e066e5afcb40e0876dbc39..67eab56699bd49f66925b66ed4c5b8d5922de037 100644 (file)
 #define FLOW_CTRL_HALT_CPU1_EVENTS     0x14
 #define FLOW_CTRL_CPU1_CSR             0x18
 
+#define TEGRA20_FLOW_CTRL_CSR_WFE_CPU0         (1 << 4)
+#define TEGRA20_FLOW_CTRL_CSR_WFE_BITMAP       (3 << 4)
+#define TEGRA20_FLOW_CTRL_CSR_WFI_BITMAP       0
+
 #define TEGRA30_FLOW_CTRL_CSR_WFI_CPU0         (1 << 8)
 #define TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP       (0xF << 4)
 #define TEGRA30_FLOW_CTRL_CSR_WFI_BITMAP       (0xF << 8)
index 8121742711fe25d581bfbe13c08337a8ce5196c9..f7db0782a6b6bdbcc256a06936831ee0d38f49e7 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/kernel.h>
 #include <linux/io.h>
 #include <linux/export.h>
+#include <linux/tegra-soc.h>
 
 #include "fuse.h"
 #include "iomap.h"
@@ -105,6 +106,11 @@ static void tegra_get_process_id(void)
        tegra_core_process_id = (reg >> 12) & 3;
 }
 
+u32 tegra_read_chipid(void)
+{
+       return readl_relaxed(IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804);
+}
+
 void tegra_init_fuse(void)
 {
        u32 id;
@@ -119,7 +125,7 @@ void tegra_init_fuse(void)
        reg = tegra_apb_readl(TEGRA_APB_MISC_BASE + STRAP_OPT);
        tegra_bct_strapping = (reg & RAM_ID_MASK) >> RAM_CODE_SHIFT;
 
-       id = readl_relaxed(IO_ADDRESS(TEGRA_APB_MISC_BASE) + 0x804);
+       id = tegra_read_chipid();
        tegra_chip_id = (id >> 8) & 0xff;
 
        switch (tegra_chip_id) {
index ff1383dd61a79b38f6025d8b4746348315056b1e..da78434678c76029707c6df2d4f2b51a2f31a0bd 100644 (file)
@@ -37,6 +37,7 @@ enum tegra_revision {
 
 #define TEGRA20                0x20
 #define TEGRA30                0x30
+#define TEGRA114       0x35
 
 extern int tegra_sku_id;
 extern int tegra_cpu_process_id;
index 4a317fae68604b24ae82d984e2b917970c68e997..b2834810b02b4bd3a6eea454c433b7fabab24523 100644 (file)
@@ -1,22 +1,9 @@
 #include <linux/linkage.h>
 #include <linux/init.h>
 
-#include <asm/cache.h>
-#include <asm/asm-offsets.h>
-#include <asm/hardware/cache-l2x0.h>
-
-#include "flowctrl.h"
-#include "iomap.h"
-#include "reset.h"
 #include "sleep.h"
 
-#define APB_MISC_GP_HIDREV     0x804
-#define PMC_SCRATCH41  0x140
-
-#define RESET_DATA(x)  ((TEGRA_RESET_##x)*4)
-
         .section ".text.head", "ax"
-       __CPUINIT
 
 /*
  * Tegra specific entry point for secondary CPUs.
@@ -61,7 +48,6 @@ ENTRY(v7_invalidate_l1)
         mov     pc, lr
 ENDPROC(v7_invalidate_l1)
 
-
 ENTRY(tegra_secondary_startup)
         bl      v7_invalidate_l1
        /* Enable coresight */
@@ -69,210 +55,3 @@ ENTRY(tegra_secondary_startup)
        mcr     p14, 0, r0, c7, c12, 6
         b       secondary_startup
 ENDPROC(tegra_secondary_startup)
-
-#ifdef CONFIG_PM_SLEEP
-/*
- *     tegra_resume
- *
- *       CPU boot vector when restarting the a CPU following
- *       an LP2 transition. Also branched to by LP0 and LP1 resume after
- *       re-enabling sdram.
- */
-ENTRY(tegra_resume)
-       bl      v7_invalidate_l1
-       /* Enable coresight */
-       mov32   r0, 0xC5ACCE55
-       mcr     p14, 0, r0, c7, c12, 6
-
-       cpu_id  r0
-       cmp     r0, #0                          @ CPU0?
-       bne     cpu_resume                      @ no
-
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
-       /* Are we on Tegra20? */
-       mov32   r6, TEGRA_APB_MISC_BASE
-       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
-       and     r0, r0, #0xff00
-       cmp     r0, #(0x20 << 8)
-       beq     1f                              @ Yes
-       /* Clear the flow controller flags for this CPU. */
-       mov32   r2, TEGRA_FLOW_CTRL_BASE + FLOW_CTRL_CPU0_CSR   @ CPU0 CSR
-       ldr     r1, [r2]
-       /* Clear event & intr flag */
-       orr     r1, r1, \
-               #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
-       movw    r0, #0x0FFD     @ enable, cluster_switch, immed, & bitmaps
-       bic     r1, r1, r0
-       str     r1, [r2]
-1:
-#endif
-
-#ifdef CONFIG_HAVE_ARM_SCU
-       /* enable SCU */
-       mov32   r0, TEGRA_ARM_PERIF_BASE
-       ldr     r1, [r0]
-       orr     r1, r1, #1
-       str     r1, [r0]
-#endif
-
-       /* L2 cache resume & re-enable */
-       l2_cache_resume r0, r1, r2, l2x0_saved_regs_addr
-
-       b       cpu_resume
-ENDPROC(tegra_resume)
-#endif
-
-#ifdef CONFIG_CACHE_L2X0
-       .globl  l2x0_saved_regs_addr
-l2x0_saved_regs_addr:
-       .long   0
-#endif
-
-       .align L1_CACHE_SHIFT
-ENTRY(__tegra_cpu_reset_handler_start)
-
-/*
- * __tegra_cpu_reset_handler:
- *
- * Common handler for all CPU reset events.
- *
- * Register usage within the reset handler:
- *
- *      R7  = CPU present (to the OS) mask
- *      R8  = CPU in LP1 state mask
- *      R9  = CPU in LP2 state mask
- *      R10 = CPU number
- *      R11 = CPU mask
- *      R12 = pointer to reset handler data
- *
- * NOTE: This code is copied to IRAM. All code and data accesses
- *       must be position-independent.
- */
-
-       .align L1_CACHE_SHIFT
-ENTRY(__tegra_cpu_reset_handler)
-
-       cpsid   aif, 0x13                       @ SVC mode, interrupts disabled
-       mrc     p15, 0, r10, c0, c0, 5          @ MPIDR
-       and     r10, r10, #0x3                  @ R10 = CPU number
-       mov     r11, #1
-       mov     r11, r11, lsl r10               @ R11 = CPU mask
-       adr     r12, __tegra_cpu_reset_handler_data
-
-#ifdef CONFIG_SMP
-       /* Does the OS know about this CPU? */
-       ldr     r7, [r12, #RESET_DATA(MASK_PRESENT)]
-       tst     r7, r11                         @ if !present
-       bleq    __die                           @ CPU not present (to OS)
-#endif
-
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
-       /* Are we on Tegra20? */
-       mov32   r6, TEGRA_APB_MISC_BASE
-       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
-       and     r0, r0, #0xff00
-       cmp     r0, #(0x20 << 8)
-       bne     1f
-       /* If not CPU0, don't let CPU0 reset CPU1 now that CPU1 is coming up. */
-       mov32   r6, TEGRA_PMC_BASE
-       mov     r0, #0
-       cmp     r10, #0
-       strne   r0, [r6, #PMC_SCRATCH41]
-1:
-#endif
-
-       /* Waking up from LP2? */
-       ldr     r9, [r12, #RESET_DATA(MASK_LP2)]
-       tst     r9, r11                         @ if in_lp2
-       beq     __is_not_lp2
-       ldr     lr, [r12, #RESET_DATA(STARTUP_LP2)]
-       cmp     lr, #0
-       bleq    __die                           @ no LP2 startup handler
-       bx      lr
-
-__is_not_lp2:
-
-#ifdef CONFIG_SMP
-       /*
-        * Can only be secondary boot (initial or hotplug) but CPU 0
-        * cannot be here.
-        */
-       cmp     r10, #0
-       bleq    __die                           @ CPU0 cannot be here
-       ldr     lr, [r12, #RESET_DATA(STARTUP_SECONDARY)]
-       cmp     lr, #0
-       bleq    __die                           @ no secondary startup handler
-       bx      lr
-#endif
-
-/*
- * We don't know why the CPU reset. Just kill it.
- * The LR register will contain the address we died at + 4.
- */
-
-__die:
-       sub     lr, lr, #4
-       mov32   r7, TEGRA_PMC_BASE
-       str     lr, [r7, #PMC_SCRATCH41]
-
-       mov32   r7, TEGRA_CLK_RESET_BASE
-
-       /* Are we on Tegra20? */
-       mov32   r6, TEGRA_APB_MISC_BASE
-       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
-       and     r0, r0, #0xff00
-       cmp     r0, #(0x20 << 8)
-       bne     1f
-
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
-       mov32   r0, 0x1111
-       mov     r1, r0, lsl r10
-       str     r1, [r7, #0x340]                @ CLK_RST_CPU_CMPLX_SET
-#endif
-1:
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
-       mov32   r6, TEGRA_FLOW_CTRL_BASE
-
-       cmp     r10, #0
-       moveq   r1, #FLOW_CTRL_HALT_CPU0_EVENTS
-       moveq   r2, #FLOW_CTRL_CPU0_CSR
-       movne   r1, r10, lsl #3
-       addne   r2, r1, #(FLOW_CTRL_CPU1_CSR-8)
-       addne   r1, r1, #(FLOW_CTRL_HALT_CPU1_EVENTS-8)
-
-       /* Clear CPU "event" and "interrupt" flags and power gate
-          it when halting but not before it is in the "WFI" state. */
-       ldr     r0, [r6, +r2]
-       orr     r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
-       orr     r0, r0, #FLOW_CTRL_CSR_ENABLE
-       str     r0, [r6, +r2]
-
-       /* Unconditionally halt this CPU */
-       mov     r0, #FLOW_CTRL_WAITEVENT
-       str     r0, [r6, +r1]
-       ldr     r0, [r6, +r1]                   @ memory barrier
-
-       dsb
-       isb
-       wfi                                     @ CPU should be power gated here
-
-       /* If the CPU didn't power gate above just kill it's clock. */
-
-       mov     r0, r11, lsl #8
-       str     r0, [r7, #348]                  @ CLK_CPU_CMPLX_SET
-#endif
-
-       /* If the CPU still isn't dead, just spin here. */
-       b       .
-ENDPROC(__tegra_cpu_reset_handler)
-
-       .align L1_CACHE_SHIFT
-       .type   __tegra_cpu_reset_handler_data, %object
-       .globl  __tegra_cpu_reset_handler_data
-__tegra_cpu_reset_handler_data:
-       .rept   TEGRA_RESET_DATA_SIZE
-       .long   0
-       .endr
-       .align L1_CACHE_SHIFT
-
-ENTRY(__tegra_cpu_reset_handler_end)
index dca5141a2c31d1ff7f523f000c6a3ca08f9806e9..a599f6e36dea49768c6eb18d9550b3d04fb9c1db 100644 (file)
  */
 #include <linux/kernel.h>
 #include <linux/smp.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 #include "sleep.h"
-#include "tegra_cpu_car.h"
 
 static void (*tegra_hotplug_shutdown)(void);
 
+int tegra_cpu_kill(unsigned cpu)
+{
+       cpu = cpu_logical_map(cpu);
+
+       /* Clock gate the CPU */
+       tegra_wait_cpu_in_reset(cpu);
+       tegra_disable_cpu_clock(cpu);
+
+       return 1;
+}
+
 /*
  * platform-specific code to shutdown a CPU
  *
@@ -26,18 +37,12 @@ static void (*tegra_hotplug_shutdown)(void);
  */
 void __ref tegra_cpu_die(unsigned int cpu)
 {
-       cpu = cpu_logical_map(cpu);
-
-       /* Flush the L1 data cache. */
-       flush_cache_all();
+       /* Clean L1 data cache */
+       tegra_disable_clean_inv_dcache();
 
        /* Shut down the current CPU. */
        tegra_hotplug_shutdown();
 
-       /* Clock gate the CPU */
-       tegra_wait_cpu_in_reset(cpu);
-       tegra_disable_cpu_clock(cpu);
-
        /* Should never return here. */
        BUG();
 }
diff --git a/arch/arm/mach-tegra/include/mach/clk.h b/arch/arm/mach-tegra/include/mach/clk.h
deleted file mode 100644 (file)
index 95f3a54..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * arch/arm/mach-tegra/include/mach/clk.h
- *
- * Copyright (C) 2010 Google, Inc.
- *
- * Author:
- *     Erik Gilling <konkers@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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_CLK_H
-#define __MACH_CLK_H
-
-struct clk;
-
-enum tegra_clk_ex_param {
-       TEGRA_CLK_VI_INP_SEL,
-       TEGRA_CLK_DTV_INVERT,
-       TEGRA_CLK_NAND_PAD_DIV2_ENB,
-       TEGRA_CLK_PLLD_CSI_OUT_ENB,
-       TEGRA_CLK_PLLD_DSI_OUT_ENB,
-       TEGRA_CLK_PLLD_MIPI_MUX_SEL,
-};
-
-void tegra_periph_reset_deassert(struct clk *c);
-void tegra_periph_reset_assert(struct clk *c);
-
-#ifndef CONFIG_COMMON_CLK
-unsigned long clk_get_rate_all_locked(struct clk *c);
-#endif
-
-void tegra2_sdmmc_tap_delay(struct clk *c, int delay);
-int tegra_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting);
-
-#endif
index db8be51cad8017d5197fd27cffbef5f7ec56664a..399fbca271027e6e77e4e61a02d0ceae35912571 100644 (file)
 #define TEGRA_CSITE_BASE               0x70040000
 #define TEGRA_CSITE_SIZE               SZ_256K
 
-#define TEGRA_USB_BASE                 0xC5000000
-#define TEGRA_USB_SIZE                 SZ_16K
-
-#define TEGRA_USB2_BASE                        0xC5004000
-#define TEGRA_USB2_SIZE                        SZ_16K
-
-#define TEGRA_USB3_BASE                        0xC5008000
-#define TEGRA_USB3_SIZE                        SZ_16K
-
 #define TEGRA_SDMMC1_BASE              0xC8000000
 #define TEGRA_SDMMC1_SIZE              SZ_512
 
index 2ff2128cb9d80f64c0933f7384a6f3c9884868bd..1952e82797ccd3f45eecb88e8be523dd0a3d8104 100644 (file)
@@ -44,6 +44,8 @@
 
 #define FIRST_LEGACY_IRQ 32
 
+#define SGI_MASK 0xFFFF
+
 static int num_ictlrs;
 
 static void __iomem *ictlr_reg_base[] = {
@@ -54,6 +56,19 @@ static void __iomem *ictlr_reg_base[] = {
        IO_ADDRESS(TEGRA_QUINARY_ICTLR_BASE),
 };
 
+bool tegra_pending_sgi(void)
+{
+       u32 pending_set;
+       void __iomem *distbase = IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE);
+
+       pending_set = readl_relaxed(distbase + GIC_DIST_PENDING_SET);
+
+       if (pending_set & SGI_MASK)
+               return true;
+
+       return false;
+}
+
 static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg)
 {
        void __iomem *base;
diff --git a/arch/arm/mach-tegra/irq.h b/arch/arm/mach-tegra/irq.h
new file mode 100644 (file)
index 0000000..5142649
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2012, NVIDIA Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __TEGRA_IRQ_H
+#define __TEGRA_IRQ_H
+
+bool tegra_pending_sgi(void);
+
+#endif
index bffcd643d7a3eb14ef094d537444271344280a93..b60165f1ca02c56b76b78323a0d03119b871e9b8 100644 (file)
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/export.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/sizes.h>
 #include <asm/mach/pci.h>
 
-#include <mach/clk.h>
 #include <mach/powergate.h>
 
 #include "board.h"
index 18d7290cf93b63dbe592591bfb6b4ed87be76ff0..2c6b3d55213b49f16ee256548279b1742111bd20 100644 (file)
 #include <linux/smp.h>
 #include <linux/io.h>
 #include <linux/irqchip/arm-gic.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/cacheflush.h>
 #include <asm/mach-types.h>
 #include <asm/smp_scu.h>
+#include <asm/smp_plat.h>
 
 #include <mach/powergate.h>
 
 #include "fuse.h"
 #include "flowctrl.h"
 #include "reset.h"
-#include "tegra_cpu_car.h"
 
 #include "common.h"
 #include "iomap.h"
 
 extern void tegra_secondary_startup(void);
 
-static void __iomem *scu_base = IO_ADDRESS(TEGRA_ARM_PERIF_BASE);
+static cpumask_t tegra_cpu_init_mask;
 
 #define EVP_CPU_RESET_VECTOR \
        (IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) + 0x100)
@@ -50,6 +51,7 @@ static void __cpuinit tegra_secondary_init(unsigned int cpu)
         */
        gic_secondary_init(0);
 
+       cpumask_set_cpu(cpu, &tegra_cpu_init_mask);
 }
 
 static int tegra20_power_up_cpu(unsigned int cpu)
@@ -72,14 +74,42 @@ static int tegra30_power_up_cpu(unsigned int cpu)
        if (pwrgateid < 0)
                return pwrgateid;
 
-       /* If this is the first boot, toggle powergates directly. */
+       /*
+        * The power up sequence of cold boot CPU and warm boot CPU
+        * was different.
+        *
+        * For warm boot CPU that was resumed from CPU hotplug, the
+        * power will be resumed automatically after un-halting the
+        * flow controller of the warm boot CPU. We need to wait for
+        * the confirmaiton that the CPU is powered then removing
+        * the IO clamps.
+        * For cold boot CPU, do not wait. After the cold boot CPU be
+        * booted, it will run to tegra_secondary_init() and set
+        * tegra_cpu_init_mask which influences what tegra30_power_up_cpu()
+        * next time around.
+        */
+       if (cpumask_test_cpu(cpu, &tegra_cpu_init_mask)) {
+               timeout = jiffies + msecs_to_jiffies(50);
+               do {
+                       if (!tegra_powergate_is_powered(pwrgateid))
+                               goto remove_clamps;
+                       udelay(10);
+               } while (time_before(jiffies, timeout));
+       }
+
+       /*
+        * The power status of the cold boot CPU is power gated as
+        * default. To power up the cold boot CPU, the power should
+        * be un-gated by un-toggling the power gate register
+        * manually.
+        */
        if (!tegra_powergate_is_powered(pwrgateid)) {
                ret = tegra_powergate_power_on(pwrgateid);
                if (ret)
                        return ret;
 
                /* Wait for the power to come up. */
-               timeout = jiffies + 10*HZ;
+               timeout = jiffies + msecs_to_jiffies(100);
                while (tegra_powergate_is_powered(pwrgateid)) {
                        if (time_after(jiffies, timeout))
                                return -ETIMEDOUT;
@@ -87,6 +117,7 @@ static int tegra30_power_up_cpu(unsigned int cpu)
                }
        }
 
+remove_clamps:
        /* CPU partition is powered. Enable the CPU clock. */
        tegra_enable_cpu_clock(cpu);
        udelay(10);
@@ -105,6 +136,8 @@ static int __cpuinit tegra_boot_secondary(unsigned int cpu, struct task_struct *
 {
        int status;
 
+       cpu = cpu_logical_map(cpu);
+
        /*
         * Force the CPU into reset. The CPU must remain in reset when the
         * flow controller state is cleared (which will cause the flow
@@ -143,36 +176,21 @@ done:
        return status;
 }
 
-/*
- * Initialise the CPU possible map early - this describes the CPUs
- * which may be present or become present in the system.
- */
-static void __init tegra_smp_init_cpus(void)
-{
-       unsigned int i, ncores = scu_get_core_count(scu_base);
-
-       if (ncores > nr_cpu_ids) {
-               pr_warn("SMP: %u cores greater than maximum (%u), clipping\n",
-                       ncores, nr_cpu_ids);
-               ncores = nr_cpu_ids;
-       }
-
-       for (i = 0; i < ncores; i++)
-               set_cpu_possible(i, true);
-}
-
 static void __init tegra_smp_prepare_cpus(unsigned int max_cpus)
 {
-       tegra_cpu_reset_handler_init();
-       scu_enable(scu_base);
+       /* Always mark the boot CPU (CPU0) as initialized. */
+       cpumask_set_cpu(0, &tegra_cpu_init_mask);
+
+       if (scu_a9_has_base())
+               scu_enable(IO_ADDRESS(scu_a9_get_base()));
 }
 
 struct smp_operations tegra_smp_ops __initdata = {
-       .smp_init_cpus          = tegra_smp_init_cpus,
        .smp_prepare_cpus       = tegra_smp_prepare_cpus,
        .smp_secondary_init     = tegra_secondary_init,
        .smp_boot_secondary     = tegra_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
+       .cpu_kill               = tegra_cpu_kill,
        .cpu_die                = tegra_cpu_die,
        .cpu_disable            = tegra_cpu_disable,
 #endif
index 1b11707eaca00d5e05923a200ae9191448a5d19b..523604de666f6f6369330fabadbedb2b05750cf9 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/cpu_pm.h>
 #include <linux/clk.h>
 #include <linux/err.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/smp_plat.h>
 #include <asm/cacheflush.h>
@@ -35,8 +36,8 @@
 #include "iomap.h"
 #include "reset.h"
 #include "flowctrl.h"
+#include "fuse.h"
 #include "sleep.h"
-#include "tegra_cpu_car.h"
 
 #define TEGRA_POWER_CPU_PWRREQ_OE      (1 << 16)  /* CPU pwr req enable */
 
@@ -148,7 +149,7 @@ static void suspend_cpu_complex(void)
        save_cpu_arch_register();
 }
 
-void __cpuinit tegra_clear_cpu_in_lp2(int phy_cpu_id)
+void tegra_clear_cpu_in_lp2(int phy_cpu_id)
 {
        u32 *cpu_in_lp2 = tegra_cpu_lp2_mask;
 
@@ -160,7 +161,7 @@ void __cpuinit tegra_clear_cpu_in_lp2(int phy_cpu_id)
        spin_unlock(&tegra_lp2_lock);
 }
 
-bool __cpuinit tegra_set_cpu_in_lp2(int phy_cpu_id)
+bool tegra_set_cpu_in_lp2(int phy_cpu_id)
 {
        bool last_cpu = false;
        cpumask_t *cpu_lp2_mask = tegra_cpu_lp2_mask;
@@ -173,6 +174,8 @@ bool __cpuinit tegra_set_cpu_in_lp2(int phy_cpu_id)
 
        if ((phy_cpu_id == 0) && cpumask_equal(cpu_lp2_mask, cpu_online_mask))
                last_cpu = true;
+       else if (tegra_chip_id == TEGRA20 && phy_cpu_id == 1)
+               tegra20_cpu_set_resettable_soon();
 
        spin_unlock(&tegra_lp2_lock);
        return last_cpu;
index 2cc1185d902e38fd3678872c71ffc8320e89d383..c6bc8f85759c615a465dfe6bf7eaa8578bbcb84c 100644 (file)
@@ -26,8 +26,8 @@
 #include <linux/io.h>
 #include <linux/seq_file.h>
 #include <linux/spinlock.h>
+#include <linux/clk/tegra.h>
 
-#include <mach/clk.h>
 #include <mach/powergate.h>
 
 #include "fuse.h"
diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S
new file mode 100644 (file)
index 0000000..54382ce
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2012, NVIDIA Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/linkage.h>
+#include <linux/init.h>
+
+#include <asm/cache.h>
+#include <asm/asm-offsets.h>
+#include <asm/hardware/cache-l2x0.h>
+
+#include "flowctrl.h"
+#include "iomap.h"
+#include "reset.h"
+#include "sleep.h"
+
+#define APB_MISC_GP_HIDREV     0x804
+#define PMC_SCRATCH41  0x140
+
+#define RESET_DATA(x)  ((TEGRA_RESET_##x)*4)
+
+#ifdef CONFIG_PM_SLEEP
+/*
+ *     tegra_resume
+ *
+ *       CPU boot vector when restarting the a CPU following
+ *       an LP2 transition. Also branched to by LP0 and LP1 resume after
+ *       re-enabling sdram.
+ */
+ENTRY(tegra_resume)
+       bl      v7_invalidate_l1
+       /* Enable coresight */
+       mov32   r0, 0xC5ACCE55
+       mcr     p14, 0, r0, c7, c12, 6
+
+       cpu_id  r0
+       cmp     r0, #0                          @ CPU0?
+       bne     cpu_resume                      @ no
+
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+       /* Are we on Tegra20? */
+       mov32   r6, TEGRA_APB_MISC_BASE
+       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
+       and     r0, r0, #0xff00
+       cmp     r0, #(0x20 << 8)
+       beq     1f                              @ Yes
+       /* Clear the flow controller flags for this CPU. */
+       mov32   r2, TEGRA_FLOW_CTRL_BASE + FLOW_CTRL_CPU0_CSR   @ CPU0 CSR
+       ldr     r1, [r2]
+       /* Clear event & intr flag */
+       orr     r1, r1, \
+               #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
+       movw    r0, #0x0FFD     @ enable, cluster_switch, immed, & bitmaps
+       bic     r1, r1, r0
+       str     r1, [r2]
+1:
+#endif
+
+#ifdef CONFIG_HAVE_ARM_SCU
+       /* enable SCU */
+       mov32   r0, TEGRA_ARM_PERIF_BASE
+       ldr     r1, [r0]
+       orr     r1, r1, #1
+       str     r1, [r0]
+#endif
+
+       /* L2 cache resume & re-enable */
+       l2_cache_resume r0, r1, r2, l2x0_saved_regs_addr
+
+       b       cpu_resume
+ENDPROC(tegra_resume)
+#endif
+
+#ifdef CONFIG_CACHE_L2X0
+       .globl  l2x0_saved_regs_addr
+l2x0_saved_regs_addr:
+       .long   0
+#endif
+
+       .align L1_CACHE_SHIFT
+ENTRY(__tegra_cpu_reset_handler_start)
+
+/*
+ * __tegra_cpu_reset_handler:
+ *
+ * Common handler for all CPU reset events.
+ *
+ * Register usage within the reset handler:
+ *
+ *      R7  = CPU present (to the OS) mask
+ *      R8  = CPU in LP1 state mask
+ *      R9  = CPU in LP2 state mask
+ *      R10 = CPU number
+ *      R11 = CPU mask
+ *      R12 = pointer to reset handler data
+ *
+ * NOTE: This code is copied to IRAM. All code and data accesses
+ *       must be position-independent.
+ */
+
+       .align L1_CACHE_SHIFT
+ENTRY(__tegra_cpu_reset_handler)
+
+       cpsid   aif, 0x13                       @ SVC mode, interrupts disabled
+       mrc     p15, 0, r10, c0, c0, 5          @ MPIDR
+       and     r10, r10, #0x3                  @ R10 = CPU number
+       mov     r11, #1
+       mov     r11, r11, lsl r10               @ R11 = CPU mask
+       adr     r12, __tegra_cpu_reset_handler_data
+
+#ifdef CONFIG_SMP
+       /* Does the OS know about this CPU? */
+       ldr     r7, [r12, #RESET_DATA(MASK_PRESENT)]
+       tst     r7, r11                         @ if !present
+       bleq    __die                           @ CPU not present (to OS)
+#endif
+
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+       /* Are we on Tegra20? */
+       mov32   r6, TEGRA_APB_MISC_BASE
+       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
+       and     r0, r0, #0xff00
+       cmp     r0, #(0x20 << 8)
+       bne     1f
+       /* If not CPU0, don't let CPU0 reset CPU1 now that CPU1 is coming up. */
+       mov32   r6, TEGRA_PMC_BASE
+       mov     r0, #0
+       cmp     r10, #0
+       strne   r0, [r6, #PMC_SCRATCH41]
+1:
+#endif
+
+       /* Waking up from LP2? */
+       ldr     r9, [r12, #RESET_DATA(MASK_LP2)]
+       tst     r9, r11                         @ if in_lp2
+       beq     __is_not_lp2
+       ldr     lr, [r12, #RESET_DATA(STARTUP_LP2)]
+       cmp     lr, #0
+       bleq    __die                           @ no LP2 startup handler
+       bx      lr
+
+__is_not_lp2:
+
+#ifdef CONFIG_SMP
+       /*
+        * Can only be secondary boot (initial or hotplug) but CPU 0
+        * cannot be here.
+        */
+       cmp     r10, #0
+       bleq    __die                           @ CPU0 cannot be here
+       ldr     lr, [r12, #RESET_DATA(STARTUP_SECONDARY)]
+       cmp     lr, #0
+       bleq    __die                           @ no secondary startup handler
+       bx      lr
+#endif
+
+/*
+ * We don't know why the CPU reset. Just kill it.
+ * The LR register will contain the address we died at + 4.
+ */
+
+__die:
+       sub     lr, lr, #4
+       mov32   r7, TEGRA_PMC_BASE
+       str     lr, [r7, #PMC_SCRATCH41]
+
+       mov32   r7, TEGRA_CLK_RESET_BASE
+
+       /* Are we on Tegra20? */
+       mov32   r6, TEGRA_APB_MISC_BASE
+       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
+       and     r0, r0, #0xff00
+       cmp     r0, #(0x20 << 8)
+       bne     1f
+
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+       mov32   r0, 0x1111
+       mov     r1, r0, lsl r10
+       str     r1, [r7, #0x340]                @ CLK_RST_CPU_CMPLX_SET
+#endif
+1:
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+       mov32   r6, TEGRA_FLOW_CTRL_BASE
+
+       cmp     r10, #0
+       moveq   r1, #FLOW_CTRL_HALT_CPU0_EVENTS
+       moveq   r2, #FLOW_CTRL_CPU0_CSR
+       movne   r1, r10, lsl #3
+       addne   r2, r1, #(FLOW_CTRL_CPU1_CSR-8)
+       addne   r1, r1, #(FLOW_CTRL_HALT_CPU1_EVENTS-8)
+
+       /* Clear CPU "event" and "interrupt" flags and power gate
+          it when halting but not before it is in the "WFI" state. */
+       ldr     r0, [r6, +r2]
+       orr     r0, r0, #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
+       orr     r0, r0, #FLOW_CTRL_CSR_ENABLE
+       str     r0, [r6, +r2]
+
+       /* Unconditionally halt this CPU */
+       mov     r0, #FLOW_CTRL_WAITEVENT
+       str     r0, [r6, +r1]
+       ldr     r0, [r6, +r1]                   @ memory barrier
+
+       dsb
+       isb
+       wfi                                     @ CPU should be power gated here
+
+       /* If the CPU didn't power gate above just kill it's clock. */
+
+       mov     r0, r11, lsl #8
+       str     r0, [r7, #348]                  @ CLK_CPU_CMPLX_SET
+#endif
+
+       /* If the CPU still isn't dead, just spin here. */
+       b       .
+ENDPROC(__tegra_cpu_reset_handler)
+
+       .align L1_CACHE_SHIFT
+       .type   __tegra_cpu_reset_handler_data, %object
+       .globl  __tegra_cpu_reset_handler_data
+__tegra_cpu_reset_handler_data:
+       .rept   TEGRA_RESET_DATA_SIZE
+       .long   0
+       .endr
+       .align L1_CACHE_SHIFT
+
+ENTRY(__tegra_cpu_reset_handler_end)
index 3fd89ecd158e9432da2a92d4f7ab32e92f1ef3b1..1ac434e0068fc3773c0b9efce025837317719ef0 100644 (file)
@@ -75,7 +75,7 @@ void __init tegra_cpu_reset_handler_init(void)
 
 #ifdef CONFIG_SMP
        __tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_PRESENT] =
-               *((u32 *)cpu_present_mask);
+               *((u32 *)cpu_possible_mask);
        __tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_SECONDARY] =
                virt_to_phys((void *)tegra_secondary_startup);
 #endif
index 72ce709799dac5e55cff19b5d279d6e5aceca4b8..9f6bfafdd512102597bfd305e58ec190a8447108 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/linkage.h>
 
 #include <asm/assembler.h>
+#include <asm/proc-fns.h>
+#include <asm/cp15.h>
 
 #include "sleep.h"
 #include "flowctrl.h"
@@ -33,9 +35,6 @@
  * should never return
  */
 ENTRY(tegra20_hotplug_shutdown)
-       /* Turn off SMP coherency */
-       exit_smp r4, r5
-
        /* Put this CPU down */
        cpu_id  r0
        bl      tegra20_cpu_shutdown
@@ -58,6 +57,9 @@ ENDPROC(tegra20_hotplug_shutdown)
 ENTRY(tegra20_cpu_shutdown)
        cmp     r0, #0
        moveq   pc, lr                  @ must not be called for CPU 0
+       mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
+       mov     r12, #CPU_RESETTABLE
+       str     r12, [r1]
 
        cpu_to_halt_reg r1, r0
        ldr     r3, =TEGRA_FLOW_CTRL_VIRT
@@ -78,3 +80,198 @@ ENTRY(tegra20_cpu_shutdown)
        mov     pc, lr
 ENDPROC(tegra20_cpu_shutdown)
 #endif
+
+#ifdef CONFIG_PM_SLEEP
+/*
+ * tegra_pen_lock
+ *
+ * spinlock implementation with no atomic test-and-set and no coherence
+ * using Peterson's algorithm on strongly-ordered registers
+ * used to synchronize a cpu waking up from wfi with entering lp2 on idle
+ *
+ * The reference link of Peterson's algorithm:
+ * http://en.wikipedia.org/wiki/Peterson's_algorithm
+ *
+ * SCRATCH37 = r1 = !turn (inverted from Peterson's algorithm)
+ * on cpu 0:
+ * r2 = flag[0] (in SCRATCH38)
+ * r3 = flag[1] (in SCRATCH39)
+ * on cpu1:
+ * r2 = flag[1] (in SCRATCH39)
+ * r3 = flag[0] (in SCRATCH38)
+ *
+ * must be called with MMU on
+ * corrupts r0-r3, r12
+ */
+ENTRY(tegra_pen_lock)
+       mov32   r3, TEGRA_PMC_VIRT
+       cpu_id  r0
+       add     r1, r3, #PMC_SCRATCH37
+       cmp     r0, #0
+       addeq   r2, r3, #PMC_SCRATCH38
+       addeq   r3, r3, #PMC_SCRATCH39
+       addne   r2, r3, #PMC_SCRATCH39
+       addne   r3, r3, #PMC_SCRATCH38
+
+       mov     r12, #1
+       str     r12, [r2]               @ flag[cpu] = 1
+       dsb
+       str     r12, [r1]               @ !turn = cpu
+1:     dsb
+       ldr     r12, [r3]
+       cmp     r12, #1                 @ flag[!cpu] == 1?
+       ldreq   r12, [r1]
+       cmpeq   r12, r0                 @ !turn == cpu?
+       beq     1b                      @ while !turn == cpu && flag[!cpu] == 1
+
+       mov     pc, lr                  @ locked
+ENDPROC(tegra_pen_lock)
+
+ENTRY(tegra_pen_unlock)
+       dsb
+       mov32   r3, TEGRA_PMC_VIRT
+       cpu_id  r0
+       cmp     r0, #0
+       addeq   r2, r3, #PMC_SCRATCH38
+       addne   r2, r3, #PMC_SCRATCH39
+       mov     r12, #0
+       str     r12, [r2]
+       mov     pc, lr
+ENDPROC(tegra_pen_unlock)
+
+/*
+ * tegra20_cpu_clear_resettable(void)
+ *
+ * Called to clear the "resettable soon" flag in PMC_SCRATCH41 when
+ * it is expected that the secondary CPU will be idle soon.
+ */
+ENTRY(tegra20_cpu_clear_resettable)
+       mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
+       mov     r12, #CPU_NOT_RESETTABLE
+       str     r12, [r1]
+       mov     pc, lr
+ENDPROC(tegra20_cpu_clear_resettable)
+
+/*
+ * tegra20_cpu_set_resettable_soon(void)
+ *
+ * Called to set the "resettable soon" flag in PMC_SCRATCH41 when
+ * it is expected that the secondary CPU will be idle soon.
+ */
+ENTRY(tegra20_cpu_set_resettable_soon)
+       mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
+       mov     r12, #CPU_RESETTABLE_SOON
+       str     r12, [r1]
+       mov     pc, lr
+ENDPROC(tegra20_cpu_set_resettable_soon)
+
+/*
+ * tegra20_cpu_is_resettable_soon(void)
+ *
+ * Returns true if the "resettable soon" flag in PMC_SCRATCH41 has been
+ * set because it is expected that the secondary CPU will be idle soon.
+ */
+ENTRY(tegra20_cpu_is_resettable_soon)
+       mov32   r1, TEGRA_PMC_VIRT + PMC_SCRATCH41
+       ldr     r12, [r1]
+       cmp     r12, #CPU_RESETTABLE_SOON
+       moveq   r0, #1
+       movne   r0, #0
+       mov     pc, lr
+ENDPROC(tegra20_cpu_is_resettable_soon)
+
+/*
+ * tegra20_sleep_cpu_secondary_finish(unsigned long v2p)
+ *
+ * Enters WFI on secondary CPU by exiting coherency.
+ */
+ENTRY(tegra20_sleep_cpu_secondary_finish)
+       stmfd   sp!, {r4-r11, lr}
+
+       mrc     p15, 0, r11, c1, c0, 1  @ save actlr before exiting coherency
+
+       /* Flush and disable the L1 data cache */
+       bl      tegra_disable_clean_inv_dcache
+
+       mov32   r0, TEGRA_PMC_VIRT + PMC_SCRATCH41
+       mov     r3, #CPU_RESETTABLE
+       str     r3, [r0]
+
+       bl      cpu_do_idle
+
+       /*
+        * cpu may be reset while in wfi, which will return through
+        * tegra_resume to cpu_resume
+        * or interrupt may wake wfi, which will return here
+        * cpu state is unchanged - MMU is on, cache is on, coherency
+        * is off, and the data cache is off
+        *
+        * r11 contains the original actlr
+        */
+
+       bl      tegra_pen_lock
+
+       mov32   r3, TEGRA_PMC_VIRT
+       add     r0, r3, #PMC_SCRATCH41
+       mov     r3, #CPU_NOT_RESETTABLE
+       str     r3, [r0]
+
+       bl      tegra_pen_unlock
+
+       /* Re-enable the data cache */
+       mrc     p15, 0, r10, c1, c0, 0
+       orr     r10, r10, #CR_C
+       mcr     p15, 0, r10, c1, c0, 0
+       isb
+
+       mcr     p15, 0, r11, c1, c0, 1  @ reenable coherency
+
+       /* Invalidate the TLBs & BTAC */
+       mov     r1, #0
+       mcr     p15, 0, r1, c8, c3, 0   @ invalidate shared TLBs
+       mcr     p15, 0, r1, c7, c1, 6   @ invalidate shared BTAC
+       dsb
+       isb
+
+       /* the cpu was running with coherency disabled,
+        * caches may be out of date */
+       bl      v7_flush_kern_cache_louis
+
+       ldmfd   sp!, {r4 - r11, pc}
+ENDPROC(tegra20_sleep_cpu_secondary_finish)
+
+/*
+ * tegra20_tear_down_cpu
+ *
+ * Switches the CPU cluster to PLL-P and enters sleep.
+ */
+ENTRY(tegra20_tear_down_cpu)
+       bl      tegra_switch_cpu_to_pllp
+       b       tegra20_enter_sleep
+ENDPROC(tegra20_tear_down_cpu)
+
+/*
+ * tegra20_enter_sleep
+ *
+ * uses flow controller to enter sleep state
+ * executes from IRAM with SDRAM in selfrefresh when target state is LP0 or LP1
+ * executes from SDRAM with target state is LP2
+ */
+tegra20_enter_sleep:
+       mov32   r6, TEGRA_FLOW_CTRL_BASE
+
+       mov     r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
+       orr     r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
+       cpu_id  r1
+       cpu_to_halt_reg r1, r1
+       str     r0, [r6, r1]
+       dsb
+       ldr     r0, [r6, r1] /* memory barrier */
+
+halted:
+       dsb
+       wfe     /* CPU should be power gated here */
+       isb
+       b       halted
+
+#endif
index 562a8e7e413dfc18f0edf9d6bab97df428a1b36c..63a15bd9b6530bdda7009000906c09db7854972e 100644 (file)
@@ -32,9 +32,6 @@
  * Should never return.
  */
 ENTRY(tegra30_hotplug_shutdown)
-       /* Turn off SMP coherency */
-       exit_smp r4, r5
-
        /* Powergate this CPU */
        mov     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
        bl      tegra30_cpu_shutdown
index 26afa7cbed11b9de91a10dd50f5634beb094f77d..364d84523fbac99e0516af8f5b91f7e398c340a7 100644 (file)
 #include "flowctrl.h"
 #include "sleep.h"
 
-#ifdef CONFIG_PM_SLEEP
+#define CLK_RESET_CCLK_BURST   0x20
+#define CLK_RESET_CCLK_DIVIDER  0x24
+
+#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
 /*
  * tegra_disable_clean_inv_dcache
  *
@@ -60,7 +63,9 @@ ENTRY(tegra_disable_clean_inv_dcache)
 
        ldmfd   sp!, {r0, r4-r5, r7, r9-r11, pc}
 ENDPROC(tegra_disable_clean_inv_dcache)
+#endif
 
+#ifdef CONFIG_PM_SLEEP
 /*
  * tegra_sleep_cpu_finish(unsigned long v2p)
  *
@@ -108,4 +113,20 @@ ENTRY(tegra_shut_off_mmu)
        mov     pc, r0
 ENDPROC(tegra_shut_off_mmu)
        .popsection
+
+/*
+ * tegra_switch_cpu_to_pllp
+ *
+ * In LP2 the normal cpu clock pllx will be turned off. Switch the CPU to pllp
+ */
+ENTRY(tegra_switch_cpu_to_pllp)
+       /* in LP2 idle (SDRAM active), set the CPU burst policy to PLLP */
+       mov32   r5, TEGRA_CLK_RESET_BASE
+       mov     r0, #(2 << 28)                  @ burst policy = run mode
+       orr     r0, r0, #(4 << 4)               @ use PLLP in run mode burst
+       str     r0, [r5, #CLK_RESET_CCLK_BURST]
+       mov     r0, #0
+       str     r0, [r5, #CLK_RESET_CCLK_DIVIDER]
+       mov     pc, lr
+ENDPROC(tegra_switch_cpu_to_pllp)
 #endif
index 9821ee725420440524cff5ae81ed8d417312cf10..4ffae541726e1d258502007482e37585e33ad4ee 100644 (file)
                                        + IO_PPSB_VIRT)
 #define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
                                        + IO_PPSB_VIRT)
+#define TEGRA_PMC_VIRT (TEGRA_PMC_BASE - IO_APB_PHYS + IO_APB_VIRT)
+
+/* PMC_SCRATCH37-39 and 41 are used for tegra_pen_lock and idle */
+#define PMC_SCRATCH37  0x130
+#define PMC_SCRATCH38  0x134
+#define PMC_SCRATCH39  0x138
+#define PMC_SCRATCH41  0x140
+
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+#define CPU_RESETTABLE         2
+#define CPU_RESETTABLE_SOON    1
+#define CPU_NOT_RESETTABLE     0
+#endif
 
 #ifdef __ASSEMBLY__
 /* returns the offset of the flow controller halt register for a cpu */
@@ -104,8 +117,11 @@ exit_l2_resume:
 .endm
 #endif /* CONFIG_CACHE_L2X0 */
 #else
+void tegra_pen_lock(void);
+void tegra_pen_unlock(void);
 void tegra_resume(void);
 int tegra_sleep_cpu_finish(unsigned long);
+void tegra_disable_clean_inv_dcache(void);
 
 #ifdef CONFIG_HOTPLUG_CPU
 void tegra20_hotplug_init(void);
@@ -115,6 +131,17 @@ static inline void tegra20_hotplug_init(void) {}
 static inline void tegra30_hotplug_init(void) {}
 #endif
 
+void tegra20_cpu_shutdown(int cpu);
+int tegra20_cpu_is_resettable_soon(void);
+void tegra20_cpu_clear_resettable(void);
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+void tegra20_cpu_set_resettable_soon(void);
+#else
+static inline void tegra20_cpu_set_resettable_soon(void) {}
+#endif
+
+int tegra20_sleep_cpu_secondary_finish(unsigned long);
+void tegra20_tear_down_cpu(void);
 int tegra30_sleep_cpu_secondary_finish(unsigned long);
 void tegra30_tear_down_cpu(void);
 
diff --git a/arch/arm/mach-tegra/tegra20_clocks.c b/arch/arm/mach-tegra/tegra20_clocks.c
deleted file mode 100644 (file)
index 4eb6bc8..0000000
+++ /dev/null
@@ -1,1623 +0,0 @@
-/*
- * arch/arm/mach-tegra/tegra20_clocks.c
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2010-2012 NVIDIA CORPORATION.  All rights reserved.
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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/module.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/clkdev.h>
-#include <linux/clk.h>
-
-#include "clock.h"
-#include "fuse.h"
-#include "iomap.h"
-#include "tegra2_emc.h"
-#include "tegra_cpu_car.h"
-
-#define RST_DEVICES                    0x004
-#define RST_DEVICES_SET                        0x300
-#define RST_DEVICES_CLR                        0x304
-#define RST_DEVICES_NUM                        3
-
-#define CLK_OUT_ENB                    0x010
-#define CLK_OUT_ENB_SET                        0x320
-#define CLK_OUT_ENB_CLR                        0x324
-#define CLK_OUT_ENB_NUM                        3
-
-#define CLK_MASK_ARM                   0x44
-#define MISC_CLK_ENB                   0x48
-
-#define OSC_CTRL                       0x50
-#define OSC_CTRL_OSC_FREQ_MASK         (3<<30)
-#define OSC_CTRL_OSC_FREQ_13MHZ                (0<<30)
-#define OSC_CTRL_OSC_FREQ_19_2MHZ      (1<<30)
-#define OSC_CTRL_OSC_FREQ_12MHZ                (2<<30)
-#define OSC_CTRL_OSC_FREQ_26MHZ                (3<<30)
-#define OSC_CTRL_MASK                  (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
-
-#define OSC_FREQ_DET                   0x58
-#define OSC_FREQ_DET_TRIG              (1<<31)
-
-#define OSC_FREQ_DET_STATUS            0x5C
-#define OSC_FREQ_DET_BUSY              (1<<31)
-#define OSC_FREQ_DET_CNT_MASK          0xFFFF
-
-#define PERIPH_CLK_SOURCE_I2S1         0x100
-#define PERIPH_CLK_SOURCE_EMC          0x19c
-#define PERIPH_CLK_SOURCE_OSC          0x1fc
-#define PERIPH_CLK_SOURCE_NUM \
-       ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
-
-#define PERIPH_CLK_SOURCE_MASK         (3<<30)
-#define PERIPH_CLK_SOURCE_SHIFT                30
-#define PERIPH_CLK_SOURCE_PWM_MASK     (7<<28)
-#define PERIPH_CLK_SOURCE_PWM_SHIFT    28
-#define PERIPH_CLK_SOURCE_ENABLE       (1<<28)
-#define PERIPH_CLK_SOURCE_DIVU71_MASK  0xFF
-#define PERIPH_CLK_SOURCE_DIVU16_MASK  0xFFFF
-#define PERIPH_CLK_SOURCE_DIV_SHIFT    0
-
-#define SDMMC_CLK_INT_FB_SEL           (1 << 23)
-#define SDMMC_CLK_INT_FB_DLY_SHIFT     16
-#define SDMMC_CLK_INT_FB_DLY_MASK      (0xF << SDMMC_CLK_INT_FB_DLY_SHIFT)
-
-#define PLL_BASE                       0x0
-#define PLL_BASE_BYPASS                        (1<<31)
-#define PLL_BASE_ENABLE                        (1<<30)
-#define PLL_BASE_REF_ENABLE            (1<<29)
-#define PLL_BASE_OVERRIDE              (1<<28)
-#define PLL_BASE_DIVP_MASK             (0x7<<20)
-#define PLL_BASE_DIVP_SHIFT            20
-#define PLL_BASE_DIVN_MASK             (0x3FF<<8)
-#define PLL_BASE_DIVN_SHIFT            8
-#define PLL_BASE_DIVM_MASK             (0x1F)
-#define PLL_BASE_DIVM_SHIFT            0
-
-#define PLL_OUT_RATIO_MASK             (0xFF<<8)
-#define PLL_OUT_RATIO_SHIFT            8
-#define PLL_OUT_OVERRIDE               (1<<2)
-#define PLL_OUT_CLKEN                  (1<<1)
-#define PLL_OUT_RESET_DISABLE          (1<<0)
-
-#define PLL_MISC(c) (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
-
-#define PLL_MISC_DCCON_SHIFT           20
-#define PLL_MISC_CPCON_SHIFT           8
-#define PLL_MISC_CPCON_MASK            (0xF<<PLL_MISC_CPCON_SHIFT)
-#define PLL_MISC_LFCON_SHIFT           4
-#define PLL_MISC_LFCON_MASK            (0xF<<PLL_MISC_LFCON_SHIFT)
-#define PLL_MISC_VCOCON_SHIFT          0
-#define PLL_MISC_VCOCON_MASK           (0xF<<PLL_MISC_VCOCON_SHIFT)
-
-#define PLLU_BASE_POST_DIV             (1<<20)
-
-#define PLLD_MISC_CLKENABLE            (1<<30)
-#define PLLD_MISC_DIV_RST              (1<<23)
-#define PLLD_MISC_DCCON_SHIFT          12
-
-#define PLLE_MISC_READY                        (1 << 15)
-
-#define PERIPH_CLK_TO_ENB_REG(c)       ((c->u.periph.clk_num / 32) * 4)
-#define PERIPH_CLK_TO_ENB_SET_REG(c)   ((c->u.periph.clk_num / 32) * 8)
-#define PERIPH_CLK_TO_ENB_BIT(c)       (1 << (c->u.periph.clk_num % 32))
-
-#define SUPER_CLK_MUX                  0x00
-#define SUPER_STATE_SHIFT              28
-#define SUPER_STATE_MASK               (0xF << SUPER_STATE_SHIFT)
-#define SUPER_STATE_STANDBY            (0x0 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_IDLE               (0x1 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_RUN                        (0x2 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_IRQ                        (0x3 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_FIQ                        (0x4 << SUPER_STATE_SHIFT)
-#define SUPER_SOURCE_MASK              0xF
-#define        SUPER_FIQ_SOURCE_SHIFT          12
-#define        SUPER_IRQ_SOURCE_SHIFT          8
-#define        SUPER_RUN_SOURCE_SHIFT          4
-#define        SUPER_IDLE_SOURCE_SHIFT         0
-
-#define SUPER_CLK_DIVIDER              0x04
-
-#define BUS_CLK_DISABLE                        (1<<3)
-#define BUS_CLK_DIV_MASK               0x3
-
-#define PMC_CTRL                       0x0
- #define PMC_CTRL_BLINK_ENB            (1 << 7)
-
-#define PMC_DPD_PADS_ORIDE             0x1c
- #define PMC_DPD_PADS_ORIDE_BLINK_ENB  (1 << 20)
-
-#define PMC_BLINK_TIMER_DATA_ON_SHIFT  0
-#define PMC_BLINK_TIMER_DATA_ON_MASK   0x7fff
-#define PMC_BLINK_TIMER_ENB            (1 << 15)
-#define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
-#define PMC_BLINK_TIMER_DATA_OFF_MASK  0xffff
-
-/* Tegra CPU clock and reset control regs */
-#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX         0x4c
-#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET     0x340
-#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR     0x344
-
-#define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
-#define CPU_RESET(cpu) (0x1111ul << (cpu))
-
-static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
-static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
-
-/*
- * Some clocks share a register with other clocks.  Any clock op that
- * non-atomically modifies a register used by another clock must lock
- * clock_register_lock first.
- */
-static DEFINE_SPINLOCK(clock_register_lock);
-
-/*
- * Some peripheral clocks share an enable bit, so refcount the enable bits
- * in registers CLK_ENABLE_L, CLK_ENABLE_H, and CLK_ENABLE_U
- */
-static int tegra_periph_clk_enable_refcount[3 * 32];
-
-#define clk_writel(value, reg) \
-       __raw_writel(value, reg_clk_base + (reg))
-#define clk_readl(reg) \
-       __raw_readl(reg_clk_base + (reg))
-#define pmc_writel(value, reg) \
-       __raw_writel(value, reg_pmc_base + (reg))
-#define pmc_readl(reg) \
-       __raw_readl(reg_pmc_base + (reg))
-
-static unsigned long clk_measure_input_freq(void)
-{
-       u32 clock_autodetect;
-       clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
-       do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
-       clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
-       if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
-               return 12000000;
-       } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
-               return 13000000;
-       } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
-               return 19200000;
-       } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
-               return 26000000;
-       } else {
-               pr_err("%s: Unexpected clock autodetect value %d",
-                                               __func__, clock_autodetect);
-               BUG();
-               return 0;
-       }
-}
-
-static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate)
-{
-       s64 divider_u71 = parent_rate * 2;
-       divider_u71 += rate - 1;
-       do_div(divider_u71, rate);
-
-       if (divider_u71 - 2 < 0)
-               return 0;
-
-       if (divider_u71 - 2 > 255)
-               return -EINVAL;
-
-       return divider_u71 - 2;
-}
-
-static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
-{
-       s64 divider_u16;
-
-       divider_u16 = parent_rate;
-       divider_u16 += rate - 1;
-       do_div(divider_u16, rate);
-
-       if (divider_u16 - 1 < 0)
-               return 0;
-
-       if (divider_u16 - 1 > 0xFFFF)
-               return -EINVAL;
-
-       return divider_u16 - 1;
-}
-
-static unsigned long tegra_clk_fixed_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       return to_clk_tegra(hw)->fixed_rate;
-}
-
-struct clk_ops tegra_clk_32k_ops = {
-       .recalc_rate = tegra_clk_fixed_recalc_rate,
-};
-
-/* clk_m functions */
-static unsigned long tegra20_clk_m_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       if (!to_clk_tegra(hw)->fixed_rate)
-               to_clk_tegra(hw)->fixed_rate = clk_measure_input_freq();
-       return to_clk_tegra(hw)->fixed_rate;
-}
-
-static void tegra20_clk_m_init(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 osc_ctrl = clk_readl(OSC_CTRL);
-       u32 auto_clock_control = osc_ctrl & ~OSC_CTRL_OSC_FREQ_MASK;
-
-       switch (c->fixed_rate) {
-       case 12000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
-               break;
-       case 13000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
-               break;
-       case 19200000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
-               break;
-       case 26000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
-               break;
-       default:
-               BUG();
-       }
-       clk_writel(auto_clock_control, OSC_CTRL);
-}
-
-struct clk_ops tegra_clk_m_ops = {
-       .init = tegra20_clk_m_init,
-       .recalc_rate = tegra20_clk_m_recalc_rate,
-};
-
-/* super clock functions */
-/* "super clocks" on tegra have two-stage muxes and a clock skipping
- * super divider.  We will ignore the clock skipping divider, since we
- * can't lower the voltage when using the clock skip, but we can if we
- * lower the PLL frequency.
- */
-static int tegra20_super_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg + SUPER_CLK_MUX);
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       c->state = ON;
-       return c->state;
-}
-
-static int tegra20_super_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
-       return 0;
-}
-
-static void tegra20_super_clk_disable(struct clk_hw *hw)
-{
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       /* oops - don't disable the CPU clock! */
-       BUG();
-}
-
-static u8 tegra20_super_clk_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       int val = clk_readl(c->reg + SUPER_CLK_MUX);
-       int source;
-       int shift;
-
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       source = (val >> shift) & SUPER_SOURCE_MASK;
-       return source;
-}
-
-static int tegra20_super_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg + SUPER_CLK_MUX);
-       int shift;
-
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       val &= ~(SUPER_SOURCE_MASK << shift);
-       val |= index << shift;
-
-       clk_writel(val, c->reg);
-
-       return 0;
-}
-
-/* FIX ME: Need to switch parents to change the source PLL rate */
-static unsigned long tegra20_super_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       return prate;
-}
-
-static long tegra20_super_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       return *prate;
-}
-
-static int tegra20_super_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       return 0;
-}
-
-struct clk_ops tegra_super_ops = {
-       .is_enabled = tegra20_super_clk_is_enabled,
-       .enable = tegra20_super_clk_enable,
-       .disable = tegra20_super_clk_disable,
-       .set_parent = tegra20_super_clk_set_parent,
-       .get_parent = tegra20_super_clk_get_parent,
-       .set_rate = tegra20_super_clk_set_rate,
-       .round_rate = tegra20_super_clk_round_rate,
-       .recalc_rate = tegra20_super_clk_recalc_rate,
-};
-
-static unsigned long tegra20_twd_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-struct clk_ops tegra_twd_ops = {
-       .recalc_rate = tegra20_twd_clk_recalc_rate,
-};
-
-static u8 tegra20_cop_clk_get_parent(struct clk_hw *hw)
-{
-       return 0;
-}
-
-struct clk_ops tegra_cop_ops = {
-       .get_parent = tegra20_cop_clk_get_parent,
-};
-
-/* virtual cop clock functions. Used to acquire the fake 'cop' clock to
- * reset the COP block (i.e. AVP) */
-void tegra2_cop_clk_reset(struct clk_hw *hw, bool assert)
-{
-       unsigned long reg = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
-
-       pr_debug("%s %s\n", __func__, assert ? "assert" : "deassert");
-       clk_writel(1 << 1, reg);
-}
-
-/* bus clock functions */
-static int tegra20_bus_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-
-       c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
-       return c->state;
-}
-
-static int tegra20_bus_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-       u32 val;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       val = clk_readl(c->reg);
-       val &= ~(BUS_CLK_DISABLE << c->reg_shift);
-       clk_writel(val, c->reg);
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-
-       return 0;
-}
-
-static void tegra20_bus_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-       u32 val;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       val = clk_readl(c->reg);
-       val |= BUS_CLK_DISABLE << c->reg_shift;
-       clk_writel(val, c->reg);
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-}
-
-static unsigned long tegra20_bus_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       u64 rate = prate;
-
-       c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
-       c->mul = 1;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-       return rate;
-}
-
-static int tegra20_bus_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       int ret = -EINVAL;
-       unsigned long flags;
-       u32 val;
-       int i;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       val = clk_readl(c->reg);
-       for (i = 1; i <= 4; i++) {
-               if (rate == parent_rate / i) {
-                       val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
-                       val |= (i - 1) << c->reg_shift;
-                       clk_writel(val, c->reg);
-                       c->div = i;
-                       c->mul = 1;
-                       ret = 0;
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-
-       return ret;
-}
-
-static long tegra20_bus_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       unsigned long parent_rate = *prate;
-       s64 divider;
-
-       if (rate >= parent_rate)
-               return rate;
-
-       divider = parent_rate;
-       divider += rate - 1;
-       do_div(divider, rate);
-
-       if (divider < 0)
-               return divider;
-
-       if (divider > 4)
-               divider = 4;
-       do_div(parent_rate, divider);
-
-       return parent_rate;
-}
-
-struct clk_ops tegra_bus_ops = {
-       .is_enabled = tegra20_bus_clk_is_enabled,
-       .enable = tegra20_bus_clk_enable,
-       .disable = tegra20_bus_clk_disable,
-       .set_rate = tegra20_bus_clk_set_rate,
-       .round_rate = tegra20_bus_clk_round_rate,
-       .recalc_rate = tegra20_bus_clk_recalc_rate,
-};
-
-/* Blink output functions */
-static int tegra20_blink_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = pmc_readl(PMC_CTRL);
-       c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
-       return c->state;
-}
-
-static unsigned long tegra20_blink_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = prate;
-       u32 val;
-
-       c->mul = 1;
-       val = pmc_readl(c->reg);
-
-       if (val & PMC_BLINK_TIMER_ENB) {
-               unsigned int on_off;
-
-               on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
-                       PMC_BLINK_TIMER_DATA_ON_MASK;
-               val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off += val;
-               /* each tick in the blink timer is 4 32KHz clocks */
-               c->div = on_off * 4;
-       } else {
-               c->div = 1;
-       }
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-       return rate;
-}
-
-static int tegra20_blink_clk_enable(struct clk_hw *hw)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_DPD_PADS_ORIDE);
-       pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
-
-       val = pmc_readl(PMC_CTRL);
-       pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
-
-       return 0;
-}
-
-static void tegra20_blink_clk_disable(struct clk_hw *hw)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_CTRL);
-       pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
-
-       val = pmc_readl(PMC_DPD_PADS_ORIDE);
-       pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
-}
-
-static int tegra20_blink_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (rate >= parent_rate) {
-               c->div = 1;
-               pmc_writel(0, c->reg);
-       } else {
-               unsigned int on_off;
-               u32 val;
-
-               on_off = DIV_ROUND_UP(parent_rate / 8, rate);
-               c->div = on_off * 8;
-
-               val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
-                       PMC_BLINK_TIMER_DATA_ON_SHIFT;
-               on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val |= on_off;
-               val |= PMC_BLINK_TIMER_ENB;
-               pmc_writel(val, c->reg);
-       }
-
-       return 0;
-}
-
-static long tegra20_blink_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       int div;
-       int mul;
-       long round_rate = *prate;
-
-       mul = 1;
-
-       if (rate >= *prate) {
-               div = 1;
-       } else {
-               div = DIV_ROUND_UP(*prate / 8, rate);
-               div *= 8;
-       }
-
-       round_rate *= mul;
-       round_rate += div - 1;
-       do_div(round_rate, div);
-
-       return round_rate;
-}
-
-struct clk_ops tegra_blink_clk_ops = {
-       .is_enabled = tegra20_blink_clk_is_enabled,
-       .enable = tegra20_blink_clk_enable,
-       .disable = tegra20_blink_clk_disable,
-       .set_rate = tegra20_blink_clk_set_rate,
-       .round_rate = tegra20_blink_clk_round_rate,
-       .recalc_rate = tegra20_blink_clk_recalc_rate,
-};
-
-/* PLL Functions */
-static int tegra20_pll_clk_wait_for_lock(struct clk_tegra *c)
-{
-       udelay(c->u.pll.lock_delay);
-       return 0;
-}
-
-static int tegra20_pll_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg + PLL_BASE);
-
-       c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
-       return c->state;
-}
-
-static unsigned long tegra20_pll_clk_recalc_rate(struct clk_hw *hw,
-                               unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg + PLL_BASE);
-       u64 rate = prate;
-
-       if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
-               const struct clk_pll_freq_table *sel;
-               for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-                       if (sel->input_rate == prate &&
-                               sel->output_rate == c->u.pll.fixed_rate) {
-                               c->mul = sel->n;
-                               c->div = sel->m * sel->p;
-                               break;
-                       }
-               }
-               pr_err("Clock %s has unknown fixed frequency\n",
-                       __clk_get_name(hw->clk));
-               BUG();
-       } else if (val & PLL_BASE_BYPASS) {
-               c->mul = 1;
-               c->div = 1;
-       } else {
-               c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
-               c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
-               if (c->flags & PLLU)
-                       c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
-               else
-                       c->div *= (val & PLL_BASE_DIVP_MASK) ? 2 : 1;
-       }
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-       return rate;
-}
-
-static int tegra20_pll_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       val = clk_readl(c->reg + PLL_BASE);
-       val &= ~PLL_BASE_BYPASS;
-       val |= PLL_BASE_ENABLE;
-       clk_writel(val, c->reg + PLL_BASE);
-
-       tegra20_pll_clk_wait_for_lock(c);
-
-       return 0;
-}
-
-static void tegra20_pll_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       val = clk_readl(c->reg);
-       val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
-       clk_writel(val, c->reg);
-}
-
-static int tegra20_pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long input_rate = parent_rate;
-       const struct clk_pll_freq_table *sel;
-       u32 val;
-
-       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
-
-       if (c->flags & PLL_FIXED) {
-               int ret = 0;
-               if (rate != c->u.pll.fixed_rate) {
-                       pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
-                               __func__, __clk_get_name(hw->clk),
-                               c->u.pll.fixed_rate, rate);
-                       ret = -EINVAL;
-               }
-               return ret;
-       }
-
-       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-               if (sel->input_rate == input_rate && sel->output_rate == rate) {
-                       c->mul = sel->n;
-                       c->div = sel->m * sel->p;
-
-                       val = clk_readl(c->reg + PLL_BASE);
-                       if (c->flags & PLL_FIXED)
-                               val |= PLL_BASE_OVERRIDE;
-                       val &= ~(PLL_BASE_DIVP_MASK | PLL_BASE_DIVN_MASK |
-                                PLL_BASE_DIVM_MASK);
-                       val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
-                               (sel->n << PLL_BASE_DIVN_SHIFT);
-                       BUG_ON(sel->p < 1 || sel->p > 2);
-                       if (c->flags & PLLU) {
-                               if (sel->p == 1)
-                                       val |= PLLU_BASE_POST_DIV;
-                       } else {
-                               if (sel->p == 2)
-                                       val |= 1 << PLL_BASE_DIVP_SHIFT;
-                       }
-                       clk_writel(val, c->reg + PLL_BASE);
-
-                       if (c->flags & PLL_HAS_CPCON) {
-                               val = clk_readl(c->reg + PLL_MISC(c));
-                               val &= ~PLL_MISC_CPCON_MASK;
-                               val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
-                               clk_writel(val, c->reg + PLL_MISC(c));
-                       }
-
-                       if (c->state == ON)
-                               tegra20_pll_clk_enable(hw);
-                       return 0;
-               }
-       }
-       return -EINVAL;
-}
-
-static long tegra20_pll_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       const struct clk_pll_freq_table *sel;
-       unsigned long input_rate = *prate;
-       u64 output_rate = *prate;
-       int mul;
-       int div;
-
-       if (c->flags & PLL_FIXED)
-               return c->u.pll.fixed_rate;
-
-       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++)
-               if (sel->input_rate == input_rate && sel->output_rate == rate) {
-                       mul = sel->n;
-                       div = sel->m * sel->p;
-                       break;
-               }
-
-       if (sel->input_rate == 0)
-               return -EINVAL;
-
-       output_rate *= mul;
-       output_rate += div - 1; /* round up */
-       do_div(output_rate, div);
-
-       return output_rate;
-}
-
-struct clk_ops tegra_pll_ops = {
-       .is_enabled = tegra20_pll_clk_is_enabled,
-       .enable = tegra20_pll_clk_enable,
-       .disable = tegra20_pll_clk_disable,
-       .set_rate = tegra20_pll_clk_set_rate,
-       .recalc_rate = tegra20_pll_clk_recalc_rate,
-       .round_rate = tegra20_pll_clk_round_rate,
-};
-
-static void tegra20_pllx_clk_init(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (tegra_sku_id == 7)
-               c->max_rate = 750000000;
-}
-
-struct clk_ops tegra_pllx_ops = {
-       .init = tegra20_pllx_clk_init,
-       .is_enabled = tegra20_pll_clk_is_enabled,
-       .enable = tegra20_pll_clk_enable,
-       .disable = tegra20_pll_clk_disable,
-       .set_rate = tegra20_pll_clk_set_rate,
-       .recalc_rate = tegra20_pll_clk_recalc_rate,
-       .round_rate = tegra20_pll_clk_round_rate,
-};
-
-static int tegra20_plle_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       mdelay(1);
-
-       val = clk_readl(c->reg + PLL_BASE);
-       if (!(val & PLLE_MISC_READY))
-               return -EBUSY;
-
-       val = clk_readl(c->reg + PLL_BASE);
-       val |= PLL_BASE_ENABLE | PLL_BASE_BYPASS;
-       clk_writel(val, c->reg + PLL_BASE);
-
-       return 0;
-}
-
-struct clk_ops tegra_plle_ops = {
-       .is_enabled = tegra20_pll_clk_is_enabled,
-       .enable = tegra20_plle_clk_enable,
-       .set_rate = tegra20_pll_clk_set_rate,
-       .recalc_rate = tegra20_pll_clk_recalc_rate,
-       .round_rate = tegra20_pll_clk_round_rate,
-};
-
-/* Clock divider ops */
-static int tegra20_pll_div_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-
-       val >>= c->reg_shift;
-       c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
-       if (!(val & PLL_OUT_RESET_DISABLE))
-               c->state = OFF;
-       return c->state;
-}
-
-static unsigned long tegra20_pll_div_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = prate;
-       u32 val = clk_readl(c->reg);
-       u32 divu71;
-
-       val >>= c->reg_shift;
-
-       if (c->flags & DIV_U71) {
-               divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
-               c->div = (divu71 + 2);
-               c->mul = 2;
-       } else if (c->flags & DIV_2) {
-               c->div = 2;
-               c->mul = 1;
-       } else {
-               c->div = 1;
-               c->mul = 1;
-       }
-
-       rate *= c->mul;
-       rate += c->div - 1; /* round up */
-       do_div(rate, c->div);
-
-       return rate;
-}
-
-static int tegra20_pll_div_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-       u32 new_val;
-       u32 val;
-
-       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
-
-       if (c->flags & DIV_U71) {
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               new_val = val >> c->reg_shift;
-               new_val &= 0xFFFF;
-
-               new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
-
-               val &= ~(0xFFFF << c->reg_shift);
-               val |= new_val << c->reg_shift;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-               return 0;
-       } else if (c->flags & DIV_2) {
-               BUG_ON(!(c->flags & PLLD));
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               val &= ~PLLD_MISC_DIV_RST;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static void tegra20_pll_div_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-       u32 new_val;
-       u32 val;
-
-       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
-
-       if (c->flags & DIV_U71) {
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               new_val = val >> c->reg_shift;
-               new_val &= 0xFFFF;
-
-               new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
-
-               val &= ~(0xFFFF << c->reg_shift);
-               val |= new_val << c->reg_shift;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-       } else if (c->flags & DIV_2) {
-               BUG_ON(!(c->flags & PLLD));
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               val |= PLLD_MISC_DIV_RST;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-       }
-}
-
-static int tegra20_pll_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-       int divider_u71;
-       u32 new_val;
-       u32 val;
-
-       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
-
-       if (c->flags & DIV_U71) {
-               divider_u71 = clk_div71_get_divider(parent_rate, rate);
-               if (divider_u71 >= 0) {
-                       spin_lock_irqsave(&clock_register_lock, flags);
-                       val = clk_readl(c->reg);
-                       new_val = val >> c->reg_shift;
-                       new_val &= 0xFFFF;
-                       if (c->flags & DIV_U71_FIXED)
-                               new_val |= PLL_OUT_OVERRIDE;
-                       new_val &= ~PLL_OUT_RATIO_MASK;
-                       new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
-
-                       val &= ~(0xFFFF << c->reg_shift);
-                       val |= new_val << c->reg_shift;
-                       clk_writel(val, c->reg);
-                       c->div = divider_u71 + 2;
-                       c->mul = 2;
-                       spin_unlock_irqrestore(&clock_register_lock, flags);
-                       return 0;
-               }
-       } else if (c->flags & DIV_2) {
-               if (parent_rate == rate * 2)
-                       return 0;
-       }
-       return -EINVAL;
-}
-
-static long tegra20_pll_div_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long parent_rate = *prate;
-       int divider;
-
-       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_2) {
-               return DIV_ROUND_UP(parent_rate, 2);
-       }
-       return -EINVAL;
-}
-
-struct clk_ops tegra_pll_div_ops = {
-       .is_enabled = tegra20_pll_div_clk_is_enabled,
-       .enable = tegra20_pll_div_clk_enable,
-       .disable = tegra20_pll_div_clk_disable,
-       .set_rate = tegra20_pll_div_clk_set_rate,
-       .round_rate = tegra20_pll_div_clk_round_rate,
-       .recalc_rate = tegra20_pll_div_clk_recalc_rate,
-};
-
-/* Periph clk ops */
-
-static int tegra20_periph_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       c->state = ON;
-
-       if (!c->u.periph.clk_num)
-               goto out;
-
-       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
-                       PERIPH_CLK_TO_ENB_BIT(c)))
-               c->state = OFF;
-
-       if (!(c->flags & PERIPH_NO_RESET))
-               if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
-                               PERIPH_CLK_TO_ENB_BIT(c))
-                       c->state = OFF;
-
-out:
-       return c->state;
-}
-
-static int tegra20_periph_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-       u32 val;
-
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       if (!c->u.periph.clk_num)
-               return 0;
-
-       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
-       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 1)
-               return 0;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
-       if (!(c->flags & PERIPH_NO_RESET) && !(c->flags & PERIPH_MANUAL_RESET))
-               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-                       RST_DEVICES_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
-       if (c->flags & PERIPH_EMC_ENB) {
-               /* The EMC peripheral clock has 2 extra enable bits */
-               /* FIXME: Do they need to be disabled? */
-               val = clk_readl(c->reg);
-               val |= 0x3 << 24;
-               clk_writel(val, c->reg);
-       }
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-
-       return 0;
-}
-
-static void tegra20_periph_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long flags;
-
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       if (!c->u.periph.clk_num)
-               return;
-
-       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
-
-       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 0)
-               return;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-}
-
-void tegra2_periph_clk_reset(struct clk_hw *hw, bool assert)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long base = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
-
-       pr_debug("%s %s on clock %s\n", __func__,
-               assert ? "assert" : "deassert", __clk_get_name(hw->clk));
-
-       BUG_ON(!c->u.periph.clk_num);
-
-       if (!(c->flags & PERIPH_NO_RESET))
-               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-                          base + PERIPH_CLK_TO_ENB_SET_REG(c));
-}
-
-static int tegra20_periph_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       u32 mask;
-       u32 shift;
-
-       pr_debug("%s: %s %d\n", __func__, __clk_get_name(hw->clk), index);
-
-       if (c->flags & MUX_PWM) {
-               shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
-               mask = PERIPH_CLK_SOURCE_PWM_MASK;
-       } else {
-               shift = PERIPH_CLK_SOURCE_SHIFT;
-               mask = PERIPH_CLK_SOURCE_MASK;
-       }
-
-       val = clk_readl(c->reg);
-       val &= ~mask;
-       val |= (index) << shift;
-
-       clk_writel(val, c->reg);
-
-       return 0;
-}
-
-static u8 tegra20_periph_clk_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       u32 mask;
-       u32 shift;
-
-       if (c->flags & MUX_PWM) {
-               shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
-               mask = PERIPH_CLK_SOURCE_PWM_MASK;
-       } else {
-               shift = PERIPH_CLK_SOURCE_SHIFT;
-               mask = PERIPH_CLK_SOURCE_MASK;
-       }
-
-       if (c->flags & MUX)
-               return (val & mask) >> shift;
-       else
-               return 0;
-}
-
-static unsigned long tegra20_periph_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long rate = prate;
-       u32 val = clk_readl(c->reg);
-
-       if (c->flags & DIV_U71) {
-               u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
-               c->div = divu71 + 2;
-               c->mul = 2;
-       } else if (c->flags & DIV_U16) {
-               u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
-               c->div = divu16 + 1;
-               c->mul = 1;
-       } else {
-               c->div = 1;
-               c->mul = 1;
-               return rate;
-       }
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-static int tegra20_periph_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       int divider;
-
-       val = clk_readl(c->reg);
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(parent_rate, rate);
-
-               if (divider >= 0) {
-                       val = clk_readl(c->reg);
-                       val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
-                       val |= divider;
-                       clk_writel(val, c->reg);
-                       c->div = divider + 2;
-                       c->mul = 2;
-                       return 0;
-               }
-       } else if (c->flags & DIV_U16) {
-               divider = clk_div16_get_divider(parent_rate, rate);
-               if (divider >= 0) {
-                       val = clk_readl(c->reg);
-                       val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
-                       val |= divider;
-                       clk_writel(val, c->reg);
-                       c->div = divider + 1;
-                       c->mul = 1;
-                       return 0;
-               }
-       } else if (parent_rate <= rate) {
-               c->div = 1;
-               c->mul = 1;
-               return 0;
-       }
-
-       return -EINVAL;
-}
-
-static long tegra20_periph_clk_round_rate(struct clk_hw *hw,
-       unsigned long rate, unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
-       int divider;
-
-       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
-
-       if (prate)
-               parent_rate = *prate;
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-
-               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_U16) {
-               divider = clk_div16_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-               return DIV_ROUND_UP(parent_rate, divider + 1);
-       }
-       return -EINVAL;
-}
-
-struct clk_ops tegra_periph_clk_ops = {
-       .is_enabled = tegra20_periph_clk_is_enabled,
-       .enable = tegra20_periph_clk_enable,
-       .disable = tegra20_periph_clk_disable,
-       .set_parent = tegra20_periph_clk_set_parent,
-       .get_parent = tegra20_periph_clk_get_parent,
-       .set_rate = tegra20_periph_clk_set_rate,
-       .round_rate = tegra20_periph_clk_round_rate,
-       .recalc_rate = tegra20_periph_clk_recalc_rate,
-};
-
-/* External memory controller clock ops */
-static void tegra20_emc_clk_init(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       c->max_rate = __clk_get_rate(hw->clk);
-}
-
-static long tegra20_emc_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       long emc_rate;
-       long clk_rate;
-
-       /*
-        * The slowest entry in the EMC clock table that is at least as
-        * fast as rate.
-        */
-       emc_rate = tegra_emc_round_rate(rate);
-       if (emc_rate < 0)
-               return c->max_rate;
-
-       /*
-        * The fastest rate the PLL will generate that is at most the
-        * requested rate.
-        */
-       clk_rate = tegra20_periph_clk_round_rate(hw, emc_rate, NULL);
-
-       /*
-        * If this fails, and emc_rate > clk_rate, it's because the maximum
-        * rate in the EMC tables is larger than the maximum rate of the EMC
-        * clock. The EMC clock's max rate is the rate it was running when the
-        * kernel booted. Such a mismatch is probably due to using the wrong
-        * BCT, i.e. using a Tegra20 BCT with an EMC table written for Tegra25.
-        */
-       WARN_ONCE(emc_rate != clk_rate,
-               "emc_rate %ld != clk_rate %ld",
-               emc_rate, clk_rate);
-
-       return emc_rate;
-}
-
-static int tegra20_emc_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       int ret;
-
-       /*
-        * The Tegra2 memory controller has an interlock with the clock
-        * block that allows memory shadowed registers to be updated,
-        * and then transfer them to the main registers at the same
-        * time as the clock update without glitches.
-        */
-       ret = tegra_emc_set_rate(rate);
-       if (ret < 0)
-               return ret;
-
-       ret = tegra20_periph_clk_set_rate(hw, rate, parent_rate);
-       udelay(1);
-
-       return ret;
-}
-
-struct clk_ops tegra_emc_clk_ops = {
-       .init = tegra20_emc_clk_init,
-       .is_enabled = tegra20_periph_clk_is_enabled,
-       .enable = tegra20_periph_clk_enable,
-       .disable = tegra20_periph_clk_disable,
-       .set_parent = tegra20_periph_clk_set_parent,
-       .get_parent = tegra20_periph_clk_get_parent,
-       .set_rate = tegra20_emc_clk_set_rate,
-       .round_rate = tegra20_emc_clk_round_rate,
-       .recalc_rate = tegra20_periph_clk_recalc_rate,
-};
-
-/* Clock doubler ops */
-static int tegra20_clk_double_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       c->state = ON;
-
-       if (!c->u.periph.clk_num)
-               goto out;
-
-       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
-                       PERIPH_CLK_TO_ENB_BIT(c)))
-               c->state = OFF;
-
-out:
-       return c->state;
-};
-
-static unsigned long tegra20_clk_double_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = prate;
-
-       c->mul = 2;
-       c->div = 1;
-
-       rate *= c->mul;
-       rate += c->div - 1; /* round up */
-       do_div(rate, c->div);
-
-       return rate;
-}
-
-static long tegra20_clk_double_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       unsigned long output_rate = *prate;
-
-       do_div(output_rate, 2);
-       return output_rate;
-}
-
-static int tegra20_clk_double_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       if (rate != 2 * parent_rate)
-               return -EINVAL;
-       return 0;
-}
-
-struct clk_ops tegra_clk_double_ops = {
-       .is_enabled = tegra20_clk_double_is_enabled,
-       .enable = tegra20_periph_clk_enable,
-       .disable = tegra20_periph_clk_disable,
-       .set_rate = tegra20_clk_double_set_rate,
-       .recalc_rate = tegra20_clk_double_recalc_rate,
-       .round_rate = tegra20_clk_double_round_rate,
-};
-
-/* Audio sync clock ops */
-static int tegra20_audio_sync_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-
-       c->state = (val & (1<<4)) ? OFF : ON;
-       return c->state;
-}
-
-static int tegra20_audio_sync_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       clk_writel(0, c->reg);
-       return 0;
-}
-
-static void tegra20_audio_sync_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       clk_writel(1, c->reg);
-}
-
-static u8 tegra20_audio_sync_clk_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       int source;
-
-       source = val & 0xf;
-       return source;
-}
-
-static int tegra20_audio_sync_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg);
-       val &= ~0xf;
-       val |= index;
-
-       clk_writel(val, c->reg);
-
-       return 0;
-}
-
-struct clk_ops tegra_audio_sync_clk_ops = {
-       .is_enabled = tegra20_audio_sync_clk_is_enabled,
-       .enable = tegra20_audio_sync_clk_enable,
-       .disable = tegra20_audio_sync_clk_disable,
-       .set_parent = tegra20_audio_sync_clk_set_parent,
-       .get_parent = tegra20_audio_sync_clk_get_parent,
-};
-
-/* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */
-
-static int tegra20_cdev_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
-        * currently done in the pinmux code. */
-       c->state = ON;
-
-       BUG_ON(!c->u.periph.clk_num);
-
-       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
-                       PERIPH_CLK_TO_ENB_BIT(c)))
-               c->state = OFF;
-       return c->state;
-}
-
-static int tegra20_cdev_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       BUG_ON(!c->u.periph.clk_num);
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
-       return 0;
-}
-
-static void tegra20_cdev_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       BUG_ON(!c->u.periph.clk_num);
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
-}
-
-static unsigned long tegra20_cdev_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       return to_clk_tegra(hw)->fixed_rate;
-}
-
-struct clk_ops tegra_cdev_clk_ops = {
-       .is_enabled = tegra20_cdev_clk_is_enabled,
-       .enable = tegra20_cdev_clk_enable,
-       .disable = tegra20_cdev_clk_disable,
-       .recalc_rate = tegra20_cdev_recalc_rate,
-};
-
-/* Tegra20 CPU clock and reset control functions */
-static void tegra20_wait_cpu_in_reset(u32 cpu)
-{
-       unsigned int reg;
-
-       do {
-               reg = readl(reg_clk_base +
-                           TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
-               cpu_relax();
-       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
-
-       return;
-}
-
-static void tegra20_put_cpu_in_reset(u32 cpu)
-{
-       writel(CPU_RESET(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
-       dmb();
-}
-
-static void tegra20_cpu_out_of_reset(u32 cpu)
-{
-       writel(CPU_RESET(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
-       wmb();
-}
-
-static void tegra20_enable_cpu_clock(u32 cpu)
-{
-       unsigned int reg;
-
-       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-       writel(reg & ~CPU_CLOCK(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-       barrier();
-       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-}
-
-static void tegra20_disable_cpu_clock(u32 cpu)
-{
-       unsigned int reg;
-
-       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-       writel(reg | CPU_CLOCK(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-}
-
-static struct tegra_cpu_car_ops tegra20_cpu_car_ops = {
-       .wait_for_reset = tegra20_wait_cpu_in_reset,
-       .put_in_reset   = tegra20_put_cpu_in_reset,
-       .out_of_reset   = tegra20_cpu_out_of_reset,
-       .enable_clock   = tegra20_enable_cpu_clock,
-       .disable_clock  = tegra20_disable_cpu_clock,
-};
-
-void __init tegra20_cpu_car_ops_init(void)
-{
-       tegra_cpu_car_ops = &tegra20_cpu_car_ops;
-}
diff --git a/arch/arm/mach-tegra/tegra20_clocks.h b/arch/arm/mach-tegra/tegra20_clocks.h
deleted file mode 100644 (file)
index 8bfd31b..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __MACH_TEGRA20_CLOCK_H
-#define __MACH_TEGRA20_CLOCK_H
-
-extern struct clk_ops tegra_clk_32k_ops;
-extern struct clk_ops tegra_pll_ops;
-extern struct clk_ops tegra_clk_m_ops;
-extern struct clk_ops tegra_pll_div_ops;
-extern struct clk_ops tegra_pllx_ops;
-extern struct clk_ops tegra_plle_ops;
-extern struct clk_ops tegra_clk_double_ops;
-extern struct clk_ops tegra_cdev_clk_ops;
-extern struct clk_ops tegra_audio_sync_clk_ops;
-extern struct clk_ops tegra_super_ops;
-extern struct clk_ops tegra_cpu_ops;
-extern struct clk_ops tegra_twd_ops;
-extern struct clk_ops tegra_cop_ops;
-extern struct clk_ops tegra_bus_ops;
-extern struct clk_ops tegra_blink_clk_ops;
-extern struct clk_ops tegra_emc_clk_ops;
-extern struct clk_ops tegra_periph_clk_ops;
-extern struct clk_ops tegra_clk_shared_bus_ops;
-
-void tegra2_periph_clk_reset(struct clk_hw *hw, bool assert);
-void tegra2_cop_clk_reset(struct clk_hw *hw, bool assert);
-
-#endif
diff --git a/arch/arm/mach-tegra/tegra20_clocks_data.c b/arch/arm/mach-tegra/tegra20_clocks_data.c
deleted file mode 100644 (file)
index a23a073..0000000
+++ /dev/null
@@ -1,1143 +0,0 @@
-/*
- * arch/arm/mach-tegra/tegra2_clocks.c
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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/clk-private.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-
-#include "clock.h"
-#include "fuse.h"
-#include "tegra2_emc.h"
-#include "tegra20_clocks.h"
-#include "tegra_cpu_car.h"
-
-/* Clock definitions */
-
-#define DEFINE_CLK_TEGRA(_name, _rate, _ops, _flags,           \
-                  _parent_names, _parents, _parent)            \
-       static struct clk tegra_##_name = {                     \
-               .hw = &tegra_##_name##_hw.hw,                   \
-               .name = #_name,                                 \
-               .rate = _rate,                                  \
-               .ops = _ops,                                    \
-               .flags = _flags,                                \
-               .parent_names = _parent_names,                  \
-               .parents = _parents,                            \
-               .num_parents = ARRAY_SIZE(_parent_names),       \
-               .parent = _parent,                              \
-       };
-
-static struct clk tegra_clk_32k;
-static struct clk_tegra tegra_clk_32k_hw = {
-       .hw = {
-               .clk = &tegra_clk_32k,
-       },
-       .fixed_rate = 32768,
-};
-
-static struct clk tegra_clk_32k = {
-       .name = "clk_32k",
-       .rate = 32768,
-       .ops = &tegra_clk_32k_ops,
-       .hw = &tegra_clk_32k_hw.hw,
-       .flags = CLK_IS_ROOT,
-};
-
-static struct clk tegra_clk_m;
-static struct clk_tegra tegra_clk_m_hw = {
-       .hw = {
-               .clk = &tegra_clk_m,
-       },
-       .flags = ENABLE_ON_INIT,
-       .reg = 0x1fc,
-       .reg_shift = 28,
-       .max_rate = 26000000,
-       .fixed_rate = 0,
-};
-
-static struct clk tegra_clk_m = {
-       .name = "clk_m",
-       .ops = &tegra_clk_m_ops,
-       .hw = &tegra_clk_m_hw.hw,
-       .flags = CLK_IS_ROOT,
-};
-
-#define DEFINE_PLL(_name, _flags, _reg, _max_rate, _input_min, \
-                  _input_max, _cf_min, _cf_max, _vco_min,      \
-                  _vco_max, _freq_table, _lock_delay, _ops,    \
-                  _fixed_rate, _parent)                        \
-       static const char *tegra_##_name##_parent_names[] = {   \
-               #_parent,                                       \
-       };                                                      \
-       static struct clk *tegra_##_name##_parents[] = {        \
-               &tegra_##_parent,                               \
-       };                                                      \
-       static struct clk tegra_##_name;                        \
-       static struct clk_tegra tegra_##_name##_hw = {          \
-               .hw = {                                         \
-                       .clk = &tegra_##_name,                  \
-               },                                              \
-               .flags = _flags,                                \
-               .reg = _reg,                                    \
-               .max_rate = _max_rate,                          \
-               .u.pll = {                                      \
-                       .input_min = _input_min,                \
-                       .input_max = _input_max,                \
-                       .cf_min = _cf_min,                      \
-                       .cf_max = _cf_max,                      \
-                       .vco_min = _vco_min,                    \
-                       .vco_max = _vco_max,                    \
-                       .freq_table = _freq_table,              \
-                       .lock_delay = _lock_delay,              \
-                       .fixed_rate = _fixed_rate,              \
-               },                                              \
-       };                                                      \
-       static struct clk tegra_##_name = {                     \
-               .name = #_name,                                 \
-               .ops = &_ops,                                   \
-               .hw = &tegra_##_name##_hw.hw,                   \
-               .parent = &tegra_##_parent,                     \
-               .parent_names = tegra_##_name##_parent_names,   \
-               .parents = tegra_##_name##_parents,             \
-               .num_parents = 1,                               \
-       };
-
-#define DEFINE_PLL_OUT(_name, _flags, _reg, _reg_shift,                \
-               _max_rate, _ops, _parent, _clk_flags)           \
-       static const char *tegra_##_name##_parent_names[] = {   \
-               #_parent,                                       \
-       };                                                      \
-       static struct clk *tegra_##_name##_parents[] = {        \
-               &tegra_##_parent,                               \
-       };                                                      \
-       static struct clk tegra_##_name;                        \
-       static struct clk_tegra tegra_##_name##_hw = {          \
-               .hw = {                                         \
-                       .clk = &tegra_##_name,                  \
-               },                                              \
-               .flags = _flags,                                \
-               .reg = _reg,                                    \
-               .max_rate = _max_rate,                          \
-               .reg_shift = _reg_shift,                        \
-       };                                                      \
-       static struct clk tegra_##_name = {                     \
-               .name = #_name,                                 \
-               .ops = &tegra_pll_div_ops,                      \
-               .hw = &tegra_##_name##_hw.hw,                   \
-               .parent = &tegra_##_parent,                     \
-               .parent_names = tegra_##_name##_parent_names,   \
-               .parents = tegra_##_name##_parents,             \
-               .num_parents = 1,                               \
-               .flags = _clk_flags,                            \
-       };
-
-
-static struct clk_pll_freq_table tegra_pll_s_freq_table[] = {
-       {32768, 12000000, 366, 1, 1, 0},
-       {32768, 13000000, 397, 1, 1, 0},
-       {32768, 19200000, 586, 1, 1, 0},
-       {32768, 26000000, 793, 1, 1, 0},
-       {0, 0, 0, 0, 0, 0},
-};
-
-DEFINE_PLL(pll_s, PLL_ALT_MISC_REG, 0xf0, 26000000, 32768, 32768, 0,
-               0, 12000000, 26000000, tegra_pll_s_freq_table, 300,
-               tegra_pll_ops, 0, clk_32k);
-
-static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
-       { 12000000, 600000000, 600, 12, 1, 8 },
-       { 13000000, 600000000, 600, 13, 1, 8 },
-       { 19200000, 600000000, 500, 16, 1, 6 },
-       { 26000000, 600000000, 600, 26, 1, 8 },
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_c, PLL_HAS_CPCON, 0x80, 600000000, 2000000, 31000000, 1000000,
-               6000000, 20000000, 1400000000, tegra_pll_c_freq_table, 300,
-               tegra_pll_ops, 0, clk_m);
-
-DEFINE_PLL_OUT(pll_c_out1, DIV_U71, 0x84, 0, 600000000,
-               tegra_pll_div_ops, pll_c, 0);
-
-static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
-       { 12000000, 666000000, 666, 12, 1, 8},
-       { 13000000, 666000000, 666, 13, 1, 8},
-       { 19200000, 666000000, 555, 16, 1, 8},
-       { 26000000, 666000000, 666, 26, 1, 8},
-       { 12000000, 600000000, 600, 12, 1, 8},
-       { 13000000, 600000000, 600, 13, 1, 8},
-       { 19200000, 600000000, 375, 12, 1, 6},
-       { 26000000, 600000000, 600, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_m, PLL_HAS_CPCON, 0x90, 800000000, 2000000, 31000000, 1000000,
-               6000000, 20000000, 1200000000, tegra_pll_m_freq_table, 300,
-               tegra_pll_ops, 0, clk_m);
-
-DEFINE_PLL_OUT(pll_m_out1, DIV_U71, 0x94, 0, 600000000,
-               tegra_pll_div_ops, pll_m, 0);
-
-static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
-       { 12000000, 216000000, 432, 12, 2, 8},
-       { 13000000, 216000000, 432, 13, 2, 8},
-       { 19200000, 216000000, 90,   4, 2, 1},
-       { 26000000, 216000000, 432, 26, 2, 8},
-       { 12000000, 432000000, 432, 12, 1, 8},
-       { 13000000, 432000000, 432, 13, 1, 8},
-       { 19200000, 432000000, 90,   4, 1, 1},
-       { 26000000, 432000000, 432, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-
-DEFINE_PLL(pll_p, ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON, 0xa0, 432000000,
-               2000000, 31000000, 1000000, 6000000, 20000000, 1400000000,
-               tegra_pll_p_freq_table, 300, tegra_pll_ops, 216000000, clk_m);
-
-DEFINE_PLL_OUT(pll_p_out1, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4, 0,
-               432000000, tegra_pll_div_ops, pll_p, 0);
-DEFINE_PLL_OUT(pll_p_out2, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4, 16,
-               432000000, tegra_pll_div_ops, pll_p, 0);
-DEFINE_PLL_OUT(pll_p_out3, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8, 0,
-               432000000, tegra_pll_div_ops, pll_p, 0);
-DEFINE_PLL_OUT(pll_p_out4, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8, 16,
-               432000000, tegra_pll_div_ops, pll_p, 0);
-
-static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
-       { 28800000, 56448000, 49, 25, 1, 1},
-       { 28800000, 73728000, 64, 25, 1, 1},
-       { 28800000, 24000000,  5,  6, 1, 1},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_a, PLL_HAS_CPCON, 0xb0, 73728000, 2000000, 31000000, 1000000,
-               6000000, 20000000, 1400000000, tegra_pll_a_freq_table, 300,
-               tegra_pll_ops, 0, pll_p_out1);
-
-DEFINE_PLL_OUT(pll_a_out0, DIV_U71, 0xb4, 0, 73728000,
-               tegra_pll_div_ops, pll_a, 0);
-
-static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
-       { 12000000, 216000000, 216, 12, 1, 4},
-       { 13000000, 216000000, 216, 13, 1, 4},
-       { 19200000, 216000000, 135, 12, 1, 3},
-       { 26000000, 216000000, 216, 26, 1, 4},
-
-       { 12000000, 297000000,  99,  4, 1, 4 },
-       { 12000000, 339000000, 113,  4, 1, 4 },
-
-       { 12000000, 594000000, 594, 12, 1, 8},
-       { 13000000, 594000000, 594, 13, 1, 8},
-       { 19200000, 594000000, 495, 16, 1, 8},
-       { 26000000, 594000000, 594, 26, 1, 8},
-
-       { 12000000, 616000000, 616, 12, 1, 8},
-
-       { 12000000, 1000000000, 1000, 12, 1, 12},
-       { 13000000, 1000000000, 1000, 13, 1, 12},
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 12},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_d, PLL_HAS_CPCON | PLLD, 0xd0, 1000000000, 2000000, 40000000,
-               1000000, 6000000, 40000000, 1000000000, tegra_pll_d_freq_table,
-               1000, tegra_pll_ops, 0, clk_m);
-
-DEFINE_PLL_OUT(pll_d_out0, DIV_2 | PLLD, 0, 0, 500000000,
-               tegra_pll_div_ops, pll_d, CLK_SET_RATE_PARENT);
-
-static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
-       { 12000000, 480000000, 960, 12, 2, 0},
-       { 13000000, 480000000, 960, 13, 2, 0},
-       { 19200000, 480000000, 200, 4,  2, 0},
-       { 26000000, 480000000, 960, 26, 2, 0},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_u, PLLU, 0xc0, 480000000, 2000000, 40000000, 1000000, 6000000,
-               48000000, 960000000, tegra_pll_u_freq_table, 1000,
-               tegra_pll_ops, 0, clk_m);
-
-static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
-       /* 1 GHz */
-       { 12000000, 1000000000, 1000, 12, 1, 12},
-       { 13000000, 1000000000, 1000, 13, 1, 12},
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 12},
-
-       /* 912 MHz */
-       { 12000000, 912000000,  912,  12, 1, 12},
-       { 13000000, 912000000,  912,  13, 1, 12},
-       { 19200000, 912000000,  760,  16, 1, 8},
-       { 26000000, 912000000,  912,  26, 1, 12},
-
-       /* 816 MHz */
-       { 12000000, 816000000,  816,  12, 1, 12},
-       { 13000000, 816000000,  816,  13, 1, 12},
-       { 19200000, 816000000,  680,  16, 1, 8},
-       { 26000000, 816000000,  816,  26, 1, 12},
-
-       /* 760 MHz */
-       { 12000000, 760000000,  760,  12, 1, 12},
-       { 13000000, 760000000,  760,  13, 1, 12},
-       { 19200000, 760000000,  950,  24, 1, 8},
-       { 26000000, 760000000,  760,  26, 1, 12},
-
-       /* 750 MHz */
-       { 12000000, 750000000,  750,  12, 1, 12},
-       { 13000000, 750000000,  750,  13, 1, 12},
-       { 19200000, 750000000,  625,  16, 1, 8},
-       { 26000000, 750000000,  750,  26, 1, 12},
-
-       /* 608 MHz */
-       { 12000000, 608000000,  608,  12, 1, 12},
-       { 13000000, 608000000,  608,  13, 1, 12},
-       { 19200000, 608000000,  380,  12, 1, 8},
-       { 26000000, 608000000,  608,  26, 1, 12},
-
-       /* 456 MHz */
-       { 12000000, 456000000,  456,  12, 1, 12},
-       { 13000000, 456000000,  456,  13, 1, 12},
-       { 19200000, 456000000,  380,  16, 1, 8},
-       { 26000000, 456000000,  456,  26, 1, 12},
-
-       /* 312 MHz */
-       { 12000000, 312000000,  312,  12, 1, 12},
-       { 13000000, 312000000,  312,  13, 1, 12},
-       { 19200000, 312000000,  260,  16, 1, 8},
-       { 26000000, 312000000,  312,  26, 1, 12},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_x, PLL_HAS_CPCON | PLL_ALT_MISC_REG, 0xe0, 1000000000, 2000000,
-               31000000, 1000000, 6000000, 20000000, 1200000000,
-               tegra_pll_x_freq_table, 300, tegra_pllx_ops, 0, clk_m);
-
-static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
-       { 12000000, 100000000,  200,  24, 1, 0 },
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_e, PLL_ALT_MISC_REG, 0xe8, 100000000, 12000000, 12000000, 0, 0,
-               0, 0, tegra_pll_e_freq_table, 0, tegra_plle_ops, 0, clk_m);
-
-static const char *tegra_common_parent_names[] = {
-       "clk_m",
-};
-
-static struct clk *tegra_common_parents[] = {
-       &tegra_clk_m,
-};
-
-static struct clk tegra_clk_d;
-static struct clk_tegra tegra_clk_d_hw = {
-       .hw = {
-               .clk = &tegra_clk_d,
-       },
-       .flags = PERIPH_NO_RESET,
-       .reg = 0x34,
-       .reg_shift = 12,
-       .max_rate = 52000000,
-       .u.periph = {
-               .clk_num = 90,
-       },
-};
-
-static struct clk tegra_clk_d = {
-       .name = "clk_d",
-       .hw = &tegra_clk_d_hw.hw,
-       .ops = &tegra_clk_double_ops,
-       .parent = &tegra_clk_m,
-       .parent_names = tegra_common_parent_names,
-       .parents = tegra_common_parents,
-       .num_parents = ARRAY_SIZE(tegra_common_parent_names),
-};
-
-static struct clk tegra_cdev1;
-static struct clk_tegra tegra_cdev1_hw = {
-       .hw = {
-               .clk = &tegra_cdev1,
-       },
-       .fixed_rate = 26000000,
-       .u.periph = {
-               .clk_num = 94,
-       },
-};
-static struct clk tegra_cdev1 = {
-       .name = "cdev1",
-       .hw = &tegra_cdev1_hw.hw,
-       .ops = &tegra_cdev_clk_ops,
-       .flags = CLK_IS_ROOT,
-};
-
-/* dap_mclk2, belongs to the cdev2 pingroup. */
-static struct clk tegra_cdev2;
-static struct clk_tegra tegra_cdev2_hw = {
-       .hw = {
-               .clk = &tegra_cdev2,
-       },
-       .fixed_rate = 26000000,
-       .u.periph = {
-               .clk_num  = 93,
-       },
-};
-static struct clk tegra_cdev2 = {
-       .name = "cdev2",
-       .hw = &tegra_cdev2_hw.hw,
-       .ops = &tegra_cdev_clk_ops,
-       .flags = CLK_IS_ROOT,
-};
-
-/* initialized before peripheral clocks */
-static struct clk_mux_sel mux_audio_sync_clk[8+1];
-static const struct audio_sources {
-       const char *name;
-       int value;
-} mux_audio_sync_clk_sources[] = {
-       { .name = "spdif_in", .value = 0 },
-       { .name = "i2s1", .value = 1 },
-       { .name = "i2s2", .value = 2 },
-       { .name = "pll_a_out0", .value = 4 },
-#if 0 /* FIXME: not implemented */
-       { .name = "ac97", .value = 3 },
-       { .name = "ext_audio_clk2", .value = 5 },
-       { .name = "ext_audio_clk1", .value = 6 },
-       { .name = "ext_vimclk", .value = 7 },
-#endif
-       { NULL, 0 }
-};
-
-static const char *audio_parent_names[] = {
-       "spdif_in",
-       "i2s1",
-       "i2s2",
-       "dummy",
-       "pll_a_out0",
-       "dummy",
-       "dummy",
-       "dummy",
-};
-
-static struct clk *audio_parents[] = {
-       NULL,
-       NULL,
-       NULL,
-       NULL,
-       NULL,
-       NULL,
-       NULL,
-       NULL,
-};
-
-static struct clk tegra_audio;
-static struct clk_tegra tegra_audio_hw = {
-       .hw = {
-               .clk = &tegra_audio,
-       },
-       .reg = 0x38,
-       .max_rate = 73728000,
-};
-DEFINE_CLK_TEGRA(audio, 0, &tegra_audio_sync_clk_ops, 0, audio_parent_names,
-               audio_parents, NULL);
-
-static const char *audio_2x_parent_names[] = {
-       "audio",
-};
-
-static struct clk *audio_2x_parents[] = {
-       &tegra_audio,
-};
-
-static struct clk tegra_audio_2x;
-static struct clk_tegra tegra_audio_2x_hw = {
-       .hw = {
-               .clk = &tegra_audio_2x,
-       },
-       .flags = PERIPH_NO_RESET,
-       .max_rate = 48000000,
-       .reg = 0x34,
-       .reg_shift = 8,
-       .u.periph = {
-               .clk_num = 89,
-       },
-};
-DEFINE_CLK_TEGRA(audio_2x, 0, &tegra_clk_double_ops, 0, audio_2x_parent_names,
-               audio_2x_parents, &tegra_audio);
-
-static struct clk_lookup tegra_audio_clk_lookups[] = {
-       { .con_id = "audio", .clk = &tegra_audio },
-       { .con_id = "audio_2x", .clk = &tegra_audio_2x }
-};
-
-/* This is called after peripheral clocks are initialized, as the
- * audio_sync clock depends on some of the peripheral clocks.
- */
-
-static void init_audio_sync_clock_mux(void)
-{
-       int i;
-       struct clk_mux_sel *sel = mux_audio_sync_clk;
-       const struct audio_sources *src = mux_audio_sync_clk_sources;
-       struct clk_lookup *lookup;
-
-       for (i = 0; src->name; i++, sel++, src++) {
-               sel->input = tegra_get_clock_by_name(src->name);
-               if (!sel->input)
-                       pr_err("%s: could not find clk %s\n", __func__,
-                               src->name);
-               audio_parents[src->value] = sel->input;
-               sel->value = src->value;
-       }
-
-       lookup = tegra_audio_clk_lookups;
-       for (i = 0; i < ARRAY_SIZE(tegra_audio_clk_lookups); i++, lookup++) {
-               struct clk *c = lookup->clk;
-               struct clk_tegra *clk = to_clk_tegra(c->hw);
-               __clk_init(NULL, c);
-               INIT_LIST_HEAD(&clk->shared_bus_list);
-               clk->lookup.con_id = lookup->con_id;
-               clk->lookup.clk = c;
-               clkdev_add(&clk->lookup);
-               tegra_clk_add(c);
-       }
-}
-
-static const char *mux_cclk[] = {
-       "clk_m",
-       "pll_c",
-       "clk_32k",
-       "pll_m",
-       "pll_p",
-       "pll_p_out4",
-       "pll_p_out3",
-       "clk_d",
-       "pll_x",
-};
-
-
-static struct clk *mux_cclk_p[] = {
-       &tegra_clk_m,
-       &tegra_pll_c,
-       &tegra_clk_32k,
-       &tegra_pll_m,
-       &tegra_pll_p,
-       &tegra_pll_p_out4,
-       &tegra_pll_p_out3,
-       &tegra_clk_d,
-       &tegra_pll_x,
-};
-
-static const char *mux_sclk[] = {
-       "clk_m",
-       "pll_c_out1",
-       "pll_p_out4",
-       "pllp_p_out3",
-       "pll_p_out2",
-       "clk_d",
-       "clk_32k",
-       "pll_m_out1",
-};
-
-static struct clk *mux_sclk_p[] = {
-       &tegra_clk_m,
-       &tegra_pll_c_out1,
-       &tegra_pll_p_out4,
-       &tegra_pll_p_out3,
-       &tegra_pll_p_out2,
-       &tegra_clk_d,
-       &tegra_clk_32k,
-       &tegra_pll_m_out1,
-};
-
-static struct clk tegra_cclk;
-static struct clk_tegra tegra_cclk_hw = {
-       .hw = {
-               .clk = &tegra_cclk,
-       },
-       .reg = 0x20,
-       .max_rate = 1000000000,
-};
-DEFINE_CLK_TEGRA(cclk, 0, &tegra_super_ops, 0, mux_cclk,
-               mux_cclk_p, NULL);
-
-static const char *mux_twd[] = {
-       "cclk",
-};
-
-static struct clk *mux_twd_p[] = {
-       &tegra_cclk,
-};
-
-static struct clk tegra_clk_twd;
-static struct clk_tegra tegra_clk_twd_hw = {
-       .hw = {
-               .clk = &tegra_clk_twd,
-       },
-       .max_rate = 1000000000,
-       .mul = 1,
-       .div = 4,
-};
-
-static struct clk tegra_clk_twd = {
-       .name = "twd",
-       .ops = &tegra_twd_ops,
-       .hw = &tegra_clk_twd_hw.hw,
-       .parent = &tegra_cclk,
-       .parent_names = mux_twd,
-       .parents = mux_twd_p,
-       .num_parents = ARRAY_SIZE(mux_twd),
-};
-
-static struct clk tegra_sclk;
-static struct clk_tegra tegra_sclk_hw = {
-       .hw = {
-               .clk = &tegra_sclk,
-       },
-       .reg = 0x28,
-       .max_rate = 240000000,
-       .min_rate = 120000000,
-};
-DEFINE_CLK_TEGRA(sclk, 0, &tegra_super_ops, 0, mux_sclk,
-               mux_sclk_p, NULL);
-
-static const char *tegra_cop_parent_names[] = {
-       "tegra_sclk",
-};
-
-static struct clk *tegra_cop_parents[] = {
-       &tegra_sclk,
-};
-
-static struct clk tegra_cop;
-static struct clk_tegra tegra_cop_hw = {
-       .hw = {
-               .clk = &tegra_cop,
-       },
-       .max_rate  = 240000000,
-       .reset = &tegra2_cop_clk_reset,
-};
-DEFINE_CLK_TEGRA(cop, 0, &tegra_cop_ops, CLK_SET_RATE_PARENT,
-               tegra_cop_parent_names, tegra_cop_parents, &tegra_sclk);
-
-static const char *tegra_hclk_parent_names[] = {
-       "tegra_sclk",
-};
-
-static struct clk *tegra_hclk_parents[] = {
-       &tegra_sclk,
-};
-
-static struct clk tegra_hclk;
-static struct clk_tegra tegra_hclk_hw = {
-       .hw = {
-               .clk = &tegra_hclk,
-       },
-       .flags = DIV_BUS,
-       .reg = 0x30,
-       .reg_shift = 4,
-       .max_rate = 240000000,
-};
-DEFINE_CLK_TEGRA(hclk, 0, &tegra_bus_ops, 0, tegra_hclk_parent_names,
-               tegra_hclk_parents, &tegra_sclk);
-
-static const char *tegra_pclk_parent_names[] = {
-       "tegra_hclk",
-};
-
-static struct clk *tegra_pclk_parents[] = {
-       &tegra_hclk,
-};
-
-static struct clk tegra_pclk;
-static struct clk_tegra tegra_pclk_hw = {
-       .hw = {
-               .clk = &tegra_pclk,
-       },
-       .flags = DIV_BUS,
-       .reg = 0x30,
-       .reg_shift = 0,
-       .max_rate = 120000000,
-};
-DEFINE_CLK_TEGRA(pclk, 0, &tegra_bus_ops, 0, tegra_pclk_parent_names,
-               tegra_pclk_parents, &tegra_hclk);
-
-static const char *tegra_blink_parent_names[] = {
-       "clk_32k",
-};
-
-static struct clk *tegra_blink_parents[] = {
-       &tegra_clk_32k,
-};
-
-static struct clk tegra_blink;
-static struct clk_tegra tegra_blink_hw = {
-       .hw = {
-               .clk = &tegra_blink,
-       },
-       .reg = 0x40,
-       .max_rate = 32768,
-};
-DEFINE_CLK_TEGRA(blink, 0, &tegra_blink_clk_ops, 0, tegra_blink_parent_names,
-               tegra_blink_parents, &tegra_clk_32k);
-
-static const char *mux_pllm_pllc_pllp_plla[] = {
-       "pll_m",
-       "pll_c",
-       "pll_p",
-       "pll_a_out0",
-};
-
-static struct clk *mux_pllm_pllc_pllp_plla_p[] = {
-       &tegra_pll_m,
-       &tegra_pll_c,
-       &tegra_pll_p,
-       &tegra_pll_a_out0,
-};
-
-static const char *mux_pllm_pllc_pllp_clkm[] = {
-       "pll_m",
-       "pll_c",
-       "pll_p",
-       "clk_m",
-};
-
-static struct clk *mux_pllm_pllc_pllp_clkm_p[] = {
-       &tegra_pll_m,
-       &tegra_pll_c,
-       &tegra_pll_p,
-       &tegra_clk_m,
-};
-
-static const char *mux_pllp_pllc_pllm_clkm[] = {
-       "pll_p",
-       "pll_c",
-       "pll_m",
-       "clk_m",
-};
-
-static struct clk *mux_pllp_pllc_pllm_clkm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_pll_m,
-       &tegra_clk_m,
-};
-
-static const char *mux_pllaout0_audio2x_pllp_clkm[] = {
-       "pll_a_out0",
-       "audio_2x",
-       "pll_p",
-       "clk_m",
-};
-
-static struct clk *mux_pllaout0_audio2x_pllp_clkm_p[] = {
-       &tegra_pll_a_out0,
-       &tegra_audio_2x,
-       &tegra_pll_p,
-       &tegra_clk_m,
-};
-
-static const char *mux_pllp_plld_pllc_clkm[] = {
-       "pllp",
-       "pll_d_out0",
-       "pll_c",
-       "clk_m",
-};
-
-static struct clk *mux_pllp_plld_pllc_clkm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_d_out0,
-       &tegra_pll_c,
-       &tegra_clk_m,
-};
-
-static const char *mux_pllp_pllc_audio_clkm_clk32[] = {
-       "pll_p",
-       "pll_c",
-       "audio",
-       "clk_m",
-       "clk_32k",
-};
-
-static struct clk *mux_pllp_pllc_audio_clkm_clk32_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_audio,
-       &tegra_clk_m,
-       &tegra_clk_32k,
-};
-
-static const char *mux_pllp_pllc_pllm[] = {
-       "pll_p",
-       "pll_c",
-       "pll_m"
-};
-
-static struct clk *mux_pllp_pllc_pllm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_pll_m,
-};
-
-static const char *mux_clk_m[] = {
-       "clk_m",
-};
-
-static struct clk *mux_clk_m_p[] = {
-       &tegra_clk_m,
-};
-
-static const char *mux_pllp_out3[] = {
-       "pll_p_out3",
-};
-
-static struct clk *mux_pllp_out3_p[] = {
-       &tegra_pll_p_out3,
-};
-
-static const char *mux_plld[] = {
-       "pll_d",
-};
-
-static struct clk *mux_plld_p[] = {
-       &tegra_pll_d,
-};
-
-static const char *mux_clk_32k[] = {
-       "clk_32k",
-};
-
-static struct clk *mux_clk_32k_p[] = {
-       &tegra_clk_32k,
-};
-
-static const char *mux_pclk[] = {
-       "pclk",
-};
-
-static struct clk *mux_pclk_p[] = {
-       &tegra_pclk,
-};
-
-static struct clk tegra_emc;
-static struct clk_tegra tegra_emc_hw = {
-       .hw = {
-               .clk = &tegra_emc,
-       },
-       .reg = 0x19c,
-       .max_rate = 800000000,
-       .flags = MUX | DIV_U71 | PERIPH_EMC_ENB,
-       .reset = &tegra2_periph_clk_reset,
-       .u.periph = {
-               .clk_num = 57,
-       },
-};
-DEFINE_CLK_TEGRA(emc, 0, &tegra_emc_clk_ops, 0, mux_pllm_pllc_pllp_clkm,
-               mux_pllm_pllc_pllp_clkm_p, NULL);
-
-#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg,  \
-               _max, _inputs, _flags)                  \
-       static struct clk tegra_##_name;                \
-       static struct clk_tegra tegra_##_name##_hw = {  \
-               .hw = {                                 \
-                       .clk = &tegra_##_name,          \
-               },                                      \
-               .lookup = {                             \
-                       .dev_id = _dev,                 \
-                       .con_id = _con,                 \
-               },                                      \
-               .reg = _reg,                            \
-               .flags = _flags,                        \
-               .max_rate = _max,                       \
-               .u.periph = {                           \
-                       .clk_num = _clk_num,            \
-               },                                      \
-               .reset = tegra2_periph_clk_reset,       \
-       };                                              \
-       static struct clk tegra_##_name = {             \
-               .name = #_name,                         \
-               .ops = &tegra_periph_clk_ops,           \
-               .hw = &tegra_##_name##_hw.hw,           \
-               .parent_names = _inputs,                \
-               .parents = _inputs##_p,                 \
-               .num_parents = ARRAY_SIZE(_inputs),     \
-       };
-
-PERIPH_CLK(apbdma,     "tegra-apbdma",         NULL,   34,     0,      108000000, mux_pclk,                    0);
-PERIPH_CLK(rtc,                "rtc-tegra",            NULL,   4,      0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET);
-PERIPH_CLK(timer,      "timer",                NULL,   5,      0,      26000000,  mux_clk_m,                   0);
-PERIPH_CLK(i2s1,       "tegra20-i2s.0",        NULL,   11,     0x100,  26000000,  mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71);
-PERIPH_CLK(i2s2,       "tegra20-i2s.1",        NULL,   18,     0x104,  26000000,  mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71);
-PERIPH_CLK(spdif_out,  "spdif_out",            NULL,   10,     0x108,  100000000, mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71);
-PERIPH_CLK(spdif_in,   "spdif_in",             NULL,   10,     0x10c,  100000000, mux_pllp_pllc_pllm,          MUX | DIV_U71);
-PERIPH_CLK(pwm,                "tegra-pwm",            NULL,   17,     0x110,  432000000, mux_pllp_pllc_audio_clkm_clk32,      MUX | DIV_U71 | MUX_PWM);
-PERIPH_CLK(spi,                "spi",                  NULL,   43,     0x114,  40000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(xio,                "xio",                  NULL,   45,     0x120,  150000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(twc,                "twc",                  NULL,   16,     0x12c,  150000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sbc1,       "spi_tegra.0",          NULL,   41,     0x134,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sbc2,       "spi_tegra.1",          NULL,   44,     0x118,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sbc3,       "spi_tegra.2",          NULL,   46,     0x11c,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sbc4,       "spi_tegra.3",          NULL,   68,     0x1b4,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(ide,                "ide",                  NULL,   25,     0x144,  100000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(ndflash,    "tegra_nand",           NULL,   13,     0x160,  164000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(vfir,       "vfir",                 NULL,   7,      0x168,  72000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sdmmc1,     "sdhci-tegra.0",        NULL,   14,     0x150,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(sdmmc2,     "sdhci-tegra.1",        NULL,   9,      0x154,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(sdmmc3,     "sdhci-tegra.2",        NULL,   69,     0x1bc,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(sdmmc4,     "sdhci-tegra.3",        NULL,   15,     0x164,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(vcp,                "tegra-avp",            "vcp",  29,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(bsea,       "tegra-avp",            "bsea", 62,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(bsev,       "tegra-aes",            "bsev", 63,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(vde,                "tegra-avp",            "vde",  61,     0x1c8,  250000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage and process_id */
-PERIPH_CLK(csite,      "csite",                NULL,   73,     0x1d4,  144000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* max rate ??? */
-/* FIXME: what is la? */
-PERIPH_CLK(la,         "la",                   NULL,   76,     0x1f8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(owr,                "tegra_w1",             NULL,   71,     0x1cc,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(nor,                "nor",                  NULL,   42,     0x1d0,  92000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(mipi,       "mipi",                 NULL,   50,     0x174,  60000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(i2c1,       "tegra-i2c.0",          "div-clk", 12,  0x124,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
-PERIPH_CLK(i2c2,       "tegra-i2c.1",          "div-clk", 54,  0x198,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
-PERIPH_CLK(i2c3,       "tegra-i2c.2",          "div-clk", 67,  0x1b8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
-PERIPH_CLK(dvc,                "tegra-i2c.3",          "div-clk", 47,  0x128,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
-PERIPH_CLK(uarta,      "tegra-uart.0",         NULL,   6,      0x178,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
-PERIPH_CLK(uartb,      "tegra-uart.1",         NULL,   7,      0x17c,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
-PERIPH_CLK(uartc,      "tegra-uart.2",         NULL,   55,     0x1a0,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
-PERIPH_CLK(uartd,      "tegra-uart.3",         NULL,   65,     0x1c0,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
-PERIPH_CLK(uarte,      "tegra-uart.4",         NULL,   66,     0x1c4,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
-PERIPH_CLK(3d,         "3d",                   NULL,   24,     0x158,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_MANUAL_RESET); /* scales with voltage and process_id */
-PERIPH_CLK(2d,         "2d",                   NULL,   21,     0x15c,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
-PERIPH_CLK(vi,         "tegra_camera",         "vi",   20,     0x148,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
-PERIPH_CLK(vi_sensor,  "tegra_camera",         "vi_sensor",    20,     0x1a8,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_NO_RESET); /* scales with voltage and process_id */
-PERIPH_CLK(epp,                "epp",                  NULL,   19,     0x16c,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
-PERIPH_CLK(mpe,                "mpe",                  NULL,   60,     0x170,  250000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
-PERIPH_CLK(host1x,     "host1x",               NULL,   28,     0x180,  166000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
-PERIPH_CLK(cve,                "cve",                  NULL,   49,     0x140,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(tvo,                "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(hdmi,       "hdmi",                 NULL,   51,     0x18c,  600000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(tvdac,      "tvdac",                NULL,   53,     0x194,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(disp1,      "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_plld_pllc_clkm,     MUX); /* scales with voltage and process_id */
-PERIPH_CLK(disp2,      "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_plld_pllc_clkm,     MUX); /* scales with voltage and process_id */
-PERIPH_CLK(usbd,       "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
-PERIPH_CLK(usb2,       "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
-PERIPH_CLK(usb3,       "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
-PERIPH_CLK(dsi,                "dsi",                  NULL,   48,     0,      500000000, mux_plld,                    0); /* scales with voltage */
-PERIPH_CLK(csi,                "tegra_camera",         "csi",  52,     0,      72000000,  mux_pllp_out3,               0);
-PERIPH_CLK(isp,                "tegra_camera",         "isp",  23,     0,      150000000, mux_clk_m,                   0); /* same frequency as VI */
-PERIPH_CLK(csus,       "tegra_camera",         "csus", 92,     0,      150000000, mux_clk_m,                   PERIPH_NO_RESET);
-PERIPH_CLK(pex,                NULL,                   "pex",  70,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET);
-PERIPH_CLK(afi,                NULL,                   "afi",  72,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET);
-PERIPH_CLK(pcie_xclk,  NULL,             "pcie_xclk",  74,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET);
-
-static struct clk *tegra_list_clks[] = {
-       &tegra_apbdma,
-       &tegra_rtc,
-       &tegra_timer,
-       &tegra_i2s1,
-       &tegra_i2s2,
-       &tegra_spdif_out,
-       &tegra_spdif_in,
-       &tegra_pwm,
-       &tegra_spi,
-       &tegra_xio,
-       &tegra_twc,
-       &tegra_sbc1,
-       &tegra_sbc2,
-       &tegra_sbc3,
-       &tegra_sbc4,
-       &tegra_ide,
-       &tegra_ndflash,
-       &tegra_vfir,
-       &tegra_sdmmc1,
-       &tegra_sdmmc2,
-       &tegra_sdmmc3,
-       &tegra_sdmmc4,
-       &tegra_vcp,
-       &tegra_bsea,
-       &tegra_bsev,
-       &tegra_vde,
-       &tegra_csite,
-       &tegra_la,
-       &tegra_owr,
-       &tegra_nor,
-       &tegra_mipi,
-       &tegra_i2c1,
-       &tegra_i2c2,
-       &tegra_i2c3,
-       &tegra_dvc,
-       &tegra_uarta,
-       &tegra_uartb,
-       &tegra_uartc,
-       &tegra_uartd,
-       &tegra_uarte,
-       &tegra_3d,
-       &tegra_2d,
-       &tegra_vi,
-       &tegra_vi_sensor,
-       &tegra_epp,
-       &tegra_mpe,
-       &tegra_host1x,
-       &tegra_cve,
-       &tegra_tvo,
-       &tegra_hdmi,
-       &tegra_tvdac,
-       &tegra_disp1,
-       &tegra_disp2,
-       &tegra_usbd,
-       &tegra_usb2,
-       &tegra_usb3,
-       &tegra_dsi,
-       &tegra_csi,
-       &tegra_isp,
-       &tegra_csus,
-       &tegra_pex,
-       &tegra_afi,
-       &tegra_pcie_xclk,
-};
-
-#define CLK_DUPLICATE(_name, _dev, _con)       \
-       {                                       \
-               .name   = _name,                \
-               .lookup = {                     \
-                       .dev_id = _dev,         \
-                       .con_id = _con,         \
-               },                              \
-       }
-
-/* Some clocks may be used by different drivers depending on the board
- * configuration.  List those here to register them twice in the clock lookup
- * table under two names.
- */
-static struct clk_duplicate tegra_clk_duplicates[] = {
-       CLK_DUPLICATE("uarta",  "serial8250.0", NULL),
-       CLK_DUPLICATE("uartb",  "serial8250.1", NULL),
-       CLK_DUPLICATE("uartc",  "serial8250.2", NULL),
-       CLK_DUPLICATE("uartd",  "serial8250.3", NULL),
-       CLK_DUPLICATE("uarte",  "serial8250.4", NULL),
-       CLK_DUPLICATE("usbd",   "utmip-pad",    NULL),
-       CLK_DUPLICATE("usbd",   "tegra-ehci.0", NULL),
-       CLK_DUPLICATE("usbd",   "tegra-otg",    NULL),
-       CLK_DUPLICATE("2d",     "tegra_grhost", "gr2d"),
-       CLK_DUPLICATE("3d",     "tegra_grhost", "gr3d"),
-       CLK_DUPLICATE("epp",    "tegra_grhost", "epp"),
-       CLK_DUPLICATE("mpe",    "tegra_grhost", "mpe"),
-       CLK_DUPLICATE("cop",    "tegra-avp",    "cop"),
-       CLK_DUPLICATE("vde",    "tegra-aes",    "vde"),
-       CLK_DUPLICATE("cclk",   NULL,           "cpu"),
-       CLK_DUPLICATE("twd",    "smp_twd",      NULL),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.0", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.1", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.2", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.3", "fast-clk"),
-       CLK_DUPLICATE("pll_p", "tegradc.0", "parent"),
-       CLK_DUPLICATE("pll_p", "tegradc.1", "parent"),
-       CLK_DUPLICATE("pll_d_out0", "hdmi", "parent"),
-};
-
-#define CLK(dev, con, ck)      \
-       {                       \
-               .dev_id = dev,  \
-               .con_id = con,  \
-               .clk    = ck,   \
-       }
-
-static struct clk *tegra_ptr_clks[] = {
-       &tegra_clk_32k,
-       &tegra_pll_s,
-       &tegra_clk_m,
-       &tegra_pll_m,
-       &tegra_pll_m_out1,
-       &tegra_pll_c,
-       &tegra_pll_c_out1,
-       &tegra_pll_p,
-       &tegra_pll_p_out1,
-       &tegra_pll_p_out2,
-       &tegra_pll_p_out3,
-       &tegra_pll_p_out4,
-       &tegra_pll_a,
-       &tegra_pll_a_out0,
-       &tegra_pll_d,
-       &tegra_pll_d_out0,
-       &tegra_pll_u,
-       &tegra_pll_x,
-       &tegra_pll_e,
-       &tegra_cclk,
-       &tegra_clk_twd,
-       &tegra_sclk,
-       &tegra_hclk,
-       &tegra_pclk,
-       &tegra_clk_d,
-       &tegra_cdev1,
-       &tegra_cdev2,
-       &tegra_blink,
-       &tegra_cop,
-       &tegra_emc,
-};
-
-static void tegra2_init_one_clock(struct clk *c)
-{
-       struct clk_tegra *clk = to_clk_tegra(c->hw);
-       int ret;
-
-       ret = __clk_init(NULL, c);
-       if (ret)
-               pr_err("clk init failed %s\n", __clk_get_name(c));
-
-       INIT_LIST_HEAD(&clk->shared_bus_list);
-       if (!clk->lookup.dev_id && !clk->lookup.con_id)
-               clk->lookup.con_id = c->name;
-       clk->lookup.clk = c;
-       clkdev_add(&clk->lookup);
-       tegra_clk_add(c);
-}
-
-void __init tegra2_init_clocks(void)
-{
-       int i;
-       struct clk *c;
-
-       for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
-               tegra2_init_one_clock(tegra_ptr_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
-               tegra2_init_one_clock(tegra_list_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
-               c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
-               if (!c) {
-                       pr_err("%s: Unknown duplicate clock %s\n", __func__,
-                               tegra_clk_duplicates[i].name);
-                       continue;
-               }
-
-               tegra_clk_duplicates[i].lookup.clk = c;
-               clkdev_add(&tegra_clk_duplicates[i].lookup);
-       }
-
-       init_audio_sync_clock_mux();
-       tegra20_cpu_car_ops_init();
-}
diff --git a/arch/arm/mach-tegra/tegra30_clocks.c b/arch/arm/mach-tegra/tegra30_clocks.c
deleted file mode 100644 (file)
index d714777..0000000
+++ /dev/null
@@ -1,2506 +0,0 @@
-/*
- * arch/arm/mach-tegra/tegra30_clocks.c
- *
- * Copyright (c) 2010-2012 NVIDIA CORPORATION.  All rights reserved.
- *
- * 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 of the License.
- *
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-#include <linux/cpufreq.h>
-#include <linux/syscore_ops.h>
-
-#include <asm/clkdev.h>
-
-#include <mach/powergate.h>
-
-#include "clock.h"
-#include "fuse.h"
-#include "iomap.h"
-#include "tegra_cpu_car.h"
-
-#define USE_PLL_LOCK_BITS 0
-
-#define RST_DEVICES_L                  0x004
-#define RST_DEVICES_H                  0x008
-#define RST_DEVICES_U                  0x00C
-#define RST_DEVICES_V                  0x358
-#define RST_DEVICES_W                  0x35C
-#define RST_DEVICES_SET_L              0x300
-#define RST_DEVICES_CLR_L              0x304
-#define RST_DEVICES_SET_V              0x430
-#define RST_DEVICES_CLR_V              0x434
-#define RST_DEVICES_NUM                        5
-
-#define CLK_OUT_ENB_L                  0x010
-#define CLK_OUT_ENB_H                  0x014
-#define CLK_OUT_ENB_U                  0x018
-#define CLK_OUT_ENB_V                  0x360
-#define CLK_OUT_ENB_W                  0x364
-#define CLK_OUT_ENB_SET_L              0x320
-#define CLK_OUT_ENB_CLR_L              0x324
-#define CLK_OUT_ENB_SET_V              0x440
-#define CLK_OUT_ENB_CLR_V              0x444
-#define CLK_OUT_ENB_NUM                        5
-
-#define RST_DEVICES_V_SWR_CPULP_RST_DIS        (0x1 << 1)
-#define CLK_OUT_ENB_V_CLK_ENB_CPULP_EN (0x1 << 1)
-
-#define PERIPH_CLK_TO_BIT(c)           (1 << (c->u.periph.clk_num % 32))
-#define PERIPH_CLK_TO_RST_REG(c)       \
-       periph_clk_to_reg((c), RST_DEVICES_L, RST_DEVICES_V, 4)
-#define PERIPH_CLK_TO_RST_SET_REG(c)   \
-       periph_clk_to_reg((c), RST_DEVICES_SET_L, RST_DEVICES_SET_V, 8)
-#define PERIPH_CLK_TO_RST_CLR_REG(c)   \
-       periph_clk_to_reg((c), RST_DEVICES_CLR_L, RST_DEVICES_CLR_V, 8)
-
-#define PERIPH_CLK_TO_ENB_REG(c)       \
-       periph_clk_to_reg((c), CLK_OUT_ENB_L, CLK_OUT_ENB_V, 4)
-#define PERIPH_CLK_TO_ENB_SET_REG(c)   \
-       periph_clk_to_reg((c), CLK_OUT_ENB_SET_L, CLK_OUT_ENB_SET_V, 8)
-#define PERIPH_CLK_TO_ENB_CLR_REG(c)   \
-       periph_clk_to_reg((c), CLK_OUT_ENB_CLR_L, CLK_OUT_ENB_CLR_V, 8)
-
-#define CLK_MASK_ARM                   0x44
-#define MISC_CLK_ENB                   0x48
-
-#define OSC_CTRL                       0x50
-#define OSC_CTRL_OSC_FREQ_MASK         (0xF<<28)
-#define OSC_CTRL_OSC_FREQ_13MHZ                (0x0<<28)
-#define OSC_CTRL_OSC_FREQ_19_2MHZ      (0x4<<28)
-#define OSC_CTRL_OSC_FREQ_12MHZ                (0x8<<28)
-#define OSC_CTRL_OSC_FREQ_26MHZ                (0xC<<28)
-#define OSC_CTRL_OSC_FREQ_16_8MHZ      (0x1<<28)
-#define OSC_CTRL_OSC_FREQ_38_4MHZ      (0x5<<28)
-#define OSC_CTRL_OSC_FREQ_48MHZ                (0x9<<28)
-#define OSC_CTRL_MASK                  (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
-
-#define OSC_CTRL_PLL_REF_DIV_MASK      (3<<26)
-#define OSC_CTRL_PLL_REF_DIV_1         (0<<26)
-#define OSC_CTRL_PLL_REF_DIV_2         (1<<26)
-#define OSC_CTRL_PLL_REF_DIV_4         (2<<26)
-
-#define OSC_FREQ_DET                   0x58
-#define OSC_FREQ_DET_TRIG              (1<<31)
-
-#define OSC_FREQ_DET_STATUS            0x5C
-#define OSC_FREQ_DET_BUSY              (1<<31)
-#define OSC_FREQ_DET_CNT_MASK          0xFFFF
-
-#define PERIPH_CLK_SOURCE_I2S1         0x100
-#define PERIPH_CLK_SOURCE_EMC          0x19c
-#define PERIPH_CLK_SOURCE_OSC          0x1fc
-#define PERIPH_CLK_SOURCE_NUM1 \
-       ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
-
-#define PERIPH_CLK_SOURCE_G3D2         0x3b0
-#define PERIPH_CLK_SOURCE_SE           0x42c
-#define PERIPH_CLK_SOURCE_NUM2 \
-       ((PERIPH_CLK_SOURCE_SE - PERIPH_CLK_SOURCE_G3D2) / 4 + 1)
-
-#define AUDIO_DLY_CLK                  0x49c
-#define AUDIO_SYNC_CLK_SPDIF           0x4b4
-#define PERIPH_CLK_SOURCE_NUM3 \
-       ((AUDIO_SYNC_CLK_SPDIF - AUDIO_DLY_CLK) / 4 + 1)
-
-#define PERIPH_CLK_SOURCE_NUM          (PERIPH_CLK_SOURCE_NUM1 + \
-                                        PERIPH_CLK_SOURCE_NUM2 + \
-                                        PERIPH_CLK_SOURCE_NUM3)
-
-#define CPU_SOFTRST_CTRL               0x380
-
-#define PERIPH_CLK_SOURCE_DIVU71_MASK  0xFF
-#define PERIPH_CLK_SOURCE_DIVU16_MASK  0xFFFF
-#define PERIPH_CLK_SOURCE_DIV_SHIFT    0
-#define PERIPH_CLK_SOURCE_DIVIDLE_SHIFT        8
-#define PERIPH_CLK_SOURCE_DIVIDLE_VAL  50
-#define PERIPH_CLK_UART_DIV_ENB                (1<<24)
-#define PERIPH_CLK_VI_SEL_EX_SHIFT     24
-#define PERIPH_CLK_VI_SEL_EX_MASK      (0x3<<PERIPH_CLK_VI_SEL_EX_SHIFT)
-#define PERIPH_CLK_NAND_DIV_EX_ENB     (1<<8)
-#define PERIPH_CLK_DTV_POLARITY_INV    (1<<25)
-
-#define AUDIO_SYNC_SOURCE_MASK         0x0F
-#define AUDIO_SYNC_DISABLE_BIT         0x10
-#define AUDIO_SYNC_TAP_NIBBLE_SHIFT(c) ((c->reg_shift - 24) * 4)
-
-#define PLL_BASE                       0x0
-#define PLL_BASE_BYPASS                        (1<<31)
-#define PLL_BASE_ENABLE                        (1<<30)
-#define PLL_BASE_REF_ENABLE            (1<<29)
-#define PLL_BASE_OVERRIDE              (1<<28)
-#define PLL_BASE_LOCK                  (1<<27)
-#define PLL_BASE_DIVP_MASK             (0x7<<20)
-#define PLL_BASE_DIVP_SHIFT            20
-#define PLL_BASE_DIVN_MASK             (0x3FF<<8)
-#define PLL_BASE_DIVN_SHIFT            8
-#define PLL_BASE_DIVM_MASK             (0x1F)
-#define PLL_BASE_DIVM_SHIFT            0
-
-#define PLL_OUT_RATIO_MASK             (0xFF<<8)
-#define PLL_OUT_RATIO_SHIFT            8
-#define PLL_OUT_OVERRIDE               (1<<2)
-#define PLL_OUT_CLKEN                  (1<<1)
-#define PLL_OUT_RESET_DISABLE          (1<<0)
-
-#define PLL_MISC(c)                    \
-       (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
-#define PLL_MISC_LOCK_ENABLE(c)        \
-       (((c)->flags & (PLLU | PLLD)) ? (1<<22) : (1<<18))
-
-#define PLL_MISC_DCCON_SHIFT           20
-#define PLL_MISC_CPCON_SHIFT           8
-#define PLL_MISC_CPCON_MASK            (0xF<<PLL_MISC_CPCON_SHIFT)
-#define PLL_MISC_LFCON_SHIFT           4
-#define PLL_MISC_LFCON_MASK            (0xF<<PLL_MISC_LFCON_SHIFT)
-#define PLL_MISC_VCOCON_SHIFT          0
-#define PLL_MISC_VCOCON_MASK           (0xF<<PLL_MISC_VCOCON_SHIFT)
-#define PLLD_MISC_CLKENABLE            (1<<30)
-
-#define PLLU_BASE_POST_DIV             (1<<20)
-
-#define PLLD_BASE_DSIB_MUX_SHIFT       25
-#define PLLD_BASE_DSIB_MUX_MASK                (1<<PLLD_BASE_DSIB_MUX_SHIFT)
-#define PLLD_BASE_CSI_CLKENABLE                (1<<26)
-#define PLLD_MISC_DSI_CLKENABLE                (1<<30)
-#define PLLD_MISC_DIV_RST              (1<<23)
-#define PLLD_MISC_DCCON_SHIFT          12
-
-#define PLLDU_LFCON_SET_DIVN           600
-
-/* FIXME: OUT_OF_TABLE_CPCON per pll */
-#define OUT_OF_TABLE_CPCON             0x8
-
-#define SUPER_CLK_MUX                  0x00
-#define SUPER_STATE_SHIFT              28
-#define SUPER_STATE_MASK               (0xF << SUPER_STATE_SHIFT)
-#define SUPER_STATE_STANDBY            (0x0 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_IDLE               (0x1 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_RUN                        (0x2 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_IRQ                        (0x3 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_FIQ                        (0x4 << SUPER_STATE_SHIFT)
-#define SUPER_LP_DIV2_BYPASS           (0x1 << 16)
-#define SUPER_SOURCE_MASK              0xF
-#define        SUPER_FIQ_SOURCE_SHIFT          12
-#define        SUPER_IRQ_SOURCE_SHIFT          8
-#define        SUPER_RUN_SOURCE_SHIFT          4
-#define        SUPER_IDLE_SOURCE_SHIFT         0
-
-#define SUPER_CLK_DIVIDER              0x04
-#define SUPER_CLOCK_DIV_U71_SHIFT      16
-#define SUPER_CLOCK_DIV_U71_MASK       (0xff << SUPER_CLOCK_DIV_U71_SHIFT)
-/* guarantees safe cpu backup */
-#define SUPER_CLOCK_DIV_U71_MIN                0x2
-
-#define BUS_CLK_DISABLE                        (1<<3)
-#define BUS_CLK_DIV_MASK               0x3
-
-#define PMC_CTRL                       0x0
- #define PMC_CTRL_BLINK_ENB            (1 << 7)
-
-#define PMC_DPD_PADS_ORIDE             0x1c
- #define PMC_DPD_PADS_ORIDE_BLINK_ENB  (1 << 20)
-
-#define PMC_BLINK_TIMER_DATA_ON_SHIFT  0
-#define PMC_BLINK_TIMER_DATA_ON_MASK   0x7fff
-#define PMC_BLINK_TIMER_ENB            (1 << 15)
-#define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
-#define PMC_BLINK_TIMER_DATA_OFF_MASK  0xffff
-
-#define PMC_PLLP_WB0_OVERRIDE                          0xf8
-#define PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE              (1 << 12)
-
-#define UTMIP_PLL_CFG2                                 0x488
-#define UTMIP_PLL_CFG2_STABLE_COUNT(x)                 (((x) & 0xfff) << 6)
-#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x)             (((x) & 0x3f) << 18)
-#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN       (1 << 0)
-#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN       (1 << 2)
-#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN       (1 << 4)
-
-#define UTMIP_PLL_CFG1                                 0x484
-#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x)             (((x) & 0x1f) << 27)
-#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x)              (((x) & 0xfff) << 0)
-#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN      (1 << 14)
-#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN      (1 << 12)
-#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN            (1 << 16)
-
-#define PLLE_BASE_CML_ENABLE           (1<<31)
-#define PLLE_BASE_ENABLE               (1<<30)
-#define PLLE_BASE_DIVCML_SHIFT         24
-#define PLLE_BASE_DIVCML_MASK          (0xf<<PLLE_BASE_DIVCML_SHIFT)
-#define PLLE_BASE_DIVP_SHIFT           16
-#define PLLE_BASE_DIVP_MASK            (0x3f<<PLLE_BASE_DIVP_SHIFT)
-#define PLLE_BASE_DIVN_SHIFT           8
-#define PLLE_BASE_DIVN_MASK            (0xFF<<PLLE_BASE_DIVN_SHIFT)
-#define PLLE_BASE_DIVM_SHIFT           0
-#define PLLE_BASE_DIVM_MASK            (0xFF<<PLLE_BASE_DIVM_SHIFT)
-#define PLLE_BASE_DIV_MASK             \
-       (PLLE_BASE_DIVCML_MASK | PLLE_BASE_DIVP_MASK | \
-        PLLE_BASE_DIVN_MASK | PLLE_BASE_DIVM_MASK)
-#define PLLE_BASE_DIV(m, n, p, cml)            \
-        (((cml)<<PLLE_BASE_DIVCML_SHIFT) | ((p)<<PLLE_BASE_DIVP_SHIFT) | \
-         ((n)<<PLLE_BASE_DIVN_SHIFT) | ((m)<<PLLE_BASE_DIVM_SHIFT))
-
-#define PLLE_MISC_SETUP_BASE_SHIFT     16
-#define PLLE_MISC_SETUP_BASE_MASK      (0xFFFF<<PLLE_MISC_SETUP_BASE_SHIFT)
-#define PLLE_MISC_READY                        (1<<15)
-#define PLLE_MISC_LOCK                 (1<<11)
-#define PLLE_MISC_LOCK_ENABLE          (1<<9)
-#define PLLE_MISC_SETUP_EX_SHIFT       2
-#define PLLE_MISC_SETUP_EX_MASK                (0x3<<PLLE_MISC_SETUP_EX_SHIFT)
-#define PLLE_MISC_SETUP_MASK           \
-         (PLLE_MISC_SETUP_BASE_MASK | PLLE_MISC_SETUP_EX_MASK)
-#define PLLE_MISC_SETUP_VALUE          \
-         ((0x7<<PLLE_MISC_SETUP_BASE_SHIFT) | (0x0<<PLLE_MISC_SETUP_EX_SHIFT))
-
-#define PLLE_SS_CTRL                   0x68
-#define        PLLE_SS_INCINTRV_SHIFT          24
-#define        PLLE_SS_INCINTRV_MASK           (0x3f<<PLLE_SS_INCINTRV_SHIFT)
-#define        PLLE_SS_INC_SHIFT               16
-#define        PLLE_SS_INC_MASK                (0xff<<PLLE_SS_INC_SHIFT)
-#define        PLLE_SS_MAX_SHIFT               0
-#define        PLLE_SS_MAX_MASK                (0x1ff<<PLLE_SS_MAX_SHIFT)
-#define PLLE_SS_COEFFICIENTS_MASK      \
-       (PLLE_SS_INCINTRV_MASK | PLLE_SS_INC_MASK | PLLE_SS_MAX_MASK)
-#define PLLE_SS_COEFFICIENTS_12MHZ     \
-       ((0x18<<PLLE_SS_INCINTRV_SHIFT) | (0x1<<PLLE_SS_INC_SHIFT) | \
-        (0x24<<PLLE_SS_MAX_SHIFT))
-#define PLLE_SS_DISABLE                        ((1<<12) | (1<<11) | (1<<10))
-
-#define PLLE_AUX                       0x48c
-#define PLLE_AUX_PLLP_SEL              (1<<2)
-#define PLLE_AUX_CML_SATA_ENABLE       (1<<1)
-#define PLLE_AUX_CML_PCIE_ENABLE       (1<<0)
-
-#define        PMC_SATA_PWRGT                  0x1ac
-#define PMC_SATA_PWRGT_PLLE_IDDQ_VALUE (1<<5)
-#define PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL (1<<4)
-
-#define ROUND_DIVIDER_UP       0
-#define ROUND_DIVIDER_DOWN     1
-
-/* FIXME: recommended safety delay after lock is detected */
-#define PLL_POST_LOCK_DELAY            100
-
-/* Tegra CPU clock and reset control regs */
-#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX         0x4c
-#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET     0x340
-#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR     0x344
-#define TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR   0x34c
-#define TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS    0x470
-
-#define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
-#define CPU_RESET(cpu) (0x1111ul << (cpu))
-
-#define CLK_RESET_CCLK_BURST   0x20
-#define CLK_RESET_CCLK_DIVIDER  0x24
-#define CLK_RESET_PLLX_BASE    0xe0
-#define CLK_RESET_PLLX_MISC    0xe4
-
-#define CLK_RESET_SOURCE_CSITE 0x1d4
-
-#define CLK_RESET_CCLK_BURST_POLICY_SHIFT      28
-#define CLK_RESET_CCLK_RUN_POLICY_SHIFT                4
-#define CLK_RESET_CCLK_IDLE_POLICY_SHIFT       0
-#define CLK_RESET_CCLK_IDLE_POLICY             1
-#define CLK_RESET_CCLK_RUN_POLICY              2
-#define CLK_RESET_CCLK_BURST_POLICY_PLLX       8
-
-#ifdef CONFIG_PM_SLEEP
-static struct cpu_clk_suspend_context {
-       u32 pllx_misc;
-       u32 pllx_base;
-
-       u32 cpu_burst;
-       u32 clk_csite_src;
-       u32 cclk_divider;
-} tegra30_cpu_clk_sctx;
-#endif
-
-/**
-* Structure defining the fields for USB UTMI clocks Parameters.
-*/
-struct utmi_clk_param {
-       /* Oscillator Frequency in KHz */
-       u32 osc_frequency;
-       /* UTMIP PLL Enable Delay Count  */
-       u8 enable_delay_count;
-       /* UTMIP PLL Stable count */
-       u8 stable_count;
-       /*  UTMIP PLL Active delay count */
-       u8 active_delay_count;
-       /* UTMIP PLL Xtal frequency count */
-       u8 xtal_freq_count;
-};
-
-static const struct utmi_clk_param utmi_parameters[] = {
-       {
-               .osc_frequency = 13000000,
-               .enable_delay_count = 0x02,
-               .stable_count = 0x33,
-               .active_delay_count = 0x05,
-               .xtal_freq_count = 0x7F
-       },
-       {
-               .osc_frequency = 19200000,
-               .enable_delay_count = 0x03,
-               .stable_count = 0x4B,
-               .active_delay_count = 0x06,
-               .xtal_freq_count = 0xBB},
-       {
-               .osc_frequency = 12000000,
-               .enable_delay_count = 0x02,
-               .stable_count = 0x2F,
-               .active_delay_count = 0x04,
-               .xtal_freq_count = 0x76
-       },
-       {
-               .osc_frequency = 26000000,
-               .enable_delay_count = 0x04,
-               .stable_count = 0x66,
-               .active_delay_count = 0x09,
-               .xtal_freq_count = 0xFE
-       },
-       {
-               .osc_frequency = 16800000,
-               .enable_delay_count = 0x03,
-               .stable_count = 0x41,
-               .active_delay_count = 0x0A,
-               .xtal_freq_count = 0xA4
-       },
-};
-
-static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
-static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
-static void __iomem *misc_gp_hidrev_base = IO_ADDRESS(TEGRA_APB_MISC_BASE);
-
-#define MISC_GP_HIDREV                  0x804
-
-/*
- * Some peripheral clocks share an enable bit, so refcount the enable bits
- * in registers CLK_ENABLE_L, ... CLK_ENABLE_W
- */
-static int tegra_periph_clk_enable_refcount[CLK_OUT_ENB_NUM * 32];
-
-#define clk_writel(value, reg) \
-       __raw_writel(value, reg_clk_base + (reg))
-#define clk_readl(reg) \
-       __raw_readl(reg_clk_base + (reg))
-#define pmc_writel(value, reg) \
-       __raw_writel(value, reg_pmc_base + (reg))
-#define pmc_readl(reg) \
-       __raw_readl(reg_pmc_base + (reg))
-#define chipid_readl() \
-       __raw_readl(misc_gp_hidrev_base + MISC_GP_HIDREV)
-
-#define clk_writel_delay(value, reg)                                   \
-       do {                                                            \
-               __raw_writel((value), reg_clk_base + (reg));    \
-               udelay(2);                                              \
-       } while (0)
-
-static inline int clk_set_div(struct clk_tegra *c, u32 n)
-{
-       struct clk *clk = c->hw.clk;
-
-       return clk_set_rate(clk,
-                       (__clk_get_rate(__clk_get_parent(clk)) + n - 1) / n);
-}
-
-static inline u32 periph_clk_to_reg(
-       struct clk_tegra *c, u32 reg_L, u32 reg_V, int offs)
-{
-       u32 reg = c->u.periph.clk_num / 32;
-       BUG_ON(reg >= RST_DEVICES_NUM);
-       if (reg < 3)
-               reg = reg_L + (reg * offs);
-       else
-               reg = reg_V + ((reg - 3) * offs);
-       return reg;
-}
-
-static unsigned long clk_measure_input_freq(void)
-{
-       u32 clock_autodetect;
-       clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
-       do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
-       clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
-       if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
-               return 12000000;
-       } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
-               return 13000000;
-       } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
-               return 19200000;
-       } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
-               return 26000000;
-       } else if (clock_autodetect >= 1025 - 3 && clock_autodetect <= 1025 + 3) {
-               return 16800000;
-       } else if (clock_autodetect >= 2344 - 3 && clock_autodetect <= 2344 + 3) {
-               return 38400000;
-       } else if (clock_autodetect >= 2928 - 3 && clock_autodetect <= 2928 + 3) {
-               return 48000000;
-       } else {
-               pr_err("%s: Unexpected clock autodetect value %d", __func__,
-                       clock_autodetect);
-               BUG();
-               return 0;
-       }
-}
-
-static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate,
-                                u32 flags, u32 round_mode)
-{
-       s64 divider_u71 = parent_rate;
-       if (!rate)
-               return -EINVAL;
-
-       if (!(flags & DIV_U71_INT))
-               divider_u71 *= 2;
-       if (round_mode == ROUND_DIVIDER_UP)
-               divider_u71 += rate - 1;
-       do_div(divider_u71, rate);
-       if (flags & DIV_U71_INT)
-               divider_u71 *= 2;
-
-       if (divider_u71 - 2 < 0)
-               return 0;
-
-       if (divider_u71 - 2 > 255)
-               return -EINVAL;
-
-       return divider_u71 - 2;
-}
-
-static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
-{
-       s64 divider_u16;
-
-       divider_u16 = parent_rate;
-       if (!rate)
-               return -EINVAL;
-       divider_u16 += rate - 1;
-       do_div(divider_u16, rate);
-
-       if (divider_u16 - 1 < 0)
-               return 0;
-
-       if (divider_u16 - 1 > 0xFFFF)
-               return -EINVAL;
-
-       return divider_u16 - 1;
-}
-
-static unsigned long tegra30_clk_fixed_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       return to_clk_tegra(hw)->fixed_rate;
-}
-
-struct clk_ops tegra30_clk_32k_ops = {
-       .recalc_rate = tegra30_clk_fixed_recalc_rate,
-};
-
-/* clk_m functions */
-static unsigned long tegra30_clk_m_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       if (!to_clk_tegra(hw)->fixed_rate)
-               to_clk_tegra(hw)->fixed_rate = clk_measure_input_freq();
-       return to_clk_tegra(hw)->fixed_rate;
-}
-
-static void tegra30_clk_m_init(struct clk_hw *hw)
-{
-       u32 osc_ctrl = clk_readl(OSC_CTRL);
-       u32 auto_clock_control = osc_ctrl & ~OSC_CTRL_OSC_FREQ_MASK;
-       u32 pll_ref_div = osc_ctrl & OSC_CTRL_PLL_REF_DIV_MASK;
-
-       switch (to_clk_tegra(hw)->fixed_rate) {
-       case 12000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
-               break;
-       case 13000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
-               break;
-       case 19200000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
-               break;
-       case 26000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
-               break;
-       case 16800000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_16_8MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
-               break;
-       case 38400000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_38_4MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_2);
-               break;
-       case 48000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_48MHZ;
-               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_4);
-               break;
-       default:
-               pr_err("%s: Unexpected clock rate %ld", __func__,
-                               to_clk_tegra(hw)->fixed_rate);
-               BUG();
-       }
-       clk_writel(auto_clock_control, OSC_CTRL);
-}
-
-struct clk_ops tegra30_clk_m_ops = {
-       .init = tegra30_clk_m_init,
-       .recalc_rate = tegra30_clk_m_recalc_rate,
-};
-
-static unsigned long tegra30_clk_m_div_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-struct clk_ops tegra_clk_m_div_ops = {
-       .recalc_rate = tegra30_clk_m_div_recalc_rate,
-};
-
-/* PLL reference divider functions */
-static unsigned long tegra30_pll_ref_recalc_rate(struct clk_hw *hw,
-                       unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long rate = parent_rate;
-       u32 pll_ref_div = clk_readl(OSC_CTRL) & OSC_CTRL_PLL_REF_DIV_MASK;
-
-       switch (pll_ref_div) {
-       case OSC_CTRL_PLL_REF_DIV_1:
-               c->div = 1;
-               break;
-       case OSC_CTRL_PLL_REF_DIV_2:
-               c->div = 2;
-               break;
-       case OSC_CTRL_PLL_REF_DIV_4:
-               c->div = 4;
-               break;
-       default:
-               pr_err("%s: Invalid pll ref divider %d", __func__, pll_ref_div);
-               BUG();
-       }
-       c->mul = 1;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-struct clk_ops tegra_pll_ref_ops = {
-       .recalc_rate = tegra30_pll_ref_recalc_rate,
-};
-
-/* super clock functions */
-/* "super clocks" on tegra30 have two-stage muxes, fractional 7.1 divider and
- * clock skipping super divider.  We will ignore the clock skipping divider,
- * since we can't lower the voltage when using the clock skip, but we can if
- * we lower the PLL frequency. We will use 7.1 divider for CPU super-clock
- * only when its parent is a fixed rate PLL, since we can't change PLL rate
- * in this case.
- */
-static void tegra30_super_clk_init(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       struct clk_tegra *p =
-                       to_clk_tegra(__clk_get_hw(__clk_get_parent(hw->clk)));
-
-       c->state = ON;
-       if (c->flags & DIV_U71) {
-               /* Init safe 7.1 divider value (does not affect PLLX path) */
-               clk_writel(SUPER_CLOCK_DIV_U71_MIN << SUPER_CLOCK_DIV_U71_SHIFT,
-                          c->reg + SUPER_CLK_DIVIDER);
-               c->mul = 2;
-               c->div = 2;
-               if (!(p->flags & PLLX))
-                       c->div += SUPER_CLOCK_DIV_U71_MIN;
-       } else
-               clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
-}
-
-static u8 tegra30_super_clk_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       int source;
-       int shift;
-
-       val = clk_readl(c->reg + SUPER_CLK_MUX);
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       source = (val >> shift) & SUPER_SOURCE_MASK;
-       if (c->flags & DIV_2)
-               source |= val & SUPER_LP_DIV2_BYPASS;
-
-       return source;
-}
-
-static int tegra30_super_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       struct clk_tegra *p =
-                       to_clk_tegra(__clk_get_hw(clk_get_parent(hw->clk)));
-       u32 val;
-       int shift;
-
-       val = clk_readl(c->reg + SUPER_CLK_MUX);
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-
-       /* For LP mode super-clock switch between PLLX direct
-          and divided-by-2 outputs is allowed only when other
-          than PLLX clock source is current parent */
-       if ((c->flags & DIV_2) && (p->flags & PLLX) &&
-           ((index ^ val) & SUPER_LP_DIV2_BYPASS)) {
-               if (p->flags & PLLX)
-                       return -EINVAL;
-               val ^= SUPER_LP_DIV2_BYPASS;
-               clk_writel_delay(val, c->reg);
-       }
-       val &= ~(SUPER_SOURCE_MASK << shift);
-       val |= (index & SUPER_SOURCE_MASK) << shift;
-
-       /* 7.1 divider for CPU super-clock does not affect
-          PLLX path */
-       if (c->flags & DIV_U71) {
-               u32 div = 0;
-               if (!(p->flags & PLLX)) {
-                       div = clk_readl(c->reg +
-                                       SUPER_CLK_DIVIDER);
-                       div &= SUPER_CLOCK_DIV_U71_MASK;
-                       div >>= SUPER_CLOCK_DIV_U71_SHIFT;
-               }
-               c->div = div + 2;
-               c->mul = 2;
-       }
-       clk_writel_delay(val, c->reg);
-
-       return 0;
-}
-
-/*
- * Do not use super clocks "skippers", since dividing using a clock skipper
- * does not allow the voltage to be scaled down. Instead adjust the rate of
- * the parent clock. This requires that the parent of a super clock have no
- * other children, otherwise the rate will change underneath the other
- * children. Special case: if fixed rate PLL is CPU super clock parent the
- * rate of this PLL can't be changed, and it has many other children. In
- * this case use 7.1 fractional divider to adjust the super clock rate.
- */
-static int tegra30_super_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       struct clk *parent = __clk_get_parent(hw->clk);
-       struct clk_tegra *cparent = to_clk_tegra(__clk_get_hw(parent));
-
-       if ((c->flags & DIV_U71) && (cparent->flags & PLL_FIXED)) {
-               int div = clk_div71_get_divider(parent_rate,
-                                       rate, c->flags, ROUND_DIVIDER_DOWN);
-               div = max(div, SUPER_CLOCK_DIV_U71_MIN);
-
-               clk_writel(div << SUPER_CLOCK_DIV_U71_SHIFT,
-                          c->reg + SUPER_CLK_DIVIDER);
-               c->div = div + 2;
-               c->mul = 2;
-               return 0;
-       }
-       return 0;
-}
-
-static unsigned long tegra30_super_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-static long tegra30_super_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       struct clk *parent = __clk_get_parent(hw->clk);
-       struct clk_tegra *cparent = to_clk_tegra(__clk_get_hw(parent));
-       int mul = 2;
-       int div;
-
-       if ((c->flags & DIV_U71) && (cparent->flags & PLL_FIXED)) {
-               div = clk_div71_get_divider(*prate,
-                               rate, c->flags, ROUND_DIVIDER_DOWN);
-               div = max(div, SUPER_CLOCK_DIV_U71_MIN) + 2;
-               rate = *prate * mul;
-               rate += div - 1; /* round up */
-               do_div(rate, c->div);
-
-               return rate;
-       }
-       return *prate;
-}
-
-struct clk_ops tegra30_super_ops = {
-       .init = tegra30_super_clk_init,
-       .set_parent = tegra30_super_clk_set_parent,
-       .get_parent = tegra30_super_clk_get_parent,
-       .recalc_rate = tegra30_super_clk_recalc_rate,
-       .round_rate = tegra30_super_clk_round_rate,
-       .set_rate = tegra30_super_clk_set_rate,
-};
-
-static unsigned long tegra30_twd_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-struct clk_ops tegra30_twd_ops = {
-       .recalc_rate = tegra30_twd_clk_recalc_rate,
-};
-
-/* bus clock functions */
-static int tegra30_bus_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-
-       c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
-       return c->state;
-}
-
-static int tegra30_bus_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg);
-       val &= ~(BUS_CLK_DISABLE << c->reg_shift);
-       clk_writel(val, c->reg);
-
-       return 0;
-}
-
-static void tegra30_bus_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg);
-       val |= BUS_CLK_DISABLE << c->reg_shift;
-       clk_writel(val, c->reg);
-}
-
-static unsigned long tegra30_bus_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       u64 rate = prate;
-
-       c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
-       c->mul = 1;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-       return rate;
-}
-
-static int tegra30_bus_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       int ret = -EINVAL;
-       u32 val;
-       int i;
-
-       val = clk_readl(c->reg);
-       for (i = 1; i <= 4; i++) {
-               if (rate == parent_rate / i) {
-                       val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
-                       val |= (i - 1) << c->reg_shift;
-                       clk_writel(val, c->reg);
-                       c->div = i;
-                       c->mul = 1;
-                       ret = 0;
-                       break;
-               }
-       }
-
-       return ret;
-}
-
-static long tegra30_bus_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       unsigned long parent_rate = *prate;
-       s64 divider;
-
-       if (rate >= parent_rate)
-               return parent_rate;
-
-       divider = parent_rate;
-       divider += rate - 1;
-       do_div(divider, rate);
-
-       if (divider < 0)
-               return divider;
-
-       if (divider > 4)
-               divider = 4;
-       do_div(parent_rate, divider);
-
-       return parent_rate;
-}
-
-struct clk_ops tegra30_bus_ops = {
-       .is_enabled = tegra30_bus_clk_is_enabled,
-       .enable = tegra30_bus_clk_enable,
-       .disable = tegra30_bus_clk_disable,
-       .set_rate = tegra30_bus_clk_set_rate,
-       .round_rate = tegra30_bus_clk_round_rate,
-       .recalc_rate = tegra30_bus_clk_recalc_rate,
-};
-
-/* Blink output functions */
-static int tegra30_blink_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = pmc_readl(PMC_CTRL);
-       c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
-       return c->state;
-}
-
-static int tegra30_blink_clk_enable(struct clk_hw *hw)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_DPD_PADS_ORIDE);
-       pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
-
-       val = pmc_readl(PMC_CTRL);
-       pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
-
-       return 0;
-}
-
-static void tegra30_blink_clk_disable(struct clk_hw *hw)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_CTRL);
-       pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
-
-       val = pmc_readl(PMC_DPD_PADS_ORIDE);
-       pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
-}
-
-static int tegra30_blink_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (rate >= parent_rate) {
-               c->div = 1;
-               pmc_writel(0, c->reg);
-       } else {
-               unsigned int on_off;
-               u32 val;
-
-               on_off = DIV_ROUND_UP(parent_rate / 8, rate);
-               c->div = on_off * 8;
-
-               val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
-                       PMC_BLINK_TIMER_DATA_ON_SHIFT;
-               on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val |= on_off;
-               val |= PMC_BLINK_TIMER_ENB;
-               pmc_writel(val, c->reg);
-       }
-
-       return 0;
-}
-
-static unsigned long tegra30_blink_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-       u32 val;
-       u32 mul;
-       u32 div;
-       u32 on_off;
-
-       mul = 1;
-       val = pmc_readl(c->reg);
-
-       if (val & PMC_BLINK_TIMER_ENB) {
-               on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
-                       PMC_BLINK_TIMER_DATA_ON_MASK;
-               val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off += val;
-               /* each tick in the blink timer is 4 32KHz clocks */
-               div = on_off * 4;
-       } else {
-               div = 1;
-       }
-
-       if (mul != 0 && div != 0) {
-               rate *= mul;
-               rate += div - 1; /* round up */
-               do_div(rate, div);
-       }
-       return rate;
-}
-
-static long tegra30_blink_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       int div;
-       int mul;
-       long round_rate = *prate;
-
-       mul = 1;
-
-       if (rate >= *prate) {
-               div = 1;
-       } else {
-               div = DIV_ROUND_UP(*prate / 8, rate);
-               div *= 8;
-       }
-
-       round_rate *= mul;
-       round_rate += div - 1;
-       do_div(round_rate, div);
-
-       return round_rate;
-}
-
-struct clk_ops tegra30_blink_clk_ops = {
-       .is_enabled = tegra30_blink_clk_is_enabled,
-       .enable = tegra30_blink_clk_enable,
-       .disable = tegra30_blink_clk_disable,
-       .recalc_rate = tegra30_blink_clk_recalc_rate,
-       .round_rate = tegra30_blink_clk_round_rate,
-       .set_rate = tegra30_blink_clk_set_rate,
-};
-
-static void tegra30_utmi_param_configure(struct clk_hw *hw)
-{
-       unsigned long main_rate =
-               __clk_get_rate(__clk_get_parent(__clk_get_parent(hw->clk)));
-       u32 reg;
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
-               if (main_rate == utmi_parameters[i].osc_frequency)
-                       break;
-       }
-
-       if (i >= ARRAY_SIZE(utmi_parameters)) {
-               pr_err("%s: Unexpected main rate %lu\n", __func__, main_rate);
-               return;
-       }
-
-       reg = clk_readl(UTMIP_PLL_CFG2);
-
-       /* Program UTMIP PLL stable and active counts */
-       /* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */
-       reg &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
-       reg |= UTMIP_PLL_CFG2_STABLE_COUNT(
-                       utmi_parameters[i].stable_count);
-
-       reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
-
-       reg |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(
-                       utmi_parameters[i].active_delay_count);
-
-       /* Remove power downs from UTMIP PLL control bits */
-       reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
-       reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
-       reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN;
-
-       clk_writel(reg, UTMIP_PLL_CFG2);
-
-       /* Program UTMIP PLL delay and oscillator frequency counts */
-       reg = clk_readl(UTMIP_PLL_CFG1);
-       reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
-
-       reg |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(
-               utmi_parameters[i].enable_delay_count);
-
-       reg &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
-       reg |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(
-               utmi_parameters[i].xtal_freq_count);
-
-       /* Remove power downs from UTMIP PLL control bits */
-       reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
-       reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
-       reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
-
-       clk_writel(reg, UTMIP_PLL_CFG1);
-}
-
-/* PLL Functions */
-static int tegra30_pll_clk_wait_for_lock(struct clk_tegra *c, u32 lock_reg,
-                                        u32 lock_bit)
-{
-       int ret = 0;
-
-#if USE_PLL_LOCK_BITS
-       int i;
-       for (i = 0; i < c->u.pll.lock_delay; i++) {
-               if (clk_readl(lock_reg) & lock_bit) {
-                       udelay(PLL_POST_LOCK_DELAY);
-                       return 0;
-               }
-               udelay(2);      /* timeout = 2 * lock time */
-       }
-       pr_err("Timed out waiting for lock bit on pll %s",
-                                       __clk_get_name(hw->clk));
-       ret = -1;
-#else
-       udelay(c->u.pll.lock_delay);
-#endif
-       return ret;
-}
-
-static int tegra30_pll_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg + PLL_BASE);
-
-       c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
-       return c->state;
-}
-
-static void tegra30_pll_clk_init(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (c->flags & PLLU)
-               tegra30_utmi_param_configure(hw);
-}
-
-static int tegra30_pll_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-#if USE_PLL_LOCK_BITS
-       val = clk_readl(c->reg + PLL_MISC(c));
-       val |= PLL_MISC_LOCK_ENABLE(c);
-       clk_writel(val, c->reg + PLL_MISC(c));
-#endif
-       val = clk_readl(c->reg + PLL_BASE);
-       val &= ~PLL_BASE_BYPASS;
-       val |= PLL_BASE_ENABLE;
-       clk_writel(val, c->reg + PLL_BASE);
-
-       if (c->flags & PLLM) {
-               val = pmc_readl(PMC_PLLP_WB0_OVERRIDE);
-               val |= PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE;
-               pmc_writel(val, PMC_PLLP_WB0_OVERRIDE);
-       }
-
-       tegra30_pll_clk_wait_for_lock(c, c->reg + PLL_BASE, PLL_BASE_LOCK);
-
-       return 0;
-}
-
-static void tegra30_pll_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
-
-       val = clk_readl(c->reg);
-       val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
-       clk_writel(val, c->reg);
-
-       if (c->flags & PLLM) {
-               val = pmc_readl(PMC_PLLP_WB0_OVERRIDE);
-               val &= ~PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE;
-               pmc_writel(val, PMC_PLLP_WB0_OVERRIDE);
-       }
-}
-
-static int tegra30_pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val, p_div, old_base;
-       unsigned long input_rate;
-       const struct clk_pll_freq_table *sel;
-       struct clk_pll_freq_table cfg;
-
-       if (c->flags & PLL_FIXED) {
-               int ret = 0;
-               if (rate != c->u.pll.fixed_rate) {
-                       pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
-                              __func__, __clk_get_name(hw->clk),
-                               c->u.pll.fixed_rate, rate);
-                       ret = -EINVAL;
-               }
-               return ret;
-       }
-
-       if (c->flags & PLLM) {
-               if (rate != __clk_get_rate(hw->clk)) {
-                       pr_err("%s: Can not change memory %s rate in flight\n",
-                               __func__, __clk_get_name(hw->clk));
-                       return -EINVAL;
-               }
-       }
-
-       p_div = 0;
-       input_rate = parent_rate;
-
-       /* Check if the target rate is tabulated */
-       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-               if (sel->input_rate == input_rate && sel->output_rate == rate) {
-                       if (c->flags & PLLU) {
-                               BUG_ON(sel->p < 1 || sel->p > 2);
-                               if (sel->p == 1)
-                                       p_div = PLLU_BASE_POST_DIV;
-                       } else {
-                               BUG_ON(sel->p < 1);
-                               for (val = sel->p; val > 1; val >>= 1)
-                                       p_div++;
-                               p_div <<= PLL_BASE_DIVP_SHIFT;
-                       }
-                       break;
-               }
-       }
-
-       /* Configure out-of-table rate */
-       if (sel->input_rate == 0) {
-               unsigned long cfreq;
-               BUG_ON(c->flags & PLLU);
-               sel = &cfg;
-
-               switch (input_rate) {
-               case 12000000:
-               case 26000000:
-                       cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2000000;
-                       break;
-               case 13000000:
-                       cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2600000;
-                       break;
-               case 16800000:
-               case 19200000:
-                       cfreq = (rate <= 1200000 * 1000) ? 1200000 : 2400000;
-                       break;
-               default:
-                       pr_err("%s: Unexpected reference rate %lu\n",
-                              __func__, input_rate);
-                       BUG();
-               }
-
-               /* Raise VCO to guarantee 0.5% accuracy */
-               for (cfg.output_rate = rate; cfg.output_rate < 200 * cfreq;
-                     cfg.output_rate <<= 1)
-                       p_div++;
-
-               cfg.p = 0x1 << p_div;
-               cfg.m = input_rate / cfreq;
-               cfg.n = cfg.output_rate / cfreq;
-               cfg.cpcon = OUT_OF_TABLE_CPCON;
-
-               if ((cfg.m > (PLL_BASE_DIVM_MASK >> PLL_BASE_DIVM_SHIFT)) ||
-                   (cfg.n > (PLL_BASE_DIVN_MASK >> PLL_BASE_DIVN_SHIFT)) ||
-                   (p_div > (PLL_BASE_DIVP_MASK >> PLL_BASE_DIVP_SHIFT)) ||
-                   (cfg.output_rate > c->u.pll.vco_max)) {
-                       pr_err("%s: Failed to set %s out-of-table rate %lu\n",
-                              __func__, __clk_get_name(hw->clk), rate);
-                       return -EINVAL;
-               }
-               p_div <<= PLL_BASE_DIVP_SHIFT;
-       }
-
-       c->mul = sel->n;
-       c->div = sel->m * sel->p;
-
-       old_base = val = clk_readl(c->reg + PLL_BASE);
-       val &= ~(PLL_BASE_DIVM_MASK | PLL_BASE_DIVN_MASK |
-                ((c->flags & PLLU) ? PLLU_BASE_POST_DIV : PLL_BASE_DIVP_MASK));
-       val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
-               (sel->n << PLL_BASE_DIVN_SHIFT) | p_div;
-       if (val == old_base)
-               return 0;
-
-       if (c->state == ON) {
-               tegra30_pll_clk_disable(hw);
-               val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
-       }
-       clk_writel(val, c->reg + PLL_BASE);
-
-       if (c->flags & PLL_HAS_CPCON) {
-               val = clk_readl(c->reg + PLL_MISC(c));
-               val &= ~PLL_MISC_CPCON_MASK;
-               val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
-               if (c->flags & (PLLU | PLLD)) {
-                       val &= ~PLL_MISC_LFCON_MASK;
-                       if (sel->n >= PLLDU_LFCON_SET_DIVN)
-                               val |= 0x1 << PLL_MISC_LFCON_SHIFT;
-               } else if (c->flags & (PLLX | PLLM)) {
-                       val &= ~(0x1 << PLL_MISC_DCCON_SHIFT);
-                       if (rate >= (c->u.pll.vco_max >> 1))
-                               val |= 0x1 << PLL_MISC_DCCON_SHIFT;
-               }
-               clk_writel(val, c->reg + PLL_MISC(c));
-       }
-
-       if (c->state == ON)
-               tegra30_pll_clk_enable(hw);
-
-       c->u.pll.fixed_rate = rate;
-
-       return 0;
-}
-
-static long tegra30_pll_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long input_rate = *prate;
-       u64 output_rate = *prate;
-       const struct clk_pll_freq_table *sel;
-       struct clk_pll_freq_table cfg;
-       int mul;
-       int div;
-       u32 p_div;
-       u32 val;
-
-       if (c->flags & PLL_FIXED)
-               return c->u.pll.fixed_rate;
-
-       if (c->flags & PLLM)
-               return __clk_get_rate(hw->clk);
-
-       p_div = 0;
-       /* Check if the target rate is tabulated */
-       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-               if (sel->input_rate == input_rate && sel->output_rate == rate) {
-                       if (c->flags & PLLU) {
-                               BUG_ON(sel->p < 1 || sel->p > 2);
-                               if (sel->p == 1)
-                                       p_div = PLLU_BASE_POST_DIV;
-                       } else {
-                               BUG_ON(sel->p < 1);
-                               for (val = sel->p; val > 1; val >>= 1)
-                                       p_div++;
-                               p_div <<= PLL_BASE_DIVP_SHIFT;
-                       }
-                       break;
-               }
-       }
-
-       if (sel->input_rate == 0) {
-               unsigned long cfreq;
-               BUG_ON(c->flags & PLLU);
-               sel = &cfg;
-
-               switch (input_rate) {
-               case 12000000:
-               case 26000000:
-                       cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2000000;
-                       break;
-               case 13000000:
-                       cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2600000;
-                       break;
-               case 16800000:
-               case 19200000:
-                       cfreq = (rate <= 1200000 * 1000) ? 1200000 : 2400000;
-                       break;
-               default:
-                       pr_err("%s: Unexpected reference rate %lu\n",
-                              __func__, input_rate);
-                       BUG();
-               }
-
-               /* Raise VCO to guarantee 0.5% accuracy */
-               for (cfg.output_rate = rate; cfg.output_rate < 200 * cfreq;
-                     cfg.output_rate <<= 1)
-                       p_div++;
-
-               cfg.p = 0x1 << p_div;
-               cfg.m = input_rate / cfreq;
-               cfg.n = cfg.output_rate / cfreq;
-       }
-
-       mul = sel->n;
-       div = sel->m * sel->p;
-
-       output_rate *= mul;
-       output_rate += div - 1; /* round up */
-       do_div(output_rate, div);
-
-       return output_rate;
-}
-
-static unsigned long tegra30_pll_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-       u32 val = clk_readl(c->reg + PLL_BASE);
-
-       if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
-               const struct clk_pll_freq_table *sel;
-               for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-                       if (sel->input_rate == parent_rate &&
-                               sel->output_rate == c->u.pll.fixed_rate) {
-                               c->mul = sel->n;
-                               c->div = sel->m * sel->p;
-                               break;
-                       }
-               }
-               pr_err("Clock %s has unknown fixed frequency\n",
-                                               __clk_get_name(hw->clk));
-               BUG();
-       } else if (val & PLL_BASE_BYPASS) {
-               c->mul = 1;
-               c->div = 1;
-       } else {
-               c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
-               c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
-               if (c->flags & PLLU)
-                       c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
-               else
-                       c->div *= (0x1 << ((val & PLL_BASE_DIVP_MASK) >>
-                                       PLL_BASE_DIVP_SHIFT));
-       }
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-struct clk_ops tegra30_pll_ops = {
-       .is_enabled = tegra30_pll_clk_is_enabled,
-       .init = tegra30_pll_clk_init,
-       .enable = tegra30_pll_clk_enable,
-       .disable = tegra30_pll_clk_disable,
-       .recalc_rate = tegra30_pll_recalc_rate,
-       .round_rate = tegra30_pll_round_rate,
-       .set_rate = tegra30_pll_clk_set_rate,
-};
-
-int tegra30_plld_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val, mask, reg;
-
-       switch (p) {
-       case TEGRA_CLK_PLLD_CSI_OUT_ENB:
-               mask = PLLD_BASE_CSI_CLKENABLE;
-               reg = c->reg + PLL_BASE;
-               break;
-       case TEGRA_CLK_PLLD_DSI_OUT_ENB:
-               mask = PLLD_MISC_DSI_CLKENABLE;
-               reg = c->reg + PLL_MISC(c);
-               break;
-       case TEGRA_CLK_PLLD_MIPI_MUX_SEL:
-               if (!(c->flags & PLL_ALT_MISC_REG)) {
-                       mask = PLLD_BASE_DSIB_MUX_MASK;
-                       reg = c->reg + PLL_BASE;
-                       break;
-               }
-       /* fall through - error since PLLD2 does not have MUX_SEL control */
-       default:
-               return -EINVAL;
-       }
-
-       val = clk_readl(reg);
-       if (setting)
-               val |= mask;
-       else
-               val &= ~mask;
-       clk_writel(val, reg);
-       return 0;
-}
-
-static int tegra30_plle_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg + PLL_BASE);
-       c->state = (val & PLLE_BASE_ENABLE) ? ON : OFF;
-       return c->state;
-}
-
-static void tegra30_plle_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg + PLL_BASE);
-       val &= ~(PLLE_BASE_CML_ENABLE | PLLE_BASE_ENABLE);
-       clk_writel(val, c->reg + PLL_BASE);
-}
-
-static void tegra30_plle_training(struct clk_tegra *c)
-{
-       u32 val;
-
-       /* PLLE is already disabled, and setup cleared;
-        * create falling edge on PLLE IDDQ input */
-       val = pmc_readl(PMC_SATA_PWRGT);
-       val |= PMC_SATA_PWRGT_PLLE_IDDQ_VALUE;
-       pmc_writel(val, PMC_SATA_PWRGT);
-
-       val = pmc_readl(PMC_SATA_PWRGT);
-       val |= PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL;
-       pmc_writel(val, PMC_SATA_PWRGT);
-
-       val = pmc_readl(PMC_SATA_PWRGT);
-       val &= ~PMC_SATA_PWRGT_PLLE_IDDQ_VALUE;
-       pmc_writel(val, PMC_SATA_PWRGT);
-
-       do {
-               val = clk_readl(c->reg + PLL_MISC(c));
-       } while (!(val & PLLE_MISC_READY));
-}
-
-static int tegra30_plle_configure(struct clk_hw *hw, bool force_training)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       struct clk *parent = __clk_get_parent(hw->clk);
-       const struct clk_pll_freq_table *sel;
-       u32 val;
-
-       unsigned long rate = c->u.pll.fixed_rate;
-       unsigned long input_rate = __clk_get_rate(parent);
-
-       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-               if (sel->input_rate == input_rate && sel->output_rate == rate)
-                       break;
-       }
-
-       if (sel->input_rate == 0)
-               return -ENOSYS;
-
-       /* disable PLLE, clear setup fiels */
-       tegra30_plle_clk_disable(hw);
-
-       val = clk_readl(c->reg + PLL_MISC(c));
-       val &= ~(PLLE_MISC_LOCK_ENABLE | PLLE_MISC_SETUP_MASK);
-       clk_writel(val, c->reg + PLL_MISC(c));
-
-       /* training */
-       val = clk_readl(c->reg + PLL_MISC(c));
-       if (force_training || (!(val & PLLE_MISC_READY)))
-               tegra30_plle_training(c);
-
-       /* configure dividers, setup, disable SS */
-       val = clk_readl(c->reg + PLL_BASE);
-       val &= ~PLLE_BASE_DIV_MASK;
-       val |= PLLE_BASE_DIV(sel->m, sel->n, sel->p, sel->cpcon);
-       clk_writel(val, c->reg + PLL_BASE);
-       c->mul = sel->n;
-       c->div = sel->m * sel->p;
-
-       val = clk_readl(c->reg + PLL_MISC(c));
-       val |= PLLE_MISC_SETUP_VALUE;
-       val |= PLLE_MISC_LOCK_ENABLE;
-       clk_writel(val, c->reg + PLL_MISC(c));
-
-       val = clk_readl(PLLE_SS_CTRL);
-       val |= PLLE_SS_DISABLE;
-       clk_writel(val, PLLE_SS_CTRL);
-
-       /* enable and lock PLLE*/
-       val = clk_readl(c->reg + PLL_BASE);
-       val |= (PLLE_BASE_CML_ENABLE | PLLE_BASE_ENABLE);
-       clk_writel(val, c->reg + PLL_BASE);
-
-       tegra30_pll_clk_wait_for_lock(c, c->reg + PLL_MISC(c), PLLE_MISC_LOCK);
-
-       return 0;
-}
-
-static int tegra30_plle_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       return tegra30_plle_configure(hw, !c->set);
-}
-
-static unsigned long tegra30_plle_clk_recalc_rate(struct clk_hw *hw,
-                       unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long rate = parent_rate;
-       u32 val;
-
-       val = clk_readl(c->reg + PLL_BASE);
-       c->mul = (val & PLLE_BASE_DIVN_MASK) >> PLLE_BASE_DIVN_SHIFT;
-       c->div = (val & PLLE_BASE_DIVM_MASK) >> PLLE_BASE_DIVM_SHIFT;
-       c->div *= (val & PLLE_BASE_DIVP_MASK) >> PLLE_BASE_DIVP_SHIFT;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-       return rate;
-}
-
-struct clk_ops tegra30_plle_ops = {
-       .is_enabled = tegra30_plle_clk_is_enabled,
-       .enable = tegra30_plle_clk_enable,
-       .disable = tegra30_plle_clk_disable,
-       .recalc_rate = tegra30_plle_clk_recalc_rate,
-};
-
-/* Clock divider ops */
-static int tegra30_pll_div_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (c->flags & DIV_U71) {
-               u32 val = clk_readl(c->reg);
-               val >>= c->reg_shift;
-               c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
-               if (!(val & PLL_OUT_RESET_DISABLE))
-                       c->state = OFF;
-       } else {
-               c->state = ON;
-       }
-       return c->state;
-}
-
-static int tegra30_pll_div_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       u32 new_val;
-
-       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
-       if (c->flags & DIV_U71) {
-               val = clk_readl(c->reg);
-               new_val = val >> c->reg_shift;
-               new_val &= 0xFFFF;
-
-               new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
-
-               val &= ~(0xFFFF << c->reg_shift);
-               val |= new_val << c->reg_shift;
-               clk_writel_delay(val, c->reg);
-               return 0;
-       } else if (c->flags & DIV_2) {
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static void tegra30_pll_div_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       u32 new_val;
-
-       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
-       if (c->flags & DIV_U71) {
-               val = clk_readl(c->reg);
-               new_val = val >> c->reg_shift;
-               new_val &= 0xFFFF;
-
-               new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
-
-               val &= ~(0xFFFF << c->reg_shift);
-               val |= new_val << c->reg_shift;
-               clk_writel_delay(val, c->reg);
-       }
-}
-
-static int tegra30_pll_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       u32 new_val;
-       int divider_u71;
-
-       if (c->flags & DIV_U71) {
-               divider_u71 = clk_div71_get_divider(
-                       parent_rate, rate, c->flags, ROUND_DIVIDER_UP);
-               if (divider_u71 >= 0) {
-                       val = clk_readl(c->reg);
-                       new_val = val >> c->reg_shift;
-                       new_val &= 0xFFFF;
-                       if (c->flags & DIV_U71_FIXED)
-                               new_val |= PLL_OUT_OVERRIDE;
-                       new_val &= ~PLL_OUT_RATIO_MASK;
-                       new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
-
-                       val &= ~(0xFFFF << c->reg_shift);
-                       val |= new_val << c->reg_shift;
-                       clk_writel_delay(val, c->reg);
-                       c->div = divider_u71 + 2;
-                       c->mul = 2;
-                       c->fixed_rate = rate;
-                       return 0;
-               }
-       } else if (c->flags & DIV_2) {
-               c->fixed_rate = rate;
-               return 0;
-       }
-
-       return -EINVAL;
-}
-
-static unsigned long tegra30_pll_div_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-
-       if (c->flags & DIV_U71) {
-               u32 divu71;
-               u32 val = clk_readl(c->reg);
-               val >>= c->reg_shift;
-
-               divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
-               c->div = (divu71 + 2);
-               c->mul = 2;
-       } else if (c->flags & DIV_2) {
-               if (c->flags & (PLLD | PLLX)) {
-                       c->div = 2;
-                       c->mul = 1;
-               } else
-                       BUG();
-       } else {
-               c->div = 1;
-               c->mul = 1;
-       }
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-static long tegra30_pll_div_clk_round_rate(struct clk_hw *hw,
-                               unsigned long rate, unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
-       int divider;
-
-       if (prate)
-               parent_rate = *prate;
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(
-                       parent_rate, rate, c->flags, ROUND_DIVIDER_UP);
-               if (divider < 0)
-                       return divider;
-               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_2) {
-               *prate = rate * 2;
-               return rate;
-       }
-
-       return -EINVAL;
-}
-
-struct clk_ops tegra30_pll_div_ops = {
-       .is_enabled = tegra30_pll_div_clk_is_enabled,
-       .enable = tegra30_pll_div_clk_enable,
-       .disable = tegra30_pll_div_clk_disable,
-       .set_rate = tegra30_pll_div_clk_set_rate,
-       .recalc_rate = tegra30_pll_div_clk_recalc_rate,
-       .round_rate = tegra30_pll_div_clk_round_rate,
-};
-
-/* Periph clk ops */
-static inline u32 periph_clk_source_mask(struct clk_tegra *c)
-{
-       if (c->flags & MUX8)
-               return 7 << 29;
-       else if (c->flags & MUX_PWM)
-               return 3 << 28;
-       else if (c->flags & MUX_CLK_OUT)
-               return 3 << (c->u.periph.clk_num + 4);
-       else if (c->flags & PLLD)
-               return PLLD_BASE_DSIB_MUX_MASK;
-       else
-               return 3 << 30;
-}
-
-static inline u32 periph_clk_source_shift(struct clk_tegra *c)
-{
-       if (c->flags & MUX8)
-               return 29;
-       else if (c->flags & MUX_PWM)
-               return 28;
-       else if (c->flags & MUX_CLK_OUT)
-               return c->u.periph.clk_num + 4;
-       else if (c->flags & PLLD)
-               return PLLD_BASE_DSIB_MUX_SHIFT;
-       else
-               return 30;
-}
-
-static int tegra30_periph_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       c->state = ON;
-       if (!(clk_readl(PERIPH_CLK_TO_ENB_REG(c)) & PERIPH_CLK_TO_BIT(c)))
-               c->state = OFF;
-       if (!(c->flags & PERIPH_NO_RESET))
-               if (clk_readl(PERIPH_CLK_TO_RST_REG(c)) & PERIPH_CLK_TO_BIT(c))
-                       c->state = OFF;
-       return c->state;
-}
-
-static int tegra30_periph_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
-       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 1)
-               return 0;
-
-       clk_writel_delay(PERIPH_CLK_TO_BIT(c), PERIPH_CLK_TO_ENB_SET_REG(c));
-       if (!(c->flags & PERIPH_NO_RESET) &&
-                !(c->flags & PERIPH_MANUAL_RESET)) {
-               if (clk_readl(PERIPH_CLK_TO_RST_REG(c)) &
-                        PERIPH_CLK_TO_BIT(c)) {
-                       udelay(5);      /* reset propagation delay */
-                       clk_writel(PERIPH_CLK_TO_BIT(c),
-                                PERIPH_CLK_TO_RST_CLR_REG(c));
-               }
-       }
-       return 0;
-}
-
-static void tegra30_periph_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long val;
-
-       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
-
-       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 0)
-               return;
-
-       /* If peripheral is in the APB bus then read the APB bus to
-        * flush the write operation in apb bus. This will avoid the
-        * peripheral access after disabling clock*/
-       if (c->flags & PERIPH_ON_APB)
-               val = chipid_readl();
-
-       clk_writel_delay(PERIPH_CLK_TO_BIT(c), PERIPH_CLK_TO_ENB_CLR_REG(c));
-}
-
-void tegra30_periph_clk_reset(struct clk_hw *hw, bool assert)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long val;
-
-       if (!(c->flags & PERIPH_NO_RESET)) {
-               if (assert) {
-                       /* If peripheral is in the APB bus then read the APB
-                        * bus to flush the write operation in apb bus. This
-                        * will avoid the peripheral access after disabling
-                        * clock */
-                       if (c->flags & PERIPH_ON_APB)
-                               val = chipid_readl();
-
-                       clk_writel(PERIPH_CLK_TO_BIT(c),
-                                  PERIPH_CLK_TO_RST_SET_REG(c));
-               } else
-                       clk_writel(PERIPH_CLK_TO_BIT(c),
-                                  PERIPH_CLK_TO_RST_CLR_REG(c));
-       }
-}
-
-static int tegra30_periph_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       if (!(c->flags & MUX))
-               return (index == 0) ? 0 : (-EINVAL);
-
-       val = clk_readl(c->reg);
-       val &= ~periph_clk_source_mask(c);
-       val |= (index << periph_clk_source_shift(c));
-       clk_writel_delay(val, c->reg);
-       return 0;
-}
-
-static u8 tegra30_periph_clk_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       int source  = (val & periph_clk_source_mask(c)) >>
-                                       periph_clk_source_shift(c);
-
-       if (!(c->flags & MUX))
-               return 0;
-
-       return source;
-}
-
-static int tegra30_periph_clk_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       int divider;
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(
-                       parent_rate, rate, c->flags, ROUND_DIVIDER_UP);
-               if (divider >= 0) {
-                       val = clk_readl(c->reg);
-                       val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
-                       val |= divider;
-                       if (c->flags & DIV_U71_UART) {
-                               if (divider)
-                                       val |= PERIPH_CLK_UART_DIV_ENB;
-                               else
-                                       val &= ~PERIPH_CLK_UART_DIV_ENB;
-                       }
-                       clk_writel_delay(val, c->reg);
-                       c->div = divider + 2;
-                       c->mul = 2;
-                       return 0;
-               }
-       } else if (c->flags & DIV_U16) {
-               divider = clk_div16_get_divider(parent_rate, rate);
-               if (divider >= 0) {
-                       val = clk_readl(c->reg);
-                       val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
-                       val |= divider;
-                       clk_writel_delay(val, c->reg);
-                       c->div = divider + 1;
-                       c->mul = 1;
-                       return 0;
-               }
-       } else if (parent_rate <= rate) {
-               c->div = 1;
-               c->mul = 1;
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static long tegra30_periph_clk_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
-       int divider;
-
-       if (prate)
-               parent_rate = *prate;
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(
-                       parent_rate, rate, c->flags, ROUND_DIVIDER_UP);
-               if (divider < 0)
-                       return divider;
-
-               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_U16) {
-               divider = clk_div16_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-               return DIV_ROUND_UP(parent_rate, divider + 1);
-       }
-       return -EINVAL;
-}
-
-static unsigned long tegra30_periph_clk_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-       u32 val = clk_readl(c->reg);
-
-       if (c->flags & DIV_U71) {
-               u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
-               if ((c->flags & DIV_U71_UART) &&
-                   (!(val & PERIPH_CLK_UART_DIV_ENB))) {
-                       divu71 = 0;
-               }
-               if (c->flags & DIV_U71_IDLE) {
-                       val &= ~(PERIPH_CLK_SOURCE_DIVU71_MASK <<
-                               PERIPH_CLK_SOURCE_DIVIDLE_SHIFT);
-                       val |= (PERIPH_CLK_SOURCE_DIVIDLE_VAL <<
-                               PERIPH_CLK_SOURCE_DIVIDLE_SHIFT);
-                       clk_writel(val, c->reg);
-               }
-               c->div = divu71 + 2;
-               c->mul = 2;
-       } else if (c->flags & DIV_U16) {
-               u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
-               c->div = divu16 + 1;
-               c->mul = 1;
-       } else {
-               c->div = 1;
-               c->mul = 1;
-       }
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-       return rate;
-}
-
-struct clk_ops tegra30_periph_clk_ops = {
-       .is_enabled = tegra30_periph_clk_is_enabled,
-       .enable = tegra30_periph_clk_enable,
-       .disable = tegra30_periph_clk_disable,
-       .set_parent = tegra30_periph_clk_set_parent,
-       .get_parent = tegra30_periph_clk_get_parent,
-       .set_rate = tegra30_periph_clk_set_rate,
-       .round_rate = tegra30_periph_clk_round_rate,
-       .recalc_rate = tegra30_periph_clk_recalc_rate,
-};
-
-static int tegra30_dsib_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk *d = clk_get_sys(NULL, "pll_d");
-       /* The DSIB parent selection bit is in PLLD base register */
-       tegra_clk_cfg_ex(
-               d, TEGRA_CLK_PLLD_MIPI_MUX_SEL, index);
-
-       return 0;
-}
-
-struct clk_ops tegra30_dsib_clk_ops = {
-       .is_enabled = tegra30_periph_clk_is_enabled,
-       .enable                 = &tegra30_periph_clk_enable,
-       .disable                = &tegra30_periph_clk_disable,
-       .set_parent             = &tegra30_dsib_clk_set_parent,
-       .get_parent             = &tegra30_periph_clk_get_parent,
-       .set_rate               = &tegra30_periph_clk_set_rate,
-       .round_rate             = &tegra30_periph_clk_round_rate,
-       .recalc_rate            = &tegra30_periph_clk_recalc_rate,
-};
-
-/* Periph extended clock configuration ops */
-int tegra30_vi_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (p == TEGRA_CLK_VI_INP_SEL) {
-               u32 val = clk_readl(c->reg);
-               val &= ~PERIPH_CLK_VI_SEL_EX_MASK;
-               val |= (setting << PERIPH_CLK_VI_SEL_EX_SHIFT) &
-                       PERIPH_CLK_VI_SEL_EX_MASK;
-               clk_writel(val, c->reg);
-               return 0;
-       }
-       return -EINVAL;
-}
-
-int tegra30_nand_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (p == TEGRA_CLK_NAND_PAD_DIV2_ENB) {
-               u32 val = clk_readl(c->reg);
-               if (setting)
-                       val |= PERIPH_CLK_NAND_DIV_EX_ENB;
-               else
-                       val &= ~PERIPH_CLK_NAND_DIV_EX_ENB;
-               clk_writel(val, c->reg);
-               return 0;
-       }
-       return -EINVAL;
-}
-
-int tegra30_dtv_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       if (p == TEGRA_CLK_DTV_INVERT) {
-               u32 val = clk_readl(c->reg);
-               if (setting)
-                       val |= PERIPH_CLK_DTV_POLARITY_INV;
-               else
-                       val &= ~PERIPH_CLK_DTV_POLARITY_INV;
-               clk_writel(val, c->reg);
-               return 0;
-       }
-       return -EINVAL;
-}
-
-/* Output clock ops */
-
-static DEFINE_SPINLOCK(clk_out_lock);
-
-static int tegra30_clk_out_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = pmc_readl(c->reg);
-
-       c->state = (val & (0x1 << c->u.periph.clk_num)) ? ON : OFF;
-       c->mul = 1;
-       c->div = 1;
-       return c->state;
-}
-
-static int tegra30_clk_out_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       unsigned long flags;
-
-       spin_lock_irqsave(&clk_out_lock, flags);
-       val = pmc_readl(c->reg);
-       val |= (0x1 << c->u.periph.clk_num);
-       pmc_writel(val, c->reg);
-       spin_unlock_irqrestore(&clk_out_lock, flags);
-
-       return 0;
-}
-
-static void tegra30_clk_out_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       unsigned long flags;
-
-       spin_lock_irqsave(&clk_out_lock, flags);
-       val = pmc_readl(c->reg);
-       val &= ~(0x1 << c->u.periph.clk_num);
-       pmc_writel(val, c->reg);
-       spin_unlock_irqrestore(&clk_out_lock, flags);
-}
-
-static int tegra30_clk_out_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-       unsigned long flags;
-
-       spin_lock_irqsave(&clk_out_lock, flags);
-       val = pmc_readl(c->reg);
-       val &= ~periph_clk_source_mask(c);
-       val |= (index << periph_clk_source_shift(c));
-       pmc_writel(val, c->reg);
-       spin_unlock_irqrestore(&clk_out_lock, flags);
-
-       return 0;
-}
-
-static u8 tegra30_clk_out_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = pmc_readl(c->reg);
-       int source;
-
-       source = (val & periph_clk_source_mask(c)) >>
-                               periph_clk_source_shift(c);
-       return source;
-}
-
-struct clk_ops tegra_clk_out_ops = {
-       .is_enabled = tegra30_clk_out_is_enabled,
-       .enable = tegra30_clk_out_enable,
-       .disable = tegra30_clk_out_disable,
-       .set_parent = tegra30_clk_out_set_parent,
-       .get_parent = tegra30_clk_out_get_parent,
-       .recalc_rate = tegra30_clk_fixed_recalc_rate,
-};
-
-/* Clock doubler ops */
-static int tegra30_clk_double_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       c->state = ON;
-       if (!(clk_readl(PERIPH_CLK_TO_ENB_REG(c)) & PERIPH_CLK_TO_BIT(c)))
-               c->state = OFF;
-       return c->state;
-};
-
-static int tegra30_clk_double_set_rate(struct clk_hw *hw, unsigned long rate,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       if (rate == parent_rate) {
-               val = clk_readl(c->reg) | (0x1 << c->reg_shift);
-               clk_writel(val, c->reg);
-               c->mul = 1;
-               c->div = 1;
-               return 0;
-       } else if (rate == 2 * parent_rate) {
-               val = clk_readl(c->reg) & (~(0x1 << c->reg_shift));
-               clk_writel(val, c->reg);
-               c->mul = 2;
-               c->div = 1;
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static unsigned long tegra30_clk_double_recalc_rate(struct clk_hw *hw,
-               unsigned long parent_rate)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u64 rate = parent_rate;
-
-       u32 val = clk_readl(c->reg);
-       c->mul = val & (0x1 << c->reg_shift) ? 1 : 2;
-       c->div = 1;
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-static long tegra30_clk_double_round_rate(struct clk_hw *hw, unsigned long rate,
-                               unsigned long *prate)
-{
-       unsigned long output_rate = *prate;
-
-       do_div(output_rate, 2);
-       return output_rate;
-}
-
-struct clk_ops tegra30_clk_double_ops = {
-       .is_enabled = tegra30_clk_double_is_enabled,
-       .enable = tegra30_periph_clk_enable,
-       .disable = tegra30_periph_clk_disable,
-       .recalc_rate = tegra30_clk_double_recalc_rate,
-       .round_rate = tegra30_clk_double_round_rate,
-       .set_rate = tegra30_clk_double_set_rate,
-};
-
-/* Audio sync clock ops */
-struct clk_ops tegra_sync_source_ops = {
-       .recalc_rate = tegra30_clk_fixed_recalc_rate,
-};
-
-static int tegra30_audio_sync_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       c->state = (val & AUDIO_SYNC_DISABLE_BIT) ? OFF : ON;
-       return c->state;
-}
-
-static int tegra30_audio_sync_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       clk_writel((val & (~AUDIO_SYNC_DISABLE_BIT)), c->reg);
-       return 0;
-}
-
-static void tegra30_audio_sync_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       clk_writel((val | AUDIO_SYNC_DISABLE_BIT), c->reg);
-}
-
-static int tegra30_audio_sync_clk_set_parent(struct clk_hw *hw, u8 index)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val;
-
-       val = clk_readl(c->reg);
-       val &= ~AUDIO_SYNC_SOURCE_MASK;
-       val |= index;
-
-       clk_writel(val, c->reg);
-       return 0;
-}
-
-static u8 tegra30_audio_sync_clk_get_parent(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       int source;
-
-       source = val & AUDIO_SYNC_SOURCE_MASK;
-       return source;
-}
-
-struct clk_ops tegra30_audio_sync_clk_ops = {
-       .is_enabled = tegra30_audio_sync_clk_is_enabled,
-       .enable = tegra30_audio_sync_clk_enable,
-       .disable = tegra30_audio_sync_clk_disable,
-       .set_parent = tegra30_audio_sync_clk_set_parent,
-       .get_parent = tegra30_audio_sync_clk_get_parent,
-       .recalc_rate = tegra30_clk_fixed_recalc_rate,
-};
-
-/* cml0 (pcie), and cml1 (sata) clock ops */
-static int tegra30_cml_clk_is_enabled(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-       u32 val = clk_readl(c->reg);
-       c->state = val & (0x1 << c->u.periph.clk_num) ? ON : OFF;
-       return c->state;
-}
-
-static int tegra30_cml_clk_enable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       u32 val = clk_readl(c->reg);
-       val |= (0x1 << c->u.periph.clk_num);
-       clk_writel(val, c->reg);
-
-       return 0;
-}
-
-static void tegra30_cml_clk_disable(struct clk_hw *hw)
-{
-       struct clk_tegra *c = to_clk_tegra(hw);
-
-       u32 val = clk_readl(c->reg);
-       val &= ~(0x1 << c->u.periph.clk_num);
-       clk_writel(val, c->reg);
-}
-
-struct clk_ops tegra_cml_clk_ops = {
-       .is_enabled = tegra30_cml_clk_is_enabled,
-       .enable = tegra30_cml_clk_enable,
-       .disable = tegra30_cml_clk_disable,
-       .recalc_rate = tegra30_clk_fixed_recalc_rate,
-};
-
-struct clk_ops tegra_pciex_clk_ops = {
-       .recalc_rate = tegra30_clk_fixed_recalc_rate,
-};
-
-/* Tegra30 CPU clock and reset control functions */
-static void tegra30_wait_cpu_in_reset(u32 cpu)
-{
-       unsigned int reg;
-
-       do {
-               reg = readl(reg_clk_base +
-                           TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
-               cpu_relax();
-       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
-
-       return;
-}
-
-static void tegra30_put_cpu_in_reset(u32 cpu)
-{
-       writel(CPU_RESET(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
-       dmb();
-}
-
-static void tegra30_cpu_out_of_reset(u32 cpu)
-{
-       writel(CPU_RESET(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
-       wmb();
-}
-
-static void tegra30_enable_cpu_clock(u32 cpu)
-{
-       unsigned int reg;
-
-       writel(CPU_CLOCK(cpu),
-              reg_clk_base + TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
-       reg = readl(reg_clk_base +
-                   TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
-}
-
-static void tegra30_disable_cpu_clock(u32 cpu)
-{
-
-       unsigned int reg;
-
-       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-       writel(reg | CPU_CLOCK(cpu),
-              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-}
-
-#ifdef CONFIG_PM_SLEEP
-static bool tegra30_cpu_rail_off_ready(void)
-{
-       unsigned int cpu_rst_status;
-       int cpu_pwr_status;
-
-       cpu_rst_status = readl(reg_clk_base +
-                              TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
-       cpu_pwr_status = tegra_powergate_is_powered(TEGRA_POWERGATE_CPU1) ||
-                        tegra_powergate_is_powered(TEGRA_POWERGATE_CPU2) ||
-                        tegra_powergate_is_powered(TEGRA_POWERGATE_CPU3);
-
-       if (((cpu_rst_status & 0xE) != 0xE) || cpu_pwr_status)
-               return false;
-
-       return true;
-}
-
-static void tegra30_cpu_clock_suspend(void)
-{
-       /* switch coresite to clk_m, save off original source */
-       tegra30_cpu_clk_sctx.clk_csite_src =
-                               readl(reg_clk_base + CLK_RESET_SOURCE_CSITE);
-       writel(3<<30, reg_clk_base + CLK_RESET_SOURCE_CSITE);
-
-       tegra30_cpu_clk_sctx.cpu_burst =
-                               readl(reg_clk_base + CLK_RESET_CCLK_BURST);
-       tegra30_cpu_clk_sctx.pllx_base =
-                               readl(reg_clk_base + CLK_RESET_PLLX_BASE);
-       tegra30_cpu_clk_sctx.pllx_misc =
-                               readl(reg_clk_base + CLK_RESET_PLLX_MISC);
-       tegra30_cpu_clk_sctx.cclk_divider =
-                               readl(reg_clk_base + CLK_RESET_CCLK_DIVIDER);
-}
-
-static void tegra30_cpu_clock_resume(void)
-{
-       unsigned int reg, policy;
-
-       /* Is CPU complex already running on PLLX? */
-       reg = readl(reg_clk_base + CLK_RESET_CCLK_BURST);
-       policy = (reg >> CLK_RESET_CCLK_BURST_POLICY_SHIFT) & 0xF;
-
-       if (policy == CLK_RESET_CCLK_IDLE_POLICY)
-               reg = (reg >> CLK_RESET_CCLK_IDLE_POLICY_SHIFT) & 0xF;
-       else if (policy == CLK_RESET_CCLK_RUN_POLICY)
-               reg = (reg >> CLK_RESET_CCLK_RUN_POLICY_SHIFT) & 0xF;
-       else
-               BUG();
-
-       if (reg != CLK_RESET_CCLK_BURST_POLICY_PLLX) {
-               /* restore PLLX settings if CPU is on different PLL */
-               writel(tegra30_cpu_clk_sctx.pllx_misc,
-                                       reg_clk_base + CLK_RESET_PLLX_MISC);
-               writel(tegra30_cpu_clk_sctx.pllx_base,
-                                       reg_clk_base + CLK_RESET_PLLX_BASE);
-
-               /* wait for PLL stabilization if PLLX was enabled */
-               if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30))
-                       udelay(300);
-       }
-
-       /*
-        * Restore original burst policy setting for calls resulting from CPU
-        * LP2 in idle or system suspend.
-        */
-       writel(tegra30_cpu_clk_sctx.cclk_divider,
-                                       reg_clk_base + CLK_RESET_CCLK_DIVIDER);
-       writel(tegra30_cpu_clk_sctx.cpu_burst,
-                                       reg_clk_base + CLK_RESET_CCLK_BURST);
-
-       writel(tegra30_cpu_clk_sctx.clk_csite_src,
-                                       reg_clk_base + CLK_RESET_SOURCE_CSITE);
-}
-#endif
-
-static struct tegra_cpu_car_ops tegra30_cpu_car_ops = {
-       .wait_for_reset = tegra30_wait_cpu_in_reset,
-       .put_in_reset   = tegra30_put_cpu_in_reset,
-       .out_of_reset   = tegra30_cpu_out_of_reset,
-       .enable_clock   = tegra30_enable_cpu_clock,
-       .disable_clock  = tegra30_disable_cpu_clock,
-#ifdef CONFIG_PM_SLEEP
-       .rail_off_ready = tegra30_cpu_rail_off_ready,
-       .suspend        = tegra30_cpu_clock_suspend,
-       .resume         = tegra30_cpu_clock_resume,
-#endif
-};
-
-void __init tegra30_cpu_car_ops_init(void)
-{
-       tegra_cpu_car_ops = &tegra30_cpu_car_ops;
-}
diff --git a/arch/arm/mach-tegra/tegra30_clocks.h b/arch/arm/mach-tegra/tegra30_clocks.h
deleted file mode 100644 (file)
index 7a34adb..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __MACH_TEGRA30_CLOCK_H
-#define __MACH_TEGRA30_CLOCK_H
-
-extern struct clk_ops tegra30_clk_32k_ops;
-extern struct clk_ops tegra30_clk_m_ops;
-extern struct clk_ops tegra_clk_m_div_ops;
-extern struct clk_ops tegra_pll_ref_ops;
-extern struct clk_ops tegra30_pll_ops;
-extern struct clk_ops tegra30_pll_div_ops;
-extern struct clk_ops tegra_plld_ops;
-extern struct clk_ops tegra30_plle_ops;
-extern struct clk_ops tegra_cml_clk_ops;
-extern struct clk_ops tegra_pciex_clk_ops;
-extern struct clk_ops tegra_sync_source_ops;
-extern struct clk_ops tegra30_audio_sync_clk_ops;
-extern struct clk_ops tegra30_clk_double_ops;
-extern struct clk_ops tegra_clk_out_ops;
-extern struct clk_ops tegra30_super_ops;
-extern struct clk_ops tegra30_blink_clk_ops;
-extern struct clk_ops tegra30_twd_ops;
-extern struct clk_ops tegra30_bus_ops;
-extern struct clk_ops tegra30_periph_clk_ops;
-extern struct clk_ops tegra30_dsib_clk_ops;
-extern struct clk_ops tegra_nand_clk_ops;
-extern struct clk_ops tegra_vi_clk_ops;
-extern struct clk_ops tegra_dtv_clk_ops;
-extern struct clk_ops tegra_clk_shared_bus_ops;
-
-int tegra30_plld_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting);
-void tegra30_periph_clk_reset(struct clk_hw *hw, bool assert);
-int tegra30_vi_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting);
-int tegra30_nand_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting);
-int tegra30_dtv_clk_cfg_ex(struct clk_hw *hw,
-                               enum tegra_clk_ex_param p, u32 setting);
-#endif
diff --git a/arch/arm/mach-tegra/tegra30_clocks_data.c b/arch/arm/mach-tegra/tegra30_clocks_data.c
deleted file mode 100644 (file)
index 6942c7a..0000000
+++ /dev/null
@@ -1,1425 +0,0 @@
-/*
- * arch/arm/mach-tegra/tegra30_clocks.c
- *
- * Copyright (c) 2010-2012 NVIDIA CORPORATION.  All rights reserved.
- *
- * 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 of the License.
- *
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- */
-
-#include <linux/clk-private.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-#include <linux/cpufreq.h>
-
-#include "clock.h"
-#include "fuse.h"
-#include "tegra30_clocks.h"
-#include "tegra_cpu_car.h"
-
-#define DEFINE_CLK_TEGRA(_name, _rate, _ops, _flags,           \
-                  _parent_names, _parents, _parent)            \
-       static struct clk tegra_##_name = {                     \
-               .hw = &tegra_##_name##_hw.hw,                   \
-               .name = #_name,                                 \
-               .rate = _rate,                                  \
-               .ops = _ops,                                    \
-               .flags = _flags,                                \
-               .parent_names = _parent_names,                  \
-               .parents = _parents,                            \
-               .num_parents = ARRAY_SIZE(_parent_names),       \
-               .parent = _parent,                              \
-       };
-
-static struct clk tegra_clk_32k;
-static struct clk_tegra tegra_clk_32k_hw = {
-       .hw = {
-               .clk = &tegra_clk_32k,
-       },
-       .fixed_rate = 32768,
-};
-static struct clk tegra_clk_32k = {
-       .name = "clk_32k",
-       .hw = &tegra_clk_32k_hw.hw,
-       .ops = &tegra30_clk_32k_ops,
-       .flags = CLK_IS_ROOT,
-};
-
-static struct clk tegra_clk_m;
-static struct clk_tegra tegra_clk_m_hw = {
-       .hw = {
-               .clk = &tegra_clk_m,
-       },
-       .flags = ENABLE_ON_INIT,
-       .reg = 0x1fc,
-       .reg_shift = 28,
-       .max_rate = 48000000,
-};
-static struct clk tegra_clk_m = {
-       .name = "clk_m",
-       .hw = &tegra_clk_m_hw.hw,
-       .ops = &tegra30_clk_m_ops,
-       .flags = CLK_IS_ROOT | CLK_IGNORE_UNUSED,
-};
-
-static const char *clk_m_div_parent_names[] = {
-       "clk_m",
-};
-
-static struct clk *clk_m_div_parents[] = {
-       &tegra_clk_m,
-};
-
-static struct clk tegra_clk_m_div2;
-static struct clk_tegra tegra_clk_m_div2_hw = {
-       .hw = {
-               .clk = &tegra_clk_m_div2,
-       },
-       .mul = 1,
-       .div = 2,
-       .max_rate = 24000000,
-};
-DEFINE_CLK_TEGRA(clk_m_div2, 0, &tegra_clk_m_div_ops, 0,
-               clk_m_div_parent_names, clk_m_div_parents, &tegra_clk_m);
-
-static struct clk tegra_clk_m_div4;
-static struct clk_tegra tegra_clk_m_div4_hw = {
-       .hw = {
-               .clk = &tegra_clk_m_div4,
-       },
-       .mul = 1,
-       .div = 4,
-       .max_rate = 12000000,
-};
-DEFINE_CLK_TEGRA(clk_m_div4, 0, &tegra_clk_m_div_ops, 0,
-               clk_m_div_parent_names, clk_m_div_parents, &tegra_clk_m);
-
-static struct clk tegra_pll_ref;
-static struct clk_tegra tegra_pll_ref_hw = {
-       .hw = {
-               .clk = &tegra_pll_ref,
-       },
-       .flags = ENABLE_ON_INIT,
-       .max_rate = 26000000,
-};
-DEFINE_CLK_TEGRA(pll_ref, 0, &tegra_pll_ref_ops, 0, clk_m_div_parent_names,
-               clk_m_div_parents, &tegra_clk_m);
-
-#define DEFINE_PLL(_name, _flags, _reg, _max_rate, _input_min, \
-                  _input_max, _cf_min, _cf_max, _vco_min,      \
-                  _vco_max, _freq_table, _lock_delay, _ops,    \
-                  _fixed_rate, _clk_cfg_ex, _parent)           \
-       static struct clk tegra_##_name;                        \
-       static const char *_name##_parent_names[] = {           \
-               #_parent,                                       \
-       };                                                      \
-       static struct clk *_name##_parents[] = {                \
-               &tegra_##_parent,                               \
-       };                                                      \
-       static struct clk_tegra tegra_##_name##_hw = {          \
-               .hw = {                                         \
-                       .clk = &tegra_##_name,                  \
-               },                                              \
-               .flags = _flags,                                \
-               .reg = _reg,                                    \
-               .max_rate = _max_rate,                          \
-               .u.pll = {                                      \
-                       .input_min = _input_min,                \
-                       .input_max = _input_max,                \
-                       .cf_min = _cf_min,                      \
-                       .cf_max = _cf_max,                      \
-                       .vco_min = _vco_min,                    \
-                       .vco_max = _vco_max,                    \
-                       .freq_table = _freq_table,              \
-                       .lock_delay = _lock_delay,              \
-                       .fixed_rate = _fixed_rate,              \
-               },                                              \
-               .clk_cfg_ex = _clk_cfg_ex,                      \
-       };                                                      \
-       DEFINE_CLK_TEGRA(_name, 0, &_ops, CLK_IGNORE_UNUSED,    \
-                        _name##_parent_names, _name##_parents, \
-                       &tegra_##_parent);
-
-#define DEFINE_PLL_OUT(_name, _flags, _reg, _reg_shift,                \
-               _max_rate, _ops, _parent, _clk_flags)           \
-       static const char *_name##_parent_names[] = {           \
-               #_parent,                                       \
-       };                                                      \
-       static struct clk *_name##_parents[] = {                \
-               &tegra_##_parent,                               \
-       };                                                      \
-       static struct clk tegra_##_name;                        \
-       static struct clk_tegra tegra_##_name##_hw = {          \
-               .hw = {                                         \
-                       .clk = &tegra_##_name,                  \
-               },                                              \
-               .flags = _flags,                                \
-               .reg = _reg,                                    \
-               .max_rate = _max_rate,                          \
-               .reg_shift = _reg_shift,                        \
-       };                                                      \
-       DEFINE_CLK_TEGRA(_name, 0, &tegra30_pll_div_ops,        \
-               _clk_flags,  _name##_parent_names,              \
-               _name##_parents, &tegra_##_parent);
-
-static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
-       { 12000000, 1040000000, 520,  6, 1, 8},
-       { 13000000, 1040000000, 480,  6, 1, 8},
-       { 16800000, 1040000000, 495,  8, 1, 8}, /* actual: 1039.5 MHz */
-       { 19200000, 1040000000, 325,  6, 1, 6},
-       { 26000000, 1040000000, 520, 13, 1, 8},
-
-       { 12000000, 832000000, 416,  6, 1, 8},
-       { 13000000, 832000000, 832, 13, 1, 8},
-       { 16800000, 832000000, 396,  8, 1, 8},  /* actual: 831.6 MHz */
-       { 19200000, 832000000, 260,  6, 1, 8},
-       { 26000000, 832000000, 416, 13, 1, 8},
-
-       { 12000000, 624000000, 624, 12, 1, 8},
-       { 13000000, 624000000, 624, 13, 1, 8},
-       { 16800000, 600000000, 520, 14, 1, 8},
-       { 19200000, 624000000, 520, 16, 1, 8},
-       { 26000000, 624000000, 624, 26, 1, 8},
-
-       { 12000000, 600000000, 600, 12, 1, 8},
-       { 13000000, 600000000, 600, 13, 1, 8},
-       { 16800000, 600000000, 500, 14, 1, 8},
-       { 19200000, 600000000, 375, 12, 1, 6},
-       { 26000000, 600000000, 600, 26, 1, 8},
-
-       { 12000000, 520000000, 520, 12, 1, 8},
-       { 13000000, 520000000, 520, 13, 1, 8},
-       { 16800000, 520000000, 495, 16, 1, 8},  /* actual: 519.75 MHz */
-       { 19200000, 520000000, 325, 12, 1, 6},
-       { 26000000, 520000000, 520, 26, 1, 8},
-
-       { 12000000, 416000000, 416, 12, 1, 8},
-       { 13000000, 416000000, 416, 13, 1, 8},
-       { 16800000, 416000000, 396, 16, 1, 8},  /* actual: 415.8 MHz */
-       { 19200000, 416000000, 260, 12, 1, 6},
-       { 26000000, 416000000, 416, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_c, PLL_HAS_CPCON, 0x80, 1400000000, 2000000, 31000000, 1000000,
-               6000000, 20000000, 1400000000, tegra_pll_c_freq_table, 300,
-               tegra30_pll_ops, 0, NULL, pll_ref);
-
-DEFINE_PLL_OUT(pll_c_out1, DIV_U71, 0x84, 0, 700000000,
-               tegra30_pll_div_ops, pll_c, CLK_IGNORE_UNUSED);
-
-static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
-       { 12000000, 666000000, 666, 12, 1, 8},
-       { 13000000, 666000000, 666, 13, 1, 8},
-       { 16800000, 666000000, 555, 14, 1, 8},
-       { 19200000, 666000000, 555, 16, 1, 8},
-       { 26000000, 666000000, 666, 26, 1, 8},
-       { 12000000, 600000000, 600, 12, 1, 8},
-       { 13000000, 600000000, 600, 13, 1, 8},
-       { 16800000, 600000000, 500, 14, 1, 8},
-       { 19200000, 600000000, 375, 12, 1, 6},
-       { 26000000, 600000000, 600, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_m, PLL_HAS_CPCON | PLLM, 0x90, 800000000, 2000000, 31000000,
-               1000000, 6000000, 20000000, 1200000000, tegra_pll_m_freq_table,
-               300, tegra30_pll_ops, 0, NULL, pll_ref);
-
-DEFINE_PLL_OUT(pll_m_out1, DIV_U71, 0x94, 0, 600000000,
-               tegra30_pll_div_ops, pll_m, CLK_IGNORE_UNUSED);
-
-static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
-       { 12000000, 216000000, 432, 12, 2, 8},
-       { 13000000, 216000000, 432, 13, 2, 8},
-       { 16800000, 216000000, 360, 14, 2, 8},
-       { 19200000, 216000000, 360, 16, 2, 8},
-       { 26000000, 216000000, 432, 26, 2, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_p, ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON, 0xa0, 432000000,
-               2000000, 31000000, 1000000, 6000000, 20000000, 1400000000,
-               tegra_pll_p_freq_table, 300, tegra30_pll_ops, 408000000, NULL,
-               pll_ref);
-
-DEFINE_PLL_OUT(pll_p_out1, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4,
-               0, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
-DEFINE_PLL_OUT(pll_p_out2, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4,
-               16, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
-DEFINE_PLL_OUT(pll_p_out3, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8,
-               0, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
-DEFINE_PLL_OUT(pll_p_out4, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8,
-               16, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
-
-static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
-       { 9600000, 564480000, 294, 5, 1, 4},
-       { 9600000, 552960000, 288, 5, 1, 4},
-       { 9600000, 24000000,  5,   2, 1, 1},
-
-       { 28800000, 56448000, 49, 25, 1, 1},
-       { 28800000, 73728000, 64, 25, 1, 1},
-       { 28800000, 24000000,  5,  6, 1, 1},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_a, PLL_HAS_CPCON, 0xb0, 700000000, 2000000, 31000000, 1000000,
-               6000000, 20000000, 1400000000, tegra_pll_a_freq_table,
-               300, tegra30_pll_ops, 0, NULL, pll_p_out1);
-
-DEFINE_PLL_OUT(pll_a_out0, DIV_U71, 0xb4, 0, 100000000, tegra30_pll_div_ops,
-               pll_a, CLK_IGNORE_UNUSED);
-
-static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
-       { 12000000, 216000000, 216, 12, 1, 4},
-       { 13000000, 216000000, 216, 13, 1, 4},
-       { 16800000, 216000000, 180, 14, 1, 4},
-       { 19200000, 216000000, 180, 16, 1, 4},
-       { 26000000, 216000000, 216, 26, 1, 4},
-
-       { 12000000, 594000000, 594, 12, 1, 8},
-       { 13000000, 594000000, 594, 13, 1, 8},
-       { 16800000, 594000000, 495, 14, 1, 8},
-       { 19200000, 594000000, 495, 16, 1, 8},
-       { 26000000, 594000000, 594, 26, 1, 8},
-
-       { 12000000, 1000000000, 1000, 12, 1, 12},
-       { 13000000, 1000000000, 1000, 13, 1, 12},
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 12},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_d, PLL_HAS_CPCON | PLLD, 0xd0, 1000000000, 2000000, 40000000,
-               1000000, 6000000, 40000000, 1000000000, tegra_pll_d_freq_table,
-               1000, tegra30_pll_ops, 0, tegra30_plld_clk_cfg_ex, pll_ref);
-
-DEFINE_PLL_OUT(pll_d_out0, DIV_2 | PLLD, 0, 0, 500000000, tegra30_pll_div_ops,
-               pll_d, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED);
-
-DEFINE_PLL(pll_d2, PLL_HAS_CPCON | PLL_ALT_MISC_REG | PLLD, 0x4b8, 1000000000,
-               2000000, 40000000, 1000000, 6000000, 40000000, 1000000000,
-               tegra_pll_d_freq_table, 1000, tegra30_pll_ops, 0, NULL,
-               pll_ref);
-
-DEFINE_PLL_OUT(pll_d2_out0, DIV_2 | PLLD, 0, 0, 500000000, tegra30_pll_div_ops,
-               pll_d2, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED);
-
-static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
-       { 12000000, 480000000, 960, 12, 2, 12},
-       { 13000000, 480000000, 960, 13, 2, 12},
-       { 16800000, 480000000, 400, 7,  2, 5},
-       { 19200000, 480000000, 200, 4,  2, 3},
-       { 26000000, 480000000, 960, 26, 2, 12},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_u, PLL_HAS_CPCON | PLLU, 0xc0, 480000000, 2000000, 40000000,
-               1000000, 6000000, 48000000, 960000000, tegra_pll_u_freq_table,
-               1000, tegra30_pll_ops, 0, NULL, pll_ref);
-
-static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
-       /* 1.7 GHz */
-       { 12000000, 1700000000, 850,  6,  1, 8},
-       { 13000000, 1700000000, 915,  7,  1, 8},        /* actual: 1699.2 MHz */
-       { 16800000, 1700000000, 708,  7,  1, 8},        /* actual: 1699.2 MHz */
-       { 19200000, 1700000000, 885,  10, 1, 8},        /* actual: 1699.2 MHz */
-       { 26000000, 1700000000, 850,  13, 1, 8},
-
-       /* 1.6 GHz */
-       { 12000000, 1600000000, 800,  6,  1, 8},
-       { 13000000, 1600000000, 738,  6,  1, 8},        /* actual: 1599.0 MHz */
-       { 16800000, 1600000000, 857,  9,  1, 8},        /* actual: 1599.7 MHz */
-       { 19200000, 1600000000, 500,  6,  1, 8},
-       { 26000000, 1600000000, 800,  13, 1, 8},
-
-       /* 1.5 GHz */
-       { 12000000, 1500000000, 750,  6,  1, 8},
-       { 13000000, 1500000000, 923,  8,  1, 8},        /* actual: 1499.8 MHz */
-       { 16800000, 1500000000, 625,  7,  1, 8},
-       { 19200000, 1500000000, 625,  8,  1, 8},
-       { 26000000, 1500000000, 750,  13, 1, 8},
-
-       /* 1.4 GHz */
-       { 12000000, 1400000000, 700,  6,  1, 8},
-       { 13000000, 1400000000, 969,  9,  1, 8},        /* actual: 1399.7 MHz */
-       { 16800000, 1400000000, 1000, 12, 1, 8},
-       { 19200000, 1400000000, 875,  12, 1, 8},
-       { 26000000, 1400000000, 700,  13, 1, 8},
-
-       /* 1.3 GHz */
-       { 12000000, 1300000000, 975,  9,  1, 8},
-       { 13000000, 1300000000, 1000, 10, 1, 8},
-       { 16800000, 1300000000, 928,  12, 1, 8},        /* actual: 1299.2 MHz */
-       { 19200000, 1300000000, 812,  12, 1, 8},        /* actual: 1299.2 MHz */
-       { 26000000, 1300000000, 650,  13, 1, 8},
-
-       /* 1.2 GHz */
-       { 12000000, 1200000000, 1000, 10, 1, 8},
-       { 13000000, 1200000000, 923,  10, 1, 8},        /* actual: 1199.9 MHz */
-       { 16800000, 1200000000, 1000, 14, 1, 8},
-       { 19200000, 1200000000, 1000, 16, 1, 8},
-       { 26000000, 1200000000, 600,  13, 1, 8},
-
-       /* 1.1 GHz */
-       { 12000000, 1100000000, 825,  9,  1, 8},
-       { 13000000, 1100000000, 846,  10, 1, 8},        /* actual: 1099.8 MHz */
-       { 16800000, 1100000000, 982,  15, 1, 8},        /* actual: 1099.8 MHz */
-       { 19200000, 1100000000, 859,  15, 1, 8},        /* actual: 1099.5 MHz */
-       { 26000000, 1100000000, 550,  13, 1, 8},
-
-       /* 1 GHz */
-       { 12000000, 1000000000, 1000, 12, 1, 8},
-       { 13000000, 1000000000, 1000, 13, 1, 8},
-       { 16800000, 1000000000, 833,  14, 1, 8},        /* actual: 999.6 MHz */
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 8},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_x, PLL_HAS_CPCON | PLL_ALT_MISC_REG | PLLX, 0xe0, 1700000000,
-               2000000, 31000000, 1000000, 6000000, 20000000, 1700000000,
-               tegra_pll_x_freq_table, 300, tegra30_pll_ops, 0, NULL, pll_ref);
-
-DEFINE_PLL_OUT(pll_x_out0, DIV_2 | PLLX, 0, 0, 850000000, tegra30_pll_div_ops,
-               pll_x, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED);
-
-static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
-       /* PLLE special case: use cpcon field to store cml divider value */
-       { 12000000,  100000000, 150, 1,  18, 11},
-       { 216000000, 100000000, 200, 18, 24, 13},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-DEFINE_PLL(pll_e, PLL_ALT_MISC_REG, 0xe8, 100000000, 2000000, 216000000,
-               12000000, 12000000, 1200000000, 2400000000U,
-               tegra_pll_e_freq_table, 300, tegra30_plle_ops, 100000000, NULL,
-               pll_ref);
-
-static const char *mux_plle[] = {
-       "pll_e",
-};
-
-static struct clk *mux_plle_p[] = {
-       &tegra_pll_e,
-};
-
-static struct clk tegra_cml0;
-static struct clk_tegra tegra_cml0_hw = {
-       .hw = {
-               .clk = &tegra_cml0,
-       },
-       .reg = 0x48c,
-       .fixed_rate = 100000000,
-       .u.periph = {
-               .clk_num = 0,
-       },
-};
-DEFINE_CLK_TEGRA(cml0, 0, &tegra_cml_clk_ops, 0, mux_plle,
-               mux_plle_p, &tegra_pll_e);
-
-static struct clk tegra_cml1;
-static struct clk_tegra tegra_cml1_hw = {
-       .hw = {
-               .clk = &tegra_cml1,
-       },
-       .reg = 0x48c,
-       .fixed_rate = 100000000,
-       .u.periph = {
-               .clk_num = 1,
-       },
-};
-DEFINE_CLK_TEGRA(cml1, 0, &tegra_cml_clk_ops, 0, mux_plle,
-               mux_plle_p, &tegra_pll_e);
-
-static struct clk tegra_pciex;
-static struct clk_tegra tegra_pciex_hw = {
-       .hw = {
-               .clk = &tegra_pciex,
-       },
-       .reg = 0x48c,
-       .fixed_rate = 100000000,
-       .reset = tegra30_periph_clk_reset,
-       .u.periph = {
-               .clk_num = 74,
-       },
-};
-DEFINE_CLK_TEGRA(pciex, 0, &tegra_pciex_clk_ops, 0, mux_plle,
-               mux_plle_p, &tegra_pll_e);
-
-#define SYNC_SOURCE(_name)                                     \
-       static struct clk tegra_##_name##_sync;                 \
-       static struct clk_tegra tegra_##_name##_sync_hw = {     \
-               .hw = {                                         \
-                       .clk = &tegra_##_name##_sync,           \
-               },                                              \
-               .max_rate = 24000000,                           \
-               .fixed_rate = 24000000,                         \
-       };                                                      \
-       static struct clk tegra_##_name##_sync = {              \
-               .name = #_name "_sync",                         \
-               .hw = &tegra_##_name##_sync_hw.hw,              \
-               .ops = &tegra_sync_source_ops,                  \
-               .flags = CLK_IS_ROOT,                           \
-       };
-
-SYNC_SOURCE(spdif_in);
-SYNC_SOURCE(i2s0);
-SYNC_SOURCE(i2s1);
-SYNC_SOURCE(i2s2);
-SYNC_SOURCE(i2s3);
-SYNC_SOURCE(i2s4);
-SYNC_SOURCE(vimclk);
-
-static struct clk *tegra_sync_source_list[] = {
-       &tegra_spdif_in_sync,
-       &tegra_i2s0_sync,
-       &tegra_i2s1_sync,
-       &tegra_i2s2_sync,
-       &tegra_i2s3_sync,
-       &tegra_i2s4_sync,
-       &tegra_vimclk_sync,
-};
-
-static const char *mux_audio_sync_clk[] = {
-       "spdif_in_sync",
-       "i2s0_sync",
-       "i2s1_sync",
-       "i2s2_sync",
-       "i2s3_sync",
-       "i2s4_sync",
-       "vimclk_sync",
-};
-
-#define AUDIO_SYNC_CLK(_name, _index)                          \
-       static struct clk tegra_##_name;                        \
-       static struct clk_tegra tegra_##_name##_hw = {          \
-               .hw = {                                         \
-                       .clk = &tegra_##_name,                  \
-               },                                              \
-               .max_rate = 24000000,                           \
-               .reg = 0x4A0 + (_index) * 4,                    \
-       };                                                      \
-       static struct clk tegra_##_name = {                     \
-               .name = #_name,                                 \
-               .ops = &tegra30_audio_sync_clk_ops,             \
-               .hw = &tegra_##_name##_hw.hw,                   \
-               .parent_names = mux_audio_sync_clk,             \
-               .parents = tegra_sync_source_list,              \
-               .num_parents = ARRAY_SIZE(mux_audio_sync_clk),  \
-       };
-
-AUDIO_SYNC_CLK(audio0, 0);
-AUDIO_SYNC_CLK(audio1, 1);
-AUDIO_SYNC_CLK(audio2, 2);
-AUDIO_SYNC_CLK(audio3, 3);
-AUDIO_SYNC_CLK(audio4, 4);
-AUDIO_SYNC_CLK(audio5, 5);
-
-static struct clk *tegra_clk_audio_list[] = {
-       &tegra_audio0,
-       &tegra_audio1,
-       &tegra_audio2,
-       &tegra_audio3,
-       &tegra_audio4,
-       &tegra_audio5,  /* SPDIF */
-};
-
-#define AUDIO_SYNC_2X_CLK(_name, _index)                       \
-       static const char *_name##_parent_names[] = {           \
-               "tegra_" #_name,                                \
-       };                                                      \
-       static struct clk *_name##_parents[] = {                \
-               &tegra_##_name,                                 \
-       };                                                      \
-       static struct clk tegra_##_name##_2x;                   \
-       static struct clk_tegra tegra_##_name##_2x_hw = {       \
-               .hw = {                                         \
-                       .clk = &tegra_##_name##_2x,             \
-               },                                              \
-               .flags = PERIPH_NO_RESET,                       \
-               .max_rate = 48000000,                           \
-               .reg = 0x49C,                                   \
-               .reg_shift = 24 + (_index),                     \
-               .u.periph = {                                   \
-                       .clk_num = 113 + (_index),              \
-               },                                              \
-       };                                                      \
-       static struct clk tegra_##_name##_2x = {                \
-               .name = #_name "_2x",                           \
-               .ops = &tegra30_clk_double_ops,                 \
-               .hw = &tegra_##_name##_2x_hw.hw,                \
-               .parent_names = _name##_parent_names,           \
-               .parents = _name##_parents,                     \
-               .parent = &tegra_##_name,                       \
-               .num_parents = 1,                               \
-       };
-
-AUDIO_SYNC_2X_CLK(audio0, 0);
-AUDIO_SYNC_2X_CLK(audio1, 1);
-AUDIO_SYNC_2X_CLK(audio2, 2);
-AUDIO_SYNC_2X_CLK(audio3, 3);
-AUDIO_SYNC_2X_CLK(audio4, 4);
-AUDIO_SYNC_2X_CLK(audio5, 5);  /* SPDIF */
-
-static struct clk *tegra_clk_audio_2x_list[] = {
-       &tegra_audio0_2x,
-       &tegra_audio1_2x,
-       &tegra_audio2_2x,
-       &tegra_audio3_2x,
-       &tegra_audio4_2x,
-       &tegra_audio5_2x,       /* SPDIF */
-};
-
-#define MUX_I2S_SPDIF(_id)                                     \
-static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = {     \
-       "pll_a_out0",                                           \
-       #_id "_2x",                                             \
-       "pll_p",                                                \
-       "clk_m",                                                \
-};                                                             \
-static struct clk *mux_pllaout0_##_id##_2x_pllp_clkm_p[] = {   \
-       &tegra_pll_a_out0,                                      \
-       &tegra_##_id##_2x,                                      \
-       &tegra_pll_p,                                           \
-       &tegra_clk_m,                                           \
-};
-
-MUX_I2S_SPDIF(audio0);
-MUX_I2S_SPDIF(audio1);
-MUX_I2S_SPDIF(audio2);
-MUX_I2S_SPDIF(audio3);
-MUX_I2S_SPDIF(audio4);
-MUX_I2S_SPDIF(audio5);         /* SPDIF */
-
-static struct clk tegra_extern1;
-static struct clk tegra_extern2;
-static struct clk tegra_extern3;
-
-/* External clock outputs (through PMC) */
-#define MUX_EXTERN_OUT(_id)                                    \
-static const char *mux_clkm_clkm2_clkm4_extern##_id[] = {      \
-       "clk_m",                                                \
-       "clk_m_div2",                                           \
-       "clk_m_div4",                                           \
-       "extern" #_id,                                          \
-};                                                             \
-static struct clk *mux_clkm_clkm2_clkm4_extern##_id##_p[] = {  \
-       &tegra_clk_m,                                           \
-       &tegra_clk_m_div2,                                      \
-       &tegra_clk_m_div4,                                      \
-       &tegra_extern##_id,                                     \
-};
-
-MUX_EXTERN_OUT(1);
-MUX_EXTERN_OUT(2);
-MUX_EXTERN_OUT(3);
-
-#define CLK_OUT_CLK(_name, _index)                                     \
-       static struct clk tegra_##_name;                                \
-       static struct clk_tegra tegra_##_name##_hw = {                  \
-               .hw = {                                                 \
-                       .clk = &tegra_##_name,                          \
-               },                                                      \
-               .lookup = {                                             \
-                       .dev_id = #_name,                               \
-                       .con_id = "extern" #_index,                     \
-               },                                                      \
-               .flags = MUX_CLK_OUT,                                   \
-               .fixed_rate = 216000000,                                        \
-               .reg = 0x1a8,                                           \
-               .u.periph = {                                           \
-                       .clk_num = (_index - 1) * 8 + 2,                \
-               },                                                      \
-       };                                                              \
-       static struct clk tegra_##_name = {                             \
-               .name = #_name,                                         \
-               .ops = &tegra_clk_out_ops,                              \
-               .hw = &tegra_##_name##_hw.hw,                           \
-               .parent_names = mux_clkm_clkm2_clkm4_extern##_index,    \
-               .parents = mux_clkm_clkm2_clkm4_extern##_index##_p,     \
-               .num_parents = ARRAY_SIZE(mux_clkm_clkm2_clkm4_extern##_index),\
-       };
-
-CLK_OUT_CLK(clk_out_1, 1);
-CLK_OUT_CLK(clk_out_2, 2);
-CLK_OUT_CLK(clk_out_3, 3);
-
-static struct clk *tegra_clk_out_list[] = {
-       &tegra_clk_out_1,
-       &tegra_clk_out_2,
-       &tegra_clk_out_3,
-};
-
-static const char *mux_sclk[] = {
-       "clk_m",
-       "pll_c_out1",
-       "pll_p_out4",
-       "pll_p_out3",
-       "pll_p_out2",
-       "dummy",
-       "clk_32k",
-       "pll_m_out1",
-};
-
-static struct clk *mux_sclk_p[] = {
-       &tegra_clk_m,
-       &tegra_pll_c_out1,
-       &tegra_pll_p_out4,
-       &tegra_pll_p_out3,
-       &tegra_pll_p_out2,
-       NULL,
-       &tegra_clk_32k,
-       &tegra_pll_m_out1,
-};
-
-static struct clk tegra_clk_sclk;
-static struct clk_tegra tegra_clk_sclk_hw = {
-       .hw = {
-               .clk = &tegra_clk_sclk,
-       },
-       .reg = 0x28,
-       .max_rate = 334000000,
-       .min_rate = 40000000,
-};
-
-static struct clk tegra_clk_sclk = {
-       .name = "sclk",
-       .ops = &tegra30_super_ops,
-       .hw = &tegra_clk_sclk_hw.hw,
-       .parent_names = mux_sclk,
-       .parents = mux_sclk_p,
-       .num_parents = ARRAY_SIZE(mux_sclk),
-};
-
-static const char *tegra_hclk_parent_names[] = {
-       "tegra_sclk",
-};
-
-static struct clk *tegra_hclk_parents[] = {
-       &tegra_clk_sclk,
-};
-
-static struct clk tegra_hclk;
-static struct clk_tegra tegra_hclk_hw = {
-       .hw = {
-               .clk = &tegra_hclk,
-       },
-       .flags = DIV_BUS,
-       .reg = 0x30,
-       .reg_shift = 4,
-       .max_rate = 378000000,
-       .min_rate = 12000000,
-};
-DEFINE_CLK_TEGRA(hclk, 0, &tegra30_bus_ops, 0, tegra_hclk_parent_names,
-               tegra_hclk_parents, &tegra_clk_sclk);
-
-static const char *tegra_pclk_parent_names[] = {
-       "tegra_hclk",
-};
-
-static struct clk *tegra_pclk_parents[] = {
-       &tegra_hclk,
-};
-
-static struct clk tegra_pclk;
-static struct clk_tegra tegra_pclk_hw = {
-       .hw = {
-               .clk = &tegra_pclk,
-       },
-       .flags = DIV_BUS,
-       .reg = 0x30,
-       .reg_shift = 0,
-       .max_rate = 167000000,
-       .min_rate = 12000000,
-};
-DEFINE_CLK_TEGRA(pclk, 0, &tegra30_bus_ops, 0, tegra_pclk_parent_names,
-               tegra_pclk_parents, &tegra_hclk);
-
-static const char *mux_blink[] = {
-       "clk_32k",
-};
-
-static struct clk *mux_blink_p[] = {
-       &tegra_clk_32k,
-};
-
-static struct clk tegra_clk_blink;
-static struct clk_tegra tegra_clk_blink_hw = {
-       .hw = {
-               .clk = &tegra_clk_blink,
-       },
-       .reg = 0x40,
-       .max_rate = 32768,
-};
-static struct clk tegra_clk_blink = {
-       .name = "blink",
-       .ops = &tegra30_blink_clk_ops,
-       .hw = &tegra_clk_blink_hw.hw,
-       .parent = &tegra_clk_32k,
-       .parent_names = mux_blink,
-       .parents = mux_blink_p,
-       .num_parents = ARRAY_SIZE(mux_blink),
-};
-
-static const char *mux_pllm_pllc_pllp_plla[] = {
-       "pll_m",
-       "pll_c",
-       "pll_p",
-       "pll_a_out0",
-};
-
-static const char *mux_pllp_pllc_pllm_clkm[] = {
-       "pll_p",
-       "pll_c",
-       "pll_m",
-       "clk_m",
-};
-
-static const char *mux_pllp_clkm[] = {
-       "pll_p",
-       "dummy",
-       "dummy",
-       "clk_m",
-};
-
-static const char *mux_pllp_plld_pllc_clkm[] = {
-       "pll_p",
-       "pll_d_out0",
-       "pll_c",
-       "clk_m",
-};
-
-static const char *mux_pllp_pllm_plld_plla_pllc_plld2_clkm[] = {
-       "pll_p",
-       "pll_m",
-       "pll_d_out0",
-       "pll_a_out0",
-       "pll_c",
-       "pll_d2_out0",
-       "clk_m",
-};
-
-static const char *mux_plla_pllc_pllp_clkm[] = {
-       "pll_a_out0",
-       "dummy",
-       "pll_p",
-       "clk_m"
-};
-
-static const char *mux_pllp_pllc_clk32_clkm[] = {
-       "pll_p",
-       "pll_c",
-       "clk_32k",
-       "clk_m",
-};
-
-static const char *mux_pllp_pllc_clkm_clk32[] = {
-       "pll_p",
-       "pll_c",
-       "clk_m",
-       "clk_32k",
-};
-
-static const char *mux_pllp_pllc_pllm[] = {
-       "pll_p",
-       "pll_c",
-       "pll_m",
-};
-
-static const char *mux_clk_m[] = {
-       "clk_m",
-};
-
-static const char *mux_pllp_out3[] = {
-       "pll_p_out3",
-};
-
-static const char *mux_plld_out0[] = {
-       "pll_d_out0",
-};
-
-static const char *mux_plld_out0_plld2_out0[] = {
-       "pll_d_out0",
-       "pll_d2_out0",
-};
-
-static const char *mux_clk_32k[] = {
-       "clk_32k",
-};
-
-static const char *mux_plla_clk32_pllp_clkm_plle[] = {
-       "pll_a_out0",
-       "clk_32k",
-       "pll_p",
-       "clk_m",
-       "pll_e",
-};
-
-static const char *mux_cclk_g[] = {
-       "clk_m",
-       "pll_c",
-       "clk_32k",
-       "pll_m",
-       "pll_p",
-       "pll_p_out4",
-       "pll_p_out3",
-       "dummy",
-       "pll_x",
-};
-
-static struct clk *mux_pllm_pllc_pllp_plla_p[] = {
-       &tegra_pll_m,
-       &tegra_pll_c,
-       &tegra_pll_p,
-       &tegra_pll_a_out0,
-};
-
-static struct clk *mux_pllp_pllc_pllm_clkm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_pll_m,
-       &tegra_clk_m,
-};
-
-static struct clk *mux_pllp_clkm_p[] = {
-       &tegra_pll_p,
-       NULL,
-       NULL,
-       &tegra_clk_m,
-};
-
-static struct clk *mux_pllp_plld_pllc_clkm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_d_out0,
-       &tegra_pll_c,
-       &tegra_clk_m,
-};
-
-static struct clk *mux_pllp_pllm_plld_plla_pllc_plld2_clkm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_m,
-       &tegra_pll_d_out0,
-       &tegra_pll_a_out0,
-       &tegra_pll_c,
-       &tegra_pll_d2_out0,
-       &tegra_clk_m,
-};
-
-static struct clk *mux_plla_pllc_pllp_clkm_p[] = {
-       &tegra_pll_a_out0,
-       NULL,
-       &tegra_pll_p,
-       &tegra_clk_m,
-};
-
-static struct clk *mux_pllp_pllc_clk32_clkm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_clk_32k,
-       &tegra_clk_m,
-};
-
-static struct clk *mux_pllp_pllc_clkm_clk32_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_clk_m,
-       &tegra_clk_32k,
-};
-
-static struct clk *mux_pllp_pllc_pllm_p[] = {
-       &tegra_pll_p,
-       &tegra_pll_c,
-       &tegra_pll_m,
-};
-
-static struct clk *mux_clk_m_p[] = {
-       &tegra_clk_m,
-};
-
-static struct clk *mux_pllp_out3_p[] = {
-       &tegra_pll_p_out3,
-};
-
-static struct clk *mux_plld_out0_p[] = {
-       &tegra_pll_d_out0,
-};
-
-static struct clk *mux_plld_out0_plld2_out0_p[] = {
-       &tegra_pll_d_out0,
-       &tegra_pll_d2_out0,
-};
-
-static struct clk *mux_clk_32k_p[] = {
-       &tegra_clk_32k,
-};
-
-static struct clk *mux_plla_clk32_pllp_clkm_plle_p[] = {
-       &tegra_pll_a_out0,
-       &tegra_clk_32k,
-       &tegra_pll_p,
-       &tegra_clk_m,
-       &tegra_pll_e,
-};
-
-static struct clk *mux_cclk_g_p[] = {
-       &tegra_clk_m,
-       &tegra_pll_c,
-       &tegra_clk_32k,
-       &tegra_pll_m,
-       &tegra_pll_p,
-       &tegra_pll_p_out4,
-       &tegra_pll_p_out3,
-       NULL,
-       &tegra_pll_x,
-};
-
-static struct clk tegra_clk_cclk_g;
-static struct clk_tegra tegra_clk_cclk_g_hw = {
-       .hw = {
-               .clk = &tegra_clk_cclk_g,
-       },
-       .flags = DIV_U71 | DIV_U71_INT,
-       .reg = 0x368,
-       .max_rate = 1700000000,
-};
-static struct clk tegra_clk_cclk_g = {
-       .name = "cclk_g",
-       .ops = &tegra30_super_ops,
-       .hw = &tegra_clk_cclk_g_hw.hw,
-       .parent_names = mux_cclk_g,
-       .parents = mux_cclk_g_p,
-       .num_parents = ARRAY_SIZE(mux_cclk_g),
-};
-
-static const char *mux_twd[] = {
-       "cclk_g",
-};
-
-static struct clk *mux_twd_p[] = {
-       &tegra_clk_cclk_g,
-};
-
-static struct clk tegra30_clk_twd;
-static struct clk_tegra tegra30_clk_twd_hw = {
-       .hw = {
-               .clk = &tegra30_clk_twd,
-       },
-       .max_rate = 1400000000,
-       .mul = 1,
-       .div = 2,
-};
-
-static struct clk tegra30_clk_twd = {
-       .name = "twd",
-       .ops = &tegra30_twd_ops,
-       .hw = &tegra30_clk_twd_hw.hw,
-       .parent = &tegra_clk_cclk_g,
-       .parent_names = mux_twd,
-       .parents = mux_twd_p,
-       .num_parents = ARRAY_SIZE(mux_twd),
-};
-
-#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg,  \
-               _max, _inputs, _flags)                  \
-       static struct clk tegra_##_name;                \
-       static struct clk_tegra tegra_##_name##_hw = {  \
-               .hw = {                                 \
-                       .clk = &tegra_##_name,          \
-               },                                      \
-               .lookup = {                             \
-                       .dev_id = _dev,                 \
-                       .con_id = _con,                 \
-               },                                      \
-               .reg = _reg,                            \
-               .flags = _flags,                        \
-               .max_rate = _max,                       \
-               .u.periph = {                           \
-                       .clk_num = _clk_num,            \
-               },                                      \
-               .reset = &tegra30_periph_clk_reset,     \
-       };                                              \
-       static struct clk tegra_##_name = {             \
-               .name = #_name,                         \
-               .ops = &tegra30_periph_clk_ops,         \
-               .hw = &tegra_##_name##_hw.hw,           \
-               .parent_names = _inputs,                \
-               .parents = _inputs##_p,                 \
-               .num_parents = ARRAY_SIZE(_inputs),     \
-       };
-
-PERIPH_CLK(apbdma,     "tegra-apbdma",         NULL,   34,     0,      26000000,  mux_clk_m,                   0);
-PERIPH_CLK(rtc,                "rtc-tegra",            NULL,   4,      0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET | PERIPH_ON_APB);
-PERIPH_CLK(kbc,                "tegra-kbc",            NULL,   36,     0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET | PERIPH_ON_APB);
-PERIPH_CLK(timer,      "timer",                NULL,   5,      0,      26000000,  mux_clk_m,                   0);
-PERIPH_CLK(kfuse,      "kfuse-tegra",          NULL,   40,     0,      26000000,  mux_clk_m,                   0);
-PERIPH_CLK(fuse,       "fuse-tegra",           "fuse", 39,     0,      26000000,  mux_clk_m,                   PERIPH_ON_APB);
-PERIPH_CLK(fuse_burn,  "fuse-tegra",           "fuse_burn",    39,     0,      26000000,  mux_clk_m,           PERIPH_ON_APB);
-PERIPH_CLK(apbif,      "tegra30-ahub",         "apbif", 107,   0,      26000000,  mux_clk_m,                   0);
-PERIPH_CLK(i2s0,       "tegra30-i2s.0",        NULL,   30,     0x1d8,  26000000,  mux_pllaout0_audio0_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(i2s1,       "tegra30-i2s.1",        NULL,   11,     0x100,  26000000,  mux_pllaout0_audio1_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(i2s2,       "tegra30-i2s.2",        NULL,   18,     0x104,  26000000,  mux_pllaout0_audio2_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(i2s3,       "tegra30-i2s.3",        NULL,   101,    0x3bc,  26000000,  mux_pllaout0_audio3_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(i2s4,       "tegra30-i2s.4",        NULL,   102,    0x3c0,  26000000,  mux_pllaout0_audio4_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(spdif_out,  "tegra30-spdif",        "spdif_out",    10,     0x108,  100000000, mux_pllaout0_audio5_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(spdif_in,   "tegra30-spdif",        "spdif_in",     10,     0x10c,  100000000, mux_pllp_pllc_pllm,          MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(pwm,                "tegra-pwm",            NULL,   17,     0x110,  432000000, mux_pllp_pllc_clk32_clkm,    MUX | MUX_PWM | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(d_audio,    "tegra30-ahub",         "d_audio", 106, 0x3d0,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
-PERIPH_CLK(dam0,       "tegra30-dam.0",        NULL,   108,    0x3d8,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
-PERIPH_CLK(dam1,       "tegra30-dam.1",        NULL,   109,    0x3dc,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
-PERIPH_CLK(dam2,       "tegra30-dam.2",        NULL,   110,    0x3e0,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
-PERIPH_CLK(hda,                "tegra30-hda",          "hda",  125,    0x428,  108000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(hda2codec_2x,       "tegra30-hda",  "hda2codec",    111,    0x3e4,  48000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(hda2hdmi,   "tegra30-hda",          "hda2hdmi",     128,    0,      48000000,  mux_clk_m,                   0);
-PERIPH_CLK(sbc1,       "spi_tegra.0",          NULL,   41,     0x134,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sbc2,       "spi_tegra.1",          NULL,   44,     0x118,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sbc3,       "spi_tegra.2",          NULL,   46,     0x11c,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sbc4,       "spi_tegra.3",          NULL,   68,     0x1b4,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sbc5,       "spi_tegra.4",          NULL,   104,    0x3c8,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sbc6,       "spi_tegra.5",          NULL,   105,    0x3cc,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sata_oob,   "tegra_sata_oob",       NULL,   123,    0x420,  216000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sata,       "tegra_sata",           NULL,   124,    0x424,  216000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(sata_cold,  "tegra_sata_cold",      NULL,   129,    0,      48000000,  mux_clk_m,                   0);
-PERIPH_CLK(ndflash,    "tegra_nand",           NULL,   13,     0x160,  240000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(ndspeed,    "tegra_nand_speed",     NULL,   80,     0x3f8,  240000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(vfir,       "vfir",                 NULL,   7,      0x168,  72000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(sdmmc1,     "sdhci-tegra.0",        NULL,   14,     0x150,  208000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(sdmmc2,     "sdhci-tegra.1",        NULL,   9,      0x154,  104000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(sdmmc3,     "sdhci-tegra.2",        NULL,   69,     0x1bc,  208000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(sdmmc4,     "sdhci-tegra.3",        NULL,   15,     0x164,  104000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
-PERIPH_CLK(vcp,                "tegra-avp",            "vcp",  29,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(bsea,       "tegra-avp",            "bsea", 62,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(bsev,       "tegra-aes",            "bsev", 63,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(vde,                "vde",                  NULL,   61,     0x1c8,  520000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_INT);
-PERIPH_CLK(csite,      "csite",                NULL,   73,     0x1d4,  144000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* max rate ??? */
-PERIPH_CLK(la,         "la",                   NULL,   76,     0x1f8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
-PERIPH_CLK(owr,                "tegra_w1",             NULL,   71,     0x1cc,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(nor,                "nor",                  NULL,   42,     0x1d0,  127000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(mipi,       "mipi",                 NULL,   50,     0x174,  60000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB); /* scales with voltage */
-PERIPH_CLK(i2c1,       "tegra-i2c.0",          "div-clk", 12,  0x124,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
-PERIPH_CLK(i2c2,       "tegra-i2c.1",          "div-clk", 54,  0x198,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
-PERIPH_CLK(i2c3,       "tegra-i2c.2",          "div-clk", 67,  0x1b8,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
-PERIPH_CLK(i2c4,       "tegra-i2c.3",          "div-clk", 103, 0x3c4,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
-PERIPH_CLK(i2c5,       "tegra-i2c.4",          "div-clk", 47,  0x128,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
-PERIPH_CLK(uarta,      "tegra-uart.0",         NULL,   6,      0x178,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
-PERIPH_CLK(uartb,      "tegra-uart.1",         NULL,   7,      0x17c,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
-PERIPH_CLK(uartc,      "tegra-uart.2",         NULL,   55,     0x1a0,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
-PERIPH_CLK(uartd,      "tegra-uart.3",         NULL,   65,     0x1c0,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
-PERIPH_CLK(uarte,      "tegra-uart.4",         NULL,   66,     0x1c4,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
-PERIPH_CLK(vi,         "tegra_camera",         "vi",   20,     0x148,  425000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
-PERIPH_CLK(3d,         "3d",                   NULL,   24,     0x158,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET);
-PERIPH_CLK(3d2,                "3d2",                  NULL,   98,     0x3b0,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET);
-PERIPH_CLK(2d,         "2d",                   NULL,   21,     0x15c,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE);
-PERIPH_CLK(vi_sensor,  "tegra_camera",         "vi_sensor",    20,     0x1a8,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_NO_RESET);
-PERIPH_CLK(epp,                "epp",                  NULL,   19,     0x16c,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
-PERIPH_CLK(mpe,                "mpe",                  NULL,   60,     0x170,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
-PERIPH_CLK(host1x,     "host1x",               NULL,   28,     0x180,  260000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
-PERIPH_CLK(cve,                "cve",                  NULL,   49,     0x140,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(tvo,                "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(dtv,                "dtv",                  NULL,   79,     0x1dc,  250000000, mux_clk_m,                   0);
-PERIPH_CLK(hdmi,       "hdmi",                 NULL,   51,     0x18c,  148500000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8 | DIV_U71);
-PERIPH_CLK(tvdac,      "tvdac",                NULL,   53,     0x194,  220000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
-PERIPH_CLK(disp1,      "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8);
-PERIPH_CLK(disp2,      "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8);
-PERIPH_CLK(usbd,       "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
-PERIPH_CLK(usb2,       "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
-PERIPH_CLK(usb3,       "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
-PERIPH_CLK(dsia,       "tegradc.0",            "dsia", 48,     0,      500000000, mux_plld_out0,               0);
-PERIPH_CLK(csi,                "tegra_camera",         "csi",  52,     0,      102000000, mux_pllp_out3,               0);
-PERIPH_CLK(isp,                "tegra_camera",         "isp",  23,     0,      150000000, mux_clk_m,                   0); /* same frequency as VI */
-PERIPH_CLK(csus,       "tegra_camera",         "csus", 92,     0,      150000000, mux_clk_m,                   PERIPH_NO_RESET);
-PERIPH_CLK(tsensor,    "tegra-tsensor",        NULL,   100,    0x3b8,  216000000, mux_pllp_pllc_clkm_clk32,    MUX | DIV_U71);
-PERIPH_CLK(actmon,     "actmon",               NULL,   119,    0x3e8,  216000000, mux_pllp_pllc_clk32_clkm,    MUX | DIV_U71);
-PERIPH_CLK(extern1,    "extern1",              NULL,   120,    0x3ec,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71);
-PERIPH_CLK(extern2,    "extern2",              NULL,   121,    0x3f0,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71);
-PERIPH_CLK(extern3,    "extern3",              NULL,   122,    0x3f4,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71);
-PERIPH_CLK(i2cslow,    "i2cslow",              NULL,   81,     0x3fc,  26000000,  mux_pllp_pllc_clk32_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
-PERIPH_CLK(pcie,       "tegra-pcie",           "pcie", 70,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(afi,                "tegra-pcie",           "afi",  72,     0,      250000000, mux_clk_m,                   0);
-PERIPH_CLK(se,         "se",                   NULL,   127,    0x42c,  520000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_INT);
-
-static struct clk tegra_dsib;
-static struct clk_tegra tegra_dsib_hw = {
-       .hw = {
-               .clk = &tegra_dsib,
-       },
-       .lookup = {
-               .dev_id = "tegradc.1",
-               .con_id = "dsib",
-       },
-       .reg = 0xd0,
-       .flags = MUX | PLLD,
-       .max_rate = 500000000,
-       .u.periph = {
-               .clk_num = 82,
-       },
-       .reset = &tegra30_periph_clk_reset,
-};
-static struct clk tegra_dsib = {
-       .name = "dsib",
-       .ops = &tegra30_dsib_clk_ops,
-       .hw = &tegra_dsib_hw.hw,
-       .parent_names = mux_plld_out0_plld2_out0,
-       .parents = mux_plld_out0_plld2_out0_p,
-       .num_parents = ARRAY_SIZE(mux_plld_out0_plld2_out0),
-};
-
-struct clk *tegra_list_clks[] = {
-       &tegra_apbdma,
-       &tegra_rtc,
-       &tegra_kbc,
-       &tegra_timer,
-       &tegra_kfuse,
-       &tegra_fuse,
-       &tegra_fuse_burn,
-       &tegra_apbif,
-       &tegra_i2s0,
-       &tegra_i2s1,
-       &tegra_i2s2,
-       &tegra_i2s3,
-       &tegra_i2s4,
-       &tegra_spdif_out,
-       &tegra_spdif_in,
-       &tegra_pwm,
-       &tegra_d_audio,
-       &tegra_dam0,
-       &tegra_dam1,
-       &tegra_dam2,
-       &tegra_hda,
-       &tegra_hda2codec_2x,
-       &tegra_hda2hdmi,
-       &tegra_sbc1,
-       &tegra_sbc2,
-       &tegra_sbc3,
-       &tegra_sbc4,
-       &tegra_sbc5,
-       &tegra_sbc6,
-       &tegra_sata_oob,
-       &tegra_sata,
-       &tegra_sata_cold,
-       &tegra_ndflash,
-       &tegra_ndspeed,
-       &tegra_vfir,
-       &tegra_sdmmc1,
-       &tegra_sdmmc2,
-       &tegra_sdmmc3,
-       &tegra_sdmmc4,
-       &tegra_vcp,
-       &tegra_bsea,
-       &tegra_bsev,
-       &tegra_vde,
-       &tegra_csite,
-       &tegra_la,
-       &tegra_owr,
-       &tegra_nor,
-       &tegra_mipi,
-       &tegra_i2c1,
-       &tegra_i2c2,
-       &tegra_i2c3,
-       &tegra_i2c4,
-       &tegra_i2c5,
-       &tegra_uarta,
-       &tegra_uartb,
-       &tegra_uartc,
-       &tegra_uartd,
-       &tegra_uarte,
-       &tegra_vi,
-       &tegra_3d,
-       &tegra_3d2,
-       &tegra_2d,
-       &tegra_vi_sensor,
-       &tegra_epp,
-       &tegra_mpe,
-       &tegra_host1x,
-       &tegra_cve,
-       &tegra_tvo,
-       &tegra_dtv,
-       &tegra_hdmi,
-       &tegra_tvdac,
-       &tegra_disp1,
-       &tegra_disp2,
-       &tegra_usbd,
-       &tegra_usb2,
-       &tegra_usb3,
-       &tegra_dsia,
-       &tegra_dsib,
-       &tegra_csi,
-       &tegra_isp,
-       &tegra_csus,
-       &tegra_tsensor,
-       &tegra_actmon,
-       &tegra_extern1,
-       &tegra_extern2,
-       &tegra_extern3,
-       &tegra_i2cslow,
-       &tegra_pcie,
-       &tegra_afi,
-       &tegra_se,
-};
-
-#define CLK_DUPLICATE(_name, _dev, _con)       \
-       {                                       \
-               .name   = _name,                \
-               .lookup = {                     \
-                       .dev_id = _dev,         \
-                       .con_id = _con,         \
-               },                              \
-       }
-
-/* Some clocks may be used by different drivers depending on the board
- * configuration.  List those here to register them twice in the clock lookup
- * table under two names.
- */
-struct clk_duplicate tegra_clk_duplicates[] = {
-       CLK_DUPLICATE("uarta",  "serial8250.0", NULL),
-       CLK_DUPLICATE("uartb",  "serial8250.1", NULL),
-       CLK_DUPLICATE("uartc",  "serial8250.2", NULL),
-       CLK_DUPLICATE("uartd",  "serial8250.3", NULL),
-       CLK_DUPLICATE("uarte",  "serial8250.4", NULL),
-       CLK_DUPLICATE("usbd", "utmip-pad", NULL),
-       CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),
-       CLK_DUPLICATE("usbd", "tegra-otg", NULL),
-       CLK_DUPLICATE("dsib", "tegradc.0", "dsib"),
-       CLK_DUPLICATE("dsia", "tegradc.1", "dsia"),
-       CLK_DUPLICATE("bsev", "tegra-avp", "bsev"),
-       CLK_DUPLICATE("bsev", "nvavp", "bsev"),
-       CLK_DUPLICATE("vde", "tegra-aes", "vde"),
-       CLK_DUPLICATE("bsea", "tegra-aes", "bsea"),
-       CLK_DUPLICATE("bsea", "nvavp", "bsea"),
-       CLK_DUPLICATE("cml1", "tegra_sata_cml", NULL),
-       CLK_DUPLICATE("cml0", "tegra_pcie", "cml"),
-       CLK_DUPLICATE("pciex", "tegra_pcie", "pciex"),
-       CLK_DUPLICATE("i2c1", "tegra-i2c-slave.0", NULL),
-       CLK_DUPLICATE("i2c2", "tegra-i2c-slave.1", NULL),
-       CLK_DUPLICATE("i2c3", "tegra-i2c-slave.2", NULL),
-       CLK_DUPLICATE("i2c4", "tegra-i2c-slave.3", NULL),
-       CLK_DUPLICATE("i2c5", "tegra-i2c-slave.4", NULL),
-       CLK_DUPLICATE("sbc1", "spi_slave_tegra.0", NULL),
-       CLK_DUPLICATE("sbc2", "spi_slave_tegra.1", NULL),
-       CLK_DUPLICATE("sbc3", "spi_slave_tegra.2", NULL),
-       CLK_DUPLICATE("sbc4", "spi_slave_tegra.3", NULL),
-       CLK_DUPLICATE("sbc5", "spi_slave_tegra.4", NULL),
-       CLK_DUPLICATE("sbc6", "spi_slave_tegra.5", NULL),
-       CLK_DUPLICATE("twd", "smp_twd", NULL),
-       CLK_DUPLICATE("vcp", "nvavp", "vcp"),
-       CLK_DUPLICATE("i2s0", NULL, "i2s0"),
-       CLK_DUPLICATE("i2s1", NULL, "i2s1"),
-       CLK_DUPLICATE("i2s2", NULL, "i2s2"),
-       CLK_DUPLICATE("i2s3", NULL, "i2s3"),
-       CLK_DUPLICATE("i2s4", NULL, "i2s4"),
-       CLK_DUPLICATE("dam0", NULL, "dam0"),
-       CLK_DUPLICATE("dam1", NULL, "dam1"),
-       CLK_DUPLICATE("dam2", NULL, "dam2"),
-       CLK_DUPLICATE("spdif_in", NULL, "spdif_in"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.0", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.1", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.2", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.3", "fast-clk"),
-       CLK_DUPLICATE("pll_p_out3", "tegra-i2c.4", "fast-clk"),
-       CLK_DUPLICATE("pll_p", "tegradc.0", "parent"),
-       CLK_DUPLICATE("pll_p", "tegradc.1", "parent"),
-       CLK_DUPLICATE("pll_d2_out0", "hdmi", "parent"),
-};
-
-struct clk *tegra_ptr_clks[] = {
-       &tegra_clk_32k,
-       &tegra_clk_m,
-       &tegra_clk_m_div2,
-       &tegra_clk_m_div4,
-       &tegra_pll_ref,
-       &tegra_pll_m,
-       &tegra_pll_m_out1,
-       &tegra_pll_c,
-       &tegra_pll_c_out1,
-       &tegra_pll_p,
-       &tegra_pll_p_out1,
-       &tegra_pll_p_out2,
-       &tegra_pll_p_out3,
-       &tegra_pll_p_out4,
-       &tegra_pll_a,
-       &tegra_pll_a_out0,
-       &tegra_pll_d,
-       &tegra_pll_d_out0,
-       &tegra_pll_d2,
-       &tegra_pll_d2_out0,
-       &tegra_pll_u,
-       &tegra_pll_x,
-       &tegra_pll_x_out0,
-       &tegra_pll_e,
-       &tegra_clk_cclk_g,
-       &tegra_cml0,
-       &tegra_cml1,
-       &tegra_pciex,
-       &tegra_clk_sclk,
-       &tegra_hclk,
-       &tegra_pclk,
-       &tegra_clk_blink,
-       &tegra30_clk_twd,
-};
-
-static void tegra30_init_one_clock(struct clk *c)
-{
-       struct clk_tegra *clk = to_clk_tegra(c->hw);
-       __clk_init(NULL, c);
-       INIT_LIST_HEAD(&clk->shared_bus_list);
-       if (!clk->lookup.dev_id && !clk->lookup.con_id)
-               clk->lookup.con_id = c->name;
-       clk->lookup.clk = c;
-       clkdev_add(&clk->lookup);
-       tegra_clk_add(c);
-}
-
-void __init tegra30_init_clocks(void)
-{
-       int i;
-       struct clk *c;
-
-       for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
-               tegra30_init_one_clock(tegra_ptr_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
-               tegra30_init_one_clock(tegra_list_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
-               c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
-               if (!c) {
-                       pr_err("%s: Unknown duplicate clock %s\n", __func__,
-                               tegra_clk_duplicates[i].name);
-                       continue;
-               }
-
-               tegra_clk_duplicates[i].lookup.clk = c;
-               clkdev_add(&tegra_clk_duplicates[i].lookup);
-       }
-
-       for (i = 0; i < ARRAY_SIZE(tegra_sync_source_list); i++)
-               tegra30_init_one_clock(tegra_sync_source_list[i]);
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_list); i++)
-               tegra30_init_one_clock(tegra_clk_audio_list[i]);
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_2x_list); i++)
-               tegra30_init_one_clock(tegra_clk_audio_2x_list[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_out_list); i++)
-               tegra30_init_one_clock(tegra_clk_out_list[i]);
-
-       tegra30_cpu_car_ops_init();
-}
diff --git a/arch/arm/mach-tegra/tegra_cpu_car.h b/arch/arm/mach-tegra/tegra_cpu_car.h
deleted file mode 100644 (file)
index 9764d31..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __MACH_TEGRA_CPU_CAR_H
-#define __MACH_TEGRA_CPU_CAR_H
-
-/*
- * Tegra CPU clock and reset control ops
- *
- * wait_for_reset:
- *     keep waiting until the CPU in reset state
- * put_in_reset:
- *     put the CPU in reset state
- * out_of_reset:
- *     release the CPU from reset state
- * enable_clock:
- *     CPU clock un-gate
- * disable_clock:
- *     CPU clock gate
- * rail_off_ready:
- *     CPU is ready for rail off
- * suspend:
- *     save the clock settings when CPU go into low-power state
- * resume:
- *     restore the clock settings when CPU exit low-power state
- */
-struct tegra_cpu_car_ops {
-       void (*wait_for_reset)(u32 cpu);
-       void (*put_in_reset)(u32 cpu);
-       void (*out_of_reset)(u32 cpu);
-       void (*enable_clock)(u32 cpu);
-       void (*disable_clock)(u32 cpu);
-#ifdef CONFIG_PM_SLEEP
-       bool (*rail_off_ready)(void);
-       void (*suspend)(void);
-       void (*resume)(void);
-#endif
-};
-
-extern struct tegra_cpu_car_ops *tegra_cpu_car_ops;
-
-static inline void tegra_wait_cpu_in_reset(u32 cpu)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->wait_for_reset))
-               return;
-
-       tegra_cpu_car_ops->wait_for_reset(cpu);
-}
-
-static inline void tegra_put_cpu_in_reset(u32 cpu)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->put_in_reset))
-               return;
-
-       tegra_cpu_car_ops->put_in_reset(cpu);
-}
-
-static inline void tegra_cpu_out_of_reset(u32 cpu)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->out_of_reset))
-               return;
-
-       tegra_cpu_car_ops->out_of_reset(cpu);
-}
-
-static inline void tegra_enable_cpu_clock(u32 cpu)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->enable_clock))
-               return;
-
-       tegra_cpu_car_ops->enable_clock(cpu);
-}
-
-static inline void tegra_disable_cpu_clock(u32 cpu)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->disable_clock))
-               return;
-
-       tegra_cpu_car_ops->disable_clock(cpu);
-}
-
-#ifdef CONFIG_PM_SLEEP
-static inline bool tegra_cpu_rail_off_ready(void)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->rail_off_ready))
-               return false;
-
-       return tegra_cpu_car_ops->rail_off_ready();
-}
-
-static inline void tegra_cpu_clock_suspend(void)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->suspend))
-               return;
-
-       tegra_cpu_car_ops->suspend();
-}
-
-static inline void tegra_cpu_clock_resume(void)
-{
-       if (WARN_ON(!tegra_cpu_car_ops->resume))
-               return;
-
-       tegra_cpu_car_ops->resume();
-}
-#endif
-
-void tegra20_cpu_car_ops_init(void);
-void tegra30_cpu_car_ops_init(void);
-
-#endif /* __MACH_TEGRA_CPU_CAR_H */
diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c
deleted file mode 100644 (file)
index eba0969..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * arch/arch/mach-tegra/timer.c
- *
- * Copyright (C) 2010 Google, Inc.
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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/init.h>
-#include <linux/err.h>
-#include <linux/time.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/clockchips.h>
-#include <linux/clocksource.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
-
-#include <asm/mach/time.h>
-#include <asm/smp_twd.h>
-#include <asm/sched_clock.h>
-
-#include "board.h"
-
-#define RTC_SECONDS            0x08
-#define RTC_SHADOW_SECONDS     0x0c
-#define RTC_MILLISECONDS       0x10
-
-#define TIMERUS_CNTR_1US 0x10
-#define TIMERUS_USEC_CFG 0x14
-#define TIMERUS_CNTR_FREEZE 0x4c
-
-#define TIMER1_BASE 0x0
-#define TIMER2_BASE 0x8
-#define TIMER3_BASE 0x50
-#define TIMER4_BASE 0x58
-
-#define TIMER_PTV 0x0
-#define TIMER_PCR 0x4
-
-static void __iomem *timer_reg_base;
-static void __iomem *rtc_base;
-
-static struct timespec persistent_ts;
-static u64 persistent_ms, last_persistent_ms;
-
-#define timer_writel(value, reg) \
-       __raw_writel(value, timer_reg_base + (reg))
-#define timer_readl(reg) \
-       __raw_readl(timer_reg_base + (reg))
-
-static int tegra_timer_set_next_event(unsigned long cycles,
-                                        struct clock_event_device *evt)
-{
-       u32 reg;
-
-       reg = 0x80000000 | ((cycles > 1) ? (cycles-1) : 0);
-       timer_writel(reg, TIMER3_BASE + TIMER_PTV);
-
-       return 0;
-}
-
-static void tegra_timer_set_mode(enum clock_event_mode mode,
-                                   struct clock_event_device *evt)
-{
-       u32 reg;
-
-       timer_writel(0, TIMER3_BASE + TIMER_PTV);
-
-       switch (mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               reg = 0xC0000000 | ((1000000/HZ)-1);
-               timer_writel(reg, TIMER3_BASE + TIMER_PTV);
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-               break;
-       case CLOCK_EVT_MODE_UNUSED:
-       case CLOCK_EVT_MODE_SHUTDOWN:
-       case CLOCK_EVT_MODE_RESUME:
-               break;
-       }
-}
-
-static struct clock_event_device tegra_clockevent = {
-       .name           = "timer0",
-       .rating         = 300,
-       .features       = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
-       .set_next_event = tegra_timer_set_next_event,
-       .set_mode       = tegra_timer_set_mode,
-};
-
-static u32 notrace tegra_read_sched_clock(void)
-{
-       return timer_readl(TIMERUS_CNTR_1US);
-}
-
-/*
- * tegra_rtc_read - Reads the Tegra RTC registers
- * Care must be taken that this funciton is not called while the
- * tegra_rtc driver could be executing to avoid race conditions
- * on the RTC shadow register
- */
-static u64 tegra_rtc_read_ms(void)
-{
-       u32 ms = readl(rtc_base + RTC_MILLISECONDS);
-       u32 s = readl(rtc_base + RTC_SHADOW_SECONDS);
-       return (u64)s * MSEC_PER_SEC + ms;
-}
-
-/*
- * tegra_read_persistent_clock -  Return time from a persistent clock.
- *
- * Reads the time from a source which isn't disabled during PM, the
- * 32k sync timer.  Convert the cycles elapsed since last read into
- * nsecs and adds to a monotonically increasing timespec.
- * Care must be taken that this funciton is not called while the
- * tegra_rtc driver could be executing to avoid race conditions
- * on the RTC shadow register
- */
-static void tegra_read_persistent_clock(struct timespec *ts)
-{
-       u64 delta;
-       struct timespec *tsp = &persistent_ts;
-
-       last_persistent_ms = persistent_ms;
-       persistent_ms = tegra_rtc_read_ms();
-       delta = persistent_ms - last_persistent_ms;
-
-       timespec_add_ns(tsp, delta * NSEC_PER_MSEC);
-       *ts = *tsp;
-}
-
-static irqreturn_t tegra_timer_interrupt(int irq, void *dev_id)
-{
-       struct clock_event_device *evt = (struct clock_event_device *)dev_id;
-       timer_writel(1<<30, TIMER3_BASE + TIMER_PCR);
-       evt->event_handler(evt);
-       return IRQ_HANDLED;
-}
-
-static struct irqaction tegra_timer_irq = {
-       .name           = "timer0",
-       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_HIGH,
-       .handler        = tegra_timer_interrupt,
-       .dev_id         = &tegra_clockevent,
-};
-
-static const struct of_device_id timer_match[] __initconst = {
-       { .compatible = "nvidia,tegra20-timer" },
-       {}
-};
-
-static const struct of_device_id rtc_match[] __initconst = {
-       { .compatible = "nvidia,tegra20-rtc" },
-       {}
-};
-
-void __init tegra_init_timer(void)
-{
-       struct device_node *np;
-       struct clk *clk;
-       unsigned long rate;
-       int ret;
-
-       np = of_find_matching_node(NULL, timer_match);
-       if (!np) {
-               pr_err("Failed to find timer DT node\n");
-               BUG();
-       }
-
-       timer_reg_base = of_iomap(np, 0);
-       if (!timer_reg_base) {
-               pr_err("Can't map timer registers");
-               BUG();
-       }
-
-       tegra_timer_irq.irq = irq_of_parse_and_map(np, 2);
-       if (tegra_timer_irq.irq <= 0) {
-               pr_err("Failed to map timer IRQ\n");
-               BUG();
-       }
-
-       clk = clk_get_sys("timer", NULL);
-       if (IS_ERR(clk)) {
-               pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n");
-               rate = 12000000;
-       } else {
-               clk_prepare_enable(clk);
-               rate = clk_get_rate(clk);
-       }
-
-       of_node_put(np);
-
-       np = of_find_matching_node(NULL, rtc_match);
-       if (!np) {
-               pr_err("Failed to find RTC DT node\n");
-               BUG();
-       }
-
-       rtc_base = of_iomap(np, 0);
-       if (!rtc_base) {
-               pr_err("Can't map RTC registers");
-               BUG();
-       }
-
-       /*
-        * rtc registers are used by read_persistent_clock, keep the rtc clock
-        * enabled
-        */
-       clk = clk_get_sys("rtc-tegra", NULL);
-       if (IS_ERR(clk))
-               pr_warn("Unable to get rtc-tegra clock\n");
-       else
-               clk_prepare_enable(clk);
-
-       of_node_put(np);
-
-       switch (rate) {
-       case 12000000:
-               timer_writel(0x000b, TIMERUS_USEC_CFG);
-               break;
-       case 13000000:
-               timer_writel(0x000c, TIMERUS_USEC_CFG);
-               break;
-       case 19200000:
-               timer_writel(0x045f, TIMERUS_USEC_CFG);
-               break;
-       case 26000000:
-               timer_writel(0x0019, TIMERUS_USEC_CFG);
-               break;
-       default:
-               WARN(1, "Unknown clock rate");
-       }
-
-       setup_sched_clock(tegra_read_sched_clock, 32, 1000000);
-
-       if (clocksource_mmio_init(timer_reg_base + TIMERUS_CNTR_1US,
-               "timer_us", 1000000, 300, 32, clocksource_mmio_readl_up)) {
-               pr_err("Failed to register clocksource\n");
-               BUG();
-       }
-
-       ret = setup_irq(tegra_timer_irq.irq, &tegra_timer_irq);
-       if (ret) {
-               pr_err("Failed to register timer IRQ: %d\n", ret);
-               BUG();
-       }
-
-       tegra_clockevent.cpumask = cpu_all_mask;
-       tegra_clockevent.irq = tegra_timer_irq.irq;
-       clockevents_config_and_register(&tegra_clockevent, 1000000,
-                                       0x1, 0x1fffffff);
-#ifdef CONFIG_HAVE_ARM_TWD
-       twd_local_timer_of_register();
-#endif
-       register_persistent_clock(NULL, tegra_read_persistent_clock);
-}
-
-#ifdef CONFIG_PM
-static u32 usec_config;
-
-void tegra_timer_suspend(void)
-{
-       usec_config = timer_readl(TIMERUS_USEC_CFG);
-}
-
-void tegra_timer_resume(void)
-{
-       timer_writel(usec_config, TIMERUS_USEC_CFG);
-}
-#endif
index 570a801fb8628cdf873cd73067c8d424477997ee..c0b1c604ccf812090e6532f256f1eec0501667c4 100644 (file)
@@ -1,13 +1,34 @@
 config ARCH_VT8500
-       bool "VIA/WonderMedia 85xx" if ARCH_MULTI_V5
-       default ARCH_VT8500_SINGLE
+       bool
        select ARCH_HAS_CPUFREQ
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
-       select CPU_ARM926T
        select GENERIC_CLOCKEVENTS
        select GENERIC_GPIO
        select HAVE_CLK
        select VT8500_TIMER
        help
          Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
+
+config ARCH_WM8505
+       bool "VIA/Wondermedia 85xx and WM8650"
+       depends on ARCH_MULTI_V5
+       select ARCH_VT8500
+       select CPU_ARM926T
+       help
+
+config ARCH_WM8750
+       bool "WonderMedia WM8750"
+       depends on ARCH_MULTI_V6
+       select ARCH_VT8500
+       select CPU_V6
+       help
+         Support for WonderMedia WM8750 System-on-Chip.
+
+config ARCH_WM8850
+       bool "WonderMedia WM8850"
+       depends on ARCH_MULTI_V7
+       select ARCH_VT8500
+       select CPU_V7
+       help
+         Support for WonderMedia WM8850 System-on-Chip.
diff --git a/arch/arm/mach-vt8500/include/mach/debug-macro.S b/arch/arm/mach-vt8500/include/mach/debug-macro.S
deleted file mode 100644 (file)
index ca292f2..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * arch/arm/mach-vt8500/include/mach/debug-macro.S
- *
- *  Copyright (C) 2010 Alexey Charkov <alchark@gmail.com>
- *
- * Debugging macro include header
- *
- * 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.
- *
-*/
-
-       .macro  addruart, rp, rv, tmp
-       mov     \rp,      #0x00200000
-       orr     \rv, \rp, #0xf8000000
-       orr     \rp, \rp, #0xd8000000
-       .endm
-
-       .macro  senduart,rd,rx
-       strb    \rd, [\rx, #0]
-       .endm
-
-       .macro  busyuart,rd,rx
-1001:  ldr     \rd, [\rx, #0x1c]
-       ands    \rd, \rd, #0x2
-       bne     1001b
-       .endm
-
-       .macro  waituart,rd,rx
-       .endm
diff --git a/arch/arm/mach-vt8500/include/mach/timex.h b/arch/arm/mach-vt8500/include/mach/timex.h
deleted file mode 100644 (file)
index 8487e4c..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  arch/arm/mach-vt8500/include/mach/timex.h
- *
- *  Copyright (C) 2010 Alexey Charkov <alchark@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.
- *
- * 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 MACH_TIMEX_H
-#define MACH_TIMEX_H
-
-#define CLOCK_TICK_RATE                (3000000)
-
-#endif /* MACH_TIMEX_H */
diff --git a/arch/arm/mach-vt8500/include/mach/uncompress.h b/arch/arm/mach-vt8500/include/mach/uncompress.h
deleted file mode 100644 (file)
index e6e81fd..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/* arch/arm/mach-vt8500/include/mach/uncompress.h
- *
- * Copyright (C) 2010 Alexey Charkov <alchark@gmail.com>
- *
- * Based on arch/arm/mach-dove/include/mach/uncompress.h
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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.
- *
- */
-
-#define UART0_PHYS     0xd8200000
-#define UART0_ADDR(x)  *(volatile unsigned char *)(UART0_PHYS + x)
-
-static void putc(const char c)
-{
-       while (UART0_ADDR(0x1c) & 0x2)
-               /* Tx busy, wait and poll */;
-
-       UART0_ADDR(0) = c;
-}
-
-static void flush(void)
-{
-}
-
-/*
- * nothing to do
- */
-#define arch_decomp_setup()
-#define arch_decomp_wdog()
index b9fd9d3cbfb3a321e4d10507c012033921655853..6141868b9a3ce694f7fed44680cba6c7ca60bdb8 100644 (file)
@@ -180,6 +180,8 @@ static const char * const vt8500_dt_compat[] = {
        "via,vt8500",
        "wm,wm8650",
        "wm,wm8505",
+       "wm,wm8750",
+       "wm,wm8850",
 };
 
 DT_MACHINE_START(WMT_DT, "VIA/Wondermedia SoC (Device Tree Support)")
index e686fe76a96b169c705322fcf2419844cabb76d2..7310bcfb299f8228a8ec6cd1e0a1666402425d89 100644 (file)
@@ -49,7 +49,7 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask,
                                        "number (%u)\n", num);
                        continue;
                }
-               if (variant_mask & !(*mpp_list & variant_mask)) {
+               if (variant_mask && !(*mpp_list & variant_mask)) {
                        printk(KERN_WARNING
                               "orion_mpp_conf: requested MPP%u config "
                               "unavailable on this hardware\n", num);
index ee90e87e7675859e4ae80cf0587191732e8b6541..f0b269a2058d579c71317ea145a633351fb2b852 100644 (file)
@@ -22,6 +22,7 @@ obj-$(CONFIG_ARCH_U8500)      += ux500/
 obj-$(CONFIG_ARCH_VT8500)      += clk-vt8500.o
 obj-$(CONFIG_ARCH_SUNXI)       += clk-sunxi.o
 obj-$(CONFIG_ARCH_ZYNQ)                += clk-zynq.o
+obj-$(CONFIG_ARCH_TEGRA)       += tegra/
 
 # Chip specific
 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
index e69991aab43ade84d0d32beb44be9e3c7baa91b8..792bc57a9db7c910d247eb47d4801a27f08792c8 100644 (file)
 #include <linux/clk-provider.h>
 #include <linux/clkdev.h>
 #include <linux/clk/bcm2835.h>
+#include <linux/clk-provider.h>
+#include <linux/of.h>
+
+static const __initconst struct of_device_id clk_match[] = {
+       { .compatible = "fixed-clock", .data = of_fixed_clk_setup, },
+       { }
+};
 
 /*
  * These are fixed clocks. They're probably not all root clocks and it may
@@ -56,4 +63,6 @@ void __init bcm2835_init_clocks(void)
        ret = clk_register_clkdev(clk, NULL, "20215000.uart");
        if (ret)
                pr_err("uart1_pclk alias not registered\n");
+
+       of_clk_init(clk_match);
 }
diff --git a/drivers/clk/tegra/Makefile b/drivers/clk/tegra/Makefile
new file mode 100644 (file)
index 0000000..2b41b0f
--- /dev/null
@@ -0,0 +1,11 @@
+obj-y                                  += clk.o
+obj-y                                  += clk-audio-sync.o
+obj-y                                  += clk-divider.o
+obj-y                                  += clk-periph.o
+obj-y                                  += clk-periph-gate.o
+obj-y                                  += clk-pll.o
+obj-y                                  += clk-pll-out.o
+obj-y                                  += clk-super.o
+
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += clk-tegra20.o
+obj-$(CONFIG_ARCH_TEGRA_3x_SOC)         += clk-tegra30.o
diff --git a/drivers/clk/tegra/clk-audio-sync.c b/drivers/clk/tegra/clk-audio-sync.c
new file mode 100644 (file)
index 0000000..c0f7843
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+
+#include "clk.h"
+
+static unsigned long clk_sync_source_recalc_rate(struct clk_hw *hw,
+                                                unsigned long parent_rate)
+{
+       struct tegra_clk_sync_source *sync = to_clk_sync_source(hw);
+
+       return sync->rate;
+}
+
+static long clk_sync_source_round_rate(struct clk_hw *hw, unsigned long rate,
+                                      unsigned long *prate)
+{
+       struct tegra_clk_sync_source *sync = to_clk_sync_source(hw);
+
+       if (rate > sync->max_rate)
+               return -EINVAL;
+       else
+               return rate;
+}
+
+static int clk_sync_source_set_rate(struct clk_hw *hw, unsigned long rate,
+                                   unsigned long parent_rate)
+{
+       struct tegra_clk_sync_source *sync = to_clk_sync_source(hw);
+
+       sync->rate = rate;
+       return 0;
+}
+
+const struct clk_ops tegra_clk_sync_source_ops = {
+       .round_rate = clk_sync_source_round_rate,
+       .set_rate = clk_sync_source_set_rate,
+       .recalc_rate = clk_sync_source_recalc_rate,
+};
+
+struct clk *tegra_clk_register_sync_source(const char *name,
+               unsigned long rate, unsigned long max_rate)
+{
+       struct tegra_clk_sync_source *sync;
+       struct clk_init_data init;
+       struct clk *clk;
+
+       sync = kzalloc(sizeof(*sync), GFP_KERNEL);
+       if (!sync) {
+               pr_err("%s: could not allocate sync source clk\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       sync->rate = rate;
+       sync->max_rate = max_rate;
+
+       init.ops = &tegra_clk_sync_source_ops;
+       init.name = name;
+       init.flags = CLK_IS_ROOT;
+       init.parent_names = NULL;
+       init.num_parents = 0;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       sync->hw.init = &init;
+
+       clk = clk_register(NULL, &sync->hw);
+       if (IS_ERR(clk))
+               kfree(sync);
+
+       return clk;
+}
diff --git a/drivers/clk/tegra/clk-divider.c b/drivers/clk/tegra/clk-divider.c
new file mode 100644 (file)
index 0000000..4d75b1f
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/clk-provider.h>
+#include <linux/clk.h>
+
+#include "clk.h"
+
+#define pll_out_override(p) (BIT((p->shift - 6)))
+#define div_mask(d) ((1 << (d->width)) - 1)
+#define get_mul(d) (1 << d->frac_width)
+#define get_max_div(d) div_mask(d)
+
+#define PERIPH_CLK_UART_DIV_ENB BIT(24)
+
+static int get_div(struct tegra_clk_frac_div *divider, unsigned long rate,
+                  unsigned long parent_rate)
+{
+       s64 divider_ux1 = parent_rate;
+       u8 flags = divider->flags;
+       int mul;
+
+       if (!rate)
+               return 0;
+
+       mul = get_mul(divider);
+
+       if (!(flags & TEGRA_DIVIDER_INT))
+               divider_ux1 *= mul;
+
+       if (flags & TEGRA_DIVIDER_ROUND_UP)
+               divider_ux1 += rate - 1;
+
+       do_div(divider_ux1, rate);
+
+       if (flags & TEGRA_DIVIDER_INT)
+               divider_ux1 *= mul;
+
+       divider_ux1 -= mul;
+
+       if (divider_ux1 < 0)
+               return 0;
+
+       if (divider_ux1 > get_max_div(divider))
+               return -EINVAL;
+
+       return divider_ux1;
+}
+
+static unsigned long clk_frac_div_recalc_rate(struct clk_hw *hw,
+                                            unsigned long parent_rate)
+{
+       struct tegra_clk_frac_div *divider = to_clk_frac_div(hw);
+       u32 reg;
+       int div, mul;
+       u64 rate = parent_rate;
+
+       reg = readl_relaxed(divider->reg) >> divider->shift;
+       div = reg & div_mask(divider);
+
+       mul = get_mul(divider);
+       div += mul;
+
+       rate *= mul;
+       rate += div - 1;
+       do_div(rate, div);
+
+       return rate;
+}
+
+static long clk_frac_div_round_rate(struct clk_hw *hw, unsigned long rate,
+                                  unsigned long *prate)
+{
+       struct tegra_clk_frac_div *divider = to_clk_frac_div(hw);
+       int div, mul;
+       unsigned long output_rate = *prate;
+
+       if (!rate)
+               return output_rate;
+
+       div = get_div(divider, rate, output_rate);
+       if (div < 0)
+               return *prate;
+
+       mul = get_mul(divider);
+
+       return DIV_ROUND_UP(output_rate * mul, div + mul);
+}
+
+static int clk_frac_div_set_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long parent_rate)
+{
+       struct tegra_clk_frac_div *divider = to_clk_frac_div(hw);
+       int div;
+       unsigned long flags = 0;
+       u32 val;
+
+       div = get_div(divider, rate, parent_rate);
+       if (div < 0)
+               return div;
+
+       if (divider->lock)
+               spin_lock_irqsave(divider->lock, flags);
+
+       val = readl_relaxed(divider->reg);
+       val &= ~(div_mask(divider) << divider->shift);
+       val |= div << divider->shift;
+
+       if (divider->flags & TEGRA_DIVIDER_UART) {
+               if (div)
+                       val |= PERIPH_CLK_UART_DIV_ENB;
+               else
+                       val &= ~PERIPH_CLK_UART_DIV_ENB;
+       }
+
+       if (divider->flags & TEGRA_DIVIDER_FIXED)
+               val |= pll_out_override(divider);
+
+       writel_relaxed(val, divider->reg);
+
+       if (divider->lock)
+               spin_unlock_irqrestore(divider->lock, flags);
+
+       return 0;
+}
+
+const struct clk_ops tegra_clk_frac_div_ops = {
+       .recalc_rate = clk_frac_div_recalc_rate,
+       .set_rate = clk_frac_div_set_rate,
+       .round_rate = clk_frac_div_round_rate,
+};
+
+struct clk *tegra_clk_register_divider(const char *name,
+               const char *parent_name, void __iomem *reg,
+               unsigned long flags, u8 clk_divider_flags, u8 shift, u8 width,
+               u8 frac_width, spinlock_t *lock)
+{
+       struct tegra_clk_frac_div *divider;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       divider = kzalloc(sizeof(*divider), GFP_KERNEL);
+       if (!divider) {
+               pr_err("%s: could not allocate fractional divider clk\n",
+                      __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       init.name = name;
+       init.ops = &tegra_clk_frac_div_ops;
+       init.flags = flags;
+       init.parent_names = parent_name ? &parent_name : NULL;
+       init.num_parents = parent_name ? 1 : 0;
+
+       divider->reg = reg;
+       divider->shift = shift;
+       divider->width = width;
+       divider->frac_width = frac_width;
+       divider->lock = lock;
+       divider->flags = clk_divider_flags;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       divider->hw.init = &init;
+
+       clk = clk_register(NULL, &divider->hw);
+       if (IS_ERR(clk))
+               kfree(divider);
+
+       return clk;
+}
diff --git a/drivers/clk/tegra/clk-periph-gate.c b/drivers/clk/tegra/clk-periph-gate.c
new file mode 100644 (file)
index 0000000..6dd5332
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/tegra-soc.h>
+
+#include "clk.h"
+
+static DEFINE_SPINLOCK(periph_ref_lock);
+
+/* Macros to assist peripheral gate clock */
+#define read_enb(gate) \
+       readl_relaxed(gate->clk_base + (gate->regs->enb_reg))
+#define write_enb_set(val, gate) \
+       writel_relaxed(val, gate->clk_base + (gate->regs->enb_set_reg))
+#define write_enb_clr(val, gate) \
+       writel_relaxed(val, gate->clk_base + (gate->regs->enb_clr_reg))
+
+#define read_rst(gate) \
+       readl_relaxed(gate->clk_base + (gate->regs->rst_reg))
+#define write_rst_set(val, gate) \
+       writel_relaxed(val, gate->clk_base + (gate->regs->rst_set_reg))
+#define write_rst_clr(val, gate) \
+       writel_relaxed(val, gate->clk_base + (gate->regs->rst_clr_reg))
+
+#define periph_clk_to_bit(periph) (1 << (gate->clk_num % 32))
+
+/* Peripheral gate clock ops */
+static int clk_periph_is_enabled(struct clk_hw *hw)
+{
+       struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
+       int state = 1;
+
+       if (!(read_enb(gate) & periph_clk_to_bit(gate)))
+               state = 0;
+
+       if (!(gate->flags & TEGRA_PERIPH_NO_RESET))
+               if (read_rst(gate) & periph_clk_to_bit(gate))
+                       state = 0;
+
+       return state;
+}
+
+static int clk_periph_enable(struct clk_hw *hw)
+{
+       struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(&periph_ref_lock, flags);
+
+       gate->enable_refcnt[gate->clk_num]++;
+       if (gate->enable_refcnt[gate->clk_num] > 1) {
+               spin_unlock_irqrestore(&periph_ref_lock, flags);
+               return 0;
+       }
+
+       write_enb_set(periph_clk_to_bit(gate), gate);
+       udelay(2);
+
+       if (!(gate->flags & TEGRA_PERIPH_NO_RESET) &&
+           !(gate->flags & TEGRA_PERIPH_MANUAL_RESET)) {
+               if (read_rst(gate) & periph_clk_to_bit(gate)) {
+                       udelay(5); /* reset propogation delay */
+                       write_rst_clr(periph_clk_to_bit(gate), gate);
+               }
+       }
+
+       spin_unlock_irqrestore(&periph_ref_lock, flags);
+
+       return 0;
+}
+
+static void clk_periph_disable(struct clk_hw *hw)
+{
+       struct tegra_clk_periph_gate *gate = to_clk_periph_gate(hw);
+       unsigned long flags = 0;
+
+       spin_lock_irqsave(&periph_ref_lock, flags);
+
+       gate->enable_refcnt[gate->clk_num]--;
+       if (gate->enable_refcnt[gate->clk_num] > 0) {
+               spin_unlock_irqrestore(&periph_ref_lock, flags);
+               return;
+       }
+
+       /*
+        * If peripheral is in the APB bus then read the APB bus to
+        * flush the write operation in apb bus. This will avoid the
+        * peripheral access after disabling clock
+        */
+       if (gate->flags & TEGRA_PERIPH_ON_APB)
+               tegra_read_chipid();
+
+       write_enb_clr(periph_clk_to_bit(gate), gate);
+
+       spin_unlock_irqrestore(&periph_ref_lock, flags);
+}
+
+void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert)
+{
+       if (gate->flags & TEGRA_PERIPH_NO_RESET)
+               return;
+
+       if (assert) {
+               /*
+                * If peripheral is in the APB bus then read the APB bus to
+                * flush the write operation in apb bus. This will avoid the
+                * peripheral access after disabling clock
+                */
+               if (gate->flags & TEGRA_PERIPH_ON_APB)
+                       tegra_read_chipid();
+
+               write_rst_set(periph_clk_to_bit(gate), gate);
+       } else {
+               write_rst_clr(periph_clk_to_bit(gate), gate);
+       }
+}
+
+const struct clk_ops tegra_clk_periph_gate_ops = {
+       .is_enabled = clk_periph_is_enabled,
+       .enable = clk_periph_enable,
+       .disable = clk_periph_disable,
+};
+
+struct clk *tegra_clk_register_periph_gate(const char *name,
+               const char *parent_name, u8 gate_flags, void __iomem *clk_base,
+               unsigned long flags, int clk_num,
+               struct tegra_clk_periph_regs *pregs, int *enable_refcnt)
+{
+       struct tegra_clk_periph_gate *gate;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       gate = kzalloc(sizeof(*gate), GFP_KERNEL);
+       if (!gate) {
+               pr_err("%s: could not allocate periph gate clk\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       init.name = name;
+       init.flags = flags;
+       init.parent_names = parent_name ? &parent_name : NULL;
+       init.num_parents = parent_name ? 1 : 0;
+       init.ops = &tegra_clk_periph_gate_ops;
+
+       gate->magic = TEGRA_CLK_PERIPH_GATE_MAGIC;
+       gate->clk_base = clk_base;
+       gate->clk_num = clk_num;
+       gate->flags = gate_flags;
+       gate->enable_refcnt = enable_refcnt;
+       gate->regs = pregs;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       gate->hw.init = &init;
+
+       clk = clk_register(NULL, &gate->hw);
+       if (IS_ERR(clk))
+               kfree(gate);
+
+       return clk;
+}
diff --git a/drivers/clk/tegra/clk-periph.c b/drivers/clk/tegra/clk-periph.c
new file mode 100644 (file)
index 0000000..788486e
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+
+#include "clk.h"
+
+static u8 clk_periph_get_parent(struct clk_hw *hw)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *mux_ops = periph->mux_ops;
+       struct clk_hw *mux_hw = &periph->mux.hw;
+
+       mux_hw->clk = hw->clk;
+
+       return mux_ops->get_parent(mux_hw);
+}
+
+static int clk_periph_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *mux_ops = periph->mux_ops;
+       struct clk_hw *mux_hw = &periph->mux.hw;
+
+       mux_hw->clk = hw->clk;
+
+       return mux_ops->set_parent(mux_hw, index);
+}
+
+static unsigned long clk_periph_recalc_rate(struct clk_hw *hw,
+                                           unsigned long parent_rate)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *div_ops = periph->div_ops;
+       struct clk_hw *div_hw = &periph->divider.hw;
+
+       div_hw->clk = hw->clk;
+
+       return div_ops->recalc_rate(div_hw, parent_rate);
+}
+
+static long clk_periph_round_rate(struct clk_hw *hw, unsigned long rate,
+                                 unsigned long *prate)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *div_ops = periph->div_ops;
+       struct clk_hw *div_hw = &periph->divider.hw;
+
+       div_hw->clk = hw->clk;
+
+       return div_ops->round_rate(div_hw, rate, prate);
+}
+
+static int clk_periph_set_rate(struct clk_hw *hw, unsigned long rate,
+                              unsigned long parent_rate)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *div_ops = periph->div_ops;
+       struct clk_hw *div_hw = &periph->divider.hw;
+
+       div_hw->clk = hw->clk;
+
+       return div_ops->set_rate(div_hw, rate, parent_rate);
+}
+
+static int clk_periph_is_enabled(struct clk_hw *hw)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *gate_ops = periph->gate_ops;
+       struct clk_hw *gate_hw = &periph->gate.hw;
+
+       gate_hw->clk = hw->clk;
+
+       return gate_ops->is_enabled(gate_hw);
+}
+
+static int clk_periph_enable(struct clk_hw *hw)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *gate_ops = periph->gate_ops;
+       struct clk_hw *gate_hw = &periph->gate.hw;
+
+       gate_hw->clk = hw->clk;
+
+       return gate_ops->enable(gate_hw);
+}
+
+static void clk_periph_disable(struct clk_hw *hw)
+{
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       const struct clk_ops *gate_ops = periph->gate_ops;
+       struct clk_hw *gate_hw = &periph->gate.hw;
+
+       gate_ops->disable(gate_hw);
+}
+
+void tegra_periph_reset_deassert(struct clk *c)
+{
+       struct clk_hw *hw = __clk_get_hw(c);
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       struct tegra_clk_periph_gate *gate;
+
+       if (periph->magic != TEGRA_CLK_PERIPH_MAGIC) {
+               gate = to_clk_periph_gate(hw);
+               if (gate->magic != TEGRA_CLK_PERIPH_GATE_MAGIC) {
+                       WARN_ON(1);
+                       return;
+               }
+       } else {
+               gate = &periph->gate;
+       }
+
+       tegra_periph_reset(gate, 0);
+}
+
+void tegra_periph_reset_assert(struct clk *c)
+{
+       struct clk_hw *hw = __clk_get_hw(c);
+       struct tegra_clk_periph *periph = to_clk_periph(hw);
+       struct tegra_clk_periph_gate *gate;
+
+       if (periph->magic != TEGRA_CLK_PERIPH_MAGIC) {
+               gate = to_clk_periph_gate(hw);
+               if (gate->magic != TEGRA_CLK_PERIPH_GATE_MAGIC) {
+                       WARN_ON(1);
+                       return;
+               }
+       } else {
+               gate = &periph->gate;
+       }
+
+       tegra_periph_reset(gate, 1);
+}
+
+const struct clk_ops tegra_clk_periph_ops = {
+       .get_parent = clk_periph_get_parent,
+       .set_parent = clk_periph_set_parent,
+       .recalc_rate = clk_periph_recalc_rate,
+       .round_rate = clk_periph_round_rate,
+       .set_rate = clk_periph_set_rate,
+       .is_enabled = clk_periph_is_enabled,
+       .enable = clk_periph_enable,
+       .disable = clk_periph_disable,
+};
+
+const struct clk_ops tegra_clk_periph_nodiv_ops = {
+       .get_parent = clk_periph_get_parent,
+       .set_parent = clk_periph_set_parent,
+       .is_enabled = clk_periph_is_enabled,
+       .enable = clk_periph_enable,
+       .disable = clk_periph_disable,
+};
+
+static struct clk *_tegra_clk_register_periph(const char *name,
+                       const char **parent_names, int num_parents,
+                       struct tegra_clk_periph *periph,
+                       void __iomem *clk_base, u32 offset, bool div)
+{
+       struct clk *clk;
+       struct clk_init_data init;
+
+       init.name = name;
+       init.ops = div ? &tegra_clk_periph_ops : &tegra_clk_periph_nodiv_ops;
+       init.flags = div ? 0 : CLK_SET_RATE_PARENT;
+       init.parent_names = parent_names;
+       init.num_parents = num_parents;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       periph->hw.init = &init;
+       periph->magic = TEGRA_CLK_PERIPH_MAGIC;
+       periph->mux.reg = clk_base + offset;
+       periph->divider.reg = div ? (clk_base + offset) : NULL;
+       periph->gate.clk_base = clk_base;
+
+       clk = clk_register(NULL, &periph->hw);
+       if (IS_ERR(clk))
+               return clk;
+
+       periph->mux.hw.clk = clk;
+       periph->divider.hw.clk = div ? clk : NULL;
+       periph->gate.hw.clk = clk;
+
+       return clk;
+}
+
+struct clk *tegra_clk_register_periph(const char *name,
+               const char **parent_names, int num_parents,
+               struct tegra_clk_periph *periph, void __iomem *clk_base,
+               u32 offset)
+{
+       return _tegra_clk_register_periph(name, parent_names, num_parents,
+                       periph, clk_base, offset, true);
+}
+
+struct clk *tegra_clk_register_periph_nodiv(const char *name,
+               const char **parent_names, int num_parents,
+               struct tegra_clk_periph *periph, void __iomem *clk_base,
+               u32 offset)
+{
+       return _tegra_clk_register_periph(name, parent_names, num_parents,
+                       periph, clk_base, offset, false);
+}
diff --git a/drivers/clk/tegra/clk-pll-out.c b/drivers/clk/tegra/clk-pll-out.c
new file mode 100644 (file)
index 0000000..3598987
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/clk-provider.h>
+#include <linux/clk.h>
+
+#include "clk.h"
+
+#define pll_out_enb(p) (BIT(p->enb_bit_idx))
+#define pll_out_rst(p) (BIT(p->rst_bit_idx))
+
+static int clk_pll_out_is_enabled(struct clk_hw *hw)
+{
+       struct tegra_clk_pll_out *pll_out = to_clk_pll_out(hw);
+       u32 val = readl_relaxed(pll_out->reg);
+       int state;
+
+       state = (val & pll_out_enb(pll_out)) ? 1 : 0;
+       if (!(val & (pll_out_rst(pll_out))))
+               state = 0;
+       return state;
+}
+
+static int clk_pll_out_enable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll_out *pll_out = to_clk_pll_out(hw);
+       unsigned long flags = 0;
+       u32 val;
+
+       if (pll_out->lock)
+               spin_lock_irqsave(pll_out->lock, flags);
+
+       val = readl_relaxed(pll_out->reg);
+
+       val |= (pll_out_enb(pll_out) | pll_out_rst(pll_out));
+
+       writel_relaxed(val, pll_out->reg);
+       udelay(2);
+
+       if (pll_out->lock)
+               spin_unlock_irqrestore(pll_out->lock, flags);
+
+       return 0;
+}
+
+static void clk_pll_out_disable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll_out *pll_out = to_clk_pll_out(hw);
+       unsigned long flags = 0;
+       u32 val;
+
+       if (pll_out->lock)
+               spin_lock_irqsave(pll_out->lock, flags);
+
+       val = readl_relaxed(pll_out->reg);
+
+       val &= ~(pll_out_enb(pll_out) | pll_out_rst(pll_out));
+
+       writel_relaxed(val, pll_out->reg);
+       udelay(2);
+
+       if (pll_out->lock)
+               spin_unlock_irqrestore(pll_out->lock, flags);
+}
+
+const struct clk_ops tegra_clk_pll_out_ops = {
+       .is_enabled = clk_pll_out_is_enabled,
+       .enable = clk_pll_out_enable,
+       .disable = clk_pll_out_disable,
+};
+
+struct clk *tegra_clk_register_pll_out(const char *name,
+               const char *parent_name, void __iomem *reg, u8 enb_bit_idx,
+               u8 rst_bit_idx, unsigned long flags, u8 pll_out_flags,
+               spinlock_t *lock)
+{
+       struct tegra_clk_pll_out *pll_out;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       pll_out = kzalloc(sizeof(*pll_out), GFP_KERNEL);
+       if (!pll_out)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = name;
+       init.ops = &tegra_clk_pll_out_ops;
+       init.parent_names = (parent_name ? &parent_name : NULL);
+       init.num_parents = (parent_name ? 1 : 0);
+       init.flags = flags;
+
+       pll_out->reg = reg;
+       pll_out->enb_bit_idx = enb_bit_idx;
+       pll_out->rst_bit_idx = rst_bit_idx;
+       pll_out->flags = pll_out_flags;
+       pll_out->lock = lock;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       pll_out->hw.init = &init;
+
+       clk = clk_register(NULL, &pll_out->hw);
+       if (IS_ERR(clk))
+               kfree(pll_out);
+
+       return clk;
+}
diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c
new file mode 100644 (file)
index 0000000..165f247
--- /dev/null
@@ -0,0 +1,648 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk-provider.h>
+#include <linux/clk.h>
+
+#include "clk.h"
+
+#define PLL_BASE_BYPASS BIT(31)
+#define PLL_BASE_ENABLE BIT(30)
+#define PLL_BASE_REF_ENABLE BIT(29)
+#define PLL_BASE_OVERRIDE BIT(28)
+
+#define PLL_BASE_DIVP_SHIFT 20
+#define PLL_BASE_DIVP_WIDTH 3
+#define PLL_BASE_DIVN_SHIFT 8
+#define PLL_BASE_DIVN_WIDTH 10
+#define PLL_BASE_DIVM_SHIFT 0
+#define PLL_BASE_DIVM_WIDTH 5
+#define PLLU_POST_DIVP_MASK 0x1
+
+#define PLL_MISC_DCCON_SHIFT 20
+#define PLL_MISC_CPCON_SHIFT 8
+#define PLL_MISC_CPCON_WIDTH 4
+#define PLL_MISC_CPCON_MASK ((1 << PLL_MISC_CPCON_WIDTH) - 1)
+#define PLL_MISC_LFCON_SHIFT 4
+#define PLL_MISC_LFCON_WIDTH 4
+#define PLL_MISC_LFCON_MASK ((1 << PLL_MISC_LFCON_WIDTH) - 1)
+#define PLL_MISC_VCOCON_SHIFT 0
+#define PLL_MISC_VCOCON_WIDTH 4
+#define PLL_MISC_VCOCON_MASK ((1 << PLL_MISC_VCOCON_WIDTH) - 1)
+
+#define OUT_OF_TABLE_CPCON 8
+
+#define PMC_PLLP_WB0_OVERRIDE 0xf8
+#define PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE BIT(12)
+#define PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE BIT(11)
+
+#define PLL_POST_LOCK_DELAY 50
+
+#define PLLDU_LFCON_SET_DIVN 600
+
+#define PLLE_BASE_DIVCML_SHIFT 24
+#define PLLE_BASE_DIVCML_WIDTH 4
+#define PLLE_BASE_DIVP_SHIFT 16
+#define PLLE_BASE_DIVP_WIDTH 7
+#define PLLE_BASE_DIVN_SHIFT 8
+#define PLLE_BASE_DIVN_WIDTH 8
+#define PLLE_BASE_DIVM_SHIFT 0
+#define PLLE_BASE_DIVM_WIDTH 8
+
+#define PLLE_MISC_SETUP_BASE_SHIFT 16
+#define PLLE_MISC_SETUP_BASE_MASK (0xffff << PLLE_MISC_SETUP_BASE_SHIFT)
+#define PLLE_MISC_LOCK_ENABLE BIT(9)
+#define PLLE_MISC_READY BIT(15)
+#define PLLE_MISC_SETUP_EX_SHIFT 2
+#define PLLE_MISC_SETUP_EX_MASK (3 << PLLE_MISC_SETUP_EX_SHIFT)
+#define PLLE_MISC_SETUP_MASK (PLLE_MISC_SETUP_BASE_MASK |      \
+                             PLLE_MISC_SETUP_EX_MASK)
+#define PLLE_MISC_SETUP_VALUE (7 << PLLE_MISC_SETUP_BASE_SHIFT)
+
+#define PLLE_SS_CTRL 0x68
+#define PLLE_SS_DISABLE (7 << 10)
+
+#define PMC_SATA_PWRGT 0x1ac
+#define PMC_SATA_PWRGT_PLLE_IDDQ_VALUE BIT(5)
+#define PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL BIT(4)
+
+#define pll_readl(offset, p) readl_relaxed(p->clk_base + offset)
+#define pll_readl_base(p) pll_readl(p->params->base_reg, p)
+#define pll_readl_misc(p) pll_readl(p->params->misc_reg, p)
+
+#define pll_writel(val, offset, p) writel_relaxed(val, p->clk_base + offset)
+#define pll_writel_base(val, p) pll_writel(val, p->params->base_reg, p)
+#define pll_writel_misc(val, p) pll_writel(val, p->params->misc_reg, p)
+
+#define mask(w) ((1 << (w)) - 1)
+#define divm_mask(p) mask(p->divm_width)
+#define divn_mask(p) mask(p->divn_width)
+#define divp_mask(p) (p->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :    \
+                     mask(p->divp_width))
+
+#define divm_max(p) (divm_mask(p))
+#define divn_max(p) (divn_mask(p))
+#define divp_max(p) (1 << (divp_mask(p)))
+
+static void clk_pll_enable_lock(struct tegra_clk_pll *pll)
+{
+       u32 val;
+
+       if (!(pll->flags & TEGRA_PLL_USE_LOCK))
+               return;
+
+       val = pll_readl_misc(pll);
+       val |= BIT(pll->params->lock_enable_bit_idx);
+       pll_writel_misc(val, pll);
+}
+
+static int clk_pll_wait_for_lock(struct tegra_clk_pll *pll,
+                                void __iomem *lock_addr, u32 lock_bit_idx)
+{
+       int i;
+       u32 val;
+
+       if (!(pll->flags & TEGRA_PLL_USE_LOCK)) {
+               udelay(pll->params->lock_delay);
+               return 0;
+       }
+
+       for (i = 0; i < pll->params->lock_delay; i++) {
+               val = readl_relaxed(lock_addr);
+               if (val & BIT(lock_bit_idx)) {
+                       udelay(PLL_POST_LOCK_DELAY);
+                       return 0;
+               }
+               udelay(2); /* timeout = 2 * lock time */
+       }
+
+       pr_err("%s: Timed out waiting for pll %s lock\n", __func__,
+              __clk_get_name(pll->hw.clk));
+
+       return -1;
+}
+
+static int clk_pll_is_enabled(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       u32 val;
+
+       if (pll->flags & TEGRA_PLLM) {
+               val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE);
+               if (val & PMC_PLLP_WB0_OVERRIDE_PLLM_OVERRIDE)
+                       return val & PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE ? 1 : 0;
+       }
+
+       val = pll_readl_base(pll);
+
+       return val & PLL_BASE_ENABLE ? 1 : 0;
+}
+
+static int _clk_pll_enable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       u32 val;
+
+       clk_pll_enable_lock(pll);
+
+       val = pll_readl_base(pll);
+       val &= ~PLL_BASE_BYPASS;
+       val |= PLL_BASE_ENABLE;
+       pll_writel_base(val, pll);
+
+       if (pll->flags & TEGRA_PLLM) {
+               val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE);
+               val |= PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE;
+               writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE);
+       }
+
+       clk_pll_wait_for_lock(pll, pll->clk_base + pll->params->base_reg,
+                             pll->params->lock_bit_idx);
+
+       return 0;
+}
+
+static void _clk_pll_disable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       u32 val;
+
+       val = pll_readl_base(pll);
+       val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
+       pll_writel_base(val, pll);
+
+       if (pll->flags & TEGRA_PLLM) {
+               val = readl_relaxed(pll->pmc + PMC_PLLP_WB0_OVERRIDE);
+               val &= ~PMC_PLLP_WB0_OVERRIDE_PLLM_ENABLE;
+               writel_relaxed(val, pll->pmc + PMC_PLLP_WB0_OVERRIDE);
+       }
+}
+
+static int clk_pll_enable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       unsigned long flags = 0;
+       int ret;
+
+       if (pll->lock)
+               spin_lock_irqsave(pll->lock, flags);
+
+       ret = _clk_pll_enable(hw);
+
+       if (pll->lock)
+               spin_unlock_irqrestore(pll->lock, flags);
+
+       return ret;
+}
+
+static void clk_pll_disable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       unsigned long flags = 0;
+
+       if (pll->lock)
+               spin_lock_irqsave(pll->lock, flags);
+
+       _clk_pll_disable(hw);
+
+       if (pll->lock)
+               spin_unlock_irqrestore(pll->lock, flags);
+}
+
+static int _get_table_rate(struct clk_hw *hw,
+                          struct tegra_clk_pll_freq_table *cfg,
+                          unsigned long rate, unsigned long parent_rate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       struct tegra_clk_pll_freq_table *sel;
+
+       for (sel = pll->freq_table; sel->input_rate != 0; sel++)
+               if (sel->input_rate == parent_rate &&
+                   sel->output_rate == rate)
+                       break;
+
+       if (sel->input_rate == 0)
+               return -EINVAL;
+
+       BUG_ON(sel->p < 1);
+
+       cfg->input_rate = sel->input_rate;
+       cfg->output_rate = sel->output_rate;
+       cfg->m = sel->m;
+       cfg->n = sel->n;
+       cfg->p = sel->p;
+       cfg->cpcon = sel->cpcon;
+
+       return 0;
+}
+
+static int _calc_rate(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
+                     unsigned long rate, unsigned long parent_rate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       unsigned long cfreq;
+       u32 p_div = 0;
+
+       switch (parent_rate) {
+       case 12000000:
+       case 26000000:
+               cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2000000;
+               break;
+       case 13000000:
+               cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2600000;
+               break;
+       case 16800000:
+       case 19200000:
+               cfreq = (rate <= 1200000 * 1000) ? 1200000 : 2400000;
+               break;
+       case 9600000:
+       case 28800000:
+               /*
+                * PLL_P_OUT1 rate is not listed in PLLA table
+                */
+               cfreq = parent_rate/(parent_rate/1000000);
+               break;
+       default:
+               pr_err("%s Unexpected reference rate %lu\n",
+                      __func__, parent_rate);
+               BUG();
+       }
+
+       /* Raise VCO to guarantee 0.5% accuracy */
+       for (cfg->output_rate = rate; cfg->output_rate < 200 * cfreq;
+            cfg->output_rate <<= 1)
+               p_div++;
+
+       cfg->p = 1 << p_div;
+       cfg->m = parent_rate / cfreq;
+       cfg->n = cfg->output_rate / cfreq;
+       cfg->cpcon = OUT_OF_TABLE_CPCON;
+
+       if (cfg->m > divm_max(pll) || cfg->n > divn_max(pll) ||
+           cfg->p > divp_max(pll) || cfg->output_rate > pll->params->vco_max) {
+               pr_err("%s: Failed to set %s rate %lu\n",
+                      __func__, __clk_get_name(hw->clk), rate);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int _program_pll(struct clk_hw *hw, struct tegra_clk_pll_freq_table *cfg,
+                       unsigned long rate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       unsigned long flags = 0;
+       u32 divp, val, old_base;
+       int state;
+
+       divp = __ffs(cfg->p);
+
+       if (pll->flags & TEGRA_PLLU)
+               divp ^= 1;
+
+       if (pll->lock)
+               spin_lock_irqsave(pll->lock, flags);
+
+       old_base = val = pll_readl_base(pll);
+       val &= ~((divm_mask(pll) << pll->divm_shift) |
+                (divn_mask(pll) << pll->divn_shift) |
+                (divp_mask(pll) << pll->divp_shift));
+       val |= ((cfg->m << pll->divm_shift) |
+               (cfg->n << pll->divn_shift) |
+               (divp << pll->divp_shift));
+       if (val == old_base) {
+               if (pll->lock)
+                       spin_unlock_irqrestore(pll->lock, flags);
+               return 0;
+       }
+
+       state = clk_pll_is_enabled(hw);
+
+       if (state) {
+               _clk_pll_disable(hw);
+               val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
+       }
+       pll_writel_base(val, pll);
+
+       if (pll->flags & TEGRA_PLL_HAS_CPCON) {
+               val = pll_readl_misc(pll);
+               val &= ~(PLL_MISC_CPCON_MASK << PLL_MISC_CPCON_SHIFT);
+               val |= cfg->cpcon << PLL_MISC_CPCON_SHIFT;
+               if (pll->flags & TEGRA_PLL_SET_LFCON) {
+                       val &= ~(PLL_MISC_LFCON_MASK << PLL_MISC_LFCON_SHIFT);
+                       if (cfg->n >= PLLDU_LFCON_SET_DIVN)
+                               val |= 0x1 << PLL_MISC_LFCON_SHIFT;
+               } else if (pll->flags & TEGRA_PLL_SET_DCCON) {
+                       val &= ~(0x1 << PLL_MISC_DCCON_SHIFT);
+                       if (rate >= (pll->params->vco_max >> 1))
+                               val |= 0x1 << PLL_MISC_DCCON_SHIFT;
+               }
+               pll_writel_misc(val, pll);
+       }
+
+       if (pll->lock)
+               spin_unlock_irqrestore(pll->lock, flags);
+
+       if (state)
+               clk_pll_enable(hw);
+
+       return 0;
+}
+
+static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+                       unsigned long parent_rate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       struct tegra_clk_pll_freq_table cfg;
+
+       if (pll->flags & TEGRA_PLL_FIXED) {
+               if (rate != pll->fixed_rate) {
+                       pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
+                               __func__, __clk_get_name(hw->clk),
+                               pll->fixed_rate, rate);
+                       return -EINVAL;
+               }
+               return 0;
+       }
+
+       if (_get_table_rate(hw, &cfg, rate, parent_rate) &&
+           _calc_rate(hw, &cfg, rate, parent_rate))
+               return -EINVAL;
+
+       return _program_pll(hw, &cfg, rate);
+}
+
+static long clk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+                       unsigned long *prate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       struct tegra_clk_pll_freq_table cfg;
+       u64 output_rate = *prate;
+
+       if (pll->flags & TEGRA_PLL_FIXED)
+               return pll->fixed_rate;
+
+       /* PLLM is used for memory; we do not change rate */
+       if (pll->flags & TEGRA_PLLM)
+               return __clk_get_rate(hw->clk);
+
+       if (_get_table_rate(hw, &cfg, rate, *prate) &&
+           _calc_rate(hw, &cfg, rate, *prate))
+               return -EINVAL;
+
+       output_rate *= cfg.n;
+       do_div(output_rate, cfg.m * cfg.p);
+
+       return output_rate;
+}
+
+static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
+                                        unsigned long parent_rate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       u32 val = pll_readl_base(pll);
+       u32 divn = 0, divm = 0, divp = 0;
+       u64 rate = parent_rate;
+
+       if (val & PLL_BASE_BYPASS)
+               return parent_rate;
+
+       if ((pll->flags & TEGRA_PLL_FIXED) && !(val & PLL_BASE_OVERRIDE)) {
+               struct tegra_clk_pll_freq_table sel;
+               if (_get_table_rate(hw, &sel, pll->fixed_rate, parent_rate)) {
+                       pr_err("Clock %s has unknown fixed frequency\n",
+                              __clk_get_name(hw->clk));
+                       BUG();
+               }
+               return pll->fixed_rate;
+       }
+
+       divp = (val >> pll->divp_shift) & (divp_mask(pll));
+       if (pll->flags & TEGRA_PLLU)
+               divp ^= 1;
+
+       divn = (val >> pll->divn_shift) & (divn_mask(pll));
+       divm = (val >> pll->divm_shift) & (divm_mask(pll));
+       divm *= (1 << divp);
+
+       rate *= divn;
+       do_div(rate, divm);
+       return rate;
+}
+
+static int clk_plle_training(struct tegra_clk_pll *pll)
+{
+       u32 val;
+       unsigned long timeout;
+
+       if (!pll->pmc)
+               return -ENOSYS;
+
+       /*
+        * PLLE is already disabled, and setup cleared;
+        * create falling edge on PLLE IDDQ input.
+        */
+       val = readl(pll->pmc + PMC_SATA_PWRGT);
+       val |= PMC_SATA_PWRGT_PLLE_IDDQ_VALUE;
+       writel(val, pll->pmc + PMC_SATA_PWRGT);
+
+       val = readl(pll->pmc + PMC_SATA_PWRGT);
+       val |= PMC_SATA_PWRGT_PLLE_IDDQ_SWCTL;
+       writel(val, pll->pmc + PMC_SATA_PWRGT);
+
+       val = readl(pll->pmc + PMC_SATA_PWRGT);
+       val &= ~PMC_SATA_PWRGT_PLLE_IDDQ_VALUE;
+       writel(val, pll->pmc + PMC_SATA_PWRGT);
+
+       val = pll_readl_misc(pll);
+
+       timeout = jiffies + msecs_to_jiffies(100);
+       while (1) {
+               val = pll_readl_misc(pll);
+               if (val & PLLE_MISC_READY)
+                       break;
+               if (time_after(jiffies, timeout)) {
+                       pr_err("%s: timeout waiting for PLLE\n", __func__);
+                       return -EBUSY;
+               }
+               udelay(300);
+       }
+
+       return 0;
+}
+
+static int clk_plle_enable(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk));
+       struct tegra_clk_pll_freq_table sel;
+       u32 val;
+       int err;
+
+       if (_get_table_rate(hw, &sel, pll->fixed_rate, input_rate))
+               return -EINVAL;
+
+       clk_pll_disable(hw);
+
+       val = pll_readl_misc(pll);
+       val &= ~(PLLE_MISC_LOCK_ENABLE | PLLE_MISC_SETUP_MASK);
+       pll_writel_misc(val, pll);
+
+       val = pll_readl_misc(pll);
+       if (!(val & PLLE_MISC_READY)) {
+               err = clk_plle_training(pll);
+               if (err)
+                       return err;
+       }
+
+       if (pll->flags & TEGRA_PLLE_CONFIGURE) {
+               /* configure dividers */
+               val = pll_readl_base(pll);
+               val &= ~(divm_mask(pll) | divn_mask(pll) | divp_mask(pll));
+               val &= ~(PLLE_BASE_DIVCML_WIDTH << PLLE_BASE_DIVCML_SHIFT);
+               val |= sel.m << pll->divm_shift;
+               val |= sel.n << pll->divn_shift;
+               val |= sel.p << pll->divp_shift;
+               val |= sel.cpcon << PLLE_BASE_DIVCML_SHIFT;
+               pll_writel_base(val, pll);
+       }
+
+       val = pll_readl_misc(pll);
+       val |= PLLE_MISC_SETUP_VALUE;
+       val |= PLLE_MISC_LOCK_ENABLE;
+       pll_writel_misc(val, pll);
+
+       val = readl(pll->clk_base + PLLE_SS_CTRL);
+       val |= PLLE_SS_DISABLE;
+       writel(val, pll->clk_base + PLLE_SS_CTRL);
+
+       val |= pll_readl_base(pll);
+       val |= (PLL_BASE_BYPASS | PLL_BASE_ENABLE);
+       pll_writel_base(val, pll);
+
+       clk_pll_wait_for_lock(pll, pll->clk_base + pll->params->misc_reg,
+                             pll->params->lock_bit_idx);
+       return 0;
+}
+
+static unsigned long clk_plle_recalc_rate(struct clk_hw *hw,
+                                        unsigned long parent_rate)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       u32 val = pll_readl_base(pll);
+       u32 divn = 0, divm = 0, divp = 0;
+       u64 rate = parent_rate;
+
+       divp = (val >> pll->divp_shift) & (divp_mask(pll));
+       divn = (val >> pll->divn_shift) & (divn_mask(pll));
+       divm = (val >> pll->divm_shift) & (divm_mask(pll));
+       divm *= divp;
+
+       rate *= divn;
+       do_div(rate, divm);
+       return rate;
+}
+
+const struct clk_ops tegra_clk_pll_ops = {
+       .is_enabled = clk_pll_is_enabled,
+       .enable = clk_pll_enable,
+       .disable = clk_pll_disable,
+       .recalc_rate = clk_pll_recalc_rate,
+       .round_rate = clk_pll_round_rate,
+       .set_rate = clk_pll_set_rate,
+};
+
+const struct clk_ops tegra_clk_plle_ops = {
+       .recalc_rate = clk_plle_recalc_rate,
+       .is_enabled = clk_pll_is_enabled,
+       .disable = clk_pll_disable,
+       .enable = clk_plle_enable,
+};
+
+static struct clk *_tegra_clk_register_pll(const char *name,
+               const char *parent_name, void __iomem *clk_base,
+               void __iomem *pmc, unsigned long flags,
+               unsigned long fixed_rate,
+               struct tegra_clk_pll_params *pll_params, u8 pll_flags,
+               struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock,
+               const struct clk_ops *ops)
+{
+       struct tegra_clk_pll *pll;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       pll = kzalloc(sizeof(*pll), GFP_KERNEL);
+       if (!pll)
+               return ERR_PTR(-ENOMEM);
+
+       init.name = name;
+       init.ops = ops;
+       init.flags = flags;
+       init.parent_names = (parent_name ? &parent_name : NULL);
+       init.num_parents = (parent_name ? 1 : 0);
+
+       pll->clk_base = clk_base;
+       pll->pmc = pmc;
+
+       pll->freq_table = freq_table;
+       pll->params = pll_params;
+       pll->fixed_rate = fixed_rate;
+       pll->flags = pll_flags;
+       pll->lock = lock;
+
+       pll->divp_shift = PLL_BASE_DIVP_SHIFT;
+       pll->divp_width = PLL_BASE_DIVP_WIDTH;
+       pll->divn_shift = PLL_BASE_DIVN_SHIFT;
+       pll->divn_width = PLL_BASE_DIVN_WIDTH;
+       pll->divm_shift = PLL_BASE_DIVM_SHIFT;
+       pll->divm_width = PLL_BASE_DIVM_WIDTH;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       pll->hw.init = &init;
+
+       clk = clk_register(NULL, &pll->hw);
+       if (IS_ERR(clk))
+               kfree(pll);
+
+       return clk;
+}
+
+struct clk *tegra_clk_register_pll(const char *name, const char *parent_name,
+               void __iomem *clk_base, void __iomem *pmc,
+               unsigned long flags, unsigned long fixed_rate,
+               struct tegra_clk_pll_params *pll_params, u8 pll_flags,
+               struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock)
+{
+       return _tegra_clk_register_pll(name, parent_name, clk_base, pmc,
+                       flags, fixed_rate, pll_params, pll_flags, freq_table,
+                       lock, &tegra_clk_pll_ops);
+}
+
+struct clk *tegra_clk_register_plle(const char *name, const char *parent_name,
+               void __iomem *clk_base, void __iomem *pmc,
+               unsigned long flags, unsigned long fixed_rate,
+               struct tegra_clk_pll_params *pll_params, u8 pll_flags,
+               struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock)
+{
+       return _tegra_clk_register_pll(name, parent_name, clk_base, pmc,
+                       flags, fixed_rate, pll_params, pll_flags, freq_table,
+                       lock, &tegra_clk_plle_ops);
+}
diff --git a/drivers/clk/tegra/clk-super.c b/drivers/clk/tegra/clk-super.c
new file mode 100644 (file)
index 0000000..7ad48a8
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/clk-provider.h>
+#include <linux/clk.h>
+
+#include "clk.h"
+
+#define SUPER_STATE_IDLE 0
+#define SUPER_STATE_RUN 1
+#define SUPER_STATE_IRQ 2
+#define SUPER_STATE_FIQ 3
+
+#define SUPER_STATE_SHIFT 28
+#define SUPER_STATE_MASK ((BIT(SUPER_STATE_IDLE) | BIT(SUPER_STATE_RUN) | \
+                          BIT(SUPER_STATE_IRQ) | BIT(SUPER_STATE_FIQ)) \
+                         << SUPER_STATE_SHIFT)
+
+#define SUPER_LP_DIV2_BYPASS (1 << 16)
+
+#define super_state(s) (BIT(s) << SUPER_STATE_SHIFT)
+#define super_state_to_src_shift(m, s) ((m->width * s))
+#define super_state_to_src_mask(m) (((1 << m->width) - 1))
+
+static u8 clk_super_get_parent(struct clk_hw *hw)
+{
+       struct tegra_clk_super_mux *mux = to_clk_super_mux(hw);
+       u32 val, state;
+       u8 source, shift;
+
+       val = readl_relaxed(mux->reg);
+
+       state = val & SUPER_STATE_MASK;
+
+       BUG_ON((state != super_state(SUPER_STATE_RUN)) &&
+              (state != super_state(SUPER_STATE_IDLE)));
+       shift = (state == super_state(SUPER_STATE_IDLE)) ?
+               super_state_to_src_shift(mux, SUPER_STATE_IDLE) :
+               super_state_to_src_shift(mux, SUPER_STATE_RUN);
+
+       source = (val >> shift) & super_state_to_src_mask(mux);
+
+       /*
+        * If LP_DIV2_BYPASS is not set and PLLX is current parent then
+        * PLLX/2 is the input source to CCLKLP.
+        */
+       if ((mux->flags & TEGRA_DIVIDER_2) && !(val & SUPER_LP_DIV2_BYPASS) &&
+           (source == mux->pllx_index))
+               source = mux->div2_index;
+
+       return source;
+}
+
+static int clk_super_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct tegra_clk_super_mux *mux = to_clk_super_mux(hw);
+       u32 val, state;
+       u8 parent_index, shift;
+
+       val = readl_relaxed(mux->reg);
+       state = val & SUPER_STATE_MASK;
+       BUG_ON((state != super_state(SUPER_STATE_RUN)) &&
+              (state != super_state(SUPER_STATE_IDLE)));
+       shift = (state == super_state(SUPER_STATE_IDLE)) ?
+               super_state_to_src_shift(mux, SUPER_STATE_IDLE) :
+               super_state_to_src_shift(mux, SUPER_STATE_RUN);
+
+       /*
+        * For LP mode super-clock switch between PLLX direct
+        * and divided-by-2 outputs is allowed only when other
+        * than PLLX clock source is current parent.
+        */
+       if ((mux->flags & TEGRA_DIVIDER_2) && ((index == mux->div2_index) ||
+                                              (index == mux->pllx_index))) {
+               parent_index = clk_super_get_parent(hw);
+               if ((parent_index == mux->div2_index) ||
+                   (parent_index == mux->pllx_index))
+                       return -EINVAL;
+
+               val ^= SUPER_LP_DIV2_BYPASS;
+               writel_relaxed(val, mux->reg);
+               udelay(2);
+
+               if (index == mux->div2_index)
+                       index = mux->pllx_index;
+       }
+       val &= ~((super_state_to_src_mask(mux)) << shift);
+       val |= (index & (super_state_to_src_mask(mux))) << shift;
+
+       writel_relaxed(val, mux->reg);
+       udelay(2);
+       return 0;
+}
+
+const struct clk_ops tegra_clk_super_ops = {
+       .get_parent = clk_super_get_parent,
+       .set_parent = clk_super_set_parent,
+};
+
+struct clk *tegra_clk_register_super_mux(const char *name,
+               const char **parent_names, u8 num_parents,
+               unsigned long flags, void __iomem *reg, u8 clk_super_flags,
+               u8 width, u8 pllx_index, u8 div2_index, spinlock_t *lock)
+{
+       struct tegra_clk_super_mux *super;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       super = kzalloc(sizeof(*super), GFP_KERNEL);
+       if (!super) {
+               pr_err("%s: could not allocate super clk\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       init.name = name;
+       init.ops = &tegra_clk_super_ops;
+       init.flags = flags;
+       init.parent_names = parent_names;
+       init.num_parents = num_parents;
+
+       super->reg = reg;
+       super->pllx_index = pllx_index;
+       super->div2_index = div2_index;
+       super->lock = lock;
+       super->width = width;
+       super->flags = clk_super_flags;
+
+       /* Data in .init is copied by clk_register(), so stack variable OK */
+       super->hw.init = &init;
+
+       clk = clk_register(NULL, &super->hw);
+       if (IS_ERR(clk))
+               kfree(super);
+
+       return clk;
+}
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c
new file mode 100644 (file)
index 0000000..5d41569
--- /dev/null
@@ -0,0 +1,1349 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/clk/tegra.h>
+#include <linux/delay.h>
+
+#include "clk.h"
+
+#define RST_DEVICES_L 0x004
+#define RST_DEVICES_H 0x008
+#define RST_DEVICES_U 0x00c
+#define RST_DEVICES_SET_L 0x300
+#define RST_DEVICES_CLR_L 0x304
+#define RST_DEVICES_SET_H 0x308
+#define RST_DEVICES_CLR_H 0x30c
+#define RST_DEVICES_SET_U 0x310
+#define RST_DEVICES_CLR_U 0x314
+#define RST_DEVICES_NUM 3
+
+#define CLK_OUT_ENB_L 0x010
+#define CLK_OUT_ENB_H 0x014
+#define CLK_OUT_ENB_U 0x018
+#define CLK_OUT_ENB_SET_L 0x320
+#define CLK_OUT_ENB_CLR_L 0x324
+#define CLK_OUT_ENB_SET_H 0x328
+#define CLK_OUT_ENB_CLR_H 0x32c
+#define CLK_OUT_ENB_SET_U 0x330
+#define CLK_OUT_ENB_CLR_U 0x334
+#define CLK_OUT_ENB_NUM 3
+
+#define OSC_CTRL 0x50
+#define OSC_CTRL_OSC_FREQ_MASK (3<<30)
+#define OSC_CTRL_OSC_FREQ_13MHZ (0<<30)
+#define OSC_CTRL_OSC_FREQ_19_2MHZ (1<<30)
+#define OSC_CTRL_OSC_FREQ_12MHZ (2<<30)
+#define OSC_CTRL_OSC_FREQ_26MHZ (3<<30)
+#define OSC_CTRL_MASK (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
+
+#define OSC_CTRL_PLL_REF_DIV_MASK (3<<28)
+#define OSC_CTRL_PLL_REF_DIV_1         (0<<28)
+#define OSC_CTRL_PLL_REF_DIV_2         (1<<28)
+#define OSC_CTRL_PLL_REF_DIV_4         (2<<28)
+
+#define OSC_FREQ_DET 0x58
+#define OSC_FREQ_DET_TRIG (1<<31)
+
+#define OSC_FREQ_DET_STATUS 0x5c
+#define OSC_FREQ_DET_BUSY (1<<31)
+#define OSC_FREQ_DET_CNT_MASK 0xFFFF
+
+#define PLLS_BASE 0xf0
+#define PLLS_MISC 0xf4
+#define PLLC_BASE 0x80
+#define PLLC_MISC 0x8c
+#define PLLM_BASE 0x90
+#define PLLM_MISC 0x9c
+#define PLLP_BASE 0xa0
+#define PLLP_MISC 0xac
+#define PLLA_BASE 0xb0
+#define PLLA_MISC 0xbc
+#define PLLU_BASE 0xc0
+#define PLLU_MISC 0xcc
+#define PLLD_BASE 0xd0
+#define PLLD_MISC 0xdc
+#define PLLX_BASE 0xe0
+#define PLLX_MISC 0xe4
+#define PLLE_BASE 0xe8
+#define PLLE_MISC 0xec
+
+#define PLL_BASE_LOCK 27
+#define PLLE_MISC_LOCK 11
+
+#define PLL_MISC_LOCK_ENABLE 18
+#define PLLDU_MISC_LOCK_ENABLE 22
+#define PLLE_MISC_LOCK_ENABLE 9
+
+#define PLLC_OUT 0x84
+#define PLLM_OUT 0x94
+#define PLLP_OUTA 0xa4
+#define PLLP_OUTB 0xa8
+#define PLLA_OUT 0xb4
+
+#define CCLK_BURST_POLICY 0x20
+#define SUPER_CCLK_DIVIDER 0x24
+#define SCLK_BURST_POLICY 0x28
+#define SUPER_SCLK_DIVIDER 0x2c
+#define CLK_SYSTEM_RATE 0x30
+
+#define CCLK_BURST_POLICY_SHIFT        28
+#define CCLK_RUN_POLICY_SHIFT  4
+#define CCLK_IDLE_POLICY_SHIFT 0
+#define CCLK_IDLE_POLICY       1
+#define CCLK_RUN_POLICY                2
+#define CCLK_BURST_POLICY_PLLX 8
+
+#define CLK_SOURCE_I2S1 0x100
+#define CLK_SOURCE_I2S2 0x104
+#define CLK_SOURCE_SPDIF_OUT 0x108
+#define CLK_SOURCE_SPDIF_IN 0x10c
+#define CLK_SOURCE_PWM 0x110
+#define CLK_SOURCE_SPI 0x114
+#define CLK_SOURCE_SBC1 0x134
+#define CLK_SOURCE_SBC2 0x118
+#define CLK_SOURCE_SBC3 0x11c
+#define CLK_SOURCE_SBC4 0x1b4
+#define CLK_SOURCE_XIO 0x120
+#define CLK_SOURCE_TWC 0x12c
+#define CLK_SOURCE_IDE 0x144
+#define CLK_SOURCE_NDFLASH 0x160
+#define CLK_SOURCE_VFIR 0x168
+#define CLK_SOURCE_SDMMC1 0x150
+#define CLK_SOURCE_SDMMC2 0x154
+#define CLK_SOURCE_SDMMC3 0x1bc
+#define CLK_SOURCE_SDMMC4 0x164
+#define CLK_SOURCE_CVE 0x140
+#define CLK_SOURCE_TVO 0x188
+#define CLK_SOURCE_TVDAC 0x194
+#define CLK_SOURCE_HDMI 0x18c
+#define CLK_SOURCE_DISP1 0x138
+#define CLK_SOURCE_DISP2 0x13c
+#define CLK_SOURCE_CSITE 0x1d4
+#define CLK_SOURCE_LA 0x1f8
+#define CLK_SOURCE_OWR 0x1cc
+#define CLK_SOURCE_NOR 0x1d0
+#define CLK_SOURCE_MIPI 0x174
+#define CLK_SOURCE_I2C1 0x124
+#define CLK_SOURCE_I2C2 0x198
+#define CLK_SOURCE_I2C3 0x1b8
+#define CLK_SOURCE_DVC 0x128
+#define CLK_SOURCE_UARTA 0x178
+#define CLK_SOURCE_UARTB 0x17c
+#define CLK_SOURCE_UARTC 0x1a0
+#define CLK_SOURCE_UARTD 0x1c0
+#define CLK_SOURCE_UARTE 0x1c4
+#define CLK_SOURCE_3D 0x158
+#define CLK_SOURCE_2D 0x15c
+#define CLK_SOURCE_MPE 0x170
+#define CLK_SOURCE_EPP 0x16c
+#define CLK_SOURCE_HOST1X 0x180
+#define CLK_SOURCE_VDE 0x1c8
+#define CLK_SOURCE_VI 0x148
+#define CLK_SOURCE_VI_SENSOR 0x1a8
+#define CLK_SOURCE_EMC 0x19c
+
+#define AUDIO_SYNC_CLK 0x38
+
+#define PMC_CTRL 0x0
+#define PMC_CTRL_BLINK_ENB 7
+#define PMC_DPD_PADS_ORIDE 0x1c
+#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
+#define PMC_BLINK_TIMER 0x40
+
+/* Tegra CPU clock and reset control regs */
+#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX         0x4c
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET     0x340
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR     0x344
+
+#define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
+#define CPU_RESET(cpu) (0x1111ul << (cpu))
+
+#ifdef CONFIG_PM_SLEEP
+static struct cpu_clk_suspend_context {
+       u32 pllx_misc;
+       u32 pllx_base;
+
+       u32 cpu_burst;
+       u32 clk_csite_src;
+       u32 cclk_divider;
+} tegra20_cpu_clk_sctx;
+#endif
+
+static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32];
+
+static void __iomem *clk_base;
+static void __iomem *pmc_base;
+
+static DEFINE_SPINLOCK(pll_div_lock);
+
+#define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset,        \
+                           _clk_num, _regs, _gate_flags, _clk_id)      \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP,      \
+                       _regs, _clk_num, periph_clk_enb_refcnt,         \
+                       _gate_flags, _clk_id)
+
+#define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset,        \
+                           _clk_num, _regs, _gate_flags, _clk_id)      \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,    \
+                       _clk_num, periph_clk_enb_refcnt, _gate_flags,   \
+                       _clk_id)
+
+#define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \
+                             _clk_num, _regs, _gate_flags, _clk_id)    \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP, _regs, \
+                       _clk_num, periph_clk_enb_refcnt, _gate_flags,   \
+                       _clk_id)
+
+#define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \
+                             _mux_shift, _mux_width, _clk_num, _regs,  \
+                             _gate_flags, _clk_id)                     \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       _mux_shift, _mux_width, 0, 0, 0, 0, 0, _regs,   \
+                       _clk_num, periph_clk_enb_refcnt, _gate_flags,   \
+                       _clk_id)
+
+/* IDs assigned here must be in sync with DT bindings definition
+ * for Tegra20 clocks .
+ */
+enum tegra20_clk {
+       cpu, ac97 = 3, rtc, timer, uarta, gpio = 8, sdmmc2, i2s1 = 11, i2c1,
+       ndflash, sdmmc1, sdmmc4, twc, pwm, i2s2, epp, gr2d = 21, usbd, isp,
+       gr3d, ide, disp2, disp1, host1x, vcp, cache2 = 31, mem, ahbdma, apbdma,
+       kbc = 36, stat_mon, pmc, fuse, kfuse, sbc1, nor, spi, sbc2, xio, sbc3,
+       dvc, dsi, mipi = 50, hdmi, csi, tvdac, i2c2, uartc, emc = 57, usb2,
+       usb3, mpe, vde, bsea, bsev, speedo, uartd, uarte, i2c3, sbc4, sdmmc3,
+       pex, owr, afi, csite, pcie_xclk, avpucq = 75, la, irama = 84, iramb,
+       iramc, iramd, cram2, audio_2x, clk_d, csus = 92, cdev1, cdev2,
+       uartb = 96, vfir, spdif_in, spdif_out, vi, vi_sensor, tvo, cve,
+       osc, clk_32k, clk_m, sclk, cclk, hclk, pclk, blink, pll_a, pll_a_out0,
+       pll_c, pll_c_out1, pll_d, pll_d_out0, pll_e, pll_m, pll_m_out1,
+       pll_p, pll_p_out1, pll_p_out2, pll_p_out3, pll_p_out4, pll_u,
+       pll_x, audio, pll_ref, twd, clk_max,
+};
+
+static struct clk *clks[clk_max];
+static struct clk_onecell_data clk_data;
+
+static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
+       { 12000000, 600000000, 600, 12, 1, 8 },
+       { 13000000, 600000000, 600, 13, 1, 8 },
+       { 19200000, 600000000, 500, 16, 1, 6 },
+       { 26000000, 600000000, 600, 26, 1, 8 },
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
+       { 12000000, 666000000, 666, 12, 1, 8},
+       { 13000000, 666000000, 666, 13, 1, 8},
+       { 19200000, 666000000, 555, 16, 1, 8},
+       { 26000000, 666000000, 666, 26, 1, 8},
+       { 12000000, 600000000, 600, 12, 1, 8},
+       { 13000000, 600000000, 600, 13, 1, 8},
+       { 19200000, 600000000, 375, 12, 1, 6},
+       { 26000000, 600000000, 600, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
+       { 12000000, 216000000, 432, 12, 2, 8},
+       { 13000000, 216000000, 432, 13, 2, 8},
+       { 19200000, 216000000, 90,   4, 2, 1},
+       { 26000000, 216000000, 432, 26, 2, 8},
+       { 12000000, 432000000, 432, 12, 1, 8},
+       { 13000000, 432000000, 432, 13, 1, 8},
+       { 19200000, 432000000, 90,   4, 1, 1},
+       { 26000000, 432000000, 432, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
+       { 28800000, 56448000, 49, 25, 1, 1},
+       { 28800000, 73728000, 64, 25, 1, 1},
+       { 28800000, 24000000,  5,  6, 1, 1},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
+       { 12000000, 216000000, 216, 12, 1, 4},
+       { 13000000, 216000000, 216, 13, 1, 4},
+       { 19200000, 216000000, 135, 12, 1, 3},
+       { 26000000, 216000000, 216, 26, 1, 4},
+
+       { 12000000, 594000000, 594, 12, 1, 8},
+       { 13000000, 594000000, 594, 13, 1, 8},
+       { 19200000, 594000000, 495, 16, 1, 8},
+       { 26000000, 594000000, 594, 26, 1, 8},
+
+       { 12000000, 1000000000, 1000, 12, 1, 12},
+       { 13000000, 1000000000, 1000, 13, 1, 12},
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 12},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
+       { 12000000, 480000000, 960, 12, 2, 0},
+       { 13000000, 480000000, 960, 13, 2, 0},
+       { 19200000, 480000000, 200, 4,  2, 0},
+       { 26000000, 480000000, 960, 26, 2, 0},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
+       /* 1 GHz */
+       { 12000000, 1000000000, 1000, 12, 1, 12},
+       { 13000000, 1000000000, 1000, 13, 1, 12},
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 12},
+
+       /* 912 MHz */
+       { 12000000, 912000000,  912,  12, 1, 12},
+       { 13000000, 912000000,  912,  13, 1, 12},
+       { 19200000, 912000000,  760,  16, 1, 8},
+       { 26000000, 912000000,  912,  26, 1, 12},
+
+       /* 816 MHz */
+       { 12000000, 816000000,  816,  12, 1, 12},
+       { 13000000, 816000000,  816,  13, 1, 12},
+       { 19200000, 816000000,  680,  16, 1, 8},
+       { 26000000, 816000000,  816,  26, 1, 12},
+
+       /* 760 MHz */
+       { 12000000, 760000000,  760,  12, 1, 12},
+       { 13000000, 760000000,  760,  13, 1, 12},
+       { 19200000, 760000000,  950,  24, 1, 8},
+       { 26000000, 760000000,  760,  26, 1, 12},
+
+       /* 750 MHz */
+       { 12000000, 750000000,  750,  12, 1, 12},
+       { 13000000, 750000000,  750,  13, 1, 12},
+       { 19200000, 750000000,  625,  16, 1, 8},
+       { 26000000, 750000000,  750,  26, 1, 12},
+
+       /* 608 MHz */
+       { 12000000, 608000000,  608,  12, 1, 12},
+       { 13000000, 608000000,  608,  13, 1, 12},
+       { 19200000, 608000000,  380,  12, 1, 8},
+       { 26000000, 608000000,  608,  26, 1, 12},
+
+       /* 456 MHz */
+       { 12000000, 456000000,  456,  12, 1, 12},
+       { 13000000, 456000000,  456,  13, 1, 12},
+       { 19200000, 456000000,  380,  16, 1, 8},
+       { 26000000, 456000000,  456,  26, 1, 12},
+
+       /* 312 MHz */
+       { 12000000, 312000000,  312,  12, 1, 12},
+       { 13000000, 312000000,  312,  13, 1, 12},
+       { 19200000, 312000000,  260,  16, 1, 8},
+       { 26000000, 312000000,  312,  26, 1, 12},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
+       { 12000000, 100000000,  200,  24, 1, 0 },
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+/* PLL parameters */
+static struct tegra_clk_pll_params pll_c_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1400000000,
+       .base_reg = PLLC_BASE,
+       .misc_reg = PLLC_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_m_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1200000000,
+       .base_reg = PLLM_BASE,
+       .misc_reg = PLLM_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_p_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1400000000,
+       .base_reg = PLLP_BASE,
+       .misc_reg = PLLP_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_a_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1400000000,
+       .base_reg = PLLA_BASE,
+       .misc_reg = PLLA_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_d_params = {
+       .input_min = 2000000,
+       .input_max = 40000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 40000000,
+       .vco_max = 1000000000,
+       .base_reg = PLLD_BASE,
+       .misc_reg = PLLD_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
+       .lock_delay = 1000,
+};
+
+static struct tegra_clk_pll_params pll_u_params = {
+       .input_min = 2000000,
+       .input_max = 40000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 48000000,
+       .vco_max = 960000000,
+       .base_reg = PLLU_BASE,
+       .misc_reg = PLLU_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
+       .lock_delay = 1000,
+};
+
+static struct tegra_clk_pll_params pll_x_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1200000000,
+       .base_reg = PLLX_BASE,
+       .misc_reg = PLLX_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_e_params = {
+       .input_min = 12000000,
+       .input_max = 12000000,
+       .cf_min = 0,
+       .cf_max = 0,
+       .vco_min = 0,
+       .vco_max = 0,
+       .base_reg = PLLE_BASE,
+       .misc_reg = PLLE_MISC,
+       .lock_bit_idx = PLLE_MISC_LOCK,
+       .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
+       .lock_delay = 0,
+};
+
+/* Peripheral clock registers */
+static struct tegra_clk_periph_regs periph_l_regs = {
+       .enb_reg = CLK_OUT_ENB_L,
+       .enb_set_reg = CLK_OUT_ENB_SET_L,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_L,
+       .rst_reg = RST_DEVICES_L,
+       .rst_set_reg = RST_DEVICES_SET_L,
+       .rst_clr_reg = RST_DEVICES_CLR_L,
+};
+
+static struct tegra_clk_periph_regs periph_h_regs = {
+       .enb_reg = CLK_OUT_ENB_H,
+       .enb_set_reg = CLK_OUT_ENB_SET_H,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_H,
+       .rst_reg = RST_DEVICES_H,
+       .rst_set_reg = RST_DEVICES_SET_H,
+       .rst_clr_reg = RST_DEVICES_CLR_H,
+};
+
+static struct tegra_clk_periph_regs periph_u_regs = {
+       .enb_reg = CLK_OUT_ENB_U,
+       .enb_set_reg = CLK_OUT_ENB_SET_U,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_U,
+       .rst_reg = RST_DEVICES_U,
+       .rst_set_reg = RST_DEVICES_SET_U,
+       .rst_clr_reg = RST_DEVICES_CLR_U,
+};
+
+static unsigned long tegra20_clk_measure_input_freq(void)
+{
+       u32 osc_ctrl = readl_relaxed(clk_base + OSC_CTRL);
+       u32 auto_clk_control = osc_ctrl & OSC_CTRL_OSC_FREQ_MASK;
+       u32 pll_ref_div = osc_ctrl & OSC_CTRL_PLL_REF_DIV_MASK;
+       unsigned long input_freq;
+
+       switch (auto_clk_control) {
+       case OSC_CTRL_OSC_FREQ_12MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 12000000;
+               break;
+       case OSC_CTRL_OSC_FREQ_13MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 13000000;
+               break;
+       case OSC_CTRL_OSC_FREQ_19_2MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 19200000;
+               break;
+       case OSC_CTRL_OSC_FREQ_26MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 26000000;
+               break;
+       default:
+               pr_err("Unexpected clock autodetect value %d",
+                      auto_clk_control);
+               BUG();
+               return 0;
+       }
+
+       return input_freq;
+}
+
+static unsigned int tegra20_get_pll_ref_div(void)
+{
+       u32 pll_ref_div = readl_relaxed(clk_base + OSC_CTRL) &
+               OSC_CTRL_PLL_REF_DIV_MASK;
+
+       switch (pll_ref_div) {
+       case OSC_CTRL_PLL_REF_DIV_1:
+               return 1;
+       case OSC_CTRL_PLL_REF_DIV_2:
+               return 2;
+       case OSC_CTRL_PLL_REF_DIV_4:
+               return 4;
+       default:
+               pr_err("Invalied pll ref divider %d\n", pll_ref_div);
+               BUG();
+       }
+       return 0;
+}
+
+static void tegra20_pll_init(void)
+{
+       struct clk *clk;
+
+       /* PLLC */
+       clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, NULL, 0,
+                           0, &pll_c_params, TEGRA_PLL_HAS_CPCON,
+                           pll_c_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_c", NULL);
+       clks[pll_c] = clk;
+
+       /* PLLC_OUT1 */
+       clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
+                               clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, NULL);
+       clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
+                               clk_base + PLLC_OUT, 1, 0, CLK_SET_RATE_PARENT,
+                               0, NULL);
+       clk_register_clkdev(clk, "pll_c_out1", NULL);
+       clks[pll_c_out1] = clk;
+
+       /* PLLP */
+       clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, NULL, 0,
+                           216000000, &pll_p_params, TEGRA_PLL_FIXED |
+                           TEGRA_PLL_HAS_CPCON, pll_p_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_p", NULL);
+       clks[pll_p] = clk;
+
+       /* PLLP_OUT1 */
+       clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p",
+                               clk_base + PLLP_OUTA, 0,
+                               TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div",
+                               clk_base + PLLP_OUTA, 1, 0,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out1", NULL);
+       clks[pll_p_out1] = clk;
+
+       /* PLLP_OUT2 */
+       clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p",
+                               clk_base + PLLP_OUTA, 0,
+                               TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
+                               24, 8, 1, &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div",
+                               clk_base + PLLP_OUTA, 17, 16,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out2", NULL);
+       clks[pll_p_out2] = clk;
+
+       /* PLLP_OUT3 */
+       clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p",
+                               clk_base + PLLP_OUTB, 0,
+                               TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div",
+                               clk_base + PLLP_OUTB, 1, 0,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out3", NULL);
+       clks[pll_p_out3] = clk;
+
+       /* PLLP_OUT4 */
+       clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p",
+                               clk_base + PLLP_OUTB, 0,
+                               TEGRA_DIVIDER_FIXED | TEGRA_DIVIDER_ROUND_UP,
+                               24, 8, 1, &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div",
+                               clk_base + PLLP_OUTB, 17, 16,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out4", NULL);
+       clks[pll_p_out4] = clk;
+
+       /* PLLM */
+       clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, NULL,
+                           CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0,
+                           &pll_m_params, TEGRA_PLL_HAS_CPCON,
+                           pll_m_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_m", NULL);
+       clks[pll_m] = clk;
+
+       /* PLLM_OUT1 */
+       clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m",
+                               clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, NULL);
+       clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div",
+                               clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED |
+                               CLK_SET_RATE_PARENT, 0, NULL);
+       clk_register_clkdev(clk, "pll_m_out1", NULL);
+       clks[pll_m_out1] = clk;
+
+       /* PLLX */
+       clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, NULL, 0,
+                           0, &pll_x_params, TEGRA_PLL_HAS_CPCON,
+                           pll_x_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_x", NULL);
+       clks[pll_x] = clk;
+
+       /* PLLU */
+       clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, NULL, 0,
+                           0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON,
+                           pll_u_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_u", NULL);
+       clks[pll_u] = clk;
+
+       /* PLLD */
+       clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, NULL, 0,
+                           0, &pll_d_params, TEGRA_PLL_HAS_CPCON,
+                           pll_d_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_d", NULL);
+       clks[pll_d] = clk;
+
+       /* PLLD_OUT0 */
+       clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
+                                       CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll_d_out0", NULL);
+       clks[pll_d_out0] = clk;
+
+       /* PLLA */
+       clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, NULL, 0,
+                           0, &pll_a_params, TEGRA_PLL_HAS_CPCON,
+                           pll_a_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_a", NULL);
+       clks[pll_a] = clk;
+
+       /* PLLA_OUT0 */
+       clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a",
+                               clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, NULL);
+       clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div",
+                               clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED |
+                               CLK_SET_RATE_PARENT, 0, NULL);
+       clk_register_clkdev(clk, "pll_a_out0", NULL);
+       clks[pll_a_out0] = clk;
+
+       /* PLLE */
+       clk = tegra_clk_register_plle("pll_e", "pll_ref", clk_base, NULL,
+                            0, 100000000, &pll_e_params,
+                            0, pll_e_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_e", NULL);
+       clks[pll_e] = clk;
+}
+
+static const char *cclk_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
+                                     "pll_p_cclk", "pll_p_out4_cclk",
+                                     "pll_p_out3_cclk", "clk_d", "pll_x" };
+static const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4",
+                                     "pll_p_out3", "pll_p_out2", "clk_d",
+                                     "clk_32k", "pll_m_out1" };
+
+static void tegra20_super_clk_init(void)
+{
+       struct clk *clk;
+
+       /*
+        * DIV_U71 dividers for CCLK, these dividers are used only
+        * if parent clock is fixed rate.
+        */
+
+       /*
+        * Clock input to cclk divided from pll_p using
+        * U71 divider of cclk.
+        */
+       clk = tegra_clk_register_divider("pll_p_cclk", "pll_p",
+                               clk_base + SUPER_CCLK_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_cclk", NULL);
+
+       /*
+        * Clock input to cclk divided from pll_p_out3 using
+        * U71 divider of cclk.
+        */
+       clk = tegra_clk_register_divider("pll_p_out3_cclk", "pll_p_out3",
+                               clk_base + SUPER_CCLK_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_out3_cclk", NULL);
+
+       /*
+        * Clock input to cclk divided from pll_p_out4 using
+        * U71 divider of cclk.
+        */
+       clk = tegra_clk_register_divider("pll_p_out4_cclk", "pll_p_out4",
+                               clk_base + SUPER_CCLK_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_out4_cclk", NULL);
+
+       /* CCLK */
+       clk = tegra_clk_register_super_mux("cclk", cclk_parents,
+                             ARRAY_SIZE(cclk_parents), CLK_SET_RATE_PARENT,
+                             clk_base + CCLK_BURST_POLICY, 0, 4, 0, 0, NULL);
+       clk_register_clkdev(clk, "cclk", NULL);
+       clks[cclk] = clk;
+
+       /* SCLK */
+       clk = tegra_clk_register_super_mux("sclk", sclk_parents,
+                             ARRAY_SIZE(sclk_parents), CLK_SET_RATE_PARENT,
+                             clk_base + SCLK_BURST_POLICY, 0, 4, 0, 0, NULL);
+       clk_register_clkdev(clk, "sclk", NULL);
+       clks[sclk] = clk;
+
+       /* HCLK */
+       clk = clk_register_divider(NULL, "hclk_div", "sclk", 0,
+                                  clk_base + CLK_SYSTEM_RATE, 4, 2, 0, NULL);
+       clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT,
+                               clk_base + CLK_SYSTEM_RATE, 7,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "hclk", NULL);
+       clks[hclk] = clk;
+
+       /* PCLK */
+       clk = clk_register_divider(NULL, "pclk_div", "hclk", 0,
+                                  clk_base + CLK_SYSTEM_RATE, 0, 2, 0, NULL);
+       clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT,
+                               clk_base + CLK_SYSTEM_RATE, 3,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "pclk", NULL);
+       clks[pclk] = clk;
+
+       /* twd */
+       clk = clk_register_fixed_factor(NULL, "twd", "cclk", 0, 1, 4);
+       clk_register_clkdev(clk, "twd", NULL);
+       clks[twd] = clk;
+}
+
+static const char *audio_parents[] = {"spdif_in", "i2s1", "i2s2", "unused",
+                                     "pll_a_out0", "unused", "unused",
+                                     "unused"};
+
+static void __init tegra20_audio_clk_init(void)
+{
+       struct clk *clk;
+
+       /* audio */
+       clk = clk_register_mux(NULL, "audio_mux", audio_parents,
+                               ARRAY_SIZE(audio_parents), 0,
+                               clk_base + AUDIO_SYNC_CLK, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "audio", "audio_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "audio", NULL);
+       clks[audio] = clk;
+
+       /* audio_2x */
+       clk = clk_register_fixed_factor(NULL, "audio_doubler", "audio",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_periph_gate("audio_2x", "audio_doubler",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 89, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "audio_2x", NULL);
+       clks[audio_2x] = clk;
+
+}
+
+static const char *i2s1_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
+                                    "clk_m"};
+static const char *i2s2_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
+                                    "clk_m"};
+static const char *spdif_out_parents[] = {"pll_a_out0", "audio_2x", "pll_p",
+                                         "clk_m"};
+static const char *spdif_in_parents[] = {"pll_p", "pll_c", "pll_m"};
+static const char *pwm_parents[] = {"pll_p", "pll_c", "audio", "clk_m",
+                                   "clk_32k"};
+static const char *mux_pllpcm_clkm[] = {"pll_p", "pll_c", "pll_m", "clk_m"};
+static const char *mux_pllmcpa[] = {"pll_m", "pll_c", "pll_c", "pll_a"};
+static const char *mux_pllpdc_clkm[] = {"pll_p", "pll_d_out0", "pll_c",
+                                       "clk_m"};
+static const char *mux_pllmcp_clkm[] = {"pll_m", "pll_c", "pll_p", "clk_m"};
+
+static struct tegra_periph_init_data tegra_periph_clk_list[] = {
+       TEGRA_INIT_DATA_MUX("i2s1",     NULL,           "tegra20-i2s.0", i2s1_parents,      CLK_SOURCE_I2S1,      11,   &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s1),
+       TEGRA_INIT_DATA_MUX("i2s2",     NULL,           "tegra20-i2s.1", i2s2_parents,      CLK_SOURCE_I2S2,      18,   &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s2),
+       TEGRA_INIT_DATA_MUX("spdif_out", "spdif_out",   "tegra20-spdif", spdif_out_parents, CLK_SOURCE_SPDIF_OUT, 10,   &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_out),
+       TEGRA_INIT_DATA_MUX("spdif_in", "spdif_in",     "tegra20-spdif", spdif_in_parents,  CLK_SOURCE_SPDIF_IN,  10,   &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_in),
+       TEGRA_INIT_DATA_MUX("sbc1",     NULL,           "spi_tegra.0",   mux_pllpcm_clkm,   CLK_SOURCE_SBC1,      41,   &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc1),
+       TEGRA_INIT_DATA_MUX("sbc2",     NULL,           "spi_tegra.1",   mux_pllpcm_clkm,   CLK_SOURCE_SBC2,      44,   &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc2),
+       TEGRA_INIT_DATA_MUX("sbc3",     NULL,           "spi_tegra.2",   mux_pllpcm_clkm,   CLK_SOURCE_SBC3,      46,   &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc3),
+       TEGRA_INIT_DATA_MUX("sbc4",     NULL,           "spi_tegra.3",   mux_pllpcm_clkm,   CLK_SOURCE_SBC4,      68,   &periph_u_regs, TEGRA_PERIPH_ON_APB, sbc4),
+       TEGRA_INIT_DATA_MUX("spi",      NULL,           "spi",           mux_pllpcm_clkm,   CLK_SOURCE_SPI,       43,   &periph_h_regs, TEGRA_PERIPH_ON_APB, spi),
+       TEGRA_INIT_DATA_MUX("xio",      NULL,           "xio",           mux_pllpcm_clkm,   CLK_SOURCE_XIO,       45,   &periph_h_regs, 0, xio),
+       TEGRA_INIT_DATA_MUX("twc",      NULL,           "twc",           mux_pllpcm_clkm,   CLK_SOURCE_TWC,       16,   &periph_l_regs, TEGRA_PERIPH_ON_APB, twc),
+       TEGRA_INIT_DATA_MUX("ide",      NULL,           "ide",           mux_pllpcm_clkm,   CLK_SOURCE_XIO,       25,   &periph_l_regs, 0, ide),
+       TEGRA_INIT_DATA_MUX("ndflash",  NULL,           "tegra_nand",    mux_pllpcm_clkm,   CLK_SOURCE_NDFLASH,   13,   &periph_l_regs, 0, ndflash),
+       TEGRA_INIT_DATA_MUX("vfir",     NULL,           "vfir",          mux_pllpcm_clkm,   CLK_SOURCE_VFIR,      7,    &periph_l_regs, TEGRA_PERIPH_ON_APB, vfir),
+       TEGRA_INIT_DATA_MUX("csite",    NULL,           "csite",         mux_pllpcm_clkm,   CLK_SOURCE_CSITE,     73,   &periph_u_regs, 0, csite),
+       TEGRA_INIT_DATA_MUX("la",       NULL,           "la",            mux_pllpcm_clkm,   CLK_SOURCE_LA,        76,   &periph_u_regs, 0, la),
+       TEGRA_INIT_DATA_MUX("owr",      NULL,           "tegra_w1",      mux_pllpcm_clkm,   CLK_SOURCE_OWR,       71,   &periph_u_regs, TEGRA_PERIPH_ON_APB, owr),
+       TEGRA_INIT_DATA_MUX("mipi",     NULL,           "mipi",          mux_pllpcm_clkm,   CLK_SOURCE_MIPI,      50,   &periph_h_regs, TEGRA_PERIPH_ON_APB, mipi),
+       TEGRA_INIT_DATA_MUX("vde",      NULL,           "vde",           mux_pllpcm_clkm,   CLK_SOURCE_VDE,       61,   &periph_h_regs, 0, vde),
+       TEGRA_INIT_DATA_MUX("vi",       "vi",           "tegra_camera",  mux_pllmcpa,       CLK_SOURCE_VI,        20,   &periph_l_regs, 0, vi),
+       TEGRA_INIT_DATA_MUX("epp",      NULL,           "epp",           mux_pllmcpa,       CLK_SOURCE_EPP,       19,   &periph_l_regs, 0, epp),
+       TEGRA_INIT_DATA_MUX("mpe",      NULL,           "mpe",           mux_pllmcpa,       CLK_SOURCE_MPE,       60,   &periph_h_regs, 0, mpe),
+       TEGRA_INIT_DATA_MUX("host1x",   NULL,           "host1x",        mux_pllmcpa,       CLK_SOURCE_HOST1X,    28,   &periph_l_regs, 0, host1x),
+       TEGRA_INIT_DATA_MUX("3d",       NULL,           "3d",            mux_pllmcpa,       CLK_SOURCE_3D,        24,   &periph_l_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d),
+       TEGRA_INIT_DATA_MUX("2d",       NULL,           "2d",            mux_pllmcpa,       CLK_SOURCE_2D,        21,   &periph_l_regs, 0, gr2d),
+       TEGRA_INIT_DATA_MUX("nor",      NULL,           "tegra-nor",     mux_pllpcm_clkm,   CLK_SOURCE_NOR,       42,   &periph_h_regs, 0, nor),
+       TEGRA_INIT_DATA_MUX("sdmmc1",   NULL,           "sdhci-tegra.0", mux_pllpcm_clkm,   CLK_SOURCE_SDMMC1,    14,   &periph_l_regs, 0, sdmmc1),
+       TEGRA_INIT_DATA_MUX("sdmmc2",   NULL,           "sdhci-tegra.1", mux_pllpcm_clkm,   CLK_SOURCE_SDMMC2,    9,    &periph_l_regs, 0, sdmmc2),
+       TEGRA_INIT_DATA_MUX("sdmmc3",   NULL,           "sdhci-tegra.2", mux_pllpcm_clkm,   CLK_SOURCE_SDMMC3,    69,   &periph_u_regs, 0, sdmmc3),
+       TEGRA_INIT_DATA_MUX("sdmmc4",   NULL,           "sdhci-tegra.3", mux_pllpcm_clkm,   CLK_SOURCE_SDMMC4,    15,   &periph_l_regs, 0, sdmmc4),
+       TEGRA_INIT_DATA_MUX("cve",      NULL,           "cve",           mux_pllpdc_clkm,   CLK_SOURCE_CVE,       49,   &periph_h_regs, 0, cve),
+       TEGRA_INIT_DATA_MUX("tvo",      NULL,           "tvo",           mux_pllpdc_clkm,   CLK_SOURCE_TVO,       49,   &periph_h_regs, 0, tvo),
+       TEGRA_INIT_DATA_MUX("tvdac",    NULL,           "tvdac",         mux_pllpdc_clkm,   CLK_SOURCE_TVDAC,     53,   &periph_h_regs, 0, tvdac),
+       TEGRA_INIT_DATA_MUX("vi_sensor", "vi_sensor",   "tegra_camera",  mux_pllmcpa,       CLK_SOURCE_VI_SENSOR, 20,   &periph_l_regs, TEGRA_PERIPH_NO_RESET, vi_sensor),
+       TEGRA_INIT_DATA_DIV16("i2c1",   "div-clk",      "tegra-i2c.0",   mux_pllpcm_clkm,   CLK_SOURCE_I2C1,      12,   &periph_l_regs, TEGRA_PERIPH_ON_APB, i2c1),
+       TEGRA_INIT_DATA_DIV16("i2c2",   "div-clk",      "tegra-i2c.1",   mux_pllpcm_clkm,   CLK_SOURCE_I2C2,      54,   &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c2),
+       TEGRA_INIT_DATA_DIV16("i2c3",   "div-clk",      "tegra-i2c.2",   mux_pllpcm_clkm,   CLK_SOURCE_I2C3,      67,   &periph_u_regs, TEGRA_PERIPH_ON_APB, i2c3),
+       TEGRA_INIT_DATA_DIV16("dvc",    "div-clk",      "tegra-i2c.3",   mux_pllpcm_clkm,   CLK_SOURCE_DVC,       47,   &periph_h_regs, TEGRA_PERIPH_ON_APB, dvc),
+       TEGRA_INIT_DATA_MUX("hdmi",     NULL,           "hdmi",          mux_pllpdc_clkm,   CLK_SOURCE_HDMI,      51,   &periph_h_regs, 0, hdmi),
+       TEGRA_INIT_DATA("pwm",          NULL,           "tegra-pwm",     pwm_parents,       CLK_SOURCE_PWM,       28, 3, 0, 0, 8, 1, 0, &periph_l_regs, 17, periph_clk_enb_refcnt, TEGRA_PERIPH_ON_APB, pwm),
+};
+
+static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = {
+       TEGRA_INIT_DATA_NODIV("uarta",  NULL, "tegra_uart.0", mux_pllpcm_clkm, CLK_SOURCE_UARTA, 30, 2, 6,  &periph_l_regs, TEGRA_PERIPH_ON_APB, uarta),
+       TEGRA_INIT_DATA_NODIV("uartb",  NULL, "tegra_uart.1", mux_pllpcm_clkm, CLK_SOURCE_UARTB, 30, 2, 7,  &periph_l_regs, TEGRA_PERIPH_ON_APB, uartb),
+       TEGRA_INIT_DATA_NODIV("uartc",  NULL, "tegra_uart.2", mux_pllpcm_clkm, CLK_SOURCE_UARTC, 30, 2, 55, &periph_h_regs, TEGRA_PERIPH_ON_APB, uartc),
+       TEGRA_INIT_DATA_NODIV("uartd",  NULL, "tegra_uart.3", mux_pllpcm_clkm, CLK_SOURCE_UARTD, 30, 2, 65, &periph_u_regs, TEGRA_PERIPH_ON_APB, uartd),
+       TEGRA_INIT_DATA_NODIV("uarte",  NULL, "tegra_uart.4", mux_pllpcm_clkm, CLK_SOURCE_UARTE, 30, 2, 66, &periph_u_regs, TEGRA_PERIPH_ON_APB, uarte),
+       TEGRA_INIT_DATA_NODIV("disp1",  NULL, "tegradc.0",    mux_pllpdc_clkm, CLK_SOURCE_DISP1, 30, 2, 27, &periph_l_regs, 0, disp1),
+       TEGRA_INIT_DATA_NODIV("disp2",  NULL, "tegradc.1",    mux_pllpdc_clkm, CLK_SOURCE_DISP2, 30, 2, 26, &periph_l_regs, 0, disp2),
+};
+
+static void __init tegra20_periph_clk_init(void)
+{
+       struct tegra_periph_init_data *data;
+       struct clk *clk;
+       int i;
+
+       /* apbdma */
+       clk = tegra_clk_register_periph_gate("apbdma", "pclk", 0, clk_base,
+                                   0, 34, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-apbdma");
+       clks[apbdma] = clk;
+
+       /* rtc */
+       clk = tegra_clk_register_periph_gate("rtc", "clk_32k",
+                                   TEGRA_PERIPH_NO_RESET,
+                                   clk_base, 0, 4, &periph_l_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "rtc-tegra");
+       clks[rtc] = clk;
+
+       /* timer */
+       clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base,
+                                   0, 5, &periph_l_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "timer");
+       clks[timer] = clk;
+
+       /* kbc */
+       clk = tegra_clk_register_periph_gate("kbc", "clk_32k",
+                                   TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 36, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-kbc");
+       clks[kbc] = clk;
+
+       /* csus */
+       clk = tegra_clk_register_periph_gate("csus", "clk_m",
+                                   TEGRA_PERIPH_NO_RESET,
+                                   clk_base, 0, 92, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "csus", "tengra_camera");
+       clks[csus] = clk;
+
+       /* vcp */
+       clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0,
+                                   clk_base, 0, 29, &periph_l_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "vcp", "tegra-avp");
+       clks[vcp] = clk;
+
+       /* bsea */
+       clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0,
+                                   clk_base, 0, 62, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "bsea", "tegra-avp");
+       clks[bsea] = clk;
+
+       /* bsev */
+       clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0,
+                                   clk_base, 0, 63, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "bsev", "tegra-aes");
+       clks[bsev] = clk;
+
+       /* emc */
+       clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm,
+                              ARRAY_SIZE(mux_pllmcp_clkm), 0,
+                              clk_base + CLK_SOURCE_EMC,
+                              30, 2, 0, NULL);
+       clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0,
+                                   57, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "emc", NULL);
+       clks[emc] = clk;
+
+       /* usbd */
+       clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base, 0,
+                                   22, &periph_l_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "fsl-tegra-udc");
+       clks[usbd] = clk;
+
+       /* usb2 */
+       clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base, 0,
+                                   58, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-ehci.1");
+       clks[usb2] = clk;
+
+       /* usb3 */
+       clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base, 0,
+                                   59, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-ehci.2");
+       clks[usb3] = clk;
+
+       /* dsi */
+       clk = tegra_clk_register_periph_gate("dsi", "pll_d", 0, clk_base, 0,
+                                   48, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "dsi");
+       clks[dsi] = clk;
+
+       /* csi */
+       clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base,
+                                   0, 52, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "csi", "tegra_camera");
+       clks[csi] = clk;
+
+       /* isp */
+       clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0, 23,
+                                   &periph_l_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "isp", "tegra_camera");
+       clks[isp] = clk;
+
+       /* pex */
+       clk = tegra_clk_register_periph_gate("pex", "clk_m", 0, clk_base, 0, 70,
+                                   &periph_u_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "pex", NULL);
+       clks[pex] = clk;
+
+       /* afi */
+       clk = tegra_clk_register_periph_gate("afi", "clk_m", 0, clk_base, 0, 72,
+                                   &periph_u_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "afi", NULL);
+       clks[afi] = clk;
+
+       /* pcie_xclk */
+       clk = tegra_clk_register_periph_gate("pcie_xclk", "clk_m", 0, clk_base,
+                                   0, 74, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "pcie_xclk", NULL);
+       clks[pcie_xclk] = clk;
+
+       /* cdev1 */
+       clk = clk_register_fixed_rate(NULL, "cdev1_fixed", NULL, CLK_IS_ROOT,
+                                     26000000);
+       clk = tegra_clk_register_periph_gate("cdev1", "cdev1_fixed", 0,
+                                   clk_base, 0, 94, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "cdev1", NULL);
+       clks[cdev1] = clk;
+
+       /* cdev2 */
+       clk = clk_register_fixed_rate(NULL, "cdev2_fixed", NULL, CLK_IS_ROOT,
+                                     26000000);
+       clk = tegra_clk_register_periph_gate("cdev2", "cdev2_fixed", 0,
+                                   clk_base, 0, 93, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "cdev2", NULL);
+       clks[cdev2] = clk;
+
+       for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
+               data = &tegra_periph_clk_list[i];
+               clk = tegra_clk_register_periph(data->name, data->parent_names,
+                               data->num_parents, &data->periph,
+                               clk_base, data->offset);
+               clk_register_clkdev(clk, data->con_id, data->dev_id);
+               clks[data->clk_id] = clk;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) {
+               data = &tegra_periph_nodiv_clk_list[i];
+               clk = tegra_clk_register_periph_nodiv(data->name,
+                                       data->parent_names,
+                                       data->num_parents, &data->periph,
+                                       clk_base, data->offset);
+               clk_register_clkdev(clk, data->con_id, data->dev_id);
+               clks[data->clk_id] = clk;
+       }
+}
+
+
+static void __init tegra20_fixed_clk_init(void)
+{
+       struct clk *clk;
+
+       /* clk_32k */
+       clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT,
+                                     32768);
+       clk_register_clkdev(clk, "clk_32k", NULL);
+       clks[clk_32k] = clk;
+}
+
+static void __init tegra20_pmc_clk_init(void)
+{
+       struct clk *clk;
+
+       /* blink */
+       writel_relaxed(0, pmc_base + PMC_BLINK_TIMER);
+       clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0,
+                               pmc_base + PMC_DPD_PADS_ORIDE,
+                               PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL);
+       clk = clk_register_gate(NULL, "blink", "blink_override", 0,
+                               pmc_base + PMC_CTRL,
+                               PMC_CTRL_BLINK_ENB, 0, NULL);
+       clk_register_clkdev(clk, "blink", NULL);
+       clks[blink] = clk;
+}
+
+static void __init tegra20_osc_clk_init(void)
+{
+       struct clk *clk;
+       unsigned long input_freq;
+       unsigned int pll_ref_div;
+
+       input_freq = tegra20_clk_measure_input_freq();
+
+       /* clk_m */
+       clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT |
+                                     CLK_IGNORE_UNUSED, input_freq);
+       clk_register_clkdev(clk, "clk_m", NULL);
+       clks[clk_m] = clk;
+
+       /* pll_ref */
+       pll_ref_div = tegra20_get_pll_ref_div();
+       clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m",
+                                       CLK_SET_RATE_PARENT, 1, pll_ref_div);
+       clk_register_clkdev(clk, "pll_ref", NULL);
+       clks[pll_ref] = clk;
+}
+
+/* Tegra20 CPU clock and reset control functions */
+static void tegra20_wait_cpu_in_reset(u32 cpu)
+{
+       unsigned int reg;
+
+       do {
+               reg = readl(clk_base +
+                           TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+               cpu_relax();
+       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
+
+       return;
+}
+
+static void tegra20_put_cpu_in_reset(u32 cpu)
+{
+       writel(CPU_RESET(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+       dmb();
+}
+
+static void tegra20_cpu_out_of_reset(u32 cpu)
+{
+       writel(CPU_RESET(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
+       wmb();
+}
+
+static void tegra20_enable_cpu_clock(u32 cpu)
+{
+       unsigned int reg;
+
+       reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       writel(reg & ~CPU_CLOCK(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       barrier();
+       reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+}
+
+static void tegra20_disable_cpu_clock(u32 cpu)
+{
+       unsigned int reg;
+
+       reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       writel(reg | CPU_CLOCK(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+}
+
+#ifdef CONFIG_PM_SLEEP
+static bool tegra20_cpu_rail_off_ready(void)
+{
+       unsigned int cpu_rst_status;
+
+       cpu_rst_status = readl(clk_base +
+                              TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+
+       return !!(cpu_rst_status & 0x2);
+}
+
+static void tegra20_cpu_clock_suspend(void)
+{
+       /* switch coresite to clk_m, save off original source */
+       tegra20_cpu_clk_sctx.clk_csite_src =
+                               readl(clk_base + CLK_SOURCE_CSITE);
+       writel(3<<30, clk_base + CLK_SOURCE_CSITE);
+
+       tegra20_cpu_clk_sctx.cpu_burst =
+                               readl(clk_base + CCLK_BURST_POLICY);
+       tegra20_cpu_clk_sctx.pllx_base =
+                               readl(clk_base + PLLX_BASE);
+       tegra20_cpu_clk_sctx.pllx_misc =
+                               readl(clk_base + PLLX_MISC);
+       tegra20_cpu_clk_sctx.cclk_divider =
+                               readl(clk_base + SUPER_CCLK_DIVIDER);
+}
+
+static void tegra20_cpu_clock_resume(void)
+{
+       unsigned int reg, policy;
+
+       /* Is CPU complex already running on PLLX? */
+       reg = readl(clk_base + CCLK_BURST_POLICY);
+       policy = (reg >> CCLK_BURST_POLICY_SHIFT) & 0xF;
+
+       if (policy == CCLK_IDLE_POLICY)
+               reg = (reg >> CCLK_IDLE_POLICY_SHIFT) & 0xF;
+       else if (policy == CCLK_RUN_POLICY)
+               reg = (reg >> CCLK_RUN_POLICY_SHIFT) & 0xF;
+       else
+               BUG();
+
+       if (reg != CCLK_BURST_POLICY_PLLX) {
+               /* restore PLLX settings if CPU is on different PLL */
+               writel(tegra20_cpu_clk_sctx.pllx_misc,
+                                       clk_base + PLLX_MISC);
+               writel(tegra20_cpu_clk_sctx.pllx_base,
+                                       clk_base + PLLX_BASE);
+
+               /* wait for PLL stabilization if PLLX was enabled */
+               if (tegra20_cpu_clk_sctx.pllx_base & (1 << 30))
+                       udelay(300);
+       }
+
+       /*
+        * Restore original burst policy setting for calls resulting from CPU
+        * LP2 in idle or system suspend.
+        */
+       writel(tegra20_cpu_clk_sctx.cclk_divider,
+                                       clk_base + SUPER_CCLK_DIVIDER);
+       writel(tegra20_cpu_clk_sctx.cpu_burst,
+                                       clk_base + CCLK_BURST_POLICY);
+
+       writel(tegra20_cpu_clk_sctx.clk_csite_src,
+                                       clk_base + CLK_SOURCE_CSITE);
+}
+#endif
+
+static struct tegra_cpu_car_ops tegra20_cpu_car_ops = {
+       .wait_for_reset = tegra20_wait_cpu_in_reset,
+       .put_in_reset   = tegra20_put_cpu_in_reset,
+       .out_of_reset   = tegra20_cpu_out_of_reset,
+       .enable_clock   = tegra20_enable_cpu_clock,
+       .disable_clock  = tegra20_disable_cpu_clock,
+#ifdef CONFIG_PM_SLEEP
+       .rail_off_ready = tegra20_cpu_rail_off_ready,
+       .suspend        = tegra20_cpu_clock_suspend,
+       .resume         = tegra20_cpu_clock_resume,
+#endif
+};
+
+static __initdata struct tegra_clk_init_table init_table[] = {
+       {pll_p, clk_max, 216000000, 1},
+       {pll_p_out1, clk_max, 28800000, 1},
+       {pll_p_out2, clk_max, 48000000, 1},
+       {pll_p_out3, clk_max, 72000000, 1},
+       {pll_p_out4, clk_max, 24000000, 1},
+       {pll_c, clk_max, 600000000, 1},
+       {pll_c_out1, clk_max, 120000000, 1},
+       {sclk, pll_c_out1, 0, 1},
+       {hclk, clk_max, 0, 1},
+       {pclk, clk_max, 60000000, 1},
+       {csite, clk_max, 0, 1},
+       {emc, clk_max, 0, 1},
+       {cclk, clk_max, 0, 1},
+       {uarta, pll_p, 0, 1},
+       {uartd, pll_p, 0, 1},
+       {usbd, clk_max, 12000000, 0},
+       {usb2, clk_max, 12000000, 0},
+       {usb3, clk_max, 12000000, 0},
+       {pll_a, clk_max, 56448000, 1},
+       {pll_a_out0, clk_max, 11289600, 1},
+       {cdev1, clk_max, 0, 1},
+       {blink, clk_max, 32768, 1},
+       {i2s1, pll_a_out0, 11289600, 0},
+       {i2s2, pll_a_out0, 11289600, 0},
+       {sdmmc1, pll_p, 48000000, 0},
+       {sdmmc3, pll_p, 48000000, 0},
+       {sdmmc4, pll_p, 48000000, 0},
+       {spi, pll_p, 20000000, 0},
+       {sbc1, pll_p, 100000000, 0},
+       {sbc2, pll_p, 100000000, 0},
+       {sbc3, pll_p, 100000000, 0},
+       {sbc4, pll_p, 100000000, 0},
+       {host1x, pll_c, 150000000, 0},
+       {disp1, pll_p, 600000000, 0},
+       {disp2, pll_p, 600000000, 0},
+       {clk_max, clk_max, 0, 0}, /* This MUST be the last entry */
+};
+
+/*
+ * Some clocks may be used by different drivers depending on the board
+ * configuration.  List those here to register them twice in the clock lookup
+ * table under two names.
+ */
+static struct tegra_clk_duplicate tegra_clk_duplicates[] = {
+       TEGRA_CLK_DUPLICATE(usbd,   "utmip-pad",    NULL),
+       TEGRA_CLK_DUPLICATE(usbd,   "tegra-ehci.0", NULL),
+       TEGRA_CLK_DUPLICATE(usbd,   "tegra-otg",    NULL),
+       TEGRA_CLK_DUPLICATE(cclk,   NULL,           "cpu"),
+       TEGRA_CLK_DUPLICATE(twd,    "smp_twd",      NULL),
+       TEGRA_CLK_DUPLICATE(clk_max, NULL, NULL), /* Must be the last entry */
+};
+
+static const struct of_device_id pmc_match[] __initconst = {
+       { .compatible = "nvidia,tegra20-pmc" },
+       {},
+};
+
+void __init tegra20_clock_init(struct device_node *np)
+{
+       int i;
+       struct device_node *node;
+
+       clk_base = of_iomap(np, 0);
+       if (!clk_base) {
+               pr_err("Can't map CAR registers\n");
+               BUG();
+       }
+
+       node = of_find_matching_node(NULL, pmc_match);
+       if (!node) {
+               pr_err("Failed to find pmc node\n");
+               BUG();
+       }
+
+       pmc_base = of_iomap(node, 0);
+       if (!pmc_base) {
+               pr_err("Can't map pmc registers\n");
+               BUG();
+       }
+
+       tegra20_osc_clk_init();
+       tegra20_pmc_clk_init();
+       tegra20_fixed_clk_init();
+       tegra20_pll_init();
+       tegra20_super_clk_init();
+       tegra20_periph_clk_init();
+       tegra20_audio_clk_init();
+
+
+       for (i = 0; i < ARRAY_SIZE(clks); i++) {
+               if (IS_ERR(clks[i])) {
+                       pr_err("Tegra20 clk %d: register failed with %ld\n",
+                              i, PTR_ERR(clks[i]));
+                       BUG();
+               }
+               if (!clks[i])
+                       clks[i] = ERR_PTR(-EINVAL);
+       }
+
+       tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max);
+
+       clk_data.clks = clks;
+       clk_data.clk_num = ARRAY_SIZE(clks);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+
+       tegra_init_from_table(init_table, clks, clk_max);
+
+       tegra_cpu_car_ops = &tegra20_cpu_car_ops;
+}
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c
new file mode 100644 (file)
index 0000000..a163812
--- /dev/null
@@ -0,0 +1,1987 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/clk/tegra.h>
+
+#include <mach/powergate.h>
+
+#include "clk.h"
+
+#define RST_DEVICES_L 0x004
+#define RST_DEVICES_H 0x008
+#define RST_DEVICES_U 0x00c
+#define RST_DEVICES_V 0x358
+#define RST_DEVICES_W 0x35c
+#define RST_DEVICES_SET_L 0x300
+#define RST_DEVICES_CLR_L 0x304
+#define RST_DEVICES_SET_H 0x308
+#define RST_DEVICES_CLR_H 0x30c
+#define RST_DEVICES_SET_U 0x310
+#define RST_DEVICES_CLR_U 0x314
+#define RST_DEVICES_SET_V 0x430
+#define RST_DEVICES_CLR_V 0x434
+#define RST_DEVICES_SET_W 0x438
+#define RST_DEVICES_CLR_W 0x43c
+#define RST_DEVICES_NUM 5
+
+#define CLK_OUT_ENB_L 0x010
+#define CLK_OUT_ENB_H 0x014
+#define CLK_OUT_ENB_U 0x018
+#define CLK_OUT_ENB_V 0x360
+#define CLK_OUT_ENB_W 0x364
+#define CLK_OUT_ENB_SET_L 0x320
+#define CLK_OUT_ENB_CLR_L 0x324
+#define CLK_OUT_ENB_SET_H 0x328
+#define CLK_OUT_ENB_CLR_H 0x32c
+#define CLK_OUT_ENB_SET_U 0x330
+#define CLK_OUT_ENB_CLR_U 0x334
+#define CLK_OUT_ENB_SET_V 0x440
+#define CLK_OUT_ENB_CLR_V 0x444
+#define CLK_OUT_ENB_SET_W 0x448
+#define CLK_OUT_ENB_CLR_W 0x44c
+#define CLK_OUT_ENB_NUM 5
+
+#define OSC_CTRL                       0x50
+#define OSC_CTRL_OSC_FREQ_MASK         (0xF<<28)
+#define OSC_CTRL_OSC_FREQ_13MHZ                (0X0<<28)
+#define OSC_CTRL_OSC_FREQ_19_2MHZ      (0X4<<28)
+#define OSC_CTRL_OSC_FREQ_12MHZ                (0X8<<28)
+#define OSC_CTRL_OSC_FREQ_26MHZ                (0XC<<28)
+#define OSC_CTRL_OSC_FREQ_16_8MHZ      (0X1<<28)
+#define OSC_CTRL_OSC_FREQ_38_4MHZ      (0X5<<28)
+#define OSC_CTRL_OSC_FREQ_48MHZ                (0X9<<28)
+#define OSC_CTRL_MASK                  (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
+
+#define OSC_CTRL_PLL_REF_DIV_MASK      (3<<26)
+#define OSC_CTRL_PLL_REF_DIV_1         (0<<26)
+#define OSC_CTRL_PLL_REF_DIV_2         (1<<26)
+#define OSC_CTRL_PLL_REF_DIV_4         (2<<26)
+
+#define OSC_FREQ_DET                   0x58
+#define OSC_FREQ_DET_TRIG              BIT(31)
+
+#define OSC_FREQ_DET_STATUS            0x5c
+#define OSC_FREQ_DET_BUSY              BIT(31)
+#define OSC_FREQ_DET_CNT_MASK          0xffff
+
+#define CCLKG_BURST_POLICY 0x368
+#define SUPER_CCLKG_DIVIDER 0x36c
+#define CCLKLP_BURST_POLICY 0x370
+#define SUPER_CCLKLP_DIVIDER 0x374
+#define SCLK_BURST_POLICY 0x028
+#define SUPER_SCLK_DIVIDER 0x02c
+
+#define SYSTEM_CLK_RATE 0x030
+
+#define PLLC_BASE 0x80
+#define PLLC_MISC 0x8c
+#define PLLM_BASE 0x90
+#define PLLM_MISC 0x9c
+#define PLLP_BASE 0xa0
+#define PLLP_MISC 0xac
+#define PLLX_BASE 0xe0
+#define PLLX_MISC 0xe4
+#define PLLD_BASE 0xd0
+#define PLLD_MISC 0xdc
+#define PLLD2_BASE 0x4b8
+#define PLLD2_MISC 0x4bc
+#define PLLE_BASE 0xe8
+#define PLLE_MISC 0xec
+#define PLLA_BASE 0xb0
+#define PLLA_MISC 0xbc
+#define PLLU_BASE 0xc0
+#define PLLU_MISC 0xcc
+
+#define PLL_MISC_LOCK_ENABLE 18
+#define PLLDU_MISC_LOCK_ENABLE 22
+#define PLLE_MISC_LOCK_ENABLE 9
+
+#define PLL_BASE_LOCK 27
+#define PLLE_MISC_LOCK 11
+
+#define PLLE_AUX 0x48c
+#define PLLC_OUT 0x84
+#define PLLM_OUT 0x94
+#define PLLP_OUTA 0xa4
+#define PLLP_OUTB 0xa8
+#define PLLA_OUT 0xb4
+
+#define AUDIO_SYNC_CLK_I2S0 0x4a0
+#define AUDIO_SYNC_CLK_I2S1 0x4a4
+#define AUDIO_SYNC_CLK_I2S2 0x4a8
+#define AUDIO_SYNC_CLK_I2S3 0x4ac
+#define AUDIO_SYNC_CLK_I2S4 0x4b0
+#define AUDIO_SYNC_CLK_SPDIF 0x4b4
+
+#define PMC_CLK_OUT_CNTRL 0x1a8
+
+#define CLK_SOURCE_I2S0 0x1d8
+#define CLK_SOURCE_I2S1 0x100
+#define CLK_SOURCE_I2S2 0x104
+#define CLK_SOURCE_I2S3 0x3bc
+#define CLK_SOURCE_I2S4 0x3c0
+#define CLK_SOURCE_SPDIF_OUT 0x108
+#define CLK_SOURCE_SPDIF_IN 0x10c
+#define CLK_SOURCE_PWM 0x110
+#define CLK_SOURCE_D_AUDIO 0x3d0
+#define CLK_SOURCE_DAM0 0x3d8
+#define CLK_SOURCE_DAM1 0x3dc
+#define CLK_SOURCE_DAM2 0x3e0
+#define CLK_SOURCE_HDA 0x428
+#define CLK_SOURCE_HDA2CODEC_2X 0x3e4
+#define CLK_SOURCE_SBC1 0x134
+#define CLK_SOURCE_SBC2 0x118
+#define CLK_SOURCE_SBC3 0x11c
+#define CLK_SOURCE_SBC4 0x1b4
+#define CLK_SOURCE_SBC5 0x3c8
+#define CLK_SOURCE_SBC6 0x3cc
+#define CLK_SOURCE_SATA_OOB 0x420
+#define CLK_SOURCE_SATA 0x424
+#define CLK_SOURCE_NDFLASH 0x160
+#define CLK_SOURCE_NDSPEED 0x3f8
+#define CLK_SOURCE_VFIR 0x168
+#define CLK_SOURCE_SDMMC1 0x150
+#define CLK_SOURCE_SDMMC2 0x154
+#define CLK_SOURCE_SDMMC3 0x1bc
+#define CLK_SOURCE_SDMMC4 0x164
+#define CLK_SOURCE_VDE 0x1c8
+#define CLK_SOURCE_CSITE 0x1d4
+#define CLK_SOURCE_LA 0x1f8
+#define CLK_SOURCE_OWR 0x1cc
+#define CLK_SOURCE_NOR 0x1d0
+#define CLK_SOURCE_MIPI 0x174
+#define CLK_SOURCE_I2C1 0x124
+#define CLK_SOURCE_I2C2 0x198
+#define CLK_SOURCE_I2C3 0x1b8
+#define CLK_SOURCE_I2C4 0x3c4
+#define CLK_SOURCE_I2C5 0x128
+#define CLK_SOURCE_UARTA 0x178
+#define CLK_SOURCE_UARTB 0x17c
+#define CLK_SOURCE_UARTC 0x1a0
+#define CLK_SOURCE_UARTD 0x1c0
+#define CLK_SOURCE_UARTE 0x1c4
+#define CLK_SOURCE_VI 0x148
+#define CLK_SOURCE_VI_SENSOR 0x1a8
+#define CLK_SOURCE_3D 0x158
+#define CLK_SOURCE_3D2 0x3b0
+#define CLK_SOURCE_2D 0x15c
+#define CLK_SOURCE_EPP 0x16c
+#define CLK_SOURCE_MPE 0x170
+#define CLK_SOURCE_HOST1X 0x180
+#define CLK_SOURCE_CVE 0x140
+#define CLK_SOURCE_TVO 0x188
+#define CLK_SOURCE_DTV 0x1dc
+#define CLK_SOURCE_HDMI 0x18c
+#define CLK_SOURCE_TVDAC 0x194
+#define CLK_SOURCE_DISP1 0x138
+#define CLK_SOURCE_DISP2 0x13c
+#define CLK_SOURCE_DSIB 0xd0
+#define CLK_SOURCE_TSENSOR 0x3b8
+#define CLK_SOURCE_ACTMON 0x3e8
+#define CLK_SOURCE_EXTERN1 0x3ec
+#define CLK_SOURCE_EXTERN2 0x3f0
+#define CLK_SOURCE_EXTERN3 0x3f4
+#define CLK_SOURCE_I2CSLOW 0x3fc
+#define CLK_SOURCE_SE 0x42c
+#define CLK_SOURCE_MSELECT 0x3b4
+#define CLK_SOURCE_EMC 0x19c
+
+#define AUDIO_SYNC_DOUBLER 0x49c
+
+#define PMC_CTRL 0
+#define PMC_CTRL_BLINK_ENB 7
+
+#define PMC_DPD_PADS_ORIDE 0x1c
+#define PMC_DPD_PADS_ORIDE_BLINK_ENB 20
+#define PMC_BLINK_TIMER 0x40
+
+#define UTMIP_PLL_CFG2 0x488
+#define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xffff) << 6)
+#define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
+#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0)
+#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2)
+#define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
+
+#define UTMIP_PLL_CFG1 0x484
+#define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 6)
+#define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
+#define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
+#define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
+#define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
+
+/* Tegra CPU clock and reset control regs */
+#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX         0x4c
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET     0x340
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR     0x344
+#define TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR   0x34c
+#define TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS    0x470
+
+#define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
+#define CPU_RESET(cpu) (0x1111ul << (cpu))
+
+#define CLK_RESET_CCLK_BURST   0x20
+#define CLK_RESET_CCLK_DIVIDER 0x24
+#define CLK_RESET_PLLX_BASE    0xe0
+#define CLK_RESET_PLLX_MISC    0xe4
+
+#define CLK_RESET_SOURCE_CSITE 0x1d4
+
+#define CLK_RESET_CCLK_BURST_POLICY_SHIFT      28
+#define CLK_RESET_CCLK_RUN_POLICY_SHIFT                4
+#define CLK_RESET_CCLK_IDLE_POLICY_SHIFT       0
+#define CLK_RESET_CCLK_IDLE_POLICY             1
+#define CLK_RESET_CCLK_RUN_POLICY              2
+#define CLK_RESET_CCLK_BURST_POLICY_PLLX       8
+
+#ifdef CONFIG_PM_SLEEP
+static struct cpu_clk_suspend_context {
+       u32 pllx_misc;
+       u32 pllx_base;
+
+       u32 cpu_burst;
+       u32 clk_csite_src;
+       u32 cclk_divider;
+} tegra30_cpu_clk_sctx;
+#endif
+
+static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32];
+
+static void __iomem *clk_base;
+static void __iomem *pmc_base;
+static unsigned long input_freq;
+
+static DEFINE_SPINLOCK(clk_doubler_lock);
+static DEFINE_SPINLOCK(clk_out_lock);
+static DEFINE_SPINLOCK(pll_div_lock);
+static DEFINE_SPINLOCK(cml_lock);
+static DEFINE_SPINLOCK(pll_d_lock);
+
+#define TEGRA_INIT_DATA_MUX(_name, _con_id, _dev_id, _parents, _offset,        \
+                           _clk_num, _regs, _gate_flags, _clk_id)      \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 8, 1, 0, _regs, _clk_num,          \
+                       periph_clk_enb_refcnt, _gate_flags, _clk_id)
+
+#define TEGRA_INIT_DATA_DIV16(_name, _con_id, _dev_id, _parents, _offset, \
+                           _clk_num, _regs, _gate_flags, _clk_id)      \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 16, 0, TEGRA_DIVIDER_ROUND_UP,     \
+                       _regs, _clk_num, periph_clk_enb_refcnt,         \
+                       _gate_flags, _clk_id)
+
+#define TEGRA_INIT_DATA_MUX8(_name, _con_id, _dev_id, _parents, _offset, \
+                            _clk_num, _regs, _gate_flags, _clk_id)     \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       29, 3, 0, 0, 8, 1, 0, _regs, _clk_num,          \
+                       periph_clk_enb_refcnt, _gate_flags, _clk_id)
+
+#define TEGRA_INIT_DATA_INT(_name, _con_id, _dev_id, _parents, _offset,        \
+                           _clk_num, _regs, _gate_flags, _clk_id)      \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 8, 1, TEGRA_DIVIDER_INT, _regs,    \
+                       _clk_num, periph_clk_enb_refcnt, _gate_flags,   \
+                       _clk_id)
+
+#define TEGRA_INIT_DATA_UART(_name, _con_id, _dev_id, _parents, _offset,\
+                            _clk_num, _regs, _clk_id)                  \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       30, 2, 0, 0, 16, 1, TEGRA_DIVIDER_UART, _regs,  \
+                       _clk_num, periph_clk_enb_refcnt, 0, _clk_id)
+
+#define TEGRA_INIT_DATA_NODIV(_name, _con_id, _dev_id, _parents, _offset, \
+                             _mux_shift, _mux_width, _clk_num, _regs,  \
+                             _gate_flags, _clk_id)                     \
+       TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parents, _offset,     \
+                       _mux_shift, _mux_width, 0, 0, 0, 0, 0, _regs,   \
+                       _clk_num, periph_clk_enb_refcnt, _gate_flags,   \
+                       _clk_id)
+
+/*
+ * IDs assigned here must be in sync with DT bindings definition
+ * for Tegra30 clocks.
+ */
+enum tegra30_clk {
+       cpu, rtc = 4, timer, uarta, gpio = 8, sdmmc2, i2s1 = 11, i2c1, ndflash,
+       sdmmc1, sdmmc4, pwm = 17, i2s2, epp, gr2d = 21, usbd, isp, gr3d,
+       disp2 = 26, disp1, host1x, vcp, i2s0, cop_cache, mc, ahbdma, apbdma,
+       kbc = 36, statmon, pmc, kfuse = 40, sbc1, nor, sbc2 = 44, sbc3 = 46,
+       i2c5, dsia, mipi = 50, hdmi, csi, tvdac, i2c2, uartc, emc = 57, usb2,
+       usb3, mpe, vde, bsea, bsev, speedo, uartd, uarte, i2c3, sbc4, sdmmc3,
+       pcie, owr, afi, csite, pciex, avpucq, la, dtv = 79, ndspeed, i2c_slow,
+       dsib, irama = 84, iramb, iramc, iramd, cram2, audio_2x = 90, csus = 92,
+       cdev1, cdev2, cpu_g = 96, cpu_lp, gr3d2, mselect, tsensor, i2s3, i2s4,
+       i2c4, sbc5, sbc6, d_audio, apbif, dam0, dam1, dam2, hda2codec_2x,
+       atomics, audio0_2x, audio1_2x, audio2_2x, audio3_2x, audio4_2x,
+       spdif_2x, actmon, extern1, extern2, extern3, sata_oob, sata, hda, se,
+       hda2hdmi, sata_cold, uartb = 160, vfir, spdif_out, spdif_in, vi,
+       vi_sensor, fuse, fuse_burn, cve, tvo, clk_32k, clk_m, clk_m_div2,
+       clk_m_div4, pll_ref, pll_c, pll_c_out1, pll_m, pll_m_out1, pll_p,
+       pll_p_out1, pll_p_out2, pll_p_out3, pll_p_out4, pll_a, pll_a_out0,
+       pll_d, pll_d_out0, pll_d2, pll_d2_out0, pll_u, pll_x, pll_x_out0, pll_e,
+       spdif_in_sync, i2s0_sync, i2s1_sync, i2s2_sync, i2s3_sync, i2s4_sync,
+       vimclk_sync, audio0, audio1, audio2, audio3, audio4, spdif, clk_out_1,
+       clk_out_2, clk_out_3, sclk, blink, cclk_g, cclk_lp, twd, cml0, cml1,
+       i2cslow, hclk, pclk, clk_out_1_mux = 300, clk_max
+};
+
+static struct clk *clks[clk_max];
+static struct clk_onecell_data clk_data;
+
+/*
+ * Structure defining the fields for USB UTMI clocks Parameters.
+ */
+struct utmi_clk_param {
+       /* Oscillator Frequency in KHz */
+       u32 osc_frequency;
+       /* UTMIP PLL Enable Delay Count  */
+       u8 enable_delay_count;
+       /* UTMIP PLL Stable count */
+       u8 stable_count;
+       /*  UTMIP PLL Active delay count */
+       u8 active_delay_count;
+       /* UTMIP PLL Xtal frequency count */
+       u8 xtal_freq_count;
+};
+
+static const struct utmi_clk_param utmi_parameters[] = {
+/*     OSC_FREQUENCY, ENABLE_DLY, STABLE_CNT, ACTIVE_DLY, XTAL_FREQ_CNT */
+       {13000000,     0x02,       0x33,       0x05,       0x7F},
+       {19200000,     0x03,       0x4B,       0x06,       0xBB},
+       {12000000,     0x02,       0x2F,       0x04,       0x76},
+       {26000000,     0x04,       0x66,       0x09,       0xFE},
+       {16800000,     0x03,       0x41,       0x0A,       0xA4},
+};
+
+static struct tegra_clk_pll_freq_table pll_c_freq_table[] = {
+       { 12000000, 1040000000, 520,  6, 1, 8},
+       { 13000000, 1040000000, 480,  6, 1, 8},
+       { 16800000, 1040000000, 495,  8, 1, 8}, /* actual: 1039.5 MHz */
+       { 19200000, 1040000000, 325,  6, 1, 6},
+       { 26000000, 1040000000, 520, 13, 1, 8},
+
+       { 12000000, 832000000, 416,  6, 1, 8},
+       { 13000000, 832000000, 832, 13, 1, 8},
+       { 16800000, 832000000, 396,  8, 1, 8},  /* actual: 831.6 MHz */
+       { 19200000, 832000000, 260,  6, 1, 8},
+       { 26000000, 832000000, 416, 13, 1, 8},
+
+       { 12000000, 624000000, 624, 12, 1, 8},
+       { 13000000, 624000000, 624, 13, 1, 8},
+       { 16800000, 600000000, 520, 14, 1, 8},
+       { 19200000, 624000000, 520, 16, 1, 8},
+       { 26000000, 624000000, 624, 26, 1, 8},
+
+       { 12000000, 600000000, 600, 12, 1, 8},
+       { 13000000, 600000000, 600, 13, 1, 8},
+       { 16800000, 600000000, 500, 14, 1, 8},
+       { 19200000, 600000000, 375, 12, 1, 6},
+       { 26000000, 600000000, 600, 26, 1, 8},
+
+       { 12000000, 520000000, 520, 12, 1, 8},
+       { 13000000, 520000000, 520, 13, 1, 8},
+       { 16800000, 520000000, 495, 16, 1, 8},  /* actual: 519.75 MHz */
+       { 19200000, 520000000, 325, 12, 1, 6},
+       { 26000000, 520000000, 520, 26, 1, 8},
+
+       { 12000000, 416000000, 416, 12, 1, 8},
+       { 13000000, 416000000, 416, 13, 1, 8},
+       { 16800000, 416000000, 396, 16, 1, 8},  /* actual: 415.8 MHz */
+       { 19200000, 416000000, 260, 12, 1, 6},
+       { 26000000, 416000000, 416, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
+       { 12000000, 666000000, 666, 12, 1, 8},
+       { 13000000, 666000000, 666, 13, 1, 8},
+       { 16800000, 666000000, 555, 14, 1, 8},
+       { 19200000, 666000000, 555, 16, 1, 8},
+       { 26000000, 666000000, 666, 26, 1, 8},
+       { 12000000, 600000000, 600, 12, 1, 8},
+       { 13000000, 600000000, 600, 13, 1, 8},
+       { 16800000, 600000000, 500, 14, 1, 8},
+       { 19200000, 600000000, 375, 12, 1, 6},
+       { 26000000, 600000000, 600, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
+       { 12000000, 216000000, 432, 12, 2, 8},
+       { 13000000, 216000000, 432, 13, 2, 8},
+       { 16800000, 216000000, 360, 14, 2, 8},
+       { 19200000, 216000000, 360, 16, 2, 8},
+       { 26000000, 216000000, 432, 26, 2, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
+       { 9600000, 564480000, 294, 5, 1, 4},
+       { 9600000, 552960000, 288, 5, 1, 4},
+       { 9600000, 24000000,  5,   2, 1, 1},
+
+       { 28800000, 56448000, 49, 25, 1, 1},
+       { 28800000, 73728000, 64, 25, 1, 1},
+       { 28800000, 24000000,  5,  6, 1, 1},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
+       { 12000000, 216000000, 216, 12, 1, 4},
+       { 13000000, 216000000, 216, 13, 1, 4},
+       { 16800000, 216000000, 180, 14, 1, 4},
+       { 19200000, 216000000, 180, 16, 1, 4},
+       { 26000000, 216000000, 216, 26, 1, 4},
+
+       { 12000000, 594000000, 594, 12, 1, 8},
+       { 13000000, 594000000, 594, 13, 1, 8},
+       { 16800000, 594000000, 495, 14, 1, 8},
+       { 19200000, 594000000, 495, 16, 1, 8},
+       { 26000000, 594000000, 594, 26, 1, 8},
+
+       { 12000000, 1000000000, 1000, 12, 1, 12},
+       { 13000000, 1000000000, 1000, 13, 1, 12},
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 12},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
+       { 12000000, 480000000, 960, 12, 2, 12},
+       { 13000000, 480000000, 960, 13, 2, 12},
+       { 16800000, 480000000, 400, 7,  2, 5},
+       { 19200000, 480000000, 200, 4,  2, 3},
+       { 26000000, 480000000, 960, 26, 2, 12},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
+       /* 1.7 GHz */
+       { 12000000, 1700000000, 850,  6,  1, 8},
+       { 13000000, 1700000000, 915,  7,  1, 8},        /* actual: 1699.2 MHz */
+       { 16800000, 1700000000, 708,  7,  1, 8},        /* actual: 1699.2 MHz */
+       { 19200000, 1700000000, 885,  10, 1, 8},        /* actual: 1699.2 MHz */
+       { 26000000, 1700000000, 850,  13, 1, 8},
+
+       /* 1.6 GHz */
+       { 12000000, 1600000000, 800,  6,  1, 8},
+       { 13000000, 1600000000, 738,  6,  1, 8},        /* actual: 1599.0 MHz */
+       { 16800000, 1600000000, 857,  9,  1, 8},        /* actual: 1599.7 MHz */
+       { 19200000, 1600000000, 500,  6,  1, 8},
+       { 26000000, 1600000000, 800,  13, 1, 8},
+
+       /* 1.5 GHz */
+       { 12000000, 1500000000, 750,  6,  1, 8},
+       { 13000000, 1500000000, 923,  8,  1, 8},        /* actual: 1499.8 MHz */
+       { 16800000, 1500000000, 625,  7,  1, 8},
+       { 19200000, 1500000000, 625,  8,  1, 8},
+       { 26000000, 1500000000, 750,  13, 1, 8},
+
+       /* 1.4 GHz */
+       { 12000000, 1400000000, 700,  6,  1, 8},
+       { 13000000, 1400000000, 969,  9,  1, 8},        /* actual: 1399.7 MHz */
+       { 16800000, 1400000000, 1000, 12, 1, 8},
+       { 19200000, 1400000000, 875,  12, 1, 8},
+       { 26000000, 1400000000, 700,  13, 1, 8},
+
+       /* 1.3 GHz */
+       { 12000000, 1300000000, 975,  9,  1, 8},
+       { 13000000, 1300000000, 1000, 10, 1, 8},
+       { 16800000, 1300000000, 928,  12, 1, 8},        /* actual: 1299.2 MHz */
+       { 19200000, 1300000000, 812,  12, 1, 8},        /* actual: 1299.2 MHz */
+       { 26000000, 1300000000, 650,  13, 1, 8},
+
+       /* 1.2 GHz */
+       { 12000000, 1200000000, 1000, 10, 1, 8},
+       { 13000000, 1200000000, 923,  10, 1, 8},        /* actual: 1199.9 MHz */
+       { 16800000, 1200000000, 1000, 14, 1, 8},
+       { 19200000, 1200000000, 1000, 16, 1, 8},
+       { 26000000, 1200000000, 600,  13, 1, 8},
+
+       /* 1.1 GHz */
+       { 12000000, 1100000000, 825,  9,  1, 8},
+       { 13000000, 1100000000, 846,  10, 1, 8},        /* actual: 1099.8 MHz */
+       { 16800000, 1100000000, 982,  15, 1, 8},        /* actual: 1099.8 MHz */
+       { 19200000, 1100000000, 859,  15, 1, 8},        /* actual: 1099.5 MHz */
+       { 26000000, 1100000000, 550,  13, 1, 8},
+
+       /* 1 GHz */
+       { 12000000, 1000000000, 1000, 12, 1, 8},
+       { 13000000, 1000000000, 1000, 13, 1, 8},
+       { 16800000, 1000000000, 833,  14, 1, 8},        /* actual: 999.6 MHz */
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 8},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
+       /* PLLE special case: use cpcon field to store cml divider value */
+       { 12000000,  100000000, 150, 1,  18, 11},
+       { 216000000, 100000000, 200, 18, 24, 13},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+/* PLL parameters */
+static struct tegra_clk_pll_params pll_c_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1400000000,
+       .base_reg = PLLC_BASE,
+       .misc_reg = PLLC_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_m_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1200000000,
+       .base_reg = PLLM_BASE,
+       .misc_reg = PLLM_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_p_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1400000000,
+       .base_reg = PLLP_BASE,
+       .misc_reg = PLLP_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_a_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1400000000,
+       .base_reg = PLLA_BASE,
+       .misc_reg = PLLA_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_d_params = {
+       .input_min = 2000000,
+       .input_max = 40000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 40000000,
+       .vco_max = 1000000000,
+       .base_reg = PLLD_BASE,
+       .misc_reg = PLLD_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
+       .lock_delay = 1000,
+};
+
+static struct tegra_clk_pll_params pll_d2_params = {
+       .input_min = 2000000,
+       .input_max = 40000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 40000000,
+       .vco_max = 1000000000,
+       .base_reg = PLLD2_BASE,
+       .misc_reg = PLLD2_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
+       .lock_delay = 1000,
+};
+
+static struct tegra_clk_pll_params pll_u_params = {
+       .input_min = 2000000,
+       .input_max = 40000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 48000000,
+       .vco_max = 960000000,
+       .base_reg = PLLU_BASE,
+       .misc_reg = PLLU_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLLDU_MISC_LOCK_ENABLE,
+       .lock_delay = 1000,
+};
+
+static struct tegra_clk_pll_params pll_x_params = {
+       .input_min = 2000000,
+       .input_max = 31000000,
+       .cf_min = 1000000,
+       .cf_max = 6000000,
+       .vco_min = 20000000,
+       .vco_max = 1700000000,
+       .base_reg = PLLX_BASE,
+       .misc_reg = PLLX_MISC,
+       .lock_bit_idx = PLL_BASE_LOCK,
+       .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+static struct tegra_clk_pll_params pll_e_params = {
+       .input_min = 12000000,
+       .input_max = 216000000,
+       .cf_min = 12000000,
+       .cf_max = 12000000,
+       .vco_min = 1200000000,
+       .vco_max = 2400000000U,
+       .base_reg = PLLE_BASE,
+       .misc_reg = PLLE_MISC,
+       .lock_bit_idx = PLLE_MISC_LOCK,
+       .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
+       .lock_delay = 300,
+};
+
+/* Peripheral clock registers */
+static struct tegra_clk_periph_regs periph_l_regs = {
+       .enb_reg = CLK_OUT_ENB_L,
+       .enb_set_reg = CLK_OUT_ENB_SET_L,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_L,
+       .rst_reg = RST_DEVICES_L,
+       .rst_set_reg = RST_DEVICES_SET_L,
+       .rst_clr_reg = RST_DEVICES_CLR_L,
+};
+
+static struct tegra_clk_periph_regs periph_h_regs = {
+       .enb_reg = CLK_OUT_ENB_H,
+       .enb_set_reg = CLK_OUT_ENB_SET_H,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_H,
+       .rst_reg = RST_DEVICES_H,
+       .rst_set_reg = RST_DEVICES_SET_H,
+       .rst_clr_reg = RST_DEVICES_CLR_H,
+};
+
+static struct tegra_clk_periph_regs periph_u_regs = {
+       .enb_reg = CLK_OUT_ENB_U,
+       .enb_set_reg = CLK_OUT_ENB_SET_U,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_U,
+       .rst_reg = RST_DEVICES_U,
+       .rst_set_reg = RST_DEVICES_SET_U,
+       .rst_clr_reg = RST_DEVICES_CLR_U,
+};
+
+static struct tegra_clk_periph_regs periph_v_regs = {
+       .enb_reg = CLK_OUT_ENB_V,
+       .enb_set_reg = CLK_OUT_ENB_SET_V,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_V,
+       .rst_reg = RST_DEVICES_V,
+       .rst_set_reg = RST_DEVICES_SET_V,
+       .rst_clr_reg = RST_DEVICES_CLR_V,
+};
+
+static struct tegra_clk_periph_regs periph_w_regs = {
+       .enb_reg = CLK_OUT_ENB_W,
+       .enb_set_reg = CLK_OUT_ENB_SET_W,
+       .enb_clr_reg = CLK_OUT_ENB_CLR_W,
+       .rst_reg = RST_DEVICES_W,
+       .rst_set_reg = RST_DEVICES_SET_W,
+       .rst_clr_reg = RST_DEVICES_CLR_W,
+};
+
+static void tegra30_clk_measure_input_freq(void)
+{
+       u32 osc_ctrl = readl_relaxed(clk_base + OSC_CTRL);
+       u32 auto_clk_control = osc_ctrl & OSC_CTRL_OSC_FREQ_MASK;
+       u32 pll_ref_div = osc_ctrl & OSC_CTRL_PLL_REF_DIV_MASK;
+
+       switch (auto_clk_control) {
+       case OSC_CTRL_OSC_FREQ_12MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 12000000;
+               break;
+       case OSC_CTRL_OSC_FREQ_13MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 13000000;
+               break;
+       case OSC_CTRL_OSC_FREQ_19_2MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 19200000;
+               break;
+       case OSC_CTRL_OSC_FREQ_26MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 26000000;
+               break;
+       case OSC_CTRL_OSC_FREQ_16_8MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
+               input_freq = 16800000;
+               break;
+       case OSC_CTRL_OSC_FREQ_38_4MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_2);
+               input_freq = 38400000;
+               break;
+       case OSC_CTRL_OSC_FREQ_48MHZ:
+               BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_4);
+               input_freq = 48000000;
+               break;
+       default:
+               pr_err("Unexpected auto clock control value %d",
+                       auto_clk_control);
+               BUG();
+               return;
+       }
+}
+
+static unsigned int tegra30_get_pll_ref_div(void)
+{
+       u32 pll_ref_div = readl_relaxed(clk_base + OSC_CTRL) &
+                                       OSC_CTRL_PLL_REF_DIV_MASK;
+
+       switch (pll_ref_div) {
+       case OSC_CTRL_PLL_REF_DIV_1:
+               return 1;
+       case OSC_CTRL_PLL_REF_DIV_2:
+               return 2;
+       case OSC_CTRL_PLL_REF_DIV_4:
+               return 4;
+       default:
+               pr_err("Invalid pll ref divider %d", pll_ref_div);
+               BUG();
+       }
+       return 0;
+}
+
+static void tegra30_utmi_param_configure(void)
+{
+       u32 reg;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
+               if (input_freq == utmi_parameters[i].osc_frequency)
+                       break;
+       }
+
+       if (i >= ARRAY_SIZE(utmi_parameters)) {
+               pr_err("%s: Unexpected input rate %lu\n", __func__, input_freq);
+               return;
+       }
+
+       reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
+
+       /* Program UTMIP PLL stable and active counts */
+       reg &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
+       reg |= UTMIP_PLL_CFG2_STABLE_COUNT(
+                       utmi_parameters[i].stable_count);
+
+       reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
+
+       reg |= UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(
+                       utmi_parameters[i].active_delay_count);
+
+       /* Remove power downs from UTMIP PLL control bits */
+       reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
+       reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
+       reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN;
+
+       writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
+
+       /* Program UTMIP PLL delay and oscillator frequency counts */
+       reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
+       reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
+
+       reg |= UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(
+               utmi_parameters[i].enable_delay_count);
+
+       reg &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
+       reg |= UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(
+               utmi_parameters[i].xtal_freq_count);
+
+       /* Remove power downs from UTMIP PLL control bits */
+       reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
+       reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN;
+       reg &= ~UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
+
+       writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
+}
+
+static const char *pll_e_parents[] = {"pll_ref", "pll_p"};
+
+static void __init tegra30_pll_init(void)
+{
+       struct clk *clk;
+
+       /* PLLC */
+       clk = tegra_clk_register_pll("pll_c", "pll_ref", clk_base, pmc_base, 0,
+                           0, &pll_c_params,
+                           TEGRA_PLL_HAS_CPCON | TEGRA_PLL_USE_LOCK,
+                           pll_c_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_c", NULL);
+       clks[pll_c] = clk;
+
+       /* PLLC_OUT1 */
+       clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
+                               clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, NULL);
+       clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
+                               clk_base + PLLC_OUT, 1, 0, CLK_SET_RATE_PARENT,
+                               0, NULL);
+       clk_register_clkdev(clk, "pll_c_out1", NULL);
+       clks[pll_c_out1] = clk;
+
+       /* PLLP */
+       clk = tegra_clk_register_pll("pll_p", "pll_ref", clk_base, pmc_base, 0,
+                           408000000, &pll_p_params,
+                           TEGRA_PLL_FIXED | TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_USE_LOCK, pll_p_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_p", NULL);
+       clks[pll_p] = clk;
+
+       /* PLLP_OUT1 */
+       clk = tegra_clk_register_divider("pll_p_out1_div", "pll_p",
+                               clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED |
+                               TEGRA_DIVIDER_ROUND_UP, 8, 8, 1,
+                               &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out1", "pll_p_out1_div",
+                               clk_base + PLLP_OUTA, 1, 0,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out1", NULL);
+       clks[pll_p_out1] = clk;
+
+       /* PLLP_OUT2 */
+       clk = tegra_clk_register_divider("pll_p_out2_div", "pll_p",
+                               clk_base + PLLP_OUTA, 0, TEGRA_DIVIDER_FIXED |
+                               TEGRA_DIVIDER_ROUND_UP, 24, 8, 1,
+                               &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out2", "pll_p_out2_div",
+                               clk_base + PLLP_OUTA, 17, 16,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out2", NULL);
+       clks[pll_p_out2] = clk;
+
+       /* PLLP_OUT3 */
+       clk = tegra_clk_register_divider("pll_p_out3_div", "pll_p",
+                               clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED |
+                               TEGRA_DIVIDER_ROUND_UP, 8, 8, 1,
+                               &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out3", "pll_p_out3_div",
+                               clk_base + PLLP_OUTB, 1, 0,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out3", NULL);
+       clks[pll_p_out3] = clk;
+
+       /* PLLP_OUT4 */
+       clk = tegra_clk_register_divider("pll_p_out4_div", "pll_p",
+                               clk_base + PLLP_OUTB, 0, TEGRA_DIVIDER_FIXED |
+                               TEGRA_DIVIDER_ROUND_UP, 24, 8, 1,
+                               &pll_div_lock);
+       clk = tegra_clk_register_pll_out("pll_p_out4", "pll_p_out4_div",
+                               clk_base + PLLP_OUTB, 17, 16,
+                               CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0,
+                               &pll_div_lock);
+       clk_register_clkdev(clk, "pll_p_out4", NULL);
+       clks[pll_p_out4] = clk;
+
+       /* PLLM */
+       clk = tegra_clk_register_pll("pll_m", "pll_ref", clk_base, pmc_base,
+                           CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, 0,
+                           &pll_m_params, TEGRA_PLLM | TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK,
+                           pll_m_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_m", NULL);
+       clks[pll_m] = clk;
+
+       /* PLLM_OUT1 */
+       clk = tegra_clk_register_divider("pll_m_out1_div", "pll_m",
+                               clk_base + PLLM_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, NULL);
+       clk = tegra_clk_register_pll_out("pll_m_out1", "pll_m_out1_div",
+                               clk_base + PLLM_OUT, 1, 0, CLK_IGNORE_UNUSED |
+                               CLK_SET_RATE_PARENT, 0, NULL);
+       clk_register_clkdev(clk, "pll_m_out1", NULL);
+       clks[pll_m_out1] = clk;
+
+       /* PLLX */
+       clk = tegra_clk_register_pll("pll_x", "pll_ref", clk_base, pmc_base, 0,
+                           0, &pll_x_params, TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_SET_DCCON | TEGRA_PLL_USE_LOCK,
+                           pll_x_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_x", NULL);
+       clks[pll_x] = clk;
+
+       /* PLLX_OUT0 */
+       clk = clk_register_fixed_factor(NULL, "pll_x_out0", "pll_x",
+                                       CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll_x_out0", NULL);
+       clks[pll_x_out0] = clk;
+
+       /* PLLU */
+       clk = tegra_clk_register_pll("pll_u", "pll_ref", clk_base, pmc_base, 0,
+                           0, &pll_u_params, TEGRA_PLLU | TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK,
+                           pll_u_freq_table,
+                           NULL);
+       clk_register_clkdev(clk, "pll_u", NULL);
+       clks[pll_u] = clk;
+
+       tegra30_utmi_param_configure();
+
+       /* PLLD */
+       clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc_base, 0,
+                           0, &pll_d_params, TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK,
+                           pll_d_freq_table, &pll_d_lock);
+       clk_register_clkdev(clk, "pll_d", NULL);
+       clks[pll_d] = clk;
+
+       /* PLLD_OUT0 */
+       clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
+                                       CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll_d_out0", NULL);
+       clks[pll_d_out0] = clk;
+
+       /* PLLD2 */
+       clk = tegra_clk_register_pll("pll_d2", "pll_ref", clk_base, pmc_base, 0,
+                           0, &pll_d2_params, TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_SET_LFCON | TEGRA_PLL_USE_LOCK,
+                           pll_d_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_d2", NULL);
+       clks[pll_d2] = clk;
+
+       /* PLLD2_OUT0 */
+       clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2",
+                                       CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll_d2_out0", NULL);
+       clks[pll_d2_out0] = clk;
+
+       /* PLLA */
+       clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, pmc_base,
+                           0, 0, &pll_a_params, TEGRA_PLL_HAS_CPCON |
+                           TEGRA_PLL_USE_LOCK, pll_a_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_a", NULL);
+       clks[pll_a] = clk;
+
+       /* PLLA_OUT0 */
+       clk = tegra_clk_register_divider("pll_a_out0_div", "pll_a",
+                               clk_base + PLLA_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
+                               8, 8, 1, NULL);
+       clk = tegra_clk_register_pll_out("pll_a_out0", "pll_a_out0_div",
+                               clk_base + PLLA_OUT, 1, 0, CLK_IGNORE_UNUSED |
+                               CLK_SET_RATE_PARENT, 0, NULL);
+       clk_register_clkdev(clk, "pll_a_out0", NULL);
+       clks[pll_a_out0] = clk;
+
+       /* PLLE */
+       clk = clk_register_mux(NULL, "pll_e_mux", pll_e_parents,
+                              ARRAY_SIZE(pll_e_parents), 0,
+                              clk_base + PLLE_AUX, 2, 1, 0, NULL);
+       clk = tegra_clk_register_plle("pll_e", "pll_e_mux", clk_base, pmc_base,
+                            CLK_GET_RATE_NOCACHE, 100000000, &pll_e_params,
+                            TEGRA_PLLE_CONFIGURE, pll_e_freq_table, NULL);
+       clk_register_clkdev(clk, "pll_e", NULL);
+       clks[pll_e] = clk;
+}
+
+static const char *mux_audio_sync_clk[] = { "spdif_in_sync", "i2s0_sync",
+       "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync",};
+static const char *clk_out1_parents[] = { "clk_m", "clk_m_div2",
+                                         "clk_m_div4", "extern1", };
+static const char *clk_out2_parents[] = { "clk_m", "clk_m_div2",
+                                         "clk_m_div4", "extern2", };
+static const char *clk_out3_parents[] = { "clk_m", "clk_m_div2",
+                                         "clk_m_div4", "extern3", };
+
+static void __init tegra30_audio_clk_init(void)
+{
+       struct clk *clk;
+
+       /* spdif_in_sync */
+       clk = tegra_clk_register_sync_source("spdif_in_sync", 24000000,
+                                            24000000);
+       clk_register_clkdev(clk, "spdif_in_sync", NULL);
+       clks[spdif_in_sync] = clk;
+
+       /* i2s0_sync */
+       clk = tegra_clk_register_sync_source("i2s0_sync", 24000000, 24000000);
+       clk_register_clkdev(clk, "i2s0_sync", NULL);
+       clks[i2s0_sync] = clk;
+
+       /* i2s1_sync */
+       clk = tegra_clk_register_sync_source("i2s1_sync", 24000000, 24000000);
+       clk_register_clkdev(clk, "i2s1_sync", NULL);
+       clks[i2s1_sync] = clk;
+
+       /* i2s2_sync */
+       clk = tegra_clk_register_sync_source("i2s2_sync", 24000000, 24000000);
+       clk_register_clkdev(clk, "i2s2_sync", NULL);
+       clks[i2s2_sync] = clk;
+
+       /* i2s3_sync */
+       clk = tegra_clk_register_sync_source("i2s3_sync", 24000000, 24000000);
+       clk_register_clkdev(clk, "i2s3_sync", NULL);
+       clks[i2s3_sync] = clk;
+
+       /* i2s4_sync */
+       clk = tegra_clk_register_sync_source("i2s4_sync", 24000000, 24000000);
+       clk_register_clkdev(clk, "i2s4_sync", NULL);
+       clks[i2s4_sync] = clk;
+
+       /* vimclk_sync */
+       clk = tegra_clk_register_sync_source("vimclk_sync", 24000000, 24000000);
+       clk_register_clkdev(clk, "vimclk_sync", NULL);
+       clks[vimclk_sync] = clk;
+
+       /* audio0 */
+       clk = clk_register_mux(NULL, "audio0_mux", mux_audio_sync_clk,
+                               ARRAY_SIZE(mux_audio_sync_clk), 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S0, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "audio0", "audio0_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S0, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "audio0", NULL);
+       clks[audio0] = clk;
+
+       /* audio1 */
+       clk = clk_register_mux(NULL, "audio1_mux", mux_audio_sync_clk,
+                               ARRAY_SIZE(mux_audio_sync_clk), 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S1, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "audio1", "audio1_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S1, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "audio1", NULL);
+       clks[audio1] = clk;
+
+       /* audio2 */
+       clk = clk_register_mux(NULL, "audio2_mux", mux_audio_sync_clk,
+                               ARRAY_SIZE(mux_audio_sync_clk), 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S2, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "audio2", "audio2_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S2, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "audio2", NULL);
+       clks[audio2] = clk;
+
+       /* audio3 */
+       clk = clk_register_mux(NULL, "audio3_mux", mux_audio_sync_clk,
+                               ARRAY_SIZE(mux_audio_sync_clk), 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S3, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "audio3", "audio3_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S3, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "audio3", NULL);
+       clks[audio3] = clk;
+
+       /* audio4 */
+       clk = clk_register_mux(NULL, "audio4_mux", mux_audio_sync_clk,
+                               ARRAY_SIZE(mux_audio_sync_clk), 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S4, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "audio4", "audio4_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK_I2S4, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "audio4", NULL);
+       clks[audio4] = clk;
+
+       /* spdif */
+       clk = clk_register_mux(NULL, "spdif_mux", mux_audio_sync_clk,
+                               ARRAY_SIZE(mux_audio_sync_clk), 0,
+                               clk_base + AUDIO_SYNC_CLK_SPDIF, 0, 3, 0, NULL);
+       clk = clk_register_gate(NULL, "spdif", "spdif_mux", 0,
+                               clk_base + AUDIO_SYNC_CLK_SPDIF, 4,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "spdif", NULL);
+       clks[spdif] = clk;
+
+       /* audio0_2x */
+       clk = clk_register_fixed_factor(NULL, "audio0_doubler", "audio0",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_divider("audio0_div", "audio0_doubler",
+                               clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 24, 1, 0,
+                               &clk_doubler_lock);
+       clk = tegra_clk_register_periph_gate("audio0_2x", "audio0_div",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 113, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "audio0_2x", NULL);
+       clks[audio0_2x] = clk;
+
+       /* audio1_2x */
+       clk = clk_register_fixed_factor(NULL, "audio1_doubler", "audio1",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_divider("audio1_div", "audio1_doubler",
+                               clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 25, 1, 0,
+                               &clk_doubler_lock);
+       clk = tegra_clk_register_periph_gate("audio1_2x", "audio1_div",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 114, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "audio1_2x", NULL);
+       clks[audio1_2x] = clk;
+
+       /* audio2_2x */
+       clk = clk_register_fixed_factor(NULL, "audio2_doubler", "audio2",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_divider("audio2_div", "audio2_doubler",
+                               clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 26, 1, 0,
+                               &clk_doubler_lock);
+       clk = tegra_clk_register_periph_gate("audio2_2x", "audio2_div",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 115, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "audio2_2x", NULL);
+       clks[audio2_2x] = clk;
+
+       /* audio3_2x */
+       clk = clk_register_fixed_factor(NULL, "audio3_doubler", "audio3",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_divider("audio3_div", "audio3_doubler",
+                               clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 27, 1, 0,
+                               &clk_doubler_lock);
+       clk = tegra_clk_register_periph_gate("audio3_2x", "audio3_div",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 116, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "audio3_2x", NULL);
+       clks[audio3_2x] = clk;
+
+       /* audio4_2x */
+       clk = clk_register_fixed_factor(NULL, "audio4_doubler", "audio4",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_divider("audio4_div", "audio4_doubler",
+                               clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 28, 1, 0,
+                               &clk_doubler_lock);
+       clk = tegra_clk_register_periph_gate("audio4_2x", "audio4_div",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 117, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "audio4_2x", NULL);
+       clks[audio4_2x] = clk;
+
+       /* spdif_2x */
+       clk = clk_register_fixed_factor(NULL, "spdif_doubler", "spdif",
+                                       CLK_SET_RATE_PARENT, 2, 1);
+       clk = tegra_clk_register_divider("spdif_div", "spdif_doubler",
+                               clk_base + AUDIO_SYNC_DOUBLER, 0, 0, 29, 1, 0,
+                               &clk_doubler_lock);
+       clk = tegra_clk_register_periph_gate("spdif_2x", "spdif_div",
+                                   TEGRA_PERIPH_NO_RESET, clk_base,
+                                   CLK_SET_RATE_PARENT, 118, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "spdif_2x", NULL);
+       clks[spdif_2x] = clk;
+}
+
+static void __init tegra30_pmc_clk_init(void)
+{
+       struct clk *clk;
+
+       /* clk_out_1 */
+       clk = clk_register_mux(NULL, "clk_out_1_mux", clk_out1_parents,
+                              ARRAY_SIZE(clk_out1_parents), 0,
+                              pmc_base + PMC_CLK_OUT_CNTRL, 6, 3, 0,
+                              &clk_out_lock);
+       clks[clk_out_1_mux] = clk;
+       clk = clk_register_gate(NULL, "clk_out_1", "clk_out_1_mux", 0,
+                               pmc_base + PMC_CLK_OUT_CNTRL, 2, 0,
+                               &clk_out_lock);
+       clk_register_clkdev(clk, "extern1", "clk_out_1");
+       clks[clk_out_1] = clk;
+
+       /* clk_out_2 */
+       clk = clk_register_mux(NULL, "clk_out_2_mux", clk_out2_parents,
+                              ARRAY_SIZE(clk_out1_parents), 0,
+                              pmc_base + PMC_CLK_OUT_CNTRL, 14, 3, 0,
+                              &clk_out_lock);
+       clk = clk_register_gate(NULL, "clk_out_2", "clk_out_2_mux", 0,
+                               pmc_base + PMC_CLK_OUT_CNTRL, 10, 0,
+                               &clk_out_lock);
+       clk_register_clkdev(clk, "extern2", "clk_out_2");
+       clks[clk_out_2] = clk;
+
+       /* clk_out_3 */
+       clk = clk_register_mux(NULL, "clk_out_3_mux", clk_out3_parents,
+                              ARRAY_SIZE(clk_out1_parents), 0,
+                              pmc_base + PMC_CLK_OUT_CNTRL, 22, 3, 0,
+                              &clk_out_lock);
+       clk = clk_register_gate(NULL, "clk_out_3", "clk_out_3_mux", 0,
+                               pmc_base + PMC_CLK_OUT_CNTRL, 18, 0,
+                               &clk_out_lock);
+       clk_register_clkdev(clk, "extern3", "clk_out_3");
+       clks[clk_out_3] = clk;
+
+       /* blink */
+       writel_relaxed(0, pmc_base + PMC_BLINK_TIMER);
+       clk = clk_register_gate(NULL, "blink_override", "clk_32k", 0,
+                               pmc_base + PMC_DPD_PADS_ORIDE,
+                               PMC_DPD_PADS_ORIDE_BLINK_ENB, 0, NULL);
+       clk = clk_register_gate(NULL, "blink", "blink_override", 0,
+                               pmc_base + PMC_CTRL,
+                               PMC_CTRL_BLINK_ENB, 0, NULL);
+       clk_register_clkdev(clk, "blink", NULL);
+       clks[blink] = clk;
+
+}
+
+const char *cclk_g_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
+                                "pll_p_cclkg", "pll_p_out4_cclkg",
+                                "pll_p_out3_cclkg", "unused", "pll_x" };
+const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
+                                 "pll_p_cclklp", "pll_p_out4_cclklp",
+                                 "pll_p_out3_cclklp", "unused", "pll_x",
+                                 "pll_x_out0" };
+const char *sclk_parents[] = { "clk_m", "pll_c_out1", "pll_p_out4",
+                              "pll_p_out3", "pll_p_out2", "unused",
+                              "clk_32k", "pll_m_out1" };
+
+static void __init tegra30_super_clk_init(void)
+{
+       struct clk *clk;
+
+       /*
+        * Clock input to cclk_g divided from pll_p using
+        * U71 divider of cclk_g.
+        */
+       clk = tegra_clk_register_divider("pll_p_cclkg", "pll_p",
+                               clk_base + SUPER_CCLKG_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_cclkg", NULL);
+
+       /*
+        * Clock input to cclk_g divided from pll_p_out3 using
+        * U71 divider of cclk_g.
+        */
+       clk = tegra_clk_register_divider("pll_p_out3_cclkg", "pll_p_out3",
+                               clk_base + SUPER_CCLKG_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_out3_cclkg", NULL);
+
+       /*
+        * Clock input to cclk_g divided from pll_p_out4 using
+        * U71 divider of cclk_g.
+        */
+       clk = tegra_clk_register_divider("pll_p_out4_cclkg", "pll_p_out4",
+                               clk_base + SUPER_CCLKG_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_out4_cclkg", NULL);
+
+       /* CCLKG */
+       clk = tegra_clk_register_super_mux("cclk_g", cclk_g_parents,
+                                 ARRAY_SIZE(cclk_g_parents),
+                                 CLK_SET_RATE_PARENT,
+                                 clk_base + CCLKG_BURST_POLICY,
+                                 0, 4, 0, 0, NULL);
+       clk_register_clkdev(clk, "cclk_g", NULL);
+       clks[cclk_g] = clk;
+
+       /*
+        * Clock input to cclk_lp divided from pll_p using
+        * U71 divider of cclk_lp.
+        */
+       clk = tegra_clk_register_divider("pll_p_cclklp", "pll_p",
+                               clk_base + SUPER_CCLKLP_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_cclklp", NULL);
+
+       /*
+        * Clock input to cclk_lp divided from pll_p_out3 using
+        * U71 divider of cclk_lp.
+        */
+       clk = tegra_clk_register_divider("pll_p_out3_cclklp", "pll_p_out3",
+                               clk_base + SUPER_CCLKG_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_out3_cclklp", NULL);
+
+       /*
+        * Clock input to cclk_lp divided from pll_p_out4 using
+        * U71 divider of cclk_lp.
+        */
+       clk = tegra_clk_register_divider("pll_p_out4_cclklp", "pll_p_out4",
+                               clk_base + SUPER_CCLKLP_DIVIDER, 0,
+                               TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
+       clk_register_clkdev(clk, "pll_p_out4_cclklp", NULL);
+
+       /* CCLKLP */
+       clk = tegra_clk_register_super_mux("cclk_lp", cclk_lp_parents,
+                                 ARRAY_SIZE(cclk_lp_parents),
+                                 CLK_SET_RATE_PARENT,
+                                 clk_base + CCLKLP_BURST_POLICY,
+                                 TEGRA_DIVIDER_2, 4, 8, 9,
+                             NULL);
+       clk_register_clkdev(clk, "cclk_lp", NULL);
+       clks[cclk_lp] = clk;
+
+       /* SCLK */
+       clk = tegra_clk_register_super_mux("sclk", sclk_parents,
+                                 ARRAY_SIZE(sclk_parents),
+                                 CLK_SET_RATE_PARENT,
+                                 clk_base + SCLK_BURST_POLICY,
+                                 0, 4, 0, 0, NULL);
+       clk_register_clkdev(clk, "sclk", NULL);
+       clks[sclk] = clk;
+
+       /* HCLK */
+       clk = clk_register_divider(NULL, "hclk_div", "sclk", 0,
+                                  clk_base + SYSTEM_CLK_RATE, 4, 2, 0, NULL);
+       clk = clk_register_gate(NULL, "hclk", "hclk_div", CLK_SET_RATE_PARENT,
+                               clk_base + SYSTEM_CLK_RATE, 7,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "hclk", NULL);
+       clks[hclk] = clk;
+
+       /* PCLK */
+       clk = clk_register_divider(NULL, "pclk_div", "hclk", 0,
+                                  clk_base + SYSTEM_CLK_RATE, 0, 2, 0, NULL);
+       clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT,
+                               clk_base + SYSTEM_CLK_RATE, 3,
+                               CLK_GATE_SET_TO_DISABLE, NULL);
+       clk_register_clkdev(clk, "pclk", NULL);
+       clks[pclk] = clk;
+
+       /* twd */
+       clk = clk_register_fixed_factor(NULL, "twd", "cclk_g",
+                                       CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "twd", NULL);
+       clks[twd] = clk;
+}
+
+static const char *mux_pllacp_clkm[] = { "pll_a_out0", "unused", "pll_p",
+                                        "clk_m" };
+static const char *mux_pllpcm_clkm[] = { "pll_p", "pll_c", "pll_m", "clk_m" };
+static const char *mux_pllmcp_clkm[] = { "pll_m", "pll_c", "pll_p", "clk_m" };
+static const char *i2s0_parents[] = { "pll_a_out0", "audio0_2x", "pll_p",
+                                     "clk_m" };
+static const char *i2s1_parents[] = { "pll_a_out0", "audio1_2x", "pll_p",
+                                     "clk_m" };
+static const char *i2s2_parents[] = { "pll_a_out0", "audio2_2x", "pll_p",
+                                     "clk_m" };
+static const char *i2s3_parents[] = { "pll_a_out0", "audio3_2x", "pll_p",
+                                     "clk_m" };
+static const char *i2s4_parents[] = { "pll_a_out0", "audio4_2x", "pll_p",
+                                     "clk_m" };
+static const char *spdif_out_parents[] = { "pll_a_out0", "spdif_2x", "pll_p",
+                                          "clk_m" };
+static const char *spdif_in_parents[] = { "pll_p", "pll_c", "pll_m" };
+static const char *mux_pllpc_clk32k_clkm[] = { "pll_p", "pll_c", "clk_32k",
+                                              "clk_m" };
+static const char *mux_pllpc_clkm_clk32k[] = { "pll_p", "pll_c", "clk_m",
+                                              "clk_32k" };
+static const char *mux_pllmcpa[] = { "pll_m", "pll_c", "pll_p", "pll_a_out0" };
+static const char *mux_pllpdc_clkm[] = { "pll_p", "pll_d_out0", "pll_c",
+                                        "clk_m" };
+static const char *mux_pllp_clkm[] = { "pll_p", "unused", "unused", "clk_m" };
+static const char *mux_pllpmdacd2_clkm[] = { "pll_p", "pll_m", "pll_d_out0",
+                                            "pll_a_out0", "pll_c",
+                                            "pll_d2_out0", "clk_m" };
+static const char *mux_plla_clk32k_pllp_clkm_plle[] = { "pll_a_out0",
+                                                       "clk_32k", "pll_p",
+                                                       "clk_m", "pll_e" };
+static const char *mux_plld_out0_plld2_out0[] = { "pll_d_out0",
+                                                 "pll_d2_out0" };
+
+static struct tegra_periph_init_data tegra_periph_clk_list[] = {
+       TEGRA_INIT_DATA_MUX("i2s0",     NULL,           "tegra30-i2s.0",        i2s0_parents,           CLK_SOURCE_I2S0,        30,     &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s0),
+       TEGRA_INIT_DATA_MUX("i2s1",     NULL,           "tegra30-i2s.1",        i2s1_parents,           CLK_SOURCE_I2S1,        11,     &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s1),
+       TEGRA_INIT_DATA_MUX("i2s2",     NULL,           "tegra30-i2s.2",        i2s2_parents,           CLK_SOURCE_I2S2,        18,     &periph_l_regs, TEGRA_PERIPH_ON_APB, i2s2),
+       TEGRA_INIT_DATA_MUX("i2s3",     NULL,           "tegra30-i2s.3",        i2s3_parents,           CLK_SOURCE_I2S3,        101,    &periph_v_regs, TEGRA_PERIPH_ON_APB, i2s3),
+       TEGRA_INIT_DATA_MUX("i2s4",     NULL,           "tegra30-i2s.4",        i2s4_parents,           CLK_SOURCE_I2S4,        102,    &periph_v_regs, TEGRA_PERIPH_ON_APB, i2s4),
+       TEGRA_INIT_DATA_MUX("spdif_out", "spdif_out",   "tegra30-spdif",        spdif_out_parents,      CLK_SOURCE_SPDIF_OUT,   10,     &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_out),
+       TEGRA_INIT_DATA_MUX("spdif_in", "spdif_in",     "tegra30-spdif",        spdif_in_parents,       CLK_SOURCE_SPDIF_IN,    10,     &periph_l_regs, TEGRA_PERIPH_ON_APB, spdif_in),
+       TEGRA_INIT_DATA_MUX("d_audio",  "d_audio",      "tegra30-ahub",         mux_pllacp_clkm,        CLK_SOURCE_D_AUDIO,     106,    &periph_v_regs, 0, d_audio),
+       TEGRA_INIT_DATA_MUX("dam0",     NULL,           "tegra30-dam.0",        mux_pllacp_clkm,        CLK_SOURCE_DAM0,        108,    &periph_v_regs, 0, dam0),
+       TEGRA_INIT_DATA_MUX("dam1",     NULL,           "tegra30-dam.1",        mux_pllacp_clkm,        CLK_SOURCE_DAM1,        109,    &periph_v_regs, 0, dam1),
+       TEGRA_INIT_DATA_MUX("dam2",     NULL,           "tegra30-dam.2",        mux_pllacp_clkm,        CLK_SOURCE_DAM2,        110,    &periph_v_regs, 0, dam2),
+       TEGRA_INIT_DATA_MUX("hda",      "hda",          "tegra30-hda",          mux_pllpcm_clkm,        CLK_SOURCE_HDA,         125,    &periph_v_regs, 0, hda),
+       TEGRA_INIT_DATA_MUX("hda2codec_2x", "hda2codec", "tegra30-hda",         mux_pllpcm_clkm,        CLK_SOURCE_HDA2CODEC_2X, 111,   &periph_v_regs, 0, hda2codec_2x),
+       TEGRA_INIT_DATA_MUX("sbc1",     NULL,           "spi_tegra.0",          mux_pllpcm_clkm,        CLK_SOURCE_SBC1,        41,     &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc1),
+       TEGRA_INIT_DATA_MUX("sbc2",     NULL,           "spi_tegra.1",          mux_pllpcm_clkm,        CLK_SOURCE_SBC2,        44,     &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc2),
+       TEGRA_INIT_DATA_MUX("sbc3",     NULL,           "spi_tegra.2",          mux_pllpcm_clkm,        CLK_SOURCE_SBC3,        46,     &periph_h_regs, TEGRA_PERIPH_ON_APB, sbc3),
+       TEGRA_INIT_DATA_MUX("sbc4",     NULL,           "spi_tegra.3",          mux_pllpcm_clkm,        CLK_SOURCE_SBC4,        68,     &periph_u_regs, TEGRA_PERIPH_ON_APB, sbc4),
+       TEGRA_INIT_DATA_MUX("sbc5",     NULL,           "spi_tegra.4",          mux_pllpcm_clkm,        CLK_SOURCE_SBC5,        104,    &periph_v_regs, TEGRA_PERIPH_ON_APB, sbc5),
+       TEGRA_INIT_DATA_MUX("sbc6",     NULL,           "spi_tegra.5",          mux_pllpcm_clkm,        CLK_SOURCE_SBC6,        105,    &periph_v_regs, TEGRA_PERIPH_ON_APB, sbc6),
+       TEGRA_INIT_DATA_MUX("sata_oob", NULL,           "tegra_sata_oob",       mux_pllpcm_clkm,        CLK_SOURCE_SATA_OOB,    123,    &periph_v_regs, TEGRA_PERIPH_ON_APB, sata_oob),
+       TEGRA_INIT_DATA_MUX("sata",     NULL,           "tegra_sata",           mux_pllpcm_clkm,        CLK_SOURCE_SATA,        124,    &periph_v_regs, TEGRA_PERIPH_ON_APB, sata),
+       TEGRA_INIT_DATA_MUX("ndflash",  NULL,           "tegra_nand",           mux_pllpcm_clkm,        CLK_SOURCE_NDFLASH,     13,     &periph_l_regs, TEGRA_PERIPH_ON_APB, ndflash),
+       TEGRA_INIT_DATA_MUX("ndspeed",  NULL,           "tegra_nand_speed",     mux_pllpcm_clkm,        CLK_SOURCE_NDSPEED,     80,     &periph_u_regs, TEGRA_PERIPH_ON_APB, ndspeed),
+       TEGRA_INIT_DATA_MUX("vfir",     NULL,           "vfir",                 mux_pllpcm_clkm,        CLK_SOURCE_VFIR,        7,      &periph_l_regs, TEGRA_PERIPH_ON_APB, vfir),
+       TEGRA_INIT_DATA_MUX("csite",    NULL,           "csite",                mux_pllpcm_clkm,        CLK_SOURCE_CSITE,       73,     &periph_u_regs, TEGRA_PERIPH_ON_APB, csite),
+       TEGRA_INIT_DATA_MUX("la",       NULL,           "la",                   mux_pllpcm_clkm,        CLK_SOURCE_LA,          76,     &periph_u_regs, TEGRA_PERIPH_ON_APB, la),
+       TEGRA_INIT_DATA_MUX("owr",      NULL,           "tegra_w1",             mux_pllpcm_clkm,        CLK_SOURCE_OWR,         71,     &periph_u_regs, TEGRA_PERIPH_ON_APB, owr),
+       TEGRA_INIT_DATA_MUX("mipi",     NULL,           "mipi",                 mux_pllpcm_clkm,        CLK_SOURCE_MIPI,        50,     &periph_h_regs, TEGRA_PERIPH_ON_APB, mipi),
+       TEGRA_INIT_DATA_MUX("tsensor",  NULL,           "tegra-tsensor",        mux_pllpc_clkm_clk32k,  CLK_SOURCE_TSENSOR,     100,    &periph_v_regs, TEGRA_PERIPH_ON_APB, tsensor),
+       TEGRA_INIT_DATA_MUX("i2cslow",  NULL,           "i2cslow",              mux_pllpc_clk32k_clkm,  CLK_SOURCE_I2CSLOW,     81,     &periph_u_regs, TEGRA_PERIPH_ON_APB, i2cslow),
+       TEGRA_INIT_DATA_INT("vde",      NULL,           "vde",                  mux_pllpcm_clkm,        CLK_SOURCE_VDE,         61,     &periph_h_regs, 0, vde),
+       TEGRA_INIT_DATA_INT("vi",       "vi",           "tegra_camera",         mux_pllmcpa,            CLK_SOURCE_VI,          20,     &periph_l_regs, 0, vi),
+       TEGRA_INIT_DATA_INT("epp",      NULL,           "epp",                  mux_pllmcpa,            CLK_SOURCE_EPP,         19,     &periph_l_regs, 0, epp),
+       TEGRA_INIT_DATA_INT("mpe",      NULL,           "mpe",                  mux_pllmcpa,            CLK_SOURCE_MPE,         60,     &periph_h_regs, 0, mpe),
+       TEGRA_INIT_DATA_INT("host1x",   NULL,           "host1x",               mux_pllmcpa,            CLK_SOURCE_HOST1X,      28,     &periph_l_regs, 0, host1x),
+       TEGRA_INIT_DATA_INT("3d",       NULL,           "3d",                   mux_pllmcpa,            CLK_SOURCE_3D,          24,     &periph_l_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d),
+       TEGRA_INIT_DATA_INT("3d2",      NULL,           "3d2",                  mux_pllmcpa,            CLK_SOURCE_3D2,         98,     &periph_v_regs, TEGRA_PERIPH_MANUAL_RESET, gr3d2),
+       TEGRA_INIT_DATA_INT("2d",       NULL,           "2d",                   mux_pllmcpa,            CLK_SOURCE_2D,          21,     &periph_l_regs, 0, gr2d),
+       TEGRA_INIT_DATA_INT("se",       NULL,           "se",                   mux_pllpcm_clkm,        CLK_SOURCE_SE,          127,    &periph_v_regs, 0, se),
+       TEGRA_INIT_DATA_MUX("mselect",  NULL,           "mselect",              mux_pllp_clkm,          CLK_SOURCE_MSELECT,     99,     &periph_v_regs, 0, mselect),
+       TEGRA_INIT_DATA_MUX("nor",      NULL,           "tegra-nor",            mux_pllpcm_clkm,        CLK_SOURCE_NOR,         42,     &periph_h_regs, 0, nor),
+       TEGRA_INIT_DATA_MUX("sdmmc1",   NULL,           "sdhci-tegra.0",        mux_pllpcm_clkm,        CLK_SOURCE_SDMMC1,      14,     &periph_l_regs, 0, sdmmc1),
+       TEGRA_INIT_DATA_MUX("sdmmc2",   NULL,           "sdhci-tegra.1",        mux_pllpcm_clkm,        CLK_SOURCE_SDMMC2,      9,      &periph_l_regs, 0, sdmmc2),
+       TEGRA_INIT_DATA_MUX("sdmmc3",   NULL,           "sdhci-tegra.2",        mux_pllpcm_clkm,        CLK_SOURCE_SDMMC3,      69,     &periph_u_regs, 0, sdmmc3),
+       TEGRA_INIT_DATA_MUX("sdmmc4",   NULL,           "sdhci-tegra.3",        mux_pllpcm_clkm,        CLK_SOURCE_SDMMC4,      15,     &periph_l_regs, 0, sdmmc4),
+       TEGRA_INIT_DATA_MUX("cve",      NULL,           "cve",                  mux_pllpdc_clkm,        CLK_SOURCE_CVE,         49,     &periph_h_regs, 0, cve),
+       TEGRA_INIT_DATA_MUX("tvo",      NULL,           "tvo",                  mux_pllpdc_clkm,        CLK_SOURCE_TVO,         49,     &periph_h_regs, 0, tvo),
+       TEGRA_INIT_DATA_MUX("tvdac",    NULL,           "tvdac",                mux_pllpdc_clkm,        CLK_SOURCE_TVDAC,       53,     &periph_h_regs, 0, tvdac),
+       TEGRA_INIT_DATA_MUX("actmon",   NULL,           "actmon",               mux_pllpc_clk32k_clkm,  CLK_SOURCE_ACTMON,      119,    &periph_v_regs, 0, actmon),
+       TEGRA_INIT_DATA_MUX("vi_sensor", "vi_sensor",   "tegra_camera",         mux_pllmcpa,            CLK_SOURCE_VI_SENSOR,   20,     &periph_l_regs, TEGRA_PERIPH_NO_RESET, vi_sensor),
+       TEGRA_INIT_DATA_DIV16("i2c1",   "div-clk",      "tegra-i2c.0",          mux_pllp_clkm,          CLK_SOURCE_I2C1,        12,     &periph_l_regs, TEGRA_PERIPH_ON_APB, i2c1),
+       TEGRA_INIT_DATA_DIV16("i2c2",   "div-clk",      "tegra-i2c.1",          mux_pllp_clkm,          CLK_SOURCE_I2C2,        54,     &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c2),
+       TEGRA_INIT_DATA_DIV16("i2c3",   "div-clk",      "tegra-i2c.2",          mux_pllp_clkm,          CLK_SOURCE_I2C3,        67,     &periph_u_regs, TEGRA_PERIPH_ON_APB, i2c3),
+       TEGRA_INIT_DATA_DIV16("i2c4",   "div-clk",      "tegra-i2c.3",          mux_pllp_clkm,          CLK_SOURCE_I2C4,        103,    &periph_v_regs, TEGRA_PERIPH_ON_APB, i2c4),
+       TEGRA_INIT_DATA_DIV16("i2c5",   "div-clk",      "tegra-i2c.4",          mux_pllp_clkm,          CLK_SOURCE_I2C5,        47,     &periph_h_regs, TEGRA_PERIPH_ON_APB, i2c5),
+       TEGRA_INIT_DATA_UART("uarta",   NULL,           "tegra_uart.0",         mux_pllpcm_clkm,        CLK_SOURCE_UARTA,       6,      &periph_l_regs, uarta),
+       TEGRA_INIT_DATA_UART("uartb",   NULL,           "tegra_uart.1",         mux_pllpcm_clkm,        CLK_SOURCE_UARTB,       7,      &periph_l_regs, uartb),
+       TEGRA_INIT_DATA_UART("uartc",   NULL,           "tegra_uart.2",         mux_pllpcm_clkm,        CLK_SOURCE_UARTC,       55,     &periph_h_regs, uartc),
+       TEGRA_INIT_DATA_UART("uartd",   NULL,           "tegra_uart.3",         mux_pllpcm_clkm,        CLK_SOURCE_UARTD,       65,     &periph_u_regs, uartd),
+       TEGRA_INIT_DATA_UART("uarte",   NULL,           "tegra_uart.4",         mux_pllpcm_clkm,        CLK_SOURCE_UARTE,       66,     &periph_u_regs, uarte),
+       TEGRA_INIT_DATA_MUX8("hdmi",    NULL,           "hdmi",                 mux_pllpmdacd2_clkm,    CLK_SOURCE_HDMI,        51,     &periph_h_regs, 0, hdmi),
+       TEGRA_INIT_DATA_MUX8("extern1", NULL,           "extern1",              mux_plla_clk32k_pllp_clkm_plle, CLK_SOURCE_EXTERN1,     120,    &periph_v_regs, 0, extern1),
+       TEGRA_INIT_DATA_MUX8("extern2", NULL,           "extern2",              mux_plla_clk32k_pllp_clkm_plle, CLK_SOURCE_EXTERN2,     121,    &periph_v_regs, 0, extern2),
+       TEGRA_INIT_DATA_MUX8("extern3", NULL,           "extern3",              mux_plla_clk32k_pllp_clkm_plle, CLK_SOURCE_EXTERN3,     122,    &periph_v_regs, 0, extern3),
+       TEGRA_INIT_DATA("pwm",          NULL,           "pwm",                  mux_pllpc_clk32k_clkm,  CLK_SOURCE_PWM,         28, 2, 0, 0, 8, 1, 0, &periph_l_regs, 17, periph_clk_enb_refcnt, 0, pwm),
+};
+
+static struct tegra_periph_init_data tegra_periph_nodiv_clk_list[] = {
+       TEGRA_INIT_DATA_NODIV("disp1",  NULL, "tegradc.0", mux_pllpmdacd2_clkm,      CLK_SOURCE_DISP1,  29, 3, 27, &periph_l_regs, 0, disp1),
+       TEGRA_INIT_DATA_NODIV("disp2",  NULL, "tegradc.1", mux_pllpmdacd2_clkm,      CLK_SOURCE_DISP2,  29, 3, 26, &periph_l_regs, 0, disp2),
+       TEGRA_INIT_DATA_NODIV("dsib",   NULL, "tegradc.1", mux_plld_out0_plld2_out0, CLK_SOURCE_DSIB,   25, 1, 82, &periph_u_regs, 0, dsib),
+};
+
+static void __init tegra30_periph_clk_init(void)
+{
+       struct tegra_periph_init_data *data;
+       struct clk *clk;
+       int i;
+
+       /* apbdma */
+       clk = tegra_clk_register_periph_gate("apbdma", "clk_m", 0, clk_base, 0, 34,
+                                   &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-apbdma");
+       clks[apbdma] = clk;
+
+       /* rtc */
+       clk = tegra_clk_register_periph_gate("rtc", "clk_32k",
+                                   TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 4, &periph_l_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "rtc-tegra");
+       clks[rtc] = clk;
+
+       /* timer */
+       clk = tegra_clk_register_periph_gate("timer", "clk_m", 0, clk_base, 0,
+                                   5, &periph_l_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "timer");
+       clks[timer] = clk;
+
+       /* kbc */
+       clk = tegra_clk_register_periph_gate("kbc", "clk_32k",
+                                   TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 36, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-kbc");
+       clks[kbc] = clk;
+
+       /* csus */
+       clk = tegra_clk_register_periph_gate("csus", "clk_m",
+                                   TEGRA_PERIPH_NO_RESET | TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 92, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "csus", "tengra_camera");
+       clks[csus] = clk;
+
+       /* vcp */
+       clk = tegra_clk_register_periph_gate("vcp", "clk_m", 0, clk_base, 0, 29,
+                                   &periph_l_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "vcp", "tegra-avp");
+       clks[vcp] = clk;
+
+       /* bsea */
+       clk = tegra_clk_register_periph_gate("bsea", "clk_m", 0, clk_base, 0,
+                                   62, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "bsea", "tegra-avp");
+       clks[bsea] = clk;
+
+       /* bsev */
+       clk = tegra_clk_register_periph_gate("bsev", "clk_m", 0, clk_base, 0,
+                                   63, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "bsev", "tegra-aes");
+       clks[bsev] = clk;
+
+       /* usbd */
+       clk = tegra_clk_register_periph_gate("usbd", "clk_m", 0, clk_base, 0,
+                                   22, &periph_l_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "fsl-tegra-udc");
+       clks[usbd] = clk;
+
+       /* usb2 */
+       clk = tegra_clk_register_periph_gate("usb2", "clk_m", 0, clk_base, 0,
+                                   58, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-ehci.1");
+       clks[usb2] = clk;
+
+       /* usb3 */
+       clk = tegra_clk_register_periph_gate("usb3", "clk_m", 0, clk_base, 0,
+                                   59, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra-ehci.2");
+       clks[usb3] = clk;
+
+       /* dsia */
+       clk = tegra_clk_register_periph_gate("dsia", "pll_d_out0", 0, clk_base,
+                                   0, 48, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "dsia", "tegradc.0");
+       clks[dsia] = clk;
+
+       /* csi */
+       clk = tegra_clk_register_periph_gate("csi", "pll_p_out3", 0, clk_base,
+                                   0, 52, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "csi", "tegra_camera");
+       clks[csi] = clk;
+
+       /* isp */
+       clk = tegra_clk_register_periph_gate("isp", "clk_m", 0, clk_base, 0, 23,
+                                   &periph_l_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "isp", "tegra_camera");
+       clks[isp] = clk;
+
+       /* pcie */
+       clk = tegra_clk_register_periph_gate("pcie", "clk_m", 0, clk_base, 0,
+                                   70, &periph_u_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "pcie", "tegra-pcie");
+       clks[pcie] = clk;
+
+       /* afi */
+       clk = tegra_clk_register_periph_gate("afi", "clk_m", 0, clk_base, 0, 72,
+                                   &periph_u_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "afi", "tegra-pcie");
+       clks[afi] = clk;
+
+       /* kfuse */
+       clk = tegra_clk_register_periph_gate("kfuse", "clk_m",
+                                   TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 40, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "kfuse-tegra");
+       clks[kfuse] = clk;
+
+       /* fuse */
+       clk = tegra_clk_register_periph_gate("fuse", "clk_m",
+                                   TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 39, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "fuse", "fuse-tegra");
+       clks[fuse] = clk;
+
+       /* fuse_burn */
+       clk = tegra_clk_register_periph_gate("fuse_burn", "clk_m",
+                                   TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 39, &periph_h_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "fuse_burn", "fuse-tegra");
+       clks[fuse_burn] = clk;
+
+       /* apbif */
+       clk = tegra_clk_register_periph_gate("apbif", "clk_m", 0,
+                                   clk_base, 0, 107, &periph_v_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "apbif", "tegra30-ahub");
+       clks[apbif] = clk;
+
+       /* hda2hdmi */
+       clk = tegra_clk_register_periph_gate("hda2hdmi", "clk_m",
+                                   TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 128, &periph_w_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "hda2hdmi", "tegra30-hda");
+       clks[hda2hdmi] = clk;
+
+       /* sata_cold */
+       clk = tegra_clk_register_periph_gate("sata_cold", "clk_m",
+                                   TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 129, &periph_w_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "tegra_sata_cold");
+       clks[sata_cold] = clk;
+
+       /* dtv */
+       clk = tegra_clk_register_periph_gate("dtv", "clk_m",
+                                   TEGRA_PERIPH_ON_APB,
+                                   clk_base, 0, 79, &periph_u_regs,
+                                   periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, NULL, "dtv");
+       clks[dtv] = clk;
+
+       /* emc */
+       clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm,
+                              ARRAY_SIZE(mux_pllmcp_clkm), 0,
+                              clk_base + CLK_SOURCE_EMC,
+                              30, 2, 0, NULL);
+       clk = tegra_clk_register_periph_gate("emc", "emc_mux", 0, clk_base, 0,
+                                   57, &periph_h_regs, periph_clk_enb_refcnt);
+       clk_register_clkdev(clk, "emc", NULL);
+       clks[emc] = clk;
+
+       for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
+               data = &tegra_periph_clk_list[i];
+               clk = tegra_clk_register_periph(data->name, data->parent_names,
+                               data->num_parents, &data->periph,
+                               clk_base, data->offset);
+               clk_register_clkdev(clk, data->con_id, data->dev_id);
+               clks[data->clk_id] = clk;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(tegra_periph_nodiv_clk_list); i++) {
+               data = &tegra_periph_nodiv_clk_list[i];
+               clk = tegra_clk_register_periph_nodiv(data->name,
+                                       data->parent_names,
+                                       data->num_parents, &data->periph,
+                                       clk_base, data->offset);
+               clk_register_clkdev(clk, data->con_id, data->dev_id);
+               clks[data->clk_id] = clk;
+       }
+}
+
+static void __init tegra30_fixed_clk_init(void)
+{
+       struct clk *clk;
+
+       /* clk_32k */
+       clk = clk_register_fixed_rate(NULL, "clk_32k", NULL, CLK_IS_ROOT,
+                               32768);
+       clk_register_clkdev(clk, "clk_32k", NULL);
+       clks[clk_32k] = clk;
+
+       /* clk_m_div2 */
+       clk = clk_register_fixed_factor(NULL, "clk_m_div2", "clk_m",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "clk_m_div2", NULL);
+       clks[clk_m_div2] = clk;
+
+       /* clk_m_div4 */
+       clk = clk_register_fixed_factor(NULL, "clk_m_div4", "clk_m",
+                               CLK_SET_RATE_PARENT, 1, 4);
+       clk_register_clkdev(clk, "clk_m_div4", NULL);
+       clks[clk_m_div4] = clk;
+
+       /* cml0 */
+       clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
+                               0, 0, &cml_lock);
+       clk_register_clkdev(clk, "cml0", NULL);
+       clks[cml0] = clk;
+
+       /* cml1 */
+       clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX,
+                               1, 0, &cml_lock);
+       clk_register_clkdev(clk, "cml1", NULL);
+       clks[cml1] = clk;
+
+       /* pciex */
+       clk = clk_register_fixed_rate(NULL, "pciex", "pll_e", 0, 100000000);
+       clk_register_clkdev(clk, "pciex", NULL);
+       clks[pciex] = clk;
+}
+
+static void __init tegra30_osc_clk_init(void)
+{
+       struct clk *clk;
+       unsigned int pll_ref_div;
+
+       tegra30_clk_measure_input_freq();
+
+       /* clk_m */
+       clk = clk_register_fixed_rate(NULL, "clk_m", NULL, CLK_IS_ROOT,
+                               input_freq);
+       clk_register_clkdev(clk, "clk_m", NULL);
+       clks[clk_m] = clk;
+
+       /* pll_ref */
+       pll_ref_div = tegra30_get_pll_ref_div();
+       clk = clk_register_fixed_factor(NULL, "pll_ref", "clk_m",
+                               CLK_SET_RATE_PARENT, 1, pll_ref_div);
+       clk_register_clkdev(clk, "pll_ref", NULL);
+       clks[pll_ref] = clk;
+}
+
+/* Tegra30 CPU clock and reset control functions */
+static void tegra30_wait_cpu_in_reset(u32 cpu)
+{
+       unsigned int reg;
+
+       do {
+               reg = readl(clk_base +
+                           TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
+               cpu_relax();
+       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
+
+       return;
+}
+
+static void tegra30_put_cpu_in_reset(u32 cpu)
+{
+       writel(CPU_RESET(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+       dmb();
+}
+
+static void tegra30_cpu_out_of_reset(u32 cpu)
+{
+       writel(CPU_RESET(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
+       wmb();
+}
+
+
+static void tegra30_enable_cpu_clock(u32 cpu)
+{
+       unsigned int reg;
+
+       writel(CPU_CLOCK(cpu),
+              clk_base + TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
+       reg = readl(clk_base +
+                   TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
+}
+
+static void tegra30_disable_cpu_clock(u32 cpu)
+{
+
+       unsigned int reg;
+
+       reg = readl(clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       writel(reg | CPU_CLOCK(cpu),
+              clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+}
+
+#ifdef CONFIG_PM_SLEEP
+static bool tegra30_cpu_rail_off_ready(void)
+{
+       unsigned int cpu_rst_status;
+       int cpu_pwr_status;
+
+       cpu_rst_status = readl(clk_base +
+                               TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
+       cpu_pwr_status = tegra_powergate_is_powered(TEGRA_POWERGATE_CPU1) ||
+                        tegra_powergate_is_powered(TEGRA_POWERGATE_CPU2) ||
+                        tegra_powergate_is_powered(TEGRA_POWERGATE_CPU3);
+
+       if (((cpu_rst_status & 0xE) != 0xE) || cpu_pwr_status)
+               return false;
+
+       return true;
+}
+
+static void tegra30_cpu_clock_suspend(void)
+{
+       /* switch coresite to clk_m, save off original source */
+       tegra30_cpu_clk_sctx.clk_csite_src =
+                               readl(clk_base + CLK_RESET_SOURCE_CSITE);
+       writel(3<<30, clk_base + CLK_RESET_SOURCE_CSITE);
+
+       tegra30_cpu_clk_sctx.cpu_burst =
+                               readl(clk_base + CLK_RESET_CCLK_BURST);
+       tegra30_cpu_clk_sctx.pllx_base =
+                               readl(clk_base + CLK_RESET_PLLX_BASE);
+       tegra30_cpu_clk_sctx.pllx_misc =
+                               readl(clk_base + CLK_RESET_PLLX_MISC);
+       tegra30_cpu_clk_sctx.cclk_divider =
+                               readl(clk_base + CLK_RESET_CCLK_DIVIDER);
+}
+
+static void tegra30_cpu_clock_resume(void)
+{
+       unsigned int reg, policy;
+
+       /* Is CPU complex already running on PLLX? */
+       reg = readl(clk_base + CLK_RESET_CCLK_BURST);
+       policy = (reg >> CLK_RESET_CCLK_BURST_POLICY_SHIFT) & 0xF;
+
+       if (policy == CLK_RESET_CCLK_IDLE_POLICY)
+               reg = (reg >> CLK_RESET_CCLK_IDLE_POLICY_SHIFT) & 0xF;
+       else if (policy == CLK_RESET_CCLK_RUN_POLICY)
+               reg = (reg >> CLK_RESET_CCLK_RUN_POLICY_SHIFT) & 0xF;
+       else
+               BUG();
+
+       if (reg != CLK_RESET_CCLK_BURST_POLICY_PLLX) {
+               /* restore PLLX settings if CPU is on different PLL */
+               writel(tegra30_cpu_clk_sctx.pllx_misc,
+                                       clk_base + CLK_RESET_PLLX_MISC);
+               writel(tegra30_cpu_clk_sctx.pllx_base,
+                                       clk_base + CLK_RESET_PLLX_BASE);
+
+               /* wait for PLL stabilization if PLLX was enabled */
+               if (tegra30_cpu_clk_sctx.pllx_base & (1 << 30))
+                       udelay(300);
+       }
+
+       /*
+        * Restore original burst policy setting for calls resulting from CPU
+        * LP2 in idle or system suspend.
+        */
+       writel(tegra30_cpu_clk_sctx.cclk_divider,
+                                       clk_base + CLK_RESET_CCLK_DIVIDER);
+       writel(tegra30_cpu_clk_sctx.cpu_burst,
+                                       clk_base + CLK_RESET_CCLK_BURST);
+
+       writel(tegra30_cpu_clk_sctx.clk_csite_src,
+                                       clk_base + CLK_RESET_SOURCE_CSITE);
+}
+#endif
+
+static struct tegra_cpu_car_ops tegra30_cpu_car_ops = {
+       .wait_for_reset = tegra30_wait_cpu_in_reset,
+       .put_in_reset   = tegra30_put_cpu_in_reset,
+       .out_of_reset   = tegra30_cpu_out_of_reset,
+       .enable_clock   = tegra30_enable_cpu_clock,
+       .disable_clock  = tegra30_disable_cpu_clock,
+#ifdef CONFIG_PM_SLEEP
+       .rail_off_ready = tegra30_cpu_rail_off_ready,
+       .suspend        = tegra30_cpu_clock_suspend,
+       .resume         = tegra30_cpu_clock_resume,
+#endif
+};
+
+static __initdata struct tegra_clk_init_table init_table[] = {
+       {uarta, pll_p, 408000000, 1},
+       {pll_a, clk_max, 564480000, 1},
+       {pll_a_out0, clk_max, 11289600, 1},
+       {extern1, pll_a_out0, 0, 1},
+       {clk_out_1_mux, extern1, 0, 0},
+       {clk_out_1, clk_max, 0, 1},
+       {blink, clk_max, 0, 1},
+       {i2s0, pll_a_out0, 11289600, 0},
+       {i2s1, pll_a_out0, 11289600, 0},
+       {i2s2, pll_a_out0, 11289600, 0},
+       {i2s3, pll_a_out0, 11289600, 0},
+       {i2s4, pll_a_out0, 11289600, 0},
+       {sdmmc1, pll_p, 48000000, 0},
+       {sdmmc2, pll_p, 48000000, 0},
+       {sdmmc3, pll_p, 48000000, 0},
+       {pll_m, clk_max, 0, 1},
+       {pclk, clk_max, 0, 1},
+       {csite, clk_max, 0, 1},
+       {emc, clk_max, 0, 1},
+       {mselect, clk_max, 0, 1},
+       {sbc1, pll_p, 100000000, 0},
+       {sbc2, pll_p, 100000000, 0},
+       {sbc3, pll_p, 100000000, 0},
+       {sbc4, pll_p, 100000000, 0},
+       {sbc5, pll_p, 100000000, 0},
+       {sbc6, pll_p, 100000000, 0},
+       {host1x, pll_c, 150000000, 0},
+       {disp1, pll_p, 600000000, 0},
+       {disp2, pll_p, 600000000, 0},
+       {twd, clk_max, 0, 1},
+       {clk_max, clk_max, 0, 0}, /* This MUST be the last entry. */
+};
+
+/*
+ * Some clocks may be used by different drivers depending on the board
+ * configuration.  List those here to register them twice in the clock lookup
+ * table under two names.
+ */
+static struct tegra_clk_duplicate tegra_clk_duplicates[] = {
+       TEGRA_CLK_DUPLICATE(usbd, "utmip-pad", NULL),
+       TEGRA_CLK_DUPLICATE(usbd, "tegra-ehci.0", NULL),
+       TEGRA_CLK_DUPLICATE(usbd, "tegra-otg", NULL),
+       TEGRA_CLK_DUPLICATE(bsev, "tegra-avp", "bsev"),
+       TEGRA_CLK_DUPLICATE(bsev, "nvavp", "bsev"),
+       TEGRA_CLK_DUPLICATE(vde, "tegra-aes", "vde"),
+       TEGRA_CLK_DUPLICATE(bsea, "tegra-aes", "bsea"),
+       TEGRA_CLK_DUPLICATE(bsea, "nvavp", "bsea"),
+       TEGRA_CLK_DUPLICATE(cml1, "tegra_sata_cml", NULL),
+       TEGRA_CLK_DUPLICATE(cml0, "tegra_pcie", "cml"),
+       TEGRA_CLK_DUPLICATE(pciex, "tegra_pcie", "pciex"),
+       TEGRA_CLK_DUPLICATE(twd, "smp_twd", NULL),
+       TEGRA_CLK_DUPLICATE(vcp, "nvavp", "vcp"),
+       TEGRA_CLK_DUPLICATE(clk_max, NULL, NULL), /* MUST be the last entry */
+};
+
+static const struct of_device_id pmc_match[] __initconst = {
+       { .compatible = "nvidia,tegra30-pmc" },
+       {},
+};
+
+void __init tegra30_clock_init(struct device_node *np)
+{
+       struct device_node *node;
+       int i;
+
+       clk_base = of_iomap(np, 0);
+       if (!clk_base) {
+               pr_err("ioremap tegra30 CAR failed\n");
+               return;
+       }
+
+       node = of_find_matching_node(NULL, pmc_match);
+       if (!node) {
+               pr_err("Failed to find pmc node\n");
+               BUG();
+       }
+
+       pmc_base = of_iomap(node, 0);
+       if (!pmc_base) {
+               pr_err("Can't map pmc registers\n");
+               BUG();
+       }
+
+       tegra30_osc_clk_init();
+       tegra30_fixed_clk_init();
+       tegra30_pll_init();
+       tegra30_super_clk_init();
+       tegra30_periph_clk_init();
+       tegra30_audio_clk_init();
+       tegra30_pmc_clk_init();
+
+       for (i = 0; i < ARRAY_SIZE(clks); i++) {
+               if (IS_ERR(clks[i])) {
+                       pr_err("Tegra30 clk %d: register failed with %ld\n",
+                              i, PTR_ERR(clks[i]));
+                       BUG();
+               }
+               if (!clks[i])
+                       clks[i] = ERR_PTR(-EINVAL);
+       }
+
+       tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max);
+
+       clk_data.clks = clks;
+       clk_data.clk_num = ARRAY_SIZE(clks);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+
+       tegra_init_from_table(init_table, clks, clk_max);
+
+       tegra_cpu_car_ops = &tegra30_cpu_car_ops;
+}
diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c
new file mode 100644 (file)
index 0000000..a603b9a
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/of.h>
+#include <linux/clk/tegra.h>
+
+#include "clk.h"
+
+/* Global data of Tegra CPU CAR ops */
+struct tegra_cpu_car_ops *tegra_cpu_car_ops;
+
+void __init tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list,
+                               struct clk *clks[], int clk_max)
+{
+       struct clk *clk;
+
+       for (; dup_list->clk_id < clk_max; dup_list++) {
+               clk = clks[dup_list->clk_id];
+               dup_list->lookup.clk = clk;
+               clkdev_add(&dup_list->lookup);
+       }
+}
+
+void __init tegra_init_from_table(struct tegra_clk_init_table *tbl,
+                                 struct clk *clks[], int clk_max)
+{
+       struct clk *clk;
+
+       for (; tbl->clk_id < clk_max; tbl++) {
+               clk = clks[tbl->clk_id];
+               if (IS_ERR_OR_NULL(clk))
+                       return;
+
+               if (tbl->parent_id < clk_max) {
+                       struct clk *parent = clks[tbl->parent_id];
+                       if (clk_set_parent(clk, parent)) {
+                               pr_err("%s: Failed to set parent %s of %s\n",
+                                      __func__, __clk_get_name(parent),
+                                      __clk_get_name(clk));
+                               WARN_ON(1);
+                       }
+               }
+
+               if (tbl->rate)
+                       if (clk_set_rate(clk, tbl->rate)) {
+                               pr_err("%s: Failed to set rate %lu of %s\n",
+                                      __func__, tbl->rate,
+                                      __clk_get_name(clk));
+                               WARN_ON(1);
+                       }
+
+               if (tbl->state)
+                       if (clk_prepare_enable(clk)) {
+                               pr_err("%s: Failed to enable %s\n", __func__,
+                                      __clk_get_name(clk));
+                               WARN_ON(1);
+                       }
+       }
+}
+
+static const struct of_device_id tegra_dt_clk_match[] = {
+       { .compatible = "nvidia,tegra20-car", .data = tegra20_clock_init },
+       { .compatible = "nvidia,tegra30-car", .data = tegra30_clock_init },
+       { }
+};
+
+void __init tegra_clocks_init(void)
+{
+       of_clk_init(tegra_dt_clk_match);
+}
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
new file mode 100644 (file)
index 0000000..0744731
--- /dev/null
@@ -0,0 +1,502 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __TEGRA_CLK_H
+#define __TEGRA_CLK_H
+
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+
+/**
+ * struct tegra_clk_sync_source - external clock source from codec
+ *
+ * @hw: handle between common and hardware-specific interfaces
+ * @rate: input frequency from source
+ * @max_rate: max rate allowed
+ */
+struct tegra_clk_sync_source {
+       struct          clk_hw hw;
+       unsigned long   rate;
+       unsigned long   max_rate;
+};
+
+#define to_clk_sync_source(_hw)                                        \
+       container_of(_hw, struct tegra_clk_sync_source, hw)
+
+extern const struct clk_ops tegra_clk_sync_source_ops;
+struct clk *tegra_clk_register_sync_source(const char *name,
+               unsigned long fixed_rate, unsigned long max_rate);
+
+/**
+ * struct tegra_clk_frac_div - fractional divider clock
+ *
+ * @hw:                handle between common and hardware-specific interfaces
+ * @reg:       register containing divider
+ * @flags:     hardware-specific flags
+ * @shift:     shift to the divider bit field
+ * @width:     width of the divider bit field
+ * @frac_width:        width of the fractional bit field
+ * @lock:      register lock
+ *
+ * Flags:
+ * TEGRA_DIVIDER_ROUND_UP - This flags indicates to round up the divider value.
+ * TEGRA_DIVIDER_FIXED - Fixed rate PLL dividers has addition override bit, this
+ *      flag indicates that this divider is for fixed rate PLL.
+ * TEGRA_DIVIDER_INT - Some modules can not cope with the duty cycle when
+ *      fraction bit is set. This flags indicates to calculate divider for which
+ *      fracton bit will be zero.
+ * TEGRA_DIVIDER_UART - UART module divider has additional enable bit which is
+ *      set when divider value is not 0. This flags indicates that the divider
+ *      is for UART module.
+ */
+struct tegra_clk_frac_div {
+       struct clk_hw   hw;
+       void __iomem    *reg;
+       u8              flags;
+       u8              shift;
+       u8              width;
+       u8              frac_width;
+       spinlock_t      *lock;
+};
+
+#define to_clk_frac_div(_hw) container_of(_hw, struct tegra_clk_frac_div, hw)
+
+#define TEGRA_DIVIDER_ROUND_UP BIT(0)
+#define TEGRA_DIVIDER_FIXED BIT(1)
+#define TEGRA_DIVIDER_INT BIT(2)
+#define TEGRA_DIVIDER_UART BIT(3)
+
+extern const struct clk_ops tegra_clk_frac_div_ops;
+struct clk *tegra_clk_register_divider(const char *name,
+               const char *parent_name, void __iomem *reg,
+               unsigned long flags, u8 clk_divider_flags, u8 shift, u8 width,
+               u8 frac_width, spinlock_t *lock);
+
+/*
+ * Tegra PLL:
+ *
+ * In general, there are 3 requirements for each PLL
+ * that SW needs to be comply with.
+ * (1) Input frequency range (REF).
+ * (2) Comparison frequency range (CF). CF = REF/DIVM.
+ * (3) VCO frequency range (VCO).  VCO = CF * DIVN.
+ *
+ * The final PLL output frequency (FO) = VCO >> DIVP.
+ */
+
+/**
+ * struct tegra_clk_pll_freq_table - PLL frequecy table
+ *
+ * @input_rate:                input rate from source
+ * @output_rate:       output rate from PLL for the input rate
+ * @n:                 feedback divider
+ * @m:                 input divider
+ * @p:                 post divider
+ * @cpcon:             charge pump current
+ */
+struct tegra_clk_pll_freq_table {
+       unsigned long   input_rate;
+       unsigned long   output_rate;
+       u16             n;
+       u16             m;
+       u8              p;
+       u8              cpcon;
+};
+
+/**
+ * struct clk_pll_params - PLL parameters
+ *
+ * @input_min:                 Minimum input frequency
+ * @input_max:                 Maximum input frequency
+ * @cf_min:                    Minimum comparison frequency
+ * @cf_max:                    Maximum comparison frequency
+ * @vco_min:                   Minimum VCO frequency
+ * @vco_max:                   Maximum VCO frequency
+ * @base_reg:                  PLL base reg offset
+ * @misc_reg:                  PLL misc reg offset
+ * @lock_reg:                  PLL lock reg offset
+ * @lock_bit_idx:              Bit index for PLL lock status
+ * @lock_enable_bit_idx:       Bit index to enable PLL lock
+ * @lock_delay:                        Delay in us if PLL lock is not used
+ */
+struct tegra_clk_pll_params {
+       unsigned long   input_min;
+       unsigned long   input_max;
+       unsigned long   cf_min;
+       unsigned long   cf_max;
+       unsigned long   vco_min;
+       unsigned long   vco_max;
+
+       u32             base_reg;
+       u32             misc_reg;
+       u32             lock_reg;
+       u32             lock_bit_idx;
+       u32             lock_enable_bit_idx;
+       int             lock_delay;
+};
+
+/**
+ * struct tegra_clk_pll - Tegra PLL clock
+ *
+ * @hw:                handle between common and hardware-specifix interfaces
+ * @clk_base:  address of CAR controller
+ * @pmc:       address of PMC, required to read override bits
+ * @freq_table:        array of frequencies supported by PLL
+ * @params:    PLL parameters
+ * @flags:     PLL flags
+ * @fixed_rate:        PLL rate if it is fixed
+ * @lock:      register lock
+ * @divn_shift:        shift to the feedback divider bit field
+ * @divn_width:        width of the feedback divider bit field
+ * @divm_shift:        shift to the input divider bit field
+ * @divm_width:        width of the input divider bit field
+ * @divp_shift:        shift to the post divider bit field
+ * @divp_width:        width of the post divider bit field
+ *
+ * Flags:
+ * TEGRA_PLL_USE_LOCK - This flag indicated to use lock bits for
+ *     PLL locking. If not set it will use lock_delay value to wait.
+ * TEGRA_PLL_HAS_CPCON - This flag indicates that CPCON value needs
+ *     to be programmed to change output frequency of the PLL.
+ * TEGRA_PLL_SET_LFCON - This flag indicates that LFCON value needs
+ *     to be programmed to change output frequency of the PLL.
+ * TEGRA_PLL_SET_DCCON - This flag indicates that DCCON value needs
+ *     to be programmed to change output frequency of the PLL.
+ * TEGRA_PLLU - PLLU has inverted post divider. This flags indicated
+ *     that it is PLLU and invert post divider value.
+ * TEGRA_PLLM - PLLM has additional override settings in PMC. This
+ *     flag indicates that it is PLLM and use override settings.
+ * TEGRA_PLL_FIXED - We are not supposed to change output frequency
+ *     of some plls.
+ * TEGRA_PLLE_CONFIGURE - Configure PLLE when enabling.
+ */
+struct tegra_clk_pll {
+       struct clk_hw   hw;
+       void __iomem    *clk_base;
+       void __iomem    *pmc;
+       u8              flags;
+       unsigned long   fixed_rate;
+       spinlock_t      *lock;
+       u8              divn_shift;
+       u8              divn_width;
+       u8              divm_shift;
+       u8              divm_width;
+       u8              divp_shift;
+       u8              divp_width;
+       struct tegra_clk_pll_freq_table *freq_table;
+       struct tegra_clk_pll_params     *params;
+};
+
+#define to_clk_pll(_hw) container_of(_hw, struct tegra_clk_pll, hw)
+
+#define TEGRA_PLL_USE_LOCK BIT(0)
+#define TEGRA_PLL_HAS_CPCON BIT(1)
+#define TEGRA_PLL_SET_LFCON BIT(2)
+#define TEGRA_PLL_SET_DCCON BIT(3)
+#define TEGRA_PLLU BIT(4)
+#define TEGRA_PLLM BIT(5)
+#define TEGRA_PLL_FIXED BIT(6)
+#define TEGRA_PLLE_CONFIGURE BIT(7)
+
+extern const struct clk_ops tegra_clk_pll_ops;
+extern const struct clk_ops tegra_clk_plle_ops;
+struct clk *tegra_clk_register_pll(const char *name, const char *parent_name,
+               void __iomem *clk_base, void __iomem *pmc,
+               unsigned long flags, unsigned long fixed_rate,
+               struct tegra_clk_pll_params *pll_params, u8 pll_flags,
+               struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock);
+struct clk *tegra_clk_register_plle(const char *name, const char *parent_name,
+               void __iomem *clk_base, void __iomem *pmc,
+               unsigned long flags, unsigned long fixed_rate,
+               struct tegra_clk_pll_params *pll_params, u8 pll_flags,
+               struct tegra_clk_pll_freq_table *freq_table, spinlock_t *lock);
+
+/**
+ * struct tegra_clk_pll_out - PLL divider down clock
+ *
+ * @hw:                        handle between common and hardware-specific interfaces
+ * @reg:               register containing the PLL divider
+ * @enb_bit_idx:       bit to enable/disable PLL divider
+ * @rst_bit_idx:       bit to reset PLL divider
+ * @lock:              register lock
+ * @flags:             hardware-specific flags
+ */
+struct tegra_clk_pll_out {
+       struct clk_hw   hw;
+       void __iomem    *reg;
+       u8              enb_bit_idx;
+       u8              rst_bit_idx;
+       spinlock_t      *lock;
+       u8              flags;
+};
+
+#define to_clk_pll_out(_hw) container_of(_hw, struct tegra_clk_pll_out, hw)
+
+extern const struct clk_ops tegra_clk_pll_out_ops;
+struct clk *tegra_clk_register_pll_out(const char *name,
+               const char *parent_name, void __iomem *reg, u8 enb_bit_idx,
+               u8 rst_bit_idx, unsigned long flags, u8 pll_div_flags,
+               spinlock_t *lock);
+
+/**
+ * struct tegra_clk_periph_regs -  Registers controlling peripheral clock
+ *
+ * @enb_reg:           read the enable status
+ * @enb_set_reg:       write 1 to enable clock
+ * @enb_clr_reg:       write 1 to disable clock
+ * @rst_reg:           read the reset status
+ * @rst_set_reg:       write 1 to assert the reset of peripheral
+ * @rst_clr_reg:       write 1 to deassert the reset of peripheral
+ */
+struct tegra_clk_periph_regs {
+       u32 enb_reg;
+       u32 enb_set_reg;
+       u32 enb_clr_reg;
+       u32 rst_reg;
+       u32 rst_set_reg;
+       u32 rst_clr_reg;
+};
+
+/**
+ * struct tegra_clk_periph_gate - peripheral gate clock
+ *
+ * @magic:             magic number to validate type
+ * @hw:                        handle between common and hardware-specific interfaces
+ * @clk_base:          address of CAR controller
+ * @regs:              Registers to control the peripheral
+ * @flags:             hardware-specific flags
+ * @clk_num:           Clock number
+ * @enable_refcnt:     array to maintain reference count of the clock
+ *
+ * Flags:
+ * TEGRA_PERIPH_NO_RESET - This flag indicates that reset is not allowed
+ *     for this module.
+ * TEGRA_PERIPH_MANUAL_RESET - This flag indicates not to reset module
+ *     after clock enable and driver for the module is responsible for
+ *     doing reset.
+ * TEGRA_PERIPH_ON_APB - If peripheral is in the APB bus then read the
+ *     bus to flush the write operation in apb bus. This flag indicates
+ *     that this peripheral is in apb bus.
+ */
+struct tegra_clk_periph_gate {
+       u32                     magic;
+       struct clk_hw           hw;
+       void __iomem            *clk_base;
+       u8                      flags;
+       int                     clk_num;
+       int                     *enable_refcnt;
+       struct tegra_clk_periph_regs    *regs;
+};
+
+#define to_clk_periph_gate(_hw)                                        \
+       container_of(_hw, struct tegra_clk_periph_gate, hw)
+
+#define TEGRA_CLK_PERIPH_GATE_MAGIC 0x17760309
+
+#define TEGRA_PERIPH_NO_RESET BIT(0)
+#define TEGRA_PERIPH_MANUAL_RESET BIT(1)
+#define TEGRA_PERIPH_ON_APB BIT(2)
+
+void tegra_periph_reset(struct tegra_clk_periph_gate *gate, bool assert);
+extern const struct clk_ops tegra_clk_periph_gate_ops;
+struct clk *tegra_clk_register_periph_gate(const char *name,
+               const char *parent_name, u8 gate_flags, void __iomem *clk_base,
+               unsigned long flags, int clk_num,
+               struct tegra_clk_periph_regs *pregs, int *enable_refcnt);
+
+/**
+ * struct clk-periph - peripheral clock
+ *
+ * @magic:     magic number to validate type
+ * @hw:                handle between common and hardware-specific interfaces
+ * @mux:       mux clock
+ * @divider:   divider clock
+ * @gate:      gate clock
+ * @mux_ops:   mux clock ops
+ * @div_ops:   divider clock ops
+ * @gate_ops:  gate clock ops
+ */
+struct tegra_clk_periph {
+       u32                     magic;
+       struct clk_hw           hw;
+       struct clk_mux          mux;
+       struct tegra_clk_frac_div       divider;
+       struct tegra_clk_periph_gate    gate;
+
+       const struct clk_ops    *mux_ops;
+       const struct clk_ops    *div_ops;
+       const struct clk_ops    *gate_ops;
+};
+
+#define to_clk_periph(_hw) container_of(_hw, struct tegra_clk_periph, hw)
+
+#define TEGRA_CLK_PERIPH_MAGIC 0x18221223
+
+extern const struct clk_ops tegra_clk_periph_ops;
+struct clk *tegra_clk_register_periph(const char *name,
+               const char **parent_names, int num_parents,
+               struct tegra_clk_periph *periph, void __iomem *clk_base,
+               u32 offset);
+struct clk *tegra_clk_register_periph_nodiv(const char *name,
+               const char **parent_names, int num_parents,
+               struct tegra_clk_periph *periph, void __iomem *clk_base,
+               u32 offset);
+
+#define TEGRA_CLK_PERIPH(_mux_shift, _mux_width, _mux_flags,           \
+                        _div_shift, _div_width, _div_frac_width,       \
+                        _div_flags, _clk_num, _enb_refcnt, _regs,      \
+                        _gate_flags)                                   \
+       {                                                               \
+               .mux = {                                                \
+                       .flags = _mux_flags,                            \
+                       .shift = _mux_shift,                            \
+                       .width = _mux_width,                            \
+               },                                                      \
+               .divider = {                                            \
+                       .flags = _div_flags,                            \
+                       .shift = _div_shift,                            \
+                       .width = _div_width,                            \
+                       .frac_width = _div_frac_width,                  \
+               },                                                      \
+               .gate = {                                               \
+                       .flags = _gate_flags,                           \
+                       .clk_num = _clk_num,                            \
+                       .enable_refcnt = _enb_refcnt,                   \
+                       .regs = _regs,                                  \
+               },                                                      \
+               .mux_ops = &clk_mux_ops,                                \
+               .div_ops = &tegra_clk_frac_div_ops,                     \
+               .gate_ops = &tegra_clk_periph_gate_ops,                 \
+       }
+
+struct tegra_periph_init_data {
+       const char *name;
+       int clk_id;
+       const char **parent_names;
+       int num_parents;
+       struct tegra_clk_periph periph;
+       u32 offset;
+       const char *con_id;
+       const char *dev_id;
+};
+
+#define TEGRA_INIT_DATA(_name, _con_id, _dev_id, _parent_names, _offset, \
+                       _mux_shift, _mux_width, _mux_flags, _div_shift, \
+                       _div_width, _div_frac_width, _div_flags, _regs, \
+                       _clk_num, _enb_refcnt, _gate_flags, _clk_id)    \
+       {                                                               \
+               .name = _name,                                          \
+               .clk_id = _clk_id,                                      \
+               .parent_names = _parent_names,                          \
+               .num_parents = ARRAY_SIZE(_parent_names),               \
+               .periph = TEGRA_CLK_PERIPH(_mux_shift, _mux_width,      \
+                                          _mux_flags, _div_shift,      \
+                                          _div_width, _div_frac_width, \
+                                          _div_flags, _clk_num,        \
+                                          _enb_refcnt, _regs,          \
+                                          _gate_flags),                \
+               .offset = _offset,                                      \
+               .con_id = _con_id,                                      \
+               .dev_id = _dev_id,                                      \
+       }
+
+/**
+ * struct clk_super_mux - super clock
+ *
+ * @hw:                handle between common and hardware-specific interfaces
+ * @reg:       register controlling multiplexer
+ * @width:     width of the multiplexer bit field
+ * @flags:     hardware-specific flags
+ * @div2_index:        bit controlling divide-by-2
+ * @pllx_index:        PLLX index in the parent list
+ * @lock:      register lock
+ *
+ * Flags:
+ * TEGRA_DIVIDER_2 - LP cluster has additional divider. This flag indicates
+ *     that this is LP cluster clock.
+ */
+struct tegra_clk_super_mux {
+       struct clk_hw   hw;
+       void __iomem    *reg;
+       u8              width;
+       u8              flags;
+       u8              div2_index;
+       u8              pllx_index;
+       spinlock_t      *lock;
+};
+
+#define to_clk_super_mux(_hw) container_of(_hw, struct tegra_clk_super_mux, hw)
+
+#define TEGRA_DIVIDER_2 BIT(0)
+
+extern const struct clk_ops tegra_clk_super_ops;
+struct clk *tegra_clk_register_super_mux(const char *name,
+               const char **parent_names, u8 num_parents,
+               unsigned long flags, void __iomem *reg, u8 clk_super_flags,
+               u8 width, u8 pllx_index, u8 div2_index, spinlock_t *lock);
+
+/**
+ * struct clk_init_tabel - clock initialization table
+ * @clk_id:    clock id as mentioned in device tree bindings
+ * @parent_id: parent clock id as mentioned in device tree bindings
+ * @rate:      rate to set
+ * @state:     enable/disable
+ */
+struct tegra_clk_init_table {
+       unsigned int    clk_id;
+       unsigned int    parent_id;
+       unsigned long   rate;
+       int             state;
+};
+
+/**
+ * struct clk_duplicate - duplicate clocks
+ * @clk_id:    clock id as mentioned in device tree bindings
+ * @lookup:    duplicate lookup entry for the clock
+ */
+struct tegra_clk_duplicate {
+       int                     clk_id;
+       struct clk_lookup       lookup;
+};
+
+#define TEGRA_CLK_DUPLICATE(_clk_id, _dev, _con) \
+       {                                       \
+               .clk_id = _clk_id,              \
+               .lookup = {                     \
+                       .dev_id = _dev,         \
+                       .con_id = _con,         \
+               },                              \
+       }
+
+void tegra_init_from_table(struct tegra_clk_init_table *tbl,
+               struct clk *clks[], int clk_max);
+
+void tegra_init_dup_clks(struct tegra_clk_duplicate *dup_list,
+               struct clk *clks[], int clk_max);
+
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+void tegra20_clock_init(struct device_node *np);
+#else
+static inline void tegra20_clock_init(struct device_node *np) {}
+#endif /* CONFIG_ARCH_TEGRA_2x_SOC */
+
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+void tegra30_clock_init(struct device_node *np);
+#else
+static inline void tegra30_clock_init(struct device_node *np) {}
+#endif /* CONFIG_ARCH_TEGRA_3x_SOC */
+
+#endif /* TEGRA_CLK_H */
index 440449c1ca21e139e7c5d79e19c0feab9934e550..596c45c2f192114224f6626f786401f5b41656a6 100644 (file)
@@ -17,6 +17,7 @@ obj-$(CONFIG_CLKSRC_DBX500_PRCMU)     += clksrc-dbx500-prcmu.o
 obj-$(CONFIG_ARMADA_370_XP_TIMER)      += time-armada-370-xp.o
 obj-$(CONFIG_ARCH_BCM2835)     += bcm2835_timer.o
 obj-$(CONFIG_SUNXI_TIMER)      += sunxi_timer.o
+obj-$(CONFIG_ARCH_TEGRA)       += tegra20_timer.o
 obj-$(CONFIG_VT8500_TIMER)     += vt8500_timer.o
 
 obj-$(CONFIG_CLKSRC_ARM_GENERIC)       += arm_generic.o
diff --git a/drivers/clocksource/tegra20_timer.c b/drivers/clocksource/tegra20_timer.c
new file mode 100644 (file)
index 0000000..0bde03f
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2010 Google, Inc.
+ *
+ * Author:
+ *     Colin Cross <ccross@google.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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/init.h>
+#include <linux/err.h>
+#include <linux/time.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+
+#include <asm/mach/time.h>
+#include <asm/smp_twd.h>
+#include <asm/sched_clock.h>
+
+#define RTC_SECONDS            0x08
+#define RTC_SHADOW_SECONDS     0x0c
+#define RTC_MILLISECONDS       0x10
+
+#define TIMERUS_CNTR_1US 0x10
+#define TIMERUS_USEC_CFG 0x14
+#define TIMERUS_CNTR_FREEZE 0x4c
+
+#define TIMER1_BASE 0x0
+#define TIMER2_BASE 0x8
+#define TIMER3_BASE 0x50
+#define TIMER4_BASE 0x58
+
+#define TIMER_PTV 0x0
+#define TIMER_PCR 0x4
+
+static void __iomem *timer_reg_base;
+static void __iomem *rtc_base;
+
+static struct timespec persistent_ts;
+static u64 persistent_ms, last_persistent_ms;
+
+#define timer_writel(value, reg) \
+       __raw_writel(value, timer_reg_base + (reg))
+#define timer_readl(reg) \
+       __raw_readl(timer_reg_base + (reg))
+
+static int tegra_timer_set_next_event(unsigned long cycles,
+                                        struct clock_event_device *evt)
+{
+       u32 reg;
+
+       reg = 0x80000000 | ((cycles > 1) ? (cycles-1) : 0);
+       timer_writel(reg, TIMER3_BASE + TIMER_PTV);
+
+       return 0;
+}
+
+static void tegra_timer_set_mode(enum clock_event_mode mode,
+                                   struct clock_event_device *evt)
+{
+       u32 reg;
+
+       timer_writel(0, TIMER3_BASE + TIMER_PTV);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               reg = 0xC0000000 | ((1000000/HZ)-1);
+               timer_writel(reg, TIMER3_BASE + TIMER_PTV);
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               break;
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_RESUME:
+               break;
+       }
+}
+
+static struct clock_event_device tegra_clockevent = {
+       .name           = "timer0",
+       .rating         = 300,
+       .features       = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
+       .set_next_event = tegra_timer_set_next_event,
+       .set_mode       = tegra_timer_set_mode,
+};
+
+static u32 notrace tegra_read_sched_clock(void)
+{
+       return timer_readl(TIMERUS_CNTR_1US);
+}
+
+/*
+ * tegra_rtc_read - Reads the Tegra RTC registers
+ * Care must be taken that this funciton is not called while the
+ * tegra_rtc driver could be executing to avoid race conditions
+ * on the RTC shadow register
+ */
+static u64 tegra_rtc_read_ms(void)
+{
+       u32 ms = readl(rtc_base + RTC_MILLISECONDS);
+       u32 s = readl(rtc_base + RTC_SHADOW_SECONDS);
+       return (u64)s * MSEC_PER_SEC + ms;
+}
+
+/*
+ * tegra_read_persistent_clock -  Return time from a persistent clock.
+ *
+ * Reads the time from a source which isn't disabled during PM, the
+ * 32k sync timer.  Convert the cycles elapsed since last read into
+ * nsecs and adds to a monotonically increasing timespec.
+ * Care must be taken that this funciton is not called while the
+ * tegra_rtc driver could be executing to avoid race conditions
+ * on the RTC shadow register
+ */
+static void tegra_read_persistent_clock(struct timespec *ts)
+{
+       u64 delta;
+       struct timespec *tsp = &persistent_ts;
+
+       last_persistent_ms = persistent_ms;
+       persistent_ms = tegra_rtc_read_ms();
+       delta = persistent_ms - last_persistent_ms;
+
+       timespec_add_ns(tsp, delta * NSEC_PER_MSEC);
+       *ts = *tsp;
+}
+
+static irqreturn_t tegra_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evt = (struct clock_event_device *)dev_id;
+       timer_writel(1<<30, TIMER3_BASE + TIMER_PCR);
+       evt->event_handler(evt);
+       return IRQ_HANDLED;
+}
+
+static struct irqaction tegra_timer_irq = {
+       .name           = "timer0",
+       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_HIGH,
+       .handler        = tegra_timer_interrupt,
+       .dev_id         = &tegra_clockevent,
+};
+
+static const struct of_device_id timer_match[] __initconst = {
+       { .compatible = "nvidia,tegra20-timer" },
+       {}
+};
+
+static const struct of_device_id rtc_match[] __initconst = {
+       { .compatible = "nvidia,tegra20-rtc" },
+       {}
+};
+
+static void __init tegra20_init_timer(void)
+{
+       struct device_node *np;
+       struct clk *clk;
+       unsigned long rate;
+       int ret;
+
+       np = of_find_matching_node(NULL, timer_match);
+       if (!np) {
+               pr_err("Failed to find timer DT node\n");
+               BUG();
+       }
+
+       timer_reg_base = of_iomap(np, 0);
+       if (!timer_reg_base) {
+               pr_err("Can't map timer registers\n");
+               BUG();
+       }
+
+       tegra_timer_irq.irq = irq_of_parse_and_map(np, 2);
+       if (tegra_timer_irq.irq <= 0) {
+               pr_err("Failed to map timer IRQ\n");
+               BUG();
+       }
+
+       clk = clk_get_sys("timer", NULL);
+       if (IS_ERR(clk)) {
+               pr_warn("Unable to get timer clock. Assuming 12Mhz input clock.\n");
+               rate = 12000000;
+       } else {
+               clk_prepare_enable(clk);
+               rate = clk_get_rate(clk);
+       }
+
+       of_node_put(np);
+
+       np = of_find_matching_node(NULL, rtc_match);
+       if (!np) {
+               pr_err("Failed to find RTC DT node\n");
+               BUG();
+       }
+
+       rtc_base = of_iomap(np, 0);
+       if (!rtc_base) {
+               pr_err("Can't map RTC registers");
+               BUG();
+       }
+
+       /*
+        * rtc registers are used by read_persistent_clock, keep the rtc clock
+        * enabled
+        */
+       clk = clk_get_sys("rtc-tegra", NULL);
+       if (IS_ERR(clk))
+               pr_warn("Unable to get rtc-tegra clock\n");
+       else
+               clk_prepare_enable(clk);
+
+       of_node_put(np);
+
+       switch (rate) {
+       case 12000000:
+               timer_writel(0x000b, TIMERUS_USEC_CFG);
+               break;
+       case 13000000:
+               timer_writel(0x000c, TIMERUS_USEC_CFG);
+               break;
+       case 19200000:
+               timer_writel(0x045f, TIMERUS_USEC_CFG);
+               break;
+       case 26000000:
+               timer_writel(0x0019, TIMERUS_USEC_CFG);
+               break;
+       default:
+               WARN(1, "Unknown clock rate");
+       }
+
+       setup_sched_clock(tegra_read_sched_clock, 32, 1000000);
+
+       if (clocksource_mmio_init(timer_reg_base + TIMERUS_CNTR_1US,
+               "timer_us", 1000000, 300, 32, clocksource_mmio_readl_up)) {
+               pr_err("Failed to register clocksource\n");
+               BUG();
+       }
+
+       ret = setup_irq(tegra_timer_irq.irq, &tegra_timer_irq);
+       if (ret) {
+               pr_err("Failed to register timer IRQ: %d\n", ret);
+               BUG();
+       }
+
+       tegra_clockevent.cpumask = cpu_all_mask;
+       tegra_clockevent.irq = tegra_timer_irq.irq;
+       clockevents_config_and_register(&tegra_clockevent, 1000000,
+                                       0x1, 0x1fffffff);
+#ifdef CONFIG_HAVE_ARM_TWD
+       twd_local_timer_of_register();
+#endif
+       register_persistent_clock(NULL, tegra_read_persistent_clock);
+}
+CLOCKSOURCE_OF_DECLARE(tegra20, "nvidia,tegra20-timer", tegra20_init_timer);
+
+#ifdef CONFIG_PM
+static u32 usec_config;
+
+void tegra_timer_suspend(void)
+{
+       usec_config = timer_readl(TIMERUS_USEC_CFG);
+}
+
+void tegra_timer_resume(void)
+{
+       timer_writel(usec_config, TIMERUS_USEC_CFG);
+}
+#endif
index c4cc27e5c8a5c22e5439c8ed7ceed322ed45eb8a..071e2c3eec4f1114c667b233a0a36539cbe70501 100644 (file)
@@ -39,4 +39,10 @@ config CPU_IDLE_CALXEDA
        help
          Select this to enable cpuidle on Calxeda processors.
 
+config CPU_IDLE_KIRKWOOD
+       bool "CPU Idle Driver for Kirkwood processors"
+       depends on ARCH_KIRKWOOD
+       help
+         Select this to enable cpuidle on Kirkwood processors.
+
 endif
index 03ee87482c7117f5e5fe9c7b10487dbbe3097b90..24c6e7d945ed449bfe59d0166e0f6795880e8a21 100644 (file)
@@ -6,3 +6,4 @@ obj-y += cpuidle.o driver.o governor.o sysfs.o governors/
 obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
 
 obj-$(CONFIG_CPU_IDLE_CALXEDA) += cpuidle-calxeda.o
+obj-$(CONFIG_CPU_IDLE_KIRKWOOD) += cpuidle-kirkwood.o
diff --git a/drivers/cpuidle/cpuidle-kirkwood.c b/drivers/cpuidle/cpuidle-kirkwood.c
new file mode 100644 (file)
index 0000000..670aa1e
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * arch/arm/mach-kirkwood/cpuidle.c
+ *
+ * CPU idle Marvell Kirkwood SoCs
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ *
+ * The cpu idle uses wait-for-interrupt and DDR self refresh in order
+ * to implement two idle states -
+ * #1 wait-for-interrupt
+ * #2 wait-for-interrupt and DDR self refresh
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/cpuidle.h>
+#include <linux/io.h>
+#include <linux/export.h>
+#include <asm/proc-fns.h>
+#include <asm/cpuidle.h>
+
+#define KIRKWOOD_MAX_STATES    2
+
+static void __iomem *ddr_operation_base;
+
+/* Actual code that puts the SoC in different idle states */
+static int kirkwood_enter_idle(struct cpuidle_device *dev,
+                              struct cpuidle_driver *drv,
+                              int index)
+{
+       writel(0x7, ddr_operation_base);
+       cpu_do_idle();
+
+       return index;
+}
+
+static struct cpuidle_driver kirkwood_idle_driver = {
+       .name                   = "kirkwood_idle",
+       .owner                  = THIS_MODULE,
+       .en_core_tk_irqen       = 1,
+       .states[0]              = ARM_CPUIDLE_WFI_STATE,
+       .states[1]              = {
+               .enter                  = kirkwood_enter_idle,
+               .exit_latency           = 10,
+               .target_residency       = 100000,
+               .flags                  = CPUIDLE_FLAG_TIME_VALID,
+               .name                   = "DDR SR",
+               .desc                   = "WFI and DDR Self Refresh",
+       },
+       .state_count = KIRKWOOD_MAX_STATES,
+};
+static struct cpuidle_device *device;
+
+static DEFINE_PER_CPU(struct cpuidle_device, kirkwood_cpuidle_device);
+
+/* Initialize CPU idle by registering the idle states */
+static int kirkwood_cpuidle_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res == NULL)
+               return -EINVAL;
+
+       ddr_operation_base = devm_request_and_ioremap(&pdev->dev, res);
+       if (!ddr_operation_base)
+               return -EADDRNOTAVAIL;
+
+       device = &per_cpu(kirkwood_cpuidle_device, smp_processor_id());
+       device->state_count = KIRKWOOD_MAX_STATES;
+
+       cpuidle_register_driver(&kirkwood_idle_driver);
+       if (cpuidle_register_device(device)) {
+               pr_err("kirkwood_init_cpuidle: Failed registering\n");
+               return -EIO;
+       }
+       return 0;
+}
+
+int kirkwood_cpuidle_remove(struct platform_device *pdev)
+{
+       cpuidle_unregister_device(device);
+       cpuidle_unregister_driver(&kirkwood_idle_driver);
+
+       return 0;
+}
+
+static struct platform_driver kirkwood_cpuidle_driver = {
+       .probe = kirkwood_cpuidle_probe,
+       .remove = kirkwood_cpuidle_remove,
+       .driver = {
+                  .name = "kirkwood_cpuidle",
+                  .owner = THIS_MODULE,
+                  },
+};
+
+module_platform_driver(kirkwood_cpuidle_driver);
+
+MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
+MODULE_DESCRIPTION("Kirkwood cpu idle driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:kirkwood-cpuidle");
index 3cad856fe67f9f9518cbf79b0f02bd41c32733b8..2a02c11890ecc0c8274271e32dda8fda4075bd00 100644 (file)
@@ -31,8 +31,8 @@
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
+#include <linux/clk/tegra.h>
 
-#include <mach/clk.h>
 #include "dmaengine.h"
 
 #define TEGRA_APBDMA_GENERAL                   0x0
index 656b2e3334a621109426806043032ae3422d9631..56813f967c8f97d0b8a601f359b65f1d6a2af65d 100644 (file)
@@ -12,8 +12,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
-
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 
 #include "drm.h"
 #include "dc.h"
index 3a503c9e468649c0b9869b0d0385abc736af4650..d980dc75788c1515258698c5457a02be7e4cf794 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/of_address.h>
 #include <linux/of_platform.h>
 
-#include <mach/clk.h>
 #include <linux/dma-mapping.h>
 #include <asm/dma-iommu.h>
 
index e060c7e6434dba886e8698782cbfb0c3ce4b9cf7..92ad276cc5e075d8ea4cb9f0d1087bb22d77fb5b 100644 (file)
@@ -14,8 +14,7 @@
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/consumer.h>
-
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 
 #include "hdmi.h"
 #include "drm.h"
index 7b38877ffec10ed06995b191a024871c9c1e923d..c7aca35e38fdd7dc10ded8402de85e607ed283f2 100644 (file)
 #include <linux/of_i2c.h>
 #include <linux/of_device.h>
 #include <linux/module.h>
+#include <linux/clk/tegra.h>
 
 #include <asm/unaligned.h>
 
-#include <mach/clk.h>
-
 #define TEGRA_I2C_TIMEOUT (msecs_to_jiffies(1000))
 #define BYTES_PER_FIFO_WORD 4
 
index c76f96872d313f558eb9a75e6305a7d14e123d2c..54ac1dc7d477b4cdcb22e2188233a2ae6b79c01f 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/clk.h>
 #include <linux/slab.h>
 #include <linux/input/tegra_kbc.h>
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 
 #define KBC_MAX_DEBOUNCE_CNT   0x3ffu
 
index 923a9da9c829d7be9a3fe95bac77b0b7e4431de6..20354b43932e300396d80c8c7bfd3692615497be 100644 (file)
@@ -1023,7 +1023,7 @@ config RTC_DRV_TX4939
 
 config RTC_DRV_MV
        tristate "Marvell SoC RTC"
-       depends on ARCH_KIRKWOOD || ARCH_DOVE
+       depends on ARCH_KIRKWOOD || ARCH_DOVE || ARCH_MVEBU
        help
          If you say yes here you will get support for the in-chip RTC
          that can be found in some of Marvell's SoC devices, such as
index 448a8cc71df3aef818a0a0d4d0058e2c47cabf68..e5dce91b74cafb55db250ec546b0ee362d051b35 100644 (file)
@@ -34,7 +34,7 @@
 #include <linux/of_device.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/spi-tegra.h>
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 
 #define SPI_COMMAND                            0x000
 #define SPI_GO                                 BIT(30)
@@ -525,7 +525,7 @@ static int tegra_sflash_probe(struct platform_device *pdev)
                goto exit_free_master;
        }
 
-       tsd->clk = devm_clk_get(&pdev->dev, "spi");
+       tsd->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(tsd->clk)) {
                dev_err(&pdev->dev, "can not get clock\n");
                ret = PTR_ERR(tsd->clk);
index 651167f2e0afbafbeab8ded7fac067923d41f910..e255e7a35678f0c6e091507489db3935845f2240 100644 (file)
@@ -35,7 +35,7 @@
 #include <linux/of_device.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/spi-tegra.h>
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 
 #define SLINK_COMMAND                  0x000
 #define SLINK_BIT_LENGTH(x)            (((x) & 0x1f) << 0)
@@ -1191,7 +1191,7 @@ static int tegra_slink_probe(struct platform_device *pdev)
                goto exit_free_master;
        }
 
-       tspi->clk = devm_clk_get(&pdev->dev, "slink");
+       tspi->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(tspi->clk)) {
                dev_err(&pdev->dev, "can not get clock\n");
                ret = PTR_ERR(tspi->clk);
index f950ab890e2e217c8b412bc21cfe42a4485d6bc7..e5ae42a0b44a41fbb3efa3e7e58da627f60f60e9 100644 (file)
@@ -1,9 +1,5 @@
 ToDo list (incomplete, unordered)
        - add compile as module support
-       - fix clk usage
-         should not be using clk_get_sys(), but clk_get(&pdev->dev, conn)
-         where conn is either NULL if the device only has one clock, or
-         the device specific name if it has multiple clocks.
        - move half of the nvec init stuff to i2c-tegra.c
        - move event handling to nvec_events
        - finish suspend/resume support
index 2830946860d11e91d373b547c6050c076bf1f014..9417941974f72e195ea68f9158e02233454961da 100644 (file)
@@ -37,8 +37,7 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
-
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 
 #include "nvec.h"
 
@@ -771,7 +770,7 @@ static int tegra_nvec_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       i2c_clk = clk_get_sys("tegra-i2c.2", "div-clk");
+       i2c_clk = clk_get(&pdev->dev, "div-clk");
        if (IS_ERR(i2c_clk)) {
                dev_err(nvec->dev, "failed to get controller clock\n");
                return -ENODEV;
index acf17556bd87b87b7bb3cc1a1c5a167ec15d1f7c..568aecc7075b4d345bc59bb033570c6e034b9ebc 100644 (file)
@@ -2,7 +2,7 @@
  * EHCI-compliant USB host controller driver for NVIDIA Tegra SoCs
  *
  * Copyright (C) 2010 Google, Inc.
- * Copyright (C) 2009 NVIDIA Corporation
+ * Copyright (C) 2009 - 2013 NVIDIA 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
 #include <linux/of.h>
 #include <linux/of_gpio.h>
 #include <linux/pm_runtime.h>
-
+#include <linux/usb/ehci_def.h>
 #include <linux/usb/tegra_usb_phy.h>
 
 #define TEGRA_USB_BASE                 0xC5000000
 #define TEGRA_USB2_BASE                        0xC5004000
 #define TEGRA_USB3_BASE                        0xC5008000
 
+/* PORTSC registers */
+#define TEGRA_USB_PORTSC1                      0x184
+#define TEGRA_USB_PORTSC1_PTS(x)       (((x) & 0x3) << 30)
+#define TEGRA_USB_PORTSC1_PHCD (1 << 23)
+
 #define TEGRA_USB_DMA_ALIGN 32
 
 struct tegra_ehci_hcd {
        struct ehci_hcd *ehci;
        struct tegra_usb_phy *phy;
        struct clk *clk;
-       struct clk *emc_clk;
        struct usb_phy *transceiver;
        int host_resumed;
        int port_resuming;
+       bool needs_double_reset;
        enum tegra_usb_phy_port_speed port_speed;
 };
 
@@ -50,9 +55,8 @@ static void tegra_ehci_power_up(struct usb_hcd *hcd)
 {
        struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
 
-       clk_prepare_enable(tegra->emc_clk);
        clk_prepare_enable(tegra->clk);
-       usb_phy_set_suspend(&tegra->phy->u_phy, 0);
+       usb_phy_set_suspend(hcd->phy, 0);
        tegra->host_resumed = 1;
 }
 
@@ -61,9 +65,8 @@ static void tegra_ehci_power_down(struct usb_hcd *hcd)
        struct tegra_ehci_hcd *tegra = dev_get_drvdata(hcd->self.controller);
 
        tegra->host_resumed = 0;
-       usb_phy_set_suspend(&tegra->phy->u_phy, 1);
+       usb_phy_set_suspend(hcd->phy, 1);
        clk_disable_unprepare(tegra->clk);
-       clk_disable_unprepare(tegra->emc_clk);
 }
 
 static int tegra_ehci_internal_port_reset(
@@ -156,7 +159,7 @@ static int tegra_ehci_hub_control(
                if (tegra->port_resuming && !(temp & PORT_SUSPEND)) {
                        /* Resume completed, re-enable disconnect detection */
                        tegra->port_resuming = 0;
-                       tegra_usb_phy_postresume(tegra->phy);
+                       tegra_usb_phy_postresume(hcd->phy);
                }
        }
 
@@ -184,7 +187,7 @@ static int tegra_ehci_hub_control(
        }
 
        /* For USB1 port we need to issue Port Reset twice internally */
-       if (tegra->phy->instance == 0 &&
+       if (tegra->needs_double_reset &&
           (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_RESET)) {
                spin_unlock_irqrestore(&ehci->lock, flags);
                return tegra_ehci_internal_port_reset(ehci, status_reg);
@@ -209,7 +212,7 @@ static int tegra_ehci_hub_control(
                        goto done;
 
                /* Disable disconnect detection during port resume */
-               tegra_usb_phy_preresume(tegra->phy);
+               tegra_usb_phy_preresume(hcd->phy);
 
                ehci->reset_done[wIndex-1] = jiffies + msecs_to_jiffies(25);
 
@@ -473,7 +476,7 @@ static int controller_resume(struct device *dev)
        }
 
        /* Force the phy to keep data lines in suspend state */
-       tegra_ehci_phy_restore_start(tegra->phy, tegra->port_speed);
+       tegra_ehci_phy_restore_start(hcd->phy, tegra->port_speed);
 
        /* Enable host mode */
        tdi_reset(ehci);
@@ -540,17 +543,17 @@ static int controller_resume(struct device *dev)
                }
        }
 
-       tegra_ehci_phy_restore_end(tegra->phy);
+       tegra_ehci_phy_restore_end(hcd->phy);
        goto done;
 
  restart:
        if (tegra->port_speed <= TEGRA_USB_PHY_PORT_SPEED_HIGH)
-               tegra_ehci_phy_restore_end(tegra->phy);
+               tegra_ehci_phy_restore_end(hcd->phy);
 
        tegra_ehci_restart(hcd);
 
  done:
-       tegra_usb_phy_preresume(tegra->phy);
+       tegra_usb_phy_preresume(hcd->phy);
        tegra->port_resuming = 1;
        return 0;
 }
@@ -604,6 +607,37 @@ static const struct dev_pm_ops tegra_ehci_pm_ops = {
 
 #endif
 
+/* Bits of PORTSC1, which will get cleared by writing 1 into them */
+#define TEGRA_PORTSC1_RWC_BITS (PORT_CSC | PORT_PEC | PORT_OCC)
+
+void tegra_ehci_set_pts(struct usb_phy *x, u8 pts_val)
+{
+       unsigned long val;
+       struct usb_hcd *hcd = bus_to_hcd(x->otg->host);
+       void __iomem *base = hcd->regs;
+
+       val = readl(base + TEGRA_USB_PORTSC1) & ~TEGRA_PORTSC1_RWC_BITS;
+       val &= ~TEGRA_USB_PORTSC1_PTS(3);
+       val |= TEGRA_USB_PORTSC1_PTS(pts_val & 3);
+       writel(val, base + TEGRA_USB_PORTSC1);
+}
+EXPORT_SYMBOL_GPL(tegra_ehci_set_pts);
+
+void tegra_ehci_set_phcd(struct usb_phy *x, bool enable)
+{
+       unsigned long val;
+       struct usb_hcd *hcd = bus_to_hcd(x->otg->host);
+       void __iomem *base = hcd->regs;
+
+       val = readl(base + TEGRA_USB_PORTSC1) & ~TEGRA_PORTSC1_RWC_BITS;
+       if (enable)
+               val |= TEGRA_USB_PORTSC1_PHCD;
+       else
+               val &= ~TEGRA_USB_PORTSC1_PHCD;
+       writel(val, base + TEGRA_USB_PORTSC1);
+}
+EXPORT_SYMBOL_GPL(tegra_ehci_set_phcd);
+
 static u64 tegra_ehci_dma_mask = DMA_BIT_MASK(32);
 
 static int tegra_ehci_probe(struct platform_device *pdev)
@@ -615,6 +649,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
        int err = 0;
        int irq;
        int instance = pdev->id;
+       struct usb_phy *u_phy;
 
        pdata = pdev->dev.platform_data;
        if (!pdata) {
@@ -656,15 +691,8 @@ static int tegra_ehci_probe(struct platform_device *pdev)
        if (err)
                goto fail_clk;
 
-       tegra->emc_clk = devm_clk_get(&pdev->dev, "emc");
-       if (IS_ERR(tegra->emc_clk)) {
-               dev_err(&pdev->dev, "Can't get emc clock\n");
-               err = PTR_ERR(tegra->emc_clk);
-               goto fail_emc_clk;
-       }
-
-       clk_prepare_enable(tegra->emc_clk);
-       clk_set_rate(tegra->emc_clk, 400000000);
+       tegra->needs_double_reset = of_property_read_bool(pdev->dev.of_node,
+               "nvidia,needs-double-reset");
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
@@ -712,9 +740,19 @@ static int tegra_ehci_probe(struct platform_device *pdev)
                goto fail_io;
        }
 
-       usb_phy_init(&tegra->phy->u_phy);
+       hcd->phy = u_phy = &tegra->phy->u_phy;
+       usb_phy_init(hcd->phy);
+
+       u_phy->otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg),
+                            GFP_KERNEL);
+       if (!u_phy->otg) {
+               dev_err(&pdev->dev, "Failed to alloc memory for otg\n");
+               err = -ENOMEM;
+               goto fail_io;
+       }
+       u_phy->otg->host = hcd_to_bus(hcd);
 
-       err = usb_phy_set_suspend(&tegra->phy->u_phy, 0);
+       err = usb_phy_set_suspend(hcd->phy, 0);
        if (err) {
                dev_err(&pdev->dev, "Failed to power on the phy\n");
                goto fail;
@@ -760,10 +798,8 @@ fail:
        if (!IS_ERR_OR_NULL(tegra->transceiver))
                otg_set_host(tegra->transceiver->otg, NULL);
 #endif
-       usb_phy_shutdown(&tegra->phy->u_phy);
+       usb_phy_shutdown(hcd->phy);
 fail_io:
-       clk_disable_unprepare(tegra->emc_clk);
-fail_emc_clk:
        clk_disable_unprepare(tegra->clk);
 fail_clk:
        usb_put_hcd(hcd);
@@ -784,15 +820,12 @@ static int tegra_ehci_remove(struct platform_device *pdev)
                otg_set_host(tegra->transceiver->otg, NULL);
 #endif
 
+       usb_phy_shutdown(hcd->phy);
        usb_remove_hcd(hcd);
        usb_put_hcd(hcd);
 
-       usb_phy_shutdown(&tegra->phy->u_phy);
-
        clk_disable_unprepare(tegra->clk);
 
-       clk_disable_unprepare(tegra->emc_clk);
-
        return 0;
 }
 
index 9d13c81754e0cd0d2b38299dcb6143847ad380b2..5487d38481af38dead7dee1ed9b7cbc839a7ad22 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
+#include <linux/of.h>
 #include <linux/of_gpio.h>
 #include <linux/usb/otg.h>
 #include <linux/usb/ulpi.h>
 
 #define ULPI_VIEWPORT          0x170
 
-#define USB_PORTSC1            0x184
-#define   USB_PORTSC1_PTS(x)   (((x) & 0x3) << 30)
-#define   USB_PORTSC1_PSPD(x)  (((x) & 0x3) << 26)
-#define   USB_PORTSC1_PHCD     (1 << 23)
-#define   USB_PORTSC1_WKOC     (1 << 22)
-#define   USB_PORTSC1_WKDS     (1 << 21)
-#define   USB_PORTSC1_WKCN     (1 << 20)
-#define   USB_PORTSC1_PTC(x)   (((x) & 0xf) << 16)
-#define   USB_PORTSC1_PP       (1 << 12)
-#define   USB_PORTSC1_SUSP     (1 << 7)
-#define   USB_PORTSC1_PE       (1 << 2)
-#define   USB_PORTSC1_CCS      (1 << 0)
-
 #define USB_SUSP_CTRL          0x400
 #define   USB_WAKE_ON_CNNT_EN_DEV      (1 << 3)
 #define   USB_WAKE_ON_DISCON_EN_DEV    (1 << 4)
@@ -208,11 +196,6 @@ static struct tegra_utmip_config utmip_default[] = {
        },
 };
 
-static inline bool phy_is_ulpi(struct tegra_usb_phy *phy)
-{
-       return (phy->instance == 1);
-}
-
 static int utmip_pad_open(struct tegra_usb_phy *phy)
 {
        phy->pad_clk = clk_get_sys("utmip-pad", NULL);
@@ -221,7 +204,7 @@ static int utmip_pad_open(struct tegra_usb_phy *phy)
                return PTR_ERR(phy->pad_clk);
        }
 
-       if (phy->instance == 0) {
+       if (phy->is_legacy_phy) {
                phy->pad_regs = phy->regs;
        } else {
                phy->pad_regs = ioremap(TEGRA_USB_BASE, TEGRA_USB_SIZE);
@@ -236,7 +219,7 @@ static int utmip_pad_open(struct tegra_usb_phy *phy)
 
 static void utmip_pad_close(struct tegra_usb_phy *phy)
 {
-       if (phy->instance != 0)
+       if (!phy->is_legacy_phy)
                iounmap(phy->pad_regs);
        clk_put(phy->pad_clk);
 }
@@ -305,7 +288,7 @@ static void utmi_phy_clk_disable(struct tegra_usb_phy *phy)
        unsigned long val;
        void __iomem *base = phy->regs;
 
-       if (phy->instance == 0) {
+       if (phy->is_legacy_phy) {
                val = readl(base + USB_SUSP_CTRL);
                val |= USB_SUSP_SET;
                writel(val, base + USB_SUSP_CTRL);
@@ -315,13 +298,8 @@ static void utmi_phy_clk_disable(struct tegra_usb_phy *phy)
                val = readl(base + USB_SUSP_CTRL);
                val &= ~USB_SUSP_SET;
                writel(val, base + USB_SUSP_CTRL);
-       }
-
-       if (phy->instance == 2) {
-               val = readl(base + USB_PORTSC1);
-               val |= USB_PORTSC1_PHCD;
-               writel(val, base + USB_PORTSC1);
-       }
+       } else
+               tegra_ehci_set_phcd(&phy->u_phy, true);
 
        if (utmi_wait_register(base + USB_SUSP_CTRL, USB_PHY_CLK_VALID, 0) < 0)
                pr_err("%s: timeout waiting for phy to stabilize\n", __func__);
@@ -332,7 +310,7 @@ static void utmi_phy_clk_enable(struct tegra_usb_phy *phy)
        unsigned long val;
        void __iomem *base = phy->regs;
 
-       if (phy->instance == 0) {
+       if (phy->is_legacy_phy) {
                val = readl(base + USB_SUSP_CTRL);
                val |= USB_SUSP_CLR;
                writel(val, base + USB_SUSP_CTRL);
@@ -342,13 +320,8 @@ static void utmi_phy_clk_enable(struct tegra_usb_phy *phy)
                val = readl(base + USB_SUSP_CTRL);
                val &= ~USB_SUSP_CLR;
                writel(val, base + USB_SUSP_CTRL);
-       }
-
-       if (phy->instance == 2) {
-               val = readl(base + USB_PORTSC1);
-               val &= ~USB_PORTSC1_PHCD;
-               writel(val, base + USB_PORTSC1);
-       }
+       } else
+               tegra_ehci_set_phcd(&phy->u_phy, false);
 
        if (utmi_wait_register(base + USB_SUSP_CTRL, USB_PHY_CLK_VALID,
                                                     USB_PHY_CLK_VALID))
@@ -365,7 +338,7 @@ static int utmi_phy_power_on(struct tegra_usb_phy *phy)
        val |= UTMIP_RESET;
        writel(val, base + USB_SUSP_CTRL);
 
-       if (phy->instance == 0) {
+       if (phy->is_legacy_phy) {
                val = readl(base + USB1_LEGACY_CTRL);
                val |= USB1_NO_LEGACY_MODE;
                writel(val, base + USB1_LEGACY_CTRL);
@@ -440,16 +413,14 @@ static int utmi_phy_power_on(struct tegra_usb_phy *phy)
        val |= UTMIP_BIAS_PDTRK_COUNT(0x5);
        writel(val, base + UTMIP_BIAS_CFG1);
 
-       if (phy->instance == 0) {
+       if (phy->is_legacy_phy) {
                val = readl(base + UTMIP_SPARE_CFG0);
                if (phy->mode == TEGRA_USB_PHY_MODE_DEVICE)
                        val &= ~FUSE_SETUP_SEL;
                else
                        val |= FUSE_SETUP_SEL;
                writel(val, base + UTMIP_SPARE_CFG0);
-       }
-
-       if (phy->instance == 2) {
+       } else {
                val = readl(base + USB_SUSP_CTRL);
                val |= UTMIP_PHY_ENABLE;
                writel(val, base + USB_SUSP_CTRL);
@@ -459,7 +430,7 @@ static int utmi_phy_power_on(struct tegra_usb_phy *phy)
        val &= ~UTMIP_RESET;
        writel(val, base + USB_SUSP_CTRL);
 
-       if (phy->instance == 0) {
+       if (phy->is_legacy_phy) {
                val = readl(base + USB1_LEGACY_CTRL);
                val &= ~USB1_VBUS_SENSE_CTL_MASK;
                val |= USB1_VBUS_SENSE_CTL_A_SESS_VLD;
@@ -472,11 +443,8 @@ static int utmi_phy_power_on(struct tegra_usb_phy *phy)
 
        utmi_phy_clk_enable(phy);
 
-       if (phy->instance == 2) {
-               val = readl(base + USB_PORTSC1);
-               val &= ~USB_PORTSC1_PTS(~0);
-               writel(val, base + USB_PORTSC1);
-       }
+       if (!phy->is_legacy_phy)
+               tegra_ehci_set_pts(&phy->u_phy, 0);
 
        return 0;
 }
@@ -621,10 +589,6 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)
                return ret;
        }
 
-       val = readl(base + USB_PORTSC1);
-       val |= USB_PORTSC1_WKOC | USB_PORTSC1_WKDS | USB_PORTSC1_WKCN;
-       writel(val, base + USB_PORTSC1);
-
        val = readl(base + USB_SUSP_CTRL);
        val |= USB_SUSP_CLR;
        writel(val, base + USB_SUSP_CTRL);
@@ -639,17 +603,8 @@ static int ulpi_phy_power_on(struct tegra_usb_phy *phy)
 
 static int ulpi_phy_power_off(struct tegra_usb_phy *phy)
 {
-       unsigned long val;
-       void __iomem *base = phy->regs;
        struct tegra_ulpi_config *config = phy->config;
 
-       /* Clear WKCN/WKDS/WKOC wake-on events that can cause the USB
-        * Controller to immediately bring the ULPI PHY out of low power
-        */
-       val = readl(base + USB_PORTSC1);
-       val &= ~(USB_PORTSC1_WKOC | USB_PORTSC1_WKDS | USB_PORTSC1_WKCN);
-       writel(val, base + USB_PORTSC1);
-
        clk_disable(phy->clk);
        return gpio_direction_output(config->reset_gpio, 0);
 }
@@ -660,7 +615,7 @@ static int  tegra_phy_init(struct usb_phy *x)
        struct tegra_ulpi_config *ulpi_config;
        int err;
 
-       if (phy_is_ulpi(phy)) {
+       if (phy->is_ulpi_phy) {
                ulpi_config = phy->config;
                phy->clk = clk_get_sys(NULL, ulpi_config->clk);
                if (IS_ERR(phy->clk)) {
@@ -698,7 +653,7 @@ static void tegra_usb_phy_close(struct usb_phy *x)
 {
        struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
 
-       if (phy_is_ulpi(phy))
+       if (phy->is_ulpi_phy)
                clk_put(phy->clk);
        else
                utmip_pad_close(phy);
@@ -709,7 +664,7 @@ static void tegra_usb_phy_close(struct usb_phy *x)
 
 static int tegra_usb_phy_power_on(struct tegra_usb_phy *phy)
 {
-       if (phy_is_ulpi(phy))
+       if (phy->is_ulpi_phy)
                return ulpi_phy_power_on(phy);
        else
                return utmi_phy_power_on(phy);
@@ -717,7 +672,7 @@ static int tegra_usb_phy_power_on(struct tegra_usb_phy *phy)
 
 static int tegra_usb_phy_power_off(struct tegra_usb_phy *phy)
 {
-       if (phy_is_ulpi(phy))
+       if (phy->is_ulpi_phy)
                return ulpi_phy_power_off(phy);
        else
                return utmi_phy_power_off(phy);
@@ -739,8 +694,9 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
        unsigned long parent_rate;
        int i;
        int err;
+       struct device_node *np = dev->of_node;
 
-       phy = kmalloc(sizeof(struct tegra_usb_phy), GFP_KERNEL);
+       phy = kzalloc(sizeof(struct tegra_usb_phy), GFP_KERNEL);
        if (!phy)
                return ERR_PTR(-ENOMEM);
 
@@ -749,9 +705,16 @@ struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
        phy->config = config;
        phy->mode = phy_mode;
        phy->dev = dev;
+       phy->is_legacy_phy =
+               of_property_read_bool(np, "nvidia,has-legacy-mode");
+       err = of_property_match_string(np, "phy_type", "ulpi");
+       if (err < 0)
+               phy->is_ulpi_phy = false;
+       else
+               phy->is_ulpi_phy = true;
 
        if (!phy->config) {
-               if (phy_is_ulpi(phy)) {
+               if (phy->is_ulpi_phy) {
                        pr_err("%s: ulpi phy configuration missing", __func__);
                        err = -EINVAL;
                        goto err0;
@@ -796,45 +759,40 @@ err0:
 }
 EXPORT_SYMBOL_GPL(tegra_usb_phy_open);
 
-void tegra_usb_phy_preresume(struct tegra_usb_phy *phy)
+void tegra_usb_phy_preresume(struct usb_phy *x)
 {
-       if (!phy_is_ulpi(phy))
+       struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
+
+       if (!phy->is_ulpi_phy)
                utmi_phy_preresume(phy);
 }
 EXPORT_SYMBOL_GPL(tegra_usb_phy_preresume);
 
-void tegra_usb_phy_postresume(struct tegra_usb_phy *phy)
+void tegra_usb_phy_postresume(struct usb_phy *x)
 {
-       if (!phy_is_ulpi(phy))
+       struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
+
+       if (!phy->is_ulpi_phy)
                utmi_phy_postresume(phy);
 }
 EXPORT_SYMBOL_GPL(tegra_usb_phy_postresume);
 
-void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy,
+void tegra_ehci_phy_restore_start(struct usb_phy *x,
                                 enum tegra_usb_phy_port_speed port_speed)
 {
-       if (!phy_is_ulpi(phy))
+       struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
+
+       if (!phy->is_ulpi_phy)
                utmi_phy_restore_start(phy, port_speed);
 }
 EXPORT_SYMBOL_GPL(tegra_ehci_phy_restore_start);
 
-void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy)
+void tegra_ehci_phy_restore_end(struct usb_phy *x)
 {
-       if (!phy_is_ulpi(phy))
+       struct tegra_usb_phy *phy = container_of(x, struct tegra_usb_phy, u_phy);
+
+       if (!phy->is_ulpi_phy)
                utmi_phy_restore_end(phy);
 }
 EXPORT_SYMBOL_GPL(tegra_ehci_phy_restore_end);
 
-void tegra_usb_phy_clk_disable(struct tegra_usb_phy *phy)
-{
-       if (!phy_is_ulpi(phy))
-               utmi_phy_clk_disable(phy);
-}
-EXPORT_SYMBOL_GPL(tegra_usb_phy_clk_disable);
-
-void tegra_usb_phy_clk_enable(struct tegra_usb_phy *phy)
-{
-       if (!phy_is_ulpi(phy))
-               utmi_phy_clk_enable(phy);
-}
-EXPORT_SYMBOL_GPL(tegra_usb_phy_clk_enable);
diff --git a/include/linux/clk/tegra.h b/include/linux/clk/tegra.h
new file mode 100644 (file)
index 0000000..404d6f9
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __LINUX_CLK_TEGRA_H_
+#define __LINUX_CLK_TEGRA_H_
+
+#include <linux/clk.h>
+
+/*
+ * Tegra CPU clock and reset control ops
+ *
+ * wait_for_reset:
+ *     keep waiting until the CPU in reset state
+ * put_in_reset:
+ *     put the CPU in reset state
+ * out_of_reset:
+ *     release the CPU from reset state
+ * enable_clock:
+ *     CPU clock un-gate
+ * disable_clock:
+ *     CPU clock gate
+ * rail_off_ready:
+ *     CPU is ready for rail off
+ * suspend:
+ *     save the clock settings when CPU go into low-power state
+ * resume:
+ *     restore the clock settings when CPU exit low-power state
+ */
+struct tegra_cpu_car_ops {
+       void (*wait_for_reset)(u32 cpu);
+       void (*put_in_reset)(u32 cpu);
+       void (*out_of_reset)(u32 cpu);
+       void (*enable_clock)(u32 cpu);
+       void (*disable_clock)(u32 cpu);
+#ifdef CONFIG_PM_SLEEP
+       bool (*rail_off_ready)(void);
+       void (*suspend)(void);
+       void (*resume)(void);
+#endif
+};
+
+extern struct tegra_cpu_car_ops *tegra_cpu_car_ops;
+
+static inline void tegra_wait_cpu_in_reset(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->wait_for_reset))
+               return;
+
+       tegra_cpu_car_ops->wait_for_reset(cpu);
+}
+
+static inline void tegra_put_cpu_in_reset(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->put_in_reset))
+               return;
+
+       tegra_cpu_car_ops->put_in_reset(cpu);
+}
+
+static inline void tegra_cpu_out_of_reset(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->out_of_reset))
+               return;
+
+       tegra_cpu_car_ops->out_of_reset(cpu);
+}
+
+static inline void tegra_enable_cpu_clock(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->enable_clock))
+               return;
+
+       tegra_cpu_car_ops->enable_clock(cpu);
+}
+
+static inline void tegra_disable_cpu_clock(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->disable_clock))
+               return;
+
+       tegra_cpu_car_ops->disable_clock(cpu);
+}
+
+#ifdef CONFIG_PM_SLEEP
+static inline bool tegra_cpu_rail_off_ready(void)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->rail_off_ready))
+               return false;
+
+       return tegra_cpu_car_ops->rail_off_ready();
+}
+
+static inline void tegra_cpu_clock_suspend(void)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->suspend))
+               return;
+
+       tegra_cpu_car_ops->suspend();
+}
+
+static inline void tegra_cpu_clock_resume(void)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->resume))
+               return;
+
+       tegra_cpu_car_ops->resume();
+}
+#endif
+
+void tegra_periph_reset_deassert(struct clk *c);
+void tegra_periph_reset_assert(struct clk *c);
+void tegra_clocks_init(void);
+
+#endif /* __LINUX_CLK_TEGRA_H_ */
diff --git a/include/linux/tegra-soc.h b/include/linux/tegra-soc.h
new file mode 100644 (file)
index 0000000..95f611d
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __LINUX_TEGRA_SOC_H_
+#define __LINUX_TEGRA_SOC_H_
+
+u32 tegra_read_chipid(void);
+
+#endif /* __LINUX_TEGRA_SOC_H_ */
index 176b1ca06ae46a66e38787c77f3218900017ddba..9ebebe90692593c0e26b1f4a7bbbe6f2ce0f8661 100644 (file)
@@ -59,22 +59,24 @@ struct tegra_usb_phy {
        struct usb_phy *ulpi;
        struct usb_phy u_phy;
        struct device *dev;
+       bool is_legacy_phy;
+       bool is_ulpi_phy;
 };
 
 struct tegra_usb_phy *tegra_usb_phy_open(struct device *dev, int instance,
        void __iomem *regs, void *config, enum tegra_usb_phy_mode phy_mode);
 
-void tegra_usb_phy_clk_disable(struct tegra_usb_phy *phy);
+void tegra_usb_phy_preresume(struct usb_phy *phy);
 
-void tegra_usb_phy_clk_enable(struct tegra_usb_phy *phy);
+void tegra_usb_phy_postresume(struct usb_phy *phy);
 
-void tegra_usb_phy_preresume(struct tegra_usb_phy *phy);
+void tegra_ehci_phy_restore_start(struct usb_phy *phy,
+                                enum tegra_usb_phy_port_speed port_speed);
 
-void tegra_usb_phy_postresume(struct tegra_usb_phy *phy);
+void tegra_ehci_phy_restore_end(struct usb_phy *phy);
 
-void tegra_ehci_phy_restore_start(struct tegra_usb_phy *phy,
-                                enum tegra_usb_phy_port_speed port_speed);
+void tegra_ehci_set_pts(struct usb_phy *x, u8 pts_val);
 
-void tegra_ehci_phy_restore_end(struct tegra_usb_phy *phy);
+void tegra_ehci_set_phcd(struct usb_phy *x, bool enable);
 
 #endif /* __TEGRA_USB_PHY_H */
index f354dc390a0be4c1b57ae473f8b357f9c66cb632..2355630367f7282bdc5f73cb7948d831ce3ec1be 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
-#include <mach/clk.h>
+#include <linux/clk/tegra.h>
 #include <sound/soc.h>
 #include "tegra30_ahub.h"
 
@@ -299,15 +299,6 @@ static const char * const configlink_clocks[] = {
        "spdif_in",
 };
 
-struct of_dev_auxdata ahub_auxdata[] = {
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080300, "tegra30-i2s.0", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080400, "tegra30-i2s.1", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080500, "tegra30-i2s.2", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080600, "tegra30-i2s.3", NULL),
-       OF_DEV_AUXDATA("nvidia,tegra30-i2s", 0x70080700, "tegra30-i2s.4", NULL),
-       {}
-};
-
 #define LAST_REG(name) \
        (TEGRA30_AHUB_##name + \
         (TEGRA30_AHUB_##name##_STRIDE * TEGRA30_AHUB_##name##_COUNT) - 4)
@@ -451,7 +442,7 @@ static int tegra30_ahub_probe(struct platform_device *pdev)
         * Ensure that here.
         */
        for (i = 0; i < ARRAY_SIZE(configlink_clocks); i++) {
-               clk = clk_get_sys(NULL, configlink_clocks[i]);
+               clk = clk_get(&pdev->dev, configlink_clocks[i]);
                if (IS_ERR(clk)) {
                        dev_err(&pdev->dev, "Can't get clock %s\n",
                                configlink_clocks[i]);
@@ -569,8 +560,7 @@ static int tegra30_ahub_probe(struct platform_device *pdev)
                        goto err_pm_disable;
        }
 
-       of_platform_populate(pdev->dev.of_node, NULL, ahub_auxdata,
-                            &pdev->dev);
+       of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
 
        return 0;