LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* Re: machine check in kernel for a mpc870 board
From: Scott Wood @ 2010-07-02 19:41 UTC (permalink / raw)
  To: Shawn Jin; +Cc: ppcdev
In-Reply-To: <AANLkTimX7G59glJ9CQZpT-Zlb3EUsJ1Lil4_80BOi1Nk@mail.gmail.com>

On Fri, 2 Jul 2010 12:16:11 -0700
Shawn Jin <shawnxjin@gmail.com> wrote:

> >> The chipselect? Isn't it just the child-bus-addr? BTW, do we have
> >> to define the #address-cells to 2? 1 is not enough?
> >
> > The first cell of the child bus address is the chip select, the
> > second cell is the offset into the chip select.
>=20
> I see. So the #address-sells of 2 doesn't necessarily indicate the
> address is 64 bits?

Well, there's 64 bits of data, but it doesn't mean that it's one 64-bit
integer.

> Different processors can interpret it differently?

Different device tree bus types can -- though in this case it translates
to an ordinary CPU address using the standand ranges property.

> Where can I find such info? Is there any doc on this?

Documentation/powerpc/dts-bindings/fsl/lbc.txt

> I have a question on the serial settings. Why does it locate at 0xa80?
> According to MPC885RM.pdf, the SMC1's registers start from 0xa82.=20

I suppose the interpretation was that the register block starts at
0xa80, and the first register within that block is at 0xa82 -- though
the manual seems to actually lump those two reserved bytes in with the
previous section.

> What does the reg property specify here for SMC1, the first set of <0xa80
> 0x10> and the 2nd <0x3e80 0x40>?

=46rom Documentation/powerpc/dts-bindings/fsl/cpm.txt:
> - reg : Unless otherwise specified, the first resource represents the =20
>         scc/fcc/ucc registers, and the second represents the device's
>         parameter RAM region (if it has one).

-Scott

^ permalink raw reply

* Re: [PATCH] powerpc: introduce basic support for the Freescale P1022DS reference board
From: Timur Tabi @ 2010-07-02 20:54 UTC (permalink / raw)
  To: sandeep.kumar; +Cc: linuxppc-dev
In-Reply-To: <20100629171904.d6ae6233.kim.phillips@freescale.com>

Sandeep,

I believe you are the author of the code that adds multiple queue and
multiple group support to the Gianfar driver.  Can you update
Documentation/powerpc/dts-bindings/fsl/tsec.txt with the binding
documentation for these nodes, so that we can all know what they're supposed
to look like?

Kim Phillips wrote:

>> +		enet0: ethernet@B0000 {
>> +			queue-group@0{
>> +				#address-cells = <1>;
>> +				#size-cells = <1>;
>> +				reg = <0xB0000 0x1000>;
>> +				fsl,rx-err-int-map = <0xAA>;
>> +				fsl,tx-int-map = <0xAA>;
>> +				interrupts = <29 2 30 2 34 2>;
>> +			};
>> +			queue-group@1{
>> +				#address-cells = <1>;
>> +				#size-cells = <1>;
>> +				reg = <0xB4000 0x1000>;
>> +				fsl,rx-err-int-map = <0x55>;
>> +				fsl,tx-int-map = <0x55>;
>> +				interrupts = <17 2 18 2 24 2>;
>> +			};
>> +		};
>> +
>> +		enet1: ethernet@B1000 {
> 
>> +			queue-group@0{
>> +				#address-cells = <1>;
>> +				#size-cells = <1>;
>> +				reg = <0xB1000 0x1000>;
>> +				fsl,rx-err-int-map = <0xAA>;
>> +				fsl,tx-int-map = <0xAA>;
>> +				interrupts = <35 2 36 2 40 2>;
>> +			};
>> +			queue-group@1{
>> +				#address-cells = <1>;
>> +				#size-cells = <1>;
>> +				reg = <0xB5000 0x1000>;
>> +				fsl,rx-err-int-map = <0x55>;
>> +				fsl,tx-int-map = <0x55>;
>> +				interrupts = <51 2 52 2 67 2>;
>> +			};
> 
> these queue-group nodes, fsl,{r,t}x-* properties...
> 
>> +		crypto@30000 {
> 
>> +			fsl,multi-host-mode = "dual";
>> +			fsl,channel-remap = <0x3>;
> 
> and the above two properties aren't supported by their respective
> drivers, nor are they listed in the dts bindings documentation.
> 
> Kim

^ permalink raw reply

* [PATCH] [v2] powerpc: introduce basic support for the Freescale P1022DS reference board
From: Timur Tabi @ 2010-07-02 22:25 UTC (permalink / raw)
  To: linuxppc-dev

Introduce basic support for the Freescale P1022DS reference board, based on the
Freescale BSP for this board.  This patch excludes the DIU, SSI, and MMC/SD
drivers.  Only a 36-bit DTS is provided.

Update mpc86xx_smp_defconfig and mpc85xx_defconfig to support the P1022DS.
This means enabling 64-bit physical address support, increasing the maximum
zone order to 12 (to allow the DIU driver to allocate large chunks), and
clean up the audio options to disable the deprecated OSS support.

Signed-off-by: Timur Tabi <timur@freescale.com>
---

This patch is for 2.6.36.

 arch/powerpc/boot/dts/p1022ds.dts          |  633 ++++++++++++++++++++++++++++
 arch/powerpc/configs/mpc85xx_defconfig     |   34 +-
 arch/powerpc/configs/mpc85xx_smp_defconfig |   34 +-
 arch/powerpc/platforms/85xx/Kconfig        |    8 +
 arch/powerpc/platforms/85xx/Makefile       |    1 +
 arch/powerpc/platforms/85xx/p1022_ds.c     |  148 +++++++
 6 files changed, 814 insertions(+), 44 deletions(-)
 create mode 100644 arch/powerpc/boot/dts/p1022ds.dts
 create mode 100644 arch/powerpc/platforms/85xx/p1022_ds.c

diff --git a/arch/powerpc/boot/dts/p1022ds.dts b/arch/powerpc/boot/dts/p1022ds.dts
new file mode 100644
index 0000000..8bcb10b
--- /dev/null
+++ b/arch/powerpc/boot/dts/p1022ds.dts
@@ -0,0 +1,633 @@
+/*
+ * P1022 DS 36Bit Physical Address Map Device Tree Source
+ *
+ * Copyright 2010 Freescale Semiconductor, Inc.
+ *
+ * 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.
+ */
+
+/dts-v1/;
+/ {
+	model = "fsl,P1022";
+	compatible = "fsl,P1022DS";
+	#address-cells = <2>;
+	#size-cells = <2>;
+	interrupt-parent = <&mpic>;
+
+	aliases {
+		ethernet0 = &enet0;
+		ethernet1 = &enet1;
+		serial0 = &serial0;
+		serial1 = &serial1;
+		pci0 = &pci0;
+		pci1 = &pci1;
+		pci2 = &pci2;
+	};
+
+	cpus {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		PowerPC,P1022@0 {
+			device_type = "cpu";
+			reg = <0x0>;
+			next-level-cache = <&L2>;
+		};
+
+		PowerPC,P1022@1 {
+			device_type = "cpu";
+			reg = <0x1>;
+			next-level-cache = <&L2>;
+		};
+	};
+
+	memory {
+		device_type = "memory";
+	};
+
+	localbus@fffe05000 {
+		#address-cells = <2>;
+		#size-cells = <1>;
+		compatible = "fsl,p1022-elbc", "fsl,elbc", "simple-bus";
+		reg = <0 0xffe05000 0 0x1000>;
+		interrupts = <19 2>;
+
+		ranges = <0x0 0x0 0xf 0xe8000000 0x08000000
+			  0x1 0x0 0xf 0xe0000000 0x08000000
+			  0x2 0x0 0x0 0xffa00000 0x00040000
+			  0x3 0x0 0xf 0xffdf0000 0x00008000>;
+
+		nor@0,0 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "cfi-flash";
+			reg = <0x0 0x0 0x8000000>;
+			bank-width = <2>;
+			device-width = <1>;
+
+			partition@0 {
+				reg = <0x0 0x03000000>;
+				label = "ramdisk-nor";
+				read-only;
+			};
+
+			partition@3000000 {
+				reg = <0x03000000 0x00e00000>;
+				label = "diagnostic-nor";
+				read-only;
+			};
+
+			partition@3e00000 {
+				reg = <0x03e00000 0x00200000>;
+				label = "dink-nor";
+				read-only;
+			};
+
+			partition@4000000 {
+				reg = <0x04000000 0x00400000>;
+				label = "kernel-nor";
+				read-only;
+			};
+
+			partition@4400000 {
+				reg = <0x04400000 0x03b00000>;
+				label = "jffs2-nor";
+			};
+
+			partition@7f00000 {
+				reg = <0x07f00000 0x00080000>;
+				label = "dtb-nor";
+				read-only;
+			};
+
+			partition@7f80000 {
+				reg = <0x07f80000 0x00080000>;
+				label = "u-boot-nor";
+				read-only;
+			};
+		};
+
+		nand@2,0 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "fsl,elbc-fcm-nand";
+			reg = <0x2 0x0 0x40000>;
+
+			partition@0 {
+				reg = <0x0 0x02000000>;
+				label = "u-boot-nand";
+				read-only;
+			};
+
+			partition@2000000 {
+				reg = <0x02000000 0x10000000>;
+				label = "jffs2-nand";
+			};
+
+			partition@12000000 {
+				reg = <0x12000000 0x10000000>;
+				label = "ramdisk-nand";
+				read-only;
+			};
+
+			partition@22000000 {
+				reg = <0x22000000 0x04000000>;
+				label = "kernel-nand";
+			};
+
+			partition@26000000 {
+				reg = <0x26000000 0x01000000>;
+				label = "dtb-nand";
+				read-only;
+			};
+
+			partition@27000000 {
+				reg = <0x27000000 0x19000000>;
+				label = "reserved-nand";
+			};
+		};
+	};
+
+	soc@fffe00000 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		device_type = "soc";
+		compatible = "fsl,p1022-immr", "simple-bus";
+		ranges = <0x0 0xf 0xffe00000 0x100000>;
+		bus-frequency = <0>;		// Filled out by uboot.
+
+		ecm-law@0 {
+			compatible = "fsl,ecm-law";
+			reg = <0x0 0x1000>;
+			fsl,num-laws = <12>;
+		};
+
+		ecm@1000 {
+			compatible = "fsl,p1022-ecm", "fsl,ecm";
+			reg = <0x1000 0x1000>;
+			interrupts = <16 2>;
+		};
+
+		memory-controller@2000 {
+			compatible = "fsl,p1022-memory-controller";
+			reg = <0x2000 0x1000>;
+			interrupts = <16 2>;
+		};
+
+		i2c@3000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			cell-index = <0>;
+			compatible = "fsl-i2c";
+			reg = <0x3000 0x100>;
+			interrupts = <43 2>;
+			dfsrr;
+		};
+
+		i2c@3100 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			cell-index = <1>;
+			compatible = "fsl-i2c";
+			reg = <0x3100 0x100>;
+			interrupts = <43 2>;
+			dfsrr;
+
+			wm8776:codec@1a {
+				compatible = "wlf,wm8776";
+				reg = <0x1a>;
+				/* MCLK source is a stand-alone oscillator */
+				clock-frequency = <12288000>;
+			};
+		};
+
+		serial0: serial@4500 {
+			cell-index = <0>;
+			device_type = "serial";
+			compatible = "ns16550";
+			reg = <0x4500 0x100>;
+			clock-frequency = <0>;
+			interrupts = <42 2>;
+		};
+
+		serial1: serial@4600 {
+			cell-index = <1>;
+			device_type = "serial";
+			compatible = "ns16550";
+			reg = <0x4600 0x100>;
+			clock-frequency = <0>;
+			interrupts = <42 2>;
+		};
+
+		spi@7000 {
+			cell-index = <0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "fsl,espi";
+			reg = <0x7000 0x1000>;
+			interrupts = <59 0x2>;
+			espi,num-ss-bits = <4>;
+			mode = "cpu";
+
+			fsl_m25p80@0 {
+				#address-cells = <1>;
+				#size-cells = <1>;
+				compatible = "fsl,espi-flash";
+				reg = <0>;
+				linux,modalias = "fsl_m25p80";
+				spi-max-frequency = <40000000>; /* input clock */
+				partition@0 {
+					label = "u-boot-spi";
+					reg = <0x00000000 0x00100000>;
+					read-only;
+				};
+				partition@100000 {
+					label = "kernel-spi";
+					reg = <0x00100000 0x00500000>;
+					read-only;
+				};
+				partition@600000 {
+					label = "dtb-spi";
+					reg = <0x00600000 0x00100000>;
+					read-only;
+				};
+				partition@700000 {
+					label = "file system-spi";
+					reg = <0x00700000 0x00900000>;
+				};
+			};
+		};
+
+		ssi@15000 {
+			compatible = "fsl,mpc8610-ssi";
+			cell-index = <0>;
+			reg = <0x15000 0x100>;
+			interrupts = <75 2>;
+			fsl,mode = "i2s-slave";
+			codec-handle = <&wm8776>;
+			fsl,playback-dma = <&dma00>;
+			fsl,capture-dma = <&dma01>;
+			fsl,fifo-depth = <16>;
+		};
+
+		dma@c300 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "fsl,eloplus-dma";
+			reg = <0xc300 0x4>;
+			ranges = <0x0 0xc100 0x200>;
+			cell-index = <1>;
+			dma00: dma-channel@0 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x0 0x80>;
+				cell-index = <0>;
+				interrupts = <76 2>;
+			};
+			dma01: dma-channel@80 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x80 0x80>;
+				cell-index = <1>;
+				interrupts = <77 2>;
+			};
+			dma-channel@100 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x100 0x80>;
+				cell-index = <2>;
+				interrupts = <78 2>;
+			};
+			dma-channel@180 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x180 0x80>;
+				cell-index = <3>;
+				interrupts = <79 2>;
+			};
+		};
+
+		gpio: gpio-controller@f000 {
+			#gpio-cells = <2>;
+			compatible = "fsl,mpc8572-gpio";
+			reg = <0xf000 0x100>;
+			interrupts = <47 0x2>;
+			gpio-controller;
+		};
+
+		L2: l2-cache-controller@20000 {
+			compatible = "fsl,p1022-l2-cache-controller";
+			reg = <0x20000 0x1000>;
+			cache-line-size = <32>;	// 32 bytes
+			cache-size = <0x40000>; // L2, 256K
+			interrupts = <16 2>;
+		};
+
+		dma@21300 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "fsl,eloplus-dma";
+			reg = <0x21300 0x4>;
+			ranges = <0x0 0x21100 0x200>;
+			cell-index = <0>;
+			dma-channel@0 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x0 0x80>;
+				cell-index = <0>;
+				interrupts = <20 2>;
+			};
+			dma-channel@80 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x80 0x80>;
+				cell-index = <1>;
+				interrupts = <21 2>;
+			};
+			dma-channel@100 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x100 0x80>;
+				cell-index = <2>;
+				interrupts = <22 2>;
+			};
+			dma-channel@180 {
+				compatible = "fsl,eloplus-dma-channel";
+				reg = <0x180 0x80>;
+				cell-index = <3>;
+				interrupts = <23 2>;
+			};
+		};
+
+		usb@22000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "fsl-usb2-dr";
+			reg = <0x22000 0x1000>;
+			interrupts = <28 0x2>;
+			phy_type = "ulpi";
+		};
+
+		mdio@24000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "fsl,etsec2-mdio";
+			reg = <0x24000 0x1000 0xb0030 0x4>;
+
+			phy0: ethernet-phy@0 {
+				interrupts = <3 1>;
+				reg = <0x1>;
+			};
+			phy1: ethernet-phy@1 {
+				interrupts = <9 1>;
+				reg = <0x2>;
+			};
+		};
+
+		mdio@25000 {
+			#address-cells = <1>;
+			#size-cells = <0>;
+			compatible = "fsl,etsec2-mdio";
+			reg = <0x25000 0x1000 0xb1030 0x4>;
+		};
+
+		enet0: ethernet@B0000 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			cell-index = <0>;
+			device_type = "network";
+			model = "eTSEC";
+			compatible = "fsl,etsec2";
+			fsl,num_rx_queues = <0x8>;
+			fsl,num_tx_queues = <0x8>;
+			fsl,magic-packet;
+			fsl,wake-on-filer;
+			local-mac-address = [ 00 00 00 00 00 00 ];
+			fixed-link = <1 1 1000 0 0>;
+			phy-handle = <&phy0>;
+			phy-connection-type = "rgmii-id";
+			queue-group@0{
+				#address-cells = <1>;
+				#size-cells = <1>;
+				reg = <0xB0000 0x1000>;
+				interrupts = <29 2 30 2 34 2>;
+			};
+			queue-group@1{
+				#address-cells = <1>;
+				#size-cells = <1>;
+				reg = <0xB4000 0x1000>;
+				interrupts = <17 2 18 2 24 2>;
+			};
+		};
+
+		enet1: ethernet@B1000 {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			cell-index = <0>;
+			device_type = "network";
+			model = "eTSEC";
+			compatible = "fsl,etsec2";
+			fsl,num_rx_queues = <0x8>;
+			fsl,num_tx_queues = <0x8>;
+			local-mac-address = [ 00 00 00 00 00 00 ];
+			fixed-link = <1 1 1000 0 0>;
+			phy-handle = <&phy1>;
+			phy-connection-type = "rgmii-id";
+			queue-group@0{
+				#address-cells = <1>;
+				#size-cells = <1>;
+				reg = <0xB1000 0x1000>;
+				interrupts = <35 2 36 2 40 2>;
+			};
+			queue-group@1{
+				#address-cells = <1>;
+				#size-cells = <1>;
+				reg = <0xB5000 0x1000>;
+				interrupts = <51 2 52 2 67 2>;
+			};
+		};
+
+		sdhci@2e000 {
+			compatible = "fsl,p1022-esdhc", "fsl,esdhc";
+			reg = <0x2e000 0x1000>;
+			interrupts = <72 0x2>;
+			fsl,sdhci-auto-cmd12;
+			/* Filled in by U-Boot */
+			clock-frequency = <0>;
+		};
+
+		crypto@30000 {
+			compatible = "fsl,sec3.3", "fsl,sec3.1", "fsl,sec3.0",
+				     "fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1",
+				     "fsl,sec2.0";
+			reg = <0x30000 0x10000>;
+			interrupts = <45 2 58 2>;
+			fsl,num-channels = <4>;
+			fsl,channel-fifo-len = <24>;
+			fsl,exec-units-mask = <0x97c>;
+			fsl,descriptor-types-mask = <0x3a30abf>;
+		};
+
+		sata@18000 {
+			compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
+			reg = <0x18000 0x1000>;
+			cell-index = <1>;
+			interrupts = <74 0x2>;
+		};
+
+		sata@19000 {
+			compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
+			reg = <0x19000 0x1000>;
+			cell-index = <2>;
+			interrupts = <41 0x2>;
+		};
+
+		power@e0070{
+			compatible = "fsl,mpc8536-pmc", "fsl,mpc8548-pmc";
+			reg = <0xe0070 0x20>;
+		};
+
+		display@10000 {
+			compatible = "fsl,diu", "fsl,p1022-diu";
+			reg = <0x10000 1000>;
+			interrupts = <64 2>;
+		};
+
+		timer@41100 {
+			compatible = "fsl,mpic-global-timer";
+			reg = <0x41100 0x204>;
+			interrupts = <0xf7 0x2>;
+		};
+
+		mpic: pic@40000 {
+			interrupt-controller;
+			#address-cells = <0>;
+			#interrupt-cells = <2>;
+			reg = <0x40000 0x40000>;
+			compatible = "chrp,open-pic";
+			device_type = "open-pic";
+		};
+
+		msi@41600 {
+			compatible = "fsl,p1022-msi", "fsl,mpic-msi";
+			reg = <0x41600 0x80>;
+			msi-available-ranges = <0 0x100>;
+			interrupts = <
+				0xe0 0
+				0xe1 0
+				0xe2 0
+				0xe3 0
+				0xe4 0
+				0xe5 0
+				0xe6 0
+				0xe7 0>;
+		};
+
+		global-utilities@e0000 {	//global utilities block
+			compatible = "fsl,p1022-guts";
+			reg = <0xe0000 0x1000>;
+			fsl,has-rstcr;
+		};
+	};
+
+	pci0: pcie@fffe09000 {
+		compatible = "fsl,p1022-pcie";
+		device_type = "pci";
+		#interrupt-cells = <1>;
+		#size-cells = <2>;
+		#address-cells = <3>;
+		reg = <0xf 0xffe09000 0 0x1000>;
+		bus-range = <0 255>;
+		ranges = <0x2000000 0x0 0xa0000000 0xc 0x20000000 0x0 0x20000000
+			  0x1000000 0x0 0x00000000 0xf 0xffc10000 0x0 0x10000>;
+		clock-frequency = <33333333>;
+		interrupts = <16 2>;
+		interrupt-map-mask = <0xf800 0 0 7>;
+		interrupt-map = <
+			/* IDSEL 0x0 */
+			0000 0 0 1 &mpic 4 1
+			0000 0 0 2 &mpic 5 1
+			0000 0 0 3 &mpic 6 1
+			0000 0 0 4 &mpic 7 1
+			>;
+		pcie@0 {
+			reg = <0x0 0x0 0x0 0x0 0x0>;
+			#size-cells = <2>;
+			#address-cells = <3>;
+			device_type = "pci";
+			ranges = <0x2000000 0x0 0xe0000000
+				  0x2000000 0x0 0xe0000000
+				  0x0 0x20000000
+
+				  0x1000000 0x0 0x0
+				  0x1000000 0x0 0x0
+				  0x0 0x100000>;
+		};
+	};
+
+	pci1: pcie@fffe0a000 {
+		compatible = "fsl,p1022-pcie";
+		device_type = "pci";
+		#interrupt-cells = <1>;
+		#size-cells = <2>;
+		#address-cells = <3>;
+		reg = <0xf 0xffe0a000 0 0x1000>;
+		bus-range = <0 255>;
+		ranges = <0x2000000 0x0 0xc0000000 0xc 0x40000000 0x0 0x20000000
+			  0x1000000 0x0 0x00000000 0xf 0xffc20000 0x0 0x10000>;
+		clock-frequency = <33333333>;
+		interrupts = <16 2>;
+		interrupt-map-mask = <0xf800 0 0 7>;
+		interrupt-map = <
+			/* IDSEL 0x0 */
+			0000 0 0 1 &mpic 0 1
+			0000 0 0 2 &mpic 1 1
+			0000 0 0 3 &mpic 2 1
+			0000 0 0 4 &mpic 3 1
+			>;
+		pcie@0 {
+			reg = <0x0 0x0 0x0 0x0 0x0>;
+			#size-cells = <2>;
+			#address-cells = <3>;
+			device_type = "pci";
+			ranges = <0x2000000 0x0 0xe0000000
+				  0x2000000 0x0 0xe0000000
+				  0x0 0x20000000
+
+				  0x1000000 0x0 0x0
+				  0x1000000 0x0 0x0
+				  0x0 0x100000>;
+		};
+	};
+
+
+	pci2: pcie@fffe0b000 {
+		compatible = "fsl,p1022-pcie";
+		device_type = "pci";
+		#interrupt-cells = <1>;
+		#size-cells = <2>;
+		#address-cells = <3>;
+		reg = <0xf 0xffe0b000 0 0x1000>;
+		bus-range = <0 255>;
+		ranges = <0x2000000 0x0 0x80000000 0xc 0x00000000 0x0 0x20000000
+			  0x1000000 0x0 0x00000000 0xf 0xffc00000 0x0 0x10000>;
+		clock-frequency = <33333333>;
+		interrupts = <16 2>;
+		interrupt-map-mask = <0xf800 0 0 7>;
+		interrupt-map = <
+			/* IDSEL 0x0 */
+			0000 0 0 1 &mpic 8 1
+			0000 0 0 2 &mpic 9 1
+			0000 0 0 3 &mpic 10 1
+			0000 0 0 4 &mpic 11 1
+			>;
+		pcie@0 {
+			reg = <0x0 0x0 0x0 0x0 0x0>;
+			#size-cells = <2>;
+			#address-cells = <3>;
+			device_type = "pci";
+			ranges = <0x2000000 0x0 0xe0000000
+				  0x2000000 0x0 0xe0000000
+				  0x0 0x20000000
+
+				  0x1000000 0x0 0x0
+				  0x1000000 0x0 0x0
+				  0x0 0x100000>;
+		};
+	};
+};
diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig
index cfebef9..d32f31a 100644
--- a/arch/powerpc/configs/mpc85xx_defconfig
+++ b/arch/powerpc/configs/mpc85xx_defconfig
@@ -19,7 +19,8 @@ CONFIG_E500=y
 CONFIG_FSL_EMB_PERFMON=y
 CONFIG_BOOKE=y
 CONFIG_FSL_BOOKE=y
