diff options
83 files changed, 2890 insertions, 3404 deletions
| diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt index 0ef00bd6e54d..86e3cd0d26a0 100644 --- a/Documentation/kbuild/makefiles.txt +++ b/Documentation/kbuild/makefiles.txt @@ -1136,6 +1136,21 @@ When kbuild executes, the following steps are followed (roughly):  	      resulting in the target file being recompiled for no  	      obvious reason. +    dtc +	Create flattend device tree blob object suitable for linking +	into vmlinux. Device tree blobs linked into vmlinux are placed +	in an init section in the image. Platform code *must* copy the +	blob to non-init memory prior to calling unflatten_device_tree(). + +	Example: +		#arch/x86/platform/ce4100/Makefile +		clean-files := *dtb.S + +		DTC_FLAGS := -p 1024 +		obj-y += foo.dtb.o + +		$(obj)/%.dtb: $(src)/%.dts +			$(call cmd,dtc)  --- 6.7 Custom kbuild commands diff --git a/Documentation/powerpc/dts-bindings/eeprom.txt b/Documentation/powerpc/dts-bindings/eeprom.txt new file mode 100644 index 000000000000..4342c10de1bf --- /dev/null +++ b/Documentation/powerpc/dts-bindings/eeprom.txt @@ -0,0 +1,28 @@ +EEPROMs (I2C) + +Required properties: + +  - compatible : should be "<manufacturer>,<type>" +		 If there is no specific driver for <manufacturer>, a generic +		 driver based on <type> is selected. Possible types are: +		 24c00, 24c01, 24c02, 24c04, 24c08, 24c16, 24c32, 24c64, +		 24c128, 24c256, 24c512, 24c1024, spd + +  - reg : the I2C address of the EEPROM + +Optional properties: + +  - pagesize : the length of the pagesize for writing. Please consult the +               manual of your device, that value varies a lot. A wrong value +	       may result in data loss! If not specified, a safety value of +	       '1' is used which will be very slow. + +  - read-only: this parameterless property disables writes to the eeprom + +Example: + +eeprom@52 { +	compatible = "atmel,24c32"; +	reg = <0x52>; +	pagesize = <32>; +}; diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 387d5ffdfd3a..5f5018a71a3d 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -14,7 +14,7 @@ config MICROBLAZE  	select HAVE_DMA_API_DEBUG  	select TRACING_SUPPORT  	select OF -	select OF_FLATTREE +	select OF_EARLY_FLATTREE  config SWAP  	def_bool n diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile index be01d78750d9..4c4e58ef0cb6 100644 --- a/arch/microblaze/boot/Makefile +++ b/arch/microblaze/boot/Makefile @@ -10,9 +10,6 @@ targets := linux.bin linux.bin.gz simpleImage.%  OBJCOPYFLAGS := -O binary -# Where the DTS files live -dtstree         := $(srctree)/$(src)/dts -  # Ensure system.dtb exists  $(obj)/linked_dtb.o: $(obj)/system.dtb @@ -51,14 +48,11 @@ $(obj)/simpleImage.%: vmlinux FORCE  	$(call if_changed,strip)  	@echo 'Kernel: $@ is ready' ' (#'`cat .version`')' -# Rule to build device tree blobs -DTC = $(objtree)/scripts/dtc/dtc  # Rule to build device tree blobs -quiet_cmd_dtc = DTC     $@ -	cmd_dtc = $(DTC) -O dtb -o $(obj)/$*.dtb -b 0 -p 1024 $(dtstree)/$*.dts +DTC_FLAGS := -p 1024 -$(obj)/%.dtb: $(dtstree)/%.dts FORCE -	$(call if_changed,dtc) +$(obj)/%.dtb: $(src)/dts/%.dts FORCE +	$(call cmd,dtc)  clean-files += *.dtb simpleImage.*.unstrip linux.bin.ub diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h index bdc38312ae4a..2e72af078b05 100644 --- a/arch/microblaze/include/asm/prom.h +++ b/arch/microblaze/include/asm/prom.h @@ -64,9 +64,6 @@ extern void kdump_move_device_tree(void);  /* CPU OF node matching */  struct device_node *of_get_cpu_node(int cpu, unsigned int *thread); -/* Get the MAC address */ -extern const void *of_get_mac_address(struct device_node *np); -  /**   * of_irq_map_pci - Resolve the interrupt for a PCI device   * @pdev:	the device whose interrupt is to be resolved diff --git a/arch/microblaze/kernel/prom_parse.c b/arch/microblaze/kernel/prom_parse.c index 99d9b61cccb5..9ae24f4b882b 100644 --- a/arch/microblaze/kernel/prom_parse.c +++ b/arch/microblaze/kernel/prom_parse.c @@ -110,41 +110,3 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,  	cells = prop ? *(u32 *)prop : of_n_size_cells(dn);  	*size = of_read_number(dma_window, cells);  } - -/** - * Search the device tree for the best MAC address to use.  'mac-address' is - * checked first, because that is supposed to contain to "most recent" MAC - * address. If that isn't set, then 'local-mac-address' is checked next, - * because that is the default address.  If that isn't set, then the obsolete - * 'address' is checked, just in case we're using an old device tree. - * - * Note that the 'address' property is supposed to contain a virtual address of - * the register set, but some DTS files have redefined that property to be the - * MAC address. - * - * All-zero MAC addresses are rejected, because those could be properties that - * exist in the device tree, but were not set by U-Boot.  For example, the - * DTS could define 'mac-address' and 'local-mac-address', with zero MAC - * addresses.  Some older U-Boots only initialized 'local-mac-address'.  In - * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists - * but is all zeros. -*/ -const void *of_get_mac_address(struct device_node *np) -{ -	struct property *pp; - -	pp = of_find_property(np, "mac-address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	pp = of_find_property(np, "local-mac-address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	pp = of_find_property(np, "address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	return NULL; -} -EXPORT_SYMBOL(of_get_mac_address); diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 0a9b5b8b2a19..f489ec30e071 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -2218,7 +2218,7 @@ config SECCOMP  config USE_OF  	bool "Flattened Device Tree support"  	select OF -	select OF_FLATTREE +	select OF_EARLY_FLATTREE  	help  	  Include support for flattened device tree machine descriptions. diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index e625e9e034ae..48fb4790bfec 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -116,7 +116,7 @@ config PPC  	bool  	default y  	select OF -	select OF_FLATTREE +	select OF_EARLY_FLATTREE  	select HAVE_FTRACE_MCOUNT_RECORD  	select HAVE_DYNAMIC_FTRACE  	select HAVE_FUNCTION_TRACER diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index fae8192c8fcc..96deec63bcf3 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -35,7 +35,7 @@ endif  BOOTCFLAGS	+= -I$(obj) -I$(srctree)/$(obj) -DTS_FLAGS	?= -p 1024 +DTC_FLAGS	?= -p 1024  $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405  $(obj)/ebony.o: BOOTCFLAGS += -mcpu=405 @@ -332,10 +332,8 @@ $(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)  	$(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb)  # Rule to build device tree blobs -DTC = $(objtree)/scripts/dtc/dtc - -$(obj)/%.dtb: $(dtstree)/%.dts -	$(DTC) -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS) $(dtstree)/$*.dts +$(obj)/%.dtb: $(src)/dts/%.dts +	$(call cmd,dtc)  # If there isn't a platform selected then just strip the vmlinux.  ifeq (,$(image-y)) diff --git a/arch/powerpc/boot/dts/bluestone.dts b/arch/powerpc/boot/dts/bluestone.dts index 9bb3d72c0e5a..2a56a0dbd1f7 100644 --- a/arch/powerpc/boot/dts/bluestone.dts +++ b/arch/powerpc/boot/dts/bluestone.dts @@ -33,7 +33,7 @@  	aliases {  		ethernet0 = &EMAC0;  		serial0 = &UART0; -		serial1 = &UART1; +		//serial1 = &UART1; --gcl missing UART1 label  	};  	cpus { @@ -52,7 +52,7 @@  			d-cache-size = <32768>;  			dcr-controller;  			dcr-access-method = "native"; -			next-level-cache = <&L2C0>; +			//next-level-cache = <&L2C0>; --gcl missing L2C0 label  		};  	}; @@ -142,7 +142,7 @@  					/*RXEOB*/ 0x7 0x4  					/*SERR*/  0x3 0x4  					/*TXDE*/  0x4 0x4 -					/*RXDE*/  0x5 0x4 +					/*RXDE*/  0x5 0x4>;  		};  		POB0: opb { @@ -182,7 +182,7 @@  						reg = <0x001a0000 0x00060000>;  					};  				}; -			} +			};  			UART0: serial@ef600300 {  				device_type = "serial"; diff --git a/arch/powerpc/boot/dts/cm5200.dts b/arch/powerpc/boot/dts/cm5200.dts index dd3860846f15..ad3a4f4a2b04 100644 --- a/arch/powerpc/boot/dts/cm5200.dts +++ b/arch/powerpc/boot/dts/cm5200.dts @@ -10,220 +10,74 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "schindler,cm5200";  	compatible = "schindler,cm5200"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;		// L1, 16K -			i-cache-size = <0x4000>;		// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	}; - -	memory { -		device_type = "memory"; -		reg = <0x00000000 0x04000000>;	// 64MB -	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; -  		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; - -		timer@620 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>; -		}; - -		timer@630 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>; -		}; - -		timer@640 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>; -		}; - -		timer@650 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>; -		}; - -		timer@660 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>; -		}; - -		timer@670 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>; +		can@900 { +			status = "disabled";  		}; -		rtc@800 {	// Real time clock -			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; -			reg = <0x800 0x100>; -			interrupts = <1 5 0 1 6 0>; +		can@980 { +			status = "disabled";  		}; -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; -		}; - -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0xff>; -			interrupts = <2 6 0>; -		}; - -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; +		psc@2000 {		// PSC1 +			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";  		}; -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		psc@2200 {		// PSC2 +			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";  		}; -		serial@2000 {		// PSC1 +		psc@2400 {		// PSC3  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>;  		}; -		serial@2200 {		// PSC2 -			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2200 0x100>; -			interrupts = <2 2 0>; +		psc@2600 {		// PSC4 +			status = "disabled";  		}; -		serial@2400 {		// PSC3 -			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2400 0x100>; -			interrupts = <2 3 0>; +		psc@2800 {		// PSC5 +			status = "disabled";  		}; -		serial@2c00 {		// PSC6 +		psc@2c00 {		// PSC6  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2c00 0x100>; -			interrupts = <2 4 0>;  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;       // fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;   // these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				reg = <0>;  			};  		}; -		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>; +		ata@3a00 { +			status = "disabled";  		}; -		sram@8000 { -			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; -			reg = <0x8000 0x4000>; +		i2c@3d00 { +			status = "disabled";  		}; +  	}; -	localbus { -		compatible = "fsl,mpc5200b-lpb","simple-bus"; -		#address-cells = <2>; -		#size-cells = <1>; -		ranges = <0 0 0xfc000000 0x2000000>; +	pci@f0000d00 { +		status = "disabled"; +	}; +	localbus {  		// 16-bit flash device at LocalPlus Bus CS0  		flash@0,0 {  			compatible = "cfi-flash"; diff --git a/arch/powerpc/boot/dts/digsy_mtc.dts b/arch/powerpc/boot/dts/digsy_mtc.dts index 8e9be6bfe23e..27bd267d631c 100644 --- a/arch/powerpc/boot/dts/digsy_mtc.dts +++ b/arch/powerpc/boot/dts/digsy_mtc.dts @@ -11,195 +11,68 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "intercontrol,digsy-mtc";  	compatible = "intercontrol,digsy-mtc"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;		// L1, 16K -			i-cache-size = <0x4000>;		// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	};  	memory { -		device_type = "memory";  		reg = <0x00000000 0x02000000>;	// 32MB  	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; -  		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; - -		timer@620 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>; -		}; - -		timer@630 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>; -		}; - -		timer@640 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>; -		}; - -		timer@650 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>; +		rtc@800 { +			status = "disabled";  		}; -		timer@660 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>; +		can@900 { +			status = "disabled";  		}; -		timer@670 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>; +		can@980 { +			status = "disabled";  		}; -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; +		psc@2000 {		// PSC1 +			status = "disabled";  		}; -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; +		psc@2200 {		// PSC2 +			status = "disabled";  		}; -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; +		psc@2400 {		// PSC3 +			status = "disabled";  		}; -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0xff>; -			interrupts = <2 6 0>; -		}; - -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; -		}; - -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		psc@2600 {		// PSC4 +			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";  		}; -		serial@2600 {		// PSC4 +		psc@2800 {		// PSC5  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2600 0x100>; -			interrupts = <2 11 0>;  		}; -		serial@2800 {		// PSC5 -			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2800 0x100>; -			interrupts = <2 12 0>; +		psc@2c00 {		// PSC6 +			status = "disabled";  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;       // fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;   // these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; -		}; -  		i2c@3d00 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d00 0x40>; -			interrupts = <2 15 0>; -  			rtc@50 {  				compatible = "at,24c08";  				reg = <0x50>; @@ -211,16 +84,16 @@  			};  		}; -		sram@8000 { -			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; -			reg = <0x8000 0x4000>; +		i2c@3d40 { +			status = "disabled";  		};  	}; -	lpb { -		compatible = "fsl,mpc5200b-lpb","simple-bus"; -		#address-cells = <2>; -		#size-cells = <1>; +	pci@f0000d00 { +		status = "disabled"; +	}; + +	localbus {  		ranges = <0 0 0xff000000 0x1000000>;  		// 16-bit flash device at LocalPlus Bus CS0 diff --git a/arch/powerpc/boot/dts/hotfoot.dts b/arch/powerpc/boot/dts/hotfoot.dts index cad9c3840afc..71d3bb4931dc 100644 --- a/arch/powerpc/boot/dts/hotfoot.dts +++ b/arch/powerpc/boot/dts/hotfoot.dts @@ -117,6 +117,8 @@  			};  			IIC: i2c@ef600500 { +				#address-cells = <1>; +				#size-cells = <0>;  				compatible = "ibm,iic-405ep", "ibm,iic";  				reg = <0xef600500 0x00000011>;  				interrupt-parent = <&UIC0>; diff --git a/arch/powerpc/boot/dts/lite5200b.dts b/arch/powerpc/boot/dts/lite5200b.dts index 59702ace900f..fb288bb882b6 100644 --- a/arch/powerpc/boot/dts/lite5200b.dts +++ b/arch/powerpc/boot/dts/lite5200b.dts @@ -10,256 +10,75 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "fsl,lite5200b";  	compatible = "fsl,lite5200b"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;	// L1, 16K -			i-cache-size = <0x4000>;	// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	};  	memory { -		device_type = "memory";  		reg = <0x00000000 0x10000000>;	// 256MB  	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; -  		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; - -		timer@620 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>; -		}; - -		timer@630 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>; -		}; - -		timer@640 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>; -		}; - -		timer@650 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>; -		}; - -		timer@660 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>; -		}; - -		timer@670 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>; -		}; - -		rtc@800 {	// Real time clock -			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; -			reg = <0x800 0x100>; -			interrupts = <1 5 0 1 6 0>; -		}; - -		can@900 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 17 0>; -			reg = <0x900 0x80>; -		}; - -		can@980 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 18 0>; -			reg = <0x980 0x80>; -		}; - -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; +		psc@2000 {		// PSC1 +			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; +			cell-index = <0>;  		}; -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; +		psc@2200 {		// PSC2 +			status = "disabled";  		}; -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0xff>; -			interrupts = <2 6 0>; +		psc@2400 {		// PSC3 +			status = "disabled";  		}; -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; +		psc@2600 {		// PSC4 +			status = "disabled";  		}; -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		psc@2800 {		// PSC5 +			status = "disabled";  		}; -		serial@2000 {		// PSC1 -			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			cell-index = <0>; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>; +		psc@2c00 {		// PSC6 +			status = "disabled";  		};  		// PSC2 in ac97 mode example  		//ac97@2200 {		// PSC2  		//	compatible = "fsl,mpc5200b-psc-ac97","fsl,mpc5200-psc-ac97";  		//	cell-index = <1>; -		//	reg = <0x2200 0x100>; -		//	interrupts = <2 2 0>;  		//};  		// PSC3 in CODEC mode example  		//i2s@2400 {		// PSC3  		//	compatible = "fsl,mpc5200b-psc-i2s"; //not 5200 compatible  		//	cell-index = <2>; -		//	reg = <0x2400 0x100>; -		//	interrupts = <2 3 0>; -		//}; - -		// PSC4 in uart mode example -		//serial@2600 {		// PSC4 -		//	compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -		//	cell-index = <3>; -		//	reg = <0x2600 0x100>; -		//	interrupts = <2 11 0>; -		//}; - -		// PSC5 in uart mode example -		//serial@2800 {		// PSC5 -		//	compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -		//	cell-index = <4>; -		//	reg = <0x2800 0x100>; -		//	interrupts = <2 12 0>;  		//};  		// PSC6 in spi mode example  		//spi@2c00 {		// PSC6  		//	compatible = "fsl,mpc5200b-psc-spi","fsl,mpc5200-psc-spi";  		//	cell-index = <5>; -		//	reg = <0x2c00 0x100>; -		//	interrupts = <2 4 0>;  		//};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;	// fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;	// these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; -		}; - -		i2c@3d00 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d00 0x40>; -			interrupts = <2 15 0>; -		}; -  		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>; -  			eeprom@50 {  				compatible = "atmel,24c02";  				reg = <0x50>; @@ -273,12 +92,6 @@  	};  	pci@f0000d00 { -		#interrupt-cells = <1>; -		#size-cells = <2>; -		#address-cells = <3>; -		device_type = "pci"; -		compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; -		reg = <0xf0000d00 0x100>;  		interrupt-map-mask = <0xf800 0 0 7>;  		interrupt-map = <0xc000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot  				 0xc000 0 0 2 &mpc5200_pic 1 1 3 @@ -298,11 +111,6 @@  	};  	localbus { -		compatible = "fsl,mpc5200b-lpb","fsl,mpc5200-lpb","simple-bus"; - -		#address-cells = <2>; -		#size-cells = <1>; -  		ranges = <0 0 0xfe000000 0x02000000>;  		flash@0,0 { diff --git a/arch/powerpc/boot/dts/media5200.dts b/arch/powerpc/boot/dts/media5200.dts index 0c3902bc5b6a..48d72f38e5ed 100644 --- a/arch/powerpc/boot/dts/media5200.dts +++ b/arch/powerpc/boot/dts/media5200.dts @@ -11,14 +11,11 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "fsl,media5200";  	compatible = "fsl,media5200"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>;  	aliases {  		console = &console; @@ -30,16 +27,7 @@  	};  	cpus { -		#address-cells = <1>; -		#size-cells = <0>; -  		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;		// L1, 16K -			i-cache-size = <0x4000>;		// L1, 16K  			timebase-frequency = <33000000>;	// 33 MHz, these were configured by U-Boot  			bus-frequency = <132000000>;		// 132 MHz  			clock-frequency = <396000000>;		// 396 MHz @@ -47,205 +35,57 @@  	};  	memory { -		device_type = "memory";  		reg = <0x00000000 0x08000000>;	// 128MB RAM  	}; -	soc@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; +	soc5200@f0000000 {  		bus-frequency = <132000000>;// 132 MHz -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		};  		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; - -		timer@620 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>; -		}; - -		timer@630 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>; -		}; - -		timer@640 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>; -		}; - -		timer@650 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>; -		}; - -		timer@660 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>; -		}; - -		timer@670 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>; -		}; - -		rtc@800 {	// Real time clock -			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; -			reg = <0x800 0x100>; -			interrupts = <1 5 0 1 6 0>; -		}; - -		can@900 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 17 0>; -			reg = <0x900 0x80>; +		psc@2000 {	// PSC1 +			status = "disabled";  		}; -		can@980 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 18 0>; -			reg = <0x980 0x80>; +		psc@2200 {	// PSC2 +			status = "disabled";  		}; -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; +		psc@2400 {	// PSC3 +			status = "disabled";  		}; -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; +		psc@2600 {	// PSC4 +			status = "disabled";  		}; -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; -		}; - -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0x100>; -			interrupts = <2 6 0>; -		}; - -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; -		}; - -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		psc@2800 {	// PSC5 +			status = "disabled";  		};  		// PSC6 in uart mode -		console: serial@2c00 {		// PSC6 +		console: psc@2c00 {		// PSC6  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			cell-index = <5>; -			port-number = <0>;  // Logical port assignment -			reg = <0x2c00 0x100>; -			interrupts = <2 4 0>;  		}; -		eth0: ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>; +		ethernet@3000 {  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;	// fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;	// these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; -		}; - -		i2c@3d00 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d00 0x40>; -			interrupts = <2 15 0>; -		}; - -		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>; -		}; - -		sram@8000 { -			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; -			reg = <0x8000 0x4000>; +		usb@1000 { +			reg = <0x1000 0x100>;  		};  	};  	pci@f0000d00 { -		#interrupt-cells = <1>; -		#size-cells = <2>; -		#address-cells = <3>; -		device_type = "pci"; -		compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; -		reg = <0xf0000d00 0x100>;  		interrupt-map-mask = <0xf800 0 0 7>;  		interrupt-map = <0xc000 0 0 1 &media5200_fpga 0 2 // 1st slot  				 0xc000 0 0 2 &media5200_fpga 0 3 @@ -262,37 +102,29 @@  				 0xe000 0 0 1 &media5200_fpga 0 5 // CoralIP  				>; -		clock-frequency = <0>; // From boot loader -		interrupts = <2 8 0 2 9 0 2 10 0>; -		interrupt-parent = <&mpc5200_pic>; -		bus-range = <0 0>;  		ranges = <0x42000000 0 0x80000000 0x80000000 0 0x20000000  			  0x02000000 0 0xa0000000 0xa0000000 0 0x10000000  			  0x01000000 0 0x00000000 0xb0000000 0 0x01000000>; +		interrupt-parent = <&mpc5200_pic>;  	};  	localbus { -		compatible = "fsl,mpc5200b-lpb","simple-bus"; -		#address-cells = <2>; -		#size-cells = <1>; -  		ranges = < 0 0 0xfc000000 0x02000000  			   1 0 0xfe000000 0x02000000  			   2 0 0xf0010000 0x00010000  			   3 0 0xf0020000 0x00010000 >; -  		flash@0,0 {  			compatible = "amd,am29lv28ml", "cfi-flash"; -			reg = <0 0x0 0x2000000>;		// 32 MB -			bank-width = <4>;			// Width in bytes of the flash bank -			device-width = <2>;			// Two devices on each bank +			reg = <0 0x0 0x2000000>;                // 32 MB +			bank-width = <4>;                       // Width in bytes of the flash bank +			device-width = <2>;                     // Two devices on each bank  		};  		flash@1,0 {  			compatible = "amd,am29lv28ml", "cfi-flash"; -			reg = <1 0 0x2000000>;			// 32 MB -			bank-width = <4>;			// Width in bytes of the flash bank -			device-width = <2>;			// Two devices on each bank +			reg = <1 0 0x2000000>;                  // 32 MB +			bank-width = <4>;                       // Width in bytes of the flash bank +			device-width = <2>;                     // Two devices on each bank  		};  		media5200_fpga: fpga@2,0 { diff --git a/arch/powerpc/boot/dts/motionpro.dts b/arch/powerpc/boot/dts/motionpro.dts index 6ca4fc144a33..0b78e89ac69b 100644 --- a/arch/powerpc/boot/dts/motionpro.dts +++ b/arch/powerpc/boot/dts/motionpro.dts @@ -10,219 +10,73 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "promess,motionpro";  	compatible = "promess,motionpro"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;	// L1, 16K -			i-cache-size = <0x4000>;	// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	}; - -	memory { -		device_type = "memory"; -		reg = <0x00000000 0x04000000>;	// 64MB -	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; -  		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; - -		timer@620 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>; -		}; - -		timer@630 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>; -		}; - -		timer@640 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>; -		}; - -		timer@650 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>; -		}; - -		motionpro-led@660 {	// Motion-PRO status LED +		timer@660 {	// Motion-PRO status LED  			compatible = "promess,motionpro-led";  			label = "motionpro-statusled"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>;  			blink-delay = <100>; // 100 msec  		}; -		motionpro-led@670 {	// Motion-PRO ready LED +		timer@670 {	// Motion-PRO ready LED  			compatible = "promess,motionpro-led";  			label = "motionpro-readyled"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>; -		}; - -		rtc@800 {	// Real time clock -			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; -			reg = <0x800 0x100>; -			interrupts = <1 5 0 1 6 0>; -		}; - -		can@980 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 18 0>; -			reg = <0x980 0x80>;  		}; -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; +		can@900 { +			status = "disabled";  		}; -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; +		psc@2000 {		// PSC1 +			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart";  		}; -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0xff>; -			interrupts = <2 6 0>; +		// PSC2 in spi master mode  +		psc@2200 {		// PSC2 +			compatible = "fsl,mpc5200b-psc-spi","fsl,mpc5200-psc-spi"; +			cell-index = <1>;  		}; -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; +		psc@2400 {		// PSC3 +			status = "disabled";  		}; -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		psc@2600 {		// PSC4 +			status = "disabled";  		}; -		serial@2000 {		// PSC1 +		psc@2800 {		// PSC5  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>; -		}; - -		// PSC2 in spi master mode  -		spi@2200 {		// PSC2 -			compatible = "fsl,mpc5200b-psc-spi","fsl,mpc5200-psc-spi"; -			cell-index = <1>; -			reg = <0x2200 0x100>; -			interrupts = <2 2 0>;  		}; -		// PSC5 in uart mode -		serial@2800 {		// PSC5 -			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2800 0x100>; -			interrupts = <2 12 0>; +		psc@2c00 {		// PSC6 +			status = "disabled";  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;       // fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;   // these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@2 {  				reg = <2>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; +		i2c@3d00 { +			status = "disabled";  		};  		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>; -  			rtc@68 {  				compatible = "dallas,ds1339";  				reg = <0x68>; @@ -235,10 +89,11 @@  		};  	}; +	pci@f0000d00 { +		status = "disabled"; +	}; +  	localbus { -		compatible = "fsl,mpc5200b-lpb","simple-bus"; -		#address-cells = <2>; -		#size-cells = <1>;  		ranges = <0 0 0xff000000 0x01000000  			  1 0 0x50000000 0x00010000  			  2 0 0x50010000 0x00010000 @@ -280,5 +135,6 @@  			#size-cells = <1>;  			#address-cells = <1>;  		}; +  	};  }; diff --git a/arch/powerpc/boot/dts/mpc5200b.dtsi b/arch/powerpc/boot/dts/mpc5200b.dtsi new file mode 100644 index 000000000000..bc27548e895d --- /dev/null +++ b/arch/powerpc/boot/dts/mpc5200b.dtsi @@ -0,0 +1,275 @@ +/* + * base MPC5200b Device Tree Source + * + * Copyright (C) 2010 SecretLab + * Grant Likely <grant@secretlab.ca> + * John Bonesio <bones@secretlab.ca> + * + * 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. + */ + +/dts-v1/; + +/ { +	model = "fsl,mpc5200b"; +	compatible = "fsl,mpc5200b"; +	#address-cells = <1>; +	#size-cells = <1>; +	interrupt-parent = <&mpc5200_pic>; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		powerpc: PowerPC,5200@0 { +			device_type = "cpu"; +			reg = <0>; +			d-cache-line-size = <32>; +			i-cache-line-size = <32>; +			d-cache-size = <0x4000>;	// L1, 16K +			i-cache-size = <0x4000>;	// L1, 16K +			timebase-frequency = <0>;	// from bootloader +			bus-frequency = <0>;		// from bootloader +			clock-frequency = <0>;		// from bootloader +		}; +	}; + +	memory: memory { +		device_type = "memory"; +		reg = <0x00000000 0x04000000>;	// 64MB +	}; + +	soc: soc5200@f0000000 { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "fsl,mpc5200b-immr"; +		ranges = <0 0xf0000000 0x0000c000>; +		reg = <0xf0000000 0x00000100>; +		bus-frequency = <0>;		// from bootloader +		system-frequency = <0>;		// from bootloader + +		cdm@200 { +			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; +			reg = <0x200 0x38>; +		}; + +		mpc5200_pic: interrupt-controller@500 { +			// 5200 interrupts are encoded into two levels; +			interrupt-controller; +			#interrupt-cells = <3>; +			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; +			reg = <0x500 0x80>; +		}; + +		timer@600 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x600 0x10>; +			interrupts = <1 9 0>; +		}; + +		timer@610 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x610 0x10>; +			interrupts = <1 10 0>; +		}; + +		timer@620 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x620 0x10>; +			interrupts = <1 11 0>; +		}; + +		timer@630 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x630 0x10>; +			interrupts = <1 12 0>; +		}; + +		timer@640 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x640 0x10>; +			interrupts = <1 13 0>; +		}; + +		timer@650 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x650 0x10>; +			interrupts = <1 14 0>; +		}; + +		timer@660 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x660 0x10>; +			interrupts = <1 15 0>; +		}; + +		timer@670 {	// General Purpose Timer +			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; +			reg = <0x670 0x10>; +			interrupts = <1 16 0>; +		}; + +		rtc@800 {	// Real time clock +			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; +			reg = <0x800 0x100>; +			interrupts = <1 5 0 1 6 0>; +		}; + +		can@900 { +			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; +			interrupts = <2 17 0>; +			reg = <0x900 0x80>; +		}; + +		can@980 { +			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; +			interrupts = <2 18 0>; +			reg = <0x980 0x80>; +		}; + +		gpio_simple: gpio@b00 { +			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; +			reg = <0xb00 0x40>; +			interrupts = <1 7 0>; +			gpio-controller; +			#gpio-cells = <2>; +		}; + +		gpio_wkup: gpio@c00 { +			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; +			reg = <0xc00 0x40>; +			interrupts = <1 8 0 0 3 0>; +			gpio-controller; +			#gpio-cells = <2>; +		}; + +		spi@f00 { +			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; +			reg = <0xf00 0x20>; +			interrupts = <2 13 0 2 14 0>; +		}; + +		usb: usb@1000 { +			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; +			reg = <0x1000 0xff>; +			interrupts = <2 6 0>; +		}; + +		dma-controller@1200 { +			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; +			reg = <0x1200 0x80>; +			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 +			              3 4 0  3 5 0  3 6 0  3 7 0 +			              3 8 0  3 9 0  3 10 0  3 11 0 +			              3 12 0  3 13 0  3 14 0  3 15 0>; +		}; + +		xlb@1f00 { +			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; +			reg = <0x1f00 0x100>; +		}; + +		psc1: psc@2000 {		// PSC1 +			compatible = "fsl,mpc5200b-psc","fsl,mpc5200-psc"; +			reg = <0x2000 0x100>; +			interrupts = <2 1 0>; +		}; + +		psc2: psc@2200 {		// PSC2 +			compatible = "fsl,mpc5200b-psc","fsl,mpc5200-psc"; +			reg = <0x2200 0x100>; +			interrupts = <2 2 0>; +		}; + +		psc3: psc@2400 {		// PSC3 +			compatible = "fsl,mpc5200b-psc","fsl,mpc5200-psc"; +			reg = <0x2400 0x100>; +			interrupts = <2 3 0>; +		}; + +		psc4: psc@2600 {		// PSC4 +			compatible = "fsl,mpc5200b-psc","fsl,mpc5200-psc"; +			reg = <0x2600 0x100>; +			interrupts = <2 11 0>; +		}; + +		psc5: psc@2800 {		// PSC5 +			compatible = "fsl,mpc5200b-psc","fsl,mpc5200-psc"; +			reg = <0x2800 0x100>; +			interrupts = <2 12 0>; +		}; + +		psc6: psc@2c00 {		// PSC6 +			compatible = "fsl,mpc5200b-psc","fsl,mpc5200-psc"; +			reg = <0x2c00 0x100>; +			interrupts = <2 4 0>; +		}; + +		eth0: ethernet@3000 { +			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; +			reg = <0x3000 0x400>; +			local-mac-address = [ 00 00 00 00 00 00 ]; +			interrupts = <2 5 0>; +		}; + +		mdio@3000 { +			#address-cells = <1>; +			#size-cells = <0>; +			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; +			reg = <0x3000 0x400>;	// fec range, since we need to setup fec interrupts +			interrupts = <2 5 0>;	// these are for "mii command finished", not link changes & co. +		}; + +		ata@3a00 { +			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; +			reg = <0x3a00 0x100>; +			interrupts = <2 7 0>; +		}; + +		i2c@3d00 { +			#address-cells = <1>; +			#size-cells = <0>; +			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; +			reg = <0x3d00 0x40>; +			interrupts = <2 15 0>; +		}; + +		i2c@3d40 { +			#address-cells = <1>; +			#size-cells = <0>; +			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; +			reg = <0x3d40 0x40>; +			interrupts = <2 16 0>; +		}; + +		sram@8000 { +			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; +			reg = <0x8000 0x4000>; +		}; +	}; + +	pci: pci@f0000d00 { +		#interrupt-cells = <1>; +		#size-cells = <2>; +		#address-cells = <3>; +		device_type = "pci"; +		compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; +		reg = <0xf0000d00 0x100>; +		// interrupt-map-mask = need to add +		// interrupt-map = need to add +		clock-frequency = <0>; // From boot loader +		interrupts = <2 8 0 2 9 0 2 10 0>; +		bus-range = <0 0>; +		// ranges = need to add +	}; + +	localbus: localbus { +		compatible = "fsl,mpc5200b-lpb","fsl,mpc5200-lpb","simple-bus"; +		#address-cells = <2>; +		#size-cells = <1>; +		ranges = <0 0 0xfc000000 0x2000000>; +	}; +}; diff --git a/arch/powerpc/boot/dts/mucmc52.dts b/arch/powerpc/boot/dts/mucmc52.dts index b72a7581d798..21d34720fcc9 100644 --- a/arch/powerpc/boot/dts/mucmc52.dts +++ b/arch/powerpc/boot/dts/mucmc52.dts @@ -11,172 +11,109 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "manroland,mucmc52";  	compatible = "manroland,mucmc52"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;	// L1, 16K -			i-cache-size = <0x4000>;	// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	}; - -	memory { -		device_type = "memory"; -		reg = <0x00000000 0x04000000>;	// 64MB -	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; -  		gpt0: timer@600 {	// GPT 0 in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt1: timer@610 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt2: timer@620 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt3: timer@630 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>;  			gpio-controller;  			#gpio-cells = <2>;  		}; -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; +		timer@640 { +			status = "disabled";  		}; -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; +		timer@650 { +			status = "disabled"; +		}; + +		timer@660 { +			status = "disabled"; +		}; + +		timer@670 { +			status = "disabled";  		}; -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; +		rtc@800 { +			status = "disabled";  		}; -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		can@900 { +			status = "disabled";  		}; -		serial@2000 { /* PSC1 in UART mode */ +		can@980 { +			status = "disabled"; +		}; + +		spi@f00 { +			status = "disabled"; +		}; + +		usb@1000 { +			status = "disabled"; +		}; + +		psc@2000 {		// PSC1  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>;  		}; -		serial@2200 { /* PSC2 in UART mode */ +		psc@2200 {		// PSC2  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2200 0x100>; -			interrupts = <2 2 0>;  		}; -		serial@2c00 { /* PSC6 in UART mode */ +		psc@2400 {		// PSC3 +			status = "disabled"; +		}; + +		psc@2600 {		// PSC4 +			status = "disabled"; +		}; + +		psc@2800 {		// PSC5 +			status = "disabled"; +		}; + +		psc@2c00 {		// PSC6  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2c00 0x100>; -			interrupts = <2 4 0>;  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>; 	// fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>; 	// these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				compatible = "intel,lxt971";  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; +		i2c@3d00 { +			status = "disabled";  		};  		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>;  			hwmon@2c {  				compatible = "ad,adm9240";  				reg = <0x2c>; @@ -186,20 +123,9 @@  				reg = <0x51>;  			};  		}; - -		sram@8000 { -			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; -			reg = <0x8000 0x4000>; -		};  	};  	pci@f0000d00 { -		#interrupt-cells = <1>; -		#size-cells = <2>; -		#address-cells = <3>; -		device_type = "pci"; -		compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; -		reg = <0xf0000d00 0x100>;  		interrupt-map-mask = <0xf800 0 0 7>;  		interrupt-map = <  				/* IDSEL 0x10 */ @@ -208,20 +134,12 @@  				0x8000 0 0 3 &mpc5200_pic 0 2 3  				0x8000 0 0 4 &mpc5200_pic 0 1 3  				>; -		clock-frequency = <0>; // From boot loader -		interrupts = <2 8 0 2 9 0 2 10 0>; -		bus-range = <0 0>;  		ranges = <0x42000000 0 0x60000000 0x60000000 0 0x10000000  			  0x02000000 0 0x90000000 0x90000000 0 0x10000000  			  0x01000000 0 0x00000000 0xa0000000 0 0x01000000>;  	};  	localbus { -		compatible = "fsl,mpc5200b-lpb","fsl,mpc5200-lpb","simple-bus"; - -		#address-cells = <2>; -		#size-cells = <1>; -  		ranges = <0 0 0xff800000 0x00800000  			  1 0 0x80000000 0x00800000  			  3 0 0x80000000 0x00800000>; diff --git a/arch/powerpc/boot/dts/pcm030.dts b/arch/powerpc/boot/dts/pcm030.dts index 8a4ec30b21ae..9e354997eb7e 100644 --- a/arch/powerpc/boot/dts/pcm030.dts +++ b/arch/powerpc/boot/dts/pcm030.dts @@ -12,246 +12,92 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "phytec,pcm030";  	compatible = "phytec,pcm030"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;	// L1, 16K -			i-cache-size = <0x4000>;	// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	}; - -	memory { -		device_type = "memory"; -		reg = <0x00000000 0x04000000>;	// 64MB -	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; - -		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>; +		timer@600 {		// General Purpose Timer  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; -  		gpt2: timer@620 {	// General Purpose Timer in GPIO mode  			compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt3: timer@630 {	// General Purpose Timer in GPIO mode  			compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt4: timer@640 {	// General Purpose Timer in GPIO mode  			compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt5: timer@650 {	// General Purpose Timer in GPIO mode  			compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt6: timer@660 {	// General Purpose Timer in GPIO mode  			compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt7: timer@670 {	// General Purpose Timer in GPIO mode  			compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		rtc@800 {	// Real time clock -			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; -			reg = <0x800 0x100>; -			interrupts = <1 5 0 1 6 0>; -		}; - -		can@900 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 17 0>; -			reg = <0x900 0x80>; -		}; - -		can@980 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 18 0>; -			reg = <0x980 0x80>; -		}; - -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>;  			gpio-controller;  			#gpio-cells = <2>;  		}; -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; -		}; - -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0xff>; -			interrupts = <2 6 0>; -		}; - -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; -		}; - -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; -		}; - -		ac97@2000 { /* PSC1 in ac97 mode */ +		psc@2000 { /* PSC1 in ac97 mode */  			compatible = "mpc5200b-psc-ac97","fsl,mpc5200b-psc-ac97";  			cell-index = <0>; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>;  		};  		/* PSC2 port is used by CAN1/2 */ +		psc@2200 { +			status = "disabled"; +		}; -		serial@2400 { /* PSC3 in UART mode */ +		psc@2400 { /* PSC3 in UART mode */  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			cell-index = <2>; -			reg = <0x2400 0x100>; -			interrupts = <2 3 0>;  		};  		/* PSC4 is ??? */ +		psc@2600 { +			status = "disabled"; +		};  		/* PSC5 is ??? */ +		psc@2800 { +			status = "disabled"; +		}; -		serial@2c00 { /* PSC6 in UART mode */ +		psc@2c00 { /* PSC6 in UART mode */  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			cell-index = <5>; -			reg = <0x2c00 0x100>; -			interrupts = <2 4 0>;  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;	// fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;	// these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; -		}; - -		i2c@3d00 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d00 0x40>; -			interrupts = <2 15 0>; -		}; -  		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>;  			rtc@51 {  				compatible = "nxp,pcf8563";  				reg = <0x51>; @@ -259,6 +105,7 @@  			eeprom@52 {  				compatible = "catalyst,24c32";  				reg = <0x52>; +				pagesize = <32>;  			};  		}; @@ -269,12 +116,6 @@  	};  	pci@f0000d00 { -		#interrupt-cells = <1>; -		#size-cells = <2>; -		#address-cells = <3>; -		device_type = "pci"; -		compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; -		reg = <0xf0000d00 0x100>;  		interrupt-map-mask = <0xf800 0 0 7>;  		interrupt-map = <0xc000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot  				 0xc000 0 0 2 &mpc5200_pic 1 1 3 @@ -285,11 +126,12 @@  				 0xc800 0 0 2 &mpc5200_pic 1 2 3  				 0xc800 0 0 3 &mpc5200_pic 1 3 3  				 0xc800 0 0 4 &mpc5200_pic 0 0 3>; -		clock-frequency = <0>; // From boot loader -		interrupts = <2 8 0 2 9 0 2 10 0>; -		bus-range = <0 0>;  		ranges = <0x42000000 0 0x80000000 0x80000000 0 0x20000000  			  0x02000000 0 0xa0000000 0xa0000000 0 0x10000000  			  0x01000000 0 0x00000000 0xb0000000 0 0x01000000>;  	}; + +	localbus { +		status = "disabled"; +	};  }; diff --git a/arch/powerpc/boot/dts/pcm032.dts b/arch/powerpc/boot/dts/pcm032.dts index 85d857a5d46e..1dd478bfff96 100644 --- a/arch/powerpc/boot/dts/pcm032.dts +++ b/arch/powerpc/boot/dts/pcm032.dts @@ -12,99 +12,37 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "phytec,pcm032";  	compatible = "phytec,pcm032"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;	// L1, 16K -			i-cache-size = <0x4000>;	// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	};  	memory { -		device_type = "memory";  		reg = <0x00000000 0x08000000>;	// 128MB  	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; - -		timer@600 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>; +		timer@600 {		// General Purpose Timer  			fsl,has-wdt;  		}; -		timer@610 {	// General Purpose Timer -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>; -		}; -  		gpt2: timer@620 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt3: timer@630 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x630 0x10>; -			interrupts = <1 12 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt4: timer@640 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt5: timer@650 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>;  			gpio-controller;  			#gpio-cells = <2>;  		}; @@ -118,163 +56,62 @@  		};  		gpt7: timer@670 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>;  			gpio-controller;  			#gpio-cells = <2>;  		}; -		rtc@800 {	// Real time clock -			compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; -			reg = <0x800 0x100>; -			interrupts = <1 5 0 1 6 0>; -		}; - -		can@900 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 17 0>; -			reg = <0x900 0x80>; -		}; - -		can@980 { -			compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; -			interrupts = <2 18 0>; -			reg = <0x980 0x80>; -		}; - -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; -		}; - -		spi@f00 { -			compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; -			reg = <0xf00 0x20>; -			interrupts = <2 13 0 2 14 0>; -		}; - -		usb@1000 { -			compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; -			reg = <0x1000 0xff>; -			interrupts = <2 6 0>; -		}; - -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; -		}; - -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; -		}; - -		ac97@2000 {	/* PSC1 is ac97 */ +		psc@2000 {	/* PSC1 is ac97 */  			compatible = "fsl,mpc5200b-psc-ac97","fsl,mpc5200-psc-ac97";  			cell-index = <0>; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>;  		};  		/* PSC2 port is used by CAN1/2 */ +		psc@2200 { +			status = "disabled"; +		}; -		serial@2400 { /* PSC3 in UART mode */ +		psc@2400 { /* PSC3 in UART mode */  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			cell-index = <2>; -			reg = <0x2400 0x100>; -			interrupts = <2 3 0>;  		};  		/* PSC4 is ??? */ +		psc@2600 { +			status = "disabled"; +		};  		/* PSC5 is ??? */ +		psc@2800 { +			status = "disabled"; +		}; -		serial@2c00 { /* PSC6 in UART mode */ +		psc@2c00 { /* PSC6 in UART mode */  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			cell-index = <5>; -			reg = <0x2c00 0x100>; -			interrupts = <2 4 0>;  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;	// fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;	// these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; -		}; - -		i2c@3d00 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d00 0x40>; -			interrupts = <2 15 0>; -		}; -  		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>;  			rtc@51 {  				compatible = "nxp,pcf8563";  				reg = <0x51>;  			};  			eeprom@52 { -				compatible = "at24,24c32"; +				compatible = "catalyst,24c32";  				reg = <0x52>; +				pagesize = <32>;  			};  		}; - -		sram@8000 { -			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; -			reg = <0x8000 0x4000>; -		};  	};  	pci@f0000d00 { -		#interrupt-cells = <1>; -		#size-cells = <2>; -		#address-cells = <3>; -		device_type = "pci"; -		compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; -		reg = <0xf0000d00 0x100>;  		interrupt-map-mask = <0xf800 0 0 7>;  		interrupt-map = <0xc000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot  				 0xc000 0 0 2 &mpc5200_pic 1 1 3 @@ -285,20 +122,12 @@  				 0xc800 0 0 2 &mpc5200_pic 1 2 3  				 0xc800 0 0 3 &mpc5200_pic 1 3 3  				 0xc800 0 0 4 &mpc5200_pic 0 0 3>; -		clock-frequency = <0>; // From boot loader -		interrupts = <2 8 0 2 9 0 2 10 0>; -		bus-range = <0 0>;  		ranges = <0x42000000 0 0x80000000 0x80000000 0 0x20000000  			  0x02000000 0 0xa0000000 0xa0000000 0 0x10000000  			  0x01000000 0 0x00000000 0xb0000000 0 0x01000000>;  	};  	localbus { -		compatible = "fsl,mpc5200b-lpb","fsl,mpc5200-lpb","simple-bus"; - -		#address-cells = <2>; -		#size-cells = <1>; -  		ranges = <0 0 0xfe000000 0x02000000  			  1 0 0xfc000000 0x02000000  			  2 0 0xfbe00000 0x00200000 @@ -351,40 +180,39 @@  			bank-width = <2>;  		}; -                /* +		/*  		 * example snippets for FPGA  		 *  		 * fpga@3,0 { -		 *         compatible = "fpga_driver"; -		 *         reg = <3 0 0x02000000>; -		 *         bank-width = <4>; +		 *	 compatible = "fpga_driver"; +		 *	 reg = <3 0 0x02000000>; +		 *	 bank-width = <4>;  		 * };  		 *  		 * fpga@4,0 { -		 *         compatible = "fpga_driver"; -		 *         reg = <4 0 0x02000000>; -		 *         bank-width = <4>; +		 *	 compatible = "fpga_driver"; +		 *	 reg = <4 0 0x02000000>; +		 *	 bank-width = <4>;  		 * }; -                 */ +		 */ -                /* +		/*  		 * example snippets for free chipselects -                 * +		 *  		 * device@5,0 { -		 *         compatible = "custom_driver"; -		 *         reg = <5 0 0x02000000>; +		 *	 compatible = "custom_driver"; +		 *	 reg = <5 0 0x02000000>;  		 * }; -                 * +		 *  		 * device@6,0 { -		 *         compatible = "custom_driver"; -		 *         reg = <6 0 0x02000000>; +		 *	 compatible = "custom_driver"; +		 *	 reg = <6 0 0x02000000>;  		 * }; -                 * +		 *  		 * device@7,0 { -		 *         compatible = "custom_driver"; -		 *         reg = <7 0 0x02000000>; +		 *	 compatible = "custom_driver"; +		 *	 reg = <7 0 0x02000000>;  		 * }; -                 */ +		 */  	};  }; - diff --git a/arch/powerpc/boot/dts/uc101.dts b/arch/powerpc/boot/dts/uc101.dts index 019264c62904..ba83d5488ec6 100644 --- a/arch/powerpc/boot/dts/uc101.dts +++ b/arch/powerpc/boot/dts/uc101.dts @@ -11,79 +11,24 @@   * option) any later version.   */ -/dts-v1/; +/include/ "mpc5200b.dtsi"  / {  	model = "manroland,uc101";  	compatible = "manroland,uc101"; -	#address-cells = <1>; -	#size-cells = <1>; -	interrupt-parent = <&mpc5200_pic>; - -	cpus { -		#address-cells = <1>; -		#size-cells = <0>; - -		PowerPC,5200@0 { -			device_type = "cpu"; -			reg = <0>; -			d-cache-line-size = <32>; -			i-cache-line-size = <32>; -			d-cache-size = <0x4000>;	// L1, 16K -			i-cache-size = <0x4000>;	// L1, 16K -			timebase-frequency = <0>;	// from bootloader -			bus-frequency = <0>;		// from bootloader -			clock-frequency = <0>;		// from bootloader -		}; -	}; - -	memory { -		device_type = "memory"; -		reg = <0x00000000 0x04000000>;	// 64MB -	};  	soc5200@f0000000 { -		#address-cells = <1>; -		#size-cells = <1>; -		compatible = "fsl,mpc5200b-immr"; -		ranges = <0 0xf0000000 0x0000c000>; -		reg = <0xf0000000 0x00000100>; -		bus-frequency = <0>;		// from bootloader -		system-frequency = <0>;		// from bootloader - -		cdm@200 { -			compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; -			reg = <0x200 0x38>; -		}; - -		mpc5200_pic: interrupt-controller@500 { -			// 5200 interrupts are encoded into two levels; -			interrupt-controller; -			#interrupt-cells = <3>; -			compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; -			reg = <0x500 0x80>; -		}; -  		gpt0: timer@600 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x600 0x10>; -			interrupts = <1 9 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt1: timer@610 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x610 0x10>; -			interrupts = <1 10 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt2: timer@620 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x620 0x10>; -			interrupts = <1 11 0>;  			gpio-controller;  			#gpio-cells = <2>;  		}; @@ -97,118 +42,85 @@  		};  		gpt4: timer@640 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x640 0x10>; -			interrupts = <1 13 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt5: timer@650 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x650 0x10>; -			interrupts = <1 14 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt6: timer@660 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x660 0x10>; -			interrupts = <1 15 0>;  			gpio-controller;  			#gpio-cells = <2>;  		};  		gpt7: timer@670 {	// General Purpose Timer in GPIO mode -			compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; -			reg = <0x670 0x10>; -			interrupts = <1 16 0>;  			gpio-controller;  			#gpio-cells = <2>;  		}; -		gpio_simple: gpio@b00 { -			compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; -			reg = <0xb00 0x40>; -			interrupts = <1 7 0>; -			gpio-controller; -			#gpio-cells = <2>; +		rtc@800 { +			status = "disabled";  		}; -		gpio_wkup: gpio@c00 { -			compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; -			reg = <0xc00 0x40>; -			interrupts = <1 8 0 0 3 0>; -			gpio-controller; -			#gpio-cells = <2>; +		can@900 { +			status = "disabled"; +		}; + +		can@980 { +			status = "disabled";  		}; -		dma-controller@1200 { -			compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; -			reg = <0x1200 0x80>; -			interrupts = <3 0 0  3 1 0  3 2 0  3 3 0 -			              3 4 0  3 5 0  3 6 0  3 7 0 -			              3 8 0  3 9 0  3 10 0  3 11 0 -			              3 12 0  3 13 0  3 14 0  3 15 0>; +		spi@f00 { +			status = "disabled";  		}; -		xlb@1f00 { -			compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; -			reg = <0x1f00 0x100>; +		usb@1000 { +			status = "disabled";  		}; -		serial@2000 { /* PSC1 in UART mode */ +		psc@2000 {	// PSC1  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2000 0x100>; -			interrupts = <2 1 0>;  		}; -		serial@2200 { /* PSC2 in UART mode */ +		psc@2200 {	// PSC2  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2200 0x100>; -			interrupts = <2 2 0>;  		}; -		serial@2c00 {		/* PSC6 in UART mode */ +		psc@2400 {	// PSC3 +			status = "disabled"; +		}; + +		psc@2600 {	// PSC4 +			status = "disabled"; +		}; + +		psc@2800 {	// PSC5 +			status = "disabled"; +		}; + +		psc@2c00 {	// PSC6  			compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; -			reg = <0x2c00 0x100>; -			interrupts = <2 4 0>;  		};  		ethernet@3000 { -			compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; -			reg = <0x3000 0x400>; -			local-mac-address = [ 00 00 00 00 00 00 ]; -			interrupts = <2 5 0>;  			phy-handle = <&phy0>;  		};  		mdio@3000 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; -			reg = <0x3000 0x400>;	// fec range, since we need to setup fec interrupts -			interrupts = <2 5 0>;	// these are for "mii command finished", not link changes & co. -  			phy0: ethernet-phy@0 {  				compatible = "intel,lxt971";  				reg = <0>;  			};  		}; -		ata@3a00 { -			compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; -			reg = <0x3a00 0x100>; -			interrupts = <2 7 0>; +		i2c@3d00 { +			status = "disabled";  		};  		i2c@3d40 { -			#address-cells = <1>; -			#size-cells = <0>; -			compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; -			reg = <0x3d40 0x40>; -			interrupts = <2 16 0>;  			fsl,preserve-clocking;  			clock-frequency = <400000>; @@ -221,19 +133,13 @@  				reg = <0x51>;  			};  		}; +	}; -		sram@8000 { -			compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; -			reg = <0x8000 0x4000>; -		}; +	pci@f0000d00 { +		status = "disabled";  	};  	localbus { -		compatible = "fsl,mpc5200b-lpb","fsl,mpc5200-lpb","simple-bus"; - -		#address-cells = <2>; -		#size-cells = <1>; -  		ranges = <0 0 0xff800000 0x00800000  			  1 0 0x80000000 0x00800000  			  3 0 0x80000000 0x00800000>; diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h index ae26f2efd089..d72757585595 100644 --- a/arch/powerpc/include/asm/prom.h +++ b/arch/powerpc/include/asm/prom.h @@ -42,7 +42,7 @@ extern void pci_create_OF_bus_map(void);  /* Translate a DMA address from device space to CPU space */  extern u64 of_translate_dma_address(struct device_node *dev, -				    const u32 *in_addr); +				    const __be32 *in_addr);  #ifdef CONFIG_PCI  extern unsigned long pci_address_to_pio(phys_addr_t address); @@ -63,9 +63,6 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);  /* cache lookup */  struct device_node *of_find_next_cache_node(struct device_node *np); -/* Get the MAC address */ -extern const void *of_get_mac_address(struct device_node *np); -  #ifdef CONFIG_NUMA  extern int of_node_to_nid(struct device_node *device);  #else diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 88334af038e5..c2b7a07cc3d3 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c @@ -117,41 +117,3 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,  	cells = prop ? *(u32 *)prop : of_n_size_cells(dn);  	*size = of_read_number(dma_window, cells);  } - -/** - * Search the device tree for the best MAC address to use.  'mac-address' is - * checked first, because that is supposed to contain to "most recent" MAC - * address. If that isn't set, then 'local-mac-address' is checked next, - * because that is the default address.  If that isn't set, then the obsolete - * 'address' is checked, just in case we're using an old device tree. - * - * Note that the 'address' property is supposed to contain a virtual address of - * the register set, but some DTS files have redefined that property to be the - * MAC address. - * - * All-zero MAC addresses are rejected, because those could be properties that - * exist in the device tree, but were not set by U-Boot.  For example, the - * DTS could define 'mac-address' and 'local-mac-address', with zero MAC - * addresses.  Some older U-Boots only initialized 'local-mac-address'.  In - * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists - * but is all zeros. -*/ -const void *of_get_mac_address(struct device_node *np) -{ -	struct property *pp; - -	pp = of_find_property(np, "mac-address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	pp = of_find_property(np, "local-mac-address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	pp = of_find_property(np, "address", NULL); -	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) -		return pp->value; - -	return NULL; -} -EXPORT_SYMBOL(of_get_mac_address); diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c index 546bbc229d19..2521d93ef136 100644 --- a/arch/powerpc/platforms/40x/ppc40x_simple.c +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c @@ -50,7 +50,7 @@ machine_device_initcall(ppc40x_simple, ppc40x_device_probe);   * Again, if your board needs to do things differently then create a   * board.c file for it rather than adding it to this list.   */ -static char *board[] __initdata = { +static const char *board[] __initdata = {  	"amcc,acadia",  	"amcc,haleakala",  	"amcc,kilauea", @@ -60,14 +60,9 @@ static char *board[] __initdata = {  static int __init ppc40x_probe(void)  { -	unsigned long root = of_get_flat_dt_root(); -	int i = 0; - -	for (i = 0; i < ARRAY_SIZE(board); i++) { -		if (of_flat_dt_is_compatible(root, board[i])) { -			ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC); -			return 1; -		} +	if (of_flat_dt_match(of_get_flat_dt_root(), board)) { +		ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC); +		return 1;  	}  	return 0; diff --git a/arch/powerpc/platforms/512x/mpc5121_generic.c b/arch/powerpc/platforms/512x/mpc5121_generic.c index e487eb06ec6b..926731f1ff01 100644 --- a/arch/powerpc/platforms/512x/mpc5121_generic.c +++ b/arch/powerpc/platforms/512x/mpc5121_generic.c @@ -26,7 +26,7 @@  /*   * list of supported boards   */ -static char *board[] __initdata = { +static const char *board[] __initdata = {  	"prt,prtlvt",  	NULL  }; @@ -36,16 +36,7 @@ static char *board[] __initdata = {   */  static int __init mpc5121_generic_probe(void)  { -	unsigned long node = of_get_flat_dt_root(); -	int i = 0; - -	while (board[i]) { -		if (of_flat_dt_is_compatible(node, board[i])) -			break; -		i++; -	} - -	return board[i] != NULL; +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  define_machine(mpc5121_generic) { diff --git a/arch/powerpc/platforms/52xx/lite5200.c b/arch/powerpc/platforms/52xx/lite5200.c index de55bc0584b5..01ffa64d2aa7 100644 --- a/arch/powerpc/platforms/52xx/lite5200.c +++ b/arch/powerpc/platforms/52xx/lite5200.c @@ -172,20 +172,18 @@ static void __init lite5200_setup_arch(void)  	mpc52xx_setup_pci();  } +static const char *board[] __initdata = { +	"fsl,lite5200", +	"fsl,lite5200b", +	NULL, +}; +  /*   * Called very early, MMU is off, device-tree isn't unflattened   */  static int __init lite5200_probe(void)  { -	unsigned long node = of_get_flat_dt_root(); -	const char *model = of_get_flat_dt_prop(node, "model", NULL); - -	if (!of_flat_dt_is_compatible(node, "fsl,lite5200") && -	    !of_flat_dt_is_compatible(node, "fsl,lite5200b")) -		return 0; -	pr_debug("%s board found\n", model ? model : "unknown"); - -	return 1; +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  define_machine(lite5200) { diff --git a/arch/powerpc/platforms/52xx/media5200.c b/arch/powerpc/platforms/52xx/media5200.c index 0bac3a3dbecf..2c7780cb68e5 100644 --- a/arch/powerpc/platforms/52xx/media5200.c +++ b/arch/powerpc/platforms/52xx/media5200.c @@ -239,7 +239,7 @@ static void __init media5200_setup_arch(void)  }  /* list of the supported boards */ -static char *board[] __initdata = { +static const char *board[] __initdata = {  	"fsl,media5200",  	NULL  }; @@ -249,16 +249,7 @@ static char *board[] __initdata = {   */  static int __init media5200_probe(void)  { -	unsigned long node = of_get_flat_dt_root(); -	int i = 0; - -	while (board[i]) { -		if (of_flat_dt_is_compatible(node, board[i])) -			break; -		i++; -	} - -	return (board[i] != NULL); +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  define_machine(media5200_platform) { diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c b/arch/powerpc/platforms/52xx/mpc5200_simple.c index d45be5b5ad49..e36d6e232ae6 100644 --- a/arch/powerpc/platforms/52xx/mpc5200_simple.c +++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c @@ -49,7 +49,7 @@ static void __init mpc5200_simple_setup_arch(void)  }  /* list of the supported boards */ -static char *board[] __initdata = { +static const char *board[] __initdata = {  	"intercontrol,digsy-mtc",  	"manroland,mucmc52",  	"manroland,uc101", @@ -66,16 +66,7 @@ static char *board[] __initdata = {   */  static int __init mpc5200_simple_probe(void)  { -	unsigned long node = of_get_flat_dt_root(); -	int i = 0; - -	while (board[i]) { -		if (of_flat_dt_is_compatible(node, board[i])) -			break; -		i++; -	} -	 -	return (board[i] != NULL); +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  define_machine(mpc5200_simple_platform) { diff --git a/arch/powerpc/platforms/83xx/mpc830x_rdb.c b/arch/powerpc/platforms/83xx/mpc830x_rdb.c index 846831d495b5..661d354e4ff2 100644 --- a/arch/powerpc/platforms/83xx/mpc830x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc830x_rdb.c @@ -57,16 +57,19 @@ static void __init mpc830x_rdb_init_IRQ(void)  	ipic_set_default_priority();  } +struct const char *board[] __initdata = { +	"MPC8308RDB", +	"fsl,mpc8308rdb", +	"denx,mpc8308_p1m", +	NULL +} +  /*   * Called very early, MMU is off, device-tree isn't unflattened   */  static int __init mpc830x_rdb_probe(void)  { -	unsigned long root = of_get_flat_dt_root(); - -	return of_flat_dt_is_compatible(root, "MPC8308RDB") || -	       of_flat_dt_is_compatible(root, "fsl,mpc8308rdb") || -	       of_flat_dt_is_compatible(root, "denx,mpc8308_p1m"); +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  static struct of_device_id __initdata of_bus_ids[] = { diff --git a/arch/powerpc/platforms/83xx/mpc831x_rdb.c b/arch/powerpc/platforms/83xx/mpc831x_rdb.c index ae525e4745d2..b54cd736a895 100644 --- a/arch/powerpc/platforms/83xx/mpc831x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc831x_rdb.c @@ -60,15 +60,18 @@ static void __init mpc831x_rdb_init_IRQ(void)  	ipic_set_default_priority();  } +struct const char *board[] __initdata = { +	"MPC8313ERDB", +	"fsl,mpc8315erdb", +	NULL +} +  /*   * Called very early, MMU is off, device-tree isn't unflattened   */  static int __init mpc831x_rdb_probe(void)  { -	unsigned long root = of_get_flat_dt_root(); - -	return of_flat_dt_is_compatible(root, "MPC8313ERDB") || -	       of_flat_dt_is_compatible(root, "fsl,mpc8315erdb"); +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  static struct of_device_id __initdata of_bus_ids[] = { diff --git a/arch/powerpc/platforms/83xx/mpc837x_rdb.c b/arch/powerpc/platforms/83xx/mpc837x_rdb.c index 910caa6b5810..7bafbf2ec0f9 100644 --- a/arch/powerpc/platforms/83xx/mpc837x_rdb.c +++ b/arch/powerpc/platforms/83xx/mpc837x_rdb.c @@ -101,17 +101,20 @@ static void __init mpc837x_rdb_init_IRQ(void)  	ipic_set_default_priority();  } +static const char *board[] __initdata = { +	"fsl,mpc8377rdb", +	"fsl,mpc8378rdb", +	"fsl,mpc8379rdb", +	"fsl,mpc8377wlan", +	NULL +}; +  /*   * Called very early, MMU is off, device-tree isn't unflattened   */  static int __init mpc837x_rdb_probe(void)  { -	unsigned long root = of_get_flat_dt_root(); - -	return of_flat_dt_is_compatible(root, "fsl,mpc8377rdb") || -	       of_flat_dt_is_compatible(root, "fsl,mpc8378rdb") || -	       of_flat_dt_is_compatible(root, "fsl,mpc8379rdb") || -	       of_flat_dt_is_compatible(root, "fsl,mpc8377wlan"); +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  define_machine(mpc837x_rdb) { diff --git a/arch/powerpc/platforms/85xx/tqm85xx.c b/arch/powerpc/platforms/85xx/tqm85xx.c index 8f29bbce5360..5e847d0b47c8 100644 --- a/arch/powerpc/platforms/85xx/tqm85xx.c +++ b/arch/powerpc/platforms/85xx/tqm85xx.c @@ -186,21 +186,21 @@ static int __init declare_of_platform_devices(void)  }  machine_device_initcall(tqm85xx, declare_of_platform_devices); +static const char *board[] __initdata = { +	"tqc,tqm8540", +	"tqc,tqm8541", +	"tqc,tqm8548", +	"tqc,tqm8555", +	"tqc,tqm8560", +	NULL +}; +  /*   * Called very early, device-tree isn't unflattened   */  static int __init tqm85xx_probe(void)  { -	unsigned long root = of_get_flat_dt_root(); - -	if ((of_flat_dt_is_compatible(root, "tqc,tqm8540")) || -	    (of_flat_dt_is_compatible(root, "tqc,tqm8541")) || -	    (of_flat_dt_is_compatible(root, "tqc,tqm8548")) || -	    (of_flat_dt_is_compatible(root, "tqc,tqm8555")) || -	    (of_flat_dt_is_compatible(root, "tqc,tqm8560"))) -		return 1; - -	return 0; +	return of_flat_dt_match(of_get_flat_dt_root(), board);  }  define_machine(tqm85xx) { diff --git a/arch/powerpc/sysdev/mv64x60_dev.c b/arch/powerpc/sysdev/mv64x60_dev.c index 1398bc454999..feaee402e2d6 100644 --- a/arch/powerpc/sysdev/mv64x60_dev.c +++ b/arch/powerpc/sysdev/mv64x60_dev.c @@ -16,6 +16,7 @@  #include <linux/mv643xx.h>  #include <linux/platform_device.h>  #include <linux/of_platform.h> +#include <linux/of_net.h>  #include <linux/dma-mapping.h>  #include <asm/prom.h> diff --git a/arch/powerpc/sysdev/tsi108_dev.c b/arch/powerpc/sysdev/tsi108_dev.c index d4d15aaf18fa..c2d675b6392c 100644 --- a/arch/powerpc/sysdev/tsi108_dev.c +++ b/arch/powerpc/sysdev/tsi108_dev.c @@ -19,6 +19,7 @@  #include <linux/module.h>  #include <linux/device.h>  #include <linux/platform_device.h> +#include <linux/of_net.h>  #include <asm/tsi108.h>  #include <asm/system.h> diff --git a/arch/sparc/kernel/auxio_32.c b/arch/sparc/kernel/auxio_32.c index 35f48837871a..8505e0ac78ba 100644 --- a/arch/sparc/kernel/auxio_32.c +++ b/arch/sparc/kernel/auxio_32.c @@ -121,7 +121,7 @@ void __init auxio_power_probe(void)  	node = prom_searchsiblings(node, "obio");  	node = prom_getchild(node);  	node = prom_searchsiblings(node, "power"); -	if (node == 0 || node == -1) +	if (node == 0 || (s32)node == -1)  		return;  	/* Map the power control register. */ diff --git a/arch/sparc/kernel/starfire.c b/arch/sparc/kernel/starfire.c index a4446c0fb7a1..82281a566bb8 100644 --- a/arch/sparc/kernel/starfire.c +++ b/arch/sparc/kernel/starfire.c @@ -24,7 +24,7 @@ int this_is_starfire = 0;  void check_if_starfire(void)  {  	phandle ssnode = prom_finddevice("/ssp-serial"); -	if (ssnode != 0 && ssnode != -1) +	if (ssnode != 0 && (s32)ssnode != -1)  		this_is_starfire = 1;  } diff --git a/arch/sparc/prom/init_32.c b/arch/sparc/prom/init_32.c index d342dba4dd54..0a601b300639 100644 --- a/arch/sparc/prom/init_32.c +++ b/arch/sparc/prom/init_32.c @@ -60,7 +60,7 @@ void __init prom_init(struct linux_romvec *rp)  	prom_nodeops = romvec->pv_nodeops;  	prom_root_node = prom_getsibling(0); -	if((prom_root_node == 0) || (prom_root_node == -1)) +	if ((prom_root_node == 0) || ((s32)prom_root_node == -1))  		prom_halt();  	if((((unsigned long) prom_nodeops) == 0) ||  diff --git a/arch/sparc/prom/init_64.c b/arch/sparc/prom/init_64.c index 9c6ac4b81ded..5016c5e20575 100644 --- a/arch/sparc/prom/init_64.c +++ b/arch/sparc/prom/init_64.c @@ -35,13 +35,13 @@ void __init prom_init(void *cif_handler, void *cif_stack)  	prom_cif_init(cif_handler, cif_stack);  	prom_chosen_node = prom_finddevice(prom_chosen_path); -	if (!prom_chosen_node || prom_chosen_node == -1) +	if (!prom_chosen_node || (s32)prom_chosen_node == -1)  		prom_halt();  	prom_stdout = prom_getint(prom_chosen_node, "stdout");  	node = prom_finddevice("/openprom"); -	if (!node || node == -1) +	if (!node || (s32)node == -1)  		prom_halt();  	prom_getstring(node, "version", prom_version, sizeof(prom_version)); diff --git a/arch/sparc/prom/tree_32.c b/arch/sparc/prom/tree_32.c index bc8e4cb87a68..f30e8d038f01 100644 --- a/arch/sparc/prom/tree_32.c +++ b/arch/sparc/prom/tree_32.c @@ -40,11 +40,11 @@ phandle prom_getchild(phandle node)  {  	phandle cnode; -	if (node == -1) +	if ((s32)node == -1)  		return 0;  	cnode = __prom_getchild(node); -	if (cnode == 0 || cnode == -1) +	if (cnode == 0 || (s32)cnode == -1)  		return 0;  	return cnode; @@ -72,11 +72,11 @@ phandle prom_getsibling(phandle node)  {  	phandle sibnode; -	if (node == -1) +	if ((s32)node == -1)  		return 0;  	sibnode = __prom_getsibling(node); -	if (sibnode == 0 || sibnode == -1) +	if (sibnode == 0 || (s32)sibnode == -1)  		return 0;  	return sibnode; @@ -219,7 +219,7 @@ static char *__prom_nextprop(phandle node, char * oprop)   */  char *prom_nextprop(phandle node, char *oprop, char *buffer)  { -	if (node == 0 || node == -1) +	if (node == 0 || (s32)node == -1)  		return "";  	return __prom_nextprop(node, oprop); @@ -253,7 +253,7 @@ phandle prom_finddevice(char *name)  				if (d != s + 3 && (!*d || *d == '/')  				    && d <= s + 3 + 8) {  					node2 = node; -					while (node2 && node2 != -1) { +					while (node2 && (s32)node2 != -1) {  						if (prom_getproperty (node2, "reg", (char *)reg, sizeof (reg)) > 0) {  							if (which_io == reg[0].which_io && phys_addr == reg[0].phys_addr) {  								node = node2; @@ -261,7 +261,7 @@ phandle prom_finddevice(char *name)  							}  						}  						node2 = prom_getsibling(node2); -						if (!node2 || node2 == -1) +						if (!node2 || (s32)node2 == -1)  							break;  						node2 = prom_searchsiblings(prom_getsibling(node2), nbuf);  					} @@ -303,6 +303,7 @@ phandle prom_inst2pkg(int inst)  	node = (*romvec->pv_v2devops.v2_inst2pkg)(inst);  	restore_current();  	spin_unlock_irqrestore(&prom_lock, flags); -	if (node == -1) return 0; +	if ((s32)node == -1) +		return 0;  	return node;  } diff --git a/arch/sparc/prom/tree_64.c b/arch/sparc/prom/tree_64.c index d93660048376..92204c3800b5 100644 --- a/arch/sparc/prom/tree_64.c +++ b/arch/sparc/prom/tree_64.c @@ -43,10 +43,10 @@ inline phandle prom_getchild(phandle node)  {  	phandle cnode; -	if (node == -1) +	if ((s32)node == -1)  		return 0;  	cnode = __prom_getchild(node); -	if (cnode == -1) +	if ((s32)cnode == -1)  		return 0;  	return cnode;  } @@ -56,10 +56,10 @@ inline phandle prom_getparent(phandle node)  {  	phandle cnode; -	if (node == -1) +	if ((s32)node == -1)  		return 0;  	cnode = prom_node_to_node("parent", node); -	if (cnode == -1) +	if ((s32)cnode == -1)  		return 0;  	return cnode;  } @@ -76,10 +76,10 @@ inline phandle prom_getsibling(phandle node)  {  	phandle sibnode; -	if (node == -1) +	if ((s32)node == -1)  		return 0;  	sibnode = __prom_getsibling(node); -	if (sibnode == -1) +	if ((s32)sibnode == -1)  		return 0;  	return sibnode; @@ -240,7 +240,7 @@ inline char *prom_firstprop(phandle node, char *buffer)  	unsigned long args[7];  	*buffer = 0; -	if (node == -1) +	if ((s32)node == -1)  		return buffer;  	args[0] = (unsigned long) prom_nextprop_name; @@ -266,7 +266,7 @@ inline char *prom_nextprop(phandle node, const char *oprop, char *buffer)  	unsigned long args[7];  	char buf[32]; -	if (node == -1) { +	if ((s32)node == -1) {  		*buffer = 0;  		return buffer;  	} @@ -369,7 +369,7 @@ inline phandle prom_inst2pkg(int inst)  	p1275_cmd_direct(args);  	node = (int) args[4]; -	if (node == -1) +	if ((s32)node == -1)  		return 0;  	return node;  } diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 035da9e64a17..f27c04e18aaa 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -69,6 +69,8 @@  #ifdef CONFIG_PPC_OF  #include <linux/of_device.h>  #include <linux/of_platform.h> +#include <linux/of_address.h> +#include <linux/of_irq.h>  #endif  #define PFX "ipmi_si: " @@ -2546,7 +2548,7 @@ static int __devinit ipmi_of_probe(struct platform_device *dev,  {  	struct smi_info *info;  	struct resource resource; -	const int *regsize, *regspacing, *regshift; +	const __be32 *regsize, *regspacing, *regshift;  	struct device_node *np = dev->dev.of_node;  	int ret;  	int proplen; @@ -2599,9 +2601,9 @@ static int __devinit ipmi_of_probe(struct platform_device *dev,  	info->io.addr_data	= resource.start; -	info->io.regsize	= regsize ? *regsize : DEFAULT_REGSIZE; -	info->io.regspacing	= regspacing ? *regspacing : DEFAULT_REGSPACING; -	info->io.regshift	= regshift ? *regshift : 0; +	info->io.regsize	= regsize ? be32_to_cpup(regsize) : DEFAULT_REGSIZE; +	info->io.regspacing	= regspacing ? be32_to_cpup(regspacing) : DEFAULT_REGSPACING; +	info->io.regshift	= regshift ? be32_to_cpup(regshift) : 0;  	info->irq		= irq_of_parse_and_map(dev->dev.of_node, 0);  	info->dev		= &dev->dev; diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 559b0b3c16c3..ab1ad41786d1 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -20,6 +20,7 @@  #include <linux/log2.h>  #include <linux/bitops.h>  #include <linux/jiffies.h> +#include <linux/of.h>  #include <linux/i2c.h>  #include <linux/i2c/at24.h> @@ -457,6 +458,27 @@ static ssize_t at24_macc_write(struct memory_accessor *macc, const char *buf,  /*-------------------------------------------------------------------------*/ +#ifdef CONFIG_OF +static void at24_get_ofdata(struct i2c_client *client, +		struct at24_platform_data *chip) +{ +	const __be32 *val; +	struct device_node *node = client->dev.of_node; + +	if (node) { +		if (of_get_property(node, "read-only", NULL)) +			chip->flags |= AT24_FLAG_READONLY; +		val = of_get_property(node, "pagesize", NULL); +		if (val) +			chip->page_size = be32_to_cpup(val); +	} +} +#else +static void at24_get_ofdata(struct i2c_client *client, +		struct at24_platform_data *chip) +{ } +#endif /* CONFIG_OF */ +  static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  {  	struct at24_platform_data chip; @@ -485,6 +507,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  		 */  		chip.page_size = 1; +		/* update chipdata if OF is present */ +		at24_get_ofdata(client, &chip); +  		chip.setup = NULL;  		chip.context = NULL;  	} @@ -492,6 +517,11 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  	if (!is_power_of_2(chip.byte_len))  		dev_warn(&client->dev,  			"byte_len looks suspicious (no power of 2)!\n"); +	if (!chip.page_size) { +		dev_err(&client->dev, "page_size must not be 0!\n"); +		err = -EINVAL; +		goto err_out; +	}  	if (!is_power_of_2(chip.page_size))  		dev_warn(&client->dev,  			"page_size looks suspicious (no power of 2)!\n"); @@ -597,19 +627,15 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)  	i2c_set_clientdata(client, at24); -	dev_info(&client->dev, "%zu byte %s EEPROM %s\n", +	dev_info(&client->dev, "%zu byte %s EEPROM, %s, %u bytes/write\n",  		at24->bin.size, client->name, -		writable ? "(writable)" : "(read-only)"); +		writable ? "writable" : "read-only", at24->write_max);  	if (use_smbus == I2C_SMBUS_WORD_DATA ||  	    use_smbus == I2C_SMBUS_BYTE_DATA) {  		dev_notice(&client->dev, "Falling back to %s reads, "  			   "performance will suffer\n", use_smbus ==  			   I2C_SMBUS_WORD_DATA ? "word" : "byte");  	} -	dev_dbg(&client->dev, -		"page_size %d, num_addresses %d, write_max %d, use_smbus %d\n", -		chip.page_size, num_addresses, -		at24->write_max, use_smbus);  	/* export data to kernel code */  	if (chip.setup) @@ -660,6 +686,11 @@ static struct i2c_driver at24_driver = {  static int __init at24_init(void)  { +	if (!io_limit) { +		pr_err("at24: io_limit must not be 0!\n"); +		return -EINVAL; +	} +  	io_limit = rounddown_pow_of_two(io_limit);  	return i2c_add_driver(&at24_driver);  } diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index d618e8673996..e960a9300eb2 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -83,7 +83,7 @@ config MMC_RICOH_MMC  config MMC_SDHCI_OF  	tristate "SDHCI support on OpenFirmware platforms" -	depends on MMC_SDHCI && PPC_OF +	depends on MMC_SDHCI && OF  	help  	  This selects the OF support for Secure Digital Host Controller  	  Interfaces. @@ -93,6 +93,7 @@ config MMC_SDHCI_OF  config MMC_SDHCI_OF_ESDHC  	bool "SDHCI OF support for the Freescale eSDHC controller"  	depends on MMC_SDHCI_OF +	depends on PPC_OF  	select MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER  	help  	  This selects the Freescale eSDHC controller support. @@ -102,6 +103,7 @@ config MMC_SDHCI_OF_ESDHC  config MMC_SDHCI_OF_HLWD  	bool "SDHCI OF support for the Nintendo Wii SDHCI controllers"  	depends on MMC_SDHCI_OF +	depends on PPC_OF  	select MMC_SDHCI_BIG_ENDIAN_32BIT_BYTE_SWAPPER  	help  	  This selects the Secure Digital Host Controller Interface (SDHCI) diff --git a/drivers/mmc/host/sdhci-of-core.c b/drivers/mmc/host/sdhci-of-core.c index c51b71174c1d..fa19d849a920 100644 --- a/drivers/mmc/host/sdhci-of-core.c +++ b/drivers/mmc/host/sdhci-of-core.c @@ -122,7 +122,7 @@ static int __devinit sdhci_of_probe(struct platform_device *ofdev,  	struct sdhci_of_data *sdhci_of_data = match->data;  	struct sdhci_host *host;  	struct sdhci_of_host *of_host; -	const u32 *clk; +	const __be32 *clk;  	int size;  	int ret; @@ -166,7 +166,7 @@ static int __devinit sdhci_of_probe(struct platform_device *ofdev,  	clk = of_get_property(np, "clock-frequency", &size);  	if (clk && size == sizeof(*clk) && *clk) -		of_host->clock = *clk; +		of_host->clock = be32_to_cpup(clk);  	ret = sdhci_add_host(host);  	if (ret) diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index 1e2cbf5d9aa1..b1f768917395 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig @@ -159,7 +159,7 @@ config MTD_AFS_PARTS  config MTD_OF_PARTS  	tristate "Flash partition map based on OF description" -	depends on (MICROBLAZE || PPC_OF) && MTD_PARTITIONS +	depends on OF && MTD_PARTITIONS  	help  	  This provides a partition parsing function which derives  	  the partition map from the children of the flash node, diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index a0dd7bba9481..5d37d315fa98 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig @@ -72,7 +72,7 @@ config MTD_PHYSMAP_BANKWIDTH  config MTD_PHYSMAP_OF  	tristate "Flash device in physical memory map based on OF description" -	depends on (MICROBLAZE || PPC_OF) && (MTD_CFI || MTD_JEDECPROBE || MTD_ROM) +	depends on OF && (MTD_CFI || MTD_JEDECPROBE || MTD_ROM)  	help  	  This provides a 'mapping' driver which allows the NOR Flash and  	  ROM driver code to communicate with chips which are mapped diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index d684f187de57..7a1f3d0ffa78 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -40,6 +40,7 @@  #include <linux/of_mdio.h>  #include <linux/of_platform.h>  #include <linux/of_gpio.h> +#include <linux/of_net.h>  #include <linux/vmalloc.h>  #include <asm/pgtable.h> diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 45c4b7bfcf39..6de4675016b5 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c @@ -95,6 +95,7 @@  #include <linux/phy.h>  #include <linux/phy_fixed.h>  #include <linux/of.h> +#include <linux/of_net.h>  #include "gianfar.h"  #include "fsl_pq_mdio.h" diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index acbdab3d66ca..73a3e0d93237 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -28,6 +28,7 @@  #include <linux/phy.h>  #include <linux/workqueue.h>  #include <linux/of_mdio.h> +#include <linux/of_net.h>  #include <linux/of_platform.h>  #include <asm/uaccess.h> diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index de6c3086d232..cad66ce1640b 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -24,6 +24,7 @@  #include <linux/of_device.h>  #include <linux/of_platform.h>  #include <linux/of_mdio.h> +#include <linux/of_net.h>  #include <linux/phy.h>  #define DRIVER_NAME "xilinx_emaclite" diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig index aa675ebd8eb3..3c6e100a3ad0 100644 --- a/drivers/of/Kconfig +++ b/drivers/of/Kconfig @@ -19,6 +19,10 @@ config OF_FLATTREE  	bool  	select DTC +config OF_EARLY_FLATTREE +	bool +	select OF_FLATTREE +  config OF_PROMTREE  	bool @@ -49,6 +53,10 @@ config OF_I2C  	help  	  OpenFirmware I2C accessors +config OF_NET +	depends on NETDEVICES +	def_bool y +  config OF_SPI  	def_tristate SPI  	depends on SPI && !SPARC diff --git a/drivers/of/Makefile b/drivers/of/Makefile index 7888155bea08..3ab21a0a4907 100644 --- a/drivers/of/Makefile +++ b/drivers/of/Makefile @@ -6,5 +6,6 @@ obj-$(CONFIG_OF_IRQ)    += irq.o  obj-$(CONFIG_OF_DEVICE) += device.o platform.o  obj-$(CONFIG_OF_GPIO)   += gpio.o  obj-$(CONFIG_OF_I2C)	+= of_i2c.o +obj-$(CONFIG_OF_NET)	+= of_net.o  obj-$(CONFIG_OF_SPI)	+= of_spi.o  obj-$(CONFIG_OF_MDIO)	+= of_mdio.o diff --git a/drivers/of/address.c b/drivers/of/address.c index 3a1c7e70b192..b4559c58c095 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -12,13 +12,13 @@  			(ns) > 0)  static struct of_bus *of_match_bus(struct device_node *np); -static int __of_address_to_resource(struct device_node *dev, const u32 *addrp, -				    u64 size, unsigned int flags, +static int __of_address_to_resource(struct device_node *dev, +		const __be32 *addrp, u64 size, unsigned int flags,  				    struct resource *r);  /* Debug utility */  #ifdef DEBUG -static void of_dump_addr(const char *s, const u32 *addr, int na) +static void of_dump_addr(const char *s, const __be32 *addr, int na)  {  	printk(KERN_DEBUG "%s", s);  	while (na--) @@ -26,7 +26,7 @@ static void of_dump_addr(const char *s, const u32 *addr, int na)  	printk("\n");  }  #else -static void of_dump_addr(const char *s, const u32 *addr, int na) { } +static void of_dump_addr(const char *s, const __be32 *addr, int na) { }  #endif  /* Callbacks for bus specific translators */ @@ -36,10 +36,10 @@ struct of_bus {  	int		(*match)(struct device_node *parent);  	void		(*count_cells)(struct device_node *child,  				       int *addrc, int *sizec); -	u64		(*map)(u32 *addr, const u32 *range, +	u64		(*map)(u32 *addr, const __be32 *range,  				int na, int ns, int pna);  	int		(*translate)(u32 *addr, u64 offset, int na); -	unsigned int	(*get_flags)(const u32 *addr); +	unsigned int	(*get_flags)(const __be32 *addr);  };  /* @@ -55,7 +55,7 @@ static void of_bus_default_count_cells(struct device_node *dev,  		*sizec = of_n_size_cells(dev);  } -static u64 of_bus_default_map(u32 *addr, const u32 *range, +static u64 of_bus_default_map(u32 *addr, const __be32 *range,  		int na, int ns, int pna)  {  	u64 cp, s, da; @@ -85,7 +85,7 @@ static int of_bus_default_translate(u32 *addr, u64 offset, int na)  	return 0;  } -static unsigned int of_bus_default_get_flags(const u32 *addr) +static unsigned int of_bus_default_get_flags(const __be32 *addr)  {  	return IORESOURCE_MEM;  } @@ -110,10 +110,10 @@ static void of_bus_pci_count_cells(struct device_node *np,  		*sizec = 2;  } -static unsigned int of_bus_pci_get_flags(const u32 *addr) +static unsigned int of_bus_pci_get_flags(const __be32 *addr)  {  	unsigned int flags = 0; -	u32 w = addr[0]; +	u32 w = be32_to_cpup(addr);  	switch((w >> 24) & 0x03) {  	case 0x01: @@ -129,7 +129,8 @@ static unsigned int of_bus_pci_get_flags(const u32 *addr)  	return flags;  } -static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna) +static u64 of_bus_pci_map(u32 *addr, const __be32 *range, int na, int ns, +		int pna)  {  	u64 cp, s, da;  	unsigned int af, rf; @@ -160,7 +161,7 @@ static int of_bus_pci_translate(u32 *addr, u64 offset, int na)  	return of_bus_default_translate(addr + 1, offset, na - 1);  } -const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size, +const __be32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,  			unsigned int *flags)  {  	const __be32 *prop; @@ -207,7 +208,7 @@ EXPORT_SYMBOL(of_get_pci_address);  int of_pci_address_to_resource(struct device_node *dev, int bar,  			       struct resource *r)  { -	const u32	*addrp; +	const __be32	*addrp;  	u64		size;  	unsigned int	flags; @@ -237,12 +238,13 @@ static void of_bus_isa_count_cells(struct device_node *child,  		*sizec = 1;  } -static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna) +static u64 of_bus_isa_map(u32 *addr, const __be32 *range, int na, int ns, +		int pna)  {  	u64 cp, s, da;  	/* Check address type match */ -	if ((addr[0] ^ range[0]) & 0x00000001) +	if ((addr[0] ^ range[0]) & cpu_to_be32(1))  		return OF_BAD_ADDR;  	/* Read address values, skipping high cell */ @@ -264,10 +266,10 @@ static int of_bus_isa_translate(u32 *addr, u64 offset, int na)  	return of_bus_default_translate(addr + 1, offset, na - 1);  } -static unsigned int of_bus_isa_get_flags(const u32 *addr) +static unsigned int of_bus_isa_get_flags(const __be32 *addr)  {  	unsigned int flags = 0; -	u32 w = addr[0]; +	u32 w = be32_to_cpup(addr);  	if (w & 1)  		flags |= IORESOURCE_IO; @@ -330,7 +332,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,  			    struct of_bus *pbus, u32 *addr,  			    int na, int ns, int pna, const char *rprop)  { -	const u32 *ranges; +	const __be32 *ranges;  	unsigned int rlen;  	int rone;  	u64 offset = OF_BAD_ADDR; @@ -398,7 +400,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,   * that can be mapped to a cpu physical address). This is not really specified   * that way, but this is traditionally the way IBM at least do things   */ -u64 __of_translate_address(struct device_node *dev, const u32 *in_addr, +u64 __of_translate_address(struct device_node *dev, const __be32 *in_addr,  			   const char *rprop)  {  	struct device_node *parent = NULL; @@ -475,22 +477,22 @@ u64 __of_translate_address(struct device_node *dev, const u32 *in_addr,  	return result;  } -u64 of_translate_address(struct device_node *dev, const u32 *in_addr) +u64 of_translate_address(struct device_node *dev, const __be32 *in_addr)  {  	return __of_translate_address(dev, in_addr, "ranges");  }  EXPORT_SYMBOL(of_translate_address); -u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr) +u64 of_translate_dma_address(struct device_node *dev, const __be32 *in_addr)  {  	return __of_translate_address(dev, in_addr, "dma-ranges");  }  EXPORT_SYMBOL(of_translate_dma_address); -const u32 *of_get_address(struct device_node *dev, int index, u64 *size, +const __be32 *of_get_address(struct device_node *dev, int index, u64 *size,  		    unsigned int *flags)  { -	const u32 *prop; +	const __be32 *prop;  	unsigned int psize;  	struct device_node *parent;  	struct of_bus *bus; @@ -525,8 +527,8 @@ const u32 *of_get_address(struct device_node *dev, int index, u64 *size,  }  EXPORT_SYMBOL(of_get_address); -static int __of_address_to_resource(struct device_node *dev, const u32 *addrp, -				    u64 size, unsigned int flags, +static int __of_address_to_resource(struct device_node *dev, +		const __be32 *addrp, u64 size, unsigned int flags,  				    struct resource *r)  {  	u64 taddr; @@ -564,7 +566,7 @@ static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,  int of_address_to_resource(struct device_node *dev, int index,  			   struct resource *r)  { -	const u32	*addrp; +	const __be32	*addrp;  	u64		size;  	unsigned int	flags; diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index c1360e02f921..c787c3d95c60 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -11,10 +11,12 @@  #include <linux/kernel.h>  #include <linux/initrd.h> +#include <linux/module.h>  #include <linux/of.h>  #include <linux/of_fdt.h>  #include <linux/string.h>  #include <linux/errno.h> +#include <linux/slab.h>  #ifdef CONFIG_PPC  #include <asm/machdep.h> @@ -22,104 +24,19 @@  #include <asm/page.h> -int __initdata dt_root_addr_cells; -int __initdata dt_root_size_cells; - -struct boot_param_header *initial_boot_params; - -char *find_flat_dt_string(u32 offset) +char *of_fdt_get_string(struct boot_param_header *blob, u32 offset)  { -	return ((char *)initial_boot_params) + -		be32_to_cpu(initial_boot_params->off_dt_strings) + offset; -} - -/** - * of_scan_flat_dt - scan flattened tree blob and call callback on each. - * @it: callback function - * @data: context data pointer - * - * This function is used to scan the flattened device-tree, it is - * used to extract the memory information at boot before we can - * unflatten the tree - */ -int __init of_scan_flat_dt(int (*it)(unsigned long node, -				     const char *uname, int depth, -				     void *data), -			   void *data) -{ -	unsigned long p = ((unsigned long)initial_boot_params) + -		be32_to_cpu(initial_boot_params->off_dt_struct); -	int rc = 0; -	int depth = -1; - -	do { -		u32 tag = be32_to_cpup((__be32 *)p); -		char *pathp; - -		p += 4; -		if (tag == OF_DT_END_NODE) { -			depth--; -			continue; -		} -		if (tag == OF_DT_NOP) -			continue; -		if (tag == OF_DT_END) -			break; -		if (tag == OF_DT_PROP) { -			u32 sz = be32_to_cpup((__be32 *)p); -			p += 8; -			if (be32_to_cpu(initial_boot_params->version) < 0x10) -				p = ALIGN(p, sz >= 8 ? 8 : 4); -			p += sz; -			p = ALIGN(p, 4); -			continue; -		} -		if (tag != OF_DT_BEGIN_NODE) { -			pr_err("Invalid tag %x in flat device tree!\n", tag); -			return -EINVAL; -		} -		depth++; -		pathp = (char *)p; -		p = ALIGN(p + strlen(pathp) + 1, 4); -		if ((*pathp) == '/') { -			char *lp, *np; -			for (lp = NULL, np = pathp; *np; np++) -				if ((*np) == '/') -					lp = np+1; -			if (lp != NULL) -				pathp = lp; -		} -		rc = it(p, pathp, depth, data); -		if (rc != 0) -			break; -	} while (1); - -	return rc; +	return ((char *)blob) + +		be32_to_cpu(blob->off_dt_strings) + offset;  }  /** - * of_get_flat_dt_root - find the root node in the flat blob + * of_fdt_get_property - Given a node in the given flat blob, return + * the property ptr   */ -unsigned long __init of_get_flat_dt_root(void) -{ -	unsigned long p = ((unsigned long)initial_boot_params) + -		be32_to_cpu(initial_boot_params->off_dt_struct); - -	while (be32_to_cpup((__be32 *)p) == OF_DT_NOP) -		p += 4; -	BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE); -	p += 4; -	return ALIGN(p + strlen((char *)p) + 1, 4); -} - -/** - * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr - * - * This function can be used within scan_flattened_dt callback to get - * access to properties - */ -void *__init of_get_flat_dt_prop(unsigned long node, const char *name, -				 unsigned long *size) +void *of_fdt_get_property(struct boot_param_header *blob, +		       unsigned long node, const char *name, +		       unsigned long *size)  {  	unsigned long p = node; @@ -137,10 +54,10 @@ void *__init of_get_flat_dt_prop(unsigned long node, const char *name,  		sz = be32_to_cpup((__be32 *)p);  		noff = be32_to_cpup((__be32 *)(p + 4));  		p += 8; -		if (be32_to_cpu(initial_boot_params->version) < 0x10) +		if (be32_to_cpu(blob->version) < 0x10)  			p = ALIGN(p, sz >= 8 ? 8 : 4); -		nstr = find_flat_dt_string(noff); +		nstr = of_fdt_get_string(blob, noff);  		if (nstr == NULL) {  			pr_warning("Can't find property index name !\n");  			return NULL; @@ -156,21 +73,28 @@ void *__init of_get_flat_dt_prop(unsigned long node, const char *name,  }  /** - * of_flat_dt_is_compatible - Return true if given node has compat in compatible list + * of_fdt_is_compatible - Return true if given node from the given blob has + * compat in its compatible list + * @blob: A device tree blob   * @node: node to test   * @compat: compatible string to compare with compatible list. + * + * On match, returns a non-zero value with smaller values returned for more + * specific compatible values.   */ -int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) +int of_fdt_is_compatible(struct boot_param_header *blob, +		      unsigned long node, const char *compat)  {  	const char *cp; -	unsigned long cplen, l; +	unsigned long cplen, l, score = 0; -	cp = of_get_flat_dt_prop(node, "compatible", &cplen); +	cp = of_fdt_get_property(blob, node, "compatible", &cplen);  	if (cp == NULL)  		return 0;  	while (cplen > 0) { +		score++;  		if (of_compat_cmp(cp, compat, strlen(compat)) == 0) -			return 1; +			return score;  		l = strlen(cp) + 1;  		cp += l;  		cplen -= l; @@ -179,7 +103,28 @@ int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)  	return 0;  } -static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, +/** + * of_fdt_match - Return true if node matches a list of compatible values + */ +int of_fdt_match(struct boot_param_header *blob, unsigned long node, +                 const char **compat) +{ +	unsigned int tmp, score = 0; + +	if (!compat) +		return 0; + +	while (*compat) { +		tmp = of_fdt_is_compatible(blob, node, *compat); +		if (tmp && (score == 0 || (tmp < score))) +			score = tmp; +		compat++; +	} + +	return score; +} + +static void *unflatten_dt_alloc(unsigned long *mem, unsigned long size,  				       unsigned long align)  {  	void *res; @@ -193,16 +138,18 @@ static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size,  /**   * unflatten_dt_node - Alloc and populate a device_node from the flat tree + * @blob: The parent device tree blob   * @p: pointer to node in flat tree   * @dad: Parent struct device_node   * @allnextpp: pointer to ->allnext from last allocated device_node   * @fpsize: Size of the node path up at the current depth.   */ -unsigned long __init unflatten_dt_node(unsigned long mem, -					unsigned long *p, -					struct device_node *dad, -					struct device_node ***allnextpp, -					unsigned long fpsize) +unsigned long unflatten_dt_node(struct boot_param_header *blob, +				unsigned long mem, +				unsigned long *p, +				struct device_node *dad, +				struct device_node ***allnextpp, +				unsigned long fpsize)  {  	struct device_node *np;  	struct property *pp, **prev_pp = NULL; @@ -298,10 +245,10 @@ unsigned long __init unflatten_dt_node(unsigned long mem,  		sz = be32_to_cpup((__be32 *)(*p));  		noff = be32_to_cpup((__be32 *)((*p) + 4));  		*p += 8; -		if (be32_to_cpu(initial_boot_params->version) < 0x10) +		if (be32_to_cpu(blob->version) < 0x10)  			*p = ALIGN(*p, sz >= 8 ? 8 : 4); -		pname = find_flat_dt_string(noff); +		pname = of_fdt_get_string(blob, noff);  		if (pname == NULL) {  			pr_info("Can't find property name in list !\n");  			break; @@ -380,7 +327,8 @@ unsigned long __init unflatten_dt_node(unsigned long mem,  		if (tag == OF_DT_NOP)  			*p += 4;  		else -			mem = unflatten_dt_node(mem, p, np, allnextpp, fpsize); +			mem = unflatten_dt_node(blob, mem, p, np, allnextpp, +						fpsize);  		tag = be32_to_cpup((__be32 *)(*p));  	}  	if (tag != OF_DT_END_NODE) { @@ -391,6 +339,211 @@ unsigned long __init unflatten_dt_node(unsigned long mem,  	return mem;  } +/** + * __unflatten_device_tree - create tree of device_nodes from flat blob + * + * unflattens a device-tree, creating the + * tree of struct device_node. It also fills the "name" and "type" + * pointers of the nodes so the normal device-tree walking functions + * can be used. + * @blob: The blob to expand + * @mynodes: The device_node tree created by the call + * @dt_alloc: An allocator that provides a virtual address to memory + * for the resulting tree + */ +void __unflatten_device_tree(struct boot_param_header *blob, +			     struct device_node **mynodes, +			     void * (*dt_alloc)(u64 size, u64 align)) +{ +	unsigned long start, mem, size; +	struct device_node **allnextp = mynodes; + +	pr_debug(" -> unflatten_device_tree()\n"); + +	if (!blob) { +		pr_debug("No device tree pointer\n"); +		return; +	} + +	pr_debug("Unflattening device tree:\n"); +	pr_debug("magic: %08x\n", be32_to_cpu(blob->magic)); +	pr_debug("size: %08x\n", be32_to_cpu(blob->totalsize)); +	pr_debug("version: %08x\n", be32_to_cpu(blob->version)); + +	if (be32_to_cpu(blob->magic) != OF_DT_HEADER) { +		pr_err("Invalid device tree blob header\n"); +		return; +	} + +	/* First pass, scan for size */ +	start = ((unsigned long)blob) + +		be32_to_cpu(blob->off_dt_struct); +	size = unflatten_dt_node(blob, 0, &start, NULL, NULL, 0); +	size = (size | 3) + 1; + +	pr_debug("  size is %lx, allocating...\n", size); + +	/* Allocate memory for the expanded device tree */ +	mem = (unsigned long) +		dt_alloc(size + 4, __alignof__(struct device_node)); + +	((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); + +	pr_debug("  unflattening %lx...\n", mem); + +	/* Second pass, do actual unflattening */ +	start = ((unsigned long)blob) + +		be32_to_cpu(blob->off_dt_struct); +	unflatten_dt_node(blob, mem, &start, NULL, &allnextp, 0); +	if (be32_to_cpup((__be32 *)start) != OF_DT_END) +		pr_warning("Weird tag at end of tree: %08x\n", *((u32 *)start)); +	if (be32_to_cpu(((__be32 *)mem)[size / 4]) != 0xdeadbeef) +		pr_warning("End of tree marker overwritten: %08x\n", +			   be32_to_cpu(((__be32 *)mem)[size / 4])); +	*allnextp = NULL; + +	pr_debug(" <- unflatten_device_tree()\n"); +} + +static void *kernel_tree_alloc(u64 size, u64 align) +{ +	return kzalloc(size, GFP_KERNEL); +} + +/** + * of_fdt_unflatten_tree - create tree of device_nodes from flat blob + * + * unflattens the device-tree passed by the firmware, creating the + * tree of struct device_node. It also fills the "name" and "type" + * pointers of the nodes so the normal device-tree walking functions + * can be used. + */ +void of_fdt_unflatten_tree(unsigned long *blob, +			struct device_node **mynodes) +{ +	struct boot_param_header *device_tree = +		(struct boot_param_header *)blob; +	__unflatten_device_tree(device_tree, mynodes, &kernel_tree_alloc); +} +EXPORT_SYMBOL_GPL(of_fdt_unflatten_tree); + +/* Everything below here references initial_boot_params directly. */ +int __initdata dt_root_addr_cells; +int __initdata dt_root_size_cells; + +struct boot_param_header *initial_boot_params; + +#ifdef CONFIG_OF_EARLY_FLATTREE + +/** + * of_scan_flat_dt - scan flattened tree blob and call callback on each. + * @it: callback function + * @data: context data pointer + * + * This function is used to scan the flattened device-tree, it is + * used to extract the memory information at boot before we can + * unflatten the tree + */ +int __init of_scan_flat_dt(int (*it)(unsigned long node, +				     const char *uname, int depth, +				     void *data), +			   void *data) +{ +	unsigned long p = ((unsigned long)initial_boot_params) + +		be32_to_cpu(initial_boot_params->off_dt_struct); +	int rc = 0; +	int depth = -1; + +	do { +		u32 tag = be32_to_cpup((__be32 *)p); +		char *pathp; + +		p += 4; +		if (tag == OF_DT_END_NODE) { +			depth--; +			continue; +		} +		if (tag == OF_DT_NOP) +			continue; +		if (tag == OF_DT_END) +			break; +		if (tag == OF_DT_PROP) { +			u32 sz = be32_to_cpup((__be32 *)p); +			p += 8; +			if (be32_to_cpu(initial_boot_params->version) < 0x10) +				p = ALIGN(p, sz >= 8 ? 8 : 4); +			p += sz; +			p = ALIGN(p, 4); +			continue; +		} +		if (tag != OF_DT_BEGIN_NODE) { +			pr_err("Invalid tag %x in flat device tree!\n", tag); +			return -EINVAL; +		} +		depth++; +		pathp = (char *)p; +		p = ALIGN(p + strlen(pathp) + 1, 4); +		if ((*pathp) == '/') { +			char *lp, *np; +			for (lp = NULL, np = pathp; *np; np++) +				if ((*np) == '/') +					lp = np+1; +			if (lp != NULL) +				pathp = lp; +		} +		rc = it(p, pathp, depth, data); +		if (rc != 0) +			break; +	} while (1); + +	return rc; +} + +/** + * of_get_flat_dt_root - find the root node in the flat blob + */ +unsigned long __init of_get_flat_dt_root(void) +{ +	unsigned long p = ((unsigned long)initial_boot_params) + +		be32_to_cpu(initial_boot_params->off_dt_struct); + +	while (be32_to_cpup((__be32 *)p) == OF_DT_NOP) +		p += 4; +	BUG_ON(be32_to_cpup((__be32 *)p) != OF_DT_BEGIN_NODE); +	p += 4; +	return ALIGN(p + strlen((char *)p) + 1, 4); +} + +/** + * of_get_flat_dt_prop - Given a node in the flat blob, return the property ptr + * + * This function can be used within scan_flattened_dt callback to get + * access to properties + */ +void *__init of_get_flat_dt_prop(unsigned long node, const char *name, +				 unsigned long *size) +{ +	return of_fdt_get_property(initial_boot_params, node, name, size); +} + +/** + * of_flat_dt_is_compatible - Return true if given node has compat in compatible list + * @node: node to test + * @compat: compatible string to compare with compatible list. + */ +int __init of_flat_dt_is_compatible(unsigned long node, const char *compat) +{ +	return of_fdt_is_compatible(initial_boot_params, node, compat); +} + +/** + * of_flat_dt_match - Return true if node matches a list of compatible values + */ +int __init of_flat_dt_match(unsigned long node, const char **compat) +{ +	return of_fdt_match(initial_boot_params, node, compat); +} +  #ifdef CONFIG_BLK_DEV_INITRD  /**   * early_init_dt_check_for_initrd - Decode initrd location from flat tree @@ -539,6 +692,12 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,  	return 1;  } +static void *__init early_device_tree_alloc(u64 size, u64 align) +{ +	unsigned long mem = early_init_dt_alloc_memory_arch(size, align); +	return __va(mem); +} +  /**   * unflatten_device_tree - create tree of device_nodes from flat blob   * @@ -549,58 +708,13 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,   */  void __init unflatten_device_tree(void)  { -	unsigned long start, mem, size; -	struct device_node **allnextp = &allnodes; - -	pr_debug(" -> unflatten_device_tree()\n"); - -	if (!initial_boot_params) { -		pr_debug("No device tree pointer\n"); -		return; -	} - -	pr_debug("Unflattening device tree:\n"); -	pr_debug("magic: %08x\n", be32_to_cpu(initial_boot_params->magic)); -	pr_debug("size: %08x\n", be32_to_cpu(initial_boot_params->totalsize)); -	pr_debug("version: %08x\n", be32_to_cpu(initial_boot_params->version)); - -	if (be32_to_cpu(initial_boot_params->magic) != OF_DT_HEADER) { -		pr_err("Invalid device tree blob header\n"); -		return; -	} - -	/* First pass, scan for size */ -	start = ((unsigned long)initial_boot_params) + -		be32_to_cpu(initial_boot_params->off_dt_struct); -	size = unflatten_dt_node(0, &start, NULL, NULL, 0); -	size = (size | 3) + 1; - -	pr_debug("  size is %lx, allocating...\n", size); - -	/* Allocate memory for the expanded device tree */ -	mem = early_init_dt_alloc_memory_arch(size + 4, -			__alignof__(struct device_node)); -	mem = (unsigned long) __va(mem); - -	((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); - -	pr_debug("  unflattening %lx...\n", mem); - -	/* Second pass, do actual unflattening */ -	start = ((unsigned long)initial_boot_params) + -		be32_to_cpu(initial_boot_params->off_dt_struct); -	unflatten_dt_node(mem, &start, NULL, &allnextp, 0); -	if (be32_to_cpup((__be32 *)start) != OF_DT_END) -		pr_warning("Weird tag at end of tree: %08x\n", *((u32 *)start)); -	if (be32_to_cpu(((__be32 *)mem)[size / 4]) != 0xdeadbeef) -		pr_warning("End of tree marker overwritten: %08x\n", -			   be32_to_cpu(((__be32 *)mem)[size / 4])); -	*allnextp = NULL; +	__unflatten_device_tree(initial_boot_params, &allnodes, +				early_device_tree_alloc);  	/* Get pointer to OF "/chosen" node for use everywhere */  	of_chosen = of_find_node_by_path("/chosen");  	if (of_chosen == NULL)  		of_chosen = of_find_node_by_path("/chosen@0"); - -	pr_debug(" <- unflatten_device_tree()\n");  } + +#endif /* CONFIG_OF_EARLY_FLATTREE */ diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index 1fce00eb421b..dcd7857784f2 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c @@ -52,27 +52,35 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)  	/* Loop over the child nodes and register a phy_device for each one */  	for_each_child_of_node(np, child) { -		const __be32 *addr; +		const __be32 *paddr; +		u32 addr;  		int len;  		/* A PHY must have a reg property in the range [0-31] */ -		addr = of_get_property(child, "reg", &len); -		if (!addr || len < sizeof(*addr) || *addr >= 32 || *addr < 0) { +		paddr = of_get_property(child, "reg", &len); +		if (!paddr || len < sizeof(*paddr)) {  			dev_err(&mdio->dev, "%s has invalid PHY address\n",  				child->full_name);  			continue;  		} +		addr = be32_to_cpup(paddr); +		if (addr >= 32) { +			dev_err(&mdio->dev, "%s PHY address %i is too large\n", +				child->full_name, addr); +			continue; +		} +  		if (mdio->irq) { -			mdio->irq[*addr] = irq_of_parse_and_map(child, 0); -			if (!mdio->irq[*addr]) -				mdio->irq[*addr] = PHY_POLL; +			mdio->irq[addr] = irq_of_parse_and_map(child, 0); +			if (!mdio->irq[addr]) +				mdio->irq[addr] = PHY_POLL;  		} -		phy = get_phy_device(mdio, be32_to_cpup(addr)); +		phy = get_phy_device(mdio, addr);  		if (!phy || IS_ERR(phy)) {  			dev_err(&mdio->dev, "error probing PHY at address %i\n", -				*addr); +				addr);  			continue;  		}  		phy_scan_fixups(phy); @@ -91,7 +99,7 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)  		}  		dev_dbg(&mdio->dev, "registered phy %s at address %i\n", -			child->name, *addr); +			child->name, addr);  	}  	return 0; diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c new file mode 100644 index 000000000000..86f334a2769c --- /dev/null +++ b/drivers/of/of_net.c @@ -0,0 +1,48 @@ +/* + * OF helpers for network devices. + * + * This file is released under the GPLv2 + * + * Initially copied out of arch/powerpc/kernel/prom_parse.c + */ +#include <linux/etherdevice.h> +#include <linux/kernel.h> +#include <linux/of_net.h> + +/** + * Search the device tree for the best MAC address to use.  'mac-address' is + * checked first, because that is supposed to contain to "most recent" MAC + * address. If that isn't set, then 'local-mac-address' is checked next, + * because that is the default address.  If that isn't set, then the obsolete + * 'address' is checked, just in case we're using an old device tree. + * + * Note that the 'address' property is supposed to contain a virtual address of + * the register set, but some DTS files have redefined that property to be the + * MAC address. + * + * All-zero MAC addresses are rejected, because those could be properties that + * exist in the device tree, but were not set by U-Boot.  For example, the + * DTS could define 'mac-address' and 'local-mac-address', with zero MAC + * addresses.  Some older U-Boots only initialized 'local-mac-address'.  In + * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists + * but is all zeros. +*/ +const void *of_get_mac_address(struct device_node *np) +{ +	struct property *pp; + +	pp = of_find_property(np, "mac-address", NULL); +	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) +		return pp->value; + +	pp = of_find_property(np, "local-mac-address", NULL); +	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) +		return pp->value; + +	pp = of_find_property(np, "address", NULL); +	if (pp && (pp->length == 6) && is_valid_ether_addr(pp->value)) +		return pp->value; + +	return NULL; +} +EXPORT_SYMBOL(of_get_mac_address); diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 5b4a07f1220e..c01cd1ac7617 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -633,6 +633,9 @@ EXPORT_SYMBOL(of_device_alloc);   * @np: pointer to node to create device for   * @bus_id: name to assign device   * @parent: Linux device model parent device. + * + * Returns pointer to created platform device, or NULL if a device was not + * registered.  Unavailable devices will not get registered.   */  struct platform_device *of_platform_device_create(struct device_node *np,  					    const char *bus_id, @@ -640,6 +643,9 @@ struct platform_device *of_platform_device_create(struct device_node *np,  {  	struct platform_device *dev; +	if (!of_device_is_available(np)) +		return NULL; +  	dev = of_device_alloc(np, bus_id, parent);  	if (!dev)  		return NULL; @@ -683,8 +689,9 @@ static int of_platform_bus_create(const struct device_node *bus,  		pr_debug("   create child: %s\n", child->full_name);  		dev = of_platform_device_create(child, NULL, parent);  		if (dev == NULL) -			rc = -ENOMEM; -		else if (!of_match_node(matches, child)) +			continue; + +		if (!of_match_node(matches, child))  			continue;  		if (rc == 0) {  			pr_debug("   and sub busses\n"); @@ -733,10 +740,9 @@ int of_platform_bus_probe(struct device_node *root,  	if (of_match_node(matches, root)) {  		pr_debug(" root match, create all sub devices\n");  		dev = of_platform_device_create(root, NULL, parent); -		if (dev == NULL) { -			rc = -ENOMEM; +		if (dev == NULL)  			goto bail; -		} +  		pr_debug(" create all sub busses\n");  		rc = of_platform_bus_create(root, matches, &dev->dev);  		goto bail; @@ -748,9 +754,9 @@ int of_platform_bus_probe(struct device_node *root,  		pr_debug("  match: %s\n", child->full_name);  		dev = of_platform_device_create(child, NULL, parent);  		if (dev == NULL) -			rc = -ENOMEM; -		else -			rc = of_platform_bus_create(child, matches, &dev->dev); +			continue; + +		rc = of_platform_bus_create(child, matches, &dev->dev);  		if (rc) {  			of_node_put(child);  			break; diff --git a/drivers/sbus/char/jsflash.c b/drivers/sbus/char/jsflash.c index a624f5af4320..e8566224fe4b 100644 --- a/drivers/sbus/char/jsflash.c +++ b/drivers/sbus/char/jsflash.c @@ -467,7 +467,7 @@ static int jsflash_init(void)  	node = prom_getchild(prom_root_node);  	node = prom_searchsiblings(node, "flash-memory"); -	if (node != 0 && node != -1) { +	if (node != 0 && (s32)node != -1) {  		if (prom_getproperty(node, "reg",  		    (char *)®0, sizeof(reg0)) == -1) {  			printk("jsflash: no \"reg\" property\n"); diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index ec3c214598d0..188aff6d263f 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -1412,7 +1412,7 @@ config SERIAL_NETX_CONSOLE  config SERIAL_OF_PLATFORM  	tristate "Serial port on Open Firmware platform bus" -	depends on PPC_OF || MICROBLAZE +	depends on OF  	depends on SERIAL_8250 || SERIAL_OF_PLATFORM_NWPSERIAL  	help  	  If you have a PowerPC based system that has serial ports diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c index 17849dcb9adc..5c7abe4c94dd 100644 --- a/drivers/serial/of_serial.c +++ b/drivers/serial/of_serial.c @@ -15,6 +15,7 @@  #include <linux/serial_core.h>  #include <linux/serial_8250.h>  #include <linux/of_address.h> +#include <linux/of_irq.h>  #include <linux/of_platform.h>  #include <linux/nwpserial.h> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index bd69d79208de..05cbad03c5ab 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -67,7 +67,8 @@   * Align to a 32 byte boundary equal to the   * alignment gcc 4.5 uses for a struct   */ -#define STRUCT_ALIGN() . = ALIGN(32) +#define STRUCT_ALIGNMENT 32 +#define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)  /* The actual configuration determine if the init/exit sections   * are handled as text/data or they can be discarded (which @@ -146,6 +147,13 @@  #define TRACE_SYSCALLS()  #endif + +#define KERNEL_DTB()							\ +	STRUCT_ALIGN();							\ +	VMLINUX_SYMBOL(__dtb_start) = .;				\ +	*(.dtb.init.rodata)						\ +	VMLINUX_SYMBOL(__dtb_end) = .; +  /* .data section */  #define DATA_DATA							\  	*(.data)							\ @@ -468,7 +476,8 @@  	MCOUNT_REC()							\  	DEV_DISCARD(init.rodata)					\  	CPU_DISCARD(init.rodata)					\ -	MEM_DISCARD(init.rodata) +	MEM_DISCARD(init.rodata)					\ +	KERNEL_DTB()  #define INIT_TEXT							\  	*(.init.text)							\ diff --git a/include/linux/of_address.h b/include/linux/of_address.h index 8aea06f0564c..2feda6ee6140 100644 --- a/include/linux/of_address.h +++ b/include/linux/of_address.h @@ -3,7 +3,7 @@  #include <linux/ioport.h>  #include <linux/of.h> -extern u64 of_translate_address(struct device_node *np, const u32 *addr); +extern u64 of_translate_address(struct device_node *np, const __be32 *addr);  extern int of_address_to_resource(struct device_node *dev, int index,  				  struct resource *r);  extern void __iomem *of_iomap(struct device_node *device, int index); @@ -21,7 +21,7 @@ static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }  #endif  #ifdef CONFIG_PCI -extern const u32 *of_get_pci_address(struct device_node *dev, int bar_no, +extern const __be32 *of_get_pci_address(struct device_node *dev, int bar_no,  			       u64 *size, unsigned int *flags);  extern int of_pci_address_to_resource(struct device_node *dev, int bar,  				      struct resource *r); @@ -32,7 +32,7 @@ static inline int of_pci_address_to_resource(struct device_node *dev, int bar,  	return -ENOSYS;  } -static inline const u32 *of_get_pci_address(struct device_node *dev, +static inline const __be32 *of_get_pci_address(struct device_node *dev,  		int bar_no, u64 *size, unsigned int *flags)  {  	return NULL; diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index 7bbf5b328438..0ef22a1f129e 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h @@ -58,6 +58,23 @@ struct boot_param_header {  };  #if defined(CONFIG_OF_FLATTREE) + +struct device_node; + +/* For scanning an arbitrary device-tree at any time */ +extern char *of_fdt_get_string(struct boot_param_header *blob, u32 offset); +extern void *of_fdt_get_property(struct boot_param_header *blob, +				 unsigned long node, +				 const char *name, +				 unsigned long *size); +extern int of_fdt_is_compatible(struct boot_param_header *blob, +				unsigned long node, +				const char *compat); +extern int of_fdt_match(struct boot_param_header *blob, unsigned long node, +			const char **compat); +extern void of_fdt_unflatten_tree(unsigned long *blob, +			       struct device_node **mynodes); +  /* TBD: Temporary export of fdt globals - remove when code fully merged */  extern int __initdata dt_root_addr_cells;  extern int __initdata dt_root_size_cells; @@ -71,6 +88,7 @@ extern int of_scan_flat_dt(int (*it)(unsigned long node, const char *uname,  extern void *of_get_flat_dt_prop(unsigned long node, const char *name,  				 unsigned long *size);  extern int of_flat_dt_is_compatible(unsigned long node, const char *name); +extern int of_flat_dt_match(unsigned long node, const char **matches);  extern unsigned long of_get_flat_dt_root(void);  extern int early_init_dt_scan_chosen(unsigned long node, const char *uname, diff --git a/include/linux/of_net.h b/include/linux/of_net.h new file mode 100644 index 000000000000..e913081fb52a --- /dev/null +++ b/include/linux/of_net.h @@ -0,0 +1,15 @@ +/* + * OF helpers for network devices. + * + * This file is released under the GPLv2 + */ + +#ifndef __LINUX_OF_NET_H +#define __LINUX_OF_NET_H + +#ifdef CONFIG_OF_NET +#include <linux/of.h> +extern const void *of_get_mac_address(struct device_node *np); +#endif + +#endif /* __LINUX_OF_NET_H */ diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 4c72c1189479..396da16aabf8 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -200,6 +200,29 @@ quiet_cmd_gzip = GZIP    $@  cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -f -9 > $@) || \  	(rm -f $@ ; false) +# DTC +# --------------------------------------------------------------------------- + +# Generate an assembly file to wrap the output of the device tree compiler +quiet_cmd_dt_S_dtb= DTB    $@ +cmd_dt_S_dtb=						\ +(							\ +	echo '\#include <asm-generic/vmlinux.lds.h>'; 	\ +	echo '.section .dtb.init.rodata,"a"';		\ +	echo '.balign STRUCT_ALIGNMENT';		\ +	echo '.global __dtb_$(*F)_begin';		\ +	echo '__dtb_$(*F)_begin:';			\ +	echo '.incbin "$<" ';				\ +	echo '__dtb_$(*F)_end:';			\ +	echo '.global __dtb_$(*F)_end';			\ +	echo '.balign STRUCT_ALIGNMENT'; 		\ +) > $@ + +$(obj)/%.dtb.S: $(obj)/%.dtb +	$(call cmd,dt_S_dtb) + +quiet_cmd_dtc = DTC     $@ +cmd_dtc = $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) $<  # Bzip2  # --------------------------------------------------------------------------- diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile index 01cdb36fc583..04a31c17639f 100644 --- a/scripts/dtc/Makefile +++ b/scripts/dtc/Makefile @@ -4,7 +4,7 @@ hostprogs-y	:= dtc  always		:= $(hostprogs-y)  dtc-objs	:= dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ -		   srcpos.o checks.o +		   srcpos.o checks.o util.o  dtc-objs	+= dtc-lexer.lex.o dtc-parser.tab.o  # Source files need to get at the userspace version of libfdt_env.h to compile @@ -19,6 +19,7 @@ HOSTCFLAGS_fstree.o := $(HOSTCFLAGS_DTC)  HOSTCFLAGS_livetree.o := $(HOSTCFLAGS_DTC)  HOSTCFLAGS_srcpos.o := $(HOSTCFLAGS_DTC)  HOSTCFLAGS_treesource.o := $(HOSTCFLAGS_DTC) +HOSTCFLAGS_util.o := $(HOSTCFLAGS_DTC)  HOSTCFLAGS_dtc-lexer.lex.o := $(HOSTCFLAGS_DTC)  HOSTCFLAGS_dtc-parser.tab.o := $(HOSTCFLAGS_DTC) diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c index 95485796f253..a662a0044798 100644 --- a/scripts/dtc/checks.c +++ b/scripts/dtc/checks.c @@ -278,32 +278,112 @@ static void check_property_name_chars(struct check *c, struct node *dt,  }  PROP_CHECK(property_name_chars, PROPNODECHARS, ERROR); +#define DESCLABEL_FMT	"%s%s%s%s%s" +#define DESCLABEL_ARGS(node,prop,mark)		\ +	((mark) ? "value of " : ""),		\ +	((prop) ? "'" : ""), \ +	((prop) ? (prop)->name : ""), \ +	((prop) ? "' in " : ""), (node)->fullpath + +static void check_duplicate_label(struct check *c, struct node *dt, +				  const char *label, struct node *node, +				  struct property *prop, struct marker *mark) +{ +	struct node *othernode = NULL; +	struct property *otherprop = NULL; +	struct marker *othermark = NULL; + +	othernode = get_node_by_label(dt, label); + +	if (!othernode) +		otherprop = get_property_by_label(dt, label, &othernode); +	if (!othernode) +		othermark = get_marker_label(dt, label, &othernode, +					       &otherprop); + +	if (!othernode) +		return; + +	if ((othernode != node) || (otherprop != prop) || (othermark != mark)) +		FAIL(c, "Duplicate label '%s' on " DESCLABEL_FMT +		     " and " DESCLABEL_FMT, +		     label, DESCLABEL_ARGS(node, prop, mark), +		     DESCLABEL_ARGS(othernode, otherprop, othermark)); +} + +static void check_duplicate_label_node(struct check *c, struct node *dt, +				       struct node *node) +{ +	struct label *l; + +	for_each_label(node->labels, l) +		check_duplicate_label(c, dt, l->label, node, NULL, NULL); +} +static void check_duplicate_label_prop(struct check *c, struct node *dt, +				       struct node *node, struct property *prop) +{ +	struct marker *m = prop->val.markers; +	struct label *l; + +	for_each_label(prop->labels, l) +		check_duplicate_label(c, dt, l->label, node, prop, NULL); + +	for_each_marker_of_type(m, LABEL) +		check_duplicate_label(c, dt, m->ref, node, prop, m); +} +CHECK(duplicate_label, NULL, check_duplicate_label_node, +      check_duplicate_label_prop, NULL, ERROR); +  static void check_explicit_phandles(struct check *c, struct node *root, -					  struct node *node) +				    struct node *node, struct property *prop)  { -	struct property *prop; +	struct marker *m;  	struct node *other;  	cell_t phandle; -	prop = get_property(node, "linux,phandle"); -	if (! prop) -		return; /* No phandle, that's fine */ +	if (!streq(prop->name, "phandle") +	    && !streq(prop->name, "linux,phandle")) +		return;  	if (prop->val.len != sizeof(cell_t)) { -		FAIL(c, "%s has bad length (%d) linux,phandle property", -		     node->fullpath, prop->val.len); +		FAIL(c, "%s has bad length (%d) %s property", +		     node->fullpath, prop->val.len, prop->name); +		return; +	} + +	m = prop->val.markers; +	for_each_marker_of_type(m, REF_PHANDLE) { +		assert(m->offset == 0); +		if (node != get_node_by_ref(root, m->ref)) +			/* "Set this node's phandle equal to some +			 * other node's phandle".  That's nonsensical +			 * by construction. */ { +			FAIL(c, "%s in %s is a reference to another node", +			     prop->name, node->fullpath); +			return; +		} +		/* But setting this node's phandle equal to its own +		 * phandle is allowed - that means allocate a unique +		 * phandle for this node, even if it's not otherwise +		 * referenced.  The value will be filled in later, so +		 * no further checking for now. */  		return;  	}  	phandle = propval_cell(prop); +  	if ((phandle == 0) || (phandle == -1)) { -		FAIL(c, "%s has invalid linux,phandle value 0x%x", -		     node->fullpath, phandle); +		FAIL(c, "%s has bad value (0x%x) in %s property", +		     node->fullpath, phandle, prop->name);  		return;  	} +	if (node->phandle && (node->phandle != phandle)) +		FAIL(c, "%s has %s property which replaces existing phandle information", +		     node->fullpath, prop->name); +  	other = get_node_by_phandle(root, phandle); -	if (other) { +	if (other && (other != node)) {  		FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",  		     node->fullpath, phandle, other->fullpath);  		return; @@ -311,7 +391,7 @@ static void check_explicit_phandles(struct check *c, struct node *root,  	node->phandle = phandle;  } -NODE_CHECK(explicit_phandles, NULL, ERROR); +PROP_CHECK(explicit_phandles, NULL, ERROR);  static void check_name_properties(struct check *c, struct node *root,  				  struct node *node) @@ -549,6 +629,9 @@ static struct check *check_table[] = {  	&duplicate_node_names, &duplicate_property_names,  	&node_name_chars, &node_name_format, &property_name_chars,  	&name_is_string, &name_properties, + +	&duplicate_label, +  	&explicit_phandles,  	&phandle_references, &path_references, diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index a627bbee91d4..e866ea5166ac 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l @@ -18,7 +18,7 @@   *                                                                   USA   */ -%option noyywrap noinput nounput yylineno +%option noyywrap nounput noinput never-interactive  %x INCLUDE  %x BYTESTRING @@ -38,6 +38,13 @@ LINECOMMENT	"//".*\n  #include "srcpos.h"  #include "dtc-parser.tab.h" +YYLTYPE yylloc; + +/* CAUTION: this will stop working if we ever use yyless() or yyunput() */ +#define	YY_USER_ACTION \ +	{ \ +		srcpos_update(&yylloc, yytext, yyleng); \ +	}  /*#define LEXDEBUG	1*/ @@ -47,15 +54,10 @@ LINECOMMENT	"//".*\n  #define DPRINT(fmt, ...)	do { } while (0)  #endif -static int dts_version; /* = 0 */ +static int dts_version = 1; -#define BEGIN_DEFAULT()	if (dts_version == 0) { \ -				DPRINT("<INITIAL>\n"); \ -				BEGIN(INITIAL); \ -			} else { \ -				DPRINT("<V1>\n"); \ +#define BEGIN_DEFAULT()		DPRINT("<V1>\n"); \  				BEGIN(V1); \ -			}  static void push_input_file(const char *filename);  static int pop_input_file(void); @@ -75,18 +77,13 @@ static int pop_input_file(void);  		}  <*>{STRING}	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("String: %s\n", yytext);  			yylval.data = data_copy_escape_string(yytext+1,  					yyleng-2); -			yylloc.first_line = yylineno;  			return DT_STRING;  		}  <*>"/dts-v1/"	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Keyword: /dts-v1/\n");  			dts_version = 1;  			BEGIN_DEFAULT(); @@ -94,106 +91,57 @@ static int pop_input_file(void);  		}  <*>"/memreserve/"	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Keyword: /memreserve/\n");  			BEGIN_DEFAULT();  			return DT_MEMRESERVE;  		}  <*>{LABEL}:	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Label: %s\n", yytext); -			yylval.labelref = strdup(yytext); +			yylval.labelref = xstrdup(yytext);  			yylval.labelref[yyleng-1] = '\0';  			return DT_LABEL;  		} -<INITIAL>[bodh]# { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			if (*yytext == 'b') -				yylval.cbase = 2; -			else if (*yytext == 'o') -				yylval.cbase = 8; -			else if (*yytext == 'd') -				yylval.cbase = 10; -			else -				yylval.cbase = 16; -			DPRINT("Base: %d\n", yylval.cbase); -			return DT_BASE; -		} - -<INITIAL>[0-9a-fA-F]+	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			yylval.literal = strdup(yytext); -			DPRINT("Literal: '%s'\n", yylval.literal); -			return DT_LEGACYLITERAL; -		} -  <V1>[0-9]+|0[xX][0-9a-fA-F]+      { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			yylval.literal = strdup(yytext); +			yylval.literal = xstrdup(yytext);  			DPRINT("Literal: '%s'\n", yylval.literal);  			return DT_LITERAL;  		} -\&{LABEL}	{	/* label reference */ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; +<*>\&{LABEL}	{	/* label reference */  			DPRINT("Ref: %s\n", yytext+1); -			yylval.labelref = strdup(yytext+1); +			yylval.labelref = xstrdup(yytext+1);  			return DT_REF;  		} -"&{/"{PATHCHAR}+\}	{	/* new-style path reference */ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; +<*>"&{/"{PATHCHAR}+\}	{	/* new-style path reference */  			yytext[yyleng-1] = '\0';  			DPRINT("Ref: %s\n", yytext+2); -			yylval.labelref = strdup(yytext+2); -			return DT_REF; -		} - -<INITIAL>"&/"{PATHCHAR}+ {	/* old-style path reference */ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			DPRINT("Ref: %s\n", yytext+1); -			yylval.labelref = strdup(yytext+1); +			yylval.labelref = xstrdup(yytext+2);  			return DT_REF;  		}  <BYTESTRING>[0-9a-fA-F]{2} { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			yylval.byte = strtol(yytext, NULL, 16);  			DPRINT("Byte: %02x\n", (int)yylval.byte);  			return DT_BYTE;  		}  <BYTESTRING>"]"	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("/BYTESTRING\n");  			BEGIN_DEFAULT();  			return ']';  		}  <PROPNODENAME>{PROPNODECHAR}+ { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("PropNodeName: %s\n", yytext); -			yylval.propnodename = strdup(yytext); +			yylval.propnodename = xstrdup(yytext);  			BEGIN_DEFAULT();  			return DT_PROPNODENAME;  		}  "/incbin/"	{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Binary Include\n");  			return DT_INCBIN;  		} @@ -203,8 +151,6 @@ static int pop_input_file(void);  <*>{LINECOMMENT}+ /* eat C++-style comments */  <*>.		{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Char: %c (\\x%02x)\n", yytext[0],  				(unsigned)yytext[0]);  			if (yytext[0] == '[') { @@ -221,100 +167,25 @@ static int pop_input_file(void);  %% - -/* - * Stack of nested include file contexts. - */ - -struct incl_file { -	struct dtc_file *file; -	YY_BUFFER_STATE yy_prev_buf; -	int yy_prev_lineno; -	struct incl_file *prev; -}; - -static struct incl_file *incl_file_stack; - - -/* - * Detect infinite include recursion. - */ -#define MAX_INCLUDE_DEPTH	(100) - -static int incl_depth = 0; - -  static void push_input_file(const char *filename)  { -	struct incl_file *incl_file; -	struct dtc_file *newfile; -	struct search_path search, *searchptr = NULL; -  	assert(filename); -	if (incl_depth++ >= MAX_INCLUDE_DEPTH) -		die("Includes nested too deeply"); - -	if (srcpos_file) { -		search.dir = srcpos_file->dir; -		search.next = NULL; -		search.prev = NULL; -		searchptr = &search; -	} - -	newfile = dtc_open_file(filename, searchptr); +	srcfile_push(filename); -	incl_file = xmalloc(sizeof(struct incl_file)); +	yyin = current_srcfile->f; -	/* -	 * Save current context. -	 */ -	incl_file->yy_prev_buf = YY_CURRENT_BUFFER; -	incl_file->yy_prev_lineno = yylineno; -	incl_file->file = srcpos_file; -	incl_file->prev = incl_file_stack; - -	incl_file_stack = incl_file; - -	/* -	 * Establish new context. -	 */ -	srcpos_file = newfile; -	yylineno = 1; -	yyin = newfile->file; -	yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); +	yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));  }  static int pop_input_file(void)  { -	struct incl_file *incl_file; - -	if (incl_file_stack == 0) +	if (srcfile_pop() == 0)  		return 0; -	dtc_close_file(srcpos_file); - -	/* -	 * Pop. -	 */ -	--incl_depth; -	incl_file = incl_file_stack; -	incl_file_stack = incl_file->prev; - -	/* -	 * Recover old context. -	 */ -	yy_delete_buffer(YY_CURRENT_BUFFER); -	yy_switch_to_buffer(incl_file->yy_prev_buf); -	yylineno = incl_file->yy_prev_lineno; -	srcpos_file = incl_file->file; -	yyin = incl_file->file ? incl_file->file->file : NULL; - -	/* -	 * Free old state. -	 */ -	free(incl_file); +	yypop_buffer_state(); +	yyin = current_srcfile->f;  	return 1;  } diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped index e27cc636e326..50c4420b4b2c 100644 --- a/scripts/dtc/dtc-lexer.lex.c_shipped +++ b/scripts/dtc/dtc-lexer.lex.c_shipped @@ -170,20 +170,7 @@ extern FILE *yyin, *yyout;  #define EOB_ACT_END_OF_FILE 1  #define EOB_ACT_LAST_MATCH 2 -    /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires -     *       access to the local variable yy_act. Since yyless() is a macro, it would break -     *       existing scanners that call yyless() from OUTSIDE yylex.  -     *       One obvious solution it to make yy_act a global. I tried that, and saw -     *       a 5% performance hit in a non-yylineno scanner, because yy_act is -     *       normally declared as a register variable-- so it is not worth it. -     */ -    #define  YY_LESS_LINENO(n) \ -            do { \ -                int yyl;\ -                for ( yyl = n; yyl < yyleng; ++yyl )\ -                    if ( yytext[yyl] == '\n' )\ -                        --yylineno;\ -            }while(0) +    #define YY_LESS_LINENO(n)  /* Return all but the first "n" matched characters back to the input stream. */  #define yyless(n) \ @@ -385,8 +372,8 @@ static void yy_fatal_error (yyconst char msg[]  );  	*yy_cp = '\0'; \  	(yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 20 -#define YY_END_OF_BUFFER 21 +#define YY_NUM_RULES 17 +#define YY_END_OF_BUFFER 18  /* This struct is not used in this scanner,     but its presence is necessary. */  struct yy_trans_info @@ -394,20 +381,19 @@ struct yy_trans_info  	flex_int32_t yy_verify;  	flex_int32_t yy_nxt;  	}; -static yyconst flex_int16_t yy_accept[104] = +static yyconst flex_int16_t yy_accept[94] =      {   0,          0,    0,    0,    0,    0,    0,    0,    0,    0,    0, -       21,   19,   16,   16,   19,   19,   19,    7,    7,   19, -        7,   19,   19,   19,   19,   13,   14,   14,   19,    8, -        8,   16,    0,    2,    0,    0,    9,    0,    0,    0, -        0,    0,    0,    7,    7,    5,    0,    6,    0,   12, -       12,   14,   14,    8,    0,   11,    9,    0,    0,    0, -        0,   18,    0,    0,    0,    0,    8,    0,   17,    0, -        0,    0,    0,    0,   10,    0,    0,    0,    0,    0, -        0,    0,    0,    0,    0,    0,    0,    0,    3,   15, +       18,   16,   13,   13,   16,   16,   16,   16,   16,   16, +       16,   10,   11,   11,    6,    6,   13,    0,    2,    0, +        7,    0,    0,    0,    0,    0,    0,    0,    5,    0, +        9,    9,   11,   11,    6,    0,    7,    0,    0,    0, +        0,   15,    0,    0,    0,    0,    6,    0,   14,    0, +        0,    0,    0,    0,    8,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    3,   12,          0,    0,    0,    0,    0,    0,    0,    0,    1,    0, -          0,    4,    0 +      } ;  static yyconst flex_int32_t yy_ec[256] = @@ -416,16 +402,16 @@ static yyconst flex_int32_t yy_ec[256] =          2,    2,    2,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    2,    1,    4,    5,    1,    1,    6,    1,    1, -        1,    7,    8,    8,    9,    8,   10,   11,   12,   13, -       13,   13,   13,   13,   13,   13,   13,   14,    1,    1, -        1,    1,    8,    8,   15,   15,   15,   15,   15,   15, -       16,   16,   16,   16,   16,   16,   16,   16,   16,   16, -       16,   16,   16,   16,   16,   16,   16,   17,   16,   16, -        1,   18,   19,    1,   16,    1,   15,   20,   21,   22, - -       23,   15,   16,   24,   25,   16,   16,   26,   27,   28, -       24,   16,   16,   29,   30,   31,   32,   33,   16,   17, -       16,   16,   34,    1,   35,    1,    1,    1,    1,    1, +        1,    7,    5,    5,    8,    5,    9,   10,   11,   12, +       12,   12,   12,   12,   12,   12,   12,   13,    1,    1, +        1,    1,    5,    5,   14,   14,   14,   14,   14,   14, +       15,   15,   15,   15,   15,   15,   15,   15,   15,   15, +       15,   15,   15,   15,   15,   15,   15,   16,   15,   15, +        1,   17,   18,    1,   15,    1,   14,   19,   20,   21, + +       22,   14,   15,   15,   23,   15,   15,   24,   25,   26, +       15,   15,   15,   27,   28,   29,   30,   31,   15,   16, +       15,   15,   32,    1,   33,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1, @@ -442,136 +428,114 @@ static yyconst flex_int32_t yy_ec[256] =          1,    1,    1,    1,    1      } ; -static yyconst flex_int32_t yy_meta[36] = +static yyconst flex_int32_t yy_meta[34] =      {   0, -        1,    1,    1,    1,    2,    1,    2,    2,    2,    3, -        4,    4,    4,    5,    6,    7,    7,    1,    1,    6, -        6,    6,    6,    7,    7,    7,    7,    7,    7,    7, -        7,    7,    7,    8,    1 +        1,    1,    1,    1,    2,    1,    2,    2,    3,    4, +        4,    4,    5,    6,    7,    7,    1,    1,    6,    6, +        6,    6,    7,    7,    7,    7,    7,    7,    7,    7, +        7,    8,    1      } ; -static yyconst flex_int16_t yy_base[117] = +static yyconst flex_int16_t yy_base[106] =      {   0, -        0,    0,   30,    0,   44,    0,   67,    0,   97,  105, -      302,  303,   35,   44,   40,   94,  112,    0,  129,  152, -      296,  295,  159,    0,  176,  303,    0,  116,   95,  165, -       49,   46,  102,  303,  296,    0,    0,  288,  290,  293, -      264,  266,  270,    0,    0,  303,    0,  303,  264,  303, -        0,    0,  195,  101,    0,    0,    0,    0,  284,  125, -      277,  265,  225,  230,  216,  218,    0,  202,  224,  221, -      217,  107,  196,  188,  303,  206,  179,  186,  178,  185, -      183,  162,  161,  150,  169,  160,  145,  125,  303,  303, -      137,  109,  190,  103,  203,  167,  108,  197,  303,  123, - -       29,  303,  303,  215,  221,  226,  229,  234,  240,  246, -      250,  257,  265,  270,  275,  282 +        0,    0,  237,  236,   25,    0,   47,    0,   30,   71, +      244,  247,   82,   84,   84,  211,   95,  229,  218,    0, +      111,  247,    0,   84,   83,   95,  106,   86,  247,  237, +        0,  230,  231,  234,  207,  209,  212,  220,  247,  206, +      247,  218,    0,  106,  116,    0,    0,    0,  223,   89, +      226,  219,  199,  206,  200,  204,    0,  190,  213,  212, +      202,   91,  178,  161,  247,  172,  144,  150,  140,  130, +      140,  124,  128,  120,  138,  137,  123,  122,  247,  247, +      134,  114,  132,   86,  135,  125,   90,  136,  247,   97, +       29,  247,  247,  153,  156,  161,  165,  170,  176,  180, + +      187,  195,  200,  205,  212      } ; -static yyconst flex_int16_t yy_def[117] = +static yyconst flex_int16_t yy_def[106] =      {   0, -      103,    1,    1,    3,    3,    5,  103,    7,    3,    3, -      103,  103,  103,  103,  104,  105,  103,  106,  103,   19, -       19,   20,  103,  107,   20,  103,  108,  109,  105,  103, -      103,  103,  104,  103,  104,  110,  111,  103,  112,  113, -      103,  103,  103,  106,   19,  103,   20,  103,  103,  103, -       20,  108,  109,  103,  114,  110,  111,  115,  112,  112, -      113,  103,  103,  103,  103,  103,  114,  115,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  116,  103,  116,  103,  116, - -      103,  103,    0,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103 +       93,    1,    1,    1,    1,    5,   93,    7,    1,    1, +       93,   93,   93,   93,   94,   95,   93,   96,   17,   97, +       96,   93,   98,   99,   93,   93,   93,   94,   93,   94, +      100,   93,  101,  102,   93,   93,   93,   96,   93,   93, +       93,   96,   98,   99,   93,  103,  100,  104,  101,  101, +      102,   93,   93,   93,   93,   93,  103,  104,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,  105,   93,  105,   93,  105, +       93,   93,    0,   93,   93,   93,   93,   93,   93,   93, + +       93,   93,   93,   93,   93      } ; -static yyconst flex_int16_t yy_nxt[339] = +static yyconst flex_int16_t yy_nxt[281] =      {   0, -       12,   13,   14,   15,   12,   16,   12,   12,   12,   17, -       18,   18,   18,   12,   19,   20,   20,   12,   12,   21, -       19,   21,   19,   22,   20,   20,   20,   20,   20,   20, -       20,   20,   20,   12,   12,   12,   32,   32,  102,   23, -       12,   12,   12,   34,   20,   32,   32,   32,   32,   20, -       20,   20,   20,   20,   24,   24,   24,   35,   25,   54, -       54,   54,   26,   25,   25,   25,   25,   12,   13,   14, -       15,   27,   12,   27,   27,   27,   23,   27,   27,   27, -       12,   28,   28,   28,   12,   12,   28,   28,   28,   28, -       28,   28,   28,   28,   28,   28,   28,   28,   28,   28, - -       12,   12,   29,   36,  103,   34,   17,   30,   31,   31, -       29,   54,   54,   54,   17,   30,   31,   31,   39,   35, -       52,   40,   52,   52,   52,  103,   78,   38,   38,   46, -      101,   60,   79,   41,   69,   97,   42,   94,   43,   45, -       45,   45,   46,   45,   47,   47,   93,   92,   45,   45, -       45,   45,   47,   47,   47,   47,   47,   47,   47,   47, -       47,   47,   47,   47,   47,   39,   47,   91,   40,   90, -       99,   47,   47,   47,   47,   54,   54,   54,   89,   88, -       41,   55,   87,   49,  100,   43,   51,   51,   51,   86, -       51,   95,   95,   96,   85,   51,   51,   51,   51,   52, - -       99,   52,   52,   52,   95,   95,   96,   84,   46,   83, -       82,   81,   39,   79,  100,   33,   33,   33,   33,   33, -       33,   33,   33,   37,   80,   77,   37,   37,   37,   44, -       40,   44,   50,   76,   50,   52,   75,   52,   74,   52, -       52,   53,   73,   53,   53,   53,   53,   56,   56,   56, -       72,   56,   56,   57,   71,   57,   57,   59,   59,   59, -       59,   59,   59,   59,   59,   61,   61,   61,   61,   61, -       61,   61,   61,   67,   70,   67,   68,   68,   68,   62, -       68,   68,   98,   98,   98,   98,   98,   98,   98,   98, -       60,   66,   65,   64,   63,   62,   60,   58,  103,   48, - -       48,  103,   11,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103 +       12,   13,   14,   15,   12,   16,   12,   12,   17,   12, +       12,   12,   12,   18,   18,   18,   12,   12,   18,   18, +       18,   18,   18,   18,   18,   18,   18,   18,   18,   18, +       18,   12,   12,   19,   20,   20,   20,   92,   21,   25, +       26,   26,   22,   21,   21,   21,   21,   12,   13,   14, +       15,   23,   16,   23,   23,   19,   23,   23,   23,   12, +       24,   24,   24,   12,   12,   24,   24,   24,   24,   24, +       24,   24,   24,   24,   24,   24,   24,   24,   12,   12, +       25,   26,   26,   27,   27,   27,   27,   29,   43,   29, +       43,   43,   45,   45,   45,   50,   39,   59,   46,   93, + +       30,   33,   30,   34,   45,   45,   45,   27,   27,   68, +       43,   91,   43,   43,   69,   35,   87,   36,   39,   37, +       42,   42,   42,   39,   42,   45,   45,   45,   89,   42, +       42,   42,   42,   85,   85,   86,   85,   85,   86,   89, +       84,   90,   83,   82,   81,   80,   79,   78,   77,   76, +       75,   74,   90,   28,   28,   28,   28,   28,   28,   28, +       28,   31,   31,   31,   38,   38,   38,   38,   41,   73, +       41,   43,   72,   43,   71,   43,   43,   44,   33,   44, +       44,   44,   44,   47,   69,   47,   47,   49,   49,   49, +       49,   49,   49,   49,   49,   51,   51,   51,   51,   51, + +       51,   51,   51,   57,   70,   57,   58,   58,   58,   67, +       58,   58,   88,   88,   88,   88,   88,   88,   88,   88, +       34,   66,   65,   64,   63,   62,   61,   60,   52,   50, +       39,   56,   39,   55,   54,   53,   52,   50,   48,   93, +       40,   39,   32,   93,   19,   19,   11,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93      } ; -static yyconst flex_int16_t yy_chk[339] = +static yyconst flex_int16_t yy_chk[281] =      {   0,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1,          1,    1,    1,    1,    1,    1,    1,    1,    1,    1, -        1,    1,    1,    1,    1,    3,   13,   13,  101,    3, -        3,    3,    3,   15,    3,   14,   14,   32,   32,    3, -        3,    3,    3,    3,    5,    5,    5,   15,    5,   31, -       31,   31,    5,    5,    5,    5,    5,    7,    7,    7, +        1,    1,    1,    5,    5,    5,    5,   91,    5,    9, +        9,    9,    5,    5,    5,    5,    5,    7,    7,    7,          7,    7,    7,    7,    7,    7,    7,    7,    7,    7,          7,    7,    7,    7,    7,    7,    7,    7,    7,    7,          7,    7,    7,    7,    7,    7,    7,    7,    7,    7, - -        7,    7,    9,   16,   29,   33,    9,    9,    9,    9, -       10,   54,   54,   54,   10,   10,   10,   10,   17,   33, -       28,   17,   28,   28,   28,  100,   72,   16,   29,   28, -       97,   60,   72,   17,   60,   94,   17,   92,   17,   19, -       19,   19,   19,   19,   19,   19,   91,   88,   19,   19, -       19,   19,   19,   19,   19,   19,   19,   19,   19,   19, -       19,   19,   20,   20,   20,   23,   20,   87,   23,   86, -       96,   20,   20,   20,   20,   30,   30,   30,   85,   84, -       23,   30,   83,   23,   96,   23,   25,   25,   25,   82, -       25,   93,   93,   93,   81,   25,   25,   25,   25,   53, - -       98,   53,   53,   53,   95,   95,   95,   80,   53,   79, -       78,   77,   76,   74,   98,  104,  104,  104,  104,  104, -      104,  104,  104,  105,   73,   71,  105,  105,  105,  106, -       70,  106,  107,   69,  107,  108,   68,  108,   66,  108, -      108,  109,   65,  109,  109,  109,  109,  110,  110,  110, -       64,  110,  110,  111,   63,  111,  111,  112,  112,  112, -      112,  112,  112,  112,  112,  113,  113,  113,  113,  113, -      113,  113,  113,  114,   62,  114,  115,  115,  115,   61, -      115,  115,  116,  116,  116,  116,  116,  116,  116,  116, -       59,   49,   43,   42,   41,   40,   39,   38,   35,   22, - -       21,   11,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103,  103,  103, -      103,  103,  103,  103,  103,  103,  103,  103 +       10,   10,   10,   13,   13,   14,   14,   15,   24,   28, +       24,   24,   25,   25,   25,   50,   24,   50,   25,   90, + +       15,   17,   28,   17,   26,   26,   26,   27,   27,   62, +       44,   87,   44,   44,   62,   17,   84,   17,   44,   17, +       21,   21,   21,   21,   21,   45,   45,   45,   86,   21, +       21,   21,   21,   83,   83,   83,   85,   85,   85,   88, +       82,   86,   81,   78,   77,   76,   75,   74,   73,   72, +       71,   70,   88,   94,   94,   94,   94,   94,   94,   94, +       94,   95,   95,   95,   96,   96,   96,   96,   97,   69, +       97,   98,   68,   98,   67,   98,   98,   99,   66,   99, +       99,   99,   99,  100,   64,  100,  100,  101,  101,  101, +      101,  101,  101,  101,  101,  102,  102,  102,  102,  102, + +      102,  102,  102,  103,   63,  103,  104,  104,  104,   61, +      104,  104,  105,  105,  105,  105,  105,  105,  105,  105, +       60,   59,   58,   56,   55,   54,   53,   52,   51,   49, +       42,   40,   38,   37,   36,   35,   34,   33,   32,   30, +       19,   18,   16,   11,    4,    3,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93, +       93,   93,   93,   93,   93,   93,   93,   93,   93,   93      } ; -/* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[21] = -    {   0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,  -    0,     }; -  static yy_state_type yy_last_accepting_state;  static char *yy_last_accepting_cpos; @@ -616,6 +580,13 @@ char *yytext;  #include "srcpos.h"  #include "dtc-parser.tab.h" +YYLTYPE yylloc; + +/* CAUTION: this will stop working if we ever use yyless() or yyunput() */ +#define	YY_USER_ACTION \ +	{ \ +		srcpos_update(&yylloc, yytext, yyleng); \ +	}  /*#define LEXDEBUG	1*/ @@ -625,19 +596,14 @@ char *yytext;  #define DPRINT(fmt, ...)	do { } while (0)  #endif -static int dts_version; /* = 0 */ +static int dts_version = 1; -#define BEGIN_DEFAULT()	if (dts_version == 0) { \ -				DPRINT("<INITIAL>\n"); \ -				BEGIN(INITIAL); \ -			} else { \ -				DPRINT("<V1>\n"); \ +#define BEGIN_DEFAULT()		DPRINT("<V1>\n"); \  				BEGIN(V1); \ -			}  static void push_input_file(const char *filename);  static int pop_input_file(void); -#line 641 "dtc-lexer.lex.c" +#line 607 "dtc-lexer.lex.c"  #define INITIAL 0  #define INCLUDE 1 @@ -826,9 +792,9 @@ YY_DECL  	register char *yy_cp, *yy_bp;  	register int yy_act; -#line 64 "dtc-lexer.l" +#line 66 "dtc-lexer.l" -#line 832 "dtc-lexer.lex.c" +#line 798 "dtc-lexer.lex.c"  	if ( !(yy_init) )  		{ @@ -881,35 +847,21 @@ yy_match:  			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )  				{  				yy_current_state = (int) yy_def[yy_current_state]; -				if ( yy_current_state >= 104 ) +				if ( yy_current_state >= 94 )  					yy_c = yy_meta[(unsigned int) yy_c];  				}  			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];  			++yy_cp;  			} -		while ( yy_base[yy_current_state] != 303 ); +		while ( yy_current_state != 93 ); +		yy_cp = (yy_last_accepting_cpos); +		yy_current_state = (yy_last_accepting_state);  yy_find_action:  		yy_act = yy_accept[yy_current_state]; -		if ( yy_act == 0 ) -			{ /* have to back up */ -			yy_cp = (yy_last_accepting_cpos); -			yy_current_state = (yy_last_accepting_state); -			yy_act = yy_accept[yy_current_state]; -			}  		YY_DO_BEFORE_ACTION; -		if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) -			{ -			int yyl; -			for ( yyl = 0; yyl < yyleng; ++yyl ) -				if ( yytext[yyl] == '\n' ) -					    -    yylineno++; -; -			} -  do_action:	/* This label is used only to access EOF actions. */  		switch ( yy_act ) @@ -924,7 +876,7 @@ do_action:	/* This label is used only to access EOF actions. */  case 1:  /* rule 1 can match eol */  YY_RULE_SETUP -#line 65 "dtc-lexer.l" +#line 67 "dtc-lexer.l"  {  			char *name = strchr(yytext, '\"') + 1;  			yytext[yyleng-1] = '\0'; @@ -936,7 +888,7 @@ case YY_STATE_EOF(INCLUDE):  case YY_STATE_EOF(BYTESTRING):  case YY_STATE_EOF(PROPNODENAME):  case YY_STATE_EOF(V1): -#line 71 "dtc-lexer.l" +#line 73 "dtc-lexer.l"  {  			if (!pop_input_file()) {  				yyterminate(); @@ -946,23 +898,18 @@ case YY_STATE_EOF(V1):  case 2:  /* rule 2 can match eol */  YY_RULE_SETUP -#line 77 "dtc-lexer.l" +#line 79 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("String: %s\n", yytext);  			yylval.data = data_copy_escape_string(yytext+1,  					yyleng-2); -			yylloc.first_line = yylineno;  			return DT_STRING;  		}  	YY_BREAK  case 3:  YY_RULE_SETUP -#line 87 "dtc-lexer.l" +#line 86 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Keyword: /dts-v1/\n");  			dts_version = 1;  			BEGIN_DEFAULT(); @@ -971,10 +918,8 @@ YY_RULE_SETUP  	YY_BREAK  case 4:  YY_RULE_SETUP -#line 96 "dtc-lexer.l" +#line 93 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Keyword: /memreserve/\n");  			BEGIN_DEFAULT();  			return DT_MEMRESERVE; @@ -982,158 +927,100 @@ YY_RULE_SETUP  	YY_BREAK  case 5:  YY_RULE_SETUP -#line 104 "dtc-lexer.l" +#line 99 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Label: %s\n", yytext); -			yylval.labelref = strdup(yytext); +			yylval.labelref = xstrdup(yytext);  			yylval.labelref[yyleng-1] = '\0';  			return DT_LABEL;  		}  	YY_BREAK  case 6:  YY_RULE_SETUP -#line 113 "dtc-lexer.l" -{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			if (*yytext == 'b') -				yylval.cbase = 2; -			else if (*yytext == 'o') -				yylval.cbase = 8; -			else if (*yytext == 'd') -				yylval.cbase = 10; -			else -				yylval.cbase = 16; -			DPRINT("Base: %d\n", yylval.cbase); -			return DT_BASE; -		} -	YY_BREAK -case 7: -YY_RULE_SETUP -#line 128 "dtc-lexer.l" +#line 106 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			yylval.literal = strdup(yytext); -			DPRINT("Literal: '%s'\n", yylval.literal); -			return DT_LEGACYLITERAL; -		} -	YY_BREAK -case 8: -YY_RULE_SETUP -#line 136 "dtc-lexer.l" -{ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			yylval.literal = strdup(yytext); +			yylval.literal = xstrdup(yytext);  			DPRINT("Literal: '%s'\n", yylval.literal);  			return DT_LITERAL;  		}  	YY_BREAK -case 9: +case 7:  YY_RULE_SETUP -#line 144 "dtc-lexer.l" +#line 112 "dtc-lexer.l"  {	/* label reference */ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Ref: %s\n", yytext+1); -			yylval.labelref = strdup(yytext+1); +			yylval.labelref = xstrdup(yytext+1);  			return DT_REF;  		}  	YY_BREAK -case 10: +case 8:  YY_RULE_SETUP -#line 152 "dtc-lexer.l" +#line 118 "dtc-lexer.l"  {	/* new-style path reference */ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			yytext[yyleng-1] = '\0';  			DPRINT("Ref: %s\n", yytext+2); -			yylval.labelref = strdup(yytext+2); +			yylval.labelref = xstrdup(yytext+2);  			return DT_REF;  		}  	YY_BREAK -case 11: -YY_RULE_SETUP -#line 161 "dtc-lexer.l" -{	/* old-style path reference */ -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno; -			DPRINT("Ref: %s\n", yytext+1); -			yylval.labelref = strdup(yytext+1); -			return DT_REF; -		} -	YY_BREAK -case 12: +case 9:  YY_RULE_SETUP -#line 169 "dtc-lexer.l" +#line 125 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			yylval.byte = strtol(yytext, NULL, 16);  			DPRINT("Byte: %02x\n", (int)yylval.byte);  			return DT_BYTE;  		}  	YY_BREAK -case 13: +case 10:  YY_RULE_SETUP -#line 177 "dtc-lexer.l" +#line 131 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("/BYTESTRING\n");  			BEGIN_DEFAULT();  			return ']';  		}  	YY_BREAK -case 14: +case 11:  YY_RULE_SETUP -#line 185 "dtc-lexer.l" +#line 137 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("PropNodeName: %s\n", yytext); -			yylval.propnodename = strdup(yytext); +			yylval.propnodename = xstrdup(yytext);  			BEGIN_DEFAULT();  			return DT_PROPNODENAME;  		}  	YY_BREAK -case 15: +case 12:  YY_RULE_SETUP -#line 194 "dtc-lexer.l" +#line 144 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Binary Include\n");  			return DT_INCBIN;  		}  	YY_BREAK -case 16: -/* rule 16 can match eol */ +case 13: +/* rule 13 can match eol */  YY_RULE_SETUP -#line 201 "dtc-lexer.l" +#line 149 "dtc-lexer.l"  /* eat whitespace */  	YY_BREAK -case 17: -/* rule 17 can match eol */ +case 14: +/* rule 14 can match eol */  YY_RULE_SETUP -#line 202 "dtc-lexer.l" +#line 150 "dtc-lexer.l"  /* eat C-style comments */  	YY_BREAK -case 18: -/* rule 18 can match eol */ +case 15: +/* rule 15 can match eol */  YY_RULE_SETUP -#line 203 "dtc-lexer.l" +#line 151 "dtc-lexer.l"  /* eat C++-style comments */  	YY_BREAK -case 19: +case 16:  YY_RULE_SETUP -#line 205 "dtc-lexer.l" +#line 153 "dtc-lexer.l"  { -			yylloc.file = srcpos_file; -			yylloc.first_line = yylineno;  			DPRINT("Char: %c (\\x%02x)\n", yytext[0],  				(unsigned)yytext[0]);  			if (yytext[0] == '[') { @@ -1148,12 +1035,12 @@ YY_RULE_SETUP  			return yytext[0];  		}  	YY_BREAK -case 20: +case 17:  YY_RULE_SETUP -#line 222 "dtc-lexer.l" +#line 168 "dtc-lexer.l"  ECHO;  	YY_BREAK -#line 1157 "dtc-lexer.lex.c" +#line 1044 "dtc-lexer.lex.c"  	case YY_END_OF_BUFFER:  		{ @@ -1218,7 +1105,8 @@ ECHO;  			else  				{ -				yy_cp = (yy_c_buf_p); +				yy_cp = (yy_last_accepting_cpos); +				yy_current_state = (yy_last_accepting_state);  				goto yy_find_action;  				}  			} @@ -1443,7 +1331,7 @@ static int yy_get_next_buffer (void)  		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )  			{  			yy_current_state = (int) yy_def[yy_current_state]; -			if ( yy_current_state >= 104 ) +			if ( yy_current_state >= 94 )  				yy_c = yy_meta[(unsigned int) yy_c];  			}  		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1471,11 +1359,11 @@ static int yy_get_next_buffer (void)  	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )  		{  		yy_current_state = (int) yy_def[yy_current_state]; -		if ( yy_current_state >= 104 ) +		if ( yy_current_state >= 94 )  			yy_c = yy_meta[(unsigned int) yy_c];  		}  	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; -	yy_is_jam = (yy_current_state == 103); +	yy_is_jam = (yy_current_state == 93);  	return yy_is_jam ? 0 : yy_current_state;  } @@ -1550,11 +1438,6 @@ static int yy_get_next_buffer (void)  	*(yy_c_buf_p) = '\0';	/* preserve yytext */  	(yy_hold_char) = *++(yy_c_buf_p); -	if ( c == '\n' ) -		    -    yylineno++; -; -  	return c;  }  #endif	/* ifndef YY_NO_INPUT */ @@ -1669,10 +1552,6 @@ static void yy_load_buffer_state  (void)  	yyfree((void *) b  );  } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ -      /* Initializes or reinitializes a buffer.   * This function is sometimes called more than once on the same buffer,   * such as during a yyrestart() or at EOF. @@ -1696,7 +1575,7 @@ extern int isatty (int );          b->yy_bs_column = 0;      } -        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +        b->yy_is_interactive = 0;  	errno = oerrno;  } @@ -2025,9 +1904,6 @@ static int yy_init_globals (void)       * This function is called from yylex_destroy(), so don't allocate here.       */ -    /* We do not touch yylineno unless the option is enabled. */ -    yylineno =  1; -          (yy_buffer_stack) = 0;      (yy_buffer_stack_top) = 0;      (yy_buffer_stack_max) = 0; @@ -2120,104 +1996,29 @@ void yyfree (void * ptr )  #define YYTABLES_NAME "yytables" -#line 222 "dtc-lexer.l" - - - - -/* - * Stack of nested include file contexts. - */ - -struct incl_file { -	struct dtc_file *file; -	YY_BUFFER_STATE yy_prev_buf; -	int yy_prev_lineno; -	struct incl_file *prev; -}; - -static struct incl_file *incl_file_stack; +#line 168 "dtc-lexer.l" -/* - * Detect infinite include recursion. - */ -#define MAX_INCLUDE_DEPTH	(100) - -static int incl_depth = 0; -  static void push_input_file(const char *filename)  { -	struct incl_file *incl_file; -	struct dtc_file *newfile; -	struct search_path search, *searchptr = NULL; -  	assert(filename); -	if (incl_depth++ >= MAX_INCLUDE_DEPTH) -		die("Includes nested too deeply"); - -	if (srcpos_file) { -		search.dir = srcpos_file->dir; -		search.next = NULL; -		search.prev = NULL; -		searchptr = &search; -	} - -	newfile = dtc_open_file(filename, searchptr); +	srcfile_push(filename); -	incl_file = xmalloc(sizeof(struct incl_file)); +	yyin = current_srcfile->f; -	/* -	 * Save current context. -	 */ -	incl_file->yy_prev_buf = YY_CURRENT_BUFFER; -	incl_file->yy_prev_lineno = yylineno; -	incl_file->file = srcpos_file; -	incl_file->prev = incl_file_stack; - -	incl_file_stack = incl_file; - -	/* -	 * Establish new context. -	 */ -	srcpos_file = newfile; -	yylineno = 1; -	yyin = newfile->file; -	yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); +	yypush_buffer_state(yy_create_buffer(yyin,YY_BUF_SIZE));  }  static int pop_input_file(void)  { -	struct incl_file *incl_file; - -	if (incl_file_stack == 0) +	if (srcfile_pop() == 0)  		return 0; -	dtc_close_file(srcpos_file); - -	/* -	 * Pop. -	 */ -	--incl_depth; -	incl_file = incl_file_stack; -	incl_file_stack = incl_file->prev; - -	/* -	 * Recover old context. -	 */ -	yy_delete_buffer(YY_CURRENT_BUFFER); -	yy_switch_to_buffer(incl_file->yy_prev_buf); -	yylineno = incl_file->yy_prev_lineno; -	srcpos_file = incl_file->file; -	yyin = incl_file->file ? incl_file->file->file : NULL; - -	/* -	 * Free old state. -	 */ -	free(incl_file); +	yypop_buffer_state(); +	yyin = current_srcfile->f;  	return 1;  } diff --git a/scripts/dtc/dtc-parser.tab.c_shipped b/scripts/dtc/dtc-parser.tab.c_shipped index 27129377e5d2..9be2eea18a30 100644 --- a/scripts/dtc/dtc-parser.tab.c_shipped +++ b/scripts/dtc/dtc-parser.tab.c_shipped @@ -1,24 +1,23 @@ -/* A Bison parser, made by GNU Bison 2.3.  */ -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* A Bison parser, made by GNU Bison 2.4.1.  */ -   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +/* Skeleton implementation for Bison's Yacc-like parsers in C +    +      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006     Free Software Foundation, Inc. - -   This program is free software; you can redistribute it and/or modify +    +   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, or (at your option) -   any later version. - +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. +        This program is distributed in the hope that it will be useful,     but WITHOUT ANY WARRANTY; without even the implied warranty of     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     GNU General Public License for more details. - +        You should have received a copy of the GNU General Public License -   along with this program; if not, write to the Free Software -   Foundation, Inc., 51 Franklin Street, Fifth Floor, -   Boston, MA 02110-1301, USA.  */ +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  /* As a special exception, you may create a larger work that contains     part or all of the Bison parser skeleton and distribute that work @@ -29,7 +28,7 @@     special exception, which will cause the skeleton and the resulting     Bison output files to be licensed under the GNU General Public     License without this special exception. - +        This special exception was added by the Free Software Foundation in     version 2.2 of Bison.  */ @@ -47,7 +46,7 @@  #define YYBISON 1  /* Bison version.  */ -#define YYBISON_VERSION "2.3" +#define YYBISON_VERSION "2.4.1"  /* Skeleton name.  */  #define YYSKELETON_NAME "yacc.c" @@ -55,55 +54,32 @@  /* Pure parsers.  */  #define YYPURE 0 -/* Using locations.  */ -#define YYLSP_NEEDED 1 - +/* Push parsers.  */ +#define YYPUSH 0 +/* Pull parsers.  */ +#define YYPULL 1 -/* Tokens.  */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE -   /* Put the tokens into the symbol table, so that GDB and other debuggers -      know about them.  */ -   enum yytokentype { -     DT_V1 = 258, -     DT_MEMRESERVE = 259, -     DT_PROPNODENAME = 260, -     DT_LITERAL = 261, -     DT_LEGACYLITERAL = 262, -     DT_BASE = 263, -     DT_BYTE = 264, -     DT_STRING = 265, -     DT_LABEL = 266, -     DT_REF = 267, -     DT_INCBIN = 268 -   }; -#endif -/* Tokens.  */ -#define DT_V1 258 -#define DT_MEMRESERVE 259 -#define DT_PROPNODENAME 260 -#define DT_LITERAL 261 -#define DT_LEGACYLITERAL 262 -#define DT_BASE 263 -#define DT_BYTE 264 -#define DT_STRING 265 -#define DT_LABEL 266 -#define DT_REF 267 -#define DT_INCBIN 268 - +/* Using locations.  */ +#define YYLSP_NEEDED 0  /* Copy the first part of user declarations.  */ -#line 23 "dtc-parser.y" + +/* Line 189 of yacc.c  */ +#line 21 "dtc-parser.y"  #include <stdio.h>  #include "dtc.h"  #include "srcpos.h" +YYLTYPE yylloc; +  extern int yylex(void); +extern void print_error(char const *fmt, ...); +extern void yyerror(char const *s);  extern struct boot_info *the_boot_info;  extern int treesource_error; @@ -111,6 +87,9 @@ extern int treesource_error;  static unsigned long long eval_literal(const char *s, int base, int bits); +/* Line 189 of yacc.c  */ +#line 92 "dtc-parser.tab.c" +  /* Enabling traces.  */  #ifndef YYDEBUG  # define YYDEBUG 0 @@ -129,10 +108,35 @@ static unsigned long long eval_literal(const char *s, int base, int bits);  # define YYTOKEN_TABLE 0  #endif + +/* Tokens.  */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE +   /* Put the tokens into the symbol table, so that GDB and other debuggers +      know about them.  */ +   enum yytokentype { +     DT_V1 = 258, +     DT_MEMRESERVE = 259, +     DT_PROPNODENAME = 260, +     DT_LITERAL = 261, +     DT_BASE = 262, +     DT_BYTE = 263, +     DT_STRING = 264, +     DT_LABEL = 265, +     DT_REF = 266, +     DT_INCBIN = 267 +   }; +#endif + + +  #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED  typedef union YYSTYPE -#line 37 "dtc-parser.y"  { + +/* Line 214 of yacc.c  */ +#line 39 "dtc-parser.y" +  	char *propnodename;  	char *literal;  	char *labelref; @@ -147,34 +151,23 @@ typedef union YYSTYPE  	struct node *node;  	struct node *nodelist;  	struct reserve_info *re; -} -/* Line 187 of yacc.c.  */ -#line 153 "dtc-parser.tab.c" -	YYSTYPE; + + + +/* Line 214 of yacc.c  */ +#line 159 "dtc-parser.tab.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1  # define yystype YYSTYPE /* obsolescent; will be withdrawn */  # define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE -{ -  int first_line; -  int first_column; -  int last_line; -  int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1  #endif  /* Copy the second part of user declarations.  */ -/* Line 216 of yacc.c.  */ -#line 178 "dtc-parser.tab.c" +/* Line 264 of yacc.c  */ +#line 171 "dtc-parser.tab.c"  #ifdef short  # undef short @@ -249,14 +242,14 @@ typedef short int yytype_int16;  #if (defined __STDC__ || defined __C99__FUNC__ \       || defined __cplusplus || defined _MSC_VER)  static int -YYID (int i) +YYID (int yyi)  #else  static int -YYID (i) -    int i; +YYID (yyi) +    int yyi;  #endif  { -  return i; +  return yyi;  }  #endif @@ -332,15 +325,13 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */  #if (! defined yyoverflow \       && (! defined __cplusplus \ -	 || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ -	     && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) +	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))  /* A type that is properly aligned for any stack member.  */  union yyalloc  { -  yytype_int16 yyss; -  YYSTYPE yyvs; -    YYLTYPE yyls; +  yytype_int16 yyss_alloc; +  YYSTYPE yyvs_alloc;  };  /* The size of the maximum gap between one aligned stack and the next.  */ @@ -349,8 +340,8 @@ union yyalloc  /* The size of an array large to enough to hold all stacks, each with     N elements.  */  # define YYSTACK_BYTES(N) \ -     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ -      + 2 * YYSTACK_GAP_MAXIMUM) +     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ +      + YYSTACK_GAP_MAXIMUM)  /* Copy COUNT objects from FROM to TO.  The source and destination do     not overlap.  */ @@ -375,12 +366,12 @@ union yyalloc     elements in the stack, and YYPTR gives the new location of the     stack.  Advance YYPTR to a properly aligned location for the next     stack.  */ -# define YYSTACK_RELOCATE(Stack)					\ +# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\      do									\        {									\  	YYSIZE_T yynewbytes;						\ -	YYCOPY (&yyptr->Stack, Stack, yysize);				\ -	Stack = &yyptr->Stack;						\ +	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\ +	Stack = &yyptr->Stack_alloc;					\  	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \  	yyptr += yynewbytes / sizeof (*yyptr);				\        }									\ @@ -389,22 +380,22 @@ union yyalloc  #endif  /* YYFINAL -- State number of the termination state.  */ -#define YYFINAL  9 +#define YYFINAL  4  /* YYLAST -- Last index in YYTABLE.  */ -#define YYLAST   73 +#define YYLAST   56  /* YYNTOKENS -- Number of terminals.  */ -#define YYNTOKENS  27 +#define YYNTOKENS  25  /* YYNNTS -- Number of nonterminals.  */ -#define YYNNTS  20 +#define YYNNTS  16  /* YYNRULES -- Number of rules.  */ -#define YYNRULES  45 +#define YYNRULES  39  /* YYNRULES -- Number of states.  */ -#define YYNSTATES  76 +#define YYNSTATES  67  /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */  #define YYUNDEFTOK  2 -#define YYMAXUTOK   268 +#define YYMAXUTOK   267  #define YYTRANSLATE(YYX)						\    ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -416,15 +407,15 @@ static const yytype_uint8 yytranslate[] =         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2, -      24,    26,     2,     2,    25,    15,     2,    16,     2,     2, -       2,     2,     2,     2,     2,     2,     2,     2,     2,    14, -      20,    19,    21,     2,     2,     2,     2,     2,     2,     2, +      22,    24,     2,     2,    23,     2,     2,    14,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,    13, +      18,    17,    19,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2, -       2,    22,     2,    23,     2,     2,     2,     2,     2,     2, +       2,    20,     2,    21,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2, -       2,     2,     2,    17,     2,    18,     2,     2,     2,     2, +       2,     2,     2,    15,     2,    16,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2, @@ -438,7 +429,7 @@ static const yytype_uint8 yytranslate[] =         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     2,     2,     2,     2,         2,     2,     2,     2,     2,     2,     1,     2,     3,     4, -       5,     6,     7,     8,     9,    10,    11,    12,    13 +       5,     6,     7,     8,     9,    10,    11,    12  };  #if YYDEBUG @@ -446,41 +437,37 @@ static const yytype_uint8 yytranslate[] =     YYRHS.  */  static const yytype_uint8 yyprhs[] =  { -       0,     0,     3,     8,    11,    12,    15,    21,    22,    25, -      27,    34,    36,    38,    41,    47,    48,    51,    57,    61, -      64,    69,    74,    77,    87,    93,    96,    97,   100,   103, -     104,   107,   110,   113,   114,   116,   118,   121,   122,   125, -     128,   129,   132,   135,   139,   140 +       0,     0,     3,     8,     9,    12,    17,    20,    22,    25, +      29,    33,    39,    40,    43,    48,    51,    54,    57,    62, +      67,    70,    80,    86,    89,    90,    93,    96,    97,   100, +     103,   106,   108,   109,   112,   115,   116,   119,   122,   125  };  /* YYRHS -- A `-1'-separated list of the rules' RHS.  */  static const yytype_int8 yyrhs[] =  { -      28,     0,    -1,     3,    14,    29,    34,    -1,    31,    34, -      -1,    -1,    30,    29,    -1,    46,     4,    33,    33,    14, -      -1,    -1,    32,    31,    -1,    30,    -1,    46,     4,    33, -      15,    33,    14,    -1,     6,    -1,     7,    -1,    16,    35, -      -1,    17,    36,    44,    18,    14,    -1,    -1,    36,    37, -      -1,    46,     5,    19,    38,    14,    -1,    46,     5,    14, -      -1,    39,    10,    -1,    39,    20,    40,    21,    -1,    39, -      22,    43,    23,    -1,    39,    12,    -1,    39,    13,    24, -      10,    25,    33,    25,    33,    26,    -1,    39,    13,    24, -      10,    26,    -1,    38,    11,    -1,    -1,    38,    25,    -1, -      39,    11,    -1,    -1,    40,    42,    -1,    40,    12,    -1, -      40,    11,    -1,    -1,     8,    -1,     6,    -1,    41,     7, -      -1,    -1,    43,     9,    -1,    43,    11,    -1,    -1,    45, -      44,    -1,    45,    37,    -1,    46,     5,    35,    -1,    -1, -      11,    -1 +      26,     0,    -1,     3,    13,    27,    30,    -1,    -1,    28, +      27,    -1,     4,    29,    29,    13,    -1,    10,    28,    -1, +       6,    -1,    14,    31,    -1,    30,    14,    31,    -1,    30, +      11,    31,    -1,    15,    32,    39,    16,    13,    -1,    -1, +      32,    33,    -1,     5,    17,    34,    13,    -1,     5,    13, +      -1,    10,    33,    -1,    35,     9,    -1,    35,    18,    36, +      19,    -1,    35,    20,    38,    21,    -1,    35,    11,    -1, +      35,    12,    22,     9,    23,    29,    23,    29,    24,    -1, +      35,    12,    22,     9,    24,    -1,    34,    10,    -1,    -1, +      34,    23,    -1,    35,    10,    -1,    -1,    36,    37,    -1, +      36,    11,    -1,    36,    10,    -1,     6,    -1,    -1,    38, +       8,    -1,    38,    10,    -1,    -1,    40,    39,    -1,    40, +      33,    -1,     5,    31,    -1,    10,    40,    -1  };  /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */  static const yytype_uint16 yyrline[] =  { -       0,    89,    89,    93,   101,   104,   111,   119,   122,   129, -     133,   140,   144,   151,   158,   166,   169,   176,   180,   187, -     191,   195,   199,   203,   220,   231,   239,   242,   246,   254, -     257,   261,   266,   274,   277,   281,   285,   293,   296,   300, -     308,   311,   315,   323,   331,   334 +       0,    86,    86,    95,    98,   105,   109,   117,   124,   128, +     132,   145,   153,   156,   163,   167,   171,   179,   183,   187, +     191,   195,   212,   222,   230,   233,   237,   245,   248,   252, +     257,   264,   272,   275,   279,   287,   290,   294,   302,   306  };  #endif @@ -490,13 +477,12 @@ static const yytype_uint16 yyrline[] =  static const char *const yytname[] =  {    "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE", -  "DT_PROPNODENAME", "DT_LITERAL", "DT_LEGACYLITERAL", "DT_BASE", -  "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF", "DT_INCBIN", "';'", "'-'", -  "'/'", "'{'", "'}'", "'='", "'<'", "'>'", "'['", "']'", "'('", "','", -  "')'", "$accept", "sourcefile", "memreserves", "memreserve", -  "v0_memreserves", "v0_memreserve", "addr", "devicetree", "nodedef", -  "proplist", "propdef", "propdata", "propdataprefix", "celllist", -  "cellbase", "cellval", "bytestring", "subnodes", "subnode", "label", 0 +  "DT_PROPNODENAME", "DT_LITERAL", "DT_BASE", "DT_BYTE", "DT_STRING", +  "DT_LABEL", "DT_REF", "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'='", +  "'<'", "'>'", "'['", "']'", "'('", "','", "')'", "$accept", "sourcefile", +  "memreserves", "memreserve", "addr", "devicetree", "nodedef", "proplist", +  "propdef", "propdata", "propdataprefix", "celllist", "cellval", +  "bytestring", "subnodes", "subnode", 0  };  #endif @@ -506,29 +492,27 @@ static const char *const yytname[] =  static const yytype_uint16 yytoknum[] =  {         0,   256,   257,   258,   259,   260,   261,   262,   263,   264, -     265,   266,   267,   268,    59,    45,    47,   123,   125,    61, -      60,    62,    91,    93,    40,    44,    41 +     265,   266,   267,    59,    47,   123,   125,    61,    60,    62, +      91,    93,    40,    44,    41  };  # endif  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */  static const yytype_uint8 yyr1[] =  { -       0,    27,    28,    28,    29,    29,    30,    31,    31,    32, -      32,    33,    33,    34,    35,    36,    36,    37,    37,    38, -      38,    38,    38,    38,    38,    38,    39,    39,    39,    40, -      40,    40,    40,    41,    41,    42,    42,    43,    43,    43, -      44,    44,    44,    45,    46,    46 +       0,    25,    26,    27,    27,    28,    28,    29,    30,    30, +      30,    31,    32,    32,    33,    33,    33,    34,    34,    34, +      34,    34,    34,    34,    35,    35,    35,    36,    36,    36, +      36,    37,    38,    38,    38,    39,    39,    39,    40,    40  };  /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */  static const yytype_uint8 yyr2[] =  { -       0,     2,     4,     2,     0,     2,     5,     0,     2,     1, -       6,     1,     1,     2,     5,     0,     2,     5,     3,     2, -       4,     4,     2,     9,     5,     2,     0,     2,     2,     0, -       2,     2,     2,     0,     1,     1,     2,     0,     2,     2, -       0,     2,     2,     3,     0,     1 +       0,     2,     4,     0,     2,     4,     2,     1,     2,     3, +       3,     5,     0,     2,     4,     2,     2,     2,     4,     4, +       2,     9,     5,     2,     0,     2,     2,     0,     2,     2, +       2,     1,     0,     2,     2,     0,     2,     2,     2,     2  };  /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -536,86 +520,79 @@ static const yytype_uint8 yyr2[] =     means the default is an error.  */  static const yytype_uint8 yydefact[] =  { -       7,     0,    45,     0,     9,     0,     7,     0,     4,     1, -       0,     3,     8,     0,     0,     4,     0,    15,    13,    11, -      12,     0,     2,     5,     0,    40,     0,     0,     0,    16, -       0,    40,     0,     0,     6,     0,    42,    41,     0,    10, -      14,    18,    26,    43,     0,     0,    25,    17,    27,    19, -      28,    22,     0,    29,    37,     0,    33,     0,     0,    35, -      34,    32,    31,    20,     0,    30,    38,    39,    21,     0, -      24,    36,     0,     0,     0,    23 +       0,     0,     0,     3,     1,     0,     0,     0,     3,     7, +       0,     6,     0,     2,     4,     0,    12,     8,     0,     0, +       5,    35,    10,     9,     0,     0,    13,     0,    35,    15, +      24,    38,    16,    39,     0,    37,    36,     0,     0,    11, +      23,    14,    25,    17,    26,    20,     0,    27,    32,     0, +       0,     0,     0,    31,    30,    29,    18,    28,    33,    34, +      19,     0,    22,     0,     0,     0,    21  };  /* YYDEFGOTO[NTERM-NUM].  */  static const yytype_int8 yydefgoto[] =  { -      -1,     3,    14,     4,     5,     6,    27,    11,    18,    25, -      29,    44,    45,    56,    64,    65,    57,    30,    31,     7 +      -1,     2,     7,     8,    10,    13,    17,    21,    26,    37, +      38,    50,    57,    51,    27,    28  };  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing     STATE-NUM.  */ -#define YYPACT_NINF -14 +#define YYPACT_NINF -12  static const yytype_int8 yypact[] =  { -      30,   -11,   -14,     7,   -14,    -1,    27,    13,    27,   -14, -       8,   -14,   -14,    40,    -1,    27,    35,   -14,   -14,   -14, -     -14,    21,   -14,   -14,    40,    24,    40,    28,    40,   -14, -      32,    24,    46,    38,   -14,    39,   -14,   -14,    26,   -14, -     -14,   -14,   -14,   -14,    -9,    10,   -14,   -14,   -14,   -14, -     -14,   -14,    31,   -14,   -14,    44,    -2,     3,    23,   -14, -     -14,   -14,   -14,   -14,    50,   -14,   -14,   -14,   -14,    40, -     -14,   -14,    33,    40,    36,   -14 +      10,   -11,    18,    -1,   -12,    22,    -1,    15,    -1,   -12, +      22,   -12,    20,     1,   -12,    17,   -12,   -12,    20,    20, +     -12,     6,   -12,   -12,    21,     6,   -12,    23,     6,   -12, +     -12,   -12,   -12,   -12,    28,   -12,   -12,    -6,    13,   -12, +     -12,   -12,   -12,   -12,   -12,   -12,    24,   -12,   -12,    33, +      -5,     0,    -4,   -12,   -12,   -12,   -12,   -12,   -12,   -12, +     -12,    22,   -12,    25,    22,    19,   -12  };  /* YYPGOTO[NTERM-NUM].  */  static const yytype_int8 yypgoto[] =  { -     -14,   -14,    48,    29,    53,   -14,   -13,    47,    34,   -14, -      37,   -14,   -14,   -14,   -14,   -14,   -14,    42,   -14,    -7 +     -12,   -12,    36,    39,   -10,   -12,     8,   -12,    12,   -12, +     -12,   -12,   -12,   -12,    27,    31  };  /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If     positive, shift that token.  If negative, reduce the rule which     number is the opposite.  If zero, do what YYDEFACT says.     If YYTABLE_NINF, syntax error.  */ -#define YYTABLE_NINF -45 -static const yytype_int8 yytable[] = +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] =  { -      21,    16,    46,     8,    59,    47,    60,     9,    16,    61, -      62,    28,    66,    33,    67,    10,    48,    13,    32,    63, -      49,    50,    51,    52,    32,    17,    68,    19,    20,   -44, -      53,   -44,    54,     1,   -44,     2,    26,    15,     2,    24, -      41,     2,    34,    17,    15,    42,    19,    20,    69,    70, -      35,    38,    39,    40,    58,    55,    72,    71,    73,    12, -      74,    22,    75,    23,     0,     0,     0,     0,    36,     0, -       0,     0,    43,    37 +      15,    53,     3,     5,    40,    54,    55,    41,    58,     6, +      59,    24,    18,     1,    56,    19,    25,    42,     4,    61, +      62,    60,    43,    44,    45,    46,    22,    23,     9,    12, +      20,    47,    31,    48,    29,    16,    16,    32,    30,    34, +      35,    39,    52,    66,    14,    11,    49,     0,    64,     0, +       0,    63,     0,     0,    65,    36,    33  };  static const yytype_int8 yycheck[] =  { -      13,     8,    11,    14,     6,    14,     8,     0,    15,    11, -      12,    24,     9,    26,    11,    16,    25,     4,    25,    21, -      10,    11,    12,    13,    31,    17,    23,     6,     7,     5, -      20,     4,    22,     3,     4,    11,    15,     8,    11,     4, -      14,    11,    14,    17,    15,    19,     6,     7,    25,    26, -      18,     5,    14,    14,    10,    24,    69,     7,    25,     6, -      73,    14,    26,    15,    -1,    -1,    -1,    -1,    31,    -1, -      -1,    -1,    38,    31 +      10,     6,    13,     4,    10,    10,    11,    13,     8,    10, +      10,     5,    11,     3,    19,    14,    10,    23,     0,    23, +      24,    21,     9,    10,    11,    12,    18,    19,     6,    14, +      13,    18,    24,    20,    13,    15,    15,    25,    17,    16, +      28,    13,     9,    24,     8,     6,    22,    -1,    23,    -1, +      -1,    61,    -1,    -1,    64,    28,    25  };  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing     symbol of state STATE-NUM.  */  static const yytype_uint8 yystos[] =  { -       0,     3,    11,    28,    30,    31,    32,    46,    14,     0, -      16,    34,    31,     4,    29,    30,    46,    17,    35,     6, -       7,    33,    34,    29,     4,    36,    15,    33,    33,    37, -      44,    45,    46,    33,    14,    18,    37,    44,     5,    14, -      14,    14,    19,    35,    38,    39,    11,    14,    25,    10, -      11,    12,    13,    20,    22,    24,    40,    43,    10,     6, -       8,    11,    12,    21,    41,    42,     9,    11,    23,    25, -      26,     7,    33,    25,    33,    26 +       0,     3,    26,    13,     0,     4,    10,    27,    28,     6, +      29,    28,    14,    30,    27,    29,    15,    31,    11,    14, +      13,    32,    31,    31,     5,    10,    33,    39,    40,    13, +      17,    31,    33,    40,    16,    33,    39,    34,    35,    13, +      10,    13,    23,     9,    10,    11,    12,    18,    20,    22, +      36,    38,     9,     6,    10,    11,    19,    37,     8,    10, +      21,    23,    24,    29,    23,    29,    24  };  #define yyerrok		(yyerrstatus = 0) @@ -728,7 +705,7 @@ do {									  \      {									  \        YYFPRINTF (stderr, "%s ", Title);					  \        yy_symbol_print (stderr,						  \ -		  Type, Value, Location); \ +		  Type, Value); \        YYFPRINTF (stderr, "\n");						  \      }									  \  } while (YYID (0)) @@ -742,19 +719,17 @@ do {									  \  #if (defined __STDC__ || defined __C99__FUNC__ \       || defined __cplusplus || defined _MSC_VER)  static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)  #else  static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) +yy_symbol_value_print (yyoutput, yytype, yyvaluep)      FILE *yyoutput;      int yytype;      YYSTYPE const * const yyvaluep; -    YYLTYPE const * const yylocationp;  #endif  {    if (!yyvaluep)      return; -  YYUSE (yylocationp);  # ifdef YYPRINT    if (yytype < YYNTOKENS)      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); @@ -776,14 +751,13 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)  #if (defined __STDC__ || defined __C99__FUNC__ \       || defined __cplusplus || defined _MSC_VER)  static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)  #else  static void -yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) +yy_symbol_print (yyoutput, yytype, yyvaluep)      FILE *yyoutput;      int yytype;      YYSTYPE const * const yyvaluep; -    YYLTYPE const * const yylocationp;  #endif  {    if (yytype < YYNTOKENS) @@ -791,9 +765,7 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)    else      YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); -  YY_LOCATION_PRINT (yyoutput, *yylocationp); -  YYFPRINTF (yyoutput, ": "); -  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp); +  yy_symbol_value_print (yyoutput, yytype, yyvaluep);    YYFPRINTF (yyoutput, ")");  } @@ -805,17 +777,20 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)  #if (defined __STDC__ || defined __C99__FUNC__ \       || defined __cplusplus || defined _MSC_VER)  static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)  #else  static void -yy_stack_print (bottom, top) -    yytype_int16 *bottom; -    yytype_int16 *top; +yy_stack_print (yybottom, yytop) +    yytype_int16 *yybottom; +    yytype_int16 *yytop;  #endif  {    YYFPRINTF (stderr, "Stack now"); -  for (; bottom <= top; ++bottom) -    YYFPRINTF (stderr, " %d", *bottom); +  for (; yybottom <= yytop; yybottom++) +    { +      int yybot = *yybottom; +      YYFPRINTF (stderr, " %d", yybot); +    }    YYFPRINTF (stderr, "\n");  } @@ -833,12 +808,11 @@ do {								\  #if (defined __STDC__ || defined __C99__FUNC__ \       || defined __cplusplus || defined _MSC_VER)  static void -yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) +yy_reduce_print (YYSTYPE *yyvsp, int yyrule)  #else  static void -yy_reduce_print (yyvsp, yylsp, yyrule) +yy_reduce_print (yyvsp, yyrule)      YYSTYPE *yyvsp; -    YYLTYPE *yylsp;      int yyrule;  #endif  { @@ -850,18 +824,18 @@ yy_reduce_print (yyvsp, yylsp, yyrule)    /* The symbols being reduced.  */    for (yyi = 0; yyi < yynrhs; yyi++)      { -      fprintf (stderr, "   $%d = ", yyi + 1); +      YYFPRINTF (stderr, "   $%d = ", yyi + 1);        yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],  		       &(yyvsp[(yyi + 1) - (yynrhs)]) -		       , &(yylsp[(yyi + 1) - (yynrhs)])		       ); -      fprintf (stderr, "\n"); +		       		       ); +      YYFPRINTF (stderr, "\n");      }  }  # define YY_REDUCE_PRINT(Rule)		\  do {					\    if (yydebug)				\ -    yy_reduce_print (yyvsp, yylsp, Rule); \ +    yy_reduce_print (yyvsp, Rule); \  } while (YYID (0))  /* Nonzero means print parse trace.  It is left uninitialized so that @@ -1112,18 +1086,16 @@ yysyntax_error (char *yyresult, int yystate, int yychar)  #if (defined __STDC__ || defined __C99__FUNC__ \       || defined __cplusplus || defined _MSC_VER)  static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)  #else  static void -yydestruct (yymsg, yytype, yyvaluep, yylocationp) +yydestruct (yymsg, yytype, yyvaluep)      const char *yymsg;      int yytype;      YYSTYPE *yyvaluep; -    YYLTYPE *yylocationp;  #endif  {    YYUSE (yyvaluep); -  YYUSE (yylocationp);    if (!yymsg)      yymsg = "Deleting"; @@ -1136,10 +1108,8 @@ yydestruct (yymsg, yytype, yyvaluep, yylocationp)  	break;      }  } -  /* Prevent warnings from -Wmissing-prototypes.  */ -  #ifdef YYPARSE_PARAM  #if defined __STDC__ || defined __cplusplus  int yyparse (void *YYPARSE_PARAM); @@ -1155,23 +1125,20 @@ int yyparse ();  #endif /* ! YYPARSE_PARAM */ - -/* The look-ahead symbol.  */ +/* The lookahead symbol.  */  int yychar; -/* The semantic value of the look-ahead symbol.  */ +/* The semantic value of the lookahead symbol.  */  YYSTYPE yylval;  /* Number of syntax errors so far.  */  int yynerrs; -/* Location data for the look-ahead symbol.  */ -YYLTYPE yylloc; -/*----------. -| yyparse.  | -`----------*/ +/*-------------------------. +| yyparse or yypush_parse.  | +`-------------------------*/  #ifdef YYPARSE_PARAM  #if (defined __STDC__ || defined __C99__FUNC__ \ @@ -1195,79 +1162,70 @@ yyparse ()  #endif  #endif  { -   -  int yystate; -  int yyn; -  int yyresult; -  /* Number of tokens to shift before error messages enabled.  */ -  int yyerrstatus; -  /* Look-ahead token as an internal (translated) token number.  */ -  int yytoken = 0; -#if YYERROR_VERBOSE -  /* Buffer for error messages, and its allocated size.  */ -  char yymsgbuf[128]; -  char *yymsg = yymsgbuf; -  YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif -  /* Three stacks and their tools: -     `yyss': related to states, -     `yyvs': related to semantic values, -     `yyls': related to locations. -     Refer to the stacks thru separate pointers, to allow yyoverflow -     to reallocate them elsewhere.  */ +    int yystate; +    /* Number of tokens to shift before error messages enabled.  */ +    int yyerrstatus; -  /* The state stack.  */ -  yytype_int16 yyssa[YYINITDEPTH]; -  yytype_int16 *yyss = yyssa; -  yytype_int16 *yyssp; +    /* The stacks and their tools: +       `yyss': related to states. +       `yyvs': related to semantic values. -  /* The semantic value stack.  */ -  YYSTYPE yyvsa[YYINITDEPTH]; -  YYSTYPE *yyvs = yyvsa; -  YYSTYPE *yyvsp; +       Refer to the stacks thru separate pointers, to allow yyoverflow +       to reallocate them elsewhere.  */ -  /* The location stack.  */ -  YYLTYPE yylsa[YYINITDEPTH]; -  YYLTYPE *yyls = yylsa; -  YYLTYPE *yylsp; -  /* The locations where the error started and ended.  */ -  YYLTYPE yyerror_range[2]; +    /* The state stack.  */ +    yytype_int16 yyssa[YYINITDEPTH]; +    yytype_int16 *yyss; +    yytype_int16 *yyssp; -#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) +    /* The semantic value stack.  */ +    YYSTYPE yyvsa[YYINITDEPTH]; +    YYSTYPE *yyvs; +    YYSTYPE *yyvsp; -  YYSIZE_T yystacksize = YYINITDEPTH; +    YYSIZE_T yystacksize; +  int yyn; +  int yyresult; +  /* Lookahead token as an internal (translated) token number.  */ +  int yytoken;    /* The variables used to return semantic value and location from the       action routines.  */    YYSTYPE yyval; -  YYLTYPE yyloc; + +#if YYERROR_VERBOSE +  /* Buffer for error messages, and its allocated size.  */ +  char yymsgbuf[128]; +  char *yymsg = yymsgbuf; +  YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))    /* The number of symbols on the RHS of the reduced rule.       Keep to zero when no symbol should be popped.  */    int yylen = 0; +  yytoken = 0; +  yyss = yyssa; +  yyvs = yyvsa; +  yystacksize = YYINITDEPTH; +    YYDPRINTF ((stderr, "Starting parse\n"));    yystate = 0;    yyerrstatus = 0;    yynerrs = 0; -  yychar = YYEMPTY;		/* Cause a token to be read.  */ +  yychar = YYEMPTY; /* Cause a token to be read.  */    /* Initialize stack pointers.       Waste one element of value and location stack       so that they stay on the same level as the state stack.       The wasted elements are never initialized.  */ -    yyssp = yyss;    yyvsp = yyvs; -  yylsp = yyls; -#if YYLTYPE_IS_TRIVIAL -  /* Initialize the default location before parsing starts.  */ -  yylloc.first_line   = yylloc.last_line   = 1; -  yylloc.first_column = yylloc.last_column = 0; -#endif    goto yysetstate; @@ -1294,7 +1252,6 @@ yyparse ()  	   memory.  */  	YYSTYPE *yyvs1 = yyvs;  	yytype_int16 *yyss1 = yyss; -	YYLTYPE *yyls1 = yyls;  	/* Each stack pointer address is followed by the size of the  	   data in use in that stack, in bytes.  This used to be a @@ -1303,9 +1260,8 @@ yyparse ()  	yyoverflow (YY_("memory exhausted"),  		    &yyss1, yysize * sizeof (*yyssp),  		    &yyvs1, yysize * sizeof (*yyvsp), -		    &yyls1, yysize * sizeof (*yylsp),  		    &yystacksize); -	yyls = yyls1; +  	yyss = yyss1;  	yyvs = yyvs1;        } @@ -1326,9 +1282,8 @@ yyparse ()  	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));  	if (! yyptr)  	  goto yyexhaustedlab; -	YYSTACK_RELOCATE (yyss); -	YYSTACK_RELOCATE (yyvs); -	YYSTACK_RELOCATE (yyls); +	YYSTACK_RELOCATE (yyss_alloc, yyss); +	YYSTACK_RELOCATE (yyvs_alloc, yyvs);  #  undef YYSTACK_RELOCATE  	if (yyss1 != yyssa)  	  YYSTACK_FREE (yyss1); @@ -1338,7 +1293,6 @@ yyparse ()        yyssp = yyss + yysize - 1;        yyvsp = yyvs + yysize - 1; -      yylsp = yyls + yysize - 1;        YYDPRINTF ((stderr, "Stack size increased to %lu\n",  		  (unsigned long int) yystacksize)); @@ -1349,6 +1303,9 @@ yyparse ()    YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +  if (yystate == YYFINAL) +    YYACCEPT; +    goto yybackup;  /*-----------. @@ -1357,16 +1314,16 @@ yyparse ()  yybackup:    /* Do appropriate processing given the current state.  Read a -     look-ahead token if we need one and don't already have one.  */ +     lookahead token if we need one and don't already have one.  */ -  /* First try to decide what to do without reference to look-ahead token.  */ +  /* First try to decide what to do without reference to lookahead token.  */    yyn = yypact[yystate];    if (yyn == YYPACT_NINF)      goto yydefault; -  /* Not known => get a look-ahead token if don't already have one.  */ +  /* Not known => get a lookahead token if don't already have one.  */ -  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */ +  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */    if (yychar == YYEMPTY)      {        YYDPRINTF ((stderr, "Reading a token: ")); @@ -1398,24 +1355,20 @@ yybackup:        goto yyreduce;      } -  if (yyn == YYFINAL) -    YYACCEPT; -    /* Count tokens shifted since error; after three, turn off error       status.  */    if (yyerrstatus)      yyerrstatus--; -  /* Shift the look-ahead token.  */ +  /* Shift the lookahead token.  */    YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); -  /* Discard the shifted token unless it is eof.  */ -  if (yychar != YYEOF) -    yychar = YYEMPTY; +  /* Discard the shifted token.  */ +  yychar = YYEMPTY;    yystate = yyn;    *++yyvsp = yylval; -  *++yylsp = yylloc; +    goto yynewstate; @@ -1446,337 +1399,387 @@ yyreduce:       GCC warning that YYVAL may be used uninitialized.  */    yyval = yyvsp[1-yylen]; -  /* Default location.  */ -  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); +    YY_REDUCE_PRINT (yyn);    switch (yyn)      {          case 2: -#line 90 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 87 "dtc-parser.y"      { -			the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node), 0); +			the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node), +							guess_boot_cpuid((yyvsp[(4) - (4)].node)));  		;}      break;    case 3: -#line 94 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 95 "dtc-parser.y"      { -			the_boot_info = build_boot_info((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].node), 0); +			(yyval.re) = NULL;  		;}      break;    case 4: -#line 101 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 99 "dtc-parser.y"      { -			(yyval.re) = NULL; +			(yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));  		;}      break;    case 5: -#line 105 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 106 "dtc-parser.y"      { -			(yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re)); +			(yyval.re) = build_reserve_entry((yyvsp[(2) - (4)].addr), (yyvsp[(3) - (4)].addr));  		;}      break;    case 6: -#line 112 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 110 "dtc-parser.y"      { -			(yyval.re) = build_reserve_entry((yyvsp[(3) - (5)].addr), (yyvsp[(4) - (5)].addr), (yyvsp[(1) - (5)].labelref)); +			add_label(&(yyvsp[(2) - (2)].re)->labels, (yyvsp[(1) - (2)].labelref)); +			(yyval.re) = (yyvsp[(2) - (2)].re);  		;}      break;    case 7: -#line 119 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 118 "dtc-parser.y"      { -			(yyval.re) = NULL; +			(yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);  		;}      break;    case 8: -#line 123 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 125 "dtc-parser.y"      { -			(yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re)); +			(yyval.node) = name_node((yyvsp[(2) - (2)].node), "");  		;}      break;    case 9: -#line 130 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 129 "dtc-parser.y"      { -			(yyval.re) = (yyvsp[(1) - (1)].re); +			(yyval.node) = merge_nodes((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));  		;}      break;    case 10: -#line 134 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 133 "dtc-parser.y"      { -			(yyval.re) = build_reserve_entry((yyvsp[(3) - (6)].addr), (yyvsp[(5) - (6)].addr) - (yyvsp[(3) - (6)].addr) + 1, (yyvsp[(1) - (6)].labelref)); +			struct node *target = get_node_by_ref((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].labelref)); + +			if (target) +				merge_nodes(target, (yyvsp[(3) - (3)].node)); +			else +				print_error("label or path, '%s', not found", (yyvsp[(2) - (3)].labelref)); +			(yyval.node) = (yyvsp[(1) - (3)].node);  		;}      break;    case 11: -#line 141 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 146 "dtc-parser.y"      { -			(yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64); +			(yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));  		;}      break;    case 12: -#line 145 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 153 "dtc-parser.y"      { -			(yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 16, 64); +			(yyval.proplist) = NULL;  		;}      break;    case 13: -#line 152 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 157 "dtc-parser.y"      { -			(yyval.node) = name_node((yyvsp[(2) - (2)].node), "", NULL); +			(yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));  		;}      break;    case 14: -#line 159 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 164 "dtc-parser.y"      { -			(yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist)); +			(yyval.prop) = build_property((yyvsp[(1) - (4)].propnodename), (yyvsp[(3) - (4)].data));  		;}      break;    case 15: -#line 166 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 168 "dtc-parser.y"      { -			(yyval.proplist) = NULL; +			(yyval.prop) = build_property((yyvsp[(1) - (2)].propnodename), empty_data);  		;}      break;    case 16: -#line 170 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 172 "dtc-parser.y"      { -			(yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist)); +			add_label(&(yyvsp[(2) - (2)].prop)->labels, (yyvsp[(1) - (2)].labelref)); +			(yyval.prop) = (yyvsp[(2) - (2)].prop);  		;}      break;    case 17: -#line 177 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 180 "dtc-parser.y"      { -			(yyval.prop) = build_property((yyvsp[(2) - (5)].propnodename), (yyvsp[(4) - (5)].data), (yyvsp[(1) - (5)].labelref)); +			(yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));  		;}      break;    case 18: -#line 181 "dtc-parser.y" + +/* Line 1455 of yacc.c  */ +#line 184 "dtc-parser.y"      { -			(yyval.prop) = build_property((yyvsp[(2) - (3)].propnodename), empty_data, (yyvsp[(1) - (3)].labelref)); +			(yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));  		;}      break;    case 19: + +/* Line 1455 of yacc.c  */  #line 188 "dtc-parser.y"      { -			(yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data)); +			(yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));  		;}      break;    case 20: + +/* Line 1455 of yacc.c  */  #line 192 "dtc-parser.y"      { -			(yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data)); +			(yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));  		;}      break;    case 21: -#line 196 "dtc-parser.y" -    { -			(yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data)); -		;} -    break; - -  case 22: -#line 200 "dtc-parser.y" -    { -			(yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref)); -		;} -    break; -  case 23: -#line 204 "dtc-parser.y" +/* Line 1455 of yacc.c  */ +#line 196 "dtc-parser.y"      { -			struct search_path path = { srcpos_file->dir, NULL, NULL }; -			struct dtc_file *file = dtc_open_file((yyvsp[(4) - (9)].data).val, &path); -			struct data d = empty_data; +			FILE *f = srcfile_relative_open((yyvsp[(4) - (9)].data).val, NULL); +			struct data d;  			if ((yyvsp[(6) - (9)].addr) != 0) -				if (fseek(file->file, (yyvsp[(6) - (9)].addr), SEEK_SET) != 0) -					yyerrorf("Couldn't seek to offset %llu in \"%s\": %s", -						 (unsigned long long)(yyvsp[(6) - (9)].addr), -						 (yyvsp[(4) - (9)].data).val, strerror(errno)); +				if (fseek(f, (yyvsp[(6) - (9)].addr), SEEK_SET) != 0) +					print_error("Couldn't seek to offset %llu in \"%s\": %s", +						     (unsigned long long)(yyvsp[(6) - (9)].addr), +						     (yyvsp[(4) - (9)].data).val, +						     strerror(errno)); -			d = data_copy_file(file->file, (yyvsp[(8) - (9)].addr)); +			d = data_copy_file(f, (yyvsp[(8) - (9)].addr));  			(yyval.data) = data_merge((yyvsp[(1) - (9)].data), d); -			dtc_close_file(file); +			fclose(f);  		;}      break; -  case 24: -#line 221 "dtc-parser.y" +  case 22: + +/* Line 1455 of yacc.c  */ +#line 213 "dtc-parser.y"      { -			struct search_path path = { srcpos_file->dir, NULL, NULL }; -			struct dtc_file *file = dtc_open_file((yyvsp[(4) - (5)].data).val, &path); +			FILE *f = srcfile_relative_open((yyvsp[(4) - (5)].data).val, NULL);  			struct data d = empty_data; -			d = data_copy_file(file->file, -1); +			d = data_copy_file(f, -1);  			(yyval.data) = data_merge((yyvsp[(1) - (5)].data), d); -			dtc_close_file(file); +			fclose(f);  		;}      break; -  case 25: -#line 232 "dtc-parser.y" +  case 23: + +/* Line 1455 of yacc.c  */ +#line 223 "dtc-parser.y"      {  			(yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));  		;}      break; -  case 26: -#line 239 "dtc-parser.y" +  case 24: + +/* Line 1455 of yacc.c  */ +#line 230 "dtc-parser.y"      {  			(yyval.data) = empty_data;  		;}      break; -  case 27: -#line 243 "dtc-parser.y" +  case 25: + +/* Line 1455 of yacc.c  */ +#line 234 "dtc-parser.y"      {  			(yyval.data) = (yyvsp[(1) - (2)].data);  		;}      break; -  case 28: -#line 247 "dtc-parser.y" +  case 26: + +/* Line 1455 of yacc.c  */ +#line 238 "dtc-parser.y"      {  			(yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));  		;}      break; -  case 29: -#line 254 "dtc-parser.y" +  case 27: + +/* Line 1455 of yacc.c  */ +#line 245 "dtc-parser.y"      {  			(yyval.data) = empty_data;  		;}      break; -  case 30: -#line 258 "dtc-parser.y" +  case 28: + +/* Line 1455 of yacc.c  */ +#line 249 "dtc-parser.y"      {  			(yyval.data) = data_append_cell((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].cell));  		;}      break; -  case 31: -#line 262 "dtc-parser.y" +  case 29: + +/* Line 1455 of yacc.c  */ +#line 253 "dtc-parser.y"      {  			(yyval.data) = data_append_cell(data_add_marker((yyvsp[(1) - (2)].data), REF_PHANDLE,  							      (yyvsp[(2) - (2)].labelref)), -1);  		;}      break; -  case 32: -#line 267 "dtc-parser.y" +  case 30: + +/* Line 1455 of yacc.c  */ +#line 258 "dtc-parser.y"      {  			(yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));  		;}      break; -  case 33: -#line 274 "dtc-parser.y" -    { -			(yyval.cbase) = 16; -		;} -    break; +  case 31: -  case 35: -#line 282 "dtc-parser.y" +/* Line 1455 of yacc.c  */ +#line 265 "dtc-parser.y"      {  			(yyval.cell) = eval_literal((yyvsp[(1) - (1)].literal), 0, 32);  		;}      break; -  case 36: -#line 286 "dtc-parser.y" -    { -			(yyval.cell) = eval_literal((yyvsp[(2) - (2)].literal), (yyvsp[(1) - (2)].cbase), 32); -		;} -    break; +  case 32: -  case 37: -#line 293 "dtc-parser.y" +/* Line 1455 of yacc.c  */ +#line 272 "dtc-parser.y"      {  			(yyval.data) = empty_data;  		;}      break; -  case 38: -#line 297 "dtc-parser.y" +  case 33: + +/* Line 1455 of yacc.c  */ +#line 276 "dtc-parser.y"      {  			(yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));  		;}      break; -  case 39: -#line 301 "dtc-parser.y" +  case 34: + +/* Line 1455 of yacc.c  */ +#line 280 "dtc-parser.y"      {  			(yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));  		;}      break; -  case 40: -#line 308 "dtc-parser.y" +  case 35: + +/* Line 1455 of yacc.c  */ +#line 287 "dtc-parser.y"      {  			(yyval.nodelist) = NULL;  		;}      break; -  case 41: -#line 312 "dtc-parser.y" +  case 36: + +/* Line 1455 of yacc.c  */ +#line 291 "dtc-parser.y"      {  			(yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));  		;}      break; -  case 42: -#line 316 "dtc-parser.y" +  case 37: + +/* Line 1455 of yacc.c  */ +#line 295 "dtc-parser.y"      { -			yyerror("syntax error: properties must precede subnodes"); +			print_error("syntax error: properties must precede subnodes");  			YYERROR;  		;}      break; -  case 43: -#line 324 "dtc-parser.y" -    { -			(yyval.node) = name_node((yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].propnodename), (yyvsp[(1) - (3)].labelref)); -		;} -    break; +  case 38: -  case 44: -#line 331 "dtc-parser.y" +/* Line 1455 of yacc.c  */ +#line 303 "dtc-parser.y"      { -			(yyval.labelref) = NULL; +			(yyval.node) = name_node((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].propnodename));  		;}      break; -  case 45: -#line 335 "dtc-parser.y" +  case 39: + +/* Line 1455 of yacc.c  */ +#line 307 "dtc-parser.y"      { -			(yyval.labelref) = (yyvsp[(1) - (1)].labelref); +			add_label(&(yyvsp[(2) - (2)].node)->labels, (yyvsp[(1) - (2)].labelref)); +			(yyval.node) = (yyvsp[(2) - (2)].node);  		;}      break; -/* Line 1267 of yacc.c.  */ -#line 1780 "dtc-parser.tab.c" + +/* Line 1455 of yacc.c  */ +#line 1783 "dtc-parser.tab.c"        default: break;      }    YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -1786,7 +1789,6 @@ yyreduce:    YY_STACK_PRINT (yyss, yyssp);    *++yyvsp = yyval; -  *++yylsp = yyloc;    /* Now `shift' the result of the reduction.  Determine what state       that goes to, based on the state we popped back to and the rule @@ -1848,11 +1850,11 @@ yyerrlab:  #endif      } -  yyerror_range[0] = yylloc; +    if (yyerrstatus == 3)      { -      /* If just tried and failed to reuse look-ahead token after an +      /* If just tried and failed to reuse lookahead token after an  	 error, discard it.  */        if (yychar <= YYEOF) @@ -1864,12 +1866,12 @@ yyerrlab:        else  	{  	  yydestruct ("Error: discarding", -		      yytoken, &yylval, &yylloc); +		      yytoken, &yylval);  	  yychar = YYEMPTY;  	}      } -  /* Else will try to reuse look-ahead token after shifting the error +  /* Else will try to reuse lookahead token after shifting the error       token.  */    goto yyerrlab1; @@ -1885,7 +1887,6 @@ yyerrorlab:    if (/*CONSTCOND*/ 0)       goto yyerrorlab; -  yyerror_range[0] = yylsp[1-yylen];    /* Do not reclaim the symbols of the rule which action triggered       this YYERROR.  */    YYPOPSTACK (yylen); @@ -1919,24 +1920,16 @@ yyerrlab1:        if (yyssp == yyss)  	YYABORT; -      yyerror_range[0] = *yylsp; +        yydestruct ("Error: popping", -		  yystos[yystate], yyvsp, yylsp); +		  yystos[yystate], yyvsp);        YYPOPSTACK (1);        yystate = *yyssp;        YY_STACK_PRINT (yyss, yyssp);      } -  if (yyn == YYFINAL) -    YYACCEPT; -    *++yyvsp = yylval; -  yyerror_range[1] = yylloc; -  /* Using YYLLOC is tempting, but would change the location of -     the look-ahead.  YYLOC is available though.  */ -  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); -  *++yylsp = yyloc;    /* Shift the error token.  */    YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); @@ -1959,7 +1952,7 @@ yyabortlab:    yyresult = 1;    goto yyreturn; -#ifndef yyoverflow +#if !defined(yyoverflow) || YYERROR_VERBOSE  /*-------------------------------------------------.  | yyexhaustedlab -- memory exhaustion comes here.  |  `-------------------------------------------------*/ @@ -1970,9 +1963,9 @@ yyexhaustedlab:  #endif  yyreturn: -  if (yychar != YYEOF && yychar != YYEMPTY) +  if (yychar != YYEMPTY)       yydestruct ("Cleanup: discarding lookahead", -		 yytoken, &yylval, &yylloc); +		 yytoken, &yylval);    /* Do not reclaim the symbols of the rule which action triggered       this YYABORT or YYACCEPT.  */    YYPOPSTACK (yylen); @@ -1980,7 +1973,7 @@ yyreturn:    while (yyssp != yyss)      {        yydestruct ("Cleanup: popping", -		  yystos[*yyssp], yyvsp, yylsp); +		  yystos[*yyssp], yyvsp);        YYPOPSTACK (1);      }  #ifndef yyoverflow @@ -1996,29 +1989,24 @@ yyreturn:  } -#line 340 "dtc-parser.y" + +/* Line 1675 of yacc.c  */ +#line 313 "dtc-parser.y" -void yyerrorf(char const *s, ...) +void print_error(char const *fmt, ...)  { -	const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";  	va_list va; -	va_start(va, s); - -	if (strcmp(fname, "-") == 0) -		fname = "stdin"; -	fprintf(stderr, "%s:%d ", fname, yylloc.first_line); -	vfprintf(stderr, s, va); -	fprintf(stderr, "\n"); +	va_start(va, fmt); +	srcpos_verror(&yylloc, fmt, va); +	va_end(va);  	treesource_error = 1; -	va_end(va);  } -void yyerror (char const *s) -{ -	yyerrorf("%s", s); +void yyerror(char const *s) { +	print_error("%s", s);  }  static unsigned long long eval_literal(const char *s, int base, int bits) @@ -2029,12 +2017,12 @@ static unsigned long long eval_literal(const char *s, int base, int bits)  	errno = 0;  	val = strtoull(s, &e, base);  	if (*e) -		yyerror("bad characters in literal"); +		print_error("bad characters in literal");  	else if ((errno == ERANGE)  		 || ((bits < 64) && (val >= (1ULL << bits)))) -		yyerror("literal out of range"); +		print_error("literal out of range");  	else if (errno != 0) -		yyerror("bad literal"); +		print_error("bad literal");  	return val;  } diff --git a/scripts/dtc/dtc-parser.tab.h_shipped b/scripts/dtc/dtc-parser.tab.h_shipped index ba99100d55c9..95c9547adea5 100644 --- a/scripts/dtc/dtc-parser.tab.h_shipped +++ b/scripts/dtc/dtc-parser.tab.h_shipped @@ -1,24 +1,23 @@ -/* A Bison parser, made by GNU Bison 2.3.  */ -/* Skeleton interface for Bison's Yacc-like parsers in C +/* A Bison parser, made by GNU Bison 2.4.1.  */ -   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +/* Skeleton interface for Bison's Yacc-like parsers in C +    +      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006     Free Software Foundation, Inc. - -   This program is free software; you can redistribute it and/or modify +    +   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, or (at your option) -   any later version. - +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. +        This program is distributed in the hope that it will be useful,     but WITHOUT ANY WARRANTY; without even the implied warranty of     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     GNU General Public License for more details. - +        You should have received a copy of the GNU General Public License -   along with this program; if not, write to the Free Software -   Foundation, Inc., 51 Franklin Street, Fifth Floor, -   Boston, MA 02110-1301, USA.  */ +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */  /* As a special exception, you may create a larger work that contains     part or all of the Bison parser skeleton and distribute that work @@ -29,10 +28,11 @@     special exception, which will cause the skeleton and the resulting     Bison output files to be licensed under the GNU General Public     License without this special exception. - +        This special exception was added by the Free Software Foundation in     version 2.2 of Bison.  */ +  /* Tokens.  */  #ifndef YYTOKENTYPE  # define YYTOKENTYPE @@ -43,35 +43,24 @@       DT_MEMRESERVE = 259,       DT_PROPNODENAME = 260,       DT_LITERAL = 261, -     DT_LEGACYLITERAL = 262, -     DT_BASE = 263, -     DT_BYTE = 264, -     DT_STRING = 265, -     DT_LABEL = 266, -     DT_REF = 267, -     DT_INCBIN = 268 +     DT_BASE = 262, +     DT_BYTE = 263, +     DT_STRING = 264, +     DT_LABEL = 265, +     DT_REF = 266, +     DT_INCBIN = 267     };  #endif -/* Tokens.  */ -#define DT_V1 258 -#define DT_MEMRESERVE 259 -#define DT_PROPNODENAME 260 -#define DT_LITERAL 261 -#define DT_LEGACYLITERAL 262 -#define DT_BASE 263 -#define DT_BYTE 264 -#define DT_STRING 265 -#define DT_LABEL 266 -#define DT_REF 267 -#define DT_INCBIN 268 -  #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED  typedef union YYSTYPE -#line 37 "dtc-parser.y"  { + +/* Line 1676 of yacc.c  */ +#line 39 "dtc-parser.y" +  	char *propnodename;  	char *literal;  	char *labelref; @@ -86,28 +75,17 @@ typedef union YYSTYPE  	struct node *node;  	struct node *nodelist;  	struct reserve_info *re; -} -/* Line 1489 of yacc.c.  */ -#line 92 "dtc-parser.tab.h" -	YYSTYPE; + + + +/* Line 1676 of yacc.c  */ +#line 83 "dtc-parser.tab.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1  # define yystype YYSTYPE /* obsolescent; will be withdrawn */  # define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1  #endif  extern YYSTYPE yylval; -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE -{ -  int first_line; -  int first_column; -  int last_line; -  int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif -extern YYLTYPE yylloc; diff --git a/scripts/dtc/dtc-parser.y b/scripts/dtc/dtc-parser.y index b2ab562420ea..5e84a67fc1d2 100644 --- a/scripts/dtc/dtc-parser.y +++ b/scripts/dtc/dtc-parser.y @@ -18,15 +18,17 @@   *                                                                   USA   */ -%locations -  %{  #include <stdio.h>  #include "dtc.h"  #include "srcpos.h" +YYLTYPE yylloc; +  extern int yylex(void); +extern void print_error(char const *fmt, ...); +extern void yyerror(char const *s);  extern struct boot_info *the_boot_info;  extern int treesource_error; @@ -55,7 +57,6 @@ static unsigned long long eval_literal(const char *s, int base, int bits);  %token DT_MEMRESERVE  %token <propnodename> DT_PROPNODENAME  %token <literal> DT_LITERAL -%token <literal> DT_LEGACYLITERAL  %token <cbase> DT_BASE  %token <byte> DT_BYTE  %token <data> DT_STRING @@ -67,11 +68,8 @@ static unsigned long long eval_literal(const char *s, int base, int bits);  %type <data> propdataprefix  %type <re> memreserve  %type <re> memreserves -%type <re> v0_memreserve -%type <re> v0_memreserves  %type <addr> addr  %type <data> celllist -%type <cbase> cellbase  %type <cell> cellval  %type <data> bytestring  %type <prop> propdef @@ -81,18 +79,14 @@ static unsigned long long eval_literal(const char *s, int base, int bits);  %type <node> nodedef  %type <node> subnode  %type <nodelist> subnodes -%type <labelref> label  %%  sourcefile:  	  DT_V1 ';' memreserves devicetree  		{ -			the_boot_info = build_boot_info($3, $4, 0); -		} -	| v0_memreserves devicetree -		{ -			the_boot_info = build_boot_info($1, $2, 0); +			the_boot_info = build_boot_info($3, $4, +							guess_boot_cpuid($4));  		}  	; @@ -108,31 +102,14 @@ memreserves:  	;  memreserve: -	  label DT_MEMRESERVE addr addr ';' +	  DT_MEMRESERVE addr addr ';'  		{ -			$$ = build_reserve_entry($3, $4, $1); +			$$ = build_reserve_entry($2, $3);  		} -	; - -v0_memreserves: -	  /* empty */ +	| DT_LABEL memreserve  		{ -			$$ = NULL; -		} -	| v0_memreserve v0_memreserves -		{ -			$$ = chain_reserve_entry($1, $2); -		}; -	; - -v0_memreserve: -	  memreserve -		{ -			$$ = $1; -		} -	| label DT_MEMRESERVE addr '-' addr ';' -		{ -			$$ = build_reserve_entry($3, $5 - $3 + 1, $1); +			add_label(&$2->labels, $1); +			$$ = $2;  		}  	; @@ -141,16 +118,26 @@ addr:  		{  			$$ = eval_literal($1, 0, 64);  		} -	| DT_LEGACYLITERAL -		{ -			$$ = eval_literal($1, 16, 64); -		}  	  ;  devicetree:  	  '/' nodedef  		{ -			$$ = name_node($2, "", NULL); +			$$ = name_node($2, ""); +		} +	| devicetree '/' nodedef +		{ +			$$ = merge_nodes($1, $3); +		} +	| devicetree DT_REF nodedef +		{ +			struct node *target = get_node_by_ref($1, $2); + +			if (target) +				merge_nodes(target, $3); +			else +				print_error("label or path, '%s', not found", $2); +			$$ = $1;  		}  	; @@ -173,13 +160,18 @@ proplist:  	;  propdef: -	  label DT_PROPNODENAME '=' propdata ';' +	  DT_PROPNODENAME '=' propdata ';' +		{ +			$$ = build_property($1, $3); +		} +	| DT_PROPNODENAME ';'  		{ -			$$ = build_property($2, $4, $1); +			$$ = build_property($1, empty_data);  		} -	| label DT_PROPNODENAME ';' +	| DT_LABEL propdef  		{ -			$$ = build_property($2, empty_data, $1); +			add_label(&$2->labels, $1); +			$$ = $2;  		}  	; @@ -202,31 +194,30 @@ propdata:  		}  	| propdataprefix DT_INCBIN '(' DT_STRING ',' addr ',' addr ')'  		{ -			struct search_path path = { srcpos_file->dir, NULL, NULL }; -			struct dtc_file *file = dtc_open_file($4.val, &path); -			struct data d = empty_data; +			FILE *f = srcfile_relative_open($4.val, NULL); +			struct data d;  			if ($6 != 0) -				if (fseek(file->file, $6, SEEK_SET) != 0) -					yyerrorf("Couldn't seek to offset %llu in \"%s\": %s", -						 (unsigned long long)$6, -						 $4.val, strerror(errno)); +				if (fseek(f, $6, SEEK_SET) != 0) +					print_error("Couldn't seek to offset %llu in \"%s\": %s", +						     (unsigned long long)$6, +						     $4.val, +						     strerror(errno)); -			d = data_copy_file(file->file, $8); +			d = data_copy_file(f, $8);  			$$ = data_merge($1, d); -			dtc_close_file(file); +			fclose(f);  		}  	| propdataprefix DT_INCBIN '(' DT_STRING ')'  		{ -			struct search_path path = { srcpos_file->dir, NULL, NULL }; -			struct dtc_file *file = dtc_open_file($4.val, &path); +			FILE *f = srcfile_relative_open($4.val, NULL);  			struct data d = empty_data; -			d = data_copy_file(file->file, -1); +			d = data_copy_file(f, -1);  			$$ = data_merge($1, d); -			dtc_close_file(file); +			fclose(f);  		}  	| propdata DT_LABEL  		{ @@ -269,23 +260,11 @@ celllist:  		}  	; -cellbase: -	  /* empty */ -		{ -			$$ = 16; -		} -	| DT_BASE -	; -  cellval:  	  DT_LITERAL  		{  			$$ = eval_literal($1, 0, 32);  		} -	| cellbase DT_LEGACYLITERAL -		{ -			$$ = eval_literal($2, $1, 32); -		}  	;  bytestring: @@ -308,57 +287,44 @@ subnodes:  		{  			$$ = NULL;  		} -	|  subnode subnodes +	| subnode subnodes  		{  			$$ = chain_node($1, $2);  		}  	| subnode propdef  		{ -			yyerror("syntax error: properties must precede subnodes"); +			print_error("syntax error: properties must precede subnodes");  			YYERROR;  		}  	;  subnode: -	  label DT_PROPNODENAME nodedef +	  DT_PROPNODENAME nodedef  		{ -			$$ = name_node($3, $2, $1); +			$$ = name_node($2, $1);  		} -	; - -label: -	  /* empty */ +	| DT_LABEL subnode  		{ -			$$ = NULL; -		} -	| DT_LABEL -		{ -			$$ = $1; +			add_label(&$2->labels, $1); +			$$ = $2;  		}  	;  %% -void yyerrorf(char const *s, ...) +void print_error(char const *fmt, ...)  { -	const char *fname = srcpos_file ? srcpos_file->name : "<no-file>";  	va_list va; -	va_start(va, s); - -	if (strcmp(fname, "-") == 0) -		fname = "stdin"; -	fprintf(stderr, "%s:%d ", fname, yylloc.first_line); -	vfprintf(stderr, s, va); -	fprintf(stderr, "\n"); +	va_start(va, fmt); +	srcpos_verror(&yylloc, fmt, va); +	va_end(va);  	treesource_error = 1; -	va_end(va);  } -void yyerror (char const *s) -{ -	yyerrorf("%s", s); +void yyerror(char const *s) { +	print_error("%s", s);  }  static unsigned long long eval_literal(const char *s, int base, int bits) @@ -369,11 +335,11 @@ static unsigned long long eval_literal(const char *s, int base, int bits)  	errno = 0;  	val = strtoull(s, &e, base);  	if (*e) -		yyerror("bad characters in literal"); +		print_error("bad characters in literal");  	else if ((errno == ERANGE)  		 || ((bits < 64) && (val >= (1ULL << bits)))) -		yyerror("literal out of range"); +		print_error("literal out of range");  	else if (errno != 0) -		yyerror("bad literal"); +		print_error("bad literal");  	return val;  } diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c index d8fd43b4ac1a..cbc0193098e4 100644 --- a/scripts/dtc/dtc.c +++ b/scripts/dtc/dtc.c @@ -30,30 +30,7 @@ int quiet;		/* Level of quietness */  int reservenum;		/* Number of memory reservation slots */  int minsize;		/* Minimum blob size */  int padsize;		/* Additional padding to blob */ - -char *join_path(const char *path, const char *name) -{ -	int lenp = strlen(path); -	int lenn = strlen(name); -	int len; -	int needslash = 1; -	char *str; - -	len = lenp + lenn + 2; -	if ((lenp > 0) && (path[lenp-1] == '/')) { -		needslash = 0; -		len--; -	} - -	str = xmalloc(len); -	memcpy(str, path, lenp); -	if (needslash) { -		str[lenp] = '/'; -		lenp++; -	} -	memcpy(str+lenp, name, lenn+1); -	return str; -} +int phandle_format = PHANDLE_BOTH;	/* Use linux,phandle or phandle properties */  static void fill_fullpaths(struct node *tree, const char *prefix)  { @@ -104,8 +81,15 @@ static void  __attribute__ ((noreturn)) usage(void)  	fprintf(stderr, "\t\tSet the physical boot cpu\n");  	fprintf(stderr, "\t-f\n");  	fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n"); +	fprintf(stderr, "\t-s\n"); +	fprintf(stderr, "\t\tSort nodes and properties before outputting (only useful for\n\t\tcomparing trees)\n");  	fprintf(stderr, "\t-v\n");  	fprintf(stderr, "\t\tPrint DTC version and exit\n"); +	fprintf(stderr, "\t-H <phandle format>\n"); +	fprintf(stderr, "\t\tphandle formats are:\n"); +	fprintf(stderr, "\t\t\tlegacy - \"linux,phandle\" properties only\n"); +	fprintf(stderr, "\t\t\tepapr - \"phandle\" properties only\n"); +	fprintf(stderr, "\t\t\tboth - Both \"linux,phandle\" and \"phandle\" properties\n");  	exit(3);  } @@ -115,7 +99,7 @@ int main(int argc, char *argv[])  	const char *inform = "dts";  	const char *outform = "dts";  	const char *outname = "-"; -	int force = 0, check = 0; +	int force = 0, check = 0, sort = 0;  	const char *arg;  	int opt;  	FILE *outf = NULL; @@ -127,7 +111,7 @@ int main(int argc, char *argv[])  	minsize    = 0;  	padsize    = 0; -	while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:v")) != EOF) { +	while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:vH:s")) != EOF) {  		switch (opt) {  		case 'I':  			inform = optarg; @@ -165,6 +149,22 @@ int main(int argc, char *argv[])  		case 'v':  			printf("Version: %s\n", DTC_VERSION);  			exit(0); +		case 'H': +			if (streq(optarg, "legacy")) +				phandle_format = PHANDLE_LEGACY; +			else if (streq(optarg, "epapr")) +				phandle_format = PHANDLE_EPAPR; +			else if (streq(optarg, "both")) +				phandle_format = PHANDLE_BOTH; +			else +				die("Invalid argument \"%s\" to -H option\n", +				    optarg); +			break; + +		case 's': +			sort = 1; +			break; +  		case 'h':  		default:  			usage(); @@ -182,6 +182,9 @@ int main(int argc, char *argv[])  	if (minsize && padsize)  		die("Can't set both -p and -S\n"); +	if (minsize) +		fprintf(stderr, "DTC: Use of \"-S\" is deprecated; it will be removed soon, use \"-p\" instead\n"); +  	fprintf(stderr, "DTC: %s->%s  on file \"%s\"\n",  		inform, outform, arg); @@ -200,6 +203,8 @@ int main(int argc, char *argv[])  	fill_fullpaths(bi->dt, "");  	process_checks(force, bi); +	if (sort) +		sort_tree(bi);  	if (streq(outname, "-")) {  		outf = stdout; diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h index 08d54c870086..f37c97eb3dfc 100644 --- a/scripts/dtc/dtc.h +++ b/scripts/dtc/dtc.h @@ -34,7 +34,17 @@  #include <libfdt_env.h>  #include <fdt.h> +#include "util.h" + +#ifdef DEBUG +#define debug(fmt,args...)	printf(fmt, ##args) +#else +#define debug(fmt,args...) +#endif + +  #define DEFAULT_FDT_VERSION	17 +  /*   * Command line options   */ @@ -42,36 +52,11 @@ extern int quiet;		/* Level of quietness */  extern int reservenum;		/* Number of memory reservation slots */  extern int minsize;		/* Minimum blob size */  extern int padsize;		/* Additional padding to blob */ +extern int phandle_format;	/* Use linux,phandle or phandle properties */ -static inline void __attribute__((noreturn)) die(char * str, ...) -{ -	va_list ap; - -	va_start(ap, str); -	fprintf(stderr, "FATAL ERROR: "); -	vfprintf(stderr, str, ap); -	exit(1); -} - -static inline void *xmalloc(size_t len) -{ -	void *new = malloc(len); - -	if (! new) -		die("malloc() failed\n"); - -	return new; -} - -static inline void *xrealloc(void *p, size_t len) -{ -	void *new = realloc(p, len); - -	if (! new) -		die("realloc() failed (len=%d)\n", len); - -	return new; -} +#define PHANDLE_LEGACY	0x1 +#define PHANDLE_EPAPR	0x2 +#define PHANDLE_BOTH	0x3  typedef uint32_t cell_t; @@ -140,13 +125,18 @@ int data_is_one_string(struct data d);  #define MAX_NODENAME_LEN	31  /* Live trees */ +struct label { +	char *label; +	struct label *next; +}; +  struct property {  	char *name;  	struct data val;  	struct property *next; -	char *label; +	struct label *labels;  };  struct node { @@ -163,22 +153,28 @@ struct node {  	cell_t phandle;  	int addr_cells, size_cells; -	char *label; +	struct label *labels;  }; +#define for_each_label(l0, l) \ +	for ((l) = (l0); (l); (l) = (l)->next) +  #define for_each_property(n, p) \  	for ((p) = (n)->proplist; (p); (p) = (p)->next)  #define for_each_child(n, c)	\  	for ((c) = (n)->children; (c); (c) = (c)->next_sibling) -struct property *build_property(char *name, struct data val, char *label); +void add_label(struct label **labels, char *label); + +struct property *build_property(char *name, struct data val);  struct property *chain_property(struct property *first, struct property *list);  struct property *reverse_properties(struct property *first);  struct node *build_node(struct property *proplist, struct node *children); -struct node *name_node(struct node *node, char *name, char *label); +struct node *name_node(struct node *node, char *name);  struct node *chain_node(struct node *first, struct node *list); +struct node *merge_nodes(struct node *old_node, struct node *new_node);  void add_property(struct node *node, struct property *prop);  void add_child(struct node *parent, struct node *child); @@ -186,6 +182,10 @@ void add_child(struct node *parent, struct node *child);  const char *get_unitname(struct node *node);  struct property *get_property(struct node *node, const char *propname);  cell_t propval_cell(struct property *prop); +struct property *get_property_by_label(struct node *tree, const char *label, +				       struct node **node); +struct marker *get_marker_label(struct node *tree, const char *label, +				struct node **node, struct property **prop);  struct node *get_subnode(struct node *node, const char *nodename);  struct node *get_node_by_path(struct node *tree, const char *path);  struct node *get_node_by_label(struct node *tree, const char *label); @@ -193,6 +193,8 @@ struct node *get_node_by_phandle(struct node *tree, cell_t phandle);  struct node *get_node_by_ref(struct node *tree, const char *ref);  cell_t get_node_phandle(struct node *root, struct node *node); +uint32_t guess_boot_cpuid(struct node *tree); +  /* Boot info (tree plus memreserve information */  struct reserve_info { @@ -200,10 +202,10 @@ struct reserve_info {  	struct reserve_info *next; -	char *label; +	struct label *labels;  }; -struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len, char *label); +struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len);  struct reserve_info *chain_reserve_entry(struct reserve_info *first,  					 struct reserve_info *list);  struct reserve_info *add_reserve_entry(struct reserve_info *list, @@ -218,6 +220,7 @@ struct boot_info {  struct boot_info *build_boot_info(struct reserve_info *reservelist,  				  struct node *tree, uint32_t boot_cpuid_phys); +void sort_tree(struct boot_info *bi);  /* Checks */ @@ -239,8 +242,4 @@ struct boot_info *dt_from_source(const char *f);  struct boot_info *dt_from_fs(const char *dirname); -/* misc */ - -char *join_path(const char *path, const char *name); -  #endif /* _DTC_H */ diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c index 76acd28c068d..ead0332c87e1 100644 --- a/scripts/dtc/flattree.c +++ b/scripts/dtc/flattree.c @@ -52,9 +52,9 @@ struct emitter {  	void (*string)(void *, char *, int);  	void (*align)(void *, int);  	void (*data)(void *, struct data); -	void (*beginnode)(void *, const char *); -	void (*endnode)(void *, const char *); -	void (*property)(void *, const char *); +	void (*beginnode)(void *, struct label *labels); +	void (*endnode)(void *, struct label *labels); +	void (*property)(void *, struct label *labels);  };  static void bin_emit_cell(void *e, cell_t val) @@ -89,17 +89,17 @@ static void bin_emit_data(void *e, struct data d)  	*dtbuf = data_append_data(*dtbuf, d.val, d.len);  } -static void bin_emit_beginnode(void *e, const char *label) +static void bin_emit_beginnode(void *e, struct label *labels)  {  	bin_emit_cell(e, FDT_BEGIN_NODE);  } -static void bin_emit_endnode(void *e, const char *label) +static void bin_emit_endnode(void *e, struct label *labels)  {  	bin_emit_cell(e, FDT_END_NODE);  } -static void bin_emit_property(void *e, const char *label) +static void bin_emit_property(void *e, struct label *labels)  {  	bin_emit_cell(e, FDT_PROP);  } @@ -127,11 +127,21 @@ static void emit_offset_label(FILE *f, const char *label, int offset)  	fprintf(f, "%s\t= . + %d\n", label, offset);  } +#define ASM_EMIT_BELONG(f, fmt, ...) \ +	{ \ +		fprintf((f), "\t.byte\t((" fmt ") >> 24) & 0xff\n", __VA_ARGS__); \ +		fprintf((f), "\t.byte\t((" fmt ") >> 16) & 0xff\n", __VA_ARGS__); \ +		fprintf((f), "\t.byte\t((" fmt ") >> 8) & 0xff\n", __VA_ARGS__); \ +		fprintf((f), "\t.byte\t(" fmt ") & 0xff\n", __VA_ARGS__); \ +	} +  static void asm_emit_cell(void *e, cell_t val)  {  	FILE *f = e; -	fprintf(f, "\t.long\t0x%x\n", val); +	fprintf(f, "\t.byte 0x%02x; .byte 0x%02x; .byte 0x%02x; .byte 0x%02x\n", +		(val >> 24) & 0xff, (val >> 16) & 0xff, +		(val >> 8) & 0xff, val & 0xff);  }  static void asm_emit_string(void *e, char *str, int len) @@ -156,7 +166,7 @@ static void asm_emit_align(void *e, int a)  {  	FILE *f = e; -	fprintf(f, "\t.balign\t%d\n", a); +	fprintf(f, "\t.balign\t%d, 0\n", a);  }  static void asm_emit_data(void *e, struct data d) @@ -169,8 +179,7 @@ static void asm_emit_data(void *e, struct data d)  		emit_offset_label(f, m->ref, m->offset);  	while ((d.len - off) >= sizeof(uint32_t)) { -		fprintf(f, "\t.long\t0x%x\n", -			fdt32_to_cpu(*((uint32_t *)(d.val+off)))); +		asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off))));  		off += sizeof(uint32_t);  	} @@ -182,37 +191,43 @@ static void asm_emit_data(void *e, struct data d)  	assert(off == d.len);  } -static void asm_emit_beginnode(void *e, const char *label) +static void asm_emit_beginnode(void *e, struct label *labels)  {  	FILE *f = e; +	struct label *l; -	if (label) { -		fprintf(f, "\t.globl\t%s\n", label); -		fprintf(f, "%s:\n", label); +	for_each_label(labels, l) { +		fprintf(f, "\t.globl\t%s\n", l->label); +		fprintf(f, "%s:\n", l->label);  	} -	fprintf(f, "\t.long\tFDT_BEGIN_NODE\n"); +	fprintf(f, "\t/* FDT_BEGIN_NODE */\n"); +	asm_emit_cell(e, FDT_BEGIN_NODE);  } -static void asm_emit_endnode(void *e, const char *label) +static void asm_emit_endnode(void *e, struct label *labels)  {  	FILE *f = e; +	struct label *l; -	fprintf(f, "\t.long\tFDT_END_NODE\n"); -	if (label) { -		fprintf(f, "\t.globl\t%s_end\n", label); -		fprintf(f, "%s_end:\n", label); +	fprintf(f, "\t/* FDT_END_NODE */\n"); +	asm_emit_cell(e, FDT_END_NODE); +	for_each_label(labels, l) { +		fprintf(f, "\t.globl\t%s_end\n", l->label); +		fprintf(f, "%s_end:\n", l->label);  	}  } -static void asm_emit_property(void *e, const char *label) +static void asm_emit_property(void *e, struct label *labels)  {  	FILE *f = e; +	struct label *l; -	if (label) { -		fprintf(f, "\t.globl\t%s\n", label); -		fprintf(f, "%s:\n", label); +	for_each_label(labels, l) { +		fprintf(f, "\t.globl\t%s\n", l->label); +		fprintf(f, "%s:\n", l->label);  	} -	fprintf(f, "\t.long\tFDT_PROP\n"); +	fprintf(f, "\t/* FDT_PROP */\n"); +	asm_emit_cell(e, FDT_PROP);  }  static struct emitter asm_emitter = { @@ -248,7 +263,7 @@ static void flatten_tree(struct node *tree, struct emitter *emit,  	struct node *child;  	int seen_name_prop = 0; -	emit->beginnode(etarget, tree->label); +	emit->beginnode(etarget, tree->labels);  	if (vi->flags & FTF_FULLPATH)  		emit->string(etarget, tree->fullpath, 0); @@ -265,7 +280,7 @@ static void flatten_tree(struct node *tree, struct emitter *emit,  		nameoff = stringtable_insert(strbuf, prop->name); -		emit->property(etarget, prop->label); +		emit->property(etarget, prop->labels);  		emit->cell(etarget, prop->val.len);  		emit->cell(etarget, nameoff); @@ -292,7 +307,7 @@ static void flatten_tree(struct node *tree, struct emitter *emit,  		flatten_tree(child, emit, etarget, strbuf, vi);  	} -	emit->endnode(etarget, tree->label); +	emit->endnode(etarget, tree->labels);  }  static struct data flatten_reserve_list(struct reserve_info *reservelist, @@ -413,10 +428,13 @@ void dt_to_blob(FILE *f, struct boot_info *bi, int version)  	if (padlen > 0)  		blob = data_append_zeroes(blob, padlen); -	fwrite(blob.val, blob.len, 1, f); - -	if (ferror(f)) -		die("Error writing device tree blob: %s\n", strerror(errno)); +	if (fwrite(blob.val, blob.len, 1, f) != 1) { +		if (ferror(f)) +			die("Error writing device tree blob: %s\n", +			    strerror(errno)); +		else +			die("Short write on device tree blob\n"); +	}  	/*  	 * data_merge() frees the right-hand element so only the blob @@ -455,39 +473,44 @@ void dt_to_asm(FILE *f, struct boot_info *bi, int version)  		die("Unknown device tree blob version %d\n", version);  	fprintf(f, "/* autogenerated by dtc, do not edit */\n\n"); -	fprintf(f, "#define FDT_MAGIC 0x%x\n", FDT_MAGIC); -	fprintf(f, "#define FDT_BEGIN_NODE 0x%x\n", FDT_BEGIN_NODE); -	fprintf(f, "#define FDT_END_NODE 0x%x\n", FDT_END_NODE); -	fprintf(f, "#define FDT_PROP 0x%x\n", FDT_PROP); -	fprintf(f, "#define FDT_END 0x%x\n", FDT_END); -	fprintf(f, "\n");  	emit_label(f, symprefix, "blob_start");  	emit_label(f, symprefix, "header"); -	fprintf(f, "\t.long\tFDT_MAGIC\t\t\t\t/* magic */\n"); -	fprintf(f, "\t.long\t_%s_blob_abs_end - _%s_blob_start\t/* totalsize */\n", -		symprefix, symprefix); -	fprintf(f, "\t.long\t_%s_struct_start - _%s_blob_start\t/* off_dt_struct */\n", +	fprintf(f, "\t/* magic */\n"); +	asm_emit_cell(f, FDT_MAGIC); +	fprintf(f, "\t/* totalsize */\n"); +	ASM_EMIT_BELONG(f, "_%s_blob_abs_end - _%s_blob_start", +			symprefix, symprefix); +	fprintf(f, "\t/* off_dt_struct */\n"); +	ASM_EMIT_BELONG(f, "_%s_struct_start - _%s_blob_start",  		symprefix, symprefix); -	fprintf(f, "\t.long\t_%s_strings_start - _%s_blob_start\t/* off_dt_strings */\n", +	fprintf(f, "\t/* off_dt_strings */\n"); +	ASM_EMIT_BELONG(f, "_%s_strings_start - _%s_blob_start",  		symprefix, symprefix); -	fprintf(f, "\t.long\t_%s_reserve_map - _%s_blob_start\t/* off_dt_strings */\n", +	fprintf(f, "\t/* off_mem_rsvmap */\n"); +	ASM_EMIT_BELONG(f, "_%s_reserve_map - _%s_blob_start",  		symprefix, symprefix); -	fprintf(f, "\t.long\t%d\t\t\t\t\t/* version */\n", vi->version); -	fprintf(f, "\t.long\t%d\t\t\t\t\t/* last_comp_version */\n", -		vi->last_comp_version); - -	if (vi->flags & FTF_BOOTCPUID) -		fprintf(f, "\t.long\t%i\t\t\t\t\t/* boot_cpuid_phys */\n", -			bi->boot_cpuid_phys); +	fprintf(f, "\t/* version */\n"); +	asm_emit_cell(f, vi->version); +	fprintf(f, "\t/* last_comp_version */\n"); +	asm_emit_cell(f, vi->last_comp_version); + +	if (vi->flags & FTF_BOOTCPUID) { +		fprintf(f, "\t/* boot_cpuid_phys */\n"); +		asm_emit_cell(f, bi->boot_cpuid_phys); +	} -	if (vi->flags & FTF_STRTABSIZE) -		fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n", -			symprefix, symprefix); +	if (vi->flags & FTF_STRTABSIZE) { +		fprintf(f, "\t/* size_dt_strings */\n"); +		ASM_EMIT_BELONG(f, "_%s_strings_end - _%s_strings_start", +				symprefix, symprefix); +	} -	if (vi->flags & FTF_STRUCTSIZE) -		fprintf(f, "\t.long\t_%s_struct_end - _%s_struct_start\t/* size_dt_struct */\n", +	if (vi->flags & FTF_STRUCTSIZE) { +		fprintf(f, "\t/* size_dt_struct */\n"); +		ASM_EMIT_BELONG(f, "_%s_struct_end - _%s_struct_start",  			symprefix, symprefix); +	}  	/*  	 * Reserve map entries. @@ -505,16 +528,17 @@ void dt_to_asm(FILE *f, struct boot_info *bi, int version)  	 * as it appears .quad isn't available in some assemblers.  	 */  	for (re = bi->reservelist; re; re = re->next) { -		if (re->label) { -			fprintf(f, "\t.globl\t%s\n", re->label); -			fprintf(f, "%s:\n", re->label); +		struct label *l; + +		for_each_label(re->labels, l) { +			fprintf(f, "\t.globl\t%s\n", l->label); +			fprintf(f, "%s:\n", l->label);  		} -		fprintf(f, "\t.long\t0x%08x, 0x%08x\n", -			(unsigned int)(re->re.address >> 32), -			(unsigned int)(re->re.address & 0xffffffff)); -		fprintf(f, "\t.long\t0x%08x, 0x%08x\n", -			(unsigned int)(re->re.size >> 32), -			(unsigned int)(re->re.size & 0xffffffff)); +		ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32)); +		ASM_EMIT_BELONG(f, "0x%08x", +				(unsigned int)(re->re.address & 0xffffffff)); +		ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32)); +		ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff));  	}  	for (i = 0; i < reservenum; i++) {  		fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); @@ -524,7 +548,9 @@ void dt_to_asm(FILE *f, struct boot_info *bi, int version)  	emit_label(f, symprefix, "struct_start");  	flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi); -	fprintf(f, "\t.long\tFDT_END\n"); + +	fprintf(f, "\t/* FDT_END */\n"); +	asm_emit_cell(f, FDT_END);  	emit_label(f, symprefix, "struct_end");  	emit_label(f, symprefix, "strings_start"); @@ -601,7 +627,7 @@ static char *flat_read_string(struct inbuf *inb)  		len++;  	} while ((*p++) != '\0'); -	str = strdup(inb->ptr); +	str = xstrdup(inb->ptr);  	inb->ptr += len; @@ -643,7 +669,7 @@ static char *flat_read_stringtable(struct inbuf *inb, int offset)  		p++;  	} -	return strdup(inb->base + offset); +	return xstrdup(inb->base + offset);  }  static struct property *flat_read_property(struct inbuf *dtbuf, @@ -663,7 +689,7 @@ static struct property *flat_read_property(struct inbuf *dtbuf,  	val = flat_read_data(dtbuf, proplen); -	return build_property(name, val, NULL); +	return build_property(name, val);  } @@ -688,7 +714,7 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)  		if (re.size == 0)  			break; -		new = build_reserve_entry(re.address, re.size, NULL); +		new = build_reserve_entry(re.address, re.size);  		reservelist = add_reserve_entry(reservelist, new);  	} @@ -710,7 +736,7 @@ static char *nodename_from_path(const char *ppath, const char *cpath)  	if (!streq(ppath, "/"))  		plen++; -	return strdup(cpath + plen); +	return xstrdup(cpath + plen);  }  static struct node *unflatten_tree(struct inbuf *dtbuf, @@ -776,7 +802,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,  struct boot_info *dt_from_blob(const char *fname)  { -	struct dtc_file *dtcf; +	FILE *f;  	uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;  	uint32_t off_dt, off_str, off_mem_rsvmap;  	int rc; @@ -791,14 +817,14 @@ struct boot_info *dt_from_blob(const char *fname)  	uint32_t val;  	int flags = 0; -	dtcf = dtc_open_file(fname, NULL); +	f = srcfile_relative_open(fname, NULL); -	rc = fread(&magic, sizeof(magic), 1, dtcf->file); -	if (ferror(dtcf->file)) +	rc = fread(&magic, sizeof(magic), 1, f); +	if (ferror(f))  		die("Error reading DT blob magic number: %s\n",  		    strerror(errno));  	if (rc < 1) { -		if (feof(dtcf->file)) +		if (feof(f))  			die("EOF reading DT blob magic number\n");  		else  			die("Mysterious short read reading magic number\n"); @@ -808,11 +834,11 @@ struct boot_info *dt_from_blob(const char *fname)  	if (magic != FDT_MAGIC)  		die("Blob has incorrect magic number\n"); -	rc = fread(&totalsize, sizeof(totalsize), 1, dtcf->file); -	if (ferror(dtcf->file)) +	rc = fread(&totalsize, sizeof(totalsize), 1, f); +	if (ferror(f))  		die("Error reading DT blob size: %s\n", strerror(errno));  	if (rc < 1) { -		if (feof(dtcf->file)) +		if (feof(f))  			die("EOF reading DT blob size\n");  		else  			die("Mysterious short read reading blob size\n"); @@ -832,12 +858,12 @@ struct boot_info *dt_from_blob(const char *fname)  	p = blob + sizeof(magic)  + sizeof(totalsize);  	while (sizeleft) { -		if (feof(dtcf->file)) +		if (feof(f))  			die("EOF before reading %d bytes of DT blob\n",  			    totalsize); -		rc = fread(p, 1, sizeleft, dtcf->file); -		if (ferror(dtcf->file)) +		rc = fread(p, 1, sizeleft, f); +		if (ferror(f))  			die("Error reading DT blob: %s\n",  			    strerror(errno)); @@ -900,7 +926,7 @@ struct boot_info *dt_from_blob(const char *fname)  	free(blob); -	dtc_close_file(dtcf); +	fclose(f);  	return build_boot_info(reservelist, tree, boot_cpuid_phys);  } diff --git a/scripts/dtc/fstree.c b/scripts/dtc/fstree.c index 8fe1bdf239f0..f3774530170a 100644 --- a/scripts/dtc/fstree.c +++ b/scripts/dtc/fstree.c @@ -58,10 +58,9 @@ static struct node *read_fstree(const char *dirname)  					"WARNING: Cannot open %s: %s\n",  					tmpnam, strerror(errno));  			} else { -				prop = build_property(strdup(de->d_name), +				prop = build_property(xstrdup(de->d_name),  						      data_copy_file(pfile, -								     st.st_size), -						      NULL); +								     st.st_size));  				add_property(tree, prop);  				fclose(pfile);  			} @@ -69,8 +68,7 @@ static struct node *read_fstree(const char *dirname)  			struct node *newchild;  			newchild = read_fstree(tmpnam); -			newchild = name_node(newchild, strdup(de->d_name), -					     NULL); +			newchild = name_node(newchild, xstrdup(de->d_name));  			add_child(tree, newchild);  		} @@ -86,8 +84,8 @@ struct boot_info *dt_from_fs(const char *dirname)  	struct node *tree;  	tree = read_fstree(dirname); -	tree = name_node(tree, "", NULL); +	tree = name_node(tree, ""); -	return build_boot_info(NULL, tree, 0); +	return build_boot_info(NULL, tree, guess_boot_cpuid(tree));  } diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c index 0ca3de550b3f..c9209d5c999e 100644 --- a/scripts/dtc/livetree.c +++ b/scripts/dtc/livetree.c @@ -24,17 +24,30 @@   * Tree building functions   */ -struct property *build_property(char *name, struct data val, char *label) +void add_label(struct label **labels, char *label) +{ +	struct label *new; + +	/* Make sure the label isn't already there */ +	for_each_label(*labels, new) +		if (streq(new->label, label)) +			return; + +	new = xmalloc(sizeof(*new)); +	new->label = label; +	new->next = *labels; +	*labels = new; +} + +struct property *build_property(char *name, struct data val)  {  	struct property *new = xmalloc(sizeof(*new)); +	memset(new, 0, sizeof(*new)); +  	new->name = name;  	new->val = val; -	new->next = NULL; - -	new->label = label; -  	return new;  } @@ -78,17 +91,82 @@ struct node *build_node(struct property *proplist, struct node *children)  	return new;  } -struct node *name_node(struct node *node, char *name, char * label) +struct node *name_node(struct node *node, char *name)  {  	assert(node->name == NULL);  	node->name = name; -	node->label = label; -  	return node;  } +struct node *merge_nodes(struct node *old_node, struct node *new_node) +{ +	struct property *new_prop, *old_prop; +	struct node *new_child, *old_child; +	struct label *l; + +	/* Add new node labels to old node */ +	for_each_label(new_node->labels, l) +		add_label(&old_node->labels, l->label); + +	/* Move properties from the new node to the old node.  If there +	 * is a collision, replace the old value with the new */ +	while (new_node->proplist) { +		/* Pop the property off the list */ +		new_prop = new_node->proplist; +		new_node->proplist = new_prop->next; +		new_prop->next = NULL; + +		/* Look for a collision, set new value if there is */ +		for_each_property(old_node, old_prop) { +			if (streq(old_prop->name, new_prop->name)) { +				/* Add new labels to old property */ +				for_each_label(new_prop->labels, l) +					add_label(&old_prop->labels, l->label); + +				old_prop->val = new_prop->val; +				free(new_prop); +				new_prop = NULL; +				break; +			} +		} + +		/* if no collision occurred, add property to the old node. */ +		if (new_prop) +			add_property(old_node, new_prop); +	} + +	/* Move the override child nodes into the primary node.  If +	 * there is a collision, then merge the nodes. */ +	while (new_node->children) { +		/* Pop the child node off the list */ +		new_child = new_node->children; +		new_node->children = new_child->next_sibling; +		new_child->parent = NULL; +		new_child->next_sibling = NULL; + +		/* Search for a collision.  Merge if there is */ +		for_each_child(old_node, old_child) { +			if (streq(old_child->name, new_child->name)) { +				merge_nodes(old_child, new_child); +				new_child = NULL; +				break; +			} +		} + +		/* if no collision occured, add child to the old node. */ +		if (new_child) +			add_child(old_node, new_child); +	} + +	/* The new node contents are now merged into the old node.  Free +	 * the new node. */ +	free(new_node); + +	return old_node; +} +  struct node *chain_node(struct node *first, struct node *list)  {  	assert(first->next_sibling == NULL); @@ -124,18 +202,15 @@ void add_child(struct node *parent, struct node *child)  	*p = child;  } -struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size, -					 char *label) +struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size)  {  	struct reserve_info *new = xmalloc(sizeof(*new)); +	memset(new, 0, sizeof(*new)); +  	new->re.address = address;  	new->re.size = size; -	new->next = NULL; - -	new->label = label; -  	return new;  } @@ -208,6 +283,60 @@ cell_t propval_cell(struct property *prop)  	return fdt32_to_cpu(*((cell_t *)prop->val.val));  } +struct property *get_property_by_label(struct node *tree, const char *label, +				       struct node **node) +{ +	struct property *prop; +	struct node *c; + +	*node = tree; + +	for_each_property(tree, prop) { +		struct label *l; + +		for_each_label(prop->labels, l) +			if (streq(l->label, label)) +				return prop; +	} + +	for_each_child(tree, c) { +		prop = get_property_by_label(c, label, node); +		if (prop) +			return prop; +	} + +	*node = NULL; +	return NULL; +} + +struct marker *get_marker_label(struct node *tree, const char *label, +				struct node **node, struct property **prop) +{ +	struct marker *m; +	struct property *p; +	struct node *c; + +	*node = tree; + +	for_each_property(tree, p) { +		*prop = p; +		m = p->val.markers; +		for_each_marker_of_type(m, LABEL) +			if (streq(m->ref, label)) +				return m; +	} + +	for_each_child(tree, c) { +		m = get_marker_label(c, label, node, prop); +		if (m) +			return m; +	} + +	*prop = NULL; +	*node = NULL; +	return NULL; +} +  struct node *get_subnode(struct node *node, const char *nodename)  {  	struct node *child; @@ -245,11 +374,13 @@ struct node *get_node_by_path(struct node *tree, const char *path)  struct node *get_node_by_label(struct node *tree, const char *label)  {  	struct node *child, *node; +	struct label *l;  	assert(label && (strlen(label) > 0)); -	if (tree->label && streq(tree->label, label)) -		return tree; +	for_each_label(tree->labels, l) +		if (streq(l->label, label)) +			return tree;  	for_each_child(tree, child) {  		node = get_node_by_label(child, label); @@ -293,16 +424,186 @@ cell_t get_node_phandle(struct node *root, struct node *node)  	if ((node->phandle != 0) && (node->phandle != -1))  		return node->phandle; -	assert(! get_property(node, "linux,phandle")); -  	while (get_node_by_phandle(root, phandle))  		phandle++;  	node->phandle = phandle; -	add_property(node, -		     build_property("linux,phandle", -				    data_append_cell(empty_data, phandle), -				    NULL)); + +	if (!get_property(node, "linux,phandle") +	    && (phandle_format & PHANDLE_LEGACY)) +		add_property(node, +			     build_property("linux,phandle", +					    data_append_cell(empty_data, phandle))); + +	if (!get_property(node, "phandle") +	    && (phandle_format & PHANDLE_EPAPR)) +		add_property(node, +			     build_property("phandle", +					    data_append_cell(empty_data, phandle))); + +	/* If the node *does* have a phandle property, we must +	 * be dealing with a self-referencing phandle, which will be +	 * fixed up momentarily in the caller */  	return node->phandle;  } + +uint32_t guess_boot_cpuid(struct node *tree) +{ +	struct node *cpus, *bootcpu; +	struct property *reg; + +	cpus = get_node_by_path(tree, "/cpus"); +	if (!cpus) +		return 0; + + +	bootcpu = cpus->children; +	if (!bootcpu) +		return 0; + +	reg = get_property(bootcpu, "reg"); +	if (!reg || (reg->val.len != sizeof(uint32_t))) +		return 0; + +	/* FIXME: Sanity check node? */ + +	return propval_cell(reg); +} + +static int cmp_reserve_info(const void *ax, const void *bx) +{ +	const struct reserve_info *a, *b; + +	a = *((const struct reserve_info * const *)ax); +	b = *((const struct reserve_info * const *)bx); + +	if (a->re.address < b->re.address) +		return -1; +	else if (a->re.address > b->re.address) +		return 1; +	else if (a->re.size < b->re.size) +		return -1; +	else if (a->re.size > b->re.size) +		return 1; +	else +		return 0; +} + +static void sort_reserve_entries(struct boot_info *bi) +{ +	struct reserve_info *ri, **tbl; +	int n = 0, i = 0; + +	for (ri = bi->reservelist; +	     ri; +	     ri = ri->next) +		n++; + +	if (n == 0) +		return; + +	tbl = xmalloc(n * sizeof(*tbl)); + +	for (ri = bi->reservelist; +	     ri; +	     ri = ri->next) +		tbl[i++] = ri; + +	qsort(tbl, n, sizeof(*tbl), cmp_reserve_info); + +	bi->reservelist = tbl[0]; +	for (i = 0; i < (n-1); i++) +		tbl[i]->next = tbl[i+1]; +	tbl[n-1]->next = NULL; + +	free(tbl); +} + +static int cmp_prop(const void *ax, const void *bx) +{ +	const struct property *a, *b; + +	a = *((const struct property * const *)ax); +	b = *((const struct property * const *)bx); + +	return strcmp(a->name, b->name); +} + +static void sort_properties(struct node *node) +{ +	int n = 0, i = 0; +	struct property *prop, **tbl; + +	for_each_property(node, prop) +		n++; + +	if (n == 0) +		return; + +	tbl = xmalloc(n * sizeof(*tbl)); + +	for_each_property(node, prop) +		tbl[i++] = prop; + +	qsort(tbl, n, sizeof(*tbl), cmp_prop); + +	node->proplist = tbl[0]; +	for (i = 0; i < (n-1); i++) +		tbl[i]->next = tbl[i+1]; +	tbl[n-1]->next = NULL; + +	free(tbl); +} + +static int cmp_subnode(const void *ax, const void *bx) +{ +	const struct node *a, *b; + +	a = *((const struct node * const *)ax); +	b = *((const struct node * const *)bx); + +	return strcmp(a->name, b->name); +} + +static void sort_subnodes(struct node *node) +{ +	int n = 0, i = 0; +	struct node *subnode, **tbl; + +	for_each_child(node, subnode) +		n++; + +	if (n == 0) +		return; + +	tbl = xmalloc(n * sizeof(*tbl)); + +	for_each_child(node, subnode) +		tbl[i++] = subnode; + +	qsort(tbl, n, sizeof(*tbl), cmp_subnode); + +	node->children = tbl[0]; +	for (i = 0; i < (n-1); i++) +		tbl[i]->next_sibling = tbl[i+1]; +	tbl[n-1]->next_sibling = NULL; + +	free(tbl); +} + +static void sort_node(struct node *node) +{ +	struct node *c; + +	sort_properties(node); +	sort_subnodes(node); +	for_each_child(node, c) +		sort_node(c); +} + +void sort_tree(struct boot_info *bi) +{ +	sort_reserve_entries(bi); +	sort_node(bi->dt); +} diff --git a/scripts/dtc/srcpos.c b/scripts/dtc/srcpos.c index 9641b7628b4d..2dbc874288ca 100644 --- a/scripts/dtc/srcpos.c +++ b/scripts/dtc/srcpos.c @@ -17,100 +17,232 @@   *                                                                   USA   */ +#define _GNU_SOURCE + +#include <stdio.h> +  #include "dtc.h"  #include "srcpos.h" -/* - * Like yylineno, this is the current open file pos. - */ -struct dtc_file *srcpos_file; +static char *dirname(const char *path) +{ +	const char *slash = strrchr(path, '/'); + +	if (slash) { +		int len = slash - path; +		char *dir = xmalloc(len + 1); + +		memcpy(dir, path, len); +		dir[len] = '\0'; +		return dir; +	} +	return NULL; +} + +struct srcfile_state *current_srcfile; /* = NULL */ -static int dtc_open_one(struct dtc_file *file, -                        const char *search, -                        const char *fname) +/* Detect infinite include recursion. */ +#define MAX_SRCFILE_DEPTH     (100) +static int srcfile_depth; /* = 0 */ + +FILE *srcfile_relative_open(const char *fname, char **fullnamep)  { +	FILE *f;  	char *fullname; -	if (search) { -		fullname = xmalloc(strlen(search) + strlen(fname) + 2); - -		strcpy(fullname, search); -		strcat(fullname, "/"); -		strcat(fullname, fname); +	if (streq(fname, "-")) { +		f = stdin; +		fullname = xstrdup("<stdin>");  	} else { -		fullname = strdup(fname); +		if (!current_srcfile || !current_srcfile->dir +		    || (fname[0] == '/')) +			fullname = xstrdup(fname); +		else +			fullname = join_path(current_srcfile->dir, fname); + +		f = fopen(fullname, "r"); +		if (!f) +			die("Couldn't open \"%s\": %s\n", fname, +			    strerror(errno));  	} -	file->file = fopen(fullname, "r"); -	if (!file->file) { +	if (fullnamep) +		*fullnamep = fullname; +	else  		free(fullname); -		return 0; -	} -	file->name = fullname; -	return 1; +	return f;  } +void srcfile_push(const char *fname) +{ +	struct srcfile_state *srcfile; + +	if (srcfile_depth++ >= MAX_SRCFILE_DEPTH) +		die("Includes nested too deeply"); + +	srcfile = xmalloc(sizeof(*srcfile)); + +	srcfile->f = srcfile_relative_open(fname, &srcfile->name); +	srcfile->dir = dirname(srcfile->name); +	srcfile->prev = current_srcfile; + +	srcfile->lineno = 1; +	srcfile->colno = 1; + +	current_srcfile = srcfile; +} -struct dtc_file *dtc_open_file(const char *fname, -                               const struct search_path *search) +int srcfile_pop(void)  { -	static const struct search_path default_search = { NULL, NULL, NULL }; +	struct srcfile_state *srcfile = current_srcfile; -	struct dtc_file *file; -	const char *slash; +	assert(srcfile); -	file = xmalloc(sizeof(struct dtc_file)); +	current_srcfile = srcfile->prev; -	slash = strrchr(fname, '/'); -	if (slash) { -		char *dir = xmalloc(slash - fname + 1); +	if (fclose(srcfile->f)) +		die("Error closing \"%s\": %s\n", srcfile->name, +		    strerror(errno)); -		memcpy(dir, fname, slash - fname); -		dir[slash - fname] = 0; -		file->dir = dir; -	} else { -		file->dir = NULL; -	} +	/* FIXME: We allow the srcfile_state structure to leak, +	 * because it could still be referenced from a location +	 * variable being carried through the parser somewhere.  To +	 * fix this we could either allocate all the files from a +	 * table, or use a pool allocator. */ -	if (streq(fname, "-")) { -		file->name = "stdin"; -		file->file = stdin; -		return file; -	} +	return current_srcfile ? 1 : 0; +} -	if (fname[0] == '/') { -		file->file = fopen(fname, "r"); -		if (!file->file) -			goto fail; +/* + * The empty source position. + */ -		file->name = strdup(fname); -		return file; -	} +struct srcpos srcpos_empty = { +	.first_line = 0, +	.first_column = 0, +	.last_line = 0, +	.last_column = 0, +	.file = NULL, +}; -	if (!search) -		search = &default_search; +#define TAB_SIZE      8 -	while (search) { -		if (dtc_open_one(file, search->dir, fname)) -			return file; +void srcpos_update(struct srcpos *pos, const char *text, int len) +{ +	int i; + +	pos->file = current_srcfile; + +	pos->first_line = current_srcfile->lineno; +	pos->first_column = current_srcfile->colno; + +	for (i = 0; i < len; i++) +		if (text[i] == '\n') { +			current_srcfile->lineno++; +			current_srcfile->colno = 1; +		} else if (text[i] == '\t') { +			current_srcfile->colno = +				ALIGN(current_srcfile->colno, TAB_SIZE); +		} else { +			current_srcfile->colno++; +		} + +	pos->last_line = current_srcfile->lineno; +	pos->last_column = current_srcfile->colno; +} -		if (errno != ENOENT) -			goto fail; +struct srcpos * +srcpos_copy(struct srcpos *pos) +{ +	struct srcpos *pos_new; -		search = search->next; -	} +	pos_new = xmalloc(sizeof(struct srcpos)); +	memcpy(pos_new, pos, sizeof(struct srcpos)); + +	return pos_new; +} + + + +void +srcpos_dump(struct srcpos *pos) +{ +	printf("file        : \"%s\"\n", +	       pos->file ? (char *) pos->file : "<no file>"); +	printf("first_line  : %d\n", pos->first_line); +	printf("first_column: %d\n", pos->first_column); +	printf("last_line   : %d\n", pos->last_line); +	printf("last_column : %d\n", pos->last_column); +	printf("file        : %s\n", pos->file->name); +} -fail: -	die("Couldn't open \"%s\": %s\n", fname, strerror(errno)); + +char * +srcpos_string(struct srcpos *pos) +{ +	const char *fname = "<no-file>"; +	char *pos_str; +	int rc; + +	if (pos) +		fname = pos->file->name; + + +	if (pos->first_line != pos->last_line) +		rc = asprintf(&pos_str, "%s:%d.%d-%d.%d", fname, +			      pos->first_line, pos->first_column, +			      pos->last_line, pos->last_column); +	else if (pos->first_column != pos->last_column) +		rc = asprintf(&pos_str, "%s:%d.%d-%d", fname, +			      pos->first_line, pos->first_column, +			      pos->last_column); +	else +		rc = asprintf(&pos_str, "%s:%d.%d", fname, +			      pos->first_line, pos->first_column); + +	if (rc == -1) +		die("Couldn't allocate in srcpos string"); + +	return pos_str; +} + +void +srcpos_verror(struct srcpos *pos, char const *fmt, va_list va) +{ +       const char *srcstr; + +       srcstr = srcpos_string(pos); + +       fprintf(stdout, "Error: %s ", srcstr); +       vfprintf(stdout, fmt, va); +       fprintf(stdout, "\n");  } -void dtc_close_file(struct dtc_file *file) +void +srcpos_error(struct srcpos *pos, char const *fmt, ...)  { -	if (fclose(file->file)) -		die("Error closing \"%s\": %s\n", file->name, strerror(errno)); +	va_list va; + +	va_start(va, fmt); +	srcpos_verror(pos, fmt, va); +	va_end(va); +} + + +void +srcpos_warn(struct srcpos *pos, char const *fmt, ...) +{ +	const char *srcstr; +	va_list va; +	va_start(va, fmt); + +	srcstr = srcpos_string(pos); + +	fprintf(stderr, "Warning: %s ", srcstr); +	vfprintf(stderr, fmt, va); +	fprintf(stderr, "\n"); -	free(file->dir); -	free(file); +	va_end(va);  } diff --git a/scripts/dtc/srcpos.h b/scripts/dtc/srcpos.h index e17c7c04db8e..bd7966e56a53 100644 --- a/scripts/dtc/srcpos.h +++ b/scripts/dtc/srcpos.h @@ -17,69 +17,70 @@   *                                                                   USA   */ -/* - * Augment the standard YYLTYPE with a filenum index into an - * array of all opened filenames. - */ +#ifndef _SRCPOS_H_ +#define _SRCPOS_H_  #include <stdio.h> -struct dtc_file { +struct srcfile_state { +	FILE *f; +	char *name;  	char *dir; -	const char *name; -	FILE *file; +	int lineno, colno; +	struct srcfile_state *prev;  }; -#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED) -typedef struct YYLTYPE { +extern struct srcfile_state *current_srcfile; /* = NULL */ + +FILE *srcfile_relative_open(const char *fname, char **fullnamep); +void srcfile_push(const char *fname); +int srcfile_pop(void); + +struct srcpos {      int first_line;      int first_column;      int last_line;      int last_column; -    struct dtc_file *file; -} YYLTYPE; - -#define YYLTYPE_IS_DECLARED	1 -#define YYLTYPE_IS_TRIVIAL	1 -#endif - -/* Cater to old parser templates. */ -#ifndef YYID -#define YYID(n)	(n) -#endif +    struct srcfile_state *file; +}; -#define YYLLOC_DEFAULT(Current, Rhs, N)					\ -    do									\ -      if (YYID (N))							\ -	{								\ -	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\ -	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\ -	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\ -	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\ -	  (Current).file         = YYRHSLOC (Rhs, N).file;		\ -	}								\ -      else								\ -	{								\ -	  (Current).first_line   = (Current).last_line   =		\ -	    YYRHSLOC (Rhs, 0).last_line;				\ -	  (Current).first_column = (Current).last_column =		\ -	    YYRHSLOC (Rhs, 0).last_column;				\ -	  (Current).file         = YYRHSLOC (Rhs, 0).file;		\ -	}								\ -    while (YYID (0)) +#define YYLTYPE struct srcpos +#define YYLLOC_DEFAULT(Current, Rhs, N)						\ +	do {									\ +		if (N) {							\ +			(Current).first_line = YYRHSLOC(Rhs, 1).first_line;	\ +			(Current).first_column = YYRHSLOC(Rhs, 1).first_column;	\ +			(Current).last_line = YYRHSLOC(Rhs, N).last_line;	\ +			(Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\ +			(Current).file = YYRHSLOC(Rhs, N).file;			\ +		} else {							\ +			(Current).first_line = (Current).last_line =		\ +				YYRHSLOC(Rhs, 0).last_line;			\ +			(Current).first_column = (Current).last_column =	\ +				YYRHSLOC(Rhs, 0).last_column;			\ +			(Current).file = YYRHSLOC (Rhs, 0).file;		\ +		}								\ +	} while (0) -extern void yyerror(char const *); -extern void yyerrorf(char const *, ...) __attribute__((format(printf, 1, 2))); +/* + * Fictional source position used for IR nodes that are + * created without otherwise knowing a true source position. + * For example,constant definitions from the command line. + */ +extern struct srcpos srcpos_empty; -extern struct dtc_file *srcpos_file; +extern void srcpos_update(struct srcpos *pos, const char *text, int len); +extern struct srcpos *srcpos_copy(struct srcpos *pos); +extern char *srcpos_string(struct srcpos *pos); +extern void srcpos_dump(struct srcpos *pos); -struct search_path { -	const char *dir; /* NULL for current directory */ -	struct search_path *prev, *next; -}; +extern void srcpos_verror(struct srcpos *pos, char const *, va_list va) +     __attribute__((format(printf, 2, 0))); +extern void srcpos_error(struct srcpos *pos, char const *, ...) +     __attribute__((format(printf, 2, 3))); +extern void srcpos_warn(struct srcpos *pos, char const *, ...) +     __attribute__((format(printf, 2, 3))); -extern struct dtc_file *dtc_open_file(const char *fname, -                                      const struct search_path *search); -extern void dtc_close_file(struct dtc_file *file); +#endif /* _SRCPOS_H_ */ diff --git a/scripts/dtc/treesource.c b/scripts/dtc/treesource.c index 1521ff11bb97..c09aafade313 100644 --- a/scripts/dtc/treesource.c +++ b/scripts/dtc/treesource.c @@ -32,8 +32,8 @@ struct boot_info *dt_from_source(const char *fname)  	the_boot_info = NULL;  	treesource_error = 0; -	srcpos_file = dtc_open_file(fname, NULL); -	yyin = srcpos_file->file; +	srcfile_push(fname); +	yyin = current_srcfile->f;  	if (yyparse() != 0)  		die("Unable to parse input tree\n"); @@ -63,26 +63,20 @@ static void write_propval_string(FILE *f, struct data val)  {  	const char *str = val.val;  	int i; -	int newchunk = 1;  	struct marker *m = val.markers;  	assert(str[val.len-1] == '\0'); +	while (m && (m->offset == 0)) { +		if (m->type == LABEL) +			fprintf(f, "%s: ", m->ref); +		m = m->next; +	} +	fprintf(f, "\""); +  	for (i = 0; i < (val.len-1); i++) {  		char c = str[i]; -		if (newchunk) { -			while (m && (m->offset <= i)) { -				if (m->type == LABEL) { -					assert(m->offset == i); -					fprintf(f, "%s: ", m->ref); -				} -				m = m->next; -			} -			fprintf(f, "\""); -			newchunk = 0; -		} -  		switch (c) {  		case '\a':  			fprintf(f, "\\a"); @@ -113,7 +107,14 @@ static void write_propval_string(FILE *f, struct data val)  			break;  		case '\0':  			fprintf(f, "\", "); -			newchunk = 1; +			while (m && (m->offset < i)) { +				if (m->type == LABEL) { +					assert(m->offset == (i+1)); +					fprintf(f, "%s: ", m->ref); +				} +				m = m->next; +			} +			fprintf(f, "\"");  			break;  		default:  			if (isprint(c)) @@ -234,10 +235,11 @@ static void write_tree_source_node(FILE *f, struct node *tree, int level)  {  	struct property *prop;  	struct node *child; +	struct label *l;  	write_prefix(f, level); -	if (tree->label) -		fprintf(f, "%s: ", tree->label); +	for_each_label(tree->labels, l) +		fprintf(f, "%s: ", l->label);  	if (tree->name && (*tree->name))  		fprintf(f, "%s {\n", tree->name);  	else @@ -245,8 +247,8 @@ static void write_tree_source_node(FILE *f, struct node *tree, int level)  	for_each_property(tree, prop) {  		write_prefix(f, level+1); -		if (prop->label) -			fprintf(f, "%s: ", prop->label); +		for_each_label(prop->labels, l) +			fprintf(f, "%s: ", l->label);  		fprintf(f, "%s", prop->name);  		write_propval(f, prop);  	} @@ -266,8 +268,10 @@ void dt_to_source(FILE *f, struct boot_info *bi)  	fprintf(f, "/dts-v1/;\n\n");  	for (re = bi->reservelist; re; re = re->next) { -		if (re->label) -			fprintf(f, "%s: ", re->label); +		struct label *l; + +		for_each_label(re->labels, l) +			fprintf(f, "%s: ", l->label);  		fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",  			(unsigned long long)re->re.address,  			(unsigned long long)re->re.size); diff --git a/scripts/dtc/util.c b/scripts/dtc/util.c new file mode 100644 index 000000000000..d7ac27d2ae15 --- /dev/null +++ b/scripts/dtc/util.c @@ -0,0 +1,59 @@ +/* + * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *  General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 + *                                                                   USA + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> + +#include "util.h" + +char *xstrdup(const char *s) +{ +	int len = strlen(s) + 1; +	char *dup = xmalloc(len); + +	memcpy(dup, s, len); + +	return dup; +} + +char *join_path(const char *path, const char *name) +{ +	int lenp = strlen(path); +	int lenn = strlen(name); +	int len; +	int needslash = 1; +	char *str; + +	len = lenp + lenn + 2; +	if ((lenp > 0) && (path[lenp-1] == '/')) { +		needslash = 0; +		len--; +	} + +	str = xmalloc(len); +	memcpy(str, path, lenp); +	if (needslash) { +		str[lenp] = '/'; +		lenp++; +	} +	memcpy(str+lenp, name, lenn+1); +	return str; +} diff --git a/scripts/dtc/util.h b/scripts/dtc/util.h new file mode 100644 index 000000000000..9cead842c11e --- /dev/null +++ b/scripts/dtc/util.h @@ -0,0 +1,56 @@ +#ifndef _UTIL_H +#define _UTIL_H + +/* + * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *  General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 + *                                                                   USA + */ + +static inline void __attribute__((noreturn)) die(char * str, ...) +{ +	va_list ap; + +	va_start(ap, str); +	fprintf(stderr, "FATAL ERROR: "); +	vfprintf(stderr, str, ap); +	exit(1); +} + +static inline void *xmalloc(size_t len) +{ +	void *new = malloc(len); + +	if (!new) +		die("malloc() failed\n"); + +	return new; +} + +static inline void *xrealloc(void *p, size_t len) +{ +	void *new = realloc(p, len); + +	if (!new) +		die("realloc() failed (len=%d)\n", len); + +	return new; +} + +extern char *xstrdup(const char *s); +extern char *join_path(const char *path, const char *name); + +#endif /* _UTIL_H */ diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h index 658ff42429d6..6158b867df99 100644 --- a/scripts/dtc/version_gen.h +++ b/scripts/dtc/version_gen.h @@ -1 +1 @@ -#define DTC_VERSION "DTC 1.2.0" +#define DTC_VERSION "DTC 1.2.0-g37c0b6a0" | 
