diff --git a/arch/arm/Makefile b/arch/arm/Makefile index ab30cc63..cc176797 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -339,6 +339,9 @@ $(INSTALL_TARGETS): %.dtb: | scripts $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@ +%.dtbo: | scripts + $(Q)$(MAKE) $(build)=$(boot)/dts MACHINE=$(MACHINE) $(boot)/dts/$@ + PHONY += dtbs dtbs_install dtbs: prepare scripts diff --git a/arch/arm/boot/.gitignore b/arch/arm/boot/.gitignore index 3c79f859..eaaeb17e 100644 --- a/arch/arm/boot/.gitignore +++ b/arch/arm/boot/.gitignore @@ -3,4 +3,4 @@ zImage xipImage bootpImage uImage -*.dtb +*.dtb* diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 01d178a2..48e5a5f5 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -984,10 +984,16 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \ dtb-$(CONFIG_ARCH_ZX) += zx296702-ad1.dtb dtb-$(CONFIG_ARCH_ASPEED) += aspeed-bmc-opp-palmetto.dtb \ aspeed-ast2500-evb.dtb + +targets += dtbs dtbs_install +targets += $(dtb-y) endif dtstree := $(srctree)/$(src) dtb-$(CONFIG_OF_ALL_DTBS) := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts)) always := $(dtb-y) +subdir-y := overlay clean-files := *.dtb + +dts-dirs += overlay diff --git a/arch/arm/boot/dts/overlay/Makefile b/arch/arm/boot/dts/overlay/Makefile new file mode 100644 index 00000000..5153998d --- /dev/null +++ b/arch/arm/boot/dts/overlay/Makefile @@ -0,0 +1,23 @@ +ifeq ($(CONFIG_OF_CONFIGFS),y) + +dtbo-$(CONFIG_MACH_SUN8I) += \ + analog-codec.dtbo \ + crypto.dtbo \ + i2c0.dtbo \ + spi0-spidev.dtbo \ + spi1-spidev.dtbo \ + uart1.dtbo \ + uart2.dtbo \ + uart3.dtbo \ + usbhost0.dtbo \ + usbhost2.dtbo \ + usbhost3.dtbo \ + w1.dtbo + +targets += dtbs dtbs_install +targets += $(dtbo-y) + +endif + +always := $(dtbo-y) +clean-files := *.dtbo diff --git a/arch/arm/boot/dts/overlay/analog-codec.dts b/arch/arm/boot/dts/overlay/analog-codec.dts new file mode 100644 index 00000000..c788c3f0 --- /dev/null +++ b/arch/arm/boot/dts/overlay/analog-codec.dts @@ -0,0 +1,16 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target = <&codec>; + __overlay__ { + allwinner,audio-routing = + "Line Out", "LINEOUT", + "MIC1", "Mic", + "Mic", "MBIAS"; + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/crypto.dts b/arch/arm/boot/dts/overlay/crypto.dts new file mode 100644 index 00000000..6b9ea6b8 --- /dev/null +++ b/arch/arm/boot/dts/overlay/crypto.dts @@ -0,0 +1,12 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target = <&crypto>; + __overlay__ { + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/i2c0.dts b/arch/arm/boot/dts/overlay/i2c0.dts new file mode 100644 index 00000000..f7436137 --- /dev/null +++ b/arch/arm/boot/dts/overlay/i2c0.dts @@ -0,0 +1,19 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/aliases"; + __overlay__ { + /* Path to the i2c0 controller node */ + i2c0 = "/soc@01c00000/i2c@01c2ac00"; + }; + }; + fragment@1 { + target = <&i2c0>; + __overlay__ { + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/spi0-spidev.dts b/arch/arm/boot/dts/overlay/spi0-spidev.dts new file mode 100644 index 00000000..2216a4da --- /dev/null +++ b/arch/arm/boot/dts/overlay/spi0-spidev.dts @@ -0,0 +1,26 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/aliases"; + __overlay__ { + /* Path to the SPI controller nodes */ + spi0 = "/soc@01c00000/spi@01c68000"; + }; + }; + fragment@1 { + target = <&spi0>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + spidev@0 { + compatible = "spidev"; + reg = <0>; + spi-max-frequency = <1000000>; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/spi1-spidev.dts b/arch/arm/boot/dts/overlay/spi1-spidev.dts new file mode 100644 index 00000000..671aaffd --- /dev/null +++ b/arch/arm/boot/dts/overlay/spi1-spidev.dts @@ -0,0 +1,26 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/aliases"; + __overlay__ { + /* Path to the SPI controller nodes */ + spi1 = "/soc@01c00000/spi@01c69000"; + }; + }; + fragment@1 { + target = <&spi1>; + __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + spidev@0 { + compatible = "spidev"; + reg = <0>; + spi-max-frequency = <1000000>; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/uart1.dts b/arch/arm/boot/dts/overlay/uart1.dts new file mode 100644 index 00000000..cd39f21a --- /dev/null +++ b/arch/arm/boot/dts/overlay/uart1.dts @@ -0,0 +1,20 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/aliases"; + __overlay__ { + uart1 = "/soc@01c00000/serial@01c28400"; + }; + }; + fragment@1 { + target = <&uart1>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/uart2.dts b/arch/arm/boot/dts/overlay/uart2.dts new file mode 100644 index 00000000..9a7b3d8e --- /dev/null +++ b/arch/arm/boot/dts/overlay/uart2.dts @@ -0,0 +1,20 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/aliases"; + __overlay__ { + uart2 = "/soc@01c00000/serial@01c28800"; + }; + }; + fragment@1 { + target = <&uart2>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&uart2_pins>; + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/uart3.dts b/arch/arm/boot/dts/overlay/uart3.dts new file mode 100644 index 00000000..b780e7f6 --- /dev/null +++ b/arch/arm/boot/dts/overlay/uart3.dts @@ -0,0 +1,20 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/aliases"; + __overlay__ { + uart3 = "/soc@01c00000/serial@01c28c00"; + }; + }; + fragment@1 { + target = <&uart3>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&uart3_pins>; + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/usbhost0.dts b/arch/arm/boot/dts/overlay/usbhost0.dts new file mode 100644 index 00000000..6b1b85f0 --- /dev/null +++ b/arch/arm/boot/dts/overlay/usbhost0.dts @@ -0,0 +1,18 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target = <&ehci0>; + __overlay__ { + status = "okay"; + }; + }; + fragment@1 { + target = <&ohci0>; + __overlay__ { + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/usbhost2.dts b/arch/arm/boot/dts/overlay/usbhost2.dts new file mode 100644 index 00000000..385811a7 --- /dev/null +++ b/arch/arm/boot/dts/overlay/usbhost2.dts @@ -0,0 +1,18 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target = <&ehci2>; + __overlay__ { + status = "okay"; + }; + }; + fragment@1 { + target = <&ohci2>; + __overlay__ { + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/usbhost3.dts b/arch/arm/boot/dts/overlay/usbhost3.dts new file mode 100644 index 00000000..dd1f7601 --- /dev/null +++ b/arch/arm/boot/dts/overlay/usbhost3.dts @@ -0,0 +1,18 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target = <&ehci3>; + __overlay__ { + status = "okay"; + }; + }; + fragment@1 { + target = <&ohci3>; + __overlay__ { + status = "okay"; + }; + }; +}; diff --git a/arch/arm/boot/dts/overlay/w1.dts b/arch/arm/boot/dts/overlay/w1.dts new file mode 100644 index 00000000..faf3650e --- /dev/null +++ b/arch/arm/boot/dts/overlay/w1.dts @@ -0,0 +1,35 @@ +/dts-v1/ /plugin/; + +/ { + compatible = "allwinner,sun8i-h3"; + + fragment@0 { + target-path = "/"; + __overlay__ { + + w1: onewire@0 { + compatible = "w1-gpio"; + pinctrl-names = "default"; + pinctrl-0 = <&w1_pins>; + gpios = <&pio 3 14 0>; // PD14 + status = "okay"; + }; + }; + }; + + fragment@1 { + target = <&pio>; + __overlay__ { + w1_pins: w1_pins { + allwinner,pins = "PD14"; + allwinner,function = "gpio_in"; // in (initially) + allwinner,pull = <0>; // off + }; + }; + }; + + __overrides__ { + gpiopin = <&w1>,"gpios:4", + <&w1_pins>,"allwinner,pins:0"; + }; +}; diff --git a/scripts/Makefile.dtbinst b/scripts/Makefile.dtbinst index a1be75d0..ad8dc1c9 100644 --- a/scripts/Makefile.dtbinst +++ b/scripts/Makefile.dtbinst @@ -27,6 +27,7 @@ ifeq ("$(dtbinst-root)", "$(obj)") endif dtbinst-files := $(dtb-y) +dtboinst-files := $(dtbo-y) dtbinst-dirs := $(dts-dirs) # Helper targets for Installing DTBs into the boot directory @@ -35,15 +36,18 @@ quiet_cmd_dtb_install = INSTALL $< install-dir = $(patsubst $(dtbinst-root)%,$(INSTALL_DTBS_PATH)%,$(obj)) -$(dtbinst-files) $(dtbinst-dirs): | __dtbs_install_prep +$(dtbinst-files) $(dtboinst-files) $(dtbinst-dirs): | __dtbs_install_prep $(dtbinst-files): %.dtb: $(obj)/%.dtb $(call cmd,dtb_install,$(install-dir)) +$(dtboinst-files): %.dtbo: $(obj)/%.dtbo + $(call cmd,dtb_install,$(install-dir)) + $(dtbinst-dirs): $(Q)$(MAKE) $(dtbinst)=$(obj)/$@ -PHONY += $(dtbinst-files) $(dtbinst-dirs) -__dtbs_install: $(dtbinst-files) $(dtbinst-dirs) +PHONY += $(dtbinst-files) $(dtboinst-files) $(dtbinst-dirs) +__dtbs_install: $(dtbinst-files) $(dtboinst-files) $(dtbinst-dirs) .PHONY: $(PHONY) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 0a07f901..5ccd3490 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -312,6 +312,17 @@ cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \ $(obj)/%.dtb: $(src)/%.dts FORCE $(call if_changed_dep,dtc) +quiet_cmd_dtco = DTCO $@ +cmd_dtco = mkdir -p $(dir ${dtc-tmp}) ; \ + $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ + $(DTC) -O dtb -o $@ -b 0 \ + -i $(dir $<) $(DTC_FLAGS) \ + -d $(depfile).dtc.tmp $(dtc-tmp) ; \ + cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile) + +$(obj)/%.dtbo: $(src)/%.dts FORCE + $(call if_changed_dep,dtco) + dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp) # Bzip2