-# CONFIG_PHYS_64BIT is not set
+CONFIG_PTE_64BIT=y
+CONFIG_PHYS_64BIT=y
 CONFIG_SPE=y
 CONFIG_PPC_MMU_NOHASH=y
 CONFIG_PPC_MMU_NOHASH_32=y
@@ -28,7 +29,7 @@ CONFIG_PPC_BOOK3E_MMU=y
 # CONFIG_SMP is not set
 CONFIG_PPC32=y
 CONFIG_WORD_SIZE=32
-# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
 CONFIG_MMU=y
 CONFIG_GENERIC_CMOS_UPDATE=y
 CONFIG_GENERIC_TIME=y
@@ -239,6 +240,7 @@ CONFIG_MPC85xx_MDS=y
 CONFIG_MPC8536_DS=y
 CONFIG_MPC85xx_DS=y
 CONFIG_MPC85xx_RDB=y
+CONFIG_P1022_DS=y
 CONFIG_SOCRATES=y
 CONFIG_KSI8560=y
 CONFIG_XES_MPC85xx=y
@@ -311,7 +313,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_PAGEFLAGS_EXTENDED=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_MIGRATION=y
-# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_PHYS_ADDR_T_64BIT=y
 CONFIG_ZONE_DMA_FLAG=1
 CONFIG_BOUNCE=y
 CONFIG_VIRT_TO_BUS=y
@@ -321,7 +323,7 @@ CONFIG_PPC_4K_PAGES=y
 # CONFIG_PPC_16K_PAGES is not set
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_PPC_256K_PAGES is not set
-CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_FORCE_MAX_ZONEORDER=12
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
 CONFIG_EXTRA_TARGETS=""
@@ -1122,16 +1124,13 @@ CONFIG_VGA_CONSOLE=y
 # CONFIG_VGACON_SOFT_SCROLLBACK is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_SOUND=y
-CONFIG_SOUND_OSS_CORE=y
-CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+# CONFIG_SOUND_OSS_CORE is not set
 CONFIG_SND=y
 CONFIG_SND_TIMER=y
 CONFIG_SND_PCM=y
 # CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_PCM_OSS is not set
 # CONFIG_SND_HRTIMER is not set
 # CONFIG_SND_DYNAMIC_MINORS is not set
 # CONFIG_SND_SUPPORT_OLD_API is not set
@@ -1145,12 +1144,7 @@ CONFIG_SND_VMASTER=y
 # CONFIG_SND_SBAWE_SEQ is not set
 # CONFIG_SND_EMU10K1_SEQ is not set
 CONFIG_SND_AC97_CODEC=y
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
+# CONFIG_SND_DRIVERS is not set
 CONFIG_SND_PCI=y
 # CONFIG_SND_AD1889 is not set
 # CONFIG_SND_ALS300 is not set
@@ -1218,12 +1212,8 @@ CONFIG_SND_INTEL8X0=y
 # CONFIG_SND_VIRTUOSO is not set
 # CONFIG_SND_VX222 is not set
 # CONFIG_SND_YMFPCI is not set
-CONFIG_SND_PPC=y
-CONFIG_SND_USB=y
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_UA101 is not set
-# CONFIG_SND_USB_USX2Y is not set
-# CONFIG_SND_USB_CAIAQ is not set
+# CONFIG_SND_PPC is not set
+# CONFIG_SND_USB is not set
 # CONFIG_SND_SOC is not set
 # CONFIG_SOUND_PRIME is not set
 CONFIG_AC97_BUS=y
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig
index f5451d8..f93de10 100644
--- a/arch/powerpc/configs/mpc85xx_smp_defconfig
+++ b/arch/powerpc/configs/mpc85xx_smp_defconfig
@@ -19,7 +19,8 @@ CONFIG_E500=y
 CONFIG_FSL_EMB_PERFMON=y
 CONFIG_BOOKE=y
 CONFIG_FSL_BOOKE=y
-# CONFIG_PHYS_64BIT is not set
+CONFIG_PTE_64BIT=y
+CONFIG_PHYS_64BIT=y
 CONFIG_SPE=y
 CONFIG_PPC_MMU_NOHASH=y
 CONFIG_PPC_MMU_NOHASH_32=y
@@ -29,7 +30,7 @@ CONFIG_SMP=y
 CONFIG_NR_CPUS=8
 CONFIG_PPC32=y
 CONFIG_WORD_SIZE=32
-# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
 CONFIG_MMU=y
 CONFIG_GENERIC_CMOS_UPDATE=y
 CONFIG_GENERIC_TIME=y
@@ -243,6 +244,7 @@ CONFIG_MPC85xx_MDS=y
 CONFIG_MPC8536_DS=y
 CONFIG_MPC85xx_DS=y
 CONFIG_MPC85xx_RDB=y
+CONFIG_P1022_DS=y
 CONFIG_SOCRATES=y
 CONFIG_KSI8560=y
 CONFIG_XES_MPC85xx=y
@@ -316,7 +318,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_PAGEFLAGS_EXTENDED=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_MIGRATION=y
-# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_PHYS_ADDR_T_64BIT=y
 CONFIG_ZONE_DMA_FLAG=1
 CONFIG_BOUNCE=y
 CONFIG_VIRT_TO_BUS=y
@@ -326,7 +328,7 @@ CONFIG_PPC_4K_PAGES=y
 # CONFIG_PPC_16K_PAGES is not set
 # CONFIG_PPC_64K_PAGES is not set
 # CONFIG_PPC_256K_PAGES is not set
-CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_FORCE_MAX_ZONEORDER=12
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
 CONFIG_EXTRA_TARGETS=""
@@ -1127,16 +1129,13 @@ CONFIG_VGA_CONSOLE=y
 # CONFIG_VGACON_SOFT_SCROLLBACK is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_SOUND=y
-CONFIG_SOUND_OSS_CORE=y
-CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+# CONFIG_SOUND_OSS_CORE is not set
 CONFIG_SND=y
 CONFIG_SND_TIMER=y
 CONFIG_SND_PCM=y
 # CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_PCM_OSS is not set
 # CONFIG_SND_HRTIMER is not set
 # CONFIG_SND_DYNAMIC_MINORS is not set
 # CONFIG_SND_SUPPORT_OLD_API is not set
@@ -1150,12 +1149,7 @@ CONFIG_SND_VMASTER=y
 # CONFIG_SND_SBAWE_SEQ is not set
 # CONFIG_SND_EMU10K1_SEQ is not set
 CONFIG_SND_AC97_CODEC=y
-CONFIG_SND_DRIVERS=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
+# CONFIG_SND_DRIVERS is not set
 CONFIG_SND_PCI=y
 # CONFIG_SND_AD1889 is not set
 # CONFIG_SND_ALS300 is not set
@@ -1223,12 +1217,8 @@ CONFIG_SND_INTEL8X0=y
 # CONFIG_SND_VIRTUOSO is not set
 # CONFIG_SND_VX222 is not set
 # CONFIG_SND_YMFPCI is not set
-CONFIG_SND_PPC=y
-CONFIG_SND_USB=y
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_UA101 is not set
-# CONFIG_SND_USB_USX2Y is not set
-# CONFIG_SND_USB_CAIAQ is not set
+# CONFIG_SND_PPC is not set
+# CONFIG_SND_USB is not set
 # CONFIG_SND_SOC is not set
 # CONFIG_SOUND_PRIME is not set
 CONFIG_AC97_BUS=y
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
index 3a2ade2..bea1f59 100644
--- a/arch/powerpc/platforms/85xx/Kconfig
+++ b/arch/powerpc/platforms/85xx/Kconfig
@@ -65,6 +65,14 @@ config MPC85xx_RDB
 	help
 	  This option enables support for the MPC85xx RDB (P2020 RDB) board
 
+config P1022_DS
+	bool "Freescale P1022 DS"
+	select DEFAULT_UIMAGE
+	select CONFIG_PHYS_64BIT	# The DTS has 36-bit addresses
+	select SWIOTLB
+	help
+	  This option enables support for the Freescale P1022DS reference board.
+
 config SOCRATES
 	bool "Socrates"
 	select DEFAULT_UIMAGE
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile
index 387c128..a2ec3f8 100644
--- a/arch/powerpc/platforms/85xx/Makefile
+++ b/arch/powerpc/platforms/85xx/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_MPC8536_DS)  += mpc8536_ds.o
 obj-$(CONFIG_MPC85xx_DS)  += mpc85xx_ds.o
 obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o
 obj-$(CONFIG_MPC85xx_RDB) += mpc85xx_rdb.o
+obj-$(CONFIG_P1022_DS)    += p1022_ds.o
 obj-$(CONFIG_P4080_DS)    += p4080_ds.o corenet_ds.o
 obj-$(CONFIG_STX_GP3)	  += stx_gp3.o
 obj-$(CONFIG_TQM85xx)	  += tqm85xx.o
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c
new file mode 100644
index 0000000..e1467c9
--- /dev/null
+++ b/arch/powerpc/platforms/85xx/p1022_ds.c
@@ -0,0 +1,148 @@
+/*
+ * P1022DS board specific routines
+ *
+ * Authors: Travis Wheatley <travis.wheatley@freescale.com>
+ *          Dave Liu <daveliu@freescale.com>
+ *          Timur Tabi <timur@freescale.com>
+ *
+ * Copyright 2010 Freescale Semiconductor, Inc.
+ *
+ * This file is taken from the Freescale P1022DS BSP, with modifications:
+ * 1) No DIU support (pending rewrite of DIU code)
+ * 2) No AMP support
+ * 3) No PCI endpoint support
+ *
+ * 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 <linux/pci.h>
+#include <linux/of_platform.h>
+#include <linux/lmb.h>
+
+#include <asm/mpic.h>
+#include <asm/swiotlb.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/fsl_pci.h>
+
+void __init p1022_ds_pic_init(void)
+{
+	struct mpic *mpic;
+	struct resource r;
+	struct device_node *np;
+
+	np = of_find_node_by_type(NULL, "open-pic");
+	if (!np) {
+		pr_err("Could not find open-pic node\n");
+		return;
+	}
+
+	if (of_address_to_resource(np, 0, &r)) {
+		pr_err("Failed to map mpic register space\n");
+		of_node_put(np);
+		return;
+	}
+
+	mpic = mpic_alloc(np, r.start,
+		MPIC_PRIMARY | MPIC_WANTS_RESET |
+		MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
+		MPIC_SINGLE_DEST_CPU,
+		0, 256, " OpenPIC  ");
+
+	BUG_ON(mpic == NULL);
+	of_node_put(np);
+
+	mpic_init(mpic);
+}
+
+#ifdef CONFIG_SMP
+void __init mpc85xx_smp_init(void);
+#endif
+
+/*
+ * Setup the architecture
+ */
+static void __init p1022_ds_setup_arch(void)
+{
+#ifdef CONFIG_PCI
+	struct device_node *np;
+#endif
+	dma_addr_t max = 0xffffffff;
+
+	if (ppc_md.progress)
+		ppc_md.progress("p1022_ds_setup_arch()", 0);
+
+#ifdef CONFIG_PCI
+	for_each_compatible_node(np, "pci", "fsl,p1022-pcie") {
+		struct resource rsrc;
+		struct pci_controller *hose;
+
+		of_address_to_resource(np, 0, &rsrc);
+
+		if ((rsrc.start & 0xfffff) == 0x8000)
+			fsl_add_bridge(np, 1);
+		else
+			fsl_add_bridge(np, 0);
+
+		hose = pci_find_hose_for_OF_device(np);
+		max = min(max, hose->dma_window_base_cur +
+			  hose->dma_window_size);
+	}
+#endif
+
+#ifdef CONFIG_SMP
+	mpc85xx_smp_init();
+#endif
+
+#ifdef CONFIG_SWIOTLB
+	if (lmb_end_of_DRAM() > max) {
+		ppc_swiotlb_enable = 1;
+		set_pci_dma_ops(&swiotlb_dma_ops);
+		ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
+	}
+#endif
+
+	pr_info("Freescale P1022 DS reference board\n");
+}
+
+static struct of_device_id __initdata p1022_ds_ids[] = {
+	{ .type = "soc", },
+	{ .compatible = "soc", },
+	{ .compatible = "simple-bus", },
+	{ .compatible = "gianfar", },
+	{},
+};
+
+static int __init p1022_ds_publish_devices(void)
+{
+	return of_platform_bus_probe(NULL, p1022_ds_ids, NULL);
+}
+machine_device_initcall(p1022_ds, p1022_ds_publish_devices);
+
+machine_arch_initcall(p1022_ds, swiotlb_setup_bus_notifier);
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init p1022_ds_probe(void)
+{
+	unsigned long root = of_get_flat_dt_root();
+
+	return of_flat_dt_is_compatible(root, "fsl,p1022ds");
+}
+
+define_machine(p1022_ds) {
+	.name			= "P1022 DS",
+	.probe			= p1022_ds_probe,
+	.setup_arch		= p1022_ds_setup_arch,
+	.init_IRQ		= p1022_ds_pic_init,
+#ifdef CONFIG_PCI
+	.pcibios_fixup_bus	= fsl_pcibios_fixup_bus,
+#endif
+	.get_irq		= mpic_get_irq,
+	.restart		= fsl_rstcr_restart,
+	.calibrate_decr		= generic_calibrate_decr,
+	.progress		= udbg_progress,
+};
-- 
1.7.0.1

^ permalink raw reply related

* Re: [PATCH] [v2] powerpc: introduce basic support for the Freescale P1022DS reference board
From: Felix Radensky @ 2010-07-03  7:01 UTC (permalink / raw)
  To: Timur Tabi; +Cc: linuxppc-dev
In-Reply-To: <1278109503-7604-1-git-send-email-timur@freescale.com>

  Hi Timur,

There are currently no drivers in mainline for FSL eSPI controller and eSPI flash.
They are present only in FSL BSP kernel. Do you think it makes sense to keep
DTS entries for something that is not supported ?

Felix.

On 7/3/2010 1:25 AM, Timur Tabi wrote:
> Introduce basic support for the Freescale P1022DS reference board, based on the
> Freescale BSP for this board.  This patch excludes the DIU, SSI, and MMC/SD
> drivers.  Only a 36-bit DTS is provided.
>
> Update mpc86xx_smp_defconfig and mpc85xx_defconfig to support the P1022DS.
> This means enabling 64-bit physical address support, increasing the maximum
> zone order to 12 (to allow the DIU driver to allocate large chunks), and
> clean up the audio options to disable the deprecated OSS support.
>
> Signed-off-by: Timur Tabi<timur@freescale.com>
> ---
>
> This patch is for 2.6.36.
>
>   arch/powerpc/boot/dts/p1022ds.dts          |  633 ++++++++++++++++++++++++++++
>   arch/powerpc/configs/mpc85xx_defconfig     |   34 +-
>   arch/powerpc/configs/mpc85xx_smp_defconfig |   34 +-
>   arch/powerpc/platforms/85xx/Kconfig        |    8 +
>   arch/powerpc/platforms/85xx/Makefile       |    1 +
>   arch/powerpc/platforms/85xx/p1022_ds.c     |  148 +++++++
>   6 files changed, 814 insertions(+), 44 deletions(-)
>   create mode 100644 arch/powerpc/boot/dts/p1022ds.dts
>   create mode 100644 arch/powerpc/platforms/85xx/p1022_ds.c
>
> diff --git a/arch/powerpc/boot/dts/p1022ds.dts b/arch/powerpc/boot/dts/p1022ds.dts
> new file mode 100644
> index 0000000..8bcb10b
> --- /dev/null
> +++ b/arch/powerpc/boot/dts/p1022ds.dts
> @@ -0,0 +1,633 @@
> +/*
> + * P1022 DS 36Bit Physical Address Map Device Tree Source
> + *
> + * Copyright 2010 Freescale Semiconductor, Inc.
> + *
> + * 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.
> + */
> +
> +/dts-v1/;
> +/ {
> +	model = "fsl,P1022";
> +	compatible = "fsl,P1022DS";
> +	#address-cells =<2>;
> +	#size-cells =<2>;
> +	interrupt-parent =<&mpic>;
> +
> +	aliases {
> +		ethernet0 =&enet0;
> +		ethernet1 =&enet1;
> +		serial0 =&serial0;
> +		serial1 =&serial1;
> +		pci0 =&pci0;
> +		pci1 =&pci1;
> +		pci2 =&pci2;
> +	};
> +
> +	cpus {
> +		#address-cells =<1>;
> +		#size-cells =<0>;
> +
> +		PowerPC,P1022@0 {
> +			device_type = "cpu";
> +			reg =<0x0>;
> +			next-level-cache =<&L2>;
> +		};
> +
> +		PowerPC,P1022@1 {
> +			device_type = "cpu";
> +			reg =<0x1>;
> +			next-level-cache =<&L2>;
> +		};
> +	};
> +
> +	memory {
> +		device_type = "memory";
> +	};
> +
> +	localbus@fffe05000 {
> +		#address-cells =<2>;
> +		#size-cells =<1>;
> +		compatible = "fsl,p1022-elbc", "fsl,elbc", "simple-bus";
> +		reg =<0 0xffe05000 0 0x1000>;
> +		interrupts =<19 2>;
> +
> +		ranges =<0x0 0x0 0xf 0xe8000000 0x08000000
> +			  0x1 0x0 0xf 0xe0000000 0x08000000
> +			  0x2 0x0 0x0 0xffa00000 0x00040000
> +			  0x3 0x0 0xf 0xffdf0000 0x00008000>;
> +
> +		nor@0,0 {
> +			#address-cells =<1>;
> +			#size-cells =<1>;
> +			compatible = "cfi-flash";
> +			reg =<0x0 0x0 0x8000000>;
> +			bank-width =<2>;
> +			device-width =<1>;
> +
> +			partition@0 {
> +				reg =<0x0 0x03000000>;
> +				label = "ramdisk-nor";
> +				read-only;
> +			};
> +
> +			partition@3000000 {
> +				reg =<0x03000000 0x00e00000>;
> +				label = "diagnostic-nor";
> +				read-only;
> +			};
> +
> +			partition@3e00000 {
> +				reg =<0x03e00000 0x00200000>;
> +				label = "dink-nor";
> +				read-only;
> +			};
> +
> +			partition@4000000 {
> +				reg =<0x04000000 0x00400000>;
> +				label = "kernel-nor";
> +				read-only;
> +			};
> +
> +			partition@4400000 {
> +				reg =<0x04400000 0x03b00000>;
> +				label = "jffs2-nor";
> +			};
> +
> +			partition@7f00000 {
> +				reg =<0x07f00000 0x00080000>;
> +				label = "dtb-nor";
> +				read-only;
> +			};
> +
> +			partition@7f80000 {
> +				reg =<0x07f80000 0x00080000>;
> +				label = "u-boot-nor";
> +				read-only;
> +			};
> +		};
> +
> +		nand@2,0 {
> +			#address-cells =<1>;
> +			#size-cells =<1>;
> +			compatible = "fsl,elbc-fcm-nand";
> +			reg =<0x2 0x0 0x40000>;
> +
> +			partition@0 {
> +				reg =<0x0 0x02000000>;
> +				label = "u-boot-nand";
> +				read-only;
> +			};
> +
> +			partition@2000000 {
> +				reg =<0x02000000 0x10000000>;
> +				label = "jffs2-nand";
> +			};
> +
> +			partition@12000000 {
> +				reg =<0x12000000 0x10000000>;
> +				label = "ramdisk-nand";
> +				read-only;
> +			};
> +
> +			partition@22000000 {
> +				reg =<0x22000000 0x04000000>;
> +				label = "kernel-nand";
> +			};
> +
> +			partition@26000000 {
> +				reg =<0x26000000 0x01000000>;
> +				label = "dtb-nand";
> +				read-only;
> +			};
> +
> +			partition@27000000 {
> +				reg =<0x27000000 0x19000000>;
> +				label = "reserved-nand";
> +			};
> +		};
> +	};
> +
> +	soc@fffe00000 {
> +		#address-cells =<1>;
> +		#size-cells =<1>;
> +		device_type = "soc";
> +		compatible = "fsl,p1022-immr", "simple-bus";
> +		ranges =<0x0 0xf 0xffe00000 0x100000>;
> +		bus-frequency =<0>;		// Filled out by uboot.
> +
> +		ecm-law@0 {
> +			compatible = "fsl,ecm-law";
> +			reg =<0x0 0x1000>;
> +			fsl,num-laws =<12>;
> +		};
> +
> +		ecm@1000 {
> +			compatible = "fsl,p1022-ecm", "fsl,ecm";
> +			reg =<0x1000 0x1000>;
> +			interrupts =<16 2>;
> +		};
> +
> +		memory-controller@2000 {
> +			compatible = "fsl,p1022-memory-controller";
> +			reg =<0x2000 0x1000>;
> +			interrupts =<16 2>;
> +		};
> +
> +		i2c@3000 {
> +			#address-cells =<1>;
> +			#size-cells =<0>;
> +			cell-index =<0>;
> +			compatible = "fsl-i2c";
> +			reg =<0x3000 0x100>;
> +			interrupts =<43 2>;
> +			dfsrr;
> +		};
> +
> +		i2c@3100 {
> +			#address-cells =<1>;
> +			#size-cells =<0>;
> +			cell-index =<1>;
> +			compatible = "fsl-i2c";
> +			reg =<0x3100 0x100>;
> +			interrupts =<43 2>;
> +			dfsrr;
> +
> +			wm8776:codec@1a {
> +				compatible = "wlf,wm8776";
> +				reg =<0x1a>;
> +				/* MCLK source is a stand-alone oscillator */
> +				clock-frequency =<12288000>;
> +			};
> +		};
> +
> +		serial0: serial@4500 {
> +			cell-index =<0>;
> +			device_type = "serial";
> +			compatible = "ns16550";
> +			reg =<0x4500 0x100>;
> +			clock-frequency =<0>;
> +			interrupts =<42 2>;
> +		};
> +
> +		serial1: serial@4600 {
> +			cell-index =<1>;
> +			device_type = "serial";
> +			compatible = "ns16550";
> +			reg =<0x4600 0x100>;
> +			clock-frequency =<0>;
> +			interrupts =<42 2>;
> +		};
> +
> +		spi@7000 {
> +			cell-index =<0>;
> +			#address-cells =<1>;
> +			#size-cells =<0>;
> +			compatible = "fsl,espi";
> +			reg =<0x7000 0x1000>;
> +			interrupts =<59 0x2>;
> +			espi,num-ss-bits =<4>;
> +			mode = "cpu";
> +
> +			fsl_m25p80@0 {
> +				#address-cells =<1>;
> +				#size-cells =<1>;
> +				compatible = "fsl,espi-flash";
> +				reg =<0>;
> +				linux,modalias = "fsl_m25p80";
> +				spi-max-frequency =<40000000>; /* input clock */
> +				partition@0 {
> +					label = "u-boot-spi";
> +					reg =<0x00000000 0x00100000>;
> +					read-only;
> +				};
> +				partition@100000 {
> +					label = "kernel-spi";
> +					reg =<0x00100000 0x00500000>;
> +					read-only;
> +				};
> +				partition@600000 {
> +					label = "dtb-spi";
> +					reg =<0x00600000 0x00100000>;
> +					read-only;
> +				};
> +				partition@700000 {
> +					label = "file system-spi";
> +					reg =<0x00700000 0x00900000>;
> +				};
> +			};
> +		};
> +
> +		ssi@15000 {
> +			compatible = "fsl,mpc8610-ssi";
> +			cell-index =<0>;
> +			reg =<0x15000 0x100>;
> +			interrupts =<75 2>;
> +			fsl,mode = "i2s-slave";
> +			codec-handle =<&wm8776>;
> +			fsl,playback-dma =<&dma00>;
> +			fsl,capture-dma =<&dma01>;
> +			fsl,fifo-depth =<16>;
> +		};
> +
> +		dma@c300 {
> +			#address-cells =<1>;
> +			#size-cells =<1>;
> +			compatible = "fsl,eloplus-dma";
> +			reg =<0xc300 0x4>;
> +			ranges =<0x0 0xc100 0x200>;
> +			cell-index =<1>;
> +			dma00: dma-channel@0 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x0 0x80>;
> +				cell-index =<0>;
> +				interrupts =<76 2>;
> +			};
> +			dma01: dma-channel@80 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x80 0x80>;
> +				cell-index =<1>;
> +				interrupts =<77 2>;
> +			};
> +			dma-channel@100 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x100 0x80>;
> +				cell-index =<2>;
> +				interrupts =<78 2>;
> +			};
> +			dma-channel@180 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x180 0x80>;
> +				cell-index =<3>;
> +				interrupts =<79 2>;
> +			};
> +		};
> +
> +		gpio: gpio-controller@f000 {
> +			#gpio-cells =<2>;
> +			compatible = "fsl,mpc8572-gpio";
> +			reg =<0xf000 0x100>;
> +			interrupts =<47 0x2>;
> +			gpio-controller;
> +		};
> +
> +		L2: l2-cache-controller@20000 {
> +			compatible = "fsl,p1022-l2-cache-controller";
> +			reg =<0x20000 0x1000>;
> +			cache-line-size =<32>;	// 32 bytes
> +			cache-size =<0x40000>; // L2, 256K
> +			interrupts =<16 2>;
> +		};
> +
> +		dma@21300 {
> +			#address-cells =<1>;
> +			#size-cells =<1>;
> +			compatible = "fsl,eloplus-dma";
> +			reg =<0x21300 0x4>;
> +			ranges =<0x0 0x21100 0x200>;
> +			cell-index =<0>;
> +			dma-channel@0 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x0 0x80>;
> +				cell-index =<0>;
> +				interrupts =<20 2>;
> +			};
> +			dma-channel@80 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x80 0x80>;
> +				cell-index =<1>;
> +				interrupts =<21 2>;
> +			};
> +			dma-channel@100 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x100 0x80>;
> +				cell-index =<2>;
> +				interrupts =<22 2>;
> +			};
> +			dma-channel@180 {
> +				compatible = "fsl,eloplus-dma-channel";
> +				reg =<0x180 0x80>;
> +				cell-index =<3>;
> +				interrupts =<23 2>;
> +			};
> +		};
> +
> +		usb@22000 {
> +			#address-cells =<1>;
> +			#size-cells =<0>;
> +			compatible = "fsl-usb2-dr";
> +			reg =<0x22000 0x1000>;
> +			interrupts =<28 0x2>;
> +			phy_type = "ulpi";
> +		};
> +
> +		mdio@24000 {
> +			#address-cells =<1>;
> +			#size-cells =<0>;
> +			compatible = "fsl,etsec2-mdio";
> +			reg =<0x24000 0x1000 0xb0030 0x4>;
> +
> +			phy0: ethernet-phy@0 {
> +				interrupts =<3 1>;
> +				reg =<0x1>;
> +			};
> +			phy1: ethernet-phy@1 {
> +				interrupts =<9 1>;
> +				reg =<0x2>;
> +			};
> +		};
> +
> +		mdio@25000 {
> +			#address-cells =<1>;
> +			#size-cells =<0>;
> +			compatible = "fsl,etsec2-mdio";
> +			reg =<0x25000 0x1000 0xb1030 0x4>;
> +		};
> +
> +		enet0: ethernet@B0000 {
> +			#address-cells =<1>;
> +			#size-cells =<1>;
> +			cell-index =<0>;
> +			device_type = "network";
> +			model = "eTSEC";
> +			compatible = "fsl,etsec2";
> +			fsl,num_rx_queues =<0x8>;
> +			fsl,num_tx_queues =<0x8>;
> +			fsl,magic-packet;
> +			fsl,wake-on-filer;
> +			local-mac-address = [ 00 00 00 00 00 00 ];
> +			fixed-link =<1 1 1000 0 0>;
> +			phy-handle =<&phy0>;
> +			phy-connection-type = "rgmii-id";
> +			queue-group@0{
> +				#address-cells =<1>;
> +				#size-cells =<1>;
> +				reg =<0xB0000 0x1000>;
> +				interrupts =<29 2 30 2 34 2>;
> +			};
> +			queue-group@1{
> +				#address-cells =<1>;
> +				#size-cells =<1>;
> +				reg =<0xB4000 0x1000>;
> +				interrupts =<17 2 18 2 24 2>;
> +			};
> +		};
> +
> +		enet1: ethernet@B1000 {
> +			#address-cells =<1>;
> +			#size-cells =<1>;
> +			cell-index =<0>;
> +			device_type = "network";
> +			model = "eTSEC";
> +			compatible = "fsl,etsec2";
> +			fsl,num_rx_queues =<0x8>;
> +			fsl,num_tx_queues =<0x8>;
> +			local-mac-address = [ 00 00 00 00 00 00 ];
> +			fixed-link =<1 1 1000 0 0>;
> +			phy-handle =<&phy1>;
> +			phy-connection-type = "rgmii-id";
> +			queue-group@0{
> +				#address-cells =<1>;
> +				#size-cells =<1>;
> +				reg =<0xB1000 0x1000>;
> +				interrupts =<35 2 36 2 40 2>;
> +			};
> +			queue-group@1{
> +				#address-cells =<1>;
> +				#size-cells =<1>;
> +				reg =<0xB5000 0x1000>;
> +				interrupts =<51 2 52 2 67 2>;
> +			};
> +		};
> +
> +		sdhci@2e000 {
> +			compatible = "fsl,p1022-esdhc", "fsl,esdhc";
> +			reg =<0x2e000 0x1000>;
> +			interrupts =<72 0x2>;
> +			fsl,sdhci-auto-cmd12;
> +			/* Filled in by U-Boot */
> +			clock-frequency =<0>;
> +		};
> +
> +		crypto@30000 {
> +			compatible = "fsl,sec3.3", "fsl,sec3.1", "fsl,sec3.0",
> +				     "fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1",
> +				     "fsl,sec2.0";
> +			reg =<0x30000 0x10000>;
> +			interrupts =<45 2 58 2>;
> +			fsl,num-channels =<4>;
> +			fsl,channel-fifo-len =<24>;
> +			fsl,exec-units-mask =<0x97c>;
> +			fsl,descriptor-types-mask =<0x3a30abf>;
> +		};
> +
> +		sata@18000 {
> +			compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
> +			reg =<0x18000 0x1000>;
> +			cell-index =<1>;
> +			interrupts =<74 0x2>;
> +		};
> +
> +		sata@19000 {
> +			compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
> +			reg =<0x19000 0x1000>;
> +			cell-index =<2>;
> +			interrupts =<41 0x2>;
> +		};
> +
> +		power@e0070{
> +			compatible = "fsl,mpc8536-pmc", "fsl,mpc8548-pmc";
> +			reg =<0xe0070 0x20>;
> +		};
> +
> +		display@10000 {
> +			compatible = "fsl,diu", "fsl,p1022-diu";
> +			reg =<0x10000 1000>;
> +			interrupts =<64 2>;
> +		};
> +
> +		timer@41100 {
> +			compatible = "fsl,mpic-global-timer";
> +			reg =<0x41100 0x204>;
> +			interrupts =<0xf7 0x2>;
> +		};
> +
> +		mpic: pic@40000 {
> +			interrupt-controller;
> +			#address-cells =<0>;
> +			#interrupt-cells =<2>;
> +			reg =<0x40000 0x40000>;
> +			compatible = "chrp,open-pic";
> +			device_type = "open-pic";
> +		};
> +
> +		msi@41600 {
> +			compatible = "fsl,p1022-msi", "fsl,mpic-msi";
> +			reg =<0x41600 0x80>;
> +			msi-available-ranges =<0 0x100>;
> +			interrupts =<
> +				0xe0 0
> +				0xe1 0
> +				0xe2 0
> +				0xe3 0
> +				0xe4 0
> +				0xe5 0
> +				0xe6 0
> +				0xe7 0>;
> +		};
> +
> +		global-utilities@e0000 {	//global utilities block
> +			compatible = "fsl,p1022-guts";
> +			reg =<0xe0000 0x1000>;
> +			fsl,has-rstcr;
> +		};
> +	};
> +
> +	pci0: pcie@fffe09000 {
> +		compatible = "fsl,p1022-pcie";
> +		device_type = "pci";
> +		#interrupt-cells =<1>;
> +		#size-cells =<2>;
> +		#address-cells =<3>;
> +		reg =<0xf 0xffe09000 0 0x1000>;
> +		bus-range =<0 255>;
> +		ranges =<0x2000000 0x0 0xa0000000 0xc 0x20000000 0x0 0x20000000
> +			  0x1000000 0x0 0x00000000 0xf 0xffc10000 0x0 0x10000>;
> +		clock-frequency =<33333333>;
> +		interrupts =<16 2>;
> +		interrupt-map-mask =<0xf800 0 0 7>;
> +		interrupt-map =<
> +			/* IDSEL 0x0 */
> +			0000 0 0 1&mpic 4 1
> +			0000 0 0 2&mpic 5 1
> +			0000 0 0 3&mpic 6 1
> +			0000 0 0 4&mpic 7 1
> +			>;
> +		pcie@0 {
> +			reg =<0x0 0x0 0x0 0x0 0x0>;
> +			#size-cells =<2>;
> +			#address-cells =<3>;
> +			device_type = "pci";
> +			ranges =<0x2000000 0x0 0xe0000000
> +				  0x2000000 0x0 0xe0000000
> +				  0x0 0x20000000
> +
> +				  0x1000000 0x0 0x0
> +				  0x1000000 0x0 0x0
> +				  0x0 0x100000>;
> +		};
> +	};
> +
> +	pci1: pcie@fffe0a000 {
> +		compatible = "fsl,p1022-pcie";
> +		device_type = "pci";
> +		#interrupt-cells =<1>;
> +		#size-cells =<2>;
> +		#address-cells =<3>;
> +		reg =<0xf 0xffe0a000 0 0x1000>;
> +		bus-range =<0 255>;
> +		ranges =<0x2000000 0x0 0xc0000000 0xc 0x40000000 0x0 0x20000000
> +			  0x1000000 0x0 0x00000000 0xf 0xffc20000 0x0 0x10000>;
> +		clock-frequency =<33333333>;
> +		interrupts =<16 2>;
> +		interrupt-map-mask =<0xf800 0 0 7>;
> +		interrupt-map =<
> +			/* IDSEL 0x0 */
> +			0000 0 0 1&mpic 0 1
> +			0000 0 0 2&mpic 1 1
> +			0000 0 0 3&mpic 2 1
> +			0000 0 0 4&mpic 3 1
> +			>;
> +		pcie@0 {
> +			reg =<0x0 0x0 0x0 0x0 0x0>;
> +			#size-cells =<2>;
> +			#address-cells =<3>;
> +			device_type = "pci";
> +			ranges =<0x2000000 0x0 0xe0000000
> +				  0x2000000 0x0 0xe0000000
> +				  0x0 0x20000000
> +
> +				  0x1000000 0x0 0x0
> +				  0x1000000 0x0 0x0
> +				  0x0 0x100000>;
> +		};
> +	};
> +
> +
> +	pci2: pcie@fffe0b000 {
> +		compatible = "fsl,p1022-pcie";
> +		device_type = "pci";
> +		#interrupt-cells =<1>;
> +		#size-cells =<2>;
> +		#address-cells =<3>;
> +		reg =<0xf 0xffe0b000 0 0x1000>;
> +		bus-range =<0 255>;
> +		ranges =<0x2000000 0x0 0x80000000 0xc 0x00000000 0x0 0x20000000
> +			  0x1000000 0x0 0x00000000 0xf 0xffc00000 0x0 0x10000>;
> +		clock-frequency =<33333333>;
> +		interrupts =<16 2>;
> +		interrupt-map-mask =<0xf800 0 0 7>;
> +		interrupt-map =<
> +			/* IDSEL 0x0 */
> +			0000 0 0 1&mpic 8 1
> +			0000 0 0 2&mpic 9 1
> +			0000 0 0 3&mpic 10 1
> +			0000 0 0 4&mpic 11 1
> +			>;
> +		pcie@0 {
> +			reg =<0x0 0x0 0x0 0x0 0x0>;
> +			#size-cells =<2>;
> +			#address-cells =<3>;
> +			device_type = "pci";
> +			ranges =<0x2000000 0x0 0xe0000000
> +				  0x2000000 0x0 0xe0000000
> +				  0x0 0x20000000
> +
> +				  0x1000000 0x0 0x0
> +				  0x1000000 0x0 0x0
> +				  0x0 0x100000>;
> +		};
> +	};
> +};
> diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig
> index cfebef9..d32f31a 100644
> --- a/arch/powerpc/configs/mpc85xx_defconfig
> +++ b/arch/powerpc/configs/mpc85xx_defconfig
> @@ -19,7 +19,8 @@ CONFIG_E500=y
>   CONFIG_FSL_EMB_PERFMON=y
>   CONFIG_BOOKE=y
>   CONFIG_FSL_BOOKE=y
> -# CONFIG_PHYS_64BIT is not set
> +CONFIG_PTE_64BIT=y
> +CONFIG_PHYS_64BIT=y
>   CONFIG_SPE=y
>   CONFIG_PPC_MMU_NOHASH=y
>   CONFIG_PPC_MMU_NOHASH_32=y
> @@ -28,7 +29,7 @@ CONFIG_PPC_BOOK3E_MMU=y
>   # CONFIG_SMP is not set
>   CONFIG_PPC32=y
>   CONFIG_WORD_SIZE=32
> -# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
> +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
>   CONFIG_MMU=y
>   CONFIG_GENERIC_CMOS_UPDATE=y
>   CONFIG_GENERIC_TIME=y
> @@ -239,6 +240,7 @@ CONFIG_MPC85xx_MDS=y
>   CONFIG_MPC8536_DS=y
>   CONFIG_MPC85xx_DS=y
>   CONFIG_MPC85xx_RDB=y
> +CONFIG_P1022_DS=y
>   CONFIG_SOCRATES=y
>   CONFIG_KSI8560=y
>   CONFIG_XES_MPC85xx=y
> @@ -311,7 +313,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
>   CONFIG_PAGEFLAGS_EXTENDED=y
>   CONFIG_SPLIT_PTLOCK_CPUS=4
>   CONFIG_MIGRATION=y
> -# CONFIG_PHYS_ADDR_T_64BIT is not set
> +CONFIG_PHYS_ADDR_T_64BIT=y
>   CONFIG_ZONE_DMA_FLAG=1
>   CONFIG_BOUNCE=y
>   CONFIG_VIRT_TO_BUS=y
> @@ -321,7 +323,7 @@ CONFIG_PPC_4K_PAGES=y
>   # CONFIG_PPC_16K_PAGES is not set
>   # CONFIG_PPC_64K_PAGES is not set
>   # CONFIG_PPC_256K_PAGES is not set
> -CONFIG_FORCE_MAX_ZONEORDER=11
> +CONFIG_FORCE_MAX_ZONEORDER=12
>   CONFIG_PROC_DEVICETREE=y
>   # CONFIG_CMDLINE_BOOL is not set
>   CONFIG_EXTRA_TARGETS=""
> @@ -1122,16 +1124,13 @@ CONFIG_VGA_CONSOLE=y
>   # CONFIG_VGACON_SOFT_SCROLLBACK is not set
>   CONFIG_DUMMY_CONSOLE=y
>   CONFIG_SOUND=y
> -CONFIG_SOUND_OSS_CORE=y
> -CONFIG_SOUND_OSS_CORE_PRECLAIM=y
> +# CONFIG_SOUND_OSS_CORE is not set
>   CONFIG_SND=y
>   CONFIG_SND_TIMER=y
>   CONFIG_SND_PCM=y
>   # CONFIG_SND_SEQUENCER is not set
> -CONFIG_SND_OSSEMUL=y
> -CONFIG_SND_MIXER_OSS=y
> -CONFIG_SND_PCM_OSS=y
> -CONFIG_SND_PCM_OSS_PLUGINS=y
> +# CONFIG_SND_MIXER_OSS is not set
> +# CONFIG_SND_PCM_OSS is not set
>   # CONFIG_SND_HRTIMER is not set
>   # CONFIG_SND_DYNAMIC_MINORS is not set
>   # CONFIG_SND_SUPPORT_OLD_API is not set
> @@ -1145,12 +1144,7 @@ CONFIG_SND_VMASTER=y
>   # CONFIG_SND_SBAWE_SEQ is not set
>   # CONFIG_SND_EMU10K1_SEQ is not set
>   CONFIG_SND_AC97_CODEC=y
> -CONFIG_SND_DRIVERS=y
> -# CONFIG_SND_DUMMY is not set
> -# CONFIG_SND_MTPAV is not set
> -# CONFIG_SND_SERIAL_U16550 is not set
> -# CONFIG_SND_MPU401 is not set
> -# CONFIG_SND_AC97_POWER_SAVE is not set
> +# CONFIG_SND_DRIVERS is not set
>   CONFIG_SND_PCI=y
>   # CONFIG_SND_AD1889 is not set
>   # CONFIG_SND_ALS300 is not set
> @@ -1218,12 +1212,8 @@ CONFIG_SND_INTEL8X0=y
>   # CONFIG_SND_VIRTUOSO is not set
>   # CONFIG_SND_VX222 is not set
>   # CONFIG_SND_YMFPCI is not set
> -CONFIG_SND_PPC=y
> -CONFIG_SND_USB=y
> -# CONFIG_SND_USB_AUDIO is not set
> -# CONFIG_SND_USB_UA101 is not set
> -# CONFIG_SND_USB_USX2Y is not set
> -# CONFIG_SND_USB_CAIAQ is not set
> +# CONFIG_SND_PPC is not set
> +# CONFIG_SND_USB is not set
>   # CONFIG_SND_SOC is not set
>   # CONFIG_SOUND_PRIME is not set
>   CONFIG_AC97_BUS=y
> diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig
> index f5451d8..f93de10 100644
> --- a/arch/powerpc/configs/mpc85xx_smp_defconfig
> +++ b/arch/powerpc/configs/mpc85xx_smp_defconfig
> @@ -19,7 +19,8 @@ CONFIG_E500=y
>   CONFIG_FSL_EMB_PERFMON=y
>   CONFIG_BOOKE=y
>   CONFIG_FSL_BOOKE=y
> -# CONFIG_PHYS_64BIT is not set
> +CONFIG_PTE_64BIT=y
> +CONFIG_PHYS_64BIT=y
>   CONFIG_SPE=y
>   CONFIG_PPC_MMU_NOHASH=y
>   CONFIG_PPC_MMU_NOHASH_32=y
> @@ -29,7 +30,7 @@ CONFIG_SMP=y
>   CONFIG_NR_CPUS=8
>   CONFIG_PPC32=y
>   CONFIG_WORD_SIZE=32
> -# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
> +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
>   CONFIG_MMU=y
>   CONFIG_GENERIC_CMOS_UPDATE=y
>   CONFIG_GENERIC_TIME=y
> @@ -243,6 +244,7 @@ CONFIG_MPC85xx_MDS=y
>   CONFIG_MPC8536_DS=y
>   CONFIG_MPC85xx_DS=y
>   CONFIG_MPC85xx_RDB=y
> +CONFIG_P1022_DS=y
>   CONFIG_SOCRATES=y
>   CONFIG_KSI8560=y
>   CONFIG_XES_MPC85xx=y
> @@ -316,7 +318,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
>   CONFIG_PAGEFLAGS_EXTENDED=y
>   CONFIG_SPLIT_PTLOCK_CPUS=4
>   CONFIG_MIGRATION=y
> -# CONFIG_PHYS_ADDR_T_64BIT is not set
> +CONFIG_PHYS_ADDR_T_64BIT=y
>   CONFIG_ZONE_DMA_FLAG=1
>   CONFIG_BOUNCE=y
>   CONFIG_VIRT_TO_BUS=y
> @@ -326,7 +328,7 @@ CONFIG_PPC_4K_PAGES=y
>   # CONFIG_PPC_16K_PAGES is not set
>   # CONFIG_PPC_64K_PAGES is not set
>   # CONFIG_PPC_256K_PAGES is not set
> -CONFIG_FORCE_MAX_ZONEORDER=11
> +CONFIG_FORCE_MAX_ZONEORDER=12
>   CONFIG_PROC_DEVICETREE=y
>   # CONFIG_CMDLINE_BOOL is not set
>   CONFIG_EXTRA_TARGETS=""
> @@ -1127,16 +1129,13 @@ CONFIG_VGA_CONSOLE=y
>   # CONFIG_VGACON_SOFT_SCROLLBACK is not set
>   CONFIG_DUMMY_CONSOLE=y
>   CONFIG_SOUND=y
> -CONFIG_SOUND_OSS_CORE=y
> -CONFIG_SOUND_OSS_CORE_PRECLAIM=y
> +# CONFIG_SOUND_OSS_CORE is not set
>   CONFIG_SND=y
>   CONFIG_SND_TIMER=y
>   CONFIG_SND_PCM=y
>   # CONFIG_SND_SEQUENCER is not set
> -CONFIG_SND_OSSEMUL=y
> -CONFIG_SND_MIXER_OSS=y
> -CONFIG_SND_PCM_OSS=y
> -CONFIG_SND_PCM_OSS_PLUGINS=y
> +# CONFIG_SND_MIXER_OSS is not set
> +# CONFIG_SND_PCM_OSS is not set
>   # CONFIG_SND_HRTIMER is not set
>   # CONFIG_SND_DYNAMIC_MINORS is not set
>   # CONFIG_SND_SUPPORT_OLD_API is not set
> @@ -1150,12 +1149,7 @@ CONFIG_SND_VMASTER=y
>   # CONFIG_SND_SBAWE_SEQ is not set
>   # CONFIG_SND_EMU10K1_SEQ is not set
>   CONFIG_SND_AC97_CODEC=y
> -CONFIG_SND_DRIVERS=y
> -# CONFIG_SND_DUMMY is not set
> -# CONFIG_SND_MTPAV is not set
> -# CONFIG_SND_SERIAL_U16550 is not set
> -# CONFIG_SND_MPU401 is not set
> -# CONFIG_SND_AC97_POWER_SAVE is not set
> +# CONFIG_SND_DRIVERS is not set
>   CONFIG_SND_PCI=y
>   # CONFIG_SND_AD1889 is not set
>   # CONFIG_SND_ALS300 is not set
> @@ -1223,12 +1217,8 @@ CONFIG_SND_INTEL8X0=y
>   # CONFIG_SND_VIRTUOSO is not set
>   # CONFIG_SND_VX222 is not set
>   # CONFIG_SND_YMFPCI is not set
> -CONFIG_SND_PPC=y
> -CONFIG_SND_USB=y
> -# CONFIG_SND_USB_AUDIO is not set
> -# CONFIG_SND_USB_UA101 is not set
> -# CONFIG_SND_USB_USX2Y is not set
> -# CONFIG_SND_USB_CAIAQ is not set
> +# CONFIG_SND_PPC is not set
> +# CONFIG_SND_USB is not set
>   # CONFIG_SND_SOC is not set
>   # CONFIG_SOUND_PRIME is not set
>   CONFIG_AC97_BUS=y
> diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
> index 3a2ade2..bea1f59 100644
> --- a/arch/powerpc/platforms/85xx/Kconfig
> +++ b/arch/powerpc/platforms/85xx/Kconfig
> @@ -65,6 +65,14 @@ config MPC85xx_RDB
>   	help
>   	  This option enables support for the MPC85xx RDB (P2020 RDB) board
>
> +config P1022_DS
> +	bool "Freescale P1022 DS"
> +	select DEFAULT_UIMAGE
> +	select CONFIG_PHYS_64BIT	# The DTS has 36-bit addresses
> +	select SWIOTLB
> +	help
> +	  This option enables support for the Freescale P1022DS reference board.
> +
>   config SOCRATES
>   	bool "Socrates"
>   	select DEFAULT_UIMAGE
> diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile
> index 387c128..a2ec3f8 100644
> --- a/arch/powerpc/platforms/85xx/Makefile
> +++ b/arch/powerpc/platforms/85xx/Makefile
> @@ -10,6 +10,7 @@ obj-$(CONFIG_MPC8536_DS)  += mpc8536_ds.o
>   obj-$(CONFIG_MPC85xx_DS)  += mpc85xx_ds.o
>   obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o
>   obj-$(CONFIG_MPC85xx_RDB) += mpc85xx_rdb.o
> +obj-$(CONFIG_P1022_DS)    += p1022_ds.o
>   obj-$(CONFIG_P4080_DS)    += p4080_ds.o corenet_ds.o
>   obj-$(CONFIG_STX_GP3)	  += stx_gp3.o
>   obj-$(CONFIG_TQM85xx)	  += tqm85xx.o
> diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c
> new file mode 100644
> index 0000000..e1467c9
> --- /dev/null
> +++ b/arch/powerpc/platforms/85xx/p1022_ds.c
> @@ -0,0 +1,148 @@
> +/*
> + * P1022DS board specific routines
> + *
> + * Authors: Travis Wheatley<travis.wheatley@freescale.com>
> + *          Dave Liu<daveliu@freescale.com>
> + *          Timur Tabi<timur@freescale.com>
> + *
> + * Copyright 2010 Freescale Semiconductor, Inc.
> + *
> + * This file is taken from the Freescale P1022DS BSP, with modifications:
> + * 1) No DIU support (pending rewrite of DIU code)
> + * 2) No AMP support
> + * 3) No PCI endpoint support
> + *
> + * 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<linux/pci.h>
> +#include<linux/of_platform.h>
> +#include<linux/lmb.h>
> +
> +#include<asm/mpic.h>
> +#include<asm/swiotlb.h>
> +
> +#include<sysdev/fsl_soc.h>
> +#include<sysdev/fsl_pci.h>
> +
> +void __init p1022_ds_pic_init(void)
> +{
> +	struct mpic *mpic;
> +	struct resource r;
> +	struct device_node *np;
> +
> +	np = of_find_node_by_type(NULL, "open-pic");
> +	if (!np) {
> +		pr_err("Could not find open-pic node\n");
> +		return;
> +	}
> +
> +	if (of_address_to_resource(np, 0,&r)) {
> +		pr_err("Failed to map mpic register space\n");
> +		of_node_put(np);
> +		return;
> +	}
> +
> +	mpic = mpic_alloc(np, r.start,
> +		MPIC_PRIMARY | MPIC_WANTS_RESET |
> +		MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
> +		MPIC_SINGLE_DEST_CPU,
> +		0, 256, " OpenPIC  ");
> +
> +	BUG_ON(mpic == NULL);
> +	of_node_put(np);
> +
> +	mpic_init(mpic);
> +}
> +
> +#ifdef CONFIG_SMP
> +void __init mpc85xx_smp_init(void);
> +#endif
> +
> +/*
> + * Setup the architecture
> + */
> +static void __init p1022_ds_setup_arch(void)
> +{
> +#ifdef CONFIG_PCI
> +	struct device_node *np;
> +#endif
> +	dma_addr_t max = 0xffffffff;
> +
> +	if (ppc_md.progress)
> +		ppc_md.progress("p1022_ds_setup_arch()", 0);
> +
> +#ifdef CONFIG_PCI
> +	for_each_compatible_node(np, "pci", "fsl,p1022-pcie") {
> +		struct resource rsrc;
> +		struct pci_controller *hose;
> +
> +		of_address_to_resource(np, 0,&rsrc);
> +
> +		if ((rsrc.start&  0xfffff) == 0x8000)
> +			fsl_add_bridge(np, 1);
> +		else
> +			fsl_add_bridge(np, 0);
> +
> +		hose = pci_find_hose_for_OF_device(np);
> +		max = min(max, hose->dma_window_base_cur +
> +			  hose->dma_window_size);
> +	}
> +#endif
> +
> +#ifdef CONFIG_SMP
> +	mpc85xx_smp_init();
> +#endif
> +
> +#ifdef CONFIG_SWIOTLB
> +	if (lmb_end_of_DRAM()>  max) {
> +		ppc_swiotlb_enable = 1;
> +		set_pci_dma_ops(&swiotlb_dma_ops);
> +		ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
> +	}
> +#endif
> +
> +	pr_info("Freescale P1022 DS reference board\n");
> +}
> +
> +static struct of_device_id __initdata p1022_ds_ids[] = {
> +	{ .type = "soc", },
> +	{ .compatible = "soc", },
> +	{ .compatible = "simple-bus", },
> +	{ .compatible = "gianfar", },
> +	{},
> +};
> +
> +static int __init p1022_ds_publish_devices(void)
> +{
> +	return of_platform_bus_probe(NULL, p1022_ds_ids, NULL);
> +}
> +machine_device_initcall(p1022_ds, p1022_ds_publish_devices);
> +
> +machine_arch_initcall(p1022_ds, swiotlb_setup_bus_notifier);
> +
> +/*
> + * Called very early, device-tree isn't unflattened
> + */
> +static int __init p1022_ds_probe(void)
> +{
> +	unsigned long root = of_get_flat_dt_root();
> +
> +	return of_flat_dt_is_compatible(root, "fsl,p1022ds");
> +}
> +
> +define_machine(p1022_ds) {
> +	.name			= "P1022 DS",
> +	.probe			= p1022_ds_probe,
> +	.setup_arch		= p1022_ds_setup_arch,
> +	.init_IRQ		= p1022_ds_pic_init,
> +#ifdef CONFIG_PCI
> +	.pcibios_fixup_bus	= fsl_pcibios_fixup_bus,
> +#endif
> +	.get_irq		= mpic_get_irq,
> +	.restart		= fsl_rstcr_restart,
> +	.calibrate_decr		= generic_calibrate_decr,
> +	.progress		= udbg_progress,
> +};

^ permalink raw reply

* Re: [PATCH] [v2] powerpc: introduce basic support for the Freescale P1022DS reference board
From: Tabi Timur-B04825 @ 2010-07-03 12:48 UTC (permalink / raw)
  To: Felix Radensky; +Cc: linuxppc-dev
In-Reply-To: <4C2EE056.1050506@embedded-sol.com>

[-- Attachment #1: Type: text/plain, Size: 637 bytes --]

Felix Radensky wrote:
>
> There are currently no drivers in mainline for FSL eSPI controller and
> eSPI flash.
> They are present only in FSL BSP kernel. Do you think it makes sense to
> keep
> DTS entries for something that is not supported ?

Yes, for two reasons:

1) The DTS is supposed to describe the hardware, regardless as to whether 
there are drivers for everything.  There's no audio support, but I have the 
SSI node there anyway.

2) We will eventually support the SPI in the mainline kernel.  I think our 
plan is to merge the SPI and eSPI drivers together first.

-- 
Timur Tabi
Linux kernel developer

[-- Attachment #2: Type: text/html, Size: 1175 bytes --]

^ permalink raw reply

* [PATCH 04/19] arch/powerpc/platforms/pseries: use for_each_pci_dev()
From: Kulikov Vasiliy @ 2010-07-03 16:03 UTC (permalink / raw)
  To: Kernel Janitors; +Cc: Tejun Heo, Paul Mackerras, linux-kernel, linuxppc-dev

Use for_each_pci_dev() to simplify the code.

Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
---
 arch/powerpc/platforms/pseries/eeh_cache.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/eeh_cache.c b/arch/powerpc/platforms/pseries/eeh_cache.c
index 30b987b..8ed0d2d 100644
--- a/arch/powerpc/platforms/pseries/eeh_cache.c
+++ b/arch/powerpc/platforms/pseries/eeh_cache.c
@@ -288,8 +288,7 @@ void __init pci_addr_cache_build(void)
 
 	spin_lock_init(&pci_io_addr_cache_root.piar_lock);
 
-	while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-
+	for_each_pci_dev(dev) {
 		pci_addr_cache_insert_device(dev);
 
 		dn = pci_device_to_OF_node(dev);
-- 
1.7.0.4

^ permalink raw reply related

* [PATCH] Add cmd64x IDE driver to default pmac32 config
From: lawrence rust @ 2010-07-03 18:21 UTC (permalink / raw)
  To: linuxppc-dev

The Blue/White Apple PowerMac G3 and early G4's use a cmd64x compatible
IDE disk controller.  E.g. lspci shows...

01:01.0 IDE interface: Silicon Image, Inc. PCI0646 (rev 07)

Unfortunately the default pmac32 configuration does not include this
driver and so PowerMac G3's can't load a root filesystem.  This is an
issue on a least Ubuntu since version 9.04, which uses the default
config as a starting point.

Signed-off-by: Lawrence Rust <lawrence at softsystem.co.uk>

diff -uprN a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig 
--- a/arch/powerpc/configs/pmac32_defconfig	2010-05-16 23:17:36.000000000 +0200
+++ b/arch/powerpc/configs/pmac32_defconfig	2010-07-03 20:11:10.000000000 +0200
@@ -738,7 +738,7 @@ CONFIG_BLK_DEV_IDEDMA_PCI=y
 # CONFIG_BLK_DEV_AEC62XX is not set
 # CONFIG_BLK_DEV_ALI15X3 is not set
 # CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_CMD64X is not set
+CONFIG_BLK_DEV_CMD64X=y
 # CONFIG_BLK_DEV_TRIFLEX is not set
 # CONFIG_BLK_DEV_CS5520 is not set
 # CONFIG_BLK_DEV_CS5530 is not set

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Benjamin Herrenschmidt @ 2010-07-03 22:41 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: kvm-ppc, linuxppc-dev, Alexander Graf, KVM list
In-Reply-To: <EB2E1C5B-118B-481B-83D6-44CFAA2E55D3@kernel.crashing.org>

On Fri, 2010-07-02 at 18:27 +0200, Segher Boessenkool wrote:
> > +To find out if we're running on KVM or not, we overlay the PVR  
> > register. Usually
> > +the PVR register contains an id that identifies your CPU type. If,  
> > however, you
> > +pass KVM_PVR_PARA in the register that you want the PVR result in,  
> > the register
> > +still contains KVM_PVR_PARA after the mfpvr call.
> > +
> > +	LOAD_REG_IMM(r5, KVM_PVR_PARA)
> > +	mfpvr	r5
> > +	[r5 still contains KVM_PVR_PARA]
> 
> I love this part :-)

Me not :-)

It should be in the device-tree instead, or something like that. Enough
games with PVR...

Ben.

> > +	__u64 scratch3;
> > +	__u64 critical;		/* Guest may not get interrupts if == r1 */
> > +	__u64 sprg0;
> > +	__u64 sprg1;
> > +	__u64 sprg2;
> > +	__u64 sprg3;
> > +	__u64 srr0;
> > +	__u64 srr1;
> > +	__u64 dar;
> > +	__u64 msr;
> > +	__u32 dsisr;
> > +	__u32 int_pending;	/* Tells the guest if we have an interrupt */
> > +};
> > +
> > +Additions to the page must only occur at the end. Struct fields  
> > are always 32
> > +bit aligned.
> 
> The u64s are 64-bit aligned, should they always be?
> 
> > +The "ld" and "std" instructions are transormed to "lwz" and "stw"  
> > instructions
> > +respectively on 32 bit systems with an added offset of 4 to  
> > accomodate for big
> > +endianness.
> 
> Will this add never overflow?  Is there anything that checks for it?
> 
> > +mtmsrd	rX, 0		b	<special mtmsr section>
> > +mtmsr			b	<special mtmsr section>
> 
> mtmsr rX
> 
> 
> Segher
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Benjamin Herrenschmidt @ 2010-07-03 22:42 UTC (permalink / raw)
  To: Alexander Graf; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <A98DA9FC-DC42-452E-BD44-5F86D1707BF0@suse.de>

On Fri, 2010-07-02 at 20:41 +0200, Alexander Graf wrote:
> The u64s are 64-bit aligned, should they always be?
> 
> That's obvious, isn't it? And the ABI only specifies u64s to be 32 bit
> aligned, no? At least that's what ld and std specify.

No, the PowerPC ABI specifies u64's to be 64-bit aligned, even for
32-bit binaries.

Ben.

> > 
> >> +The "ld" and "std" instructions are transormed to "lwz" and "stw"
> instructions
> >> +respectively on 32 bit systems with an added offset of 4 to
> accomodate for big
> >> +endianness.
> > 
> > Will this add never overflow?  Is there anything that checks for it?
> 
> It basically means that to access dar, we either do
> 
> ld  rX, DAR(0)
> 
> or
> 
> lwz rX, DAR+4(0)
> 
> 
> > 
> >> +mtmsrd      rX, 0           b       <special mtmsr section>
> >> +mtmsr                       b       <special mtmsr section>
> > 
> > mtmsr rX
> 
> Nod. 

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Alexander Graf @ 2010-07-04  9:02 UTC (permalink / raw)
  To: Scott Wood; +Cc: KVM list, kvm-ppc, Dan Hettena, linuxppc-dev, Hollis Blanchard
In-Reply-To: <20100702141003.75302a9a@schlenkerla.am.freescale.net>


On 02.07.2010, at 21:10, Scott Wood wrote:

> On Fri, 2 Jul 2010 20:47:44 +0200
> Alexander Graf <agraf@suse.de> wrote:
>=20
>>=20
>> On 02.07.2010, at 19:59, Hollis Blanchard wrote:
>>=20
>>> [Resending...]
>>>=20
>>> Please reconcile this with
>>> http://www.linux-kvm.org/page/PowerPC_Hypercall_ABI, which has been
>>> discussed in the (admittedly closed) Power.org embedded hypervisor
>>> working group. Bear in mind that other hypervisors are already
>>> implementing the documented ABI, so if you have concerns, you should
>>> probably raise them with that audience...
>>=20
>> We can not use sc with LV=3D1 because that would break the KVM in
>> something else case which is KVM's strong point on PPC.
>=20
> The current proposal involves the hypervisor specifying the hcall =
opcode
> sequence in the device tree -- to allow either "sc 1" or "sc 0 plus
> magic GPR" depending on whether you've got the hardware hypervisor
> feature (hereafter HHV).

Ah right, so you can still trap a hypercall with HHV. Makes sense.

>=20
> With HHV, "sc 0 plus magic GPR" just doesn't work, since it won't trap
> to the hypervisor.  "sc 1 plus magic GPR" might be problematic on some
> non-HHV implementations, especially if you *do* have HHV but the
> non-HHV hypervisor is running as an HHV guest.

Yes, that's why I need sc 0 plus magic GPR in r0 and r3 - to accomodate =
for all the non-HHV cases. And it would be clever to have a way to =
expose the same functionality when we do use the HHV features.

So, is that draft available anywhere? The wiki page Hollis pointed to is =
very vague.


Alex

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Alexander Graf @ 2010-07-04  9:04 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <1278196909.4200.389.camel@pasglop>


On 04.07.2010, at 00:41, Benjamin Herrenschmidt wrote:

> On Fri, 2010-07-02 at 18:27 +0200, Segher Boessenkool wrote:
>>> +To find out if we're running on KVM or not, we overlay the PVR =20
>>> register. Usually
>>> +the PVR register contains an id that identifies your CPU type. If, =20=

>>> however, you
>>> +pass KVM_PVR_PARA in the register that you want the PVR result in, =20=

>>> the register
>>> +still contains KVM_PVR_PARA after the mfpvr call.
>>> +
>>> +	LOAD_REG_IMM(r5, KVM_PVR_PARA)
>>> +	mfpvr	r5
>>> +	[r5 still contains KVM_PVR_PARA]
>>=20
>> I love this part :-)
>=20
> Me not :-)
>=20
> It should be in the device-tree instead, or something like that. =
Enough
> games with PVR...

My biggest concern about putting things in the device-tree is that I was =
trying to keep things as separate as possible. Why does the firmware =
have to know that it's running in KVM? Why do I have to patch 3 projects =
(Linux, OpenBIOS, Qemu) when I could go with patching a single one =
(Linux)?

Alex

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Alexander Graf @ 2010-07-04  9:04 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <1278196956.4200.390.camel@pasglop>


On 04.07.2010, at 00:42, Benjamin Herrenschmidt wrote:

> On Fri, 2010-07-02 at 20:41 +0200, Alexander Graf wrote:
>> The u64s are 64-bit aligned, should they always be?
>> 
>> That's obvious, isn't it? And the ABI only specifies u64s to be 32 bit
>> aligned, no? At least that's what ld and std specify.
> 
> No, the PowerPC ABI specifies u64's to be 64-bit aligned, even for
> 32-bit binaries.

I see :).

Alex

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Avi Kivity @ 2010-07-04  9:10 UTC (permalink / raw)
  To: Alexander Graf; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <79514591-DCC1-4D9E-AFB7-AA985ADF3C0F@suse.de>

On 07/04/2010 12:04 PM, Alexander Graf wrote:
>
> My biggest concern about putting things in the device-tree is that I was trying to keep things as separate as possible. Why does the firmware have to know that it's running in KVM?

It doesn't need to know about kvm, it needs to know that a particular 
hypercall protocol is available.

> Why do I have to patch 3 projects (Linux, OpenBIOS, Qemu) when I could go with patching a single one (Linux)?
>    

That's not a valid argument.  You patch as many projects as it takes to 
get it right (not that I have an opinion in this particular discussion).

At the very least you have to patch qemu for reasons described before 
(backwards compatible live migration).

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Alexander Graf @ 2010-07-04  9:17 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <4C305001.7060301@redhat.com>


On 04.07.2010, at 11:10, Avi Kivity wrote:

> On 07/04/2010 12:04 PM, Alexander Graf wrote:
>>=20
>> My biggest concern about putting things in the device-tree is that I =
was trying to keep things as separate as possible. Why does the firmware =
have to know that it's running in KVM?
>=20
> It doesn't need to know about kvm, it needs to know that a particular =
hypercall protocol is available.

Considering how the parts of the draft that I read about sound like, =
that's not the inventor's idea. PPC people love to see the BIOS be part =
of the virtualization solution. I don't. That's the biggest difference =
here and reason for us going different directions.

I think what they thought of is something like

if (in_kvm()) {
  device_tree_put("/hypervisor/exit", EXIT_TYPE_MAGIC);
  device_tree_put("/hypervisor/exit_magic", EXIT_MAGIC);
}

which then the OS reads out. But that's useless, as the hypercalls are =
hypervisor specific. So why make the detection on the Linux side =
generic?

>=20
>> Why do I have to patch 3 projects (Linux, OpenBIOS, Qemu) when I =
could go with patching a single one (Linux)?
>>  =20
>=20
> That's not a valid argument.  You patch as many projects as it takes =
to get it right (not that I have an opinion in this particular =
discussion).

If you can put code in Linux that touches 3 submaintainer's directories =
or one submaintainer's directory with both ending up being functionally =
equivalent, which way would you go?

>=20
> At the very least you have to patch qemu for reasons described before =
(backwards compatible live migration).

There is no live migration on PPC (yet). That point is completely moot =
atm.


Alex

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Alexander Graf @ 2010-07-04  9:30 UTC (permalink / raw)
  To: Alexander Graf; +Cc: KVM list, kvm-ppc, Avi Kivity, linuxppc-dev
In-Reply-To: <40488555-C73E-4C04-BFAD-31ED99CDBBDA@suse.de>


On 04.07.2010, at 11:17, Alexander Graf wrote:

>=20
> On 04.07.2010, at 11:10, Avi Kivity wrote:
>=20
>> On 07/04/2010 12:04 PM, Alexander Graf wrote:
>>>=20
>>> My biggest concern about putting things in the device-tree is that I =
was trying to keep things as separate as possible. Why does the firmware =
have to know that it's running in KVM?
>>=20
>> It doesn't need to know about kvm, it needs to know that a particular =
hypercall protocol is available.
>=20
> Considering how the parts of the draft that I read about sound like, =
that's not the inventor's idea. PPC people love to see the BIOS be part =
of the virtualization solution. I don't. That's the biggest difference =
here and reason for us going different directions.
>=20
> I think what they thought of is something like
>=20
> if (in_kvm()) {
>  device_tree_put("/hypervisor/exit", EXIT_TYPE_MAGIC);
>  device_tree_put("/hypervisor/exit_magic", EXIT_MAGIC);
> }
>=20
> which then the OS reads out. But that's useless, as the hypercalls are =
hypervisor specific. So why make the detection on the Linux side =
generic?

In fact, it's even worse. Right now with KVM for PPC we have 3 different =
ways of generating the device tree:

1) OpenBIOS (Mac emulation)
2) Qemu libfdt (BookE)
3) MOL OF implementation

So I'd have to touch even more projects. Just for the sake of splitting =
out something that belongs together anyway. And probably even create new =
interfaces just for that sake (qemu asking the kernel which type of =
hypercalls the vm should use) even though the guest could just query all =
that itself.

Alex

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Avi Kivity @ 2010-07-04  9:37 UTC (permalink / raw)
  To: Alexander Graf; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <40488555-C73E-4C04-BFAD-31ED99CDBBDA@suse.de>

On 07/04/2010 12:17 PM, Alexander Graf wrote:
> On 04.07.2010, at 11:10, Avi Kivity wrote:
>
>    
>> On 07/04/2010 12:04 PM, Alexander Graf wrote:
>>      
>>> My biggest concern about putting things in the device-tree is that I was trying to keep things as separate as possible. Why does the firmware have to know that it's running in KVM?
>>>        
>> It doesn't need to know about kvm, it needs to know that a particular hypercall protocol is available.
>>      
> Considering how the parts of the draft that I read about sound like, that's not the inventor's idea. PPC people love to see the BIOS be part of the virtualization solution. I don't. That's the biggest difference here and reason for us going different directions.
>    

Regardless of which direction is "correct", you need to go in one direction.

> I think what they thought of is something like
>
> if (in_kvm()) {
>    device_tree_put("/hypervisor/exit", EXIT_TYPE_MAGIC);
>    device_tree_put("/hypervisor/exit_magic", EXIT_MAGIC);
> }
>
> which then the OS reads out. But that's useless, as the hypercalls are hypervisor specific. So why make the detection on the Linux side generic?
>    

Looks like the benefit is less magic in the detection code.  x86 has 
(more or less) standardized feature detection.  Is this an attempt to 
bring something similar to ppc-land?

>>> Why do I have to patch 3 projects (Linux, OpenBIOS, Qemu) when I could go with patching a single one (Linux)?
>>>
>>>        
>> That's not a valid argument.  You patch as many projects as it takes to get it right (not that I have an opinion in this particular discussion).
>>      
> If you can put code in Linux that touches 3 submaintainer's directories or one submaintainer's directory with both ending up being functionally equivalent, which way would you go?
>    

We would do the right thing.  Trivial examples include adding defines to 
include/asm/processor.h or include/asm/msr-index.h, more complicated 
ones are the topic for my talk in kvm forum 2010.

Yes, coordinating the acks and trees and merge windows is not as fun as 
coding.  Yes, it's even more difficult with separate trees.  No, that's 
not an excuse if we[1] determine that the right thing to do is the most 
complicated.

[1] "we" in this case are the powerpc Linux arch maintainers and/or 
whoever defines the hardware specification

>> At the very least you have to patch qemu for reasons described before (backwards compatible live migration).
>>      
> There is no live migration on PPC (yet). That point is completely moot atm.
>    

You still need to make that feature disableable from userspace.

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply

* Re: [PATCH 27/27] KVM: PPC: Add Documentation about PV interface
From: Avi Kivity @ 2010-07-04  9:41 UTC (permalink / raw)
  To: Alexander Graf; +Cc: kvm-ppc, linuxppc-dev, KVM list
In-Reply-To: <486564E7-7942-4021-8EB2-67DC4E56580D@suse.de>

On 07/04/2010 12:30 PM, Alexander Graf wrote:
>
>> Considering how the parts of the draft that I read about sound like, that's not the inventor's idea. PPC people love to see the BIOS be part of the virtualization solution. I don't. That's the biggest difference here and reason for us going different directions.
>>
>> I think what they thought of is something like
>>
>> if (in_kvm()) {
>>   device_tree_put("/hypervisor/exit", EXIT_TYPE_MAGIC);
>>   device_tree_put("/hypervisor/exit_magic", EXIT_MAGIC);
>> }
>>
>> which then the OS reads out. But that's useless, as the hypercalls are hypervisor specific. So why make the detection on the Linux side generic?
>>      
> In fact, it's even worse. Right now with KVM for PPC we have 3 different ways of generating the device tree:
>
> 1) OpenBIOS (Mac emulation)
> 2) Qemu libfdt (BookE)
> 3) MOL OF implementation
>    

I sympathize.  But, if the arch says that's how you do things, then 
that's how you do things.

> So I'd have to touch even more projects. Just for the sake of splitting out something that belongs together anyway. And probably even create new interfaces just for that sake (qemu asking the kernel which type of hypercalls the vm should use) even though the guest could just query all that itself.
>    

qemu needs to be involved, in case one day you support more than one 
type of hypercalls (like x86 does with hyper-v) or if you want to live 
migrate from a host that has hypercall support to another host that has 
this feature removed (as has already happened on x86 with the pvmmu).

Planning for the future means a lot of boring interfaces.

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply

* Re: [PATCH 13/27] KVM: PPC: Magic Page Book3s support
From: Avi Kivity @ 2010-07-04  9:42 UTC (permalink / raw)
  To: Alexander Graf; +Cc: linuxppc-dev, KVM list, kvm-ppc
In-Reply-To: <4C2E07AC.4010801@suse.de>

On 07/02/2010 06:37 PM, Alexander Graf wrote:
> Alexander Graf wrote:
>    
>> We need to override EA as well as PA lookups for the magic page. When the guest
>> tells us to project it, the magic page overrides any guest mappings.
>>
>> In order to reflect that, we need to hook into all the MMU layers of KVM to
>> force map the magic page if necessary.
>>
>> Signed-off-by: Alexander Graf<agraf@suse.de>
>>
>> v1 ->  v2:
>>
>>    - RMO ->  PAM
>> ---
>>   arch/powerpc/kvm/book3s.c             |    7 +++++++
>>   arch/powerpc/kvm/book3s_32_mmu.c      |   16 ++++++++++++++++
>>   arch/powerpc/kvm/book3s_32_mmu_host.c |   12 ++++++++++++
>>   arch/powerpc/kvm/book3s_64_mmu.c      |   30 +++++++++++++++++++++++++++++-
>>   arch/powerpc/kvm/book3s_64_mmu_host.c |   12 ++++++++++++
>>   5 files changed, 76 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
>> index 14db032..b22e608 100644
>> --- a/arch/powerpc/kvm/book3s.c
>> +++ b/arch/powerpc/kvm/book3s.c
>> @@ -554,6 +554,13 @@ mmio:
>>
>>   static int kvmppc_visible_gfn(struct kvm_vcpu *vcpu, gfn_t gfn)
>>   {
>> +	ulong mp_pa = vcpu->arch.magic_page_pa;
>> +
>> +	if (unlikely(mp_pa)&&
>> +	    unlikely((mp_pa&  KVM_RMO)>>  PAGE_SHIFT == gfn)) {
>>
>>      
> This should be KVM_PAM :(. Should I respin the whole thing or could
> whoever commits this just make that trivial change?
>
>    

A respin followed by a bisectability test (compile each revision as it 
is applied), please.  Of course we need to resolve the detection issue 
first.

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply

* Re: Regarding the issue of compiling >=2.6.31 on ppc with >=gcc-4.4
From: Stephen Rothwell @ 2010-07-04 22:26 UTC (permalink / raw)
  To: Anthony G. Basile; +Cc: linuxppc-dev, cjg
In-Reply-To: <4C31046C.9060406@gentoo.org>

[-- Attachment #1: Type: text/plain, Size: 930 bytes --]

Hi Anthony,

On Sun, 04 Jul 2010 18:00:12 -0400 "Anthony G. Basile" <blueness@gentoo.org> wrote:
>
> Hi guys, I just hit this in trying to stabilize some kernels on gentoo
> - -> http://bugs.gentoo.org/show_bug.cgi?id=326877.  Has there been any
> upstream discussion about this?  I haven't seen anything on lkml.  I
> thought I'd drop you a note and see if you guys had heard anything.

You should really ask questions like this on the
linuxppc-dev@lists.ozlabs.org mailing list (cc'd).

[For others: this is the 1024 byte buffer in the stack in
chrp_event_scan()]

Having said that: yes, the problem has been noticed, but no solution has
been included yet (as far as I know).  There are other issues with
building 64 bit PowerPC kernels with gcc >= 4.5 for which I have proposed
a couple of patches.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 490 bytes --]

^ permalink raw reply

* [PATCH] rtc: add support for DS3232 RTC
From: Roy Zang @ 2010-07-05  6:45 UTC (permalink / raw)
  To: linuxppc-release; +Cc: Mingkai.hu, linuxppc-dev, srikanth.srinivasan

This patch adds the driver for RTC chip DS3232 via I2C bus

Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
Signed-off-by: Jingchang Lu <b22599@freescale.com>
Signed-off-by: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
---
Tested on MPC8536DS and P4080DS board

 drivers/rtc/Kconfig      |   11 +
 drivers/rtc/Makefile     |    1 +
 drivers/rtc/rtc-ds3232.c |  466 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 478 insertions(+), 0 deletions(-)
 create mode 100644 drivers/rtc/rtc-ds3232.c

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 6a13037..13c2fdb 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -166,6 +166,17 @@ config RTC_DRV_DS1672
 	  This driver can also be built as a module. If so, the module
 	  will be called rtc-ds1672.
 
+config RTC_DRV_DS3232
+	tristate "Dallas/Maxim DS3232"
+	depends on RTC_CLASS && I2C
+	help
+	  If you say yes here you get support for Dallas Semiconductor
+	  DS3232 real-time clock chips.  If an interrupt is associated
+	  with the device, the alarm functionality is supported.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called rtc-ds3232.
+
 config RTC_DRV_MAX6900
 	tristate "Maxim MAX6900"
 	help
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index 44ef194..0af190c 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -39,6 +39,7 @@ obj-$(CONFIG_RTC_DRV_DS1511)	+= rtc-ds1511.o
 obj-$(CONFIG_RTC_DRV_DS1553)	+= rtc-ds1553.o
 obj-$(CONFIG_RTC_DRV_DS1672)	+= rtc-ds1672.o
 obj-$(CONFIG_RTC_DRV_DS1742)	+= rtc-ds1742.o
+obj-$(CONFIG_RTC_DRV_DS3232)	+= rtc-ds3232.o
 obj-$(CONFIG_RTC_DRV_DS3234)	+= rtc-ds3234.o
 obj-$(CONFIG_RTC_DRV_EFI)	+= rtc-efi.o
 obj-$(CONFIG_RTC_DRV_EP93XX)	+= rtc-ep93xx.o
diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c
new file mode 100644
index 0000000..21e1599
--- /dev/null
+++ b/drivers/rtc/rtc-ds3232.c
@@ -0,0 +1,466 @@
+/*
+ * RTC client/driver for the Maxim/Dallas DS3232 Real-Time Clock over I2C
+ *
+ * Copyright (C) 2009-2010 Freescale Semiconductor.
+ *
+ * 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.
+ */
+/*
+ * It would be more efficient to use i2c msgs/i2c_transfer directly but, as
+ * recommened in .../Documentation/i2c/writing-clients section
+ * "Sending and receiving", using SMBus level communication is preferred.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/i2c.h>
+#include <linux/rtc.h>
+#include <linux/bcd.h>
+#include <linux/workqueue.h>
+#include <linux/slab.h>
+
+#define DS3232_REG_SECONDS	0x00
+#define DS3232_REG_MINUTES	0x01
+#define DS3232_REG_HOURS	0x02
+#define DS3232_REG_AMPM		0x02
+#define DS3232_REG_DAY		0x03
+#define DS3232_REG_DATE		0x04
+#define DS3232_REG_MONTH	0x05
+#define DS3232_REG_CENTURY	0x05
+#define DS3232_REG_YEAR		0x06
+#define DS3232_REG_ALARM1         0x07	/* Alarm 1 BASE */
+#define DS3232_REG_ALARM2         0x0B	/* Alarm 2 BASE */
+#define DS3232_REG_CR		0x0E	/* Control register */
+#	define DS3232_REG_CR_nEOSC        0x80
+#       define DS3232_REG_CR_INTCN        0x04
+#       define DS3232_REG_CR_A2IE        0x02
+#       define DS3232_REG_CR_A1IE        0x01
+
+#define DS3232_REG_SR	0x0F	/* control/status register */
+#	define DS3232_REG_SR_OSF   0x80
+#       define DS3232_REG_SR_BSY   0x04
+#       define DS3232_REG_SR_A2F   0x02
+#       define DS3232_REG_SR_A1F   0x01
+
+struct ds3232 {
+	struct i2c_client *client;
+	struct rtc_device *rtc;
+	struct work_struct work;
+
+	/* The mutex protects alarm operations, and prevents a race
+	 * between the enable_irq() in the workqueue and the free_irq()
+	 * in the remove function.
+	 */
+	struct mutex mutex;
+	int exiting;
+};
+
+static struct i2c_driver ds3232_driver;
+
+static int ds3232_check_rtc_status(struct i2c_client *client)
+{
+	int ret = 0;
+	int control, stat;
+
+	stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		return stat;
+
+	if (stat & DS3232_REG_SR_OSF)
+		dev_warn(&client->dev,
+				"oscillator discontinuity flagged, "
+				"time unreliable\n");
+
+	stat &= ~(DS3232_REG_SR_OSF | DS3232_REG_SR_A1F | DS3232_REG_SR_A2F);
+
+	ret = i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
+	if (ret < 0)
+		return ret;
+
+	/* If the alarm is pending, clear it before requesting
+	 * the interrupt, so an interrupt event isn't reported
+	 * before everything is initialized.
+	 */
+
+	control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+	if (control < 0)
+		return control;
+
+	control &= ~(DS3232_REG_CR_A1IE | DS3232_REG_CR_A2IE);
+	control |= DS3232_REG_CR_INTCN;
+
+	return i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+}
+
+static int ds3232_read_time(struct device *dev, struct rtc_time *time)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	int ret;
+	u8 buf[7];
+	unsigned int year, month, day, hour, minute, second;
+	unsigned int week, twelve_hr, am_pm;
+	unsigned int century, add_century = 0;
+
+	ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_SECONDS, 7, buf);
+
+	if (ret < 0)
+		return ret;
+	if (ret < 7)
+		return -EIO;
+
+	second = buf[0];
+	minute = buf[1];
+	hour = buf[2];
+	week = buf[3];
+	day = buf[4];
+	month = buf[5];
+	year = buf[6];
+
+	/* Extract additional information for AM/PM and century */
+
+	twelve_hr = hour & 0x40;
+	am_pm = hour & 0x20;
+	century = month & 0x80;
+
+	/* Write to rtc_time structure */
+
+	time->tm_sec = bcd2bin(second);
+	time->tm_min = bcd2bin(minute);
+	if (twelve_hr) {
+		/* Convert to 24 hr */
+		if (am_pm)
+			time->tm_hour = bcd2bin(hour & 0x1F) + 12;
+		else
+			time->tm_hour = bcd2bin(hour & 0x1F);
+	} else {
+		time->tm_hour = bcd2bin(hour);
+	}
+
+	time->tm_wday = bcd2bin(week);
+	time->tm_mday = bcd2bin(day);
+	time->tm_mon = bcd2bin(month & 0x7F);
+	if (century)
+		add_century = 100;
+
+	time->tm_year = bcd2bin(year) + add_century;
+
+	return 0;
+}
+
+static int ds3232_set_time(struct device *dev, struct rtc_time *time)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	u8 buf[7];
+
+	/* Extract time from rtc_time and load into ds3232*/
+
+	buf[0] = bin2bcd(time->tm_sec);
+	buf[1] = bin2bcd(time->tm_min);
+	buf[2] = bin2bcd(time->tm_hour);
+	buf[3] = bin2bcd(time->tm_wday); /* Day of the week */
+	buf[4] = bin2bcd(time->tm_mday); /* Date */
+	buf[5] = bin2bcd(time->tm_mon);
+	if (time->tm_year >= 100) {
+		buf[5] |= 0x80;
+		buf[6] = bin2bcd(time->tm_year - 100);
+	} else {
+		buf[6] = bin2bcd(time->tm_year);
+	}
+
+	return i2c_smbus_write_i2c_block_data(client,
+					      DS3232_REG_SECONDS, 7, buf);
+}
+
+/*
+ * DS3232 has two alarm, we only use alarm1
+ * According to linux specification, only support one-shot alarm
+ * no periodic alarm mode
+ */
+static int ds3232_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+	int control, stat;
+	int ret = 0;
+	u8 buf[4];
+
+	mutex_lock(&ds3232->mutex);
+	stat = ret = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		goto out;
+
+	control = ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+	if (control < 0)
+		goto out;
+
+	ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_ALARM1, 4, buf);
+	if (ret < 0)
+		goto out;
+
+	alarm->time.tm_sec = bcd2bin(buf[0] & 0x7F);
+	alarm->time.tm_min = bcd2bin(buf[1] & 0x7F);
+	alarm->time.tm_hour = bcd2bin(buf[2] & 0x7F);
+	alarm->time.tm_mday = bcd2bin(buf[3] & 0x7F);
+
+	alarm->time.tm_mon = -1;
+	alarm->time.tm_year = -1;
+	alarm->time.tm_wday = -1;
+	alarm->time.tm_yday = -1;
+	alarm->time.tm_isdst = -1;
+
+	alarm->enabled = !!(control & DS3232_REG_CR_A1IE);
+	alarm->pending = !!(stat & DS3232_REG_SR_A1F);
+out:
+	mutex_unlock(&ds3232->mutex);
+
+	return ret;
+}
+
+/*
+ * linux rtc-module does not support wday alarm
+ * and only 24h time mode supported indeed
+ */
+static int ds3232_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+	int control, stat;
+	int ret = 0;
+	u8 buf[4];
+
+	if (client->irq <= 0)
+		return -EINVAL;
+
+	mutex_lock(&ds3232->mutex);
+
+	buf[0] = bin2bcd(alarm->time.tm_sec);
+	buf[1] = bin2bcd(alarm->time.tm_min);
+	buf[2] = bin2bcd(alarm->time.tm_hour);
+	buf[3] = bin2bcd(alarm->time.tm_mday);
+
+	/* clear alarm interrupt enable bit */
+	ret = control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+	if (ret < 0)
+		goto out;
+	control &= ~(DS3232_REG_CR_A1IE | DS3232_REG_CR_A2IE);
+	ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+	if (ret < 0)
+		goto out;
+
+	/* clear any pending alarm flag */
+	stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		return stat;
+
+	stat &= ~(DS3232_REG_SR_A1F | DS3232_REG_SR_A2F);
+
+	ret = i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
+	if (ret < 0)
+		return ret;
+
+	ret = i2c_smbus_write_i2c_block_data(client,
+						DS3232_REG_ALARM1, 4, buf);
+
+	if (alarm->enabled) {
+		control |= DS3232_REG_CR_A1IE;
+		ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+	}
+out:
+	mutex_unlock(&ds3232->mutex);
+	return ret;
+}
+
+static irqreturn_t ds3232_irq(int irq, void *dev_id)
+{
+	struct i2c_client *client = dev_id;
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+
+	disable_irq_nosync(irq);
+	schedule_work(&ds3232->work);
+	return IRQ_HANDLED;
+}
+
+static void ds3232_work(struct work_struct *work)
+{
+	struct ds3232 *ds3232 = container_of(work, struct ds3232, work);
+	struct i2c_client *client = ds3232->client;
+	int stat, control;
+
+	mutex_lock(&ds3232->mutex);
+
+	stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		goto unlock;
+
+	if (stat & DS3232_REG_SR_A1F) {
+		control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+		if (control < 0)
+			goto out;
+		/* disable alarm1 interrupt */
+		control &= ~(DS3232_REG_CR_A1IE);
+		i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+
+		/* clear the alarm pend flag */
+		stat &= ~DS3232_REG_SR_A1F;
+		i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
+
+		rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF);
+	}
+
+out:
+	if (!ds3232->exiting)
+		enable_irq(client->irq);
+unlock:
+	mutex_unlock(&ds3232->mutex);
+}
+
+static int ds3232_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+	int ret = -ENOIOCTLCMD;
+
+	mutex_lock(&ds3232->mutex);
+	switch (cmd) {
+	case RTC_AIE_OFF:
+		ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+		if (ret < 0)
+			goto out;
+
+		ret &= ~DS3232_REG_CR_A1IE;
+
+		ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, ret);
+		if (ret < 0)
+			goto out;
+
+		break;
+
+	case RTC_AIE_ON:
+		ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+		if (ret < 0)
+			goto out;
+
+		ret |= DS3232_REG_CR_A1IE;
+
+		ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, ret);
+		if (ret < 0)
+			goto out;
+
+		break;
+	}
+out:
+	mutex_unlock(&ds3232->mutex);
+
+	return ret;
+}
+
+static const struct rtc_class_ops ds3232_rtc_ops = {
+	.read_time = ds3232_read_time,
+	.set_time = ds3232_set_time,
+	.read_alarm = ds3232_read_alarm,
+	.set_alarm = ds3232_set_alarm,
+	.ioctl = ds3232_ioctl,
+};
+
+static int ds3232_probe(struct i2c_client *client,
+		const struct i2c_device_id *id)
+{
+	struct ds3232 *ds3232;
+	int ret;
+
+	ds3232 = kzalloc(sizeof(struct ds3232), GFP_KERNEL);
+	if (!ds3232)
+		return -ENOMEM;
+
+	ds3232->client = client;
+	i2c_set_clientdata(client, ds3232);
+
+	INIT_WORK(&ds3232->work, ds3232_work);
+	mutex_init(&ds3232->mutex);
+
+	ret = ds3232_check_rtc_status(client);
+	if (ret)
+		goto out_free;
+
+	if (client->irq >= 0) {
+		ret = request_irq(client->irq, ds3232_irq, 0,
+				 "ds3232", client);
+		if (ret)
+			goto out_free;
+	}
+
+	ds3232->rtc = rtc_device_register(client->name, &client->dev,
+					  &ds3232_rtc_ops, THIS_MODULE);
+	if (IS_ERR(ds3232->rtc)) {
+		ret = PTR_ERR(ds3232->rtc);
+		dev_err(&client->dev, "unable to register the class device\n");
+		goto out_irq;
+	}
+
+	return 0;
+
+out_irq:
+	if (client->irq >= 0)
+		free_irq(client->irq, client);
+
+out_free:
+	i2c_set_clientdata(client, NULL);
+	kfree(ds3232);
+	return ret;
+}
+
+static int __devexit ds3232_remove(struct i2c_client *client)
+{
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+
+	if (client->irq >= 0) {
+		mutex_lock(&ds3232->mutex);
+		ds3232->exiting = 1;
+		mutex_unlock(&ds3232->mutex);
+
+		free_irq(client->irq, client);
+		flush_scheduled_work();
+	}
+
+	rtc_device_unregister(ds3232->rtc);
+	i2c_set_clientdata(client, NULL);
+	kfree(ds3232);
+	return 0;
+}
+
+static const struct i2c_device_id ds3232_id[] = {
+	{ "ds3232", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, ds3232_id);
+
+static struct i2c_driver ds3232_driver = {
+	.driver = {
+		.name = "rtc-ds3232",
+		.owner = THIS_MODULE,
+	},
+	.probe = ds3232_probe,
+	.remove = __devexit_p(ds3232_remove),
+	.id_table = ds3232_id,
+};
+
+static int __init ds3232_init(void)
+{
+	return i2c_add_driver(&ds3232_driver);
+}
+
+static void __exit ds3232_exit(void)
+{
+	i2c_del_driver(&ds3232_driver);
+}
+
+module_init(ds3232_init);
+module_exit(ds3232_exit);
+
+MODULE_AUTHOR("Srikanth Srinivasan <srikanth.srinivasan@freescale.com>");
+MODULE_DESCRIPTION("Maxim/Dallas DS3232 RTC Driver");
+MODULE_LICENSE("GPL");
-- 
1.5.6.5

^ permalink raw reply related

* [PATCH] rtc: add support for DS3232 RTC
From: Roy Zang @ 2010-07-05  6:45 UTC (permalink / raw)
  To: linux-i2c; +Cc: Mingkai.hu, linuxppc-dev, srikanth.srinivasan

This patch adds the driver for RTC chip DS3232 via I2C bus

Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
Signed-off-by: Jingchang Lu <b22599@freescale.com>
Signed-off-by: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
---
Tested on MPC8536DS and P4080DS board

 drivers/rtc/Kconfig      |   11 +
 drivers/rtc/Makefile     |    1 +
 drivers/rtc/rtc-ds3232.c |  466 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 478 insertions(+), 0 deletions(-)
 create mode 100644 drivers/rtc/rtc-ds3232.c

diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index 6a13037..13c2fdb 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -166,6 +166,17 @@ config RTC_DRV_DS1672
 	  This driver can also be built as a module. If so, the module
 	  will be called rtc-ds1672.
 
+config RTC_DRV_DS3232
+	tristate "Dallas/Maxim DS3232"
+	depends on RTC_CLASS && I2C
+	help
+	  If you say yes here you get support for Dallas Semiconductor
+	  DS3232 real-time clock chips.  If an interrupt is associated
+	  with the device, the alarm functionality is supported.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called rtc-ds3232.
+
 config RTC_DRV_MAX6900
 	tristate "Maxim MAX6900"
 	help
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index 44ef194..0af190c 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -39,6 +39,7 @@ obj-$(CONFIG_RTC_DRV_DS1511)	+= rtc-ds1511.o
 obj-$(CONFIG_RTC_DRV_DS1553)	+= rtc-ds1553.o
 obj-$(CONFIG_RTC_DRV_DS1672)	+= rtc-ds1672.o
 obj-$(CONFIG_RTC_DRV_DS1742)	+= rtc-ds1742.o
+obj-$(CONFIG_RTC_DRV_DS3232)	+= rtc-ds3232.o
 obj-$(CONFIG_RTC_DRV_DS3234)	+= rtc-ds3234.o
 obj-$(CONFIG_RTC_DRV_EFI)	+= rtc-efi.o
 obj-$(CONFIG_RTC_DRV_EP93XX)	+= rtc-ep93xx.o
diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c
new file mode 100644
index 0000000..21e1599
--- /dev/null
+++ b/drivers/rtc/rtc-ds3232.c
@@ -0,0 +1,466 @@
+/*
+ * RTC client/driver for the Maxim/Dallas DS3232 Real-Time Clock over I2C
+ *
+ * Copyright (C) 2009-2010 Freescale Semiconductor.
+ *
+ * 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.
+ */
+/*
+ * It would be more efficient to use i2c msgs/i2c_transfer directly but, as
+ * recommened in .../Documentation/i2c/writing-clients section
+ * "Sending and receiving", using SMBus level communication is preferred.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/i2c.h>
+#include <linux/rtc.h>
+#include <linux/bcd.h>
+#include <linux/workqueue.h>
+#include <linux/slab.h>
+
+#define DS3232_REG_SECONDS	0x00
+#define DS3232_REG_MINUTES	0x01
+#define DS3232_REG_HOURS	0x02
+#define DS3232_REG_AMPM		0x02
+#define DS3232_REG_DAY		0x03
+#define DS3232_REG_DATE		0x04
+#define DS3232_REG_MONTH	0x05
+#define DS3232_REG_CENTURY	0x05
+#define DS3232_REG_YEAR		0x06
+#define DS3232_REG_ALARM1         0x07	/* Alarm 1 BASE */
+#define DS3232_REG_ALARM2         0x0B	/* Alarm 2 BASE */
+#define DS3232_REG_CR		0x0E	/* Control register */
+#	define DS3232_REG_CR_nEOSC        0x80
+#       define DS3232_REG_CR_INTCN        0x04
+#       define DS3232_REG_CR_A2IE        0x02
+#       define DS3232_REG_CR_A1IE        0x01
+
+#define DS3232_REG_SR	0x0F	/* control/status register */
+#	define DS3232_REG_SR_OSF   0x80
+#       define DS3232_REG_SR_BSY   0x04
+#       define DS3232_REG_SR_A2F   0x02
+#       define DS3232_REG_SR_A1F   0x01
+
+struct ds3232 {
+	struct i2c_client *client;
+	struct rtc_device *rtc;
+	struct work_struct work;
+
+	/* The mutex protects alarm operations, and prevents a race
+	 * between the enable_irq() in the workqueue and the free_irq()
+	 * in the remove function.
+	 */
+	struct mutex mutex;
+	int exiting;
+};
+
+static struct i2c_driver ds3232_driver;
+
+static int ds3232_check_rtc_status(struct i2c_client *client)
+{
+	int ret = 0;
+	int control, stat;
+
+	stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		return stat;
+
+	if (stat & DS3232_REG_SR_OSF)
+		dev_warn(&client->dev,
+				"oscillator discontinuity flagged, "
+				"time unreliable\n");
+
+	stat &= ~(DS3232_REG_SR_OSF | DS3232_REG_SR_A1F | DS3232_REG_SR_A2F);
+
+	ret = i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
+	if (ret < 0)
+		return ret;
+
+	/* If the alarm is pending, clear it before requesting
+	 * the interrupt, so an interrupt event isn't reported
+	 * before everything is initialized.
+	 */
+
+	control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+	if (control < 0)
+		return control;
+
+	control &= ~(DS3232_REG_CR_A1IE | DS3232_REG_CR_A2IE);
+	control |= DS3232_REG_CR_INTCN;
+
+	return i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+}
+
+static int ds3232_read_time(struct device *dev, struct rtc_time *time)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	int ret;
+	u8 buf[7];
+	unsigned int year, month, day, hour, minute, second;
+	unsigned int week, twelve_hr, am_pm;
+	unsigned int century, add_century = 0;
+
+	ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_SECONDS, 7, buf);
+
+	if (ret < 0)
+		return ret;
+	if (ret < 7)
+		return -EIO;
+
+	second = buf[0];
+	minute = buf[1];
+	hour = buf[2];
+	week = buf[3];
+	day = buf[4];
+	month = buf[5];
+	year = buf[6];
+
+	/* Extract additional information for AM/PM and century */
+
+	twelve_hr = hour & 0x40;
+	am_pm = hour & 0x20;
+	century = month & 0x80;
+
+	/* Write to rtc_time structure */
+
+	time->tm_sec = bcd2bin(second);
+	time->tm_min = bcd2bin(minute);
+	if (twelve_hr) {
+		/* Convert to 24 hr */
+		if (am_pm)
+			time->tm_hour = bcd2bin(hour & 0x1F) + 12;
+		else
+			time->tm_hour = bcd2bin(hour & 0x1F);
+	} else {
+		time->tm_hour = bcd2bin(hour);
+	}
+
+	time->tm_wday = bcd2bin(week);
+	time->tm_mday = bcd2bin(day);
+	time->tm_mon = bcd2bin(month & 0x7F);
+	if (century)
+		add_century = 100;
+
+	time->tm_year = bcd2bin(year) + add_century;
+
+	return 0;
+}
+
+static int ds3232_set_time(struct device *dev, struct rtc_time *time)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	u8 buf[7];
+
+	/* Extract time from rtc_time and load into ds3232*/
+
+	buf[0] = bin2bcd(time->tm_sec);
+	buf[1] = bin2bcd(time->tm_min);
+	buf[2] = bin2bcd(time->tm_hour);
+	buf[3] = bin2bcd(time->tm_wday); /* Day of the week */
+	buf[4] = bin2bcd(time->tm_mday); /* Date */
+	buf[5] = bin2bcd(time->tm_mon);
+	if (time->tm_year >= 100) {
+		buf[5] |= 0x80;
+		buf[6] = bin2bcd(time->tm_year - 100);
+	} else {
+		buf[6] = bin2bcd(time->tm_year);
+	}
+
+	return i2c_smbus_write_i2c_block_data(client,
+					      DS3232_REG_SECONDS, 7, buf);
+}
+
+/*
+ * DS3232 has two alarm, we only use alarm1
+ * According to linux specification, only support one-shot alarm
+ * no periodic alarm mode
+ */
+static int ds3232_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+	int control, stat;
+	int ret = 0;
+	u8 buf[4];
+
+	mutex_lock(&ds3232->mutex);
+	stat = ret = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		goto out;
+
+	control = ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+	if (control < 0)
+		goto out;
+
+	ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_ALARM1, 4, buf);
+	if (ret < 0)
+		goto out;
+
+	alarm->time.tm_sec = bcd2bin(buf[0] & 0x7F);
+	alarm->time.tm_min = bcd2bin(buf[1] & 0x7F);
+	alarm->time.tm_hour = bcd2bin(buf[2] & 0x7F);
+	alarm->time.tm_mday = bcd2bin(buf[3] & 0x7F);
+
+	alarm->time.tm_mon = -1;
+	alarm->time.tm_year = -1;
+	alarm->time.tm_wday = -1;
+	alarm->time.tm_yday = -1;
+	alarm->time.tm_isdst = -1;
+
+	alarm->enabled = !!(control & DS3232_REG_CR_A1IE);
+	alarm->pending = !!(stat & DS3232_REG_SR_A1F);
+out:
+	mutex_unlock(&ds3232->mutex);
+
+	return ret;
+}
+
+/*
+ * linux rtc-module does not support wday alarm
+ * and only 24h time mode supported indeed
+ */
+static int ds3232_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+	int control, stat;
+	int ret = 0;
+	u8 buf[4];
+
+	if (client->irq <= 0)
+		return -EINVAL;
+
+	mutex_lock(&ds3232->mutex);
+
+	buf[0] = bin2bcd(alarm->time.tm_sec);
+	buf[1] = bin2bcd(alarm->time.tm_min);
+	buf[2] = bin2bcd(alarm->time.tm_hour);
+	buf[3] = bin2bcd(alarm->time.tm_mday);
+
+	/* clear alarm interrupt enable bit */
+	ret = control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+	if (ret < 0)
+		goto out;
+	control &= ~(DS3232_REG_CR_A1IE | DS3232_REG_CR_A2IE);
+	ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+	if (ret < 0)
+		goto out;
+
+	/* clear any pending alarm flag */
+	stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		return stat;
+
+	stat &= ~(DS3232_REG_SR_A1F | DS3232_REG_SR_A2F);
+
+	ret = i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
+	if (ret < 0)
+		return ret;
+
+	ret = i2c_smbus_write_i2c_block_data(client,
+						DS3232_REG_ALARM1, 4, buf);
+
+	if (alarm->enabled) {
+		control |= DS3232_REG_CR_A1IE;
+		ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+	}
+out:
+	mutex_unlock(&ds3232->mutex);
+	return ret;
+}
+
+static irqreturn_t ds3232_irq(int irq, void *dev_id)
+{
+	struct i2c_client *client = dev_id;
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+
+	disable_irq_nosync(irq);
+	schedule_work(&ds3232->work);
+	return IRQ_HANDLED;
+}
+
+static void ds3232_work(struct work_struct *work)
+{
+	struct ds3232 *ds3232 = container_of(work, struct ds3232, work);
+	struct i2c_client *client = ds3232->client;
+	int stat, control;
+
+	mutex_lock(&ds3232->mutex);
+
+	stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR);
+	if (stat < 0)
+		goto unlock;
+
+	if (stat & DS3232_REG_SR_A1F) {
+		control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+		if (control < 0)
+			goto out;
+		/* disable alarm1 interrupt */
+		control &= ~(DS3232_REG_CR_A1IE);
+		i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
+
+		/* clear the alarm pend flag */
+		stat &= ~DS3232_REG_SR_A1F;
+		i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
+
+		rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF);
+	}
+
+out:
+	if (!ds3232->exiting)
+		enable_irq(client->irq);
+unlock:
+	mutex_unlock(&ds3232->mutex);
+}
+
+static int ds3232_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+	int ret = -ENOIOCTLCMD;
+
+	mutex_lock(&ds3232->mutex);
+	switch (cmd) {
+	case RTC_AIE_OFF:
+		ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+		if (ret < 0)
+			goto out;
+
+		ret &= ~DS3232_REG_CR_A1IE;
+
+		ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, ret);
+		if (ret < 0)
+			goto out;
+
+		break;
+
+	case RTC_AIE_ON:
+		ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
+		if (ret < 0)
+			goto out;
+
+		ret |= DS3232_REG_CR_A1IE;
+
+		ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, ret);
+		if (ret < 0)
+			goto out;
+
+		break;
+	}
+out:
+	mutex_unlock(&ds3232->mutex);
+
+	return ret;
+}
+
+static const struct rtc_class_ops ds3232_rtc_ops = {
+	.read_time = ds3232_read_time,
+	.set_time = ds3232_set_time,
+	.read_alarm = ds3232_read_alarm,
+	.set_alarm = ds3232_set_alarm,
+	.ioctl = ds3232_ioctl,
+};
+
+static int ds3232_probe(struct i2c_client *client,
+		const struct i2c_device_id *id)
+{
+	struct ds3232 *ds3232;
+	int ret;
+
+	ds3232 = kzalloc(sizeof(struct ds3232), GFP_KERNEL);
+	if (!ds3232)
+		return -ENOMEM;
+
+	ds3232->client = client;
+	i2c_set_clientdata(client, ds3232);
+
+	INIT_WORK(&ds3232->work, ds3232_work);
+	mutex_init(&ds3232->mutex);
+
+	ret = ds3232_check_rtc_status(client);
+	if (ret)
+		goto out_free;
+
+	if (client->irq >= 0) {
+		ret = request_irq(client->irq, ds3232_irq, 0,
+				 "ds3232", client);
+		if (ret)
+			goto out_free;
+	}
+
+	ds3232->rtc = rtc_device_register(client->name, &client->dev,
+					  &ds3232_rtc_ops, THIS_MODULE);
+	if (IS_ERR(ds3232->rtc)) {
+		ret = PTR_ERR(ds3232->rtc);
+		dev_err(&client->dev, "unable to register the class device\n");
+		goto out_irq;
+	}
+
+	return 0;
+
+out_irq:
+	if (client->irq >= 0)
+		free_irq(client->irq, client);
+
+out_free:
+	i2c_set_clientdata(client, NULL);
+	kfree(ds3232);
+	return ret;
+}
+
+static int __devexit ds3232_remove(struct i2c_client *client)
+{
+	struct ds3232 *ds3232 = i2c_get_clientdata(client);
+
+	if (client->irq >= 0) {
+		mutex_lock(&ds3232->mutex);
+		ds3232->exiting = 1;
+		mutex_unlock(&ds3232->mutex);
+
+		free_irq(client->irq, client);
+		flush_scheduled_work();
+	}
+
+	rtc_device_unregister(ds3232->rtc);
+	i2c_set_clientdata(client, NULL);
+	kfree(ds3232);
+	return 0;
+}
+
+static const struct i2c_device_id ds3232_id[] = {
+	{ "ds3232", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, ds3232_id);
+
+static struct i2c_driver ds3232_driver = {
+	.driver = {
+		.name = "rtc-ds3232",
+		.owner = THIS_MODULE,
+	},
+	.probe = ds3232_probe,
+	.remove = __devexit_p(ds3232_remove),
+	.id_table = ds3232_id,
+};
+
+static int __init ds3232_init(void)
+{
+	return i2c_add_driver(&ds3232_driver);
+}
+
+static void __exit ds3232_exit(void)
+{
+	i2c_del_driver(&ds3232_driver);
+}
+
+module_init(ds3232_init);
+module_exit(ds3232_exit);
+
+MODULE_AUTHOR("Srikanth Srinivasan <srikanth.srinivasan@freescale.com>");
+MODULE_DESCRIPTION("Maxim/Dallas DS3232 RTC Driver");
+MODULE_LICENSE("GPL");
-- 
1.5.6.5

^ permalink raw reply related

* RE: [linuxppc-release] [PATCH] rtc: add support for DS3232 RTC
From: Zang Roy-R61911 @ 2010-07-05  7:17 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: Hu Mingkai-B21284, Srinivasan Srikanth-R9AABP
In-Reply-To: <1278312330-19042-1-git-send-email-tie-fei.zang@freescale.com>

=20

> -----Original Message-----
> From: linuxppc-release-bounces@linux.freescale.net=20
> [mailto:linuxppc-release-bounces@linux.freescale.net] On=20
> Behalf Of Zang Roy-R61911
> Sent: Monday, July 05, 2010 14:46 PM
> To: linuxppc-release@linux.freescale.net
> Cc: Hu Mingkai-B21284; linuxppc-dev@lists.ozlabs.org;=20
> Srinivasan Srikanth-R9AABP
> Subject: [linuxppc-release] [PATCH] rtc: add support for DS3232 RTC
>=20
> This patch adds the driver for RTC chip DS3232 via I2C bus
>=20
> Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
> Signed-off-by: Jingchang Lu <b22599@freescale.com>
> Signed-off-by: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
> Tested on MPC8536DS and P4080DS board
Sorry for the duplicated patch. It is due to a mail script bug.
Please only comment  to the patch directly send to
linux-i2c@vger.kernel.org
Thanks.
Roy

^ permalink raw reply

* kernel boot stuck at udbg_putc_cpm()
From: Shawn Jin @ 2010-07-05  7:23 UTC (permalink / raw)
  To: ppcdev

Hi,

I'm debugging the kernel (2.6.33.5) ported for a MPC870 board. The
changes are mostly based on the board adder875. The first thing I want
to test is the serial port. So I enabled CONFIG_PPC_EARLY_DEBUG and
CONFIG_PPC_EARLY_DEBUG_CPM, and changed
CONFIG_PPC_EARLY_DEBUG_CPM_ADDR to 0xfa202008. My IMMR is 0xfa200000.
However the kernel seems to stuck at udbg_putc_cpm(). The most
significant bit at 0xfa202008 never changed to zero.

I did a few debugging sessions, observed some frustrating things.
Would anyone here more experienced shed some lights on potential
causes?

First I set breakpoint at machine_init(). Below is the debug session.

(gdb) target remote bdi:2001
Remote debugging using bdi:2001
machine_init (dt_ptr=5890816) at arch/powerpc/kernel/setup_32.c:121
121	{
(gdb) next
125		udbg_early_init();
(gdb) next
^C
Program received signal SIGSTOP, Stopped (signal).
udelay (usecs=<value optimized out>)
    at /home/rayan/wti/code/wti-linux-2.6.33.5/arch/powerpc/include/asm/time.h:78
78		return mftbl();
(gdb) li
73	#if defined(CONFIG_403GCX)
74		unsigned long tbl;
75		asm volatile("mfspr %0, 0x3dd" : "=r" (tbl));
76		return tbl;
77	#else
78		return mftbl();
79	#endif
80	}
81	
82	static inline unsigned int get_tbu(void)
(gdb) step
413			while (get_tbl() - start < loops)
(gdb) step
414				HMT_low();
(gdb) print start
No symbol "start" in current context.
(gdb) print loops
No symbol "loops" in current context.
(gdb)

Several observations regarding to the above debugging session.
1. The kernel seems not able to pass udbg_early_init(). However if
breakpoint was set at functions being executed later such as
probe_machine() or start_kernel(), the udbg_early_init() was executed
properly.
2. When the execution was interrupted, it stopped at __delay(). And
the kernel seems not able to get out of this __delay() function. There
was even no symbols for local variables. Why?

Next I set the breakpoint at probe_machine(). The gdb session is shown
below. Again a couple of frustrating observations.
1. The kernel seems not able to get into the for loop. The breakpoint
set inside the for loop never got hit.
2. Once the execution was interrupted, it stopped at __delay() again,
same as the previous gdb session.

(gdb) target remote bdi:2001
Remote debugging using bdi:2001
probe_machine () at arch/powerpc/kernel/setup-common.c:525
525	{
(gdb) step
535		for (machine_id = &__machine_desc_start;
(gdb) print __machine_desc_start
$1 = {name = 0xc013ea64 "My MPC870", pci_dma_dev_setup = 0,
  pci_dma_bus_setup = 0, probe = 0xc01544c4 <my870_probe>,
  setup_arch = 0xc015442c <my870_setup>, init_early = 0, show_cpuinfo = 0,
  show_percpuinfo = 0, init_IRQ = 0xc01541d4 <mpc8xx_pics_init>,
  get_irq = 0xc001344c <mpc8xx_get_irq>, pcibios_fixup = 0,
  pci_probe_mode = 0, pci_irq_fixup = 0, pci_setup_phb = 0,
  restart = 0xc0013f0c <mpc8xx_restart>, power_off = 0, halt = 0, panic = 0,
  cpu_die = 0, time_init = 0, set_rtc_time = 0xc0013fdc <mpc8xx_set_rtc_time>,
  get_rtc_time = 0xc0013f78 <mpc8xx_get_rtc_time>, get_boot_time = 0,
  rtc_read_val = 0, rtc_write_val = 0,
  calibrate_decr = 0xc0151e70 <generic_calibrate_decr>,
  progress = 0xc0153110 <udbg_progress>, log_error = 0, nvram_read_val = 0,
  nvram_write_val = 0, nvram_write = 0, nvram_read = 0, nvram_size = 0,
  nvram_sync = 0, system_reset_exception = 0, machine_check_exception = 0,
  feature_call = 0, pci_get_legacy_ide_irq = 0, phys_mem_access_prot = 0,
  idle_loop = 0, power_save = 0, enable_pmcs = 0, set_dabr = 0, init = 0,
  kgdb_map_scc = 0, pcibios_after_init = 0, pci_exclude_device = 0,
  pcibios_fixup_resources = 0, pcibios_fixup_bus = 0,
  pcibios_enable_device_hook = 0, machine_shutdown = 0}
(gdb) print __machine_desc_end
$2 = {name = 0x0, pci_dma_dev_setup = 0, pci_dma_bus_setup = 0, probe = 0,
  setup_arch = 0, init_early = 0, show_cpuinfo = 0, show_percpuinfo = 0,
  init_IRQ = 0, get_irq = 0, pcibios_fixup = 0, pci_probe_mode = 0,
  pci_irq_fixup = 0, pci_setup_phb = 0, restart = 0, power_off = 0, halt = 0,
  panic = 0, cpu_die = 0, time_init = 0, set_rtc_time = 0, get_rtc_time = 0,
  get_boot_time = 0, rtc_read_val = 0, rtc_write_val = 0, calibrate_decr = 0,
  progress = 0, log_error = 0, nvram_read_val = 0, nvram_write_val = 0,
  nvram_write = 0, nvram_read = 0, nvram_size = 0, nvram_sync = 0,
  system_reset_exception = 0, machine_check_exception = 0, feature_call = 0,
  pci_get_legacy_ide_irq = 0, phys_mem_access_prot = 0, idle_loop = 0,
  power_save = 0, enable_pmcs = 0, set_dabr = 0, init = 0, kgdb_map_scc = 0,
  pcibios_after_init = 0, pci_exclude_device = 0, pcibios_fixup_resources = 0,
  pcibios_fixup_bus = 0, pcibios_enable_device_hook = 0, machine_shutdown = 0}
(gdb) step
536		     machine_id < &__machine_desc_end;
(gdb) print machine_id
$3 = (struct machdep_calls *) 0x0
(gdb) step
525	{
(gdb) step
535		for (machine_id = &__machine_desc_start;
(gdb) step
525	{
(gdb) step
536		     machine_id < &__machine_desc_end;
(gdb) step
535		for (machine_id = &__machine_desc_start;
(gdb) step
525	{
(gdb) step
535		for (machine_id = &__machine_desc_start;
(gdb) list
530		 * Iterate all ppc_md structures until we find the proper
531		 * one for the current machine type
532		 */
533		DBG("Probing machine type ...\n");
534	
535		for (machine_id = &__machine_desc_start;
536		     machine_id < &__machine_desc_end;
537		     machine_id++) {
538			DBG("  %s ...", machine_id->name);
539			memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls));
(gdb) list
540			if (ppc_md.probe()) {
541				DBG(" match !\n");
542				break;
543			}
544			DBG("\n");
545		}
546		/* What can we do if we didn't find ? */
547		if (machine_id >= &__machine_desc_end) {
548			DBG("No suitable machine found !\n");
549			for (;;);
(gdb) b 540
Breakpoint 1 at 0xc000cdb8: file arch/powerpc/kernel/setup-common.c, line 540.
(gdb) cont
Continuing.
^C
Program received signal SIGSTOP, Stopped (signal).
udelay (usecs=<value optimized out>) at arch/powerpc/kernel/time.c:414
414				HMT_low();
(gdb)

Finally I decided to set the breakpoint at start_kernel(). This time
where the kernel stuck was different from the previous two debugging
trials. The kernel was stuck before it reached the start_kernel(). And
I believe this udbg_put_cpm() was called when the kernel tried to
print "id mach(): done" inside machine_init().

 145        if (ppc_md.progress)
 146                ppc_md.progress("id mach(): done", 0x200);

The debug session is shown below. I also dump the cpm_udbg_txdesc from
BDI, which showed that the bit0 was always 1.

(gdb) target remote bdi:2001
Remote debugging using bdi:2001
0xc0012df8 in udbg_putc_cpm (c=105 'i')
    at /home/rayan/wti/code/wti-linux-2.6.33.5/arch/powerpc/include/asm/io.h:155
155	DEF_MMIO_IN_BE(in_be32, 32, lwz);
(gdb) next
48		while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000)
(gdb) next
48		while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000)
(gdb) next
48		while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000)
(gdb) b 51
Breakpoint 1 at 0xc0012e2c: file arch/powerpc/sysdev/cpm_common.c, line 51.
(gdb) cont
Continuing.
^C
Program received signal SIGSTOP, Stopped (signal).
udbg_putc_cpm (c=105 'i') at arch/powerpc/sysdev/cpm_common.c:48
48		while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000)
(gdb) frame
#0  udbg_putc_cpm (c=105 'i') at arch/powerpc/sysdev/cpm_common.c:48
48		while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000)
(gdb)

BDI>md 0xfa202000 4
fa202000 : 0xffffffff  -         1  ....
fa202004 : 0xffffffff  -         1  ....
fa202008 : 0xffffffff  -         1  ....
fa20200c : 0xffffffff  -         1  ....

Thanks a lot,
-Shawn.

^ permalink raw reply

* Re: [PATCH] rtc: add support for DS3232 RTC
From: Jean Delvare @ 2010-07-05  7:22 UTC (permalink / raw)
  To: Roy Zang; +Cc: Mingkai.hu, linuxppc-dev, linux-i2c, srikanth.srinivasan
In-Reply-To: <1278312326-19022-1-git-send-email-tie-fei.zang@freescale.com>

Hi Roy,

On Mon,  5 Jul 2010 14:45:26 +0800, Roy Zang wrote:
> This patch adds the driver for RTC chip DS3232 via I2C bus
> 
> Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
> Signed-off-by: Jingchang Lu <b22599@freescale.com>
> Signed-off-by: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
> Tested on MPC8536DS and P4080DS board
> 
>  drivers/rtc/Kconfig      |   11 +
>  drivers/rtc/Makefile     |    1 +
>  drivers/rtc/rtc-ds3232.c |  466 ++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 478 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/rtc/rtc-ds3232.c

You're sending this patch to the wrong list. Please read MAINTAINERS
again.

-- 
Jean Delvare

^ permalink raw reply

* RE: [PATCH] rtc: add support for DS3232 RTC
From: Zang Roy-R61911 @ 2010-07-05  7:50 UTC (permalink / raw)
  To: Jean Delvare
  Cc: Hu Mingkai-B21284, linuxppc-dev, linux-i2c,
	Srinivasan Srikanth-R9AABP
In-Reply-To: <20100705092231.2780a1b8@hyperion.delvare>

=20

> -----Original Message-----
> From: Jean Delvare [mailto:khali@linux-fr.org]=20
> Sent: Monday, July 05, 2010 15:23 PM
> To: Zang Roy-R61911
> Cc: linux-i2c@vger.kernel.org; linuxppc-dev@lists.ozlabs.org;=20
> Hu Mingkai-B21284; Srinivasan Srikanth-R9AABP
> Subject: Re: [PATCH] rtc: add support for DS3232 RTC
>=20
> Hi Roy,
>=20
> On Mon,  5 Jul 2010 14:45:26 +0800, Roy Zang wrote:
> > This patch adds the driver for RTC chip DS3232 via I2C bus
> >=20
> > Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
> > Signed-off-by: Jingchang Lu <b22599@freescale.com>
> > Signed-off-by: Srikanth Srinivasan=20
> <srikanth.srinivasan@freescale.com>
> > Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> > ---
> > Tested on MPC8536DS and P4080DS board
> >=20
> >  drivers/rtc/Kconfig      |   11 +
> >  drivers/rtc/Makefile     |    1 +
> >  drivers/rtc/rtc-ds3232.c |  466=20
> ++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 478 insertions(+), 0 deletions(-)
> >  create mode 100644 drivers/rtc/rtc-ds3232.c
>=20
> You're sending this patch to the wrong list. Please read MAINTAINERS
> again.
Does linux-i2c@vger.kernel.org is the correct mail list?
The rtc device is on the i2c bus.
Roy

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox