aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas <noltari@gmail.com>2016-04-07 21:25:10 +0200
committerÁlvaro Fernández Rojas <noltari@gmail.com>2016-04-07 21:25:10 +0200
commita8d4d71c41ff0158c2026cac5981e39702167da9 (patch)
tree0c54ec3eb59f5bab6aa7318d14c92ff875412202 /target/linux/brcm2708
parent59e0e88c22007fd77ee9c6c8e02a689889a5f597 (diff)
downloadupstream-a8d4d71c41ff0158c2026cac5981e39702167da9.tar.gz
upstream-a8d4d71c41ff0158c2026cac5981e39702167da9.tar.bz2
upstream-a8d4d71c41ff0158c2026cac5981e39702167da9.zip
brcm2708: update to latest version
As usual these patches were extracted from the raspberry pi repo: https://github.com/raspberrypi/linux/commits/rpi-4.4.y Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/brcm2708')
-rw-r--r--target/linux/brcm2708/bcm2708/config-4.41
-rw-r--r--target/linux/brcm2708/bcm2709/config-4.41
-rw-r--r--target/linux/brcm2708/bcm2710/config-4.41
-rw-r--r--target/linux/brcm2708/image/Makefile2
-rw-r--r--target/linux/brcm2708/image/config.txt17
-rw-r--r--target/linux/brcm2708/patches-4.4/0001-smsx95xx-fix-crimes-against-truesize.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0002-smsc95xx-Disable-turbo-mode-by-default.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0003-vmstat-Workaround-for-issue-where-dirty-page-count-g.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0004-BCM2835_DT-Fix-I2S-register-map.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0005-irq-bcm2836-Prevent-spurious-interrupts-and-trap-the.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0006-irqchip-bcm2835-Add-FIQ-support.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0007-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0008-serial-8250-Don-t-crash-when-nr_uarts-is-0.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0009-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0010-pinctrl-bcm2835-Fix-interrupt-handling-for-GPIOs-28-.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0011-pinctrl-bcm2835-Only-request-the-interrupts-listed-i.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0012-spi-bcm2835-Support-pin-groups-other-than-7-11.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0013-ARM-bcm2835-Set-Serial-number-and-Revision.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0014-bcm2835-i2s-get-base-address-for-DMA-from-devicetree.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0015-bcm2835-i2s-add-24bit-support-update-bclk_ratio-to-m.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0016-bcm2835-i2s-setup-clock-only-if-CPU-is-clock-master.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0017-bcm2835-i2s-Eliminate-debugfs-directory-error.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0018-bcm2835-i2s-Register-PCM-device.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0019-bcm2835-i2s-Enable-MMAP-support-via-a-DT-property.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0020-dmaengine-bcm2835-Add-slave-dma-support.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0021-dmaengine-bcm2835-set-residue_granularity-field.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0022-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0023-bcm2835-dma-Fix-dreq-not-set-for-slave-transfers.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0024-bcm2835-dma-Limit-cyclic-transfers-on-lite-channels-.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0025-bcm2835-Add-support-for-uart1.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0026-firmware-bcm2835-Add-missing-property-tags.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0028-squash-include-ARCH_BCM2708-ARCH_BCM2709.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0029-Add-dwc_otg-driver.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0030-bcm2708-framebuffer-driver.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0031-dmaengine-Add-support-for-BCM2708.patch4
-rw-r--r--target/linux/brcm2708/patches-4.4/0032-Add-blk_pos-parameter-to-mmc-multi_io_quirk-callback.patch75
-rw-r--r--target/linux/brcm2708/patches-4.4/0032-MMC-added-alternative-MMC-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0033-MMC-added-alternative-MMC-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0033-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch (renamed from target/linux/brcm2708/patches-4.4/0034-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0034-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch (renamed from target/linux/brcm2708/patches-4.4/0035-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0035-bcm2708-alsa-sound-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0036-bcm2708-alsa-sound-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0036-bcm2708-vchiq-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0037-bcm2708-vchiq-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0037-vc_mem-Add-vc_mem-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0038-vc_mem-Add-vc_mem-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0038-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch (renamed from target/linux/brcm2708/patches-4.4/0039-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0039-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch (renamed from target/linux/brcm2708/patches-4.4/0040-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0040-Add-SMI-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0041-Add-SMI-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0041-Add-SMI-NAND-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0042-Add-SMI-NAND-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0042-lirc-added-support-for-RaspberryPi-GPIO.patch (renamed from target/linux/brcm2708/patches-4.4/0043-lirc-added-support-for-RaspberryPi-GPIO.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0043-Add-cpufreq-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0044-Add-cpufreq-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0044-Added-hwmon-thermal-driver-for-reporting-core-temper.patch (renamed from target/linux/brcm2708/patches-4.4/0045-Added-hwmon-thermal-driver-for-reporting-core-temper.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0045-Add-Chris-Boot-s-i2c-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0046-Add-Chris-Boot-s-i2c-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0046-char-broadcom-Add-vcio-module.patch (renamed from target/linux/brcm2708/patches-4.4/0047-char-broadcom-Add-vcio-module.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0047-firmware-bcm2835-Support-ARCH_BCM270x.patch (renamed from target/linux/brcm2708/patches-4.4/0048-firmware-bcm2835-Support-ARCH_BCM270x.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0048-bcm2835-add-v4l2-camera-device.patch (renamed from target/linux/brcm2708/patches-4.4/0049-bcm2835-add-v4l2-camera-device.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0049-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch (renamed from target/linux/brcm2708/patches-4.4/0050-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0050-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch (renamed from target/linux/brcm2708/patches-4.4/0051-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0051-BCM2708-Add-core-Device-Tree-support.patch (renamed from target/linux/brcm2708/patches-4.4/0052-BCM2708-Add-core-Device-Tree-support.patch)6
-rw-r--r--target/linux/brcm2708/patches-4.4/0052-bcm2835-Match-with-BCM2708-Device-Trees.patch (renamed from target/linux/brcm2708/patches-4.4/0053-bcm2835-Match-with-BCM2708-Device-Trees.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0053-fbdev-add-FBIOCOPYAREA-ioctl.patch (renamed from target/linux/brcm2708/patches-4.4/0054-fbdev-add-FBIOCOPYAREA-ioctl.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0057-Speed-up-console-framebuffer-imageblit-function.patch (renamed from target/linux/brcm2708/patches-4.4/0058-Speed-up-console-framebuffer-imageblit-function.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0058-Allow-mac-address-to-be-set-in-smsc95xx.patch (renamed from target/linux/brcm2708/patches-4.4/0059-Allow-mac-address-to-be-set-in-smsc95xx.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0059-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch (renamed from target/linux/brcm2708/patches-4.4/0060-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0060-Added-Device-IDs-for-August-DVB-T-205.patch (renamed from target/linux/brcm2708/patches-4.4/0061-Added-Device-IDs-for-August-DVB-T-205.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch (renamed from target/linux/brcm2708/patches-4.4/0062-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0062-ASoC-Add-support-for-PCM5102A-codec.patch (renamed from target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-PCM5102A-codec.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-HifiBerry-DAC.patch (renamed from target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-HifiBerry-DAC.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-Rpi-DAC.patch (renamed from target/linux/brcm2708/patches-4.4/0065-ASoC-Add-support-for-Rpi-DAC.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0065-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch (renamed from target/linux/brcm2708/patches-4.4/0066-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0066-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch (renamed from target/linux/brcm2708/patches-4.4/0067-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0067-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch (renamed from target/linux/brcm2708/patches-4.4/0068-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0068-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch (renamed from target/linux/brcm2708/patches-4.4/0069-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0069-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch (renamed from target/linux/brcm2708/patches-4.4/0070-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0070-Added-support-for-HiFiBerry-DAC.patch (renamed from target/linux/brcm2708/patches-4.4/0071-Added-support-for-HiFiBerry-DAC.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0071-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch (renamed from target/linux/brcm2708/patches-4.4/0072-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0072-Update-ds1307-driver-for-device-tree-support.patch (renamed from target/linux/brcm2708/patches-4.4/0073-Update-ds1307-driver-for-device-tree-support.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0073-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch (renamed from target/linux/brcm2708/patches-4.4/0074-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0074-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch (renamed from target/linux/brcm2708/patches-4.4/0075-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0075-Add-driver-for-rpi-proto.patch (renamed from target/linux/brcm2708/patches-4.4/0076-Add-driver-for-rpi-proto.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0076-config-Add-default-configs.patch (renamed from target/linux/brcm2708/patches-4.4/0077-config-Add-default-configs.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0077-bcm2835-bcm2835_defconfig.patch (renamed from target/linux/brcm2708/patches-4.4/0078-bcm2835-bcm2835_defconfig.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0078-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch (renamed from target/linux/brcm2708/patches-4.4/0079-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0079-Improve-__copy_to_user-and-__copy_from_user-performa.patch (renamed from target/linux/brcm2708/patches-4.4/0080-Improve-__copy_to_user-and-__copy_from_user-performa.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0080-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch (renamed from target/linux/brcm2708/patches-4.4/0081-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0081-spidev-Add-spidev-compatible-string-to-silence-warni.patch (renamed from target/linux/brcm2708/patches-4.4/0082-spidev-Add-spidev-compatible-string-to-silence-warni.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0082-scripts-dtc-Add-overlay-support.patch (renamed from target/linux/brcm2708/patches-4.4/0083-scripts-dtc-Add-overlay-support.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0083-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0084-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0084-RaspiDAC3-support.patch (renamed from target/linux/brcm2708/patches-4.4/0085-RaspiDAC3-support.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0085-tpa6130a2-Add-headphone-switch-control.patch (renamed from target/linux/brcm2708/patches-4.4/0086-tpa6130a2-Add-headphone-switch-control.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0086-irq-bcm2835-Fix-building-with-2708.patch (renamed from target/linux/brcm2708/patches-4.4/0087-irq-bcm2835-Fix-building-with-2708.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0087-rpi_display-add-backlight-driver-and-overlay.patch (renamed from target/linux/brcm2708/patches-4.4/0088-rpi_display-add-backlight-driver-and-overlay.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0088-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch (renamed from target/linux/brcm2708/patches-4.4/0089-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0089-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch (renamed from target/linux/brcm2708/patches-4.4/0090-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0090-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch (renamed from target/linux/brcm2708/patches-4.4/0091-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0091-drm-vc4-Force-HDMI-to-connected.patch (renamed from target/linux/brcm2708/patches-4.4/0092-drm-vc4-Force-HDMI-to-connected.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0092-drm-vc4-bo-cache-locking-fixes.patch (renamed from target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-fixes.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-cleanup.patch (renamed from target/linux/brcm2708/patches-4.4/0094-drm-vc4-bo-cache-locking-cleanup.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0094-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch (renamed from target/linux/brcm2708/patches-4.4/0095-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0095-drm-vc4-Drop-struct_mutex-around-CL-validation.patch63
-rw-r--r--target/linux/brcm2708/patches-4.4/0096-drm-vc4-Drop-struct_mutex-around-CL-validation.patch81
-rw-r--r--target/linux/brcm2708/patches-4.4/0097-drm-vc4-Add-support-for-more-display-plane-formats.patch (renamed from target/linux/brcm2708/patches-4.4/0098-drm-vc4-Add-support-for-more-display-plane-formats.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0097-drm-vc4-Drop-struct_mutex-around-CL-validation.patch74
-rw-r--r--target/linux/brcm2708/patches-4.4/0098-drm-vc4-No-need-to-stop-the-stopped-threads.patch (renamed from target/linux/brcm2708/patches-4.4/0099-drm-vc4-No-need-to-stop-the-stopped-threads.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0099-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch (renamed from target/linux/brcm2708/patches-4.4/0100-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0100-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch (renamed from target/linux/brcm2708/patches-4.4/0101-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0101-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch (renamed from target/linux/brcm2708/patches-4.4/0102-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0102-squash-fixups.patch (renamed from target/linux/brcm2708/patches-4.4/0103-squash-fixups.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0103-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch (renamed from target/linux/brcm2708/patches-4.4/0104-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0104-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch (renamed from target/linux/brcm2708/patches-4.4/0105-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0105-dts-Added-overlay-for-gpio_ir_recv-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0106-dts-Added-overlay-for-gpio_ir_recv-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0106-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch (renamed from target/linux/brcm2708/patches-4.4/0107-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0107-New-overlay-for-PiScreen2r.patch (renamed from target/linux/brcm2708/patches-4.4/0108-New-overlay-for-PiScreen2r.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0108-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch (renamed from target/linux/brcm2708/patches-4.4/0109-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0109-Add-support-for-the-HiFiBerry-DAC-Pro.patch (renamed from target/linux/brcm2708/patches-4.4/0110-Add-support-for-the-HiFiBerry-DAC-Pro.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0110-BCM270X_DT-Add-at86rf233-overlay.patch (renamed from target/linux/brcm2708/patches-4.4/0111-BCM270X_DT-Add-at86rf233-overlay.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0111-mm-Remove-the-PFN-busy-warning.patch (renamed from target/linux/brcm2708/patches-4.4/0112-mm-Remove-the-PFN-busy-warning.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0112-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch (renamed from target/linux/brcm2708/patches-4.4/0113-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0113-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch (renamed from target/linux/brcm2708/patches-4.4/0114-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0114-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch (renamed from target/linux/brcm2708/patches-4.4/0115-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0115-drm-Use-the-driver-s-gem_object_free-function-from-C.patch (renamed from target/linux/brcm2708/patches-4.4/0116-drm-Use-the-driver-s-gem_object_free-function-from-C.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0116-drm-vc4-Add-support-for-MSAA-rendering.patch (renamed from target/linux/brcm2708/patches-4.4/0117-drm-vc4-Add-support-for-MSAA-rendering.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0117-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch (renamed from target/linux/brcm2708/patches-4.4/0118-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0118-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch (renamed from target/linux/brcm2708/patches-4.4/0119-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0119-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch (renamed from target/linux/brcm2708/patches-4.4/0120-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0120-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch (renamed from target/linux/brcm2708/patches-4.4/0121-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0121-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch (renamed from target/linux/brcm2708/patches-4.4/0122-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0122-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch (renamed from target/linux/brcm2708/patches-4.4/0123-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0123-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch (renamed from target/linux/brcm2708/patches-4.4/0124-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0124-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch (renamed from target/linux/brcm2708/patches-4.4/0125-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0125-SDIO-overlay-add-bus_width-parameter.patch (renamed from target/linux/brcm2708/patches-4.4/0126-SDIO-overlay-add-bus_width-parameter.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0126-bcm2835-extend-allowed-range-of-channels-and-sampler.patch (renamed from target/linux/brcm2708/patches-4.4/0128-bcm2835-extend-allowed-range-of-channels-and-sampler.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0127-FIXUP-BCM270X_DT-random-HWRNG-dtparam-default-is-on.patch21
-rw-r--r--target/linux/brcm2708/patches-4.4/0127-bcm2835-restrict-channels-rate-to-8-960000.patch (renamed from target/linux/brcm2708/patches-4.4/0129-bcm2835-restrict-channels-rate-to-8-960000.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0128-rpi-update-vc_vchi_audioserv_defs.h.patch (renamed from target/linux/brcm2708/patches-4.4/0130-rpi-update-vc_vchi_audioserv_defs.h.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0129-bcm2835-implement-channel-map-API.patch (renamed from target/linux/brcm2708/patches-4.4/0131-bcm2835-implement-channel-map-API.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0130-bcm2835-access-controls-under-the-audio-mutex.patch (renamed from target/linux/brcm2708/patches-4.4/0132-bcm2835-access-controls-under-the-audio-mutex.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0131-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch (renamed from target/linux/brcm2708/patches-4.4/0133-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0132-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch (renamed from target/linux/brcm2708/patches-4.4/0134-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0133-bcm2835-interpolate-audio-delay.patch (renamed from target/linux/brcm2708/patches-4.4/0135-bcm2835-interpolate-audio-delay.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0134-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch (renamed from target/linux/brcm2708/patches-4.4/0136-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0135-bcm2835-sdhost-Add-debug_flags-dtparam.patch (renamed from target/linux/brcm2708/patches-4.4/0137-bcm2835-sdhost-Add-debug_flags-dtparam.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0136-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch (renamed from target/linux/brcm2708/patches-4.4/0138-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0137-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch (renamed from target/linux/brcm2708/patches-4.4/0139-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0138-dt-overlay-add-wittypi-overlay.dts.patch (renamed from target/linux/brcm2708/patches-4.4/0140-dt-overlay-add-wittypi-overlay.dts.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0139-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch (renamed from target/linux/brcm2708/patches-4.4/0142-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0140-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch (renamed from target/linux/brcm2708/patches-4.4/0143-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0141-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-Pi2.patch28
-rw-r--r--target/linux/brcm2708/patches-4.4/0141-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch (renamed from target/linux/brcm2708/patches-4.4/0144-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0142-BCM270X_DT-Adjust-overlay-README-formatting.patch (renamed from target/linux/brcm2708/patches-4.4/0145-BCM270X_DT-Adjust-overlay-README-formatting.patch)33
-rw-r--r--target/linux/brcm2708/patches-4.4/0143-pinctrl-bcm2835-Fix-cut-and-paste-error-in-pull-pars.patch25
-rw-r--r--target/linux/brcm2708/patches-4.4/0144-bcm2835-sdhost-Major-revision.patch (renamed from target/linux/brcm2708/patches-4.4/0149-bcm2835-sdhost-Major-revision.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0145-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch (renamed from target/linux/brcm2708/patches-4.4/0150-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0146-FIXUP-Overlay-README-Restore-spaces-deleted-in-error.patch39
-rw-r--r--target/linux/brcm2708/patches-4.4/0146-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch (renamed from target/linux/brcm2708/patches-4.4/0151-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0147-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch (renamed from target/linux/brcm2708/patches-4.4/0152-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0148-Revert-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-.patch21
-rw-r--r--target/linux/brcm2708/patches-4.4/0148-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch (renamed from target/linux/brcm2708/patches-4.4/0154-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0149-dcw_otg-Make-trimming-messages-less-noisy.patch (renamed from target/linux/brcm2708/patches-4.4/0155-dcw_otg-Make-trimming-messages-less-noisy.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0150-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch (renamed from target/linux/brcm2708/patches-4.4/0156-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0151-bcm2835-sdhost-Downgrade-log-message-status.patch (renamed from target/linux/brcm2708/patches-4.4/0157-bcm2835-sdhost-Downgrade-log-message-status.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0152-config-Enable-HCI-over-UARTs.patch (renamed from target/linux/brcm2708/patches-4.4/0158-config-Enable-HCI-over-UARTs.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0153-Revert-Add-blk_pos-parameter-to-mmc-multi_io_quirk-c.patch79
-rw-r--r--target/linux/brcm2708/patches-4.4/0153-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch (renamed from target/linux/brcm2708/patches-4.4/0159-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0154-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch (renamed from target/linux/brcm2708/patches-4.4/0160-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0155-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch (renamed from target/linux/brcm2708/patches-4.4/0161-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0156-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch (renamed from target/linux/brcm2708/patches-4.4/0162-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0157-Aux-SPI-1-2-implementation.patch (renamed from target/linux/brcm2708/patches-4.4/0163-Aux-SPI-1-2-implementation.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0158-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch (renamed from target/linux/brcm2708/patches-4.4/0164-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0159-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch (renamed from target/linux/brcm2708/patches-4.4/0165-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0160-bcm2835-virtgpio-Virtual-GPIO-driver.patch (renamed from target/linux/brcm2708/patches-4.4/0166-bcm2835-virtgpio-Virtual-GPIO-driver.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0161-BCM270X_DT-Add-Pi3-support.patch (renamed from target/linux/brcm2708/patches-4.4/0167-BCM270X_DT-Add-Pi3-support.patch)46
-rw-r--r--target/linux/brcm2708/patches-4.4/0162-DT-Add-overlays-to-configure-I2C-pins.patch (renamed from target/linux/brcm2708/patches-4.4/0169-DT-Add-overlays-to-configure-I2C-pins.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0163-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch (renamed from target/linux/brcm2708/patches-4.4/0170-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0164-BCM270X_DT-Add-pi3-disable-bt-overlay.patch (renamed from target/linux/brcm2708/patches-4.4/0171-BCM270X_DT-Add-pi3-disable-bt-overlay.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0165-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch (renamed from target/linux/brcm2708/patches-4.4/0172-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0166-Pi3-DT-Add-dtparams-for-the-SD-interface.patch (renamed from target/linux/brcm2708/patches-4.4/0173-Pi3-DT-Add-dtparams-for-the-SD-interface.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0167-vchiq_arm-Tweak-the-logging-output.patch (renamed from target/linux/brcm2708/patches-4.4/0174-vchiq_arm-Tweak-the-logging-output.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0168-FIXUP-BCM270X_DT-Update-to-latest-Pi3-DTS.patch82
-rw-r--r--target/linux/brcm2708/patches-4.4/0168-bcm2835-sdhost-Only-claim-one-DMA-channel.patch (renamed from target/linux/brcm2708/patches-4.4/0175-bcm2835-sdhost-Only-claim-one-DMA-channel.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0169-bcm2835-mmc-Only-claim-one-DMA-channel.patch (renamed from target/linux/brcm2708/patches-4.4/0176-bcm2835-mmc-Only-claim-one-DMA-channel.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0170-config-rebuild-with-savedefconfig.patch (renamed from target/linux/brcm2708/patches-4.4/0177-config-rebuild-with-savedefconfig.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0171-config-Add-module-for-mcp3422-ADC.patch (renamed from target/linux/brcm2708/patches-4.4/0178-config-Add-module-for-mcp3422-ADC.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0172-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch (renamed from target/linux/brcm2708/patches-4.4/0179-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch)4
-rw-r--r--target/linux/brcm2708/patches-4.4/0174-BCM270X_DT-rpi-display-overlay-add-swapxy-param.patch38
-rw-r--r--target/linux/brcm2708/patches-4.4/0175-Remove-I2S-config-from-bt_pins.patch38
-rw-r--r--target/linux/brcm2708/patches-4.4/0176-Revert-scripts-dtc-Add-overlay-support.patch4390
-rw-r--r--target/linux/brcm2708/patches-4.4/0177-scripts-dtc-Update-to-upstream-version-1.4.1.patch2736
-rw-r--r--target/linux/brcm2708/patches-4.4/0178-configfs-implement-binary-attributes.patch639
-rw-r--r--target/linux/brcm2708/patches-4.4/0179-OF-DT-Overlay-configfs-interface.patch408
-rw-r--r--target/linux/brcm2708/patches-4.4/0180-Protect-__release_resource-against-resources-without.patch28
-rw-r--r--target/linux/brcm2708/patches-4.4/0181-BCM270X_DT-Add-a-.dtbo-target-use-for-overlays.patch193
-rw-r--r--target/linux/brcm2708/patches-4.4/0182-scripts-knlinfo-Decode-DDTK-atom.patch31
-rw-r--r--target/linux/brcm2708/patches-4.4/0183-Enable-Dynamic-Device-Tree-for-bcmrpi_defconfig-and-.patch40
-rw-r--r--target/linux/brcm2708/patches-4.4/0184-SQUASH-Add-CONFIG_OF_CONFIGFS-to-bcmrpi_defconfig.patch29
-rw-r--r--target/linux/brcm2708/patches-4.4/0185-dts-kbuild-dtbs_install-installs-.dtbo-files-too.patch42
-rw-r--r--target/linux/brcm2708/patches-4.4/0186-bcm2835-sdhost-Workaround-for-slow-sectors.patch118
-rw-r--r--target/linux/brcm2708/patches-4.4/0187-BCM270X_DT-Add-labels-to-spidev-nodes.patch114
-rw-r--r--target/linux/brcm2708/patches-4.4/0188-BCM270X_DT-Use-spidev-labels-in-overlays.patch628
-rw-r--r--target/linux/brcm2708/patches-4.4/0189-BCM270X_DT-Build-and-document-the-wittypi-overlay.patch50
-rw-r--r--target/linux/brcm2708/patches-4.4/0190-scripts-dtc-Fix-UMR-causing-corrupt-dtbo-overlay-fil.patch27
-rw-r--r--target/linux/brcm2708/patches-4.4/0191-BCM270X_DT-Add-dtparam-for-uart1.patch77
-rw-r--r--target/linux/brcm2708/patches-4.4/0192-dwc-overlay-Use-label-so-overrides-can-apply.patch34
-rw-r--r--target/linux/brcm2708/patches-4.4/0193-drm-vc4-Add-a-debugfs-node-for-tracking-execution-st.patch56
-rw-r--r--target/linux/brcm2708/patches-4.4/0194-drm-vc4-Include-vc4_drm.h-in-uapi-in-downstream-buil.patch21
-rw-r--r--target/linux/brcm2708/patches-4.4/0195-drm-vc4-Validate-that-WAIT_BO-padding-is-cleared.patch25
-rw-r--r--target/linux/brcm2708/patches-4.4/0196-drm-vc4-Fix-the-clear-color-for-the-first-tile-rende.patch49
-rw-r--r--target/linux/brcm2708/patches-4.4/0197-drm-vc4-Return-an-ERR_PTR-from-BO-creation-instead-o.patch137
-rw-r--r--target/linux/brcm2708/patches-4.4/0198-drm-vc4-Fix-ERESTARTSYS-error-return-from-BO-waits.patch32
-rw-r--r--target/linux/brcm2708/patches-4.4/0199-drm-vc4-Drop-error-message-on-seqno-wait-timeouts.patch27
-rw-r--r--target/linux/brcm2708/patches-4.4/0200-BCM270X_DT-Add-1-bit-SDIO-using-minimal-pins.patch81
-rw-r--r--target/linux/brcm2708/patches-4.4/0202-Add-overlay-and-enable-support-for-QCA7000-board.patch127
-rw-r--r--target/linux/brcm2708/patches-4.4/0203-serial-Take-care-starting-a-hung-up-tty-s-port.patch28
-rw-r--r--target/linux/brcm2708/patches-4.4/0204-pi3-miniuart-bt-overlay-Correct-and-clarify-info.patch41
-rw-r--r--target/linux/brcm2708/patches-4.4/0205-pwm-overlays-Params-must-have-in-overlay-targets.patch52
-rw-r--r--target/linux/brcm2708/patches-4.4/0206-BCM270X_DT-Switch-Compute-Module-to-MMC.patch53
-rw-r--r--target/linux/brcm2708/patches-4.4/0207-dwc_otg-Don-t-free-qh-align-buffers-in-atomic-contex.patch44
-rw-r--r--target/linux/brcm2708/patches-4.4/0208-dwc_otg-Enable-the-hack-for-Split-Interrupt-transact.patch28
-rw-r--r--target/linux/brcm2708/patches-4.4/0209-BCM270X_DT-Remove-explicit-claiming-of-UART-pins.patch89
-rw-r--r--target/linux/brcm2708/patches-4.4/0210-lirc_rpi-Lower-IR-reception-error-to-debug.patch21
-rw-r--r--target/linux/brcm2708/patches-4.4/0211-vchiq_arm-Access-the-dequeue_pending-flag-locked.patch58
-rw-r--r--target/linux/brcm2708/patches-4.4/0212-BCM270X_DT-Add-pi3-act-led-overlay.patch94
-rw-r--r--target/linux/brcm2708/patches-4.4/0213-vchiq_arm-Service-callbacks-must-not-fail.patch26
-rw-r--r--target/linux/brcm2708/patches-4.4/0214-Add-configs-and-overlay-for-PCA9548-I2C-mux.patch133
-rw-r--r--target/linux/brcm2708/patches-4.4/0215-BCM270X_DT-Add-DS1339-to-i2c-rtc-overlay.patch58
-rw-r--r--target/linux/brcm2708/patches-4.4/0216-copy_from_user-CPU_SW_DOMAIN_PAN-compatibility.patch53
-rw-r--r--target/linux/brcm2708/patches-4.4/0217-bcm2835-sdhost-Adjust-to-core-clock-changes.patch339
-rw-r--r--target/linux/brcm2708/patches-4.4/0218-BCM270X_DT-Document-hazards-of-sdhost-overlay.patch34
-rw-r--r--target/linux/brcm2708/patches-4.4/0219-cpufreq-Temporarily-ignore-io_is_busy-1.patch31
-rw-r--r--target/linux/brcm2708/patches-4.4/0220-Revert-cpufreq-Temporarily-ignore-io_is_busy-1.patch26
-rw-r--r--target/linux/brcm2708/patches-4.4/0221-net-sched-add-skb_at_tc_ingress-helper.patch50
-rw-r--r--target/linux/brcm2708/patches-4.4/0222-net-fix-bridge-multicast-packet-checksum-validation.patch75
-rw-r--r--target/linux/brcm2708/patches-4.4/0223-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch124
-rw-r--r--target/linux/brcm2708/patches-4.4/0224-bcm2835-sdhost-Precalc-divisors-and-overclocks.patch270
-rw-r--r--target/linux/brcm2708/patches-4.4/0225-Revert-bcm2835-sdhost-Precalc-divisors-and-overclock.patch267
-rw-r--r--target/linux/brcm2708/patches-4.4/0226-Revert-bcm2835-sdhost-Adjust-to-core-clock-changes.patch327
-rw-r--r--target/linux/brcm2708/patches-4.4/0227-bcm2835-sdhost-Firmware-manages-the-clock-divisor.patch226
-rw-r--r--target/linux/brcm2708/patches-4.4/0228-Revert-Revert-cpufreq-Temporarily-ignore-io_is_busy-.patch27
-rw-r--r--target/linux/brcm2708/patches-4.4/0229-config-Enabled-IPV6_SUBTREES.patch30
-rw-r--r--target/linux/brcm2708/patches-4.4/0230-add-smsc95xx-packetsize-module_param.patch42
-rw-r--r--target/linux/brcm2708/patches-4.4/0231-reboot-Use-power-off-rather-than-busy-spinning-when-.patch25
-rw-r--r--target/linux/brcm2708/patches-4.4/0232-Revert-bcm2835-dma-Fix-dreq-not-set-for-slave-transf.patch32
-rw-r--r--target/linux/brcm2708/patches-4.4/1001-smsc95xx-disable-hw-csum.patch11
241 files changed, 13437 insertions, 839 deletions
diff --git a/target/linux/brcm2708/bcm2708/config-4.4 b/target/linux/brcm2708/bcm2708/config-4.4
index 1209f5e48a..2b66d0ff00 100644
--- a/target/linux/brcm2708/bcm2708/config-4.4
+++ b/target/linux/brcm2708/bcm2708/config-4.4
@@ -266,6 +266,7 @@ CONFIG_NO_HZ_IDLE=y
CONFIG_OABI_COMPAT=y
CONFIG_OF=y
CONFIG_OF_ADDRESS=y
+CONFIG_OF_CONFIGFS=y
CONFIG_OF_EARLY_FLATTREE=y
CONFIG_OF_FLATTREE=y
CONFIG_OF_GPIO=y
diff --git a/target/linux/brcm2708/bcm2709/config-4.4 b/target/linux/brcm2708/bcm2709/config-4.4
index 87ca365f6a..3127775c3a 100644
--- a/target/linux/brcm2708/bcm2709/config-4.4
+++ b/target/linux/brcm2708/bcm2709/config-4.4
@@ -283,6 +283,7 @@ CONFIG_NR_CPUS=4
CONFIG_OABI_COMPAT=y
CONFIG_OF=y
CONFIG_OF_ADDRESS=y
+CONFIG_OF_CONFIGFS=y
CONFIG_OF_EARLY_FLATTREE=y
CONFIG_OF_FLATTREE=y
CONFIG_OF_GPIO=y
diff --git a/target/linux/brcm2708/bcm2710/config-4.4 b/target/linux/brcm2708/bcm2710/config-4.4
index 8614c8f828..8ff865685d 100644
--- a/target/linux/brcm2708/bcm2710/config-4.4
+++ b/target/linux/brcm2708/bcm2710/config-4.4
@@ -283,6 +283,7 @@ CONFIG_NR_CPUS=4
CONFIG_OABI_COMPAT=y
CONFIG_OF=y
CONFIG_OF_ADDRESS=y
+CONFIG_OF_CONFIGFS=y
CONFIG_OF_EARLY_FLATTREE=y
CONFIG_OF_FLATTREE=y
CONFIG_OF_GPIO=y
diff --git a/target/linux/brcm2708/image/Makefile b/target/linux/brcm2708/image/Makefile
index ad71c5679f..04c27ccf83 100644
--- a/target/linux/brcm2708/image/Makefile
+++ b/target/linux/brcm2708/image/Makefile
@@ -33,7 +33,7 @@ define Build/boot-img
mcopy -i $@.boot $(word 1,$^) ::kernel.img
$(foreach dts,$(shell echo $(DEVICE_DTS)),mcopy -i $@.boot $(DTS_DIR)/$(dts).dtb ::;)
mmd -i $@.boot ::/overlays
- mcopy -i $@.boot $(DTS_DIR)/overlays/*.dtb ::/overlays/
+ mcopy -i $@.boot $(DTS_DIR)/overlays/*.dtbo ::/overlays/
mcopy -i $@.boot $(DTS_DIR)/overlays/README ::/overlays/
endef
diff --git a/target/linux/brcm2708/image/config.txt b/target/linux/brcm2708/image/config.txt
index 75b1cab7af..8c96f1fe97 100644
--- a/target/linux/brcm2708/image/config.txt
+++ b/target/linux/brcm2708/image/config.txt
@@ -476,7 +476,14 @@
## Stop start.elf from filling in ATAGS (memory from 0x100) before
## launching kernel
##
-disable_commandline_tags=2
+#disable_commandline_tags=2
+
+## enable_uart
+## Enables or disables uart pin multiplexing
+## Raspberry Pi 1/2: if unset, uart is enabled by default
+## Raspberry Pi 3: if unset uart is disabled by default
+##
+enable_uart=1
## cmdline (string)
## Command line parameters. Can be used instead of cmdline.txt file
@@ -491,7 +498,7 @@ disable_commandline_tags=2
## kernel_address
## Address to load kernel.img file at
##
-kernel_address=0x8000
+#kernel_address=0x8000
## ramfsfile (string)
## ramfs file to load
@@ -515,21 +522,21 @@ kernel_address=0x8000
## device_tree_address
## Address to load device_tree at
##
-device_tree_address=0x100
+#device_tree_address=0x100
## init_uart_baud
## Initial uart baud rate.
##
## Default 115200
##
-init_uart_baud=115200
+#init_uart_baud=115200
## init_uart_clock
## Initial uart clock.
##
## Default 3000000 (3MHz)
##
-init_uart_clock=3000000
+#init_uart_clock=3000000
## init_emmc_clock
## Initial emmc clock, increasing this can speedup your SD-card.
diff --git a/target/linux/brcm2708/patches-4.4/0001-smsx95xx-fix-crimes-against-truesize.patch b/target/linux/brcm2708/patches-4.4/0001-smsx95xx-fix-crimes-against-truesize.patch
index 960b448932..ee4ff9d2b3 100644
--- a/target/linux/brcm2708/patches-4.4/0001-smsx95xx-fix-crimes-against-truesize.patch
+++ b/target/linux/brcm2708/patches-4.4/0001-smsx95xx-fix-crimes-against-truesize.patch
@@ -1,7 +1,7 @@
-From b6cc28abbbf710379772d3da9227ce66926c46a3 Mon Sep 17 00:00:00 2001
+From 23b133903a357066adb48bceb76aba8bd30d8c66 Mon Sep 17 00:00:00 2001
From: Steve Glendinning <steve.glendinning@smsc.com>
Date: Thu, 19 Feb 2015 18:47:12 +0000
-Subject: [PATCH 001/170] smsx95xx: fix crimes against truesize
+Subject: [PATCH 001/232] smsx95xx: fix crimes against truesize
smsc95xx is adjusting truesize when it shouldn't, and following a recent patch from Eric this is now triggering warnings.
diff --git a/target/linux/brcm2708/patches-4.4/0002-smsc95xx-Disable-turbo-mode-by-default.patch b/target/linux/brcm2708/patches-4.4/0002-smsc95xx-Disable-turbo-mode-by-default.patch
index 8ed786b538..f3f7a4bf2d 100644
--- a/target/linux/brcm2708/patches-4.4/0002-smsc95xx-Disable-turbo-mode-by-default.patch
+++ b/target/linux/brcm2708/patches-4.4/0002-smsc95xx-Disable-turbo-mode-by-default.patch
@@ -1,7 +1,7 @@
-From 37e24d2f0af32632a17692076dddcf176d1af1f7 Mon Sep 17 00:00:00 2001
+From e7515ee9af1d150d50b55d8f8f53d735a23cb253 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Fri, 17 Apr 2015 16:58:45 +0100
-Subject: [PATCH 002/170] smsc95xx: Disable turbo mode by default
+Subject: [PATCH 002/232] smsc95xx: Disable turbo mode by default
---
drivers/net/usb/smsc95xx.c | 2 +-
diff --git a/target/linux/brcm2708/patches-4.4/0003-vmstat-Workaround-for-issue-where-dirty-page-count-g.patch b/target/linux/brcm2708/patches-4.4/0003-vmstat-Workaround-for-issue-where-dirty-page-count-g.patch
index 63d51ba506..9a6d94f9e7 100644
--- a/target/linux/brcm2708/patches-4.4/0003-vmstat-Workaround-for-issue-where-dirty-page-count-g.patch
+++ b/target/linux/brcm2708/patches-4.4/0003-vmstat-Workaround-for-issue-where-dirty-page-count-g.patch
@@ -1,7 +1,7 @@
-From d5cb475205138f9df1fdbb74d8810ab1928696ea Mon Sep 17 00:00:00 2001
+From 849ff5353023c95d40040ecfd279e216074b3d1c Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 18 Jun 2014 13:42:01 +0100
-Subject: [PATCH 003/170] vmstat: Workaround for issue where dirty page count
+Subject: [PATCH 003/232] vmstat: Workaround for issue where dirty page count
goes negative
See:
diff --git a/target/linux/brcm2708/patches-4.4/0004-BCM2835_DT-Fix-I2S-register-map.patch b/target/linux/brcm2708/patches-4.4/0004-BCM2835_DT-Fix-I2S-register-map.patch
index 0d348cabcd..a171fbfa40 100644
--- a/target/linux/brcm2708/patches-4.4/0004-BCM2835_DT-Fix-I2S-register-map.patch
+++ b/target/linux/brcm2708/patches-4.4/0004-BCM2835_DT-Fix-I2S-register-map.patch
@@ -1,7 +1,7 @@
-From 249a499b1d4b6f8a57b3377d4f505841e99f60c8 Mon Sep 17 00:00:00 2001
+From d29365673ed37e7688bd3f35c4a5ad719f878190 Mon Sep 17 00:00:00 2001
From: Robert Tiemann <rtie@gmx.de>
Date: Mon, 20 Jul 2015 11:01:25 +0200
-Subject: [PATCH 004/170] BCM2835_DT: Fix I2S register map
+Subject: [PATCH 004/232] BCM2835_DT: Fix I2S register map
---
Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt | 4 ++--
diff --git a/target/linux/brcm2708/patches-4.4/0005-irq-bcm2836-Prevent-spurious-interrupts-and-trap-the.patch b/target/linux/brcm2708/patches-4.4/0005-irq-bcm2836-Prevent-spurious-interrupts-and-trap-the.patch
index a2e71925cd..7db83aec0d 100644
--- a/target/linux/brcm2708/patches-4.4/0005-irq-bcm2836-Prevent-spurious-interrupts-and-trap-the.patch
+++ b/target/linux/brcm2708/patches-4.4/0005-irq-bcm2836-Prevent-spurious-interrupts-and-trap-the.patch
@@ -1,7 +1,7 @@
-From c24657505a2aac71d0409b0ef703fc21ecab4b2e Mon Sep 17 00:00:00 2001
+From c891de13b385afb3e4b2c97ac5bbea7e2d97252f Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 4 Dec 2015 17:41:50 +0000
-Subject: [PATCH 005/170] irq-bcm2836: Prevent spurious interrupts, and trap
+Subject: [PATCH 005/232] irq-bcm2836: Prevent spurious interrupts, and trap
them early
The old arch-specific IRQ macros included a dsb to ensure the
diff --git a/target/linux/brcm2708/patches-4.4/0006-irqchip-bcm2835-Add-FIQ-support.patch b/target/linux/brcm2708/patches-4.4/0006-irqchip-bcm2835-Add-FIQ-support.patch
index 16d431e4cb..81d1295ece 100644
--- a/target/linux/brcm2708/patches-4.4/0006-irqchip-bcm2835-Add-FIQ-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0006-irqchip-bcm2835-Add-FIQ-support.patch
@@ -1,7 +1,7 @@
-From 229bcf2e73ce37e8a18d68773471024c848d84bd Mon Sep 17 00:00:00 2001
+From 60f7ee79b375d72f5ef46ec542b925b1f1428bad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Fri, 12 Jun 2015 19:01:05 +0200
-Subject: [PATCH 006/170] irqchip: bcm2835: Add FIQ support
+Subject: [PATCH 006/232] irqchip: bcm2835: Add FIQ support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0007-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch b/target/linux/brcm2708/patches-4.4/0007-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch
index 6025b7a9b1..e95993c86a 100644
--- a/target/linux/brcm2708/patches-4.4/0007-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0007-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch
@@ -1,7 +1,7 @@
-From 6780f0a5c6af19f2b9850e961a0f81fbfdfa48fe Mon Sep 17 00:00:00 2001
+From 890dccbb9c60be182adefb61b3ede805ccba1a91 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Fri, 23 Oct 2015 16:26:55 +0200
-Subject: [PATCH 007/170] irqchip: irq-bcm2835: Add 2836 FIQ support
+Subject: [PATCH 007/232] irqchip: irq-bcm2835: Add 2836 FIQ support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0008-serial-8250-Don-t-crash-when-nr_uarts-is-0.patch b/target/linux/brcm2708/patches-4.4/0008-serial-8250-Don-t-crash-when-nr_uarts-is-0.patch
index 5c624a8db0..6961269a32 100644
--- a/target/linux/brcm2708/patches-4.4/0008-serial-8250-Don-t-crash-when-nr_uarts-is-0.patch
+++ b/target/linux/brcm2708/patches-4.4/0008-serial-8250-Don-t-crash-when-nr_uarts-is-0.patch
@@ -1,7 +1,7 @@
-From 4b9529b98c01569dff06f4e67ba28a47318e5ea5 Mon Sep 17 00:00:00 2001
+From 9a27662aac88f95b3de1915333a0265614f88a0d Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 30 Jun 2015 14:12:42 +0100
-Subject: [PATCH 008/170] serial: 8250: Don't crash when nr_uarts is 0
+Subject: [PATCH 008/232] serial: 8250: Don't crash when nr_uarts is 0
---
drivers/tty/serial/8250/8250_core.c | 2 ++
diff --git a/target/linux/brcm2708/patches-4.4/0009-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch b/target/linux/brcm2708/patches-4.4/0009-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch
index fca587747c..a75621d54e 100644
--- a/target/linux/brcm2708/patches-4.4/0009-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch
+++ b/target/linux/brcm2708/patches-4.4/0009-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch
@@ -1,7 +1,7 @@
-From 5fd6ab82b1027504faa66cf4fc8b999fafaacd12 Mon Sep 17 00:00:00 2001
+From 4d7ff05e4d4d8d8adb4e7b4dd5fa8f63ae2be0f6 Mon Sep 17 00:00:00 2001
From: notro <notro@tronnes.org>
Date: Thu, 10 Jul 2014 13:59:47 +0200
-Subject: [PATCH 009/170] pinctrl-bcm2835: Set base to 0 give expected gpio
+Subject: [PATCH 009/232] pinctrl-bcm2835: Set base to 0 give expected gpio
numbering
Signed-off-by: Noralf Tronnes <notro@tronnes.org>
diff --git a/target/linux/brcm2708/patches-4.4/0010-pinctrl-bcm2835-Fix-interrupt-handling-for-GPIOs-28-.patch b/target/linux/brcm2708/patches-4.4/0010-pinctrl-bcm2835-Fix-interrupt-handling-for-GPIOs-28-.patch
index da3406b413..278ff9fec5 100644
--- a/target/linux/brcm2708/patches-4.4/0010-pinctrl-bcm2835-Fix-interrupt-handling-for-GPIOs-28-.patch
+++ b/target/linux/brcm2708/patches-4.4/0010-pinctrl-bcm2835-Fix-interrupt-handling-for-GPIOs-28-.patch
@@ -1,7 +1,7 @@
-From 4254ef2647e89061427836443eac60351b3306a7 Mon Sep 17 00:00:00 2001
+From 969dc44a700e1be13c3f80445d40c1fe51cc4370 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 24 Feb 2015 13:40:50 +0000
-Subject: [PATCH 010/170] pinctrl-bcm2835: Fix interrupt handling for GPIOs
+Subject: [PATCH 010/232] pinctrl-bcm2835: Fix interrupt handling for GPIOs
28-31 and 46-53
Contrary to the documentation, the BCM2835 GPIO controller actually has
diff --git a/target/linux/brcm2708/patches-4.4/0011-pinctrl-bcm2835-Only-request-the-interrupts-listed-i.patch b/target/linux/brcm2708/patches-4.4/0011-pinctrl-bcm2835-Only-request-the-interrupts-listed-i.patch
index 02656d9060..49315e5884 100644
--- a/target/linux/brcm2708/patches-4.4/0011-pinctrl-bcm2835-Only-request-the-interrupts-listed-i.patch
+++ b/target/linux/brcm2708/patches-4.4/0011-pinctrl-bcm2835-Only-request-the-interrupts-listed-i.patch
@@ -1,7 +1,7 @@
-From 93b12e64d0e2a8a65189dedd667e00b0a0fab60a Mon Sep 17 00:00:00 2001
+From b949246bf51fa852bad45136cdd6bcd91a29539e Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 26 Feb 2015 09:58:22 +0000
-Subject: [PATCH 011/170] pinctrl-bcm2835: Only request the interrupts listed
+Subject: [PATCH 011/232] pinctrl-bcm2835: Only request the interrupts listed
in the DTB
Although the GPIO controller can generate three interrupts (four counting
diff --git a/target/linux/brcm2708/patches-4.4/0012-spi-bcm2835-Support-pin-groups-other-than-7-11.patch b/target/linux/brcm2708/patches-4.4/0012-spi-bcm2835-Support-pin-groups-other-than-7-11.patch
index 46c37ec973..92aa046f22 100644
--- a/target/linux/brcm2708/patches-4.4/0012-spi-bcm2835-Support-pin-groups-other-than-7-11.patch
+++ b/target/linux/brcm2708/patches-4.4/0012-spi-bcm2835-Support-pin-groups-other-than-7-11.patch
@@ -1,7 +1,7 @@
-From bb8ff388ad26721eebb7249afb6f6f57bc196de4 Mon Sep 17 00:00:00 2001
+From 19bcdacc5a67abe6a2d604a39ddfed5a54c77b2e Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Wed, 24 Jun 2015 14:10:44 +0100
-Subject: [PATCH 012/170] spi-bcm2835: Support pin groups other than 7-11
+Subject: [PATCH 012/232] spi-bcm2835: Support pin groups other than 7-11
The spi-bcm2835 driver automatically uses GPIO chip-selects due to
some unreliability of the native ones. In doing so it chooses the
diff --git a/target/linux/brcm2708/patches-4.4/0013-ARM-bcm2835-Set-Serial-number-and-Revision.patch b/target/linux/brcm2708/patches-4.4/0013-ARM-bcm2835-Set-Serial-number-and-Revision.patch
index a0860d1dbf..a571cdb202 100644
--- a/target/linux/brcm2708/patches-4.4/0013-ARM-bcm2835-Set-Serial-number-and-Revision.patch
+++ b/target/linux/brcm2708/patches-4.4/0013-ARM-bcm2835-Set-Serial-number-and-Revision.patch
@@ -1,7 +1,7 @@
-From bfcfed788d152e828747ea889a88f8b179217ddb Mon Sep 17 00:00:00 2001
+From 7ce5cbfba6e930c2178f342a4390972f1efd75ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Wed, 3 Jun 2015 12:26:13 +0200
-Subject: [PATCH 013/170] ARM: bcm2835: Set Serial number and Revision
+Subject: [PATCH 013/232] ARM: bcm2835: Set Serial number and Revision
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0014-bcm2835-i2s-get-base-address-for-DMA-from-devicetree.patch b/target/linux/brcm2708/patches-4.4/0014-bcm2835-i2s-get-base-address-for-DMA-from-devicetree.patch
index 0e4726d458..fa35faaf56 100644
--- a/target/linux/brcm2708/patches-4.4/0014-bcm2835-i2s-get-base-address-for-DMA-from-devicetree.patch
+++ b/target/linux/brcm2708/patches-4.4/0014-bcm2835-i2s-get-base-address-for-DMA-from-devicetree.patch
@@ -1,7 +1,7 @@
-From fb968a02c00e2722df2dcfec6f54b7524ff5a155 Mon Sep 17 00:00:00 2001
+From 569baa856d805e594011f2d1444b6849c291544d Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 16:44:05 +0200
-Subject: [PATCH 014/170] bcm2835-i2s: get base address for DMA from devicetree
+Subject: [PATCH 014/232] bcm2835-i2s: get base address for DMA from devicetree
Code copied from spi-bcm2835. Get physical address from devicetree
instead of using hardcoded constant.
diff --git a/target/linux/brcm2708/patches-4.4/0015-bcm2835-i2s-add-24bit-support-update-bclk_ratio-to-m.patch b/target/linux/brcm2708/patches-4.4/0015-bcm2835-i2s-add-24bit-support-update-bclk_ratio-to-m.patch
index 79fe1b43a9..a1fbf79ef0 100644
--- a/target/linux/brcm2708/patches-4.4/0015-bcm2835-i2s-add-24bit-support-update-bclk_ratio-to-m.patch
+++ b/target/linux/brcm2708/patches-4.4/0015-bcm2835-i2s-add-24bit-support-update-bclk_ratio-to-m.patch
@@ -1,7 +1,7 @@
-From abbe565abfe075b76e01b9671c6fc4cf42cc0328 Mon Sep 17 00:00:00 2001
+From c61a7aef15a1aee86e1de59dca2ad7002995f9cf Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 15:21:16 +0200
-Subject: [PATCH 015/170] bcm2835-i2s: add 24bit support, update bclk_ratio to
+Subject: [PATCH 015/232] bcm2835-i2s: add 24bit support, update bclk_ratio to
more correct values
Code ported from bcm2708-i2s driver in Raspberry Pi tree.
diff --git a/target/linux/brcm2708/patches-4.4/0016-bcm2835-i2s-setup-clock-only-if-CPU-is-clock-master.patch b/target/linux/brcm2708/patches-4.4/0016-bcm2835-i2s-setup-clock-only-if-CPU-is-clock-master.patch
index 810f83fb8e..ec224b93e0 100644
--- a/target/linux/brcm2708/patches-4.4/0016-bcm2835-i2s-setup-clock-only-if-CPU-is-clock-master.patch
+++ b/target/linux/brcm2708/patches-4.4/0016-bcm2835-i2s-setup-clock-only-if-CPU-is-clock-master.patch
@@ -1,7 +1,7 @@
-From b2cc62cd13099d6d2f21b9927df248aa3bdd8d5b Mon Sep 17 00:00:00 2001
+From e2a75ce0e2b6319150e14401f9822adba7895c9c Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 15:25:51 +0200
-Subject: [PATCH 016/170] bcm2835-i2s: setup clock only if CPU is clock master
+Subject: [PATCH 016/232] bcm2835-i2s: setup clock only if CPU is clock master
Code ported from bcm2708-i2s driver in Raspberry Pi tree.
diff --git a/target/linux/brcm2708/patches-4.4/0017-bcm2835-i2s-Eliminate-debugfs-directory-error.patch b/target/linux/brcm2708/patches-4.4/0017-bcm2835-i2s-Eliminate-debugfs-directory-error.patch
index 93c83fd682..82d15f42d0 100644
--- a/target/linux/brcm2708/patches-4.4/0017-bcm2835-i2s-Eliminate-debugfs-directory-error.patch
+++ b/target/linux/brcm2708/patches-4.4/0017-bcm2835-i2s-Eliminate-debugfs-directory-error.patch
@@ -1,7 +1,7 @@
-From 71b2c93cd332be280b9ca7f293e463f30d5fb108 Mon Sep 17 00:00:00 2001
+From 433841fc5958e1ddbd503b579a022fb67defd74b Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 15:49:51 +0200
-Subject: [PATCH 017/170] bcm2835-i2s: Eliminate debugfs directory error
+Subject: [PATCH 017/232] bcm2835-i2s: Eliminate debugfs directory error
Code ported from bcm2708-i2s driver in Raspberry Pi tree.
diff --git a/target/linux/brcm2708/patches-4.4/0018-bcm2835-i2s-Register-PCM-device.patch b/target/linux/brcm2708/patches-4.4/0018-bcm2835-i2s-Register-PCM-device.patch
index 1b547fd6b9..1dc721a696 100644
--- a/target/linux/brcm2708/patches-4.4/0018-bcm2835-i2s-Register-PCM-device.patch
+++ b/target/linux/brcm2708/patches-4.4/0018-bcm2835-i2s-Register-PCM-device.patch
@@ -1,7 +1,7 @@
-From fae43fcaa20df1d39c09c98372100bb1dedd6090 Mon Sep 17 00:00:00 2001
+From 7b4481818fe920904457496db40d59dd3d0a83bb Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 15:35:20 +0200
-Subject: [PATCH 018/170] bcm2835-i2s: Register PCM device
+Subject: [PATCH 018/232] bcm2835-i2s: Register PCM device
Code ported from bcm2708-i2s driver in Raspberry Pi tree.
diff --git a/target/linux/brcm2708/patches-4.4/0019-bcm2835-i2s-Enable-MMAP-support-via-a-DT-property.patch b/target/linux/brcm2708/patches-4.4/0019-bcm2835-i2s-Enable-MMAP-support-via-a-DT-property.patch
index e68391ccce..e3d7e43823 100644
--- a/target/linux/brcm2708/patches-4.4/0019-bcm2835-i2s-Enable-MMAP-support-via-a-DT-property.patch
+++ b/target/linux/brcm2708/patches-4.4/0019-bcm2835-i2s-Enable-MMAP-support-via-a-DT-property.patch
@@ -1,7 +1,7 @@
-From c9e2eeee4889f965a29744718bbff2de409ac649 Mon Sep 17 00:00:00 2001
+From 027ba808e84799c97ae1c64f8424ac8eb7235cc4 Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 15:55:21 +0200
-Subject: [PATCH 019/170] bcm2835-i2s: Enable MMAP support via a DT property
+Subject: [PATCH 019/232] bcm2835-i2s: Enable MMAP support via a DT property
Code ported from bcm2708-i2s driver in Raspberry Pi tree.
diff --git a/target/linux/brcm2708/patches-4.4/0020-dmaengine-bcm2835-Add-slave-dma-support.patch b/target/linux/brcm2708/patches-4.4/0020-dmaengine-bcm2835-Add-slave-dma-support.patch
index 97d6af0490..344b39c3fd 100644
--- a/target/linux/brcm2708/patches-4.4/0020-dmaengine-bcm2835-Add-slave-dma-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0020-dmaengine-bcm2835-Add-slave-dma-support.patch
@@ -1,7 +1,7 @@
-From dc5b926436bccc4efbb1695ec3696b5db6746d3b Mon Sep 17 00:00:00 2001
+From 8a349301238aabb40c9da5ca8c8492b6b8d146f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Thu, 9 Apr 2015 12:34:11 +0200
-Subject: [PATCH 020/170] dmaengine: bcm2835: Add slave dma support
+Subject: [PATCH 020/232] dmaengine: bcm2835: Add slave dma support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0021-dmaengine-bcm2835-set-residue_granularity-field.patch b/target/linux/brcm2708/patches-4.4/0021-dmaengine-bcm2835-set-residue_granularity-field.patch
index 14d217d3b6..4655513f73 100644
--- a/target/linux/brcm2708/patches-4.4/0021-dmaengine-bcm2835-set-residue_granularity-field.patch
+++ b/target/linux/brcm2708/patches-4.4/0021-dmaengine-bcm2835-set-residue_granularity-field.patch
@@ -1,7 +1,7 @@
-From 9c6955f3fbfbb46242c63b4640886b9a0d87910a Mon Sep 17 00:00:00 2001
+From 290f55520c62025da992d6be0002fc1e3738cfdb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Sat, 3 Oct 2015 15:58:59 +0200
-Subject: [PATCH 021/170] dmaengine: bcm2835: set residue_granularity field
+Subject: [PATCH 021/232] dmaengine: bcm2835: set residue_granularity field
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0022-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch b/target/linux/brcm2708/patches-4.4/0022-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch
index bc4e2028de..a03aed37fb 100644
--- a/target/linux/brcm2708/patches-4.4/0022-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch
+++ b/target/linux/brcm2708/patches-4.4/0022-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch
@@ -1,7 +1,7 @@
-From 8da7ee8d9b714dbbac842fb5ae0471b52e0393ec Mon Sep 17 00:00:00 2001
+From 6f56fff39c811953809b011f59c49a2122c4d173 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Sat, 3 Oct 2015 22:22:55 +0200
-Subject: [PATCH 022/170] dmaengine: bcm2835: Load driver early and support
+Subject: [PATCH 022/232] dmaengine: bcm2835: Load driver early and support
legacy API
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
diff --git a/target/linux/brcm2708/patches-4.4/0023-bcm2835-dma-Fix-dreq-not-set-for-slave-transfers.patch b/target/linux/brcm2708/patches-4.4/0023-bcm2835-dma-Fix-dreq-not-set-for-slave-transfers.patch
index 2f512e2aaa..fe6dbcaf2d 100644
--- a/target/linux/brcm2708/patches-4.4/0023-bcm2835-dma-Fix-dreq-not-set-for-slave-transfers.patch
+++ b/target/linux/brcm2708/patches-4.4/0023-bcm2835-dma-Fix-dreq-not-set-for-slave-transfers.patch
@@ -1,7 +1,7 @@
-From 0f3a30eb7ad7e709fdc6447c70bc3f1d5704eb63 Mon Sep 17 00:00:00 2001
+From df03f00c5e21559185b5a61ea5e8238e10959ab1 Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sat, 10 Oct 2015 12:29:18 +0200
-Subject: [PATCH 023/170] bcm2835-dma: Fix dreq not set for slave transfers
+Subject: [PATCH 023/232] bcm2835-dma: Fix dreq not set for slave transfers
Set dreq to slave_id if it is not set like in bcm2708-dmaengine.
---
diff --git a/target/linux/brcm2708/patches-4.4/0024-bcm2835-dma-Limit-cyclic-transfers-on-lite-channels-.patch b/target/linux/brcm2708/patches-4.4/0024-bcm2835-dma-Limit-cyclic-transfers-on-lite-channels-.patch
index 01217c9784..60a0ec9217 100644
--- a/target/linux/brcm2708/patches-4.4/0024-bcm2835-dma-Limit-cyclic-transfers-on-lite-channels-.patch
+++ b/target/linux/brcm2708/patches-4.4/0024-bcm2835-dma-Limit-cyclic-transfers-on-lite-channels-.patch
@@ -1,7 +1,7 @@
-From 305370f7caaecafbabb77b630380dbc0c436bb4c Mon Sep 17 00:00:00 2001
+From 052c2005b6ecedc5abad86632f5781adda310aa7 Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Sun, 11 Oct 2015 12:28:30 +0200
-Subject: [PATCH 024/170] bcm2835-dma: Limit cyclic transfers on lite channels
+Subject: [PATCH 024/232] bcm2835-dma: Limit cyclic transfers on lite channels
to 32k
Transfers larger than 32k cause repeated clicking with I2S soundcards.
diff --git a/target/linux/brcm2708/patches-4.4/0025-bcm2835-Add-support-for-uart1.patch b/target/linux/brcm2708/patches-4.4/0025-bcm2835-Add-support-for-uart1.patch
index 6a5d2cb14a..9dfd26bc4e 100644
--- a/target/linux/brcm2708/patches-4.4/0025-bcm2835-Add-support-for-uart1.patch
+++ b/target/linux/brcm2708/patches-4.4/0025-bcm2835-Add-support-for-uart1.patch
@@ -1,7 +1,7 @@
-From d801c33b7e2fb0d02ac11b95ea92b7d692286ffc Mon Sep 17 00:00:00 2001
+From a72021ae99021409319d552dad744572b20febfb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Sat, 15 Aug 2015 20:50:02 +0200
-Subject: [PATCH 025/170] bcm2835: Add support for uart1
+Subject: [PATCH 025/232] bcm2835: Add support for uart1
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0026-firmware-bcm2835-Add-missing-property-tags.patch b/target/linux/brcm2708/patches-4.4/0026-firmware-bcm2835-Add-missing-property-tags.patch
index bde8c0a6c3..2a7252ace5 100644
--- a/target/linux/brcm2708/patches-4.4/0026-firmware-bcm2835-Add-missing-property-tags.patch
+++ b/target/linux/brcm2708/patches-4.4/0026-firmware-bcm2835-Add-missing-property-tags.patch
@@ -1,7 +1,7 @@
-From 5e90e32b539720ad8c6c8d7ec462378685924f22 Mon Sep 17 00:00:00 2001
+From 4364707caa6d3d9edf84fa8469a04f33e1ba5d76 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Fri, 26 Jun 2015 14:21:20 +0200
-Subject: [PATCH 026/170] firmware: bcm2835: Add missing property tags
+Subject: [PATCH 026/232] firmware: bcm2835: Add missing property tags
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch b/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch
index 7a0f569c2e..83fd1db70c 100644
--- a/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch
+++ b/target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch
@@ -1,7 +1,7 @@
-From 894f124497e95c9af506af2ed7335857f2e71358 Mon Sep 17 00:00:00 2001
+From cd721670ab8c729d0c62e99a1d173c2575b63282 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Sun, 12 May 2013 12:24:19 +0100
-Subject: [PATCH 027/170] Main bcm2708/bcm2709 linux port
+Subject: [PATCH 027/232] Main bcm2708/bcm2709 linux port
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0028-squash-include-ARCH_BCM2708-ARCH_BCM2709.patch b/target/linux/brcm2708/patches-4.4/0028-squash-include-ARCH_BCM2708-ARCH_BCM2709.patch
index c35eb6fbb2..10e1a2f4c7 100644
--- a/target/linux/brcm2708/patches-4.4/0028-squash-include-ARCH_BCM2708-ARCH_BCM2709.patch
+++ b/target/linux/brcm2708/patches-4.4/0028-squash-include-ARCH_BCM2708-ARCH_BCM2709.patch
@@ -1,7 +1,7 @@
-From 74b2c26348d94949561979a9a3ad61adcac74398 Mon Sep 17 00:00:00 2001
+From 812484cc27980e3351360200478e7044de983f40 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 11 Nov 2015 21:01:15 +0000
-Subject: [PATCH 028/170] squash: include ARCH_BCM2708 / ARCH_BCM2709
+Subject: [PATCH 028/232] squash: include ARCH_BCM2708 / ARCH_BCM2709
---
drivers/char/hw_random/Kconfig | 2 +-
diff --git a/target/linux/brcm2708/patches-4.4/0029-Add-dwc_otg-driver.patch b/target/linux/brcm2708/patches-4.4/0029-Add-dwc_otg-driver.patch
index b1e5a49be0..41d79b1710 100644
--- a/target/linux/brcm2708/patches-4.4/0029-Add-dwc_otg-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0029-Add-dwc_otg-driver.patch
@@ -1,7 +1,7 @@
-From a03df8d0f93365689c718f3d1fb62695e9fffe31 Mon Sep 17 00:00:00 2001
+From 7efc2851a46faa1aceda5f6ec255d0e814812ccf Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 1 May 2013 19:46:17 +0100
-Subject: [PATCH 029/170] Add dwc_otg driver
+Subject: [PATCH 029/232] Add dwc_otg driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0030-bcm2708-framebuffer-driver.patch b/target/linux/brcm2708/patches-4.4/0030-bcm2708-framebuffer-driver.patch
index 4dccb5e759..b2983fe57a 100644
--- a/target/linux/brcm2708/patches-4.4/0030-bcm2708-framebuffer-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0030-bcm2708-framebuffer-driver.patch
@@ -1,7 +1,7 @@
-From 845f985818d3d9ba162ab1102da78b0e39eaedba Mon Sep 17 00:00:00 2001
+From d3b7394edae550f295e185be4651ed43529e7042 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 17 Jun 2015 17:06:34 +0100
-Subject: [PATCH 030/170] bcm2708 framebuffer driver
+Subject: [PATCH 030/232] bcm2708 framebuffer driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0031-dmaengine-Add-support-for-BCM2708.patch b/target/linux/brcm2708/patches-4.4/0031-dmaengine-Add-support-for-BCM2708.patch
index 9796cb5f49..687c3eb424 100644
--- a/target/linux/brcm2708/patches-4.4/0031-dmaengine-Add-support-for-BCM2708.patch
+++ b/target/linux/brcm2708/patches-4.4/0031-dmaengine-Add-support-for-BCM2708.patch
@@ -1,7 +1,7 @@
-From a35139d316b78606bfdeb0f10656ba6f1729c83f Mon Sep 17 00:00:00 2001
+From 99b7c3cfd05f5898e96d7c44c5970880f2c0cd16 Mon Sep 17 00:00:00 2001
From: Florian Meier <florian.meier@koalo.de>
Date: Fri, 22 Nov 2013 14:22:53 +0100
-Subject: [PATCH 031/170] dmaengine: Add support for BCM2708
+Subject: [PATCH 031/232] dmaengine: Add support for BCM2708
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0032-Add-blk_pos-parameter-to-mmc-multi_io_quirk-callback.patch b/target/linux/brcm2708/patches-4.4/0032-Add-blk_pos-parameter-to-mmc-multi_io_quirk-callback.patch
deleted file mode 100644
index 46835f15f3..0000000000
--- a/target/linux/brcm2708/patches-4.4/0032-Add-blk_pos-parameter-to-mmc-multi_io_quirk-callback.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 462591cf98f15614620667e93b7f8bc0da6e86da Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 17 Apr 2015 19:30:22 +0100
-Subject: [PATCH 032/170] Add blk_pos parameter to mmc multi_io_quirk callback
-
----
- drivers/mmc/card/block.c | 1 +
- drivers/mmc/host/omap_hsmmc.c | 4 +++-
- drivers/mmc/host/sh_mobile_sdhi.c | 4 +++-
- drivers/mmc/host/tmio_mmc_pio.c | 4 +++-
- include/linux/mmc/host.h | 4 +++-
- 5 files changed, 13 insertions(+), 4 deletions(-)
-
---- a/drivers/mmc/card/block.c
-+++ b/drivers/mmc/card/block.c
-@@ -1518,6 +1518,7 @@ static void mmc_blk_rw_rq_prep(struct mm
- brq->data.blocks = card->host->ops->multi_io_quirk(card,
- (rq_data_dir(req) == READ) ?
- MMC_DATA_READ : MMC_DATA_WRITE,
-+ blk_rq_pos(req),
- brq->data.blocks);
- }
-
---- a/drivers/mmc/host/omap_hsmmc.c
-+++ b/drivers/mmc/host/omap_hsmmc.c
-@@ -1832,7 +1832,9 @@ static void omap_hsmmc_conf_bus_power(st
- }
-
- static int omap_hsmmc_multi_io_quirk(struct mmc_card *card,
-- unsigned int direction, int blk_size)
-+ unsigned int direction,
-+ u32 blk_pos,
-+ int blk_size)
- {
- /* This controller can't do multiblock reads due to hw bugs */
- if (direction == MMC_DATA_READ)
---- a/drivers/mmc/host/sh_mobile_sdhi.c
-+++ b/drivers/mmc/host/sh_mobile_sdhi.c
-@@ -170,7 +170,9 @@ static int sh_mobile_sdhi_write16_hook(s
- }
-
- static int sh_mobile_sdhi_multi_io_quirk(struct mmc_card *card,
-- unsigned int direction, int blk_size)
-+ unsigned int direction,
-+ u32 blk_pos,
-+ int blk_size)
- {
- /*
- * In Renesas controllers, when performing a
---- a/drivers/mmc/host/tmio_mmc_pio.c
-+++ b/drivers/mmc/host/tmio_mmc_pio.c
-@@ -1003,7 +1003,9 @@ static int tmio_mmc_get_ro(struct mmc_ho
- }
-
- static int tmio_multi_io_quirk(struct mmc_card *card,
-- unsigned int direction, int blk_size)
-+ unsigned int direction,
-+ u32 blk_pos,
-+ int blk_size)
- {
- struct tmio_mmc_host *host = mmc_priv(card->host);
-
---- a/include/linux/mmc/host.h
-+++ b/include/linux/mmc/host.h
-@@ -143,7 +143,9 @@ struct mmc_host_ops {
- * I/O. Returns the number of supported blocks for the request.
- */
- int (*multi_io_quirk)(struct mmc_card *card,
-- unsigned int direction, int blk_size);
-+ unsigned int direction,
-+ u32 blk_pos,
-+ int blk_size);
- };
-
- struct mmc_card;
diff --git a/target/linux/brcm2708/patches-4.4/0033-MMC-added-alternative-MMC-driver.patch b/target/linux/brcm2708/patches-4.4/0032-MMC-added-alternative-MMC-driver.patch
index f5996286c8..e74c70c124 100644
--- a/target/linux/brcm2708/patches-4.4/0033-MMC-added-alternative-MMC-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0032-MMC-added-alternative-MMC-driver.patch
@@ -1,7 +1,7 @@
-From 3d0ca77d187abbbde572f4a73b1f864ffb8b5d8a Mon Sep 17 00:00:00 2001
+From 65c8aadfd88010efb2d2a2821fea7aac978b6c78 Mon Sep 17 00:00:00 2001
From: gellert <gellert@raspberrypi.org>
Date: Fri, 15 Aug 2014 16:35:06 +0100
-Subject: [PATCH 033/170] MMC: added alternative MMC driver
+Subject: [PATCH 032/232] MMC: added alternative MMC driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0034-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch b/target/linux/brcm2708/patches-4.4/0033-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch
index c6631e8b4e..46b07df564 100644
--- a/target/linux/brcm2708/patches-4.4/0034-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch
+++ b/target/linux/brcm2708/patches-4.4/0033-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch
@@ -1,7 +1,7 @@
-From 756bf8b8f081be45e16d4d58d3fbe2ca073df298 Mon Sep 17 00:00:00 2001
+From c58bec0d84082837415562c6567396e9e5ba62f7 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Wed, 25 Mar 2015 17:49:47 +0000
-Subject: [PATCH 034/170] Adding bcm2835-sdhost driver, and an overlay to
+Subject: [PATCH 033/232] Adding bcm2835-sdhost driver, and an overlay to
enable it
BCM2835 has two SD card interfaces. This driver uses the other one.
diff --git a/target/linux/brcm2708/patches-4.4/0035-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch b/target/linux/brcm2708/patches-4.4/0034-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch
index 781068f496..f39a2ab186 100644
--- a/target/linux/brcm2708/patches-4.4/0035-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch
+++ b/target/linux/brcm2708/patches-4.4/0034-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch
@@ -1,7 +1,7 @@
-From 8dbb0430386b772f636f474ed45496076d135428 Mon Sep 17 00:00:00 2001
+From 36d8db53953365eecdf56695944e9f9919634de0 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 3 Jul 2013 00:31:47 +0100
-Subject: [PATCH 035/170] cma: Add vc_cma driver to enable use of CMA
+Subject: [PATCH 034/232] cma: Add vc_cma driver to enable use of CMA
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0036-bcm2708-alsa-sound-driver.patch b/target/linux/brcm2708/patches-4.4/0035-bcm2708-alsa-sound-driver.patch
index 936c929e24..2ee0ba3177 100644
--- a/target/linux/brcm2708/patches-4.4/0036-bcm2708-alsa-sound-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0035-bcm2708-alsa-sound-driver.patch
@@ -1,7 +1,7 @@
-From 1e8eb30b259278ea7ab9d14c66d2fab5f580f73c Mon Sep 17 00:00:00 2001
+From 2dd634f97c4fb77d9e81be289a8da29c390a0309 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Mon, 26 Mar 2012 22:15:50 +0100
-Subject: [PATCH 036/170] bcm2708: alsa sound driver
+Subject: [PATCH 035/232] bcm2708: alsa sound driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0037-bcm2708-vchiq-driver.patch b/target/linux/brcm2708/patches-4.4/0036-bcm2708-vchiq-driver.patch
index 61e99d4bc9..4ec48e2192 100644
--- a/target/linux/brcm2708/patches-4.4/0037-bcm2708-vchiq-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0036-bcm2708-vchiq-driver.patch
@@ -1,7 +1,7 @@
-From 20c0f57db9cca65943519bd404b3e346958f4544 Mon Sep 17 00:00:00 2001
+From 112360f76c91c892f1a29825eb2807bbf86ac67d Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Tue, 2 Jul 2013 23:42:01 +0100
-Subject: [PATCH 037/170] bcm2708 vchiq driver
+Subject: [PATCH 036/232] bcm2708 vchiq driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0038-vc_mem-Add-vc_mem-driver.patch b/target/linux/brcm2708/patches-4.4/0037-vc_mem-Add-vc_mem-driver.patch
index c8778b5adb..04593f3e12 100644
--- a/target/linux/brcm2708/patches-4.4/0038-vc_mem-Add-vc_mem-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0037-vc_mem-Add-vc_mem-driver.patch
@@ -1,7 +1,7 @@
-From 2cabfc660c80dd79f24a8323b3913b5060ebf750 Mon Sep 17 00:00:00 2001
+From b0acaf43055bacef7918c835517ff6ea7da26e83 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 17 Jun 2015 16:07:06 +0100
-Subject: [PATCH 038/170] vc_mem: Add vc_mem driver
+Subject: [PATCH 037/232] vc_mem: Add vc_mem driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0039-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch b/target/linux/brcm2708/patches-4.4/0038-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch
index 8940443a0b..d23c7ece7b 100644
--- a/target/linux/brcm2708/patches-4.4/0039-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch
+++ b/target/linux/brcm2708/patches-4.4/0038-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch
@@ -1,7 +1,7 @@
-From 01574b9e0f1086399e7f796cc1dc8fcadabf4a46 Mon Sep 17 00:00:00 2001
+From 5f05accd033e4b032f64717a0276d7174f697919 Mon Sep 17 00:00:00 2001
From: Tim Gover <tgover@broadcom.com>
Date: Tue, 22 Jul 2014 15:41:04 +0100
-Subject: [PATCH 039/170] vcsm: VideoCore shared memory service for BCM2835
+Subject: [PATCH 038/232] vcsm: VideoCore shared memory service for BCM2835
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0040-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch b/target/linux/brcm2708/patches-4.4/0039-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch
index 34806e682b..f4bd017b26 100644
--- a/target/linux/brcm2708/patches-4.4/0040-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch
+++ b/target/linux/brcm2708/patches-4.4/0039-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch
@@ -1,7 +1,7 @@
-From 832077a0f61e44a9259b153f60eb233fa723c2a9 Mon Sep 17 00:00:00 2001
+From 1ee3b49a62efe1416a6b40fb5c6032288f3d2b08 Mon Sep 17 00:00:00 2001
From: Luke Wren <luke@raspberrypi.org>
Date: Fri, 21 Aug 2015 23:14:48 +0100
-Subject: [PATCH 040/170] Add /dev/gpiomem device for rootless user GPIO access
+Subject: [PATCH 039/232] Add /dev/gpiomem device for rootless user GPIO access
Signed-off-by: Luke Wren <luke@raspberrypi.org>
diff --git a/target/linux/brcm2708/patches-4.4/0041-Add-SMI-driver.patch b/target/linux/brcm2708/patches-4.4/0040-Add-SMI-driver.patch
index b2a2b008f0..cc431955e8 100644
--- a/target/linux/brcm2708/patches-4.4/0041-Add-SMI-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0040-Add-SMI-driver.patch
@@ -1,7 +1,7 @@
-From 6609b15c34f26f34b4b49e7726693a1de321078c Mon Sep 17 00:00:00 2001
+From e19c303e7d54d986e0bd3e47107a83e30329c1d0 Mon Sep 17 00:00:00 2001
From: Luke Wren <wren6991@gmail.com>
Date: Sat, 5 Sep 2015 01:14:45 +0100
-Subject: [PATCH 041/170] Add SMI driver
+Subject: [PATCH 040/232] Add SMI driver
Signed-off-by: Luke Wren <wren6991@gmail.com>
---
diff --git a/target/linux/brcm2708/patches-4.4/0042-Add-SMI-NAND-driver.patch b/target/linux/brcm2708/patches-4.4/0041-Add-SMI-NAND-driver.patch
index edf2c93e05..de0c174382 100644
--- a/target/linux/brcm2708/patches-4.4/0042-Add-SMI-NAND-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0041-Add-SMI-NAND-driver.patch
@@ -1,7 +1,7 @@
-From f4d44b2c447c401791645627e88d0ef9830c1239 Mon Sep 17 00:00:00 2001
+From c0fe401b61ae4d002f6fc84438ce69c5917c580a Mon Sep 17 00:00:00 2001
From: Luke Wren <wren6991@gmail.com>
Date: Sat, 5 Sep 2015 01:16:10 +0100
-Subject: [PATCH 042/170] Add SMI NAND driver
+Subject: [PATCH 041/232] Add SMI NAND driver
Signed-off-by: Luke Wren <wren6991@gmail.com>
---
diff --git a/target/linux/brcm2708/patches-4.4/0043-lirc-added-support-for-RaspberryPi-GPIO.patch b/target/linux/brcm2708/patches-4.4/0042-lirc-added-support-for-RaspberryPi-GPIO.patch
index a46d3af154..59f8832448 100644
--- a/target/linux/brcm2708/patches-4.4/0043-lirc-added-support-for-RaspberryPi-GPIO.patch
+++ b/target/linux/brcm2708/patches-4.4/0042-lirc-added-support-for-RaspberryPi-GPIO.patch
@@ -1,7 +1,7 @@
-From 2faad8f6644fa53418c5a7b80da8d5400b72df3f Mon Sep 17 00:00:00 2001
+From 0bc00c67aea43098c7b066e7b123379b260cc7de Mon Sep 17 00:00:00 2001
From: Aron Szabo <aron@aron.ws>
Date: Sat, 16 Jun 2012 12:15:55 +0200
-Subject: [PATCH 043/170] lirc: added support for RaspberryPi GPIO
+Subject: [PATCH 042/232] lirc: added support for RaspberryPi GPIO
lirc_rpi: Use read_current_timer to determine transmitter delay. Thanks to jjmz and others
See: https://github.com/raspberrypi/linux/issues/525
diff --git a/target/linux/brcm2708/patches-4.4/0044-Add-cpufreq-driver.patch b/target/linux/brcm2708/patches-4.4/0043-Add-cpufreq-driver.patch
index f1ec5da74f..26915a10c3 100644
--- a/target/linux/brcm2708/patches-4.4/0044-Add-cpufreq-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0043-Add-cpufreq-driver.patch
@@ -1,7 +1,7 @@
-From 3c7ea37319a4974cbf6b89a84c109a53f4d6b408 Mon Sep 17 00:00:00 2001
+From 007ef35b2cf5d8a0197e81e712b38fb72cebae2e Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 3 Jul 2013 00:49:20 +0100
-Subject: [PATCH 044/170] Add cpufreq driver
+Subject: [PATCH 043/232] Add cpufreq driver
Signed-off-by: popcornmix <popcornmix@gmail.com>
---
diff --git a/target/linux/brcm2708/patches-4.4/0045-Added-hwmon-thermal-driver-for-reporting-core-temper.patch b/target/linux/brcm2708/patches-4.4/0044-Added-hwmon-thermal-driver-for-reporting-core-temper.patch
index 06046a69f5..0834763e24 100644
--- a/target/linux/brcm2708/patches-4.4/0045-Added-hwmon-thermal-driver-for-reporting-core-temper.patch
+++ b/target/linux/brcm2708/patches-4.4/0044-Added-hwmon-thermal-driver-for-reporting-core-temper.patch
@@ -1,7 +1,7 @@
-From 776e87ffc8b137ea465e7b0076e56cd71d9c56d1 Mon Sep 17 00:00:00 2001
+From 9f251fdbaaf3bd895c2901413748679d68a0c644 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Tue, 26 Mar 2013 19:24:24 +0000
-Subject: [PATCH 045/170] Added hwmon/thermal driver for reporting core
+Subject: [PATCH 044/232] Added hwmon/thermal driver for reporting core
temperature. Thanks Dorian
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
diff --git a/target/linux/brcm2708/patches-4.4/0046-Add-Chris-Boot-s-i2c-driver.patch b/target/linux/brcm2708/patches-4.4/0045-Add-Chris-Boot-s-i2c-driver.patch
index 6730ee6fd8..6e5ae8bb27 100644
--- a/target/linux/brcm2708/patches-4.4/0046-Add-Chris-Boot-s-i2c-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0045-Add-Chris-Boot-s-i2c-driver.patch
@@ -1,7 +1,7 @@
-From 72181304010d3aa74cd2b98db592554a541ce4c2 Mon Sep 17 00:00:00 2001
+From 28a4399bf03eeb3ec5b7b56c9445b296e1427665 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 17 Jun 2015 15:44:08 +0100
-Subject: [PATCH 046/170] Add Chris Boot's i2c driver
+Subject: [PATCH 045/232] Add Chris Boot's i2c driver
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0047-char-broadcom-Add-vcio-module.patch b/target/linux/brcm2708/patches-4.4/0046-char-broadcom-Add-vcio-module.patch
index 4ef967b62f..6070610d38 100644
--- a/target/linux/brcm2708/patches-4.4/0047-char-broadcom-Add-vcio-module.patch
+++ b/target/linux/brcm2708/patches-4.4/0046-char-broadcom-Add-vcio-module.patch
@@ -1,7 +1,7 @@
-From abcf04d54ccb3d0897b1f7a95ddf9d9ccf63dc76 Mon Sep 17 00:00:00 2001
+From 75804edaed6c45d813dcee866d39445130d82539 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Fri, 26 Jun 2015 14:27:06 +0200
-Subject: [PATCH 047/170] char: broadcom: Add vcio module
+Subject: [PATCH 046/232] char: broadcom: Add vcio module
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0048-firmware-bcm2835-Support-ARCH_BCM270x.patch b/target/linux/brcm2708/patches-4.4/0047-firmware-bcm2835-Support-ARCH_BCM270x.patch
index 93c24d893e..243803a9cd 100644
--- a/target/linux/brcm2708/patches-4.4/0048-firmware-bcm2835-Support-ARCH_BCM270x.patch
+++ b/target/linux/brcm2708/patches-4.4/0047-firmware-bcm2835-Support-ARCH_BCM270x.patch
@@ -1,7 +1,7 @@
-From a205e934b63b6bf3f5f74bc39974ec6ff09df596 Mon Sep 17 00:00:00 2001
+From 80b7c5e2cc3d633b3d3a1afbdb537e2ccfe906c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Fri, 26 Jun 2015 14:25:01 +0200
-Subject: [PATCH 048/170] firmware: bcm2835: Support ARCH_BCM270x
+Subject: [PATCH 047/232] firmware: bcm2835: Support ARCH_BCM270x
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0049-bcm2835-add-v4l2-camera-device.patch b/target/linux/brcm2708/patches-4.4/0048-bcm2835-add-v4l2-camera-device.patch
index a464881a16..17515c70b4 100644
--- a/target/linux/brcm2708/patches-4.4/0049-bcm2835-add-v4l2-camera-device.patch
+++ b/target/linux/brcm2708/patches-4.4/0048-bcm2835-add-v4l2-camera-device.patch
@@ -1,7 +1,7 @@
-From 4d74ee3d433df319ae3fc36bd16fd96b4bbff865 Mon Sep 17 00:00:00 2001
+From e15fddd4332bd3a762d0feef48ff2b5e3df10af0 Mon Sep 17 00:00:00 2001
From: Vincent Sanders <vincent.sanders@collabora.co.uk>
Date: Wed, 30 Jan 2013 12:45:18 +0000
-Subject: [PATCH 049/170] bcm2835: add v4l2 camera device
+Subject: [PATCH 048/232] bcm2835: add v4l2 camera device
- Supports raw YUV capture, preview, JPEG and H264.
- Uses videobuf2 for data transfer, using dma_buf.
diff --git a/target/linux/brcm2708/patches-4.4/0050-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch b/target/linux/brcm2708/patches-4.4/0049-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch
index 30cdfe9b0f..60201fe9e5 100644
--- a/target/linux/brcm2708/patches-4.4/0050-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch
+++ b/target/linux/brcm2708/patches-4.4/0049-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch
@@ -1,7 +1,7 @@
-From 03435989bbadbd333a810644c8246dd7eb0bad07 Mon Sep 17 00:00:00 2001
+From 91e833ab0b220bb0bb810bb9605b0a03cd76baa8 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 11 May 2015 09:00:42 +0100
-Subject: [PATCH 050/170] scripts: Add mkknlimg and knlinfo scripts from tools
+Subject: [PATCH 049/232] scripts: Add mkknlimg and knlinfo scripts from tools
repo
The Raspberry Pi firmware looks for a trailer on the kernel image to
diff --git a/target/linux/brcm2708/patches-4.4/0051-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch b/target/linux/brcm2708/patches-4.4/0050-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch
index 6103352b51..ab07248efe 100644
--- a/target/linux/brcm2708/patches-4.4/0051-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch
+++ b/target/linux/brcm2708/patches-4.4/0050-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch
@@ -1,7 +1,7 @@
-From a251bf4a37d8fd468bc3ff853bcebe8ee452a31e Mon Sep 17 00:00:00 2001
+From 918b9e451bbaebb775725a292fd3b6e3d4cf804f Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 5 Dec 2014 17:26:26 +0000
-Subject: [PATCH 051/170] fdt: Add support for the CONFIG_CMDLINE_EXTEND option
+Subject: [PATCH 050/232] fdt: Add support for the CONFIG_CMDLINE_EXTEND option
---
drivers/of/fdt.c | 29 ++++++++++++++++++++++++-----
diff --git a/target/linux/brcm2708/patches-4.4/0052-BCM2708-Add-core-Device-Tree-support.patch b/target/linux/brcm2708/patches-4.4/0051-BCM2708-Add-core-Device-Tree-support.patch
index 84d2c7ba6f..1ff1754877 100644
--- a/target/linux/brcm2708/patches-4.4/0052-BCM2708-Add-core-Device-Tree-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0051-BCM2708-Add-core-Device-Tree-support.patch
@@ -1,7 +1,7 @@
-From 0112c4ce9db6cdc53af67dc7634966c3594de7ff Mon Sep 17 00:00:00 2001
+From d1fdaf68df66e82bea1081b490ebeea414d69203 Mon Sep 17 00:00:00 2001
From: notro <notro@tronnes.org>
Date: Wed, 9 Jul 2014 14:46:08 +0200
-Subject: [PATCH 052/170] BCM2708: Add core Device Tree support
+Subject: [PATCH 051/232] BCM2708: Add core Device Tree support
Add the bare minimum needed to boot BCM2708 from a Device Tree.
@@ -1622,7 +1622,7 @@ BCM270X_DT: Use clk_core for I2C interfaces
+ (default "off")
+
+ random Set to "on" to enable the hardware random
-+ number generator (default "off")
++ number generator (default "on")
+
+ uart0 Set to "off" to disable uart0 (default "on")
+
diff --git a/target/linux/brcm2708/patches-4.4/0053-bcm2835-Match-with-BCM2708-Device-Trees.patch b/target/linux/brcm2708/patches-4.4/0052-bcm2835-Match-with-BCM2708-Device-Trees.patch
index 23654791a8..a7966df9d3 100644
--- a/target/linux/brcm2708/patches-4.4/0053-bcm2835-Match-with-BCM2708-Device-Trees.patch
+++ b/target/linux/brcm2708/patches-4.4/0052-bcm2835-Match-with-BCM2708-Device-Trees.patch
@@ -1,7 +1,7 @@
-From 23eabf2220f0f748df3e88a35e55a82c53242b4a Mon Sep 17 00:00:00 2001
+From da7cdef4979282624e0e7527c3c8334a59f39676 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Sat, 15 Aug 2015 20:47:07 +0200
-Subject: [PATCH 053/170] bcm2835: Match with BCM2708 Device Trees
+Subject: [PATCH 052/232] bcm2835: Match with BCM2708 Device Trees
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0054-fbdev-add-FBIOCOPYAREA-ioctl.patch b/target/linux/brcm2708/patches-4.4/0053-fbdev-add-FBIOCOPYAREA-ioctl.patch
index f4808874fb..f6416e4766 100644
--- a/target/linux/brcm2708/patches-4.4/0054-fbdev-add-FBIOCOPYAREA-ioctl.patch
+++ b/target/linux/brcm2708/patches-4.4/0053-fbdev-add-FBIOCOPYAREA-ioctl.patch
@@ -1,7 +1,7 @@
-From f978fb3b816681159b6cc97104954dea31488add Mon Sep 17 00:00:00 2001
+From b28366cb5b514e5c59586f9a5509d3afff5337d5 Mon Sep 17 00:00:00 2001
From: Siarhei Siamashka <siarhei.siamashka@gmail.com>
Date: Mon, 17 Jun 2013 13:32:11 +0300
-Subject: [PATCH 054/170] fbdev: add FBIOCOPYAREA ioctl
+Subject: [PATCH 053/232] fbdev: add FBIOCOPYAREA ioctl
Based on the patch authored by Ali Gholami Rudi at
https://lkml.org/lkml/2009/7/13/153
diff --git a/target/linux/brcm2708/patches-4.4/0058-Speed-up-console-framebuffer-imageblit-function.patch b/target/linux/brcm2708/patches-4.4/0057-Speed-up-console-framebuffer-imageblit-function.patch
index 5d5a561a06..b2e9803e6b 100644
--- a/target/linux/brcm2708/patches-4.4/0058-Speed-up-console-framebuffer-imageblit-function.patch
+++ b/target/linux/brcm2708/patches-4.4/0057-Speed-up-console-framebuffer-imageblit-function.patch
@@ -1,7 +1,7 @@
-From 53bcd6e5a43a353508c7aff48abcdcaae1b35ca8 Mon Sep 17 00:00:00 2001
+From dbf03b37592b79d891cb796fda13d8495a6a5234 Mon Sep 17 00:00:00 2001
From: Harm Hanemaaijer <fgenfb@yahoo.com>
Date: Thu, 20 Jun 2013 20:21:39 +0200
-Subject: [PATCH 058/170] Speed up console framebuffer imageblit function
+Subject: [PATCH 057/232] Speed up console framebuffer imageblit function
Especially on platforms with a slower CPU but a relatively high
framebuffer fill bandwidth, like current ARM devices, the existing
diff --git a/target/linux/brcm2708/patches-4.4/0059-Allow-mac-address-to-be-set-in-smsc95xx.patch b/target/linux/brcm2708/patches-4.4/0058-Allow-mac-address-to-be-set-in-smsc95xx.patch
index 03a972c8f4..69be30cfac 100644
--- a/target/linux/brcm2708/patches-4.4/0059-Allow-mac-address-to-be-set-in-smsc95xx.patch
+++ b/target/linux/brcm2708/patches-4.4/0058-Allow-mac-address-to-be-set-in-smsc95xx.patch
@@ -1,7 +1,7 @@
-From 6c0a9150827dc58fac38c8e787c050626325842e Mon Sep 17 00:00:00 2001
+From cf63ba6ba21e8a1d62b1eb4917af42d6bcfa4445 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Tue, 26 Mar 2013 17:26:38 +0000
-Subject: [PATCH 059/170] Allow mac address to be set in smsc95xx
+Subject: [PATCH 058/232] Allow mac address to be set in smsc95xx
Signed-off-by: popcornmix <popcornmix@gmail.com>
---
diff --git a/target/linux/brcm2708/patches-4.4/0060-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch b/target/linux/brcm2708/patches-4.4/0059-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch
index eb44deb85e..8cf13da6f3 100644
--- a/target/linux/brcm2708/patches-4.4/0060-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch
+++ b/target/linux/brcm2708/patches-4.4/0059-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch
@@ -1,7 +1,7 @@
-From e172d31b8402f13aed5679cd7023f0c0935aab05 Mon Sep 17 00:00:00 2001
+From 20f0537c77ac3ef4e446bd0013c37ddd3af3936b Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 8 May 2013 11:46:50 +0100
-Subject: [PATCH 060/170] enabling the realtime clock 1-wire chip DS1307 and
+Subject: [PATCH 059/232] enabling the realtime clock 1-wire chip DS1307 and
1-wire on GPIO4 (as a module)
1-wire: Add support for configuring pin for w1-gpio kernel module
diff --git a/target/linux/brcm2708/patches-4.4/0061-Added-Device-IDs-for-August-DVB-T-205.patch b/target/linux/brcm2708/patches-4.4/0060-Added-Device-IDs-for-August-DVB-T-205.patch
index 12645bf311..a57f6e0dab 100644
--- a/target/linux/brcm2708/patches-4.4/0061-Added-Device-IDs-for-August-DVB-T-205.patch
+++ b/target/linux/brcm2708/patches-4.4/0060-Added-Device-IDs-for-August-DVB-T-205.patch
@@ -1,7 +1,7 @@
-From 78c49b30c0dcc8b73f383f71b89719798fc89b72 Mon Sep 17 00:00:00 2001
+From fbd8454a22771ed12e1905a52934a6a871bc492e Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 3 Jul 2013 00:54:08 +0100
-Subject: [PATCH 061/170] Added Device IDs for August DVB-T 205
+Subject: [PATCH 060/232] Added Device IDs for August DVB-T 205
---
drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 4 ++++
diff --git a/target/linux/brcm2708/patches-4.4/0062-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch b/target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
index 52704d58cb..afc9b6be8e 100644
--- a/target/linux/brcm2708/patches-4.4/0062-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
+++ b/target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
@@ -1,7 +1,7 @@
-From d0f48fe7aab3e4036fd55b491a9be94ea24f377d Mon Sep 17 00:00:00 2001
+From 6f8e2aeb77e4437eab3a46d74a1a2b9533812c81 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 18 Dec 2013 22:16:19 +0000
-Subject: [PATCH 062/170] config: Enable CONFIG_MEMCG, but leave it disabled
+Subject: [PATCH 061/232] config: Enable CONFIG_MEMCG, but leave it disabled
(due to memory cost). Enable with cgroup_enable=memory.
---
diff --git a/target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-PCM5102A-codec.patch b/target/linux/brcm2708/patches-4.4/0062-ASoC-Add-support-for-PCM5102A-codec.patch
index 2fcca63e11..8d56af7c7a 100644
--- a/target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-PCM5102A-codec.patch
+++ b/target/linux/brcm2708/patches-4.4/0062-ASoC-Add-support-for-PCM5102A-codec.patch
@@ -1,7 +1,7 @@
-From 8d35b3a72d3580ad6f5bc5835bfe13b00cce6086 Mon Sep 17 00:00:00 2001
+From b507ac15b579d88a09bf915f2f3ca8de7f1e4bf7 Mon Sep 17 00:00:00 2001
From: Florian Meier <florian.meier@koalo.de>
Date: Fri, 22 Nov 2013 14:59:51 +0100
-Subject: [PATCH 063/170] ASoC: Add support for PCM5102A codec
+Subject: [PATCH 062/232] ASoC: Add support for PCM5102A codec
Some definitions to support the PCM5102A codec
by Texas Instruments.
diff --git a/target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-HifiBerry-DAC.patch b/target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-HifiBerry-DAC.patch
index 51c1fb1da8..5dc895ead8 100644
--- a/target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-HifiBerry-DAC.patch
+++ b/target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-HifiBerry-DAC.patch
@@ -1,7 +1,7 @@
-From 9ced0e86593de2214ff8a81f71c802d7e7301b05 Mon Sep 17 00:00:00 2001
+From 9f5e88b201753c68a90fa45a269aa82febc58fc6 Mon Sep 17 00:00:00 2001
From: Florian Meier <florian.meier@koalo.de>
Date: Fri, 22 Nov 2013 19:19:08 +0100
-Subject: [PATCH 064/170] ASoC: Add support for HifiBerry DAC
+Subject: [PATCH 063/232] ASoC: Add support for HifiBerry DAC
This adds a machine driver for the HifiBerry DAC.
It is a sound card that can
diff --git a/target/linux/brcm2708/patches-4.4/0065-ASoC-Add-support-for-Rpi-DAC.patch b/target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-Rpi-DAC.patch
index a2d8e5628c..5c212ce6a0 100644
--- a/target/linux/brcm2708/patches-4.4/0065-ASoC-Add-support-for-Rpi-DAC.patch
+++ b/target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-Rpi-DAC.patch
@@ -1,7 +1,7 @@
-From f16a654f57b024d44fe58d62b660e01de6a7811a Mon Sep 17 00:00:00 2001
+From 95bf71f0e826b97bad98f350e2fee6ba515a38cf Mon Sep 17 00:00:00 2001
From: Florian Meier <florian.meier@koalo.de>
Date: Fri, 22 Nov 2013 19:21:34 +0100
-Subject: [PATCH 065/170] ASoC: Add support for Rpi-DAC
+Subject: [PATCH 064/232] ASoC: Add support for Rpi-DAC
---
sound/soc/bcm/Kconfig | 7 +++
diff --git a/target/linux/brcm2708/patches-4.4/0066-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch b/target/linux/brcm2708/patches-4.4/0065-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch
index 3404a2f08f..b668f43750 100644
--- a/target/linux/brcm2708/patches-4.4/0066-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch
+++ b/target/linux/brcm2708/patches-4.4/0065-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch
@@ -1,7 +1,7 @@
-From dbdeca565b0850da182d3bd0b3ed41f667ca8a45 Mon Sep 17 00:00:00 2001
+From 455d188d2a22ced675219587856c0dc66efc7256 Mon Sep 17 00:00:00 2001
From: Daniel Matuschek <info@crazy-audio.com>
Date: Wed, 15 Jan 2014 21:41:23 +0100
-Subject: [PATCH 066/170] ASoC: wm8804: Implement MCLK configuration options,
+Subject: [PATCH 065/232] ASoC: wm8804: Implement MCLK configuration options,
add 32bit support WM8804 can run with PLL frequencies of 256xfs and 128xfs
for most sample rates. At 192kHz only 128xfs is supported. The existing
driver selects 128xfs automatically for some lower samples rates. By using an
diff --git a/target/linux/brcm2708/patches-4.4/0067-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch b/target/linux/brcm2708/patches-4.4/0066-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch
index 50e1e1957c..913a7c66a6 100644
--- a/target/linux/brcm2708/patches-4.4/0067-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch
+++ b/target/linux/brcm2708/patches-4.4/0066-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch
@@ -1,7 +1,7 @@
-From 0c2e64d3eda229c2f52ce6ed9d0b1c1572dd9b19 Mon Sep 17 00:00:00 2001
+From 442de6ae737fbd27bcf2fde8be857beccc59fd1f Mon Sep 17 00:00:00 2001
From: Daniel Matuschek <info@crazy-audio.com>
Date: Wed, 15 Jan 2014 21:42:08 +0100
-Subject: [PATCH 067/170] ASoC: BCM:Add support for HiFiBerry Digi. Driver is
+Subject: [PATCH 066/232] ASoC: BCM:Add support for HiFiBerry Digi. Driver is
based on the patched WM8804 driver.
Signed-off-by: Daniel Matuschek <daniel@matuschek.net>
diff --git a/target/linux/brcm2708/patches-4.4/0068-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch b/target/linux/brcm2708/patches-4.4/0067-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch
index cc82f7523f..b9f6ea4205 100644
--- a/target/linux/brcm2708/patches-4.4/0068-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch
+++ b/target/linux/brcm2708/patches-4.4/0067-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch
@@ -1,7 +1,7 @@
-From f2789622ff7c1297e28f38bb198f5fd24b4602ef Mon Sep 17 00:00:00 2001
+From 836e7d5d46f17115b728986e3077c78c211a7678 Mon Sep 17 00:00:00 2001
From: Daniel Matuschek <info@crazy-audio.com>
Date: Thu, 16 Jan 2014 07:36:35 +0100
-Subject: [PATCH 068/170] ASoC: wm8804: Set idle_bias_off to false Idle bias
+Subject: [PATCH 067/232] ASoC: wm8804: Set idle_bias_off to false Idle bias
has been change to remove warning on driver startup
Signed-off-by: Daniel Matuschek <daniel@matuschek.net>
diff --git a/target/linux/brcm2708/patches-4.4/0069-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch b/target/linux/brcm2708/patches-4.4/0068-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch
index 1c2e4e99a5..d16dcc4268 100644
--- a/target/linux/brcm2708/patches-4.4/0069-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch
+++ b/target/linux/brcm2708/patches-4.4/0068-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch
@@ -1,7 +1,7 @@
-From 80fa31f923b4967bc86be20c5af780ef284fc972 Mon Sep 17 00:00:00 2001
+From 7ab81054051a41288e4aa2bb21d4740e0d78a4ac Mon Sep 17 00:00:00 2001
From: Gordon Garrity <gordon@iqaudio.com>
Date: Sat, 8 Mar 2014 16:56:57 +0000
-Subject: [PATCH 069/170] Add IQaudIO Sound Card support for Raspberry Pi
+Subject: [PATCH 068/232] Add IQaudIO Sound Card support for Raspberry Pi
Set a limit of 0dB on Digital Volume Control
diff --git a/target/linux/brcm2708/patches-4.4/0070-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch b/target/linux/brcm2708/patches-4.4/0069-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch
index 471732ce92..e269150f23 100644
--- a/target/linux/brcm2708/patches-4.4/0070-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch
+++ b/target/linux/brcm2708/patches-4.4/0069-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch
@@ -1,7 +1,7 @@
-From b15f112ddaf2cd20a8f999ac823ddb51d7d513b9 Mon Sep 17 00:00:00 2001
+From efb984b47e685c966a3b55874de2c1fb5b0b1140 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Mon, 14 Jul 2014 22:02:09 +0100
-Subject: [PATCH 070/170] hid: Reduce default mouse polling interval to 60Hz
+Subject: [PATCH 069/232] hid: Reduce default mouse polling interval to 60Hz
Reduces overhead when using X
---
diff --git a/target/linux/brcm2708/patches-4.4/0071-Added-support-for-HiFiBerry-DAC.patch b/target/linux/brcm2708/patches-4.4/0070-Added-support-for-HiFiBerry-DAC.patch
index c38b623926..9a0e2033a9 100644
--- a/target/linux/brcm2708/patches-4.4/0071-Added-support-for-HiFiBerry-DAC.patch
+++ b/target/linux/brcm2708/patches-4.4/0070-Added-support-for-HiFiBerry-DAC.patch
@@ -1,7 +1,7 @@
-From debd3d30b1127328b5a1e444bd1550cb45c50362 Mon Sep 17 00:00:00 2001
+From 72a92f2e40881dcb46e50021c5c5fe2c20d8c461 Mon Sep 17 00:00:00 2001
From: Daniel Matuschek <info@crazy-audio.com>
Date: Mon, 4 Aug 2014 10:06:56 +0200
-Subject: [PATCH 071/170] Added support for HiFiBerry DAC+
+Subject: [PATCH 070/232] Added support for HiFiBerry DAC+
The driver is based on the HiFiBerry DAC driver. However HiFiBerry DAC+ uses
a different codec chip (PCM5122), therefore a new driver is necessary.
diff --git a/target/linux/brcm2708/patches-4.4/0072-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch b/target/linux/brcm2708/patches-4.4/0071-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch
index b6e6fe9f9b..b45c47c172 100644
--- a/target/linux/brcm2708/patches-4.4/0072-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch
+++ b/target/linux/brcm2708/patches-4.4/0071-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch
@@ -1,7 +1,7 @@
-From 9c6f0b1812313d39afeefd700b7f9df9a82a47cd Mon Sep 17 00:00:00 2001
+From f25572414689152e6208e5ca921185b1db536b24 Mon Sep 17 00:00:00 2001
From: Daniel Matuschek <info@crazy-audio.com>
Date: Mon, 4 Aug 2014 11:09:58 +0200
-Subject: [PATCH 072/170] Added driver for HiFiBerry Amp amplifier add-on board
+Subject: [PATCH 071/232] Added driver for HiFiBerry Amp amplifier add-on board
The driver contains a low-level hardware driver for the TAS5713 and the
drivers for the Raspberry Pi I2S subsystem.
diff --git a/target/linux/brcm2708/patches-4.4/0073-Update-ds1307-driver-for-device-tree-support.patch b/target/linux/brcm2708/patches-4.4/0072-Update-ds1307-driver-for-device-tree-support.patch
index 73afc0975b..9499635520 100644
--- a/target/linux/brcm2708/patches-4.4/0073-Update-ds1307-driver-for-device-tree-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0072-Update-ds1307-driver-for-device-tree-support.patch
@@ -1,7 +1,7 @@
-From 21d08f232ffc350b2930f761f3da26f9867b1d4d Mon Sep 17 00:00:00 2001
+From d0bfff366e12c9b401ac7eafabab7337e82549ea Mon Sep 17 00:00:00 2001
From: Ryan Coe <bluemrp9@gmail.com>
Date: Sat, 31 Jan 2015 18:25:49 -0700
-Subject: [PATCH 073/170] Update ds1307 driver for device-tree support
+Subject: [PATCH 072/232] Update ds1307 driver for device-tree support
Signed-off-by: Ryan Coe <bluemrp9@gmail.com>
---
diff --git a/target/linux/brcm2708/patches-4.4/0074-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch b/target/linux/brcm2708/patches-4.4/0073-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch
index 2c5fe9907f..3a26865941 100644
--- a/target/linux/brcm2708/patches-4.4/0074-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch
+++ b/target/linux/brcm2708/patches-4.4/0073-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch
@@ -1,7 +1,7 @@
-From a2b52a3af1314e2b691d9518afb3051193758671 Mon Sep 17 00:00:00 2001
+From 96aac93fdea2caa77d4746aa001c2d792b314112 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 6 Feb 2015 13:50:57 +0000
-Subject: [PATCH 074/170] BCM270x_DT: Add pwr_led, and the required "input"
+Subject: [PATCH 073/232] BCM270x_DT: Add pwr_led, and the required "input"
trigger
The "input" trigger makes the associated GPIO an input. This is to support
diff --git a/target/linux/brcm2708/patches-4.4/0075-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch b/target/linux/brcm2708/patches-4.4/0074-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch
index 10ef683cbb..4b7ae74473 100644
--- a/target/linux/brcm2708/patches-4.4/0075-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch
+++ b/target/linux/brcm2708/patches-4.4/0074-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch
@@ -1,7 +1,7 @@
-From 12ad9b7c670220b1b8b80ebf507651d106cb28c0 Mon Sep 17 00:00:00 2001
+From d3a1dcc1ce28233707c395b11cd2403ba22aebda Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 27 Feb 2015 15:10:24 +0000
-Subject: [PATCH 075/170] enc28j60: Add device tree compatible string and an
+Subject: [PATCH 074/232] enc28j60: Add device tree compatible string and an
overlay
---
diff --git a/target/linux/brcm2708/patches-4.4/0076-Add-driver-for-rpi-proto.patch b/target/linux/brcm2708/patches-4.4/0075-Add-driver-for-rpi-proto.patch
index deef6b6ba7..f99b5e9c7c 100644
--- a/target/linux/brcm2708/patches-4.4/0076-Add-driver-for-rpi-proto.patch
+++ b/target/linux/brcm2708/patches-4.4/0075-Add-driver-for-rpi-proto.patch
@@ -1,7 +1,7 @@
-From 660d2fba0483aafc4a1ce678016620c0871bb759 Mon Sep 17 00:00:00 2001
+From a058f705de89cb54126d9bf8d099acb7ececb6e7 Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbrodkorb@conet.de>
Date: Wed, 25 Mar 2015 09:26:17 +0100
-Subject: [PATCH 076/170] Add driver for rpi-proto
+Subject: [PATCH 075/232] Add driver for rpi-proto
Forward port of 3.10.x driver from https://github.com/koalo
We are using a custom board and would like to use rpi 3.18.x
diff --git a/target/linux/brcm2708/patches-4.4/0077-config-Add-default-configs.patch b/target/linux/brcm2708/patches-4.4/0076-config-Add-default-configs.patch
index ffd1a0bfe4..ab218d42b2 100644
--- a/target/linux/brcm2708/patches-4.4/0077-config-Add-default-configs.patch
+++ b/target/linux/brcm2708/patches-4.4/0076-config-Add-default-configs.patch
@@ -1,7 +1,7 @@
-From e2af169e60b4ebd710e733996d57ad86264bae27 Mon Sep 17 00:00:00 2001
+From 78cf26e64b4ce0c4567829c42990a89ab59a6553 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Mon, 13 Apr 2015 17:16:29 +0100
-Subject: [PATCH 077/170] config: Add default configs
+Subject: [PATCH 076/232] config: Add default configs
---
arch/arm/configs/bcm2709_defconfig | 1254 +++++++++++++++++++++++++++++++++++
diff --git a/target/linux/brcm2708/patches-4.4/0078-bcm2835-bcm2835_defconfig.patch b/target/linux/brcm2708/patches-4.4/0077-bcm2835-bcm2835_defconfig.patch
index d4a60cd6ca..be5e02334e 100644
--- a/target/linux/brcm2708/patches-4.4/0078-bcm2835-bcm2835_defconfig.patch
+++ b/target/linux/brcm2708/patches-4.4/0077-bcm2835-bcm2835_defconfig.patch
@@ -1,7 +1,7 @@
-From e5292198fc83805a9f4751fddeb802f69c0270f0 Mon Sep 17 00:00:00 2001
+From 0ee42e134a9a28fd825e1390634113108c0eebc0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Wed, 29 Apr 2015 17:24:02 +0200
-Subject: [PATCH 078/170] bcm2835: bcm2835_defconfig
+Subject: [PATCH 077/232] bcm2835: bcm2835_defconfig
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/target/linux/brcm2708/patches-4.4/0079-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch b/target/linux/brcm2708/patches-4.4/0078-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch
index 0b3f67848d..9a1445da28 100644
--- a/target/linux/brcm2708/patches-4.4/0079-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch
+++ b/target/linux/brcm2708/patches-4.4/0078-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch
@@ -1,7 +1,7 @@
-From 6fb12ee15eb9b0f5b6fea66c861a9db8ec6671ed Mon Sep 17 00:00:00 2001
+From d46fbf49354f8c82cc216d56d9addad113703c50 Mon Sep 17 00:00:00 2001
From: Gordon Hollingworth <gordon@raspberrypi.org>
Date: Tue, 12 May 2015 14:47:56 +0100
-Subject: [PATCH 079/170] rpi-ft5406: Add touchscreen driver for pi LCD display
+Subject: [PATCH 078/232] rpi-ft5406: Add touchscreen driver for pi LCD display
Fix driver detection failure Check that the buffer response is non-zero meaning the touchscreen was detected
diff --git a/target/linux/brcm2708/patches-4.4/0080-Improve-__copy_to_user-and-__copy_from_user-performa.patch b/target/linux/brcm2708/patches-4.4/0079-Improve-__copy_to_user-and-__copy_from_user-performa.patch
index d09b5ae86f..ea6aac7fad 100644
--- a/target/linux/brcm2708/patches-4.4/0080-Improve-__copy_to_user-and-__copy_from_user-performa.patch
+++ b/target/linux/brcm2708/patches-4.4/0079-Improve-__copy_to_user-and-__copy_from_user-performa.patch
@@ -1,7 +1,7 @@
-From b57a6269e03fe055f78ab50add6e2c68d43254e2 Mon Sep 17 00:00:00 2001
+From 4514b02d95de8be6d6298ee20a5204815cf669d0 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 13 Oct 2014 11:47:53 +0100
-Subject: [PATCH 080/170] Improve __copy_to_user and __copy_from_user
+Subject: [PATCH 079/232] Improve __copy_to_user and __copy_from_user
performance
Provide a __copy_from_user that uses memcpy. On BCM2708, use
diff --git a/target/linux/brcm2708/patches-4.4/0081-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch b/target/linux/brcm2708/patches-4.4/0080-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch
index 804813246d..b8edcc8596 100644
--- a/target/linux/brcm2708/patches-4.4/0081-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch
+++ b/target/linux/brcm2708/patches-4.4/0080-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch
@@ -1,7 +1,7 @@
-From 44d43099a94c8b2db818c80c67789ef5f9857b81 Mon Sep 17 00:00:00 2001
+From 11e9f3f8268e79dd28450eacffe1d7484f2a7361 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 25 Jun 2015 12:16:11 +0100
-Subject: [PATCH 081/170] gpio-poweroff: Allow it to work on Raspberry Pi
+Subject: [PATCH 080/232] gpio-poweroff: Allow it to work on Raspberry Pi
The Raspberry Pi firmware manages the power-down and reboot
process. To do this it installs a pm_power_off handler, causing
diff --git a/target/linux/brcm2708/patches-4.4/0082-spidev-Add-spidev-compatible-string-to-silence-warni.patch b/target/linux/brcm2708/patches-4.4/0081-spidev-Add-spidev-compatible-string-to-silence-warni.patch
index e27e143c97..d62a0d2461 100644
--- a/target/linux/brcm2708/patches-4.4/0082-spidev-Add-spidev-compatible-string-to-silence-warni.patch
+++ b/target/linux/brcm2708/patches-4.4/0081-spidev-Add-spidev-compatible-string-to-silence-warni.patch
@@ -1,7 +1,7 @@
-From 5b2d8bca046bd6f1a426e9205f194ece5b95e300 Mon Sep 17 00:00:00 2001
+From 958d09ad7f70ff5dd38a6c60b9e3f103e125168a Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 14 Jul 2015 10:26:09 +0100
-Subject: [PATCH 082/170] spidev: Add "spidev" compatible string to silence
+Subject: [PATCH 081/232] spidev: Add "spidev" compatible string to silence
warning
See: https://github.com/raspberrypi/linux/issues/1054
diff --git a/target/linux/brcm2708/patches-4.4/0083-scripts-dtc-Add-overlay-support.patch b/target/linux/brcm2708/patches-4.4/0082-scripts-dtc-Add-overlay-support.patch
index 404f10f4cf..4f882e20f6 100644
--- a/target/linux/brcm2708/patches-4.4/0083-scripts-dtc-Add-overlay-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0082-scripts-dtc-Add-overlay-support.patch
@@ -1,7 +1,7 @@
-From 534c337ea28bee34f886a1d1e00d281365c94efa Mon Sep 17 00:00:00 2001
+From 462447ecf49eb6dd6d77f3d21b272dd4fa68bee9 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 14 Jul 2015 17:00:18 +0100
-Subject: [PATCH 083/170] scripts/dtc: Add overlay support
+Subject: [PATCH 082/232] scripts/dtc: Add overlay support
---
scripts/dtc/checks.c | 119 ++-
diff --git a/target/linux/brcm2708/patches-4.4/0084-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch b/target/linux/brcm2708/patches-4.4/0083-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch
index 9e41391993..d36d569f9a 100644
--- a/target/linux/brcm2708/patches-4.4/0084-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0083-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch
@@ -1,7 +1,7 @@
-From b065c580329ecb7c7e77bb7019c6059d7db83398 Mon Sep 17 00:00:00 2001
+From 98ec469c223432d4f40317023a04cfa71f661c10 Mon Sep 17 00:00:00 2001
From: Phil Elwell <pelwell@users.noreply.github.com>
Date: Tue, 14 Jul 2015 14:32:47 +0100
-Subject: [PATCH 084/170] mfd: Add Raspberry Pi Sense HAT core driver
+Subject: [PATCH 083/232] mfd: Add Raspberry Pi Sense HAT core driver
---
drivers/input/joystick/Kconfig | 8 +
diff --git a/target/linux/brcm2708/patches-4.4/0085-RaspiDAC3-support.patch b/target/linux/brcm2708/patches-4.4/0084-RaspiDAC3-support.patch
index f161a53394..3da75d31ea 100644
--- a/target/linux/brcm2708/patches-4.4/0085-RaspiDAC3-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0084-RaspiDAC3-support.patch
@@ -1,7 +1,7 @@
-From c86a74aaff9bc42b3cb04881b3aaf7f822edda04 Mon Sep 17 00:00:00 2001
+From 5133d16d705f9ccf7f558ebc43861e1800512969 Mon Sep 17 00:00:00 2001
From: Jan Grulich <jan@grulich.eu>
Date: Mon, 24 Aug 2015 16:03:47 +0100
-Subject: [PATCH 085/170] RaspiDAC3 support
+Subject: [PATCH 084/232] RaspiDAC3 support
Signed-off-by: Jan Grulich <jan@grulich.eu>
diff --git a/target/linux/brcm2708/patches-4.4/0086-tpa6130a2-Add-headphone-switch-control.patch b/target/linux/brcm2708/patches-4.4/0085-tpa6130a2-Add-headphone-switch-control.patch
index 0daaee22c6..34ed178948 100644
--- a/target/linux/brcm2708/patches-4.4/0086-tpa6130a2-Add-headphone-switch-control.patch
+++ b/target/linux/brcm2708/patches-4.4/0085-tpa6130a2-Add-headphone-switch-control.patch
@@ -1,7 +1,7 @@
-From 2d340e2fbbc9f4735b798601a43ae9f0f4cc5742 Mon Sep 17 00:00:00 2001
+From 570d2d99cbf2b830e0d1be01dcc6fdd339b4d157 Mon Sep 17 00:00:00 2001
From: Jan Grulich <jan@grulich.eu>
Date: Mon, 24 Aug 2015 16:02:34 +0100
-Subject: [PATCH 086/170] tpa6130a2: Add headphone switch control
+Subject: [PATCH 085/232] tpa6130a2: Add headphone switch control
Signed-off-by: Jan Grulich <jan@grulich.eu>
---
diff --git a/target/linux/brcm2708/patches-4.4/0087-irq-bcm2835-Fix-building-with-2708.patch b/target/linux/brcm2708/patches-4.4/0086-irq-bcm2835-Fix-building-with-2708.patch
index 5c7c661363..125c30ede8 100644
--- a/target/linux/brcm2708/patches-4.4/0087-irq-bcm2835-Fix-building-with-2708.patch
+++ b/target/linux/brcm2708/patches-4.4/0086-irq-bcm2835-Fix-building-with-2708.patch
@@ -1,7 +1,7 @@
-From 6fc9d40bec5dbcf3ae8b52ab6850ed0b18193c82 Mon Sep 17 00:00:00 2001
+From a9e2bfff9a39efe94a066735509643fc3bed1ba0 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Mon, 28 Sep 2015 23:38:59 +0100
-Subject: [PATCH 087/170] irq-bcm2835: Fix building with 2708
+Subject: [PATCH 086/232] irq-bcm2835: Fix building with 2708
---
drivers/irqchip/irq-bcm2835.c | 3 ++-
diff --git a/target/linux/brcm2708/patches-4.4/0088-rpi_display-add-backlight-driver-and-overlay.patch b/target/linux/brcm2708/patches-4.4/0087-rpi_display-add-backlight-driver-and-overlay.patch
index 02a78c8e07..f9c84bb9ee 100644
--- a/target/linux/brcm2708/patches-4.4/0088-rpi_display-add-backlight-driver-and-overlay.patch
+++ b/target/linux/brcm2708/patches-4.4/0087-rpi_display-add-backlight-driver-and-overlay.patch
@@ -1,7 +1,7 @@
-From 0e7ec1e61b149567d5af63169cd4d701c133356f Mon Sep 17 00:00:00 2001
+From 0a8cace2c9d473ac347cc08dfe19b24ad5ca3d2b Mon Sep 17 00:00:00 2001
From: P33M <P33M@github.com>
Date: Wed, 21 Oct 2015 14:55:21 +0100
-Subject: [PATCH 088/170] rpi_display: add backlight driver and overlay
+Subject: [PATCH 087/232] rpi_display: add backlight driver and overlay
Add a mailbox-driven backlight controller for the Raspberry Pi DSI
touchscreen display. Requires updated GPU firmware to recognise the
diff --git a/target/linux/brcm2708/patches-4.4/0089-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch b/target/linux/brcm2708/patches-4.4/0088-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch
index cfeccd2a43..d7263d1624 100644
--- a/target/linux/brcm2708/patches-4.4/0089-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch
+++ b/target/linux/brcm2708/patches-4.4/0088-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch
@@ -1,7 +1,7 @@
-From 0459ca97c1f2753ce805ab58ff17847cb4c142e0 Mon Sep 17 00:00:00 2001
+From ec2e48fda22c57cab56a4332d1a095f91c919493 Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Mon, 16 Nov 2015 14:05:35 +0000
-Subject: [PATCH 089/170] bcm2835-dma: Fix up convert to DMA pool
+Subject: [PATCH 088/232] bcm2835-dma: Fix up convert to DMA pool
---
drivers/dma/bcm2835-dma.c | 36 ++++++++++++++++++++++++++----------
diff --git a/target/linux/brcm2708/patches-4.4/0090-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch b/target/linux/brcm2708/patches-4.4/0089-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch
index 3651d18121..a3f7e98905 100644
--- a/target/linux/brcm2708/patches-4.4/0090-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch
+++ b/target/linux/brcm2708/patches-4.4/0089-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch
@@ -1,7 +1,7 @@
-From f6dd60426dc7970ef4e9e3d9e00d374f80a6abd2 Mon Sep 17 00:00:00 2001
+From 9a67f8f17bb07bbfeee650327c88b6d381ab4af1 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Wed, 11 Nov 2015 11:38:59 +0000
-Subject: [PATCH 090/170] scripts: Multi-platform support for mkknlimg and
+Subject: [PATCH 089/232] scripts: Multi-platform support for mkknlimg and
knlinfo
The firmware uses tags in the kernel trailer to choose which dtb file
diff --git a/target/linux/brcm2708/patches-4.4/0091-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch b/target/linux/brcm2708/patches-4.4/0090-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch
index df0296d233..9713718920 100644
--- a/target/linux/brcm2708/patches-4.4/0091-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch
+++ b/target/linux/brcm2708/patches-4.4/0090-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch
@@ -1,7 +1,7 @@
-From 6d38553e5ce7fb70dd1f89665caf58064a7e97d7 Mon Sep 17 00:00:00 2001
+From 16c40415a78ba028f126b68e2cabf860186ff4f4 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 2 Mar 2015 13:01:12 -0800
-Subject: [PATCH 091/170] drm/vc4: Add suport for 3D rendering using the V3D
+Subject: [PATCH 090/232] drm/vc4: Add suport for 3D rendering using the V3D
engine.
This is a squash of the out-of-tree development series. Since that
diff --git a/target/linux/brcm2708/patches-4.4/0092-drm-vc4-Force-HDMI-to-connected.patch b/target/linux/brcm2708/patches-4.4/0091-drm-vc4-Force-HDMI-to-connected.patch
index 3c3417ca87..f8251ccb8f 100644
--- a/target/linux/brcm2708/patches-4.4/0092-drm-vc4-Force-HDMI-to-connected.patch
+++ b/target/linux/brcm2708/patches-4.4/0091-drm-vc4-Force-HDMI-to-connected.patch
@@ -1,7 +1,7 @@
-From aa579c7485e1bae681c50b223e89cd658dd0b2c1 Mon Sep 17 00:00:00 2001
+From fbec01e2d17b924d91850e17eeecf975e74c9ebf Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Wed, 14 Oct 2015 11:32:14 -0700
-Subject: [PATCH 092/170] drm/vc4: Force HDMI to connected.
+Subject: [PATCH 091/232] drm/vc4: Force HDMI to connected.
For some reason on the downstream tree, the HPD GPIO isn't working.
diff --git a/target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-fixes.patch b/target/linux/brcm2708/patches-4.4/0092-drm-vc4-bo-cache-locking-fixes.patch
index 927d0dc782..3a7bec723d 100644
--- a/target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-fixes.patch
+++ b/target/linux/brcm2708/patches-4.4/0092-drm-vc4-bo-cache-locking-fixes.patch
@@ -1,7 +1,7 @@
-From edb828d91374e8fa4f05d68be008c40d4f9a158d Mon Sep 17 00:00:00 2001
+From d27b72cbcf572b0e2c18359f494d1f6aa90dd6f3 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 19 Oct 2015 08:23:18 -0700
-Subject: [PATCH 093/170] drm/vc4: bo cache locking fixes.
+Subject: [PATCH 092/232] drm/vc4: bo cache locking fixes.
Signed-off-by: Eric Anholt <eric@anholt.net>
---
diff --git a/target/linux/brcm2708/patches-4.4/0094-drm-vc4-bo-cache-locking-cleanup.patch b/target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-cleanup.patch
index bf61ac14cf..369b1d8dae 100644
--- a/target/linux/brcm2708/patches-4.4/0094-drm-vc4-bo-cache-locking-cleanup.patch
+++ b/target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-cleanup.patch
@@ -1,7 +1,7 @@
-From eafd7a031a15fb0d51a86b89e42ccde4f23434b4 Mon Sep 17 00:00:00 2001
+From 6473779beaeda1017d8487c3f510015f2b9b8f9d Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 19 Oct 2015 08:29:41 -0700
-Subject: [PATCH 094/170] drm/vc4: bo cache locking cleanup.
+Subject: [PATCH 093/232] drm/vc4: bo cache locking cleanup.
Signed-off-by: Eric Anholt <eric@anholt.net>
---
diff --git a/target/linux/brcm2708/patches-4.4/0095-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch b/target/linux/brcm2708/patches-4.4/0094-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch
index 730355aea6..b86d07ec29 100644
--- a/target/linux/brcm2708/patches-4.4/0095-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch
+++ b/target/linux/brcm2708/patches-4.4/0094-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch
@@ -1,7 +1,7 @@
-From 482f2b3e97e919ac0ebc55a6040747495563b9a7 Mon Sep 17 00:00:00 2001
+From 1ec9d09f4b9ec69b3b0422fa3c26b3bcc82af64e Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 19 Oct 2015 08:32:24 -0700
-Subject: [PATCH 095/170] drm/vc4: Use job_lock to protect seqno_cb_list.
+Subject: [PATCH 094/232] drm/vc4: Use job_lock to protect seqno_cb_list.
We're (mostly) not supposed to be using struct_mutex in drivers these
days.
diff --git a/target/linux/brcm2708/patches-4.4/0095-drm-vc4-Drop-struct_mutex-around-CL-validation.patch b/target/linux/brcm2708/patches-4.4/0095-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
new file mode 100644
index 0000000000..91f7d7ca64
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0095-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
@@ -0,0 +1,63 @@
+From 016847d7cd5222d15f9213dc772d3808cd5d6e17 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 19 Oct 2015 08:44:35 -0700
+Subject: [PATCH 095/232] drm/vc4: Drop struct_mutex around CL validation.
+
+We were using it so that we could make sure that shader validation
+state didn't change while we were validating, but now shader
+validation state is immutable. The bcl/rcl generation doesn't do any
+other BO dereferencing, and seems to have no other global state
+dependency not covered by job_lock / bo_lock.
+
+Fixes a lock order reversal between mmap_sem and struct_mutex.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -244,13 +244,15 @@ static void
+ vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec)
+ {
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
+- uint64_t seqno = ++vc4->emit_seqno;
++ uint64_t seqno;
+ unsigned long irqflags;
+
++ spin_lock_irqsave(&vc4->job_lock, irqflags);
++
++ seqno = ++vc4->emit_seqno;
+ exec->seqno = seqno;
+ vc4_update_bo_seqnos(exec, seqno);
+
+- spin_lock_irqsave(&vc4->job_lock, irqflags);
+ list_add_tail(&exec->head, &vc4->job_list);
+
+ /* If no job was executing, kick ours off. Otherwise, it'll
+@@ -608,8 +610,6 @@ vc4_submit_cl_ioctl(struct drm_device *d
+ exec->args = args;
+ INIT_LIST_HEAD(&exec->unref_list);
+
+- mutex_lock(&dev->struct_mutex);
+-
+ ret = vc4_cl_lookup_bos(dev, file_priv, exec);
+ if (ret)
+ goto fail;
+@@ -636,15 +636,11 @@ vc4_submit_cl_ioctl(struct drm_device *d
+ /* Return the seqno for our job. */
+ args->seqno = vc4->emit_seqno;
+
+- mutex_unlock(&dev->struct_mutex);
+-
+ return 0;
+
+ fail:
+ vc4_complete_exec(exec);
+
+- mutex_unlock(&dev->struct_mutex);
+-
+ return ret;
+ }
+
diff --git a/target/linux/brcm2708/patches-4.4/0096-drm-vc4-Drop-struct_mutex-around-CL-validation.patch b/target/linux/brcm2708/patches-4.4/0096-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
index 75adab38d9..07c4d93f33 100644
--- a/target/linux/brcm2708/patches-4.4/0096-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
+++ b/target/linux/brcm2708/patches-4.4/0096-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
@@ -1,63 +1,74 @@
-From 4dc15a296586679d5b014011e44a093cf962123e Mon Sep 17 00:00:00 2001
+From 69aa18660bbe1ee6524c8220beb2af711146bc7f Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 19 Oct 2015 08:44:35 -0700
-Subject: [PATCH 096/170] drm/vc4: Drop struct_mutex around CL validation.
+Subject: [PATCH 096/232] drm/vc4: Drop struct_mutex around CL validation.
We were using it so that we could make sure that shader validation
state didn't change while we were validating, but now shader
validation state is immutable. The bcl/rcl generation doesn't do any
other BO dereferencing, and seems to have no other global state
-dependency not covered by job_lock / bo_lock.
+dependency not covered by job_lock / bo_lock. We only need to hold
+struct_mutex for object unreferencing.
Fixes a lock order reversal between mmap_sem and struct_mutex.
Signed-off-by: Eric Anholt <eric@anholt.net>
---
- drivers/gpu/drm/vc4/vc4_gem.c | 12 ++++--------
- 1 file changed, 4 insertions(+), 8 deletions(-)
+ drivers/gpu/drm/vc4/vc4_gem.c | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
-@@ -244,13 +244,15 @@ static void
- vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec)
+@@ -439,10 +439,12 @@ fail:
+ }
+
+ static void
+-vc4_complete_exec(struct vc4_exec_info *exec)
++vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
{
- struct vc4_dev *vc4 = to_vc4_dev(dev);
-- uint64_t seqno = ++vc4->emit_seqno;
-+ uint64_t seqno;
- unsigned long irqflags;
+ unsigned i;
-+ spin_lock_irqsave(&vc4->job_lock, irqflags);
-+
-+ seqno = ++vc4->emit_seqno;
- exec->seqno = seqno;
- vc4_update_bo_seqnos(exec, seqno);
++ /* Need the struct lock for drm_gem_object_unreference(). */
++ mutex_lock(&dev->struct_mutex);
+ if (exec->bo) {
+ for (i = 0; i < exec->bo_count; i++)
+ drm_gem_object_unreference(&exec->bo[i].bo->base);
+@@ -455,6 +457,7 @@ vc4_complete_exec(struct vc4_exec_info *
+ list_del(&bo->unref_head);
+ drm_gem_object_unreference(&bo->base.base);
+ }
++ mutex_unlock(&dev->struct_mutex);
-- spin_lock_irqsave(&vc4->job_lock, irqflags);
- list_add_tail(&exec->head, &vc4->job_list);
+ kfree(exec);
+ }
+@@ -473,7 +476,7 @@ vc4_job_handle_completed(struct vc4_dev
+ list_del(&exec->head);
- /* If no job was executing, kick ours off. Otherwise, it'll
-@@ -608,8 +610,6 @@ vc4_submit_cl_ioctl(struct drm_device *d
- exec->args = args;
- INIT_LIST_HEAD(&exec->unref_list);
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
+- vc4_complete_exec(exec);
++ vc4_complete_exec(vc4->dev, exec);
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
+ }
-- mutex_lock(&dev->struct_mutex);
--
- ret = vc4_cl_lookup_bos(dev, file_priv, exec);
- if (ret)
- goto fail;
-@@ -636,15 +636,11 @@ vc4_submit_cl_ioctl(struct drm_device *d
- /* Return the seqno for our job. */
- args->seqno = vc4->emit_seqno;
+@@ -525,12 +528,8 @@ vc4_job_done_work(struct work_struct *wo
+ {
+ struct vc4_dev *vc4 =
+ container_of(work, struct vc4_dev, job_done_work);
+- struct drm_device *dev = vc4->dev;
+- /* Need the struct lock for drm_gem_object_unreference(). */
+- mutex_lock(&dev->struct_mutex);
+ vc4_job_handle_completed(vc4);
- mutex_unlock(&dev->struct_mutex);
--
+ }
+
+ static int
+@@ -639,7 +638,7 @@ vc4_submit_cl_ioctl(struct drm_device *d
return 0;
fail:
- vc4_complete_exec(exec);
+- vc4_complete_exec(exec);
++ vc4_complete_exec(vc4->dev, exec);
-- mutex_unlock(&dev->struct_mutex);
--
return ret;
}
-
diff --git a/target/linux/brcm2708/patches-4.4/0098-drm-vc4-Add-support-for-more-display-plane-formats.patch b/target/linux/brcm2708/patches-4.4/0097-drm-vc4-Add-support-for-more-display-plane-formats.patch
index 817271a4a6..fded87d135 100644
--- a/target/linux/brcm2708/patches-4.4/0098-drm-vc4-Add-support-for-more-display-plane-formats.patch
+++ b/target/linux/brcm2708/patches-4.4/0097-drm-vc4-Add-support-for-more-display-plane-formats.patch
@@ -1,7 +1,7 @@
-From 0193a1e5b931c7363279282b4169c2152af1a621 Mon Sep 17 00:00:00 2001
+From 111e49bbb002b4dd86ef0c7e0b314c336e6a01c3 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Tue, 20 Oct 2015 13:59:15 +0100
-Subject: [PATCH 098/170] drm/vc4: Add support for more display plane formats.
+Subject: [PATCH 097/232] drm/vc4: Add support for more display plane formats.
Signed-off-by: Eric Anholt <eric@anholt.net>
---
diff --git a/target/linux/brcm2708/patches-4.4/0097-drm-vc4-Drop-struct_mutex-around-CL-validation.patch b/target/linux/brcm2708/patches-4.4/0097-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
deleted file mode 100644
index 064e1170ed..0000000000
--- a/target/linux/brcm2708/patches-4.4/0097-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From f1924e632d16f98eee1fe1be636249b8cee4ee6e Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Mon, 19 Oct 2015 08:44:35 -0700
-Subject: [PATCH 097/170] drm/vc4: Drop struct_mutex around CL validation.
-
-We were using it so that we could make sure that shader validation
-state didn't change while we were validating, but now shader
-validation state is immutable. The bcl/rcl generation doesn't do any
-other BO dereferencing, and seems to have no other global state
-dependency not covered by job_lock / bo_lock. We only need to hold
-struct_mutex for object unreferencing.
-
-Fixes a lock order reversal between mmap_sem and struct_mutex.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/gpu/drm/vc4/vc4_gem.c | 13 ++++++-------
- 1 file changed, 6 insertions(+), 7 deletions(-)
-
---- a/drivers/gpu/drm/vc4/vc4_gem.c
-+++ b/drivers/gpu/drm/vc4/vc4_gem.c
-@@ -439,10 +439,12 @@ fail:
- }
-
- static void
--vc4_complete_exec(struct vc4_exec_info *exec)
-+vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
- {
- unsigned i;
-
-+ /* Need the struct lock for drm_gem_object_unreference(). */
-+ mutex_lock(&dev->struct_mutex);
- if (exec->bo) {
- for (i = 0; i < exec->bo_count; i++)
- drm_gem_object_unreference(&exec->bo[i].bo->base);
-@@ -455,6 +457,7 @@ vc4_complete_exec(struct vc4_exec_info *
- list_del(&bo->unref_head);
- drm_gem_object_unreference(&bo->base.base);
- }
-+ mutex_unlock(&dev->struct_mutex);
-
- kfree(exec);
- }
-@@ -473,7 +476,7 @@ vc4_job_handle_completed(struct vc4_dev
- list_del(&exec->head);
-
- spin_unlock_irqrestore(&vc4->job_lock, irqflags);
-- vc4_complete_exec(exec);
-+ vc4_complete_exec(vc4->dev, exec);
- spin_lock_irqsave(&vc4->job_lock, irqflags);
- }
-
-@@ -525,12 +528,8 @@ vc4_job_done_work(struct work_struct *wo
- {
- struct vc4_dev *vc4 =
- container_of(work, struct vc4_dev, job_done_work);
-- struct drm_device *dev = vc4->dev;
-
-- /* Need the struct lock for drm_gem_object_unreference(). */
-- mutex_lock(&dev->struct_mutex);
- vc4_job_handle_completed(vc4);
-- mutex_unlock(&dev->struct_mutex);
- }
-
- static int
-@@ -639,7 +638,7 @@ vc4_submit_cl_ioctl(struct drm_device *d
- return 0;
-
- fail:
-- vc4_complete_exec(exec);
-+ vc4_complete_exec(vc4->dev, exec);
-
- return ret;
- }
diff --git a/target/linux/brcm2708/patches-4.4/0099-drm-vc4-No-need-to-stop-the-stopped-threads.patch b/target/linux/brcm2708/patches-4.4/0098-drm-vc4-No-need-to-stop-the-stopped-threads.patch
index 7265078cf0..9831c9e6c3 100644
--- a/target/linux/brcm2708/patches-4.4/0099-drm-vc4-No-need-to-stop-the-stopped-threads.patch
+++ b/target/linux/brcm2708/patches-4.4/0098-drm-vc4-No-need-to-stop-the-stopped-threads.patch
@@ -1,7 +1,7 @@
-From 8faa3b83201819d56f997a2b2ecaf8c690080852 Mon Sep 17 00:00:00 2001
+From 81dbf19b16cc789162ac94cd4e764a667111386e Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 23 Oct 2015 12:31:56 +0100
-Subject: [PATCH 099/170] drm/vc4: No need to stop the stopped threads.
+Subject: [PATCH 098/232] drm/vc4: No need to stop the stopped threads.
This was leftover debug code from the hackdriver. We never submit
unless the thread is already idle.
diff --git a/target/linux/brcm2708/patches-4.4/0100-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch b/target/linux/brcm2708/patches-4.4/0099-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch
index d727a1b8e5..e0862d8e3f 100644
--- a/target/linux/brcm2708/patches-4.4/0100-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch
+++ b/target/linux/brcm2708/patches-4.4/0099-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch
@@ -1,7 +1,7 @@
-From d102d0e145b58bccbea52e89bbe52dcefc044aaa Mon Sep 17 00:00:00 2001
+From 9db0b8d54024bf5a2d0c3239aa571d890e8c8b3a Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 23 Oct 2015 12:33:43 +0100
-Subject: [PATCH 100/170] drm/vc4: Remove extra barrier()s aroudn CTnCA/CTnEA
+Subject: [PATCH 099/232] drm/vc4: Remove extra barrier()s aroudn CTnCA/CTnEA
setup.
The writel() that these expand to already does barriers.
diff --git a/target/linux/brcm2708/patches-4.4/0101-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch b/target/linux/brcm2708/patches-4.4/0100-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch
index c920f40ba6..6049fb5d72 100644
--- a/target/linux/brcm2708/patches-4.4/0101-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch
+++ b/target/linux/brcm2708/patches-4.4/0100-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch
@@ -1,7 +1,7 @@
-From 0f099b4b1354b0377376b91ae60c6c16d82683a7 Mon Sep 17 00:00:00 2001
+From 03b4b90b8e265158ac3529428f7aaf5f3b0f8a7a Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 23 Oct 2015 14:57:22 +0100
-Subject: [PATCH 101/170] drm/vc4: Fix a typo in a V3D debug register.
+Subject: [PATCH 100/232] drm/vc4: Fix a typo in a V3D debug register.
Signed-off-by: Eric Anholt <eric@anholt.net>
---
diff --git a/target/linux/brcm2708/patches-4.4/0102-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch b/target/linux/brcm2708/patches-4.4/0101-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch
index 5531673c59..8426ba6528 100644
--- a/target/linux/brcm2708/patches-4.4/0102-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch
+++ b/target/linux/brcm2708/patches-4.4/0101-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch
@@ -1,7 +1,7 @@
-From 22182768add611b53e33c5dd2e8901acc3d08181 Mon Sep 17 00:00:00 2001
+From a5b0c616e9b40bd7907c5157700661004a8ef331 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 2 Nov 2015 17:07:33 +0000
-Subject: [PATCH 102/170] drm/vc4: Enable VC4 modules, and increase CMA size
+Subject: [PATCH 101/232] drm/vc4: Enable VC4 modules, and increase CMA size
with overlay
If using the overlay, be careful not to boot to GUI or run startx,
diff --git a/target/linux/brcm2708/patches-4.4/0103-squash-fixups.patch b/target/linux/brcm2708/patches-4.4/0102-squash-fixups.patch
index 25c0137905..018ce67539 100644
--- a/target/linux/brcm2708/patches-4.4/0103-squash-fixups.patch
+++ b/target/linux/brcm2708/patches-4.4/0102-squash-fixups.patch
@@ -1,7 +1,7 @@
-From 88315025318218ac04fcc66614083bb1a51f662f Mon Sep 17 00:00:00 2001
+From 17f4de0c9daea638476ca0f80123d3523e66fdc0 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 18 Nov 2015 18:29:58 +0000
-Subject: [PATCH 103/170] squash: fixups
+Subject: [PATCH 102/232] squash: fixups
---
drivers/gpu/drm/vc4/Kconfig | 2 +-
diff --git a/target/linux/brcm2708/patches-4.4/0104-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch b/target/linux/brcm2708/patches-4.4/0103-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch
index 23d73e83d4..0c77a819be 100644
--- a/target/linux/brcm2708/patches-4.4/0104-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch
+++ b/target/linux/brcm2708/patches-4.4/0103-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch
@@ -1,7 +1,7 @@
-From 3fc233b798ac8498b4e24b42ad67fb3499a30f07 Mon Sep 17 00:00:00 2001
+From c1834a750441c3ea55f24377e04cf8d1fb66c877 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 18 Nov 2015 20:26:03 +0000
-Subject: [PATCH 104/170] squash: add missing vc4-kms-v3d-overlay.dtb to
+Subject: [PATCH 103/232] squash: add missing vc4-kms-v3d-overlay.dtb to
makefile
---
diff --git a/target/linux/brcm2708/patches-4.4/0105-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch b/target/linux/brcm2708/patches-4.4/0104-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch
index f66e151e52..56cef7e564 100644
--- a/target/linux/brcm2708/patches-4.4/0105-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch
+++ b/target/linux/brcm2708/patches-4.4/0104-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch
@@ -1,7 +1,7 @@
-From d9888c76bcee2a7c118ab8ba93a1204fb5ff4e44 Mon Sep 17 00:00:00 2001
+From 084eeec470e76e8c84cda1a31e323610467913bd Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 12 Oct 2015 11:23:34 -0700
-Subject: [PATCH 105/170] clk: bcm2835: Also build the driver for downstream
+Subject: [PATCH 104/232] clk: bcm2835: Also build the driver for downstream
kernels.
Signed-off-by: Eric Anholt <eric@anholt.net>
diff --git a/target/linux/brcm2708/patches-4.4/0106-dts-Added-overlay-for-gpio_ir_recv-driver.patch b/target/linux/brcm2708/patches-4.4/0105-dts-Added-overlay-for-gpio_ir_recv-driver.patch
index 54fb05dd02..22de121f2d 100644
--- a/target/linux/brcm2708/patches-4.4/0106-dts-Added-overlay-for-gpio_ir_recv-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0105-dts-Added-overlay-for-gpio_ir_recv-driver.patch
@@ -1,7 +1,7 @@
-From 0dbc0fe760a54bbcff587657062df49dc0eaf2b9 Mon Sep 17 00:00:00 2001
+From cbb80e24a9db48390c82c7030cc7f7389aee953f Mon Sep 17 00:00:00 2001
From: Holger Steinhaus <hsteinhaus@gmx.de>
Date: Sat, 14 Nov 2015 18:37:43 +0100
-Subject: [PATCH 106/170] dts: Added overlay for gpio_ir_recv driver
+Subject: [PATCH 105/232] dts: Added overlay for gpio_ir_recv driver
---
arch/arm/boot/dts/overlays/Makefile | 1 +
diff --git a/target/linux/brcm2708/patches-4.4/0107-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch b/target/linux/brcm2708/patches-4.4/0106-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch
index 3654797e66..259901616c 100644
--- a/target/linux/brcm2708/patches-4.4/0107-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch
+++ b/target/linux/brcm2708/patches-4.4/0106-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch
@@ -1,7 +1,7 @@
-From 938b09ce6c6736d0861c2c9eec3a7e739585b589 Mon Sep 17 00:00:00 2001
+From c644d7cae9394e209fc2451b91d2852ebfc85a09 Mon Sep 17 00:00:00 2001
From: Alistair Buxton <a.j.buxton@gmail.com>
Date: Sun, 1 Nov 2015 22:27:56 +0000
-Subject: [PATCH 107/170] Build i2c_gpio module and add a device tree overlay
+Subject: [PATCH 106/232] Build i2c_gpio module and add a device tree overlay
to configure it.
---
diff --git a/target/linux/brcm2708/patches-4.4/0108-New-overlay-for-PiScreen2r.patch b/target/linux/brcm2708/patches-4.4/0107-New-overlay-for-PiScreen2r.patch
index f56543ea77..f57a63d548 100644
--- a/target/linux/brcm2708/patches-4.4/0108-New-overlay-for-PiScreen2r.patch
+++ b/target/linux/brcm2708/patches-4.4/0107-New-overlay-for-PiScreen2r.patch
@@ -1,7 +1,7 @@
-From a4b5aa412585674d4a4f2ba7c0d818fd796f51c3 Mon Sep 17 00:00:00 2001
+From a5a974dbeaaf0be8b1fa5d8c6f117b320ea01b44 Mon Sep 17 00:00:00 2001
From: mwilliams03 <mark.mwilliams@gmail.com>
Date: Sun, 18 Oct 2015 17:07:24 -0700
-Subject: [PATCH 108/170] New overlay for PiScreen2r
+Subject: [PATCH 107/232] New overlay for PiScreen2r
---
arch/arm/boot/dts/overlays/Makefile | 1 +
diff --git a/target/linux/brcm2708/patches-4.4/0109-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch b/target/linux/brcm2708/patches-4.4/0108-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch
index 480d8db6a0..4aab320147 100644
--- a/target/linux/brcm2708/patches-4.4/0109-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch
+++ b/target/linux/brcm2708/patches-4.4/0108-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch
@@ -1,7 +1,7 @@
-From 1a4fac1ea6bb33a963b06406f6f44b527daa3a90 Mon Sep 17 00:00:00 2001
+From 708f013bf40633883113c3fbaca5555b7d115906 Mon Sep 17 00:00:00 2001
From: Ondrej Wisniewski <ondrej.wisniewski@gmail.com>
Date: Fri, 6 Nov 2015 15:01:28 +0100
-Subject: [PATCH 109/170] dts: Added overlay for Adafruit PiTFT 2.8" capacitive
+Subject: [PATCH 108/232] dts: Added overlay for Adafruit PiTFT 2.8" capacitive
touch screen
---
diff --git a/target/linux/brcm2708/patches-4.4/0110-Add-support-for-the-HiFiBerry-DAC-Pro.patch b/target/linux/brcm2708/patches-4.4/0109-Add-support-for-the-HiFiBerry-DAC-Pro.patch
index 594388eda0..272215de9a 100644
--- a/target/linux/brcm2708/patches-4.4/0110-Add-support-for-the-HiFiBerry-DAC-Pro.patch
+++ b/target/linux/brcm2708/patches-4.4/0109-Add-support-for-the-HiFiBerry-DAC-Pro.patch
@@ -1,7 +1,7 @@
-From 660ba9173ca14b48d7cd2f69ff45e67ebe4d947a Mon Sep 17 00:00:00 2001
+From b706bc693765cc80c31076e8fa0e35e798c12bbf Mon Sep 17 00:00:00 2001
From: Stuart MacLean <stuart@hifiberry.com>
Date: Fri, 2 Oct 2015 15:12:59 +0100
-Subject: [PATCH 110/170] Add support for the HiFiBerry DAC+ Pro.
+Subject: [PATCH 109/232] Add support for the HiFiBerry DAC+ Pro.
The HiFiBerry DAC+ and DAC+ Pro products both use the existing bcm sound driver with the DAC+ Pro having a special clock device driver representing the two high precision oscillators.
diff --git a/target/linux/brcm2708/patches-4.4/0111-BCM270X_DT-Add-at86rf233-overlay.patch b/target/linux/brcm2708/patches-4.4/0110-BCM270X_DT-Add-at86rf233-overlay.patch
index cc7ec22567..41ae6ab662 100644
--- a/target/linux/brcm2708/patches-4.4/0111-BCM270X_DT-Add-at86rf233-overlay.patch
+++ b/target/linux/brcm2708/patches-4.4/0110-BCM270X_DT-Add-at86rf233-overlay.patch
@@ -1,7 +1,7 @@
-From 14b6c7013e62b3917ce73841dc8e379d011d37a5 Mon Sep 17 00:00:00 2001
+From 9fa71fbc6193d214f9a5432f85bb17f47016ba65 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 5 Oct 2015 10:47:45 +0100
-Subject: [PATCH 111/170] BCM270X_DT: Add at86rf233 overlay
+Subject: [PATCH 110/232] BCM270X_DT: Add at86rf233 overlay
Add an overlay to support the Atmel AT86RF233 WPAN transceiver on spi0.0.
diff --git a/target/linux/brcm2708/patches-4.4/0112-mm-Remove-the-PFN-busy-warning.patch b/target/linux/brcm2708/patches-4.4/0111-mm-Remove-the-PFN-busy-warning.patch
index a4f6ec19e3..ecb166c311 100644
--- a/target/linux/brcm2708/patches-4.4/0112-mm-Remove-the-PFN-busy-warning.patch
+++ b/target/linux/brcm2708/patches-4.4/0111-mm-Remove-the-PFN-busy-warning.patch
@@ -1,7 +1,7 @@
-From d33b3717e86cd6aa28c58d465a22e6c11a66bc13 Mon Sep 17 00:00:00 2001
+From 4df259e844e183bf00e1c5eb8ca25dcf19d396ce Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Thu, 18 Dec 2014 16:07:15 -0800
-Subject: [PATCH 112/170] mm: Remove the PFN busy warning
+Subject: [PATCH 111/232] mm: Remove the PFN busy warning
See commit dae803e165a11bc88ca8dbc07a11077caf97bbcb -- the warning is
expected sometimes when using CMA. However, that commit still spams
diff --git a/target/linux/brcm2708/patches-4.4/0113-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch b/target/linux/brcm2708/patches-4.4/0112-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch
index 775d46a553..637157b355 100644
--- a/target/linux/brcm2708/patches-4.4/0113-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch
+++ b/target/linux/brcm2708/patches-4.4/0112-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch
@@ -1,7 +1,7 @@
-From a71d6ebfcbc401e520fa4a5aa185d027dfbe5ce1 Mon Sep 17 00:00:00 2001
+From b1891f7b0018e7e778f49c1817692e1f85a1f529 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Wed, 19 Nov 2014 12:06:38 -0800
-Subject: [PATCH 113/170] drm: Put an optional field in the driver struct for
+Subject: [PATCH 112/232] drm: Put an optional field in the driver struct for
GEM obj struct size.
This allows a driver to derive from the CMA object without copying all
diff --git a/target/linux/brcm2708/patches-4.4/0114-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch b/target/linux/brcm2708/patches-4.4/0113-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch
index 3e40eb646c..e71b82bbe9 100644
--- a/target/linux/brcm2708/patches-4.4/0114-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch
+++ b/target/linux/brcm2708/patches-4.4/0113-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch
@@ -1,7 +1,7 @@
-From 1c343ed1f86866d2625518774536bbef77f7a20a Mon Sep 17 00:00:00 2001
+From b9e5697fbec13e6203b63649ee5d7c6819a5fb6b Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 30 Oct 2015 10:09:02 -0700
-Subject: [PATCH 114/170] drm/vc4: Add an interface for capturing the GPU state
+Subject: [PATCH 113/232] drm/vc4: Add an interface for capturing the GPU state
after a hang.
This can be parsed with vc4-gpu-tools tools for trying to figure out
diff --git a/target/linux/brcm2708/patches-4.4/0115-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch b/target/linux/brcm2708/patches-4.4/0114-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch
index 70f32ca552..b54c37a377 100644
--- a/target/linux/brcm2708/patches-4.4/0115-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch
+++ b/target/linux/brcm2708/patches-4.4/0114-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch
@@ -1,7 +1,7 @@
-From 431be9af0aa88da94986effdff649330cfde1f5a Mon Sep 17 00:00:00 2001
+From e4058e84edec652f5a7b3e9e4982eac62b22a90c Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 4 Dec 2015 11:35:34 -0800
-Subject: [PATCH 115/170] drm/vc4: Update a bunch of code to match upstream
+Subject: [PATCH 114/232] drm/vc4: Update a bunch of code to match upstream
submission.
This gets almost everything matching, except for the MSAA support and
diff --git a/target/linux/brcm2708/patches-4.4/0116-drm-Use-the-driver-s-gem_object_free-function-from-C.patch b/target/linux/brcm2708/patches-4.4/0115-drm-Use-the-driver-s-gem_object_free-function-from-C.patch
index 7f1ce7b15d..db69082284 100644
--- a/target/linux/brcm2708/patches-4.4/0116-drm-Use-the-driver-s-gem_object_free-function-from-C.patch
+++ b/target/linux/brcm2708/patches-4.4/0115-drm-Use-the-driver-s-gem_object_free-function-from-C.patch
@@ -1,7 +1,7 @@
-From 7d4ed9f40e9484ded3965b13fbb7914a1daf85d7 Mon Sep 17 00:00:00 2001
+From 659b247a25ea9439be74087726d6adfae7570d12 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 11 Dec 2015 19:45:03 -0800
-Subject: [PATCH 116/170] drm: Use the driver's gem_object_free function from
+Subject: [PATCH 115/232] drm: Use the driver's gem_object_free function from
CMA helpers.
VC4 wraps the CMA objects in its own structures, so it needs to do its
diff --git a/target/linux/brcm2708/patches-4.4/0117-drm-vc4-Add-support-for-MSAA-rendering.patch b/target/linux/brcm2708/patches-4.4/0116-drm-vc4-Add-support-for-MSAA-rendering.patch
index 92d7eedcdb..ffa382bf44 100644
--- a/target/linux/brcm2708/patches-4.4/0117-drm-vc4-Add-support-for-MSAA-rendering.patch
+++ b/target/linux/brcm2708/patches-4.4/0116-drm-vc4-Add-support-for-MSAA-rendering.patch
@@ -1,7 +1,7 @@
-From 522e6f9cc4376fe49e8b41b40e7ddb98cf385a9e Mon Sep 17 00:00:00 2001
+From 878a974dd326f144ba90c1cf018db604bf127835 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Fri, 17 Jul 2015 13:15:50 -0700
-Subject: [PATCH 117/170] drm/vc4: Add support for MSAA rendering.
+Subject: [PATCH 116/232] drm/vc4: Add support for MSAA rendering.
For MSAA, you set a bit in the binner that halves the size of tiles in
each direction, so you can pack 4 samples per pixel in the tile
diff --git a/target/linux/brcm2708/patches-4.4/0118-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch b/target/linux/brcm2708/patches-4.4/0117-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch
index 9e6989ca12..3b5b8b42bb 100644
--- a/target/linux/brcm2708/patches-4.4/0118-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch
+++ b/target/linux/brcm2708/patches-4.4/0117-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch
@@ -1,7 +1,7 @@
-From 50a1843ffd2e6f408dcb6a64ca0a2ef3b062fd5a Mon Sep 17 00:00:00 2001
+From 6e271c79f63541cbc2e8101a39aa2b0e8d2634c4 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Tue, 8 Dec 2015 14:00:43 -0800
-Subject: [PATCH 118/170] drm/vc4: A few more non-functional changes to sync to
+Subject: [PATCH 117/232] drm/vc4: A few more non-functional changes to sync to
upstream.
At this point all that's left is the force-enable of HDMI connector,
diff --git a/target/linux/brcm2708/patches-4.4/0119-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch b/target/linux/brcm2708/patches-4.4/0118-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch
index e66eaed9b0..401340b94a 100644
--- a/target/linux/brcm2708/patches-4.4/0119-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch
+++ b/target/linux/brcm2708/patches-4.4/0118-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch
@@ -1,7 +1,7 @@
-From 0a373a81664b9e9b8994512fb3d15ed296526e89 Mon Sep 17 00:00:00 2001
+From 6fa2e872ce528f957b0c3aa735aa46b24ed6601a Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Tue, 15 Dec 2015 23:46:32 +0000
-Subject: [PATCH 119/170] drm/vc4: Use "hpd-gpios" for HDMI GPIO, like what
+Subject: [PATCH 118/232] drm/vc4: Use "hpd-gpios" for HDMI GPIO, like what
landed upstream.
Signed-off-by: Eric Anholt <eric@anholt.net>
diff --git a/target/linux/brcm2708/patches-4.4/0120-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch b/target/linux/brcm2708/patches-4.4/0119-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch
index a6a4d5e039..44b3e5a069 100644
--- a/target/linux/brcm2708/patches-4.4/0120-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch
+++ b/target/linux/brcm2708/patches-4.4/0119-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch
@@ -1,7 +1,7 @@
-From f8453aacbe60712c31c57580a126017b798bd339 Mon Sep 17 00:00:00 2001
+From 76172185d9852c3e2bf7ace7c040b62dd220d9aa Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 7 Dec 2015 12:35:01 -0800
-Subject: [PATCH 120/170] drm/vc4: Synchronize validation code for v2
+Subject: [PATCH 119/232] drm/vc4: Synchronize validation code for v2
submission upstream.
Signed-off-by: Eric Anholt <eric@anholt.net>
diff --git a/target/linux/brcm2708/patches-4.4/0121-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch b/target/linux/brcm2708/patches-4.4/0120-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch
index 5a0c685474..8b09850e62 100644
--- a/target/linux/brcm2708/patches-4.4/0121-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch
+++ b/target/linux/brcm2708/patches-4.4/0120-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch
@@ -1,7 +1,7 @@
-From 280bea89916813978b81811c2769411d438eb52f Mon Sep 17 00:00:00 2001
+From f825bd28e15f4a4e653f8a81e2a02ac9da1068ca Mon Sep 17 00:00:00 2001
From: janluca <janluca@zedat.fu-berlin.de>
Date: Sun, 27 Dec 2015 14:34:04 +0100
-Subject: [PATCH 121/170] MMC: Do not use mmc_debug if CONFIG_MMC_BCM2835 is
+Subject: [PATCH 120/232] MMC: Do not use mmc_debug if CONFIG_MMC_BCM2835 is
not set
If CONFIG_MMC_BCM2835 was not set the compiling of the kernel failed
diff --git a/target/linux/brcm2708/patches-4.4/0122-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch b/target/linux/brcm2708/patches-4.4/0121-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch
index 1059ae3445..18d02f2587 100644
--- a/target/linux/brcm2708/patches-4.4/0122-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch
+++ b/target/linux/brcm2708/patches-4.4/0121-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch
@@ -1,7 +1,7 @@
-From d0390ae0ff774d8e7b5b4d5f38c33726354996bc Mon Sep 17 00:00:00 2001
+From 127a32cdd6005a42f6b5b63de9d7db573d9de184 Mon Sep 17 00:00:00 2001
From: Devon Fyson <devonfyson@gmail.com>
Date: Wed, 30 Dec 2015 16:40:47 -0500
-Subject: [PATCH 122/170] Extend clock timeout, fix modprobe baudrate
+Subject: [PATCH 121/232] Extend clock timeout, fix modprobe baudrate
parameter.
Set the BSC_CLKT clock streching timeout to 35ms as per SMBus specs.\n- Increase priority of baudrate parameter passed to modprobe (in /etc/modprobe.d/*.conf or command line). Currently custom baudrates don't work because they are overridden by clock-frequency in the platform_device passed to the function.
diff --git a/target/linux/brcm2708/patches-4.4/0123-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch b/target/linux/brcm2708/patches-4.4/0122-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch
index e4c8afa349..230e7e6314 100644
--- a/target/linux/brcm2708/patches-4.4/0123-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch
+++ b/target/linux/brcm2708/patches-4.4/0122-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch
@@ -1,7 +1,7 @@
-From 62dca1937fc3acfe4b6471607b7a4d58c34e73b7 Mon Sep 17 00:00:00 2001
+From bde59419fd4b9dac732341a62159f01094dfe70d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= <noralf@tronnes.org>
Date: Thu, 31 Dec 2015 16:44:58 +0100
-Subject: [PATCH 123/170] bcm270x_dt: Add dwc2 and dwc-otg overlays
+Subject: [PATCH 122/232] bcm270x_dt: Add dwc2 and dwc-otg overlays
---
arch/arm/boot/dts/overlays/Makefile | 2 ++
diff --git a/target/linux/brcm2708/patches-4.4/0124-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch b/target/linux/brcm2708/patches-4.4/0123-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch
index 584033d453..91893c51e1 100644
--- a/target/linux/brcm2708/patches-4.4/0124-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch
+++ b/target/linux/brcm2708/patches-4.4/0123-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch
@@ -1,7 +1,7 @@
-From 162dd00041afb2995f90a928ea80aeaa0d141ce5 Mon Sep 17 00:00:00 2001
+From 5d03b10c60e70fb5d316706a3777e46dc9dd748e Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 4 Jan 2016 14:42:17 +0000
-Subject: [PATCH 124/170] BCM270X_DT: Add the sdtweak overlay, for tuning
+Subject: [PATCH 123/232] BCM270X_DT: Add the sdtweak overlay, for tuning
sdhost
The sdhost overlay declares the sdhost interface and allows parameters
diff --git a/target/linux/brcm2708/patches-4.4/0125-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch b/target/linux/brcm2708/patches-4.4/0124-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch
index 0413ece4ce..ca4d33560e 100644
--- a/target/linux/brcm2708/patches-4.4/0125-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch
+++ b/target/linux/brcm2708/patches-4.4/0124-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch
@@ -1,7 +1,7 @@
-From b07c427a7732a0fabcf521085e0fd61b0ef9047c Mon Sep 17 00:00:00 2001
+From 17589e37dff9745d9c219973a77031905cb57973 Mon Sep 17 00:00:00 2001
From: Andrew Litt <ajlitt@splunge.net>
Date: Mon, 11 Jan 2016 07:54:21 +0000
-Subject: [PATCH 125/170] bcm2835-mmc: Don't override bus width capabilities
+Subject: [PATCH 124/232] bcm2835-mmc: Don't override bus width capabilities
from devicetree
Take out the force setting of the MMC_CAP_4_BIT_DATA host capability
diff --git a/target/linux/brcm2708/patches-4.4/0126-SDIO-overlay-add-bus_width-parameter.patch b/target/linux/brcm2708/patches-4.4/0125-SDIO-overlay-add-bus_width-parameter.patch
index 0dcf03e3e5..c16a0027d5 100644
--- a/target/linux/brcm2708/patches-4.4/0126-SDIO-overlay-add-bus_width-parameter.patch
+++ b/target/linux/brcm2708/patches-4.4/0125-SDIO-overlay-add-bus_width-parameter.patch
@@ -1,7 +1,7 @@
-From f74652d026105ecc4a87b581a9c1c89a6e504d2c Mon Sep 17 00:00:00 2001
+From c671b8fada8fe75583e25cd93f9a414c7024e613 Mon Sep 17 00:00:00 2001
From: Andrew Litt <ajlitt@splunge.net>
Date: Mon, 11 Jan 2016 07:55:54 +0000
-Subject: [PATCH 126/170] SDIO-overlay: add bus_width parameter
+Subject: [PATCH 125/232] SDIO-overlay: add bus_width parameter
Allow setting of the SDIO bus width capability of the bcm2835-mmc
host. This is helpful when only a 1 bit wide bus is connected
diff --git a/target/linux/brcm2708/patches-4.4/0128-bcm2835-extend-allowed-range-of-channels-and-sampler.patch b/target/linux/brcm2708/patches-4.4/0126-bcm2835-extend-allowed-range-of-channels-and-sampler.patch
index 5fc9c99529..20203c3b86 100644
--- a/target/linux/brcm2708/patches-4.4/0128-bcm2835-extend-allowed-range-of-channels-and-sampler.patch
+++ b/target/linux/brcm2708/patches-4.4/0126-bcm2835-extend-allowed-range-of-channels-and-sampler.patch
@@ -1,7 +1,7 @@
-From 320bdec200197f074541e3999fa4b87889c5eb18 Mon Sep 17 00:00:00 2001
+From 688a5f0daa45e0a51b324707768d472e1d715c13 Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:41:45 +0100
-Subject: [PATCH 128/170] bcm2835: extend allowed range of channels and
+Subject: [PATCH 126/232] bcm2835: extend allowed range of channels and
samplerates
Allow everything the videocore accepts.
diff --git a/target/linux/brcm2708/patches-4.4/0127-FIXUP-BCM270X_DT-random-HWRNG-dtparam-default-is-on.patch b/target/linux/brcm2708/patches-4.4/0127-FIXUP-BCM270X_DT-random-HWRNG-dtparam-default-is-on.patch
deleted file mode 100644
index 86f381cf1f..0000000000
--- a/target/linux/brcm2708/patches-4.4/0127-FIXUP-BCM270X_DT-random-HWRNG-dtparam-default-is-on.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 232754cb0ecd1967a8b72d6bd05467843d65a441 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 8 Jan 2016 13:42:06 +0000
-Subject: [PATCH 127/170] FIXUP BCM270X_DT: "random" (HWRNG) dtparam default is
- on
-
----
- arch/arm/boot/dts/overlays/README | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -110,7 +110,7 @@ Params:
- (default "off")
-
- random Set to "on" to enable the hardware random
-- number generator (default "off")
-+ number generator (default "on")
-
- uart0 Set to "off" to disable uart0 (default "on")
-
diff --git a/target/linux/brcm2708/patches-4.4/0129-bcm2835-restrict-channels-rate-to-8-960000.patch b/target/linux/brcm2708/patches-4.4/0127-bcm2835-restrict-channels-rate-to-8-960000.patch
index 29bd6ecd99..8b18cd6828 100644
--- a/target/linux/brcm2708/patches-4.4/0129-bcm2835-restrict-channels-rate-to-8-960000.patch
+++ b/target/linux/brcm2708/patches-4.4/0127-bcm2835-restrict-channels-rate-to-8-960000.patch
@@ -1,7 +1,7 @@
-From 7e634c8f8fe70286e0b8b404494d3143aa7bc3fc Mon Sep 17 00:00:00 2001
+From 435962380099cafba4db3d3806b8e03cbcb0774e Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:42:18 +0100
-Subject: [PATCH 129/170] bcm2835: restrict channels*rate to 8*960000
+Subject: [PATCH 127/232] bcm2835: restrict channels*rate to 8*960000
This is required at least for SPDIF. If the bitrate goes above,
videocore will either resample the audio or corrupt it due to
diff --git a/target/linux/brcm2708/patches-4.4/0130-rpi-update-vc_vchi_audioserv_defs.h.patch b/target/linux/brcm2708/patches-4.4/0128-rpi-update-vc_vchi_audioserv_defs.h.patch
index 63f26aa931..94895524d8 100644
--- a/target/linux/brcm2708/patches-4.4/0130-rpi-update-vc_vchi_audioserv_defs.h.patch
+++ b/target/linux/brcm2708/patches-4.4/0128-rpi-update-vc_vchi_audioserv_defs.h.patch
@@ -1,7 +1,7 @@
-From dcead34f063fc8c37ebfcfc9ab6696060c336bad Mon Sep 17 00:00:00 2001
+From 64fa9f963dffab0145f7960a593422064bb0aa8d Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:42:48 +0100
-Subject: [PATCH 130/170] rpi: update vc_vchi_audioserv_defs.h
+Subject: [PATCH 128/232] rpi: update vc_vchi_audioserv_defs.h
Add audioserv 3 extensions. The changes were taken from the paste
linked here:
diff --git a/target/linux/brcm2708/patches-4.4/0131-bcm2835-implement-channel-map-API.patch b/target/linux/brcm2708/patches-4.4/0129-bcm2835-implement-channel-map-API.patch
index bdcdb8a558..49fd87af8e 100644
--- a/target/linux/brcm2708/patches-4.4/0131-bcm2835-implement-channel-map-API.patch
+++ b/target/linux/brcm2708/patches-4.4/0129-bcm2835-implement-channel-map-API.patch
@@ -1,7 +1,7 @@
-From 7c7d2db494fbf1fd0b014dab0bb4c5c740f90442 Mon Sep 17 00:00:00 2001
+From 5efba3f8c180c39609a8d40033ef92046ef0de75 Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:43:12 +0100
-Subject: [PATCH 131/170] bcm2835: implement channel map API
+Subject: [PATCH 129/232] bcm2835: implement channel map API
Report all layouts supported by the HDMI protocol to userspace.
Make the videocore set the correct layout according to the
diff --git a/target/linux/brcm2708/patches-4.4/0132-bcm2835-access-controls-under-the-audio-mutex.patch b/target/linux/brcm2708/patches-4.4/0130-bcm2835-access-controls-under-the-audio-mutex.patch
index d6d9cf297c..d497240f49 100644
--- a/target/linux/brcm2708/patches-4.4/0132-bcm2835-access-controls-under-the-audio-mutex.patch
+++ b/target/linux/brcm2708/patches-4.4/0130-bcm2835-access-controls-under-the-audio-mutex.patch
@@ -1,7 +1,7 @@
-From 2a64337156d0f84537e04338b2ebd89eb6ec1f09 Mon Sep 17 00:00:00 2001
+From 26e1f66589860cfcc9a6473d705db890e1b8f6c1 Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:43:35 +0100
-Subject: [PATCH 132/170] bcm2835: access controls under the audio mutex
+Subject: [PATCH 130/232] bcm2835: access controls under the audio mutex
I don't think the ALSA framework provides any kind of automatic
synchronization within the control callbacks. We most likely need
diff --git a/target/linux/brcm2708/patches-4.4/0133-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch b/target/linux/brcm2708/patches-4.4/0131-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch
index 72304988ef..76dede73fa 100644
--- a/target/linux/brcm2708/patches-4.4/0133-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch
+++ b/target/linux/brcm2708/patches-4.4/0131-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch
@@ -1,7 +1,7 @@
-From 6e781f631f7e23f7d88256d020d83950c9bf213a Mon Sep 17 00:00:00 2001
+From 06931f74092d86087144f070b06a4444df8b444b Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:44:03 +0100
-Subject: [PATCH 133/170] bcm2835: always use 2/4/8 channels for multichannel
+Subject: [PATCH 131/232] bcm2835: always use 2/4/8 channels for multichannel
layouts
Pad the unused channels with NA. This means userspace needs to write
diff --git a/target/linux/brcm2708/patches-4.4/0134-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch b/target/linux/brcm2708/patches-4.4/0132-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch
index 76a0e01ad1..a7b790694b 100644
--- a/target/linux/brcm2708/patches-4.4/0134-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch
+++ b/target/linux/brcm2708/patches-4.4/0132-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch
@@ -1,7 +1,7 @@
-From aaa2a41f44a0fc141b9a983a5f9f30bb8b6dbc8b Mon Sep 17 00:00:00 2001
+From 5f7049894f47b3836838cd68e29ee883179c80b3 Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:44:24 +0100
-Subject: [PATCH 134/170] bcm2835: only allow stereo if analogue jack is
+Subject: [PATCH 132/232] bcm2835: only allow stereo if analogue jack is
selected
Sending more than 2 channels to videocore while outputting to analogue
diff --git a/target/linux/brcm2708/patches-4.4/0135-bcm2835-interpolate-audio-delay.patch b/target/linux/brcm2708/patches-4.4/0133-bcm2835-interpolate-audio-delay.patch
index 1c1724e3f6..f08364bafe 100644
--- a/target/linux/brcm2708/patches-4.4/0135-bcm2835-interpolate-audio-delay.patch
+++ b/target/linux/brcm2708/patches-4.4/0133-bcm2835-interpolate-audio-delay.patch
@@ -1,7 +1,7 @@
-From 2c967fa0f5b0d10c86c796098574ba09ffe66cd5 Mon Sep 17 00:00:00 2001
+From 83eca613d0eddd2c8299f114b8fe573ccaffdefc Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Wed, 13 Jan 2016 19:44:47 +0100
-Subject: [PATCH 135/170] bcm2835: interpolate audio delay
+Subject: [PATCH 133/232] bcm2835: interpolate audio delay
It appears the GPU only sends us a message all 10ms to update
the playback progress. Other than this, the playback position
diff --git a/target/linux/brcm2708/patches-4.4/0136-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch b/target/linux/brcm2708/patches-4.4/0134-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch
index dbe4bbfe5b..a7317b21c0 100644
--- a/target/linux/brcm2708/patches-4.4/0136-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch
+++ b/target/linux/brcm2708/patches-4.4/0134-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch
@@ -1,7 +1,7 @@
-From 205e27a7f94a5531764cc517ce43623361ca466c Mon Sep 17 00:00:00 2001
+From 22a9a698b6cbce7494ea14dce0e784e098c01ecb Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 19 Jan 2016 17:16:38 +0000
-Subject: [PATCH 136/170] bcm2835-sdhost: Add workaround for odd behaviour on
+Subject: [PATCH 134/232] bcm2835-sdhost: Add workaround for odd behaviour on
some cards
For reasons not understood, the sdhost driver fails when reading
diff --git a/target/linux/brcm2708/patches-4.4/0137-bcm2835-sdhost-Add-debug_flags-dtparam.patch b/target/linux/brcm2708/patches-4.4/0135-bcm2835-sdhost-Add-debug_flags-dtparam.patch
index cb56259066..36c3c50837 100644
--- a/target/linux/brcm2708/patches-4.4/0137-bcm2835-sdhost-Add-debug_flags-dtparam.patch
+++ b/target/linux/brcm2708/patches-4.4/0135-bcm2835-sdhost-Add-debug_flags-dtparam.patch
@@ -1,7 +1,7 @@
-From c5d24cba808118647d01a1869cf1c46d0658d78b Mon Sep 17 00:00:00 2001
+From d038f759d55f39c97e4232851e821b5e4b2fe7a2 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 22 Jan 2016 16:03:24 +0000
-Subject: [PATCH 137/170] bcm2835-sdhost: Add debug_flags dtparam
+Subject: [PATCH 135/232] bcm2835-sdhost: Add debug_flags dtparam
Bit zero disables the single-read-sectors map:
diff --git a/target/linux/brcm2708/patches-4.4/0138-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch b/target/linux/brcm2708/patches-4.4/0136-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch
index 8468f39ce8..6fc78efabc 100644
--- a/target/linux/brcm2708/patches-4.4/0138-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch
+++ b/target/linux/brcm2708/patches-4.4/0136-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch
@@ -1,7 +1,7 @@
-From 1a451a35b70fa9ed32f23a4ba925e5b2c2c3af78 Mon Sep 17 00:00:00 2001
+From 3f4c1f041954c21f9f06c7fe7df3d0e5711667e0 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 25 Jan 2016 09:12:06 +0000
-Subject: [PATCH 138/170] BCM270X_DT: Add sdio_overclock parameter to sdio
+Subject: [PATCH 136/232] BCM270X_DT: Add sdio_overclock parameter to sdio
overlay
The sdio_overclock parameter is like the overclock_50 parameter, i.e.
diff --git a/target/linux/brcm2708/patches-4.4/0139-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch b/target/linux/brcm2708/patches-4.4/0137-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch
index 741cdf57ea..8bdbc78c0d 100644
--- a/target/linux/brcm2708/patches-4.4/0139-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch
+++ b/target/linux/brcm2708/patches-4.4/0137-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch
@@ -1,7 +1,7 @@
-From 49ff16d7af98e6191d6dd60ba75b711612e948ab Mon Sep 17 00:00:00 2001
+From 6f5d0a941a6a084c677a8843207a42f7b6d5a04d Mon Sep 17 00:00:00 2001
From: Michael Lange <linuxstuff@milaw.biz>
Date: Thu, 21 Jan 2016 18:10:16 +0100
-Subject: [PATCH 139/170] rtc: ds1307: add support for the DT property
+Subject: [PATCH 137/232] rtc: ds1307: add support for the DT property
'wakeup-source'
For RTC chips with no IRQ directly connected to the SoC, the RTC chip
diff --git a/target/linux/brcm2708/patches-4.4/0140-dt-overlay-add-wittypi-overlay.dts.patch b/target/linux/brcm2708/patches-4.4/0138-dt-overlay-add-wittypi-overlay.dts.patch
index b740c826f1..9faed43ce5 100644
--- a/target/linux/brcm2708/patches-4.4/0140-dt-overlay-add-wittypi-overlay.dts.patch
+++ b/target/linux/brcm2708/patches-4.4/0138-dt-overlay-add-wittypi-overlay.dts.patch
@@ -1,7 +1,7 @@
-From e382e888be3f59b0ba3645809ae686947313e0c1 Mon Sep 17 00:00:00 2001
+From 873bf69f1f6bf19f2a0c4cec884cb952b2a19e0c Mon Sep 17 00:00:00 2001
From: vitalogy <vitalogy_github@milaw.biz>
Date: Tue, 19 Jan 2016 07:02:02 +0100
-Subject: [PATCH 140/170] dt-overlay: add wittypi-overlay.dts
+Subject: [PATCH 138/232] dt-overlay: add wittypi-overlay.dts
---
arch/arm/boot/dts/overlays/wittypi-overlay.dts | 44 ++++++++++++++++++++++++++
diff --git a/target/linux/brcm2708/patches-4.4/0142-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch b/target/linux/brcm2708/patches-4.4/0139-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch
index b3ce9719ac..aa04f1bcbe 100644
--- a/target/linux/brcm2708/patches-4.4/0142-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch
+++ b/target/linux/brcm2708/patches-4.4/0139-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch
@@ -1,7 +1,7 @@
-From 7519a79f61a67792e238a118db58600fb5f60ec8 Mon Sep 17 00:00:00 2001
+From c74fc12557305b66537dc6e8ed3ab5d27c507de0 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 19 Jan 2016 16:28:05 +0000
-Subject: [PATCH 142/170] FIXUP i2c_bcm2708: Don't change module baudrate
+Subject: [PATCH 139/232] FIXUP i2c_bcm2708: Don't change module baudrate
parameter
Overwriting the baudrate module parameter creates an apparent
diff --git a/target/linux/brcm2708/patches-4.4/0143-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch b/target/linux/brcm2708/patches-4.4/0140-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch
index 646bb27845..765dbc5586 100644
--- a/target/linux/brcm2708/patches-4.4/0143-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch
+++ b/target/linux/brcm2708/patches-4.4/0140-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch
@@ -1,7 +1,7 @@
-From f2d36d57d7e17b9f44ff914824df5b150eb9e3bd Mon Sep 17 00:00:00 2001
+From 4593191b7df9439c295a93250a1f1d68d0938822 Mon Sep 17 00:00:00 2001
From: Digital Dreamtime <clive.messer@digitaldreamtime.co.uk>
Date: Thu, 4 Feb 2016 14:14:44 +0000
-Subject: [PATCH 143/170] Allow up to 24dB digital gain to be applied when
+Subject: [PATCH 140/232] Allow up to 24dB digital gain to be applied when
using IQAudIO DAC+
24db_digital_gain DT param can be used to specify that PCM512x
diff --git a/target/linux/brcm2708/patches-4.4/0141-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-Pi2.patch b/target/linux/brcm2708/patches-4.4/0141-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-Pi2.patch
deleted file mode 100644
index b06b4786ce..0000000000
--- a/target/linux/brcm2708/patches-4.4/0141-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-Pi2.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 6dcfc3daab7c1c459b36261163b4e1dc15a6e965 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 3 Feb 2016 16:12:54 +0000
-Subject: [PATCH 141/170] BCM270X_DT: Disable DMA for bcm2835-sdhost on Pi2
-
-This is an interim patch to verify that problems seen with
-some cards can be worked around at the expense of an increased
-CPU load by forcing PIO mode.
-
-Although this could have used the brcm,force-pio attribute, that
-is a boolean (true if present, false if absent) and attributes
-can't be deleted by overlays. Instead, make brcm,pio-limit
-unfeasibly high instead to allow DMA to be re-enabled using the
-pio_limit parameter of the sdhost or sdtweak overlays.
----
- arch/arm/boot/dts/bcm2709-rpi-2-b.dts | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
-+++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
-@@ -43,6 +43,7 @@
- pinctrl-names = "default";
- pinctrl-0 = <&sdhost_pins>;
- bus-width = <4>;
-+ brcm,pio-limit = <0x7fffffff>;
- status = "okay";
- };
-
diff --git a/target/linux/brcm2708/patches-4.4/0144-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch b/target/linux/brcm2708/patches-4.4/0141-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch
index 1633cfe6ed..cc28de89cb 100644
--- a/target/linux/brcm2708/patches-4.4/0144-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch
+++ b/target/linux/brcm2708/patches-4.4/0141-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch
@@ -1,7 +1,7 @@
-From 8a189f18de820c6facd00ba2db97ba7c4a75156f Mon Sep 17 00:00:00 2001
+From 6fda328fc5613d449641ad6701fe8180e70ec338 Mon Sep 17 00:00:00 2001
From: Digital Dreamtime <clive.messer@digitaldreamtime.co.uk>
Date: Thu, 4 Feb 2016 20:04:00 +0000
-Subject: [PATCH 144/170] Limit PCM512x "Digital" gain to 0dB by default with
+Subject: [PATCH 141/232] Limit PCM512x "Digital" gain to 0dB by default with
HiFiBerry DAC+
24db_digital_gain DT param can be used to specify that PCM512x
diff --git a/target/linux/brcm2708/patches-4.4/0145-BCM270X_DT-Adjust-overlay-README-formatting.patch b/target/linux/brcm2708/patches-4.4/0142-BCM270X_DT-Adjust-overlay-README-formatting.patch
index 24084e5f48..a9687a7c37 100644
--- a/target/linux/brcm2708/patches-4.4/0145-BCM270X_DT-Adjust-overlay-README-formatting.patch
+++ b/target/linux/brcm2708/patches-4.4/0142-BCM270X_DT-Adjust-overlay-README-formatting.patch
@@ -1,11 +1,11 @@
-From 14ba431031afa218c0db43a7c20fe54916f8d357 Mon Sep 17 00:00:00 2001
+From 1b3fd5b03546474795b7557a04c7c3c5cf162ecb Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 8 Feb 2016 09:46:33 +0000
-Subject: [PATCH 145/170] BCM270X_DT: Adjust overlay README formatting
+Subject: [PATCH 142/232] BCM270X_DT: Adjust overlay README formatting
---
- arch/arm/boot/dts/overlays/README | 420 +++++++++++++++++++-------------------
- 1 file changed, 210 insertions(+), 210 deletions(-)
+ arch/arm/boot/dts/overlays/README | 414 +++++++++++++++++++-------------------
+ 1 file changed, 207 insertions(+), 207 deletions(-)
--- a/arch/arm/boot/dts/overlays/README
+++ b/arch/arm/boot/dts/overlays/README
@@ -522,12 +522,8 @@ Subject: [PATCH 145/170] BCM270X_DT: Adjust overlay README formatting
Name: pwm
-@@ -550,12 +550,12 @@ Info: Configures a single PWM channel
- Pins 12 and 13 might be better choices on an A+, B+ or Pi2.
- 2) The onboard analogue audio output uses both PWM channels.
- 3) So be careful mixing audio and PWM.
-- 4) Currently the clock must have been enabled and configured
-+ 4) Currently the clockmust have been enabled and configured
+@@ -553,9 +553,9 @@ Info: Configures a single PWM channel
+ 4) Currently the clock must have been enabled and configured
by other means.
Load: dtoverlay=pwm,<param>=<val>
-Params: pin Output pin (default 18) - see table
@@ -539,12 +535,8 @@ Subject: [PATCH 145/170] BCM270X_DT: Adjust overlay README formatting
Name: pwm-2chan
-@@ -569,14 +569,14 @@ Info: Configures both PWM channels
- Pins 12 and 13 might be better choices on an A+, B+ or Pi2.
- 2) The onboard analogue audio output uses both PWM channels.
- 3) So be careful mixing audio and PWM.
-- 4) Currently the clock must have been enabled and configured
-+ 4) Currently the clockmust have been enabled and configured
+@@ -572,11 +572,11 @@ Info: Configures both PWM channels
+ 4) Currently the clock must have been enabled and configured
by other means.
Load: dtoverlay=pwm-2chan,<param>=<val>
-Params: pin Output pin (default 18) - see table
@@ -705,15 +697,6 @@ Subject: [PATCH 145/170] BCM270X_DT: Adjust overlay README formatting
Name: vc4-kms-v3d
-@@ -753,7 +753,7 @@ Params: <None>
-
- Name: vga666
- Info: Overlay for the Fen Logic VGA666 board
-- This uses GPIOs 2-21 (so no I2C), and activates the output 2-3 seconds
-+ This uses GPIOs 2-21 (sono I2C), and activates the output 2-3 seconds
- after the kernel has started.
- Load: dtoverlay=vga666
- Params: <None>
@@ -763,22 +763,22 @@ Name: w1-gpio
Info: Configures the w1-gpio Onewire interface module.
Use this overlay if you *don't* need a GPIO to drive an external pullup.
diff --git a/target/linux/brcm2708/patches-4.4/0143-pinctrl-bcm2835-Fix-cut-and-paste-error-in-pull-pars.patch b/target/linux/brcm2708/patches-4.4/0143-pinctrl-bcm2835-Fix-cut-and-paste-error-in-pull-pars.patch
new file mode 100644
index 0000000000..5747eff99d
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0143-pinctrl-bcm2835-Fix-cut-and-paste-error-in-pull-pars.patch
@@ -0,0 +1,25 @@
+From 5e3168449aa5a105df7043bfeb425b4dd929dea6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 9 Feb 2016 09:52:13 +0000
+Subject: [PATCH 143/232] pinctrl-bcm2835: Fix cut-and-paste error in "pull"
+ parsing
+
+The DT bindings for pinctrl-bcm2835 allow both the function and pull
+to contain either one entry or one per pin. However, an error in the
+DT parsing can cause failures if the number of pulls differs from the
+number of functions.
+---
+ drivers/pinctrl/bcm/pinctrl-bcm2835.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+@@ -802,7 +802,7 @@ static int bcm2835_pctl_dt_node_to_map(s
+ }
+ if (num_pulls) {
+ err = of_property_read_u32_index(np, "brcm,pull",
+- (num_funcs > 1) ? i : 0, &pull);
++ (num_pulls > 1) ? i : 0, &pull);
+ if (err)
+ goto out;
+ err = bcm2835_pctl_dt_node_to_map_pull(pc, np, pin,
diff --git a/target/linux/brcm2708/patches-4.4/0149-bcm2835-sdhost-Major-revision.patch b/target/linux/brcm2708/patches-4.4/0144-bcm2835-sdhost-Major-revision.patch
index c7772cbc0c..b67a279551 100644
--- a/target/linux/brcm2708/patches-4.4/0149-bcm2835-sdhost-Major-revision.patch
+++ b/target/linux/brcm2708/patches-4.4/0144-bcm2835-sdhost-Major-revision.patch
@@ -1,7 +1,7 @@
-From 5a117bd925d13a305d94eeb28919dedeaa9be17d Mon Sep 17 00:00:00 2001
+From 60425f3b85682fa3378cb6aeecce15a50384b7e2 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 11 Feb 2016 16:51:01 +0000
-Subject: [PATCH 149/170] bcm2835-sdhost: Major revision
+Subject: [PATCH 144/232] bcm2835-sdhost: Major revision
This is a significant revision of the bcm2835-sdhost driver. It
improves on the original in a number of ways:
diff --git a/target/linux/brcm2708/patches-4.4/0150-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch b/target/linux/brcm2708/patches-4.4/0145-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch
index f4f3d6cc5f..c3a0816a87 100644
--- a/target/linux/brcm2708/patches-4.4/0150-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch
+++ b/target/linux/brcm2708/patches-4.4/0145-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch
@@ -1,7 +1,7 @@
-From d15e041e838bd735a7ed3eaa5dbff785213baf6d Mon Sep 17 00:00:00 2001
+From 177ef127e03243ede5b1b00032d5f9fdce94673b Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 12 Feb 2016 15:38:00 +0000
-Subject: [PATCH 150/170] BCM270X_DT: Add dtparams for the SD interface
+Subject: [PATCH 145/232] BCM270X_DT: Add dtparams for the SD interface
Add new base dtparams sd_overclock, sd_force_pio, sd_pio_limit
and sd_debug.
diff --git a/target/linux/brcm2708/patches-4.4/0146-FIXUP-Overlay-README-Restore-spaces-deleted-in-error.patch b/target/linux/brcm2708/patches-4.4/0146-FIXUP-Overlay-README-Restore-spaces-deleted-in-error.patch
deleted file mode 100644
index 70a9fc7718..0000000000
--- a/target/linux/brcm2708/patches-4.4/0146-FIXUP-Overlay-README-Restore-spaces-deleted-in-error.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From d32795d2be55748552ddacd9b1e47efc61264a98 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Mon, 8 Feb 2016 12:53:44 +0000
-Subject: [PATCH 146/170] FIXUP: Overlay README - Restore spaces deleted in
- error
-
----
- arch/arm/boot/dts/overlays/README | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -550,7 +550,7 @@ Info: Configures a single PWM channel
- Pins 12 and 13 might be better choices on an A+, B+ or Pi2.
- 2) The onboard analogue audio output uses both PWM channels.
- 3) So be careful mixing audio and PWM.
-- 4) Currently the clockmust have been enabled and configured
-+ 4) Currently the clock must have been enabled and configured
- by other means.
- Load: dtoverlay=pwm,<param>=<val>
- Params: pin Output pin (default 18) - see table
-@@ -569,7 +569,7 @@ Info: Configures both PWM channels
- Pins 12 and 13 might be better choices on an A+, B+ or Pi2.
- 2) The onboard analogue audio output uses both PWM channels.
- 3) So be careful mixing audio and PWM.
-- 4) Currently the clockmust have been enabled and configured
-+ 4) Currently the clock must have been enabled and configured
- by other means.
- Load: dtoverlay=pwm-2chan,<param>=<val>
- Params: pin Output pin (default 18) - see table
-@@ -753,7 +753,7 @@ Params: <None>
-
- Name: vga666
- Info: Overlay for the Fen Logic VGA666 board
-- This uses GPIOs 2-21 (sono I2C), and activates the output 2-3 seconds
-+ This uses GPIOs 2-21 (so no I2C), and activates the output 2-3 seconds
- after the kernel has started.
- Load: dtoverlay=vga666
- Params: <None>
diff --git a/target/linux/brcm2708/patches-4.4/0151-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch b/target/linux/brcm2708/patches-4.4/0146-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch
index 203e97b8e9..519264bb0f 100644
--- a/target/linux/brcm2708/patches-4.4/0151-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch
+++ b/target/linux/brcm2708/patches-4.4/0146-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch
@@ -1,7 +1,7 @@
-From bc7400cadff6bf33451b124eac2e8bf80ebb0197 Mon Sep 17 00:00:00 2001
+From 63ff907f6e6ab3b93535dc2b5251b7b41eaf7ec2 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Fri, 12 Feb 2016 14:50:25 +0000
-Subject: [PATCH 151/170] dcw_otg: trim xfer length when buffer larger than
+Subject: [PATCH 146/232] dcw_otg: trim xfer length when buffer larger than
allocated size is received
---
diff --git a/target/linux/brcm2708/patches-4.4/0152-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch b/target/linux/brcm2708/patches-4.4/0147-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch
index 48aca151dc..dd41138d1d 100644
--- a/target/linux/brcm2708/patches-4.4/0152-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch
+++ b/target/linux/brcm2708/patches-4.4/0147-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch
@@ -1,7 +1,7 @@
-From f395ff998f2bde846499b1a0ef84519989dc2d4e Mon Sep 17 00:00:00 2001
+From ebb44753d0310c6adb03a9b448a4038c3e37e6e0 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 15 Feb 2016 10:00:27 +0000
-Subject: [PATCH 152/170] bcm2835-sdhost: Restore ATOMIC flag to PIO sg mapping
+Subject: [PATCH 147/232] bcm2835-sdhost: Restore ATOMIC flag to PIO sg mapping
Allocation problems have been seen in a wireless driver, and
this is the only change which might have been responsible.
diff --git a/target/linux/brcm2708/patches-4.4/0148-Revert-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-.patch b/target/linux/brcm2708/patches-4.4/0148-Revert-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-.patch
deleted file mode 100644
index e71eda57b4..0000000000
--- a/target/linux/brcm2708/patches-4.4/0148-Revert-BCM270X_DT-Disable-DMA-for-bcm2835-sdhost-on-.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-From 14e35b8cca5bf1f6223ebc6cc4d527645076a3a3 Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Thu, 11 Feb 2016 17:30:49 +0000
-Subject: [PATCH 148/170] Revert "BCM270X_DT: Disable DMA for bcm2835-sdhost on
- Pi2"
-
-This reverts commit 9c1adcc07a40f762fd4ac580f07646784de135e1.
----
- arch/arm/boot/dts/bcm2709-rpi-2-b.dts | 1 -
- 1 file changed, 1 deletion(-)
-
---- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
-+++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
-@@ -43,7 +43,6 @@
- pinctrl-names = "default";
- pinctrl-0 = <&sdhost_pins>;
- bus-width = <4>;
-- brcm,pio-limit = <0x7fffffff>;
- status = "okay";
- };
-
diff --git a/target/linux/brcm2708/patches-4.4/0154-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch b/target/linux/brcm2708/patches-4.4/0148-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch
index 058725d10b..a87c94bc80 100644
--- a/target/linux/brcm2708/patches-4.4/0154-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch
+++ b/target/linux/brcm2708/patches-4.4/0148-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch
@@ -1,7 +1,7 @@
-From ee83592659ae5dc5ceee63790a8cba57ebfa57b3 Mon Sep 17 00:00:00 2001
+From 55e8519aa4c86b37f1933e8e53c6e97372d61871 Mon Sep 17 00:00:00 2001
From: Craig Roberts <cjr@craigroberts.net>
Date: Tue, 16 Feb 2016 10:03:42 +0000
-Subject: [PATCH 154/170] Updated smsc95xx driver to check for a valid MAC
+Subject: [PATCH 148/232] Updated smsc95xx driver to check for a valid MAC
address in eeprom before using smsc95xx.macaddr parameter passed on command
line.
diff --git a/target/linux/brcm2708/patches-4.4/0155-dcw_otg-Make-trimming-messages-less-noisy.patch b/target/linux/brcm2708/patches-4.4/0149-dcw_otg-Make-trimming-messages-less-noisy.patch
index ef188f1c66..e689d4016e 100644
--- a/target/linux/brcm2708/patches-4.4/0155-dcw_otg-Make-trimming-messages-less-noisy.patch
+++ b/target/linux/brcm2708/patches-4.4/0149-dcw_otg-Make-trimming-messages-less-noisy.patch
@@ -1,7 +1,7 @@
-From 1c43ff69763f4537b76b3248850256da2bda211b Mon Sep 17 00:00:00 2001
+From 3f4cd273dcc578b48783a23fb2cbef50e7fd151d Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 17 Feb 2016 19:02:31 +0000
-Subject: [PATCH 155/170] dcw_otg: Make trimming messages less noisy
+Subject: [PATCH 149/232] dcw_otg: Make trimming messages less noisy
---
drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 6 ++++--
diff --git a/target/linux/brcm2708/patches-4.4/0156-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch b/target/linux/brcm2708/patches-4.4/0150-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch
index 9338280595..4e150a1a16 100644
--- a/target/linux/brcm2708/patches-4.4/0156-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch
+++ b/target/linux/brcm2708/patches-4.4/0150-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch
@@ -1,7 +1,7 @@
-From 7f9781f9875f2aa638d5afdaa9709fa1ef9bda8d Mon Sep 17 00:00:00 2001
+From f7f0e8b831ae66fc19c1f9457975d0f8b31ea601 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 18 Feb 2016 15:28:14 +0000
-Subject: [PATCH 156/170] BCM270X_DT: at86rf233 overlay - drop to 3MHz
+Subject: [PATCH 150/232] BCM270X_DT: at86rf233 overlay - drop to 3MHz
The consensus is that 6MHz is too fast, but that 3MHz is OK.
diff --git a/target/linux/brcm2708/patches-4.4/0157-bcm2835-sdhost-Downgrade-log-message-status.patch b/target/linux/brcm2708/patches-4.4/0151-bcm2835-sdhost-Downgrade-log-message-status.patch
index 6654a0c0d0..fdb8cb8387 100644
--- a/target/linux/brcm2708/patches-4.4/0157-bcm2835-sdhost-Downgrade-log-message-status.patch
+++ b/target/linux/brcm2708/patches-4.4/0151-bcm2835-sdhost-Downgrade-log-message-status.patch
@@ -1,7 +1,7 @@
-From 5af831a3f879c89c8c0b39c8f88e7600bdc3a765 Mon Sep 17 00:00:00 2001
+From 76667f779c11557d7ebc84130619c25f3c1642af Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 19 Feb 2016 12:04:48 +0000
-Subject: [PATCH 157/170] bcm2835-sdhost: Downgrade log message status
+Subject: [PATCH 151/232] bcm2835-sdhost: Downgrade log message status
---
drivers/mmc/host/bcm2835-sdhost.c | 4 ++--
diff --git a/target/linux/brcm2708/patches-4.4/0158-config-Enable-HCI-over-UARTs.patch b/target/linux/brcm2708/patches-4.4/0152-config-Enable-HCI-over-UARTs.patch
index c55ff17b7d..9390c357a9 100644
--- a/target/linux/brcm2708/patches-4.4/0158-config-Enable-HCI-over-UARTs.patch
+++ b/target/linux/brcm2708/patches-4.4/0152-config-Enable-HCI-over-UARTs.patch
@@ -1,7 +1,7 @@
-From e08f6b3aad073d8130d2ec0f8398f55983c0eac8 Mon Sep 17 00:00:00 2001
+From ab8cd307467682fa1df2bfadeb3ac88c086f861c Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Fri, 15 Jan 2016 16:48:27 +0000
-Subject: [PATCH 158/170] config: Enable HCI over UARTs
+Subject: [PATCH 152/232] config: Enable HCI over UARTs
---
arch/arm/configs/bcm2709_defconfig | 3 +++
diff --git a/target/linux/brcm2708/patches-4.4/0153-Revert-Add-blk_pos-parameter-to-mmc-multi_io_quirk-c.patch b/target/linux/brcm2708/patches-4.4/0153-Revert-Add-blk_pos-parameter-to-mmc-multi_io_quirk-c.patch
deleted file mode 100644
index 1554f8a9b5..0000000000
--- a/target/linux/brcm2708/patches-4.4/0153-Revert-Add-blk_pos-parameter-to-mmc-multi_io_quirk-c.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From d2943c4ee1c52cb2c9802be194ca90442e4fe34f Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Tue, 16 Feb 2016 08:47:56 +0000
-Subject: [PATCH 153/170] Revert "Add blk_pos parameter to mmc multi_io_quirk
- callback"
-
-This reverts commit aab95f9b10e8c3d32de2bf163b86f220c88214fe.
-
-The bcm2835-sdhost driver no longer needs this patch.
----
- drivers/mmc/card/block.c | 1 -
- drivers/mmc/host/omap_hsmmc.c | 4 +---
- drivers/mmc/host/sh_mobile_sdhi.c | 4 +---
- drivers/mmc/host/tmio_mmc_pio.c | 4 +---
- include/linux/mmc/host.h | 4 +---
- 5 files changed, 4 insertions(+), 13 deletions(-)
-
---- a/drivers/mmc/card/block.c
-+++ b/drivers/mmc/card/block.c
-@@ -1518,7 +1518,6 @@ static void mmc_blk_rw_rq_prep(struct mm
- brq->data.blocks = card->host->ops->multi_io_quirk(card,
- (rq_data_dir(req) == READ) ?
- MMC_DATA_READ : MMC_DATA_WRITE,
-- blk_rq_pos(req),
- brq->data.blocks);
- }
-
---- a/drivers/mmc/host/omap_hsmmc.c
-+++ b/drivers/mmc/host/omap_hsmmc.c
-@@ -1832,9 +1832,7 @@ static void omap_hsmmc_conf_bus_power(st
- }
-
- static int omap_hsmmc_multi_io_quirk(struct mmc_card *card,
-- unsigned int direction,
-- u32 blk_pos,
-- int blk_size)
-+ unsigned int direction, int blk_size)
- {
- /* This controller can't do multiblock reads due to hw bugs */
- if (direction == MMC_DATA_READ)
---- a/drivers/mmc/host/sh_mobile_sdhi.c
-+++ b/drivers/mmc/host/sh_mobile_sdhi.c
-@@ -170,9 +170,7 @@ static int sh_mobile_sdhi_write16_hook(s
- }
-
- static int sh_mobile_sdhi_multi_io_quirk(struct mmc_card *card,
-- unsigned int direction,
-- u32 blk_pos,
-- int blk_size)
-+ unsigned int direction, int blk_size)
- {
- /*
- * In Renesas controllers, when performing a
---- a/drivers/mmc/host/tmio_mmc_pio.c
-+++ b/drivers/mmc/host/tmio_mmc_pio.c
-@@ -1003,9 +1003,7 @@ static int tmio_mmc_get_ro(struct mmc_ho
- }
-
- static int tmio_multi_io_quirk(struct mmc_card *card,
-- unsigned int direction,
-- u32 blk_pos,
-- int blk_size)
-+ unsigned int direction, int blk_size)
- {
- struct tmio_mmc_host *host = mmc_priv(card->host);
-
---- a/include/linux/mmc/host.h
-+++ b/include/linux/mmc/host.h
-@@ -143,9 +143,7 @@ struct mmc_host_ops {
- * I/O. Returns the number of supported blocks for the request.
- */
- int (*multi_io_quirk)(struct mmc_card *card,
-- unsigned int direction,
-- u32 blk_pos,
-- int blk_size);
-+ unsigned int direction, int blk_size);
- };
-
- struct mmc_card;
diff --git a/target/linux/brcm2708/patches-4.4/0159-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch b/target/linux/brcm2708/patches-4.4/0153-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch
index 70e424b21a..8de4bec792 100644
--- a/target/linux/brcm2708/patches-4.4/0159-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch
+++ b/target/linux/brcm2708/patches-4.4/0153-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch
@@ -1,7 +1,7 @@
-From 20c4c47bca3674d746518b1cca1e066e46b52900 Mon Sep 17 00:00:00 2001
+From 85dc4378167d99218df01bb0512a4def9710a0a5 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 17 Dec 2015 13:37:07 +0000
-Subject: [PATCH 159/170] hci_h5: Don't send conf_req when ACTIVE
+Subject: [PATCH 153/232] hci_h5: Don't send conf_req when ACTIVE
Without this patch, a modem and kernel can continuously bombard each
other with conf_req and conf_rsp messages, in a demented game of tag.
diff --git a/target/linux/brcm2708/patches-4.4/0160-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch b/target/linux/brcm2708/patches-4.4/0154-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch
index 344fbd9103..3b2b1e2c45 100644
--- a/target/linux/brcm2708/patches-4.4/0160-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch
+++ b/target/linux/brcm2708/patches-4.4/0154-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch
@@ -1,7 +1,7 @@
-From 00dba6ec2ac004fc17075febd4504646eb3dc543 Mon Sep 17 00:00:00 2001
+From e9950fa4e93333baad36537cc46121cc7cecf455 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 23 Feb 2016 17:26:48 +0000
-Subject: [PATCH 160/170] amba_pl011: Don't use DT aliases for numbering
+Subject: [PATCH 154/232] amba_pl011: Don't use DT aliases for numbering
The pl011 driver looks for DT aliases of the form "serial<n>",
and if found uses <n> as the device ID. This can cause
diff --git a/target/linux/brcm2708/patches-4.4/0161-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch b/target/linux/brcm2708/patches-4.4/0155-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch
index 1bee99e79b..24c0ccabe6 100644
--- a/target/linux/brcm2708/patches-4.4/0161-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch
+++ b/target/linux/brcm2708/patches-4.4/0155-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch
@@ -1,7 +1,7 @@
-From 95136c932ac4433a6a50d394817812f8eb2cc914 Mon Sep 17 00:00:00 2001
+From 0316ebbf545738333e188197d196b618c17b171e Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Tue, 15 Dec 2015 15:35:57 -0800
-Subject: [PATCH 161/170] clk: bcm2835: Add bindings for the auxiliary
+Subject: [PATCH 155/232] clk: bcm2835: Add bindings for the auxiliary
peripheral clock gates.
These will be used for enabling UART1, SPI1, and SPI2.
diff --git a/target/linux/brcm2708/patches-4.4/0162-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch b/target/linux/brcm2708/patches-4.4/0156-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch
index 3e9667a900..4518af1a28 100644
--- a/target/linux/brcm2708/patches-4.4/0162-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch
+++ b/target/linux/brcm2708/patches-4.4/0156-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch
@@ -1,7 +1,7 @@
-From 924276b92ff47f0e778a9405d00637be4ca88736 Mon Sep 17 00:00:00 2001
+From cfe1737d9aab03ecd152291df704606a7724eb21 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Tue, 15 Dec 2015 15:35:58 -0800
-Subject: [PATCH 162/170] clk: bcm2835: Add a driver for the auxiliary
+Subject: [PATCH 156/232] clk: bcm2835: Add a driver for the auxiliary
peripheral clock gates.
There are a pair of SPI masters and a mini UART that were last minute
diff --git a/target/linux/brcm2708/patches-4.4/0163-Aux-SPI-1-2-implementation.patch b/target/linux/brcm2708/patches-4.4/0157-Aux-SPI-1-2-implementation.patch
index c47f3bd5b1..54a9fefb69 100644
--- a/target/linux/brcm2708/patches-4.4/0163-Aux-SPI-1-2-implementation.patch
+++ b/target/linux/brcm2708/patches-4.4/0157-Aux-SPI-1-2-implementation.patch
@@ -1,7 +1,7 @@
-From 43477e669f736f6da34afbd8a96683b239b1fd1f Mon Sep 17 00:00:00 2001
+From 2cf8e02af4645b90aa63f8cdbd0cb4403e2bee8f Mon Sep 17 00:00:00 2001
From: Fraser <github@frasersdev.net>
Date: Tue, 23 Feb 2016 10:04:37 +1100
-Subject: [PATCH 163/170] Aux SPI 1&2 implementation
+Subject: [PATCH 157/232] Aux SPI 1&2 implementation
Adds aux spi 1 & 2 devices to compatible raspberry PIs.
* Minor config of the driver build environment to ensure they get built
diff --git a/target/linux/brcm2708/patches-4.4/0164-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch b/target/linux/brcm2708/patches-4.4/0158-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch
index 0a68d3c881..d43c8ef31a 100644
--- a/target/linux/brcm2708/patches-4.4/0164-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch
+++ b/target/linux/brcm2708/patches-4.4/0158-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch
@@ -1,7 +1,7 @@
-From 84c2e063885bb0ae3d5d2ad2e24e7a2bdb5729ae Mon Sep 17 00:00:00 2001
+From 29c79ce79c70db703a4621ecc7d24208ca991981 Mon Sep 17 00:00:00 2001
From: Matthias Reichl <hias@horus.com>
Date: Tue, 23 Feb 2016 17:28:23 +0100
-Subject: [PATCH 164/170] ASoC: bcm: add missing .owner fields in sound card
+Subject: [PATCH 158/232] ASoC: bcm: add missing .owner fields in sound card
drivers
If snd_soc_card.owner is not set the kernel won't do usage refcounting
diff --git a/target/linux/brcm2708/patches-4.4/0165-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch b/target/linux/brcm2708/patches-4.4/0159-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch
index 81ac7cb9db..7518c65bfc 100644
--- a/target/linux/brcm2708/patches-4.4/0165-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch
+++ b/target/linux/brcm2708/patches-4.4/0159-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch
@@ -1,7 +1,7 @@
-From 18674a7da1c3d50d9c957a8f88aaea2aa653d223 Mon Sep 17 00:00:00 2001
+From edd0a6e9b22c8edad94b9e8a6ca370912fbeb642 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Wed, 20 Jan 2016 17:50:09 +0000
-Subject: [PATCH 165/170] smsx95xx: Add option to disable the crimes against
+Subject: [PATCH 159/232] smsx95xx: Add option to disable the crimes against
truesize fix
It may improve iperf numbers on Pi 1, but may generate dmesg warnings and possibly cause network issues
diff --git a/target/linux/brcm2708/patches-4.4/0166-bcm2835-virtgpio-Virtual-GPIO-driver.patch b/target/linux/brcm2708/patches-4.4/0160-bcm2835-virtgpio-Virtual-GPIO-driver.patch
index 428c253c8d..19f73972a3 100644
--- a/target/linux/brcm2708/patches-4.4/0166-bcm2835-virtgpio-Virtual-GPIO-driver.patch
+++ b/target/linux/brcm2708/patches-4.4/0160-bcm2835-virtgpio-Virtual-GPIO-driver.patch
@@ -1,7 +1,7 @@
-From 5e3c3e845f998f86c2f22017576cb19e5d7fe9bb Mon Sep 17 00:00:00 2001
+From e1024a4269e314d45522f24b0ac86c77675e7909 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Tue, 23 Feb 2016 19:56:04 +0000
-Subject: [PATCH 166/170] bcm2835-virtgpio: Virtual GPIO driver
+Subject: [PATCH 160/232] bcm2835-virtgpio: Virtual GPIO driver
Add a virtual GPIO driver that uses the firmware mailbox interface to
request that the VPU toggles LEDs.
diff --git a/target/linux/brcm2708/patches-4.4/0167-BCM270X_DT-Add-Pi3-support.patch b/target/linux/brcm2708/patches-4.4/0161-BCM270X_DT-Add-Pi3-support.patch
index dc11b76825..6f38349396 100644
--- a/target/linux/brcm2708/patches-4.4/0167-BCM270X_DT-Add-Pi3-support.patch
+++ b/target/linux/brcm2708/patches-4.4/0161-BCM270X_DT-Add-Pi3-support.patch
@@ -1,13 +1,13 @@
-From 6aa2c847f76f21c830544e8c79f9030a170ef475 Mon Sep 17 00:00:00 2001
+From 4aa902b37606ca425a2d1dedd400347b11a0e61d Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Thu, 21 Jan 2016 17:57:49 +0000
-Subject: [PATCH 167/170] BCM270X_DT: Add Pi3 support
+Subject: [PATCH 161/232] BCM270X_DT: Add Pi3 support
---
arch/arm/boot/dts/Makefile | 1 +
- arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 174 ++++++++++++++++++++++++++++++++++
- arch/arm/boot/dts/bcm2710.dtsi | 102 ++++++++++++++++++++
- 3 files changed, 277 insertions(+)
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 192 ++++++++++++++++++++++++++++++++++
+ arch/arm/boot/dts/bcm2710.dtsi | 102 ++++++++++++++++++
+ 3 files changed, 295 insertions(+)
create mode 100644 arch/arm/boot/dts/bcm2710-rpi-3-b.dts
create mode 100644 arch/arm/boot/dts/bcm2710.dtsi
@@ -23,7 +23,7 @@ Subject: [PATCH 167/170] BCM270X_DT: Add Pi3 support
ifeq ($(CONFIG_ARCH_BCM2708),y)
--- /dev/null
+++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
-@@ -0,0 +1,174 @@
+@@ -0,0 +1,192 @@
+/dts-v1/;
+
+#include "bcm2710.dtsi"
@@ -71,16 +71,21 @@ Subject: [PATCH 167/170] BCM270X_DT: Add Pi3 support
+ };
+
+ bt_pins: bt_pins {
-+ brcm,pins = <28 29 30 31 14 15 43>;
-+ brcm,function = <6 6 6 6 2 2 4>;
-+ // alt2:PCM alt5:UART1 alt0:GPCLK2
-+ brcm,pull = <0 0 0 0 0 2 0>;
++ brcm,pins = <28 29 30 31 43>;
++ brcm,function = <6 6 6 6 4>; /* alt2:PCM alt0:GPCLK2 */
++ brcm,pull = <0 0 0 0 0>;
+ };
+
-+ uart1_pins: uart1_pins {
++ uart0_pins: uart0_pins {
+ brcm,pins = <32 33>;
+ brcm,function = <7>; /* alt3=UART0 */
-+ brcm,pull = <0>;
++ brcm,pull = <0 0>;
++ };
++
++ uart1_pins: uart1_pins {
++ brcm,pins = <14 15>;
++ brcm,function = <2>; /* alt5=UART1 */
++ brcm,pull = <0 0>;
+ };
+};
+
@@ -97,6 +102,17 @@ Subject: [PATCH 167/170] BCM270X_DT: Add Pi3 support
+ non-removable;
+ bus-width = <4>;
+ status = "okay";
++ brcm,overclock-50 = <0>;
++};
++
++&soc {
++ virtgpio: virtgpio {
++ compatible = "brcm,bcm2835-virtgpio";
++ gpio-controller;
++ #gpio-cells = <2>;
++ firmware = <&firmware>;
++ status = "okay";
++ };
+};
+
+&fb {
@@ -104,12 +120,14 @@ Subject: [PATCH 167/170] BCM270X_DT: Add Pi3 support
+};
+
+&uart0 {
++ pinctrl-names = "default";
++ pinctrl-0 = <&uart0_pins &bt_pins>;
+ status = "okay";
+};
+
+&uart1 {
+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart1_pins &bt_pins>;
++ pinctrl-0 = <&uart1_pins>;
+ status = "okay";
+};
+
@@ -165,7 +183,7 @@ Subject: [PATCH 167/170] BCM270X_DT: Add Pi3 support
+ act_led: act {
+ label = "led0";
+ linux,default-trigger = "mmc0";
-+ gpios = <&gpio 47 0>;
++ gpios = <&virtgpio 0 0>;
+ };
+};
+
diff --git a/target/linux/brcm2708/patches-4.4/0169-DT-Add-overlays-to-configure-I2C-pins.patch b/target/linux/brcm2708/patches-4.4/0162-DT-Add-overlays-to-configure-I2C-pins.patch
index a010fca7b1..fdd38383f2 100644
--- a/target/linux/brcm2708/patches-4.4/0169-DT-Add-overlays-to-configure-I2C-pins.patch
+++ b/target/linux/brcm2708/patches-4.4/0162-DT-Add-overlays-to-configure-I2C-pins.patch
@@ -1,7 +1,7 @@
-From 310f5af54ca26b68795f0376c67b41e2bb18a0e0 Mon Sep 17 00:00:00 2001
+From 6014b99c7f39813c76b51e940677219c7dd41041 Mon Sep 17 00:00:00 2001
From: Dave Stevenson <6by9@users.noreply.github.com>
Date: Mon, 8 Feb 2016 23:49:41 +0000
-Subject: [PATCH 169/170] DT: Add overlays to configure I2C pins
+Subject: [PATCH 162/232] DT: Add overlays to configure I2C pins
Lifted from
https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=120938&p=825883
diff --git a/target/linux/brcm2708/patches-4.4/0170-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch b/target/linux/brcm2708/patches-4.4/0163-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch
index 95a193a881..ecc52298f5 100644
--- a/target/linux/brcm2708/patches-4.4/0170-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch
+++ b/target/linux/brcm2708/patches-4.4/0163-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch
@@ -1,7 +1,7 @@
-From c5cbb66686e7e289e8a7aff49a954f86893e628d Mon Sep 17 00:00:00 2001
+From f22f155684481bb96748677bc58705d27bf4f06b Mon Sep 17 00:00:00 2001
From: Dhiraj Goel <dhiraj.goel@gmail.com>
Date: Thu, 3 Mar 2016 21:10:50 -0800
-Subject: [PATCH 170/170] bcm2835-camera: fix a bug in computation of frame
+Subject: [PATCH 163/232] bcm2835-camera: fix a bug in computation of frame
timestamp
Fixes #1318
diff --git a/target/linux/brcm2708/patches-4.4/0171-BCM270X_DT-Add-pi3-disable-bt-overlay.patch b/target/linux/brcm2708/patches-4.4/0164-BCM270X_DT-Add-pi3-disable-bt-overlay.patch
index d00439eaa5..00ed1dad23 100644
--- a/target/linux/brcm2708/patches-4.4/0171-BCM270X_DT-Add-pi3-disable-bt-overlay.patch
+++ b/target/linux/brcm2708/patches-4.4/0164-BCM270X_DT-Add-pi3-disable-bt-overlay.patch
@@ -1,7 +1,7 @@
-From 42a9bb566fe376a1add4b3780c1b830f64500faa Mon Sep 17 00:00:00 2001
+From 1807dd78b1af8eff8976f3431e4bf98dccd2113d Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Wed, 2 Mar 2016 10:59:05 +0000
-Subject: [PATCH 171/180] BCM270X_DT: Add pi3-disable-bt overlay
+Subject: [PATCH 164/232] BCM270X_DT: Add pi3-disable-bt overlay
Disable Bluetooth and restore UART0/ttyAMA0 over GPIOs 14 & 15. To disable
the systemd service that initialises the modem so it doesn't use the UART:
diff --git a/target/linux/brcm2708/patches-4.4/0172-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch b/target/linux/brcm2708/patches-4.4/0165-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch
index 3e1031c109..69d2532f02 100644
--- a/target/linux/brcm2708/patches-4.4/0172-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch
+++ b/target/linux/brcm2708/patches-4.4/0165-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch
@@ -1,7 +1,7 @@
-From 3b93a5e60a2272bea6b50561c6e871dde5295dfb Mon Sep 17 00:00:00 2001
+From 4adf0d94785a304b51f8205ecade7bc97b26a00b Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 7 Mar 2016 09:53:03 +0000
-Subject: [PATCH 172/180] BCM270X_DT: Add pi3-miniuart-bt DT overlay
+Subject: [PATCH 165/232] BCM270X_DT: Add pi3-miniuart-bt DT overlay
Switch Pi3 Bluetooth function to use the mini-UART (ttyS0) and restore
UART0/ttyAMA0 over GPIOs 14 & 15. Note that this may reduce the maximum
diff --git a/target/linux/brcm2708/patches-4.4/0173-Pi3-DT-Add-dtparams-for-the-SD-interface.patch b/target/linux/brcm2708/patches-4.4/0166-Pi3-DT-Add-dtparams-for-the-SD-interface.patch
index f9e4767f8a..0388794aeb 100644
--- a/target/linux/brcm2708/patches-4.4/0173-Pi3-DT-Add-dtparams-for-the-SD-interface.patch
+++ b/target/linux/brcm2708/patches-4.4/0166-Pi3-DT-Add-dtparams-for-the-SD-interface.patch
@@ -1,7 +1,7 @@
-From c8b56d0359160d2aec2ab3168ef9d7c080ae9841 Mon Sep 17 00:00:00 2001
+From 2efc547c5e535a2061312e63a459cdee9635cdf9 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 7 Mar 2016 13:38:39 +0000
-Subject: [PATCH 173/180] Pi3 DT: Add dtparams for the SD interface
+Subject: [PATCH 166/232] Pi3 DT: Add dtparams for the SD interface
Add new base dtparams sd_overclock, sd_force_pio, sd_pio_limit
and sd_debug. These were missed out of the initial Pi3 DTB.
diff --git a/target/linux/brcm2708/patches-4.4/0174-vchiq_arm-Tweak-the-logging-output.patch b/target/linux/brcm2708/patches-4.4/0167-vchiq_arm-Tweak-the-logging-output.patch
index 536c6ce2bc..ef77a82212 100644
--- a/target/linux/brcm2708/patches-4.4/0174-vchiq_arm-Tweak-the-logging-output.patch
+++ b/target/linux/brcm2708/patches-4.4/0167-vchiq_arm-Tweak-the-logging-output.patch
@@ -1,7 +1,7 @@
-From 48f3f7707a43b019e14216cec7376eba21972f9b Mon Sep 17 00:00:00 2001
+From 68c89607e3451adc83a158e99a582be85f047465 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 7 Mar 2016 15:05:11 +0000
-Subject: [PATCH 174/180] vchiq_arm: Tweak the logging output
+Subject: [PATCH 167/232] vchiq_arm: Tweak the logging output
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
---
diff --git a/target/linux/brcm2708/patches-4.4/0168-FIXUP-BCM270X_DT-Update-to-latest-Pi3-DTS.patch b/target/linux/brcm2708/patches-4.4/0168-FIXUP-BCM270X_DT-Update-to-latest-Pi3-DTS.patch
deleted file mode 100644
index 686f5c6ac9..0000000000
--- a/target/linux/brcm2708/patches-4.4/0168-FIXUP-BCM270X_DT-Update-to-latest-Pi3-DTS.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 52015bd5f0bb4d64ca51c5f8539cf2552dfb8a42 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Thu, 21 Jan 2016 17:57:49 +0000
-Subject: [PATCH 168/170] FIXUP: BCM270X_DT: Update to latest Pi3 DTS
-
----
- arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 34 ++++++++++++++++++++++++++--------
- 1 file changed, 26 insertions(+), 8 deletions(-)
-
---- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
-+++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
-@@ -45,16 +45,21 @@
- };
-
- bt_pins: bt_pins {
-- brcm,pins = <28 29 30 31 14 15 43>;
-- brcm,function = <6 6 6 6 2 2 4>;
-- // alt2:PCM alt5:UART1 alt0:GPCLK2
-- brcm,pull = <0 0 0 0 0 2 0>;
-+ brcm,pins = <28 29 30 31 43>;
-+ brcm,function = <6 6 6 6 4>; /* alt2:PCM alt0:GPCLK2 */
-+ brcm,pull = <0 0 0 0 0>;
- };
-
-- uart1_pins: uart1_pins {
-+ uart0_pins: uart0_pins {
- brcm,pins = <32 33>;
- brcm,function = <7>; /* alt3=UART0 */
-- brcm,pull = <0>;
-+ brcm,pull = <0 0>;
-+ };
-+
-+ uart1_pins: uart1_pins {
-+ brcm,pins = <14 15>;
-+ brcm,function = <2>; /* alt5=UART1 */
-+ brcm,pull = <0 0>;
- };
- };
-
-@@ -71,6 +76,17 @@
- non-removable;
- bus-width = <4>;
- status = "okay";
-+ brcm,overclock-50 = <0>;
-+};
-+
-+&soc {
-+ virtgpio: virtgpio {
-+ compatible = "brcm,bcm2835-virtgpio";
-+ gpio-controller;
-+ #gpio-cells = <2>;
-+ firmware = <&firmware>;
-+ status = "okay";
-+ };
- };
-
- &fb {
-@@ -78,12 +94,14 @@
- };
-
- &uart0 {
-+ pinctrl-names = "default";
-+ pinctrl-0 = <&uart0_pins &bt_pins>;
- status = "okay";
- };
-
- &uart1 {
- pinctrl-names = "default";
-- pinctrl-0 = <&uart1_pins &bt_pins>;
-+ pinctrl-0 = <&uart1_pins>;
- status = "okay";
- };
-
-@@ -139,7 +157,7 @@
- act_led: act {
- label = "led0";
- linux,default-trigger = "mmc0";
-- gpios = <&gpio 47 0>;
-+ gpios = <&virtgpio 0 0>;
- };
- };
-
diff --git a/target/linux/brcm2708/patches-4.4/0175-bcm2835-sdhost-Only-claim-one-DMA-channel.patch b/target/linux/brcm2708/patches-4.4/0168-bcm2835-sdhost-Only-claim-one-DMA-channel.patch
index fb68bcb5f8..3432ccfcc0 100644
--- a/target/linux/brcm2708/patches-4.4/0175-bcm2835-sdhost-Only-claim-one-DMA-channel.patch
+++ b/target/linux/brcm2708/patches-4.4/0168-bcm2835-sdhost-Only-claim-one-DMA-channel.patch
@@ -1,7 +1,7 @@
-From 06c169985c0884ce67377c79d27383e23f41e2cd Mon Sep 17 00:00:00 2001
+From 1131510a589ae7262b8861af8d2f4a000710d59c Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 7 Mar 2016 16:46:39 +0000
-Subject: [PATCH 175/180] bcm2835-sdhost: Only claim one DMA channel
+Subject: [PATCH 168/232] bcm2835-sdhost: Only claim one DMA channel
With both MMC controllers enabled there are few DMA channels left. The
bcm2835-sdhost driver only uses DMA in one direction at a time, so it
diff --git a/target/linux/brcm2708/patches-4.4/0176-bcm2835-mmc-Only-claim-one-DMA-channel.patch b/target/linux/brcm2708/patches-4.4/0169-bcm2835-mmc-Only-claim-one-DMA-channel.patch
index 8f224faf88..3ff9b3e977 100644
--- a/target/linux/brcm2708/patches-4.4/0176-bcm2835-mmc-Only-claim-one-DMA-channel.patch
+++ b/target/linux/brcm2708/patches-4.4/0169-bcm2835-mmc-Only-claim-one-DMA-channel.patch
@@ -1,7 +1,7 @@
-From af80d75abc7604cd9eb1788b0171148d000db09d Mon Sep 17 00:00:00 2001
+From ea4b1c5c2ddbb6caba43ab9b0103542a4ca7e1f0 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 8 Mar 2016 09:49:16 +0000
-Subject: [PATCH 176/180] bcm2835-mmc: Only claim one DMA channel
+Subject: [PATCH 169/232] bcm2835-mmc: Only claim one DMA channel
With both MMC controllers enabled there are few DMA channels left. The
bcm2835-mmc driver only uses DMA in one direction at a time, so it
diff --git a/target/linux/brcm2708/patches-4.4/0177-config-rebuild-with-savedefconfig.patch b/target/linux/brcm2708/patches-4.4/0170-config-rebuild-with-savedefconfig.patch
index 34eedc1076..f7dcd936a5 100644
--- a/target/linux/brcm2708/patches-4.4/0177-config-rebuild-with-savedefconfig.patch
+++ b/target/linux/brcm2708/patches-4.4/0170-config-rebuild-with-savedefconfig.patch
@@ -1,7 +1,7 @@
-From 0b65dbd40ad6b3d7cc979e8b7817f74b823f66ef Mon Sep 17 00:00:00 2001
+From 83428789f8b11c2caf2b85998db0f0874cd3e896 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Tue, 8 Mar 2016 17:08:39 +0000
-Subject: [PATCH 177/180] config: rebuild with savedefconfig
+Subject: [PATCH 170/232] config: rebuild with savedefconfig
---
arch/arm/configs/bcm2709_defconfig | 3 +--
diff --git a/target/linux/brcm2708/patches-4.4/0178-config-Add-module-for-mcp3422-ADC.patch b/target/linux/brcm2708/patches-4.4/0171-config-Add-module-for-mcp3422-ADC.patch
index d6c1a75fa8..3843ec474d 100644
--- a/target/linux/brcm2708/patches-4.4/0178-config-Add-module-for-mcp3422-ADC.patch
+++ b/target/linux/brcm2708/patches-4.4/0171-config-Add-module-for-mcp3422-ADC.patch
@@ -1,7 +1,7 @@
-From 1e19acaf4b88ee6dcbe8843a07a04edf177be7c3 Mon Sep 17 00:00:00 2001
+From b704288cc9104b018bebf77528f9ff74b6c355a4 Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Tue, 8 Mar 2016 17:06:33 +0000
-Subject: [PATCH 178/180] config: Add module for mcp3422 ADC
+Subject: [PATCH 171/232] config: Add module for mcp3422 ADC
---
arch/arm/configs/bcm2709_defconfig | 1 +
diff --git a/target/linux/brcm2708/patches-4.4/0179-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch b/target/linux/brcm2708/patches-4.4/0172-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch
index 794a7bb4d5..cd8569675a 100644
--- a/target/linux/brcm2708/patches-4.4/0179-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch
+++ b/target/linux/brcm2708/patches-4.4/0172-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch
@@ -1,7 +1,7 @@
-From e064caf725672cb95cc8327f4dc55d3de257cd74 Mon Sep 17 00:00:00 2001
+From a25355e1fe4284b87170bec5d2ee77f90a62602c Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Tue, 8 Mar 2016 16:18:57 +0000
-Subject: [PATCH 179/180] Pi3 DT: Add pull-ups on the UART RX lines
+Subject: [PATCH 172/232] Pi3 DT: Add pull-ups on the UART RX lines
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
---
diff --git a/target/linux/brcm2708/patches-4.4/0174-BCM270X_DT-rpi-display-overlay-add-swapxy-param.patch b/target/linux/brcm2708/patches-4.4/0174-BCM270X_DT-rpi-display-overlay-add-swapxy-param.patch
new file mode 100644
index 0000000000..3be457bf9c
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0174-BCM270X_DT-rpi-display-overlay-add-swapxy-param.patch
@@ -0,0 +1,38 @@
+From 209d0307ba01e0f15f5e75bc77d8edaa51aa91ab Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 9 Mar 2016 21:28:52 +0000
+Subject: [PATCH 174/232] BCM270X_DT: rpi-display overlay - add swapxy param
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/README | 5 +----
+ arch/arm/boot/dts/overlays/rpi-display-overlay.dts | 1 +
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -644,14 +644,11 @@ Name: rpi-display
+ Info: RPi-Display - 2.8" Touch Display by Watterott
+ Load: dtoverlay=rpi-display,<param>=<val>
+ Params: speed Display SPI bus speed
+-
+ rotate Display rotation {0,90,180,270}
+-
+ fps Delay between frame updates
+-
+ debug Debug output level {0-7}
+-
+ xohms Touchpanel sensitivity (X-plate resistance)
++ swapxy Swap x and y axis
+
+
+ Name: rpi-ft5406
+--- a/arch/arm/boot/dts/overlays/rpi-display-overlay.dts
++++ b/arch/arm/boot/dts/overlays/rpi-display-overlay.dts
+@@ -78,5 +78,6 @@
+ fps = <&rpidisplay>,"fps:0";
+ debug = <&rpidisplay>,"debug:0";
+ xohms = <&rpidisplay_ts>,"ti,x-plate-ohms;0";
++ swapxy = <&rpidisplay_ts>,"ti,swap-xy?";
+ };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0175-Remove-I2S-config-from-bt_pins.patch b/target/linux/brcm2708/patches-4.4/0175-Remove-I2S-config-from-bt_pins.patch
new file mode 100644
index 0000000000..7c1d01d604
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0175-Remove-I2S-config-from-bt_pins.patch
@@ -0,0 +1,38 @@
+From eb4d55c34018bbb92808264217a0b2857d2b2ae6 Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Fri, 11 Mar 2016 11:44:35 +0000
+Subject: [PATCH 175/232] Remove I2S config from bt_pins.
+
+Remove I2S config from bt_pins. Causes issues with clock alignment when I2S is
+used by an external DAC via GPIO header.
+---
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 6 +++---
+ arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -45,9 +45,9 @@
+ };
+
+ bt_pins: bt_pins {
+- brcm,pins = <28 29 30 31 43>;
+- brcm,function = <6 6 6 6 4>; /* alt2:PCM alt0:GPCLK2 */
+- brcm,pull = <0 0 0 0 0>;
++ brcm,pins = <43>;
++ brcm,function = <4>; /* alt0:GPCLK2 */
++ brcm,pull = <0>;
+ };
+
+ uart0_pins: uart0_pins {
+--- a/arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts
+@@ -29,7 +29,7 @@
+ target = <&uart1>;
+ __overlay__ {
+ pinctrl-names = "default";
+- pinctrl-0 = <&uart1_pins>;
++ pinctrl-0 = <&uart1_pins &bt_pins>;
+ status = "okay";
+ };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0176-Revert-scripts-dtc-Add-overlay-support.patch b/target/linux/brcm2708/patches-4.4/0176-Revert-scripts-dtc-Add-overlay-support.patch
new file mode 100644
index 0000000000..d2001e1d80
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0176-Revert-scripts-dtc-Add-overlay-support.patch
@@ -0,0 +1,4390 @@
+From fa95cd11c54c77d6151b7588b1f41457d8775c60 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 10 Aug 2015 09:44:59 +0100
+Subject: [PATCH 176/232] Revert "scripts/dtc: Add overlay support"
+
+This reverts commit fa6d1755c2fdd9451077d8248e3804f0619f19b9.
+---
+ scripts/dtc/checks.c | 119 +--
+ scripts/dtc/dtc-lexer.l | 5 -
+ scripts/dtc/dtc-lexer.lex.c_shipped | 490 +++++----
+ scripts/dtc/dtc-parser.tab.c_shipped | 1896 +++++++++++++++-------------------
+ scripts/dtc/dtc-parser.tab.h_shipped | 107 +-
+ scripts/dtc/dtc-parser.y | 23 +-
+ scripts/dtc/dtc.c | 9 +-
+ scripts/dtc/dtc.h | 38 -
+ scripts/dtc/flattree.c | 141 +--
+ scripts/dtc/version_gen.h | 2 +-
+ 10 files changed, 1145 insertions(+), 1685 deletions(-)
+
+--- a/scripts/dtc/checks.c
++++ b/scripts/dtc/checks.c
+@@ -458,91 +458,21 @@ static void fixup_phandle_references(str
+ struct node *node, struct property *prop)
+ {
+ struct marker *m = prop->val.markers;
+- struct fixup *f, **fp;
+- struct fixup_entry *fe, **fep;
+ struct node *refnode;
+ cell_t phandle;
+- int has_phandle_refs;
+-
+- has_phandle_refs = 0;
+- for_each_marker_of_type(m, REF_PHANDLE) {
+- has_phandle_refs = 1;
+- break;
+- }
+-
+- if (!has_phandle_refs)
+- return;
+
+ for_each_marker_of_type(m, REF_PHANDLE) {
+ assert(m->offset + sizeof(cell_t) <= prop->val.len);
+
+ refnode = get_node_by_ref(dt, m->ref);
+- if (!refnode && !symbol_fixup_support) {
++ if (! refnode) {
+ FAIL(c, "Reference to non-existent node or label \"%s\"\n",
+- m->ref);
++ m->ref);
+ continue;
+ }
+
+- if (!refnode) {
+- /* allocate fixup entry */
+- fe = xmalloc(sizeof(*fe));
+-
+- fe->node = node;
+- fe->prop = prop;
+- fe->offset = m->offset;
+- fe->next = NULL;
+-
+- /* search for an already existing fixup */
+- for_each_fixup(dt, f)
+- if (strcmp(f->ref, m->ref) == 0)
+- break;
+-
+- /* no fixup found, add new */
+- if (f == NULL) {
+- f = xmalloc(sizeof(*f));
+- f->ref = m->ref;
+- f->entries = NULL;
+- f->next = NULL;
+-
+- /* add it to the tree */
+- fp = &dt->fixups;
+- while (*fp)
+- fp = &(*fp)->next;
+- *fp = f;
+- }
+-
+- /* and now append fixup entry */
+- fep = &f->entries;
+- while (*fep)
+- fep = &(*fep)->next;
+- *fep = fe;
+-
+- /* mark the entry as unresolved */
+- phandle = 0xdeadbeef;
+- } else {
+- phandle = get_node_phandle(dt, refnode);
+-
+- /* if it's a plugin, we need to record it */
+- if (symbol_fixup_support && dt->is_plugin) {
+-
+- /* allocate a new local fixup entry */
+- fe = xmalloc(sizeof(*fe));
+-
+- fe->node = node;
+- fe->prop = prop;
+- fe->offset = m->offset;
+- fe->next = NULL;
+-
+- /* append it to the local fixups */
+- fep = &dt->local_fixups;
+- while (*fep)
+- fep = &(*fep)->next;
+- *fep = fe;
+- }
+- }
+-
+- *((cell_t *)(prop->val.val + m->offset)) =
+- cpu_to_fdt32(phandle);
++ phandle = get_node_phandle(dt, refnode);
++ *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
+ }
+ }
+ ERROR(phandle_references, NULL, NULL, fixup_phandle_references, NULL,
+@@ -722,45 +652,6 @@ static void check_obsolete_chosen_interr
+ }
+ TREE_WARNING(obsolete_chosen_interrupt_controller, NULL);
+
+-static void check_auto_label_phandles(struct check *c, struct node *dt,
+- struct node *node)
+-{
+- struct label *l;
+- struct symbol *s, **sp;
+- int has_label;
+-
+- if (!symbol_fixup_support)
+- return;
+-
+- has_label = 0;
+- for_each_label(node->labels, l) {
+- has_label = 1;
+- break;
+- }
+-
+- if (!has_label)
+- return;
+-
+- /* force allocation of a phandle for this node */
+- (void)get_node_phandle(dt, node);
+-
+- /* add the symbol */
+- for_each_label(node->labels, l) {
+-
+- s = xmalloc(sizeof(*s));
+- s->label = l;
+- s->node = node;
+- s->next = NULL;
+-
+- /* add it to the symbols list */
+- sp = &dt->symbols;
+- while (*sp)
+- sp = &((*sp)->next);
+- *sp = s;
+- }
+-}
+-NODE_WARNING(auto_label_phandles, NULL);
+-
+ static struct check *check_table[] = {
+ &duplicate_node_names, &duplicate_property_names,
+ &node_name_chars, &node_name_format, &property_name_chars,
+@@ -779,8 +670,6 @@ static struct check *check_table[] = {
+ &avoid_default_addr_size,
+ &obsolete_chosen_interrupt_controller,
+
+- &auto_label_phandles,
+-
+ &always_fail,
+ };
+
+--- a/scripts/dtc/dtc-lexer.l
++++ b/scripts/dtc/dtc-lexer.l
+@@ -113,11 +113,6 @@ static void lexical_error(const char *fm
+ return DT_V1;
+ }
+
+-<*>"/plugin/" {
+- DPRINT("Keyword: /plugin/\n");
+- return DT_PLUGIN;
+- }
+-
+ <*>"/memreserve/" {
+ DPRINT("Keyword: /memreserve/\n");
+ BEGIN_DEFAULT();
+--- a/scripts/dtc/dtc-lexer.lex.c_shipped
++++ b/scripts/dtc/dtc-lexer.lex.c_shipped
+@@ -9,7 +9,7 @@
+ #define FLEX_SCANNER
+ #define YY_FLEX_MAJOR_VERSION 2
+ #define YY_FLEX_MINOR_VERSION 5
+-#define YY_FLEX_SUBMINOR_VERSION 35
++#define YY_FLEX_SUBMINOR_VERSION 39
+ #if YY_FLEX_SUBMINOR_VERSION > 0
+ #define FLEX_BETA
+ #endif
+@@ -162,7 +162,12 @@ typedef unsigned int flex_uint32_t;
+ typedef struct yy_buffer_state *YY_BUFFER_STATE;
+ #endif
+
+-extern int yyleng;
++#ifndef YY_TYPEDEF_YY_SIZE_T
++#define YY_TYPEDEF_YY_SIZE_T
++typedef size_t yy_size_t;
++#endif
++
++extern yy_size_t yyleng;
+
+ extern FILE *yyin, *yyout;
+
+@@ -171,6 +176,7 @@ extern FILE *yyin, *yyout;
+ #define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
++ #define YY_LINENO_REWIND_TO(ptr)
+
+ /* Return all but the first "n" matched characters back to the input stream. */
+ #define yyless(n) \
+@@ -188,11 +194,6 @@ extern FILE *yyin, *yyout;
+
+ #define unput(c) yyunput( c, (yytext_ptr) )
+
+-#ifndef YY_TYPEDEF_YY_SIZE_T
+-#define YY_TYPEDEF_YY_SIZE_T
+-typedef size_t yy_size_t;
+-#endif
+-
+ #ifndef YY_STRUCT_YY_BUFFER_STATE
+ #define YY_STRUCT_YY_BUFFER_STATE
+ struct yy_buffer_state
+@@ -210,7 +211,7 @@ struct yy_buffer_state
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+- int yy_n_chars;
++ yy_size_t yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+@@ -280,8 +281,8 @@ static YY_BUFFER_STATE * yy_buffer_stack
+
+ /* yy_hold_char holds the character lost when yytext is formed. */
+ static char yy_hold_char;
+-static int yy_n_chars; /* number of characters read into yy_ch_buf */
+-int yyleng;
++static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
++yy_size_t yyleng;
+
+ /* Points to current character in buffer. */
+ static char *yy_c_buf_p = (char *) 0;
+@@ -309,7 +310,7 @@ static void yy_init_buffer (YY_BUFFER_ST
+
+ YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+ YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
++YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
+
+ void *yyalloc (yy_size_t );
+ void *yyrealloc (void *,yy_size_t );
+@@ -341,7 +342,7 @@ void yyfree (void * );
+
+ /* Begin user sect3 */
+
+-#define yywrap(n) 1
++#define yywrap() 1
+ #define YY_SKIP_YYWRAP
+
+ typedef unsigned char YY_CHAR;
+@@ -372,8 +373,8 @@ static void yy_fatal_error (yyconst char
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+-#define YY_NUM_RULES 31
+-#define YY_END_OF_BUFFER 32
++#define YY_NUM_RULES 30
++#define YY_END_OF_BUFFER 31
+ /* This struct is not used in this scanner,
+ but its presence is necessary. */
+ struct yy_trans_info
+@@ -381,26 +382,25 @@ struct yy_trans_info
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+-static yyconst flex_int16_t yy_accept[166] =
++static yyconst flex_int16_t yy_accept[159] =
+ { 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 32, 30,
+- 19, 19, 30, 30, 30, 30, 30, 30, 30, 30,
+- 30, 30, 30, 30, 30, 30, 16, 17, 17, 30,
+- 17, 11, 11, 19, 27, 0, 3, 0, 28, 13,
+- 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+- 0, 22, 24, 26, 25, 23, 0, 10, 29, 0,
+- 0, 0, 15, 15, 17, 17, 17, 11, 11, 11,
+- 0, 13, 0, 12, 0, 0, 0, 21, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 17, 11, 11,
+- 11, 0, 14, 20, 0, 0, 0, 0, 0, 0,
+-
+- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 17, 7, 0, 0, 0,
+- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 4, 18, 0, 0, 5, 2,
+- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 1, 0, 0, 0, 0, 6, 9, 0,
+- 0, 0, 0, 8, 0
++ 0, 0, 0, 0, 0, 0, 0, 0, 31, 29,
++ 18, 18, 29, 29, 29, 29, 29, 29, 29, 29,
++ 29, 29, 29, 29, 29, 29, 15, 16, 16, 29,
++ 16, 10, 10, 18, 26, 0, 3, 0, 27, 12,
++ 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
++ 21, 23, 25, 24, 22, 0, 9, 28, 0, 0,
++ 0, 14, 14, 16, 16, 16, 10, 10, 10, 0,
++ 12, 0, 11, 0, 0, 0, 20, 0, 0, 0,
++ 0, 0, 0, 0, 0, 16, 10, 10, 10, 0,
++ 13, 19, 0, 0, 0, 0, 0, 0, 0, 0,
++
++ 0, 16, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 16, 6, 0, 0, 0, 0, 0, 0, 2,
++ 0, 0, 0, 0, 0, 0, 0, 0, 4, 17,
++ 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
++ 5, 8, 0, 0, 0, 0, 7, 0
+ } ;
+
+ static yyconst flex_int32_t yy_ec[256] =
+@@ -416,9 +416,9 @@ static yyconst flex_int32_t yy_ec[256] =
+ 22, 22, 22, 22, 24, 22, 22, 25, 22, 22,
+ 1, 26, 27, 1, 22, 1, 21, 28, 29, 30,
+
+- 31, 21, 32, 22, 33, 22, 22, 34, 35, 36,
+- 37, 38, 22, 39, 40, 41, 42, 43, 22, 25,
+- 44, 22, 45, 46, 47, 1, 1, 1, 1, 1,
++ 31, 21, 22, 22, 32, 22, 22, 33, 34, 35,
++ 36, 37, 22, 38, 39, 40, 41, 42, 22, 25,
++ 43, 22, 44, 45, 46, 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,
+@@ -435,165 +435,163 @@ static yyconst flex_int32_t yy_ec[256] =
+ 1, 1, 1, 1, 1
+ } ;
+
+-static yyconst flex_int32_t yy_meta[48] =
++static yyconst flex_int32_t yy_meta[47] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 2, 3, 1, 2,
+ 2, 2, 4, 5, 5, 5, 6, 1, 1, 1,
+ 7, 8, 8, 8, 8, 1, 1, 7, 7, 7,
+ 7, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+- 8, 8, 8, 8, 3, 1, 4
++ 8, 8, 8, 3, 1, 4
+ } ;
+
+-static yyconst flex_int16_t yy_base[180] =
++static yyconst flex_int16_t yy_base[173] =
+ { 0,
+- 0, 393, 35, 392, 66, 391, 38, 107, 397, 401,
+- 55, 113, 377, 112, 111, 111, 114, 42, 376, 106,
+- 377, 347, 126, 120, 0, 147, 401, 0, 124, 0,
+- 137, 158, 170, 163, 401, 153, 401, 389, 401, 0,
+- 378, 120, 401, 131, 380, 386, 355, 139, 351, 355,
+- 351, 401, 401, 401, 401, 401, 367, 401, 401, 185,
+- 350, 346, 401, 364, 0, 185, 347, 189, 356, 355,
+- 0, 0, 330, 180, 366, 141, 372, 361, 332, 338,
+- 331, 341, 334, 326, 205, 331, 337, 329, 401, 341,
+- 167, 316, 401, 349, 348, 320, 328, 346, 180, 318,
+-
+- 324, 209, 324, 320, 322, 342, 338, 309, 306, 315,
+- 305, 315, 312, 192, 342, 341, 401, 293, 306, 282,
+- 268, 252, 255, 203, 285, 282, 272, 268, 252, 233,
+- 232, 239, 208, 107, 401, 401, 238, 211, 401, 211,
+- 212, 208, 228, 203, 215, 207, 233, 222, 212, 211,
+- 203, 227, 401, 237, 225, 204, 185, 401, 401, 149,
+- 128, 88, 42, 401, 401, 253, 259, 267, 271, 275,
+- 281, 288, 292, 300, 308, 312, 318, 326, 334
++ 0, 383, 34, 382, 65, 381, 37, 105, 387, 391,
++ 54, 111, 367, 110, 109, 109, 112, 41, 366, 104,
++ 367, 338, 124, 117, 0, 144, 391, 0, 121, 0,
++ 135, 155, 140, 179, 391, 160, 391, 379, 391, 0,
++ 368, 141, 391, 167, 370, 376, 346, 103, 342, 345,
++ 391, 391, 391, 391, 391, 358, 391, 391, 175, 342,
++ 338, 391, 355, 0, 185, 339, 184, 347, 346, 0,
++ 0, 322, 175, 357, 175, 363, 352, 324, 330, 323,
++ 332, 326, 201, 324, 329, 322, 391, 333, 181, 309,
++ 391, 341, 340, 313, 320, 338, 178, 311, 146, 317,
++
++ 314, 315, 335, 331, 303, 300, 309, 299, 308, 188,
++ 336, 335, 391, 305, 320, 281, 283, 271, 203, 288,
++ 281, 271, 266, 264, 245, 242, 208, 104, 391, 391,
++ 244, 218, 204, 219, 206, 224, 201, 212, 204, 229,
++ 215, 208, 207, 200, 219, 391, 233, 221, 200, 181,
++ 391, 391, 149, 122, 86, 41, 391, 391, 245, 251,
++ 259, 263, 267, 273, 280, 284, 292, 300, 304, 310,
++ 318, 326
+ } ;
+
+-static yyconst flex_int16_t yy_def[180] =
++static yyconst flex_int16_t yy_def[173] =
+ { 0,
+- 165, 1, 1, 3, 165, 5, 1, 1, 165, 165,
+- 165, 165, 165, 166, 167, 168, 165, 165, 165, 165,
+- 169, 165, 165, 165, 170, 169, 165, 171, 172, 171,
+- 171, 165, 165, 165, 165, 166, 165, 166, 165, 173,
+- 165, 168, 165, 168, 174, 175, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 169, 165, 165, 165,
+- 165, 165, 165, 169, 171, 172, 171, 165, 165, 165,
+- 176, 173, 177, 168, 174, 174, 175, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 171, 165, 165,
+- 176, 177, 165, 165, 165, 165, 165, 165, 165, 165,
+-
+- 165, 165, 165, 165, 171, 165, 165, 165, 165, 165,
+- 165, 165, 165, 178, 165, 171, 165, 165, 165, 165,
+- 165, 165, 165, 178, 165, 178, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 179, 165, 165,
+- 165, 179, 165, 179, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 0, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165
++ 158, 1, 1, 3, 158, 5, 1, 1, 158, 158,
++ 158, 158, 158, 159, 160, 161, 158, 158, 158, 158,
++ 162, 158, 158, 158, 163, 162, 158, 164, 165, 164,
++ 164, 158, 158, 158, 158, 159, 158, 159, 158, 166,
++ 158, 161, 158, 161, 167, 168, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 162, 158, 158, 158, 158,
++ 158, 158, 162, 164, 165, 164, 158, 158, 158, 169,
++ 166, 170, 161, 167, 167, 168, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 164, 158, 158, 169, 170,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++
++ 158, 164, 158, 158, 158, 158, 158, 158, 158, 171,
++ 158, 164, 158, 158, 158, 158, 158, 158, 171, 158,
++ 171, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 172, 158, 158, 158, 172, 158, 172, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 0, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158
+ } ;
+
+-static yyconst flex_int16_t yy_nxt[449] =
++static yyconst flex_int16_t yy_nxt[438] =
+ { 0,
+ 10, 11, 12, 11, 13, 14, 10, 15, 16, 10,
+ 10, 10, 17, 10, 10, 10, 10, 18, 19, 20,
+ 21, 21, 21, 21, 21, 10, 10, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+- 21, 21, 21, 21, 10, 22, 10, 24, 25, 25,
+- 25, 32, 33, 33, 164, 26, 34, 34, 34, 52,
+- 53, 27, 26, 26, 26, 26, 10, 11, 12, 11,
+- 13, 14, 28, 15, 16, 28, 28, 28, 24, 28,
+- 28, 28, 10, 18, 19, 20, 29, 29, 29, 29,
+- 29, 30, 10, 29, 29, 29, 29, 29, 29, 29,
+-
+- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+- 10, 22, 10, 23, 34, 34, 34, 37, 39, 43,
+- 32, 33, 33, 45, 55, 56, 46, 60, 43, 45,
+- 65, 163, 46, 65, 65, 65, 44, 38, 60, 74,
+- 58, 47, 141, 48, 142, 44, 49, 47, 50, 48,
+- 76, 51, 62, 94, 50, 41, 44, 51, 37, 61,
+- 64, 64, 64, 58, 34, 34, 34, 64, 162, 80,
+- 67, 68, 68, 68, 64, 64, 64, 64, 38, 81,
+- 69, 70, 71, 68, 68, 68, 60, 161, 43, 69,
+- 70, 65, 69, 70, 65, 65, 65, 125, 85, 85,
+-
+- 85, 58, 68, 68, 68, 44, 102, 110, 125, 133,
+- 102, 69, 70, 111, 114, 160, 159, 126, 85, 85,
+- 85, 140, 140, 140, 140, 140, 140, 153, 126, 147,
+- 147, 147, 153, 148, 147, 147, 147, 158, 148, 165,
+- 157, 156, 155, 151, 150, 149, 146, 154, 145, 144,
+- 143, 139, 154, 36, 36, 36, 36, 36, 36, 36,
+- 36, 40, 138, 137, 136, 40, 40, 42, 42, 42,
+- 42, 42, 42, 42, 42, 57, 57, 57, 57, 63,
+- 135, 63, 65, 134, 165, 65, 133, 65, 65, 66,
+- 132, 131, 66, 66, 66, 66, 72, 130, 72, 72,
+-
+- 75, 75, 75, 75, 75, 75, 75, 75, 77, 77,
+- 77, 77, 77, 77, 77, 77, 91, 129, 91, 92,
+- 128, 92, 92, 127, 92, 92, 124, 124, 124, 124,
+- 124, 124, 124, 124, 152, 152, 152, 152, 152, 152,
+- 152, 152, 60, 60, 123, 122, 121, 120, 119, 118,
+- 117, 45, 116, 111, 115, 113, 112, 109, 108, 107,
+- 46, 106, 93, 89, 105, 104, 103, 101, 100, 99,
+- 98, 97, 96, 95, 78, 76, 93, 90, 89, 88,
+- 58, 87, 86, 58, 84, 83, 82, 79, 78, 76,
+- 73, 165, 59, 58, 54, 35, 165, 31, 23, 23,
+-
+- 9, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165
++ 21, 21, 21, 10, 22, 10, 24, 25, 25, 25,
++ 32, 33, 33, 157, 26, 34, 34, 34, 51, 52,
++ 27, 26, 26, 26, 26, 10, 11, 12, 11, 13,
++ 14, 28, 15, 16, 28, 28, 28, 24, 28, 28,
++ 28, 10, 18, 19, 20, 29, 29, 29, 29, 29,
++ 30, 10, 29, 29, 29, 29, 29, 29, 29, 29,
++
++ 29, 29, 29, 29, 29, 29, 29, 29, 10, 22,
++ 10, 23, 34, 34, 34, 37, 39, 43, 32, 33,
++ 33, 45, 54, 55, 46, 59, 45, 64, 156, 46,
++ 64, 64, 64, 79, 44, 38, 59, 57, 134, 47,
++ 135, 48, 80, 49, 47, 50, 48, 99, 61, 43,
++ 50, 110, 41, 67, 67, 67, 60, 63, 63, 63,
++ 57, 155, 68, 69, 63, 37, 44, 66, 67, 67,
++ 67, 63, 63, 63, 63, 73, 59, 68, 69, 70,
++ 34, 34, 34, 43, 75, 38, 154, 92, 83, 83,
++ 83, 64, 44, 120, 64, 64, 64, 67, 67, 67,
++
++ 44, 57, 99, 68, 69, 107, 68, 69, 120, 127,
++ 108, 153, 152, 121, 83, 83, 83, 133, 133, 133,
++ 146, 133, 133, 133, 146, 140, 140, 140, 121, 141,
++ 140, 140, 140, 151, 141, 158, 150, 149, 148, 144,
++ 147, 143, 142, 139, 147, 36, 36, 36, 36, 36,
++ 36, 36, 36, 40, 138, 137, 136, 40, 40, 42,
++ 42, 42, 42, 42, 42, 42, 42, 56, 56, 56,
++ 56, 62, 132, 62, 64, 131, 130, 64, 129, 64,
++ 64, 65, 128, 158, 65, 65, 65, 65, 71, 127,
++ 71, 71, 74, 74, 74, 74, 74, 74, 74, 74,
++
++ 76, 76, 76, 76, 76, 76, 76, 76, 89, 126,
++ 89, 90, 125, 90, 90, 124, 90, 90, 119, 119,
++ 119, 119, 119, 119, 119, 119, 145, 145, 145, 145,
++ 145, 145, 145, 145, 123, 122, 59, 59, 118, 117,
++ 116, 115, 114, 113, 45, 112, 108, 111, 109, 106,
++ 105, 104, 46, 103, 91, 87, 102, 101, 100, 98,
++ 97, 96, 95, 94, 93, 77, 75, 91, 88, 87,
++ 86, 57, 85, 84, 57, 82, 81, 78, 77, 75,
++ 72, 158, 58, 57, 53, 35, 158, 31, 23, 23,
++ 9, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158
+ } ;
+
+-static yyconst flex_int16_t yy_chk[449] =
++static yyconst flex_int16_t yy_chk[438] =
+ { 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, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 1, 3, 3, 3,
+- 3, 7, 7, 7, 163, 3, 11, 11, 11, 18,
+- 18, 3, 3, 3, 3, 3, 5, 5, 5, 5,
++ 1, 1, 1, 1, 1, 1, 3, 3, 3, 3,
++ 7, 7, 7, 156, 3, 11, 11, 11, 18, 18,
++ 3, 3, 3, 3, 3, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+- 5, 5, 5, 8, 12, 12, 12, 14, 15, 16,
+- 8, 8, 8, 17, 20, 20, 17, 23, 42, 24,
+- 29, 162, 24, 29, 29, 29, 16, 14, 31, 44,
+- 29, 17, 134, 17, 134, 42, 17, 24, 17, 24,
+- 76, 17, 24, 76, 24, 15, 44, 24, 36, 23,
+- 26, 26, 26, 26, 34, 34, 34, 26, 161, 48,
+- 31, 32, 32, 32, 26, 26, 26, 26, 36, 48,
+- 32, 32, 32, 33, 33, 33, 60, 160, 74, 91,
+- 91, 66, 33, 33, 66, 66, 66, 114, 60, 60,
+-
+- 60, 66, 68, 68, 68, 74, 85, 99, 124, 133,
+- 102, 68, 68, 99, 102, 157, 156, 114, 85, 85,
+- 85, 133, 133, 133, 140, 140, 140, 148, 124, 143,
+- 143, 143, 152, 143, 147, 147, 147, 155, 147, 154,
+- 151, 150, 149, 146, 145, 144, 142, 148, 141, 138,
+- 137, 132, 152, 166, 166, 166, 166, 166, 166, 166,
+- 166, 167, 131, 130, 129, 167, 167, 168, 168, 168,
+- 168, 168, 168, 168, 168, 169, 169, 169, 169, 170,
+- 128, 170, 171, 127, 126, 171, 125, 171, 171, 172,
+- 123, 122, 172, 172, 172, 172, 173, 121, 173, 173,
+-
+- 174, 174, 174, 174, 174, 174, 174, 174, 175, 175,
+- 175, 175, 175, 175, 175, 175, 176, 120, 176, 177,
+- 119, 177, 177, 118, 177, 177, 178, 178, 178, 178,
+- 178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
+- 179, 179, 116, 115, 113, 112, 111, 110, 109, 108,
+- 107, 106, 105, 104, 103, 101, 100, 98, 97, 96,
+- 95, 94, 92, 90, 88, 87, 86, 84, 83, 82,
+- 81, 80, 79, 78, 77, 75, 73, 70, 69, 67,
+- 64, 62, 61, 57, 51, 50, 49, 47, 46, 45,
++ 5, 8, 12, 12, 12, 14, 15, 16, 8, 8,
++ 8, 17, 20, 20, 17, 23, 24, 29, 155, 24,
++ 29, 29, 29, 48, 16, 14, 31, 29, 128, 17,
++ 128, 17, 48, 17, 24, 17, 24, 99, 24, 42,
++ 24, 99, 15, 33, 33, 33, 23, 26, 26, 26,
++ 26, 154, 33, 33, 26, 36, 42, 31, 32, 32,
++ 32, 26, 26, 26, 26, 44, 59, 32, 32, 32,
++ 34, 34, 34, 73, 75, 36, 153, 75, 59, 59,
++ 59, 65, 44, 110, 65, 65, 65, 67, 67, 67,
++
++ 73, 65, 83, 89, 89, 97, 67, 67, 119, 127,
++ 97, 150, 149, 110, 83, 83, 83, 133, 133, 133,
++ 141, 127, 127, 127, 145, 136, 136, 136, 119, 136,
++ 140, 140, 140, 148, 140, 147, 144, 143, 142, 139,
++ 141, 138, 137, 135, 145, 159, 159, 159, 159, 159,
++ 159, 159, 159, 160, 134, 132, 131, 160, 160, 161,
++ 161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
++ 162, 163, 126, 163, 164, 125, 124, 164, 123, 164,
++ 164, 165, 122, 121, 165, 165, 165, 165, 166, 120,
++ 166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
++
++ 168, 168, 168, 168, 168, 168, 168, 168, 169, 118,
++ 169, 170, 117, 170, 170, 116, 170, 170, 171, 171,
++ 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
++ 172, 172, 172, 172, 115, 114, 112, 111, 109, 108,
++ 107, 106, 105, 104, 103, 102, 101, 100, 98, 96,
++ 95, 94, 93, 92, 90, 88, 86, 85, 84, 82,
++ 81, 80, 79, 78, 77, 76, 74, 72, 69, 68,
++ 66, 63, 61, 60, 56, 50, 49, 47, 46, 45,
+ 41, 38, 22, 21, 19, 13, 9, 6, 4, 2,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
+- 165, 165, 165, 165, 165, 165, 165, 165
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
++ 158, 158, 158, 158, 158, 158, 158
+ } ;
+
+ static yy_state_type yy_last_accepting_state;
+@@ -664,7 +662,7 @@ static int dts_version = 1;
+ static void push_input_file(const char *filename);
+ static bool pop_input_file(void);
+ static void lexical_error(const char *fmt, ...);
+-#line 668 "dtc-lexer.lex.c"
++#line 666 "dtc-lexer.lex.c"
+
+ #define INITIAL 0
+ #define BYTESTRING 1
+@@ -706,7 +704,7 @@ FILE *yyget_out (void );
+
+ void yyset_out (FILE * out_str );
+
+-int yyget_leng (void );
++yy_size_t yyget_leng (void );
+
+ char *yyget_text (void );
+
+@@ -855,10 +853,6 @@ YY_DECL
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+-#line 68 "dtc-lexer.l"
+-
+-#line 861 "dtc-lexer.lex.c"
+-
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+@@ -885,6 +879,11 @@ YY_DECL
+ yy_load_buffer_state( );
+ }
+
++ {
++#line 68 "dtc-lexer.l"
++
++#line 886 "dtc-lexer.lex.c"
++
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+@@ -902,7 +901,7 @@ YY_DECL
+ yy_match:
+ do
+ {
+- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
++ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+@@ -911,13 +910,13 @@ 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 >= 166 )
++ if ( yy_current_state >= 159 )
+ 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_current_state != 165 );
++ while ( yy_current_state != 158 );
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+
+@@ -1008,31 +1007,23 @@ case 5:
+ YY_RULE_SETUP
+ #line 116 "dtc-lexer.l"
+ {
+- DPRINT("Keyword: /plugin/\n");
+- return DT_PLUGIN;
+- }
+- YY_BREAK
+-case 6:
+-YY_RULE_SETUP
+-#line 121 "dtc-lexer.l"
+-{
+ DPRINT("Keyword: /memreserve/\n");
+ BEGIN_DEFAULT();
+ return DT_MEMRESERVE;
+ }
+ YY_BREAK
+-case 7:
++case 6:
+ YY_RULE_SETUP
+-#line 127 "dtc-lexer.l"
++#line 122 "dtc-lexer.l"
+ {
+ DPRINT("Keyword: /bits/\n");
+ BEGIN_DEFAULT();
+ return DT_BITS;
+ }
+ YY_BREAK
+-case 8:
++case 7:
+ YY_RULE_SETUP
+-#line 133 "dtc-lexer.l"
++#line 128 "dtc-lexer.l"
+ {
+ DPRINT("Keyword: /delete-property/\n");
+ DPRINT("<PROPNODENAME>\n");
+@@ -1040,9 +1031,9 @@ YY_RULE_SETUP
+ return DT_DEL_PROP;
+ }
+ YY_BREAK
+-case 9:
++case 8:
+ YY_RULE_SETUP
+-#line 140 "dtc-lexer.l"
++#line 135 "dtc-lexer.l"
+ {
+ DPRINT("Keyword: /delete-node/\n");
+ DPRINT("<PROPNODENAME>\n");
+@@ -1050,9 +1041,9 @@ YY_RULE_SETUP
+ return DT_DEL_NODE;
+ }
+ YY_BREAK
+-case 10:
++case 9:
+ YY_RULE_SETUP
+-#line 147 "dtc-lexer.l"
++#line 142 "dtc-lexer.l"
+ {
+ DPRINT("Label: %s\n", yytext);
+ yylval.labelref = xstrdup(yytext);
+@@ -1060,9 +1051,9 @@ YY_RULE_SETUP
+ return DT_LABEL;
+ }
+ YY_BREAK
+-case 11:
++case 10:
+ YY_RULE_SETUP
+-#line 154 "dtc-lexer.l"
++#line 149 "dtc-lexer.l"
+ {
+ char *e;
+ DPRINT("Integer Literal: '%s'\n", yytext);
+@@ -1082,10 +1073,10 @@ YY_RULE_SETUP
+ return DT_LITERAL;
+ }
+ YY_BREAK
+-case 12:
+-/* rule 12 can match eol */
++case 11:
++/* rule 11 can match eol */
+ YY_RULE_SETUP
+-#line 173 "dtc-lexer.l"
++#line 168 "dtc-lexer.l"
+ {
+ struct data d;
+ DPRINT("Character literal: %s\n", yytext);
+@@ -1107,18 +1098,18 @@ YY_RULE_SETUP
+ return DT_CHAR_LITERAL;
+ }
+ YY_BREAK
+-case 13:
++case 12:
+ YY_RULE_SETUP
+-#line 194 "dtc-lexer.l"
++#line 189 "dtc-lexer.l"
+ { /* label reference */
+ DPRINT("Ref: %s\n", yytext+1);
+ yylval.labelref = xstrdup(yytext+1);
+ return DT_REF;
+ }
+ YY_BREAK
+-case 14:
++case 13:
+ YY_RULE_SETUP
+-#line 200 "dtc-lexer.l"
++#line 195 "dtc-lexer.l"
+ { /* new-style path reference */
+ yytext[yyleng-1] = '\0';
+ DPRINT("Ref: %s\n", yytext+2);
+@@ -1126,27 +1117,27 @@ YY_RULE_SETUP
+ return DT_REF;
+ }
+ YY_BREAK
+-case 15:
++case 14:
+ YY_RULE_SETUP
+-#line 207 "dtc-lexer.l"
++#line 202 "dtc-lexer.l"
+ {
+ yylval.byte = strtol(yytext, NULL, 16);
+ DPRINT("Byte: %02x\n", (int)yylval.byte);
+ return DT_BYTE;
+ }
+ YY_BREAK
+-case 16:
++case 15:
+ YY_RULE_SETUP
+-#line 213 "dtc-lexer.l"
++#line 208 "dtc-lexer.l"
+ {
+ DPRINT("/BYTESTRING\n");
+ BEGIN_DEFAULT();
+ return ']';
+ }
+ YY_BREAK
+-case 17:
++case 16:
+ YY_RULE_SETUP
+-#line 219 "dtc-lexer.l"
++#line 214 "dtc-lexer.l"
+ {
+ DPRINT("PropNodeName: %s\n", yytext);
+ yylval.propnodename = xstrdup((yytext[0] == '\\') ?
+@@ -1155,75 +1146,75 @@ YY_RULE_SETUP
+ return DT_PROPNODENAME;
+ }
+ YY_BREAK
+-case 18:
++case 17:
+ YY_RULE_SETUP
+-#line 227 "dtc-lexer.l"
++#line 222 "dtc-lexer.l"
+ {
+ DPRINT("Binary Include\n");
+ return DT_INCBIN;
+ }
+ YY_BREAK
+-case 19:
+-/* rule 19 can match eol */
++case 18:
++/* rule 18 can match eol */
+ YY_RULE_SETUP
+-#line 232 "dtc-lexer.l"
++#line 227 "dtc-lexer.l"
+ /* eat whitespace */
+ YY_BREAK
+-case 20:
+-/* rule 20 can match eol */
++case 19:
++/* rule 19 can match eol */
+ YY_RULE_SETUP
+-#line 233 "dtc-lexer.l"
++#line 228 "dtc-lexer.l"
+ /* eat C-style comments */
+ YY_BREAK
+-case 21:
+-/* rule 21 can match eol */
++case 20:
++/* rule 20 can match eol */
+ YY_RULE_SETUP
+-#line 234 "dtc-lexer.l"
++#line 229 "dtc-lexer.l"
+ /* eat C++-style comments */
+ YY_BREAK
+-case 22:
++case 21:
+ YY_RULE_SETUP
+-#line 236 "dtc-lexer.l"
++#line 231 "dtc-lexer.l"
+ { return DT_LSHIFT; };
+ YY_BREAK
+-case 23:
++case 22:
+ YY_RULE_SETUP
+-#line 237 "dtc-lexer.l"
++#line 232 "dtc-lexer.l"
+ { return DT_RSHIFT; };
+ YY_BREAK
+-case 24:
++case 23:
+ YY_RULE_SETUP
+-#line 238 "dtc-lexer.l"
++#line 233 "dtc-lexer.l"
+ { return DT_LE; };
+ YY_BREAK
+-case 25:
++case 24:
+ YY_RULE_SETUP
+-#line 239 "dtc-lexer.l"
++#line 234 "dtc-lexer.l"
+ { return DT_GE; };
+ YY_BREAK
+-case 26:
++case 25:
+ YY_RULE_SETUP
+-#line 240 "dtc-lexer.l"
++#line 235 "dtc-lexer.l"
+ { return DT_EQ; };
+ YY_BREAK
+-case 27:
++case 26:
+ YY_RULE_SETUP
+-#line 241 "dtc-lexer.l"
++#line 236 "dtc-lexer.l"
+ { return DT_NE; };
+ YY_BREAK
+-case 28:
++case 27:
+ YY_RULE_SETUP
+-#line 242 "dtc-lexer.l"
++#line 237 "dtc-lexer.l"
+ { return DT_AND; };
+ YY_BREAK
+-case 29:
++case 28:
+ YY_RULE_SETUP
+-#line 243 "dtc-lexer.l"
++#line 238 "dtc-lexer.l"
+ { return DT_OR; };
+ YY_BREAK
+-case 30:
++case 29:
+ YY_RULE_SETUP
+-#line 245 "dtc-lexer.l"
++#line 240 "dtc-lexer.l"
+ {
+ DPRINT("Char: %c (\\x%02x)\n", yytext[0],
+ (unsigned)yytext[0]);
+@@ -1239,12 +1230,12 @@ YY_RULE_SETUP
+ return yytext[0];
+ }
+ YY_BREAK
+-case 31:
++case 30:
+ YY_RULE_SETUP
+-#line 260 "dtc-lexer.l"
++#line 255 "dtc-lexer.l"
+ ECHO;
+ YY_BREAK
+-#line 1248 "dtc-lexer.lex.c"
++#line 1239 "dtc-lexer.lex.c"
+
+ case YY_END_OF_BUFFER:
+ {
+@@ -1374,6 +1365,7 @@ ECHO;
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
++ } /* end of user's declarations */
+ } /* end of yylex */
+
+ /* yy_get_next_buffer - try to read in a new buffer
+@@ -1429,21 +1421,21 @@ static int yy_get_next_buffer (void)
+
+ else
+ {
+- int num_to_read =
++ yy_size_t num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+- YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
++ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+- int new_size = b->yy_buf_size * 2;
++ yy_size_t new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+@@ -1474,7 +1466,7 @@ static int yy_get_next_buffer (void)
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+- (yy_n_chars), (size_t) num_to_read );
++ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+@@ -1536,7 +1528,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 >= 166 )
++ if ( yy_current_state >= 159 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+@@ -1564,13 +1556,13 @@ 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 >= 166 )
++ if ( yy_current_state >= 159 )
+ 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 == 165);
++ yy_is_jam = (yy_current_state == 158);
+
+- return yy_is_jam ? 0 : yy_current_state;
++ return yy_is_jam ? 0 : yy_current_state;
+ }
+
+ #ifndef YY_NO_INPUT
+@@ -1597,7 +1589,7 @@ static int yy_get_next_buffer (void)
+
+ else
+ { /* need more input */
+- int offset = (yy_c_buf_p) - (yytext_ptr);
++ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+@@ -1871,7 +1863,7 @@ void yypop_buffer_state (void)
+ */
+ static void yyensure_buffer_stack (void)
+ {
+- int num_to_alloc;
++ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+@@ -1968,12 +1960,12 @@ YY_BUFFER_STATE yy_scan_string (yyconst
+ *
+ * @return the newly allocated buffer state object.
+ */
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
++YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
+ {
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+- int i;
++ yy_size_t i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+@@ -2055,7 +2047,7 @@ FILE *yyget_out (void)
+ /** Get the length of the current token.
+ *
+ */
+-int yyget_leng (void)
++yy_size_t yyget_leng (void)
+ {
+ return yyleng;
+ }
+@@ -2203,7 +2195,7 @@ void yyfree (void * ptr )
+
+ #define YYTABLES_NAME "yytables"
+
+-#line 260 "dtc-lexer.l"
++#line 254 "dtc-lexer.l"
+
+
+
+--- a/scripts/dtc/dtc-parser.tab.c_shipped
++++ b/scripts/dtc/dtc-parser.tab.c_shipped
+@@ -1,19 +1,19 @@
+-/* A Bison parser, made by GNU Bison 2.5. */
++/* A Bison parser, made by GNU Bison 3.0.2. */
+
+ /* Bison implementation for Yacc-like parsers in C
+-
+- Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+-
++
++ Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, 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 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, see <http://www.gnu.org/licenses/>. */
+
+@@ -26,7 +26,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. */
+
+@@ -44,7 +44,7 @@
+ #define YYBISON 1
+
+ /* Bison version. */
+-#define YYBISON_VERSION "2.5"
++#define YYBISON_VERSION "3.0.2"
+
+ /* Skeleton name. */
+ #define YYSKELETON_NAME "yacc.c"
+@@ -58,18 +58,13 @@
+ /* Pull parsers. */
+ #define YYPULL 1
+
+-/* Using locations. */
+-#define YYLSP_NEEDED 1
+
+
+
+ /* Copy the first part of user declarations. */
+-
+-/* Line 268 of yacc.c */
+-#line 20 "dtc-parser.y"
++#line 20 "dtc-parser.y" /* yacc.c:339 */
+
+ #include <stdio.h>
+-#include <inttypes.h>
+
+ #include "dtc.h"
+ #include "srcpos.h"
+@@ -85,14 +80,15 @@ extern void yyerror(char const *s);
+ extern struct boot_info *the_boot_info;
+ extern bool treesource_error;
+
++#line 84 "dtc-parser.tab.c" /* yacc.c:339 */
+
+-/* Line 268 of yacc.c */
+-#line 91 "dtc-parser.tab.c"
+-
+-/* Enabling traces. */
+-#ifndef YYDEBUG
+-# define YYDEBUG 0
+-#endif
++# ifndef YY_NULLPTR
++# if defined __cplusplus && 201103L <= __cplusplus
++# define YY_NULLPTR nullptr
++# else
++# define YY_NULLPTR 0
++# endif
++# endif
+
+ /* Enabling verbose error messages. */
+ #ifdef YYERROR_VERBOSE
+@@ -102,51 +98,53 @@ extern bool treesource_error;
+ # define YYERROR_VERBOSE 0
+ #endif
+
+-/* Enabling the token table. */
+-#ifndef YYTOKEN_TABLE
+-# define YYTOKEN_TABLE 0
++/* In a future release of Bison, this section will be replaced
++ by #include "dtc-parser.tab.h". */
++#ifndef YY_YY_DTC_PARSER_TAB_H_INCLUDED
++# define YY_YY_DTC_PARSER_TAB_H_INCLUDED
++/* Debug traces. */
++#ifndef YYDEBUG
++# define YYDEBUG 0
++#endif
++#if YYDEBUG
++extern int yydebug;
+ #endif
+
+-
+-/* Tokens. */
++/* Token type. */
+ #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_PLUGIN = 259,
+- DT_MEMRESERVE = 260,
+- DT_LSHIFT = 261,
+- DT_RSHIFT = 262,
+- DT_LE = 263,
+- DT_GE = 264,
+- DT_EQ = 265,
+- DT_NE = 266,
+- DT_AND = 267,
+- DT_OR = 268,
+- DT_BITS = 269,
+- DT_DEL_PROP = 270,
+- DT_DEL_NODE = 271,
+- DT_PROPNODENAME = 272,
+- DT_LITERAL = 273,
+- DT_CHAR_LITERAL = 274,
+- DT_BYTE = 275,
+- DT_STRING = 276,
+- DT_LABEL = 277,
+- DT_REF = 278,
+- DT_INCBIN = 279
+- };
++ enum yytokentype
++ {
++ DT_V1 = 258,
++ DT_MEMRESERVE = 259,
++ DT_LSHIFT = 260,
++ DT_RSHIFT = 261,
++ DT_LE = 262,
++ DT_GE = 263,
++ DT_EQ = 264,
++ DT_NE = 265,
++ DT_AND = 266,
++ DT_OR = 267,
++ DT_BITS = 268,
++ DT_DEL_PROP = 269,
++ DT_DEL_NODE = 270,
++ DT_PROPNODENAME = 271,
++ DT_LITERAL = 272,
++ DT_CHAR_LITERAL = 273,
++ DT_BYTE = 274,
++ DT_STRING = 275,
++ DT_LABEL = 276,
++ DT_REF = 277,
++ DT_INCBIN = 278
++ };
+ #endif
+
+-
+-
++/* Value type. */
+ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+-typedef union YYSTYPE
++typedef union YYSTYPE YYSTYPE;
++union YYSTYPE
+ {
+-
+-/* Line 293 of yacc.c */
+-#line 39 "dtc-parser.y"
++#line 38 "dtc-parser.y" /* yacc.c:355 */
+
+ char *propnodename;
+ char *labelref;
+@@ -164,37 +162,37 @@ typedef union YYSTYPE
+ struct node *nodelist;
+ struct reserve_info *re;
+ uint64_t integer;
+- int is_plugin;
+-
+-
+
+-/* Line 293 of yacc.c */
+-#line 173 "dtc-parser.tab.c"
+-} YYSTYPE;
++#line 167 "dtc-parser.tab.c" /* yacc.c:355 */
++};
+ # define YYSTYPE_IS_TRIVIAL 1
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+ # define YYSTYPE_IS_DECLARED 1
+ #endif
+
++/* Location type. */
+ #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
+-typedef struct YYLTYPE
++typedef struct YYLTYPE YYLTYPE;
++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. */
++extern YYSTYPE yylval;
++extern YYLTYPE yylloc;
++int yyparse (void);
++
++#endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED */
+
++/* Copy the second part of user declarations. */
+
+-/* Line 343 of yacc.c */
+-#line 198 "dtc-parser.tab.c"
++#line 196 "dtc-parser.tab.c" /* yacc.c:358 */
+
+ #ifdef short
+ # undef short
+@@ -208,11 +206,8 @@ typedef unsigned char yytype_uint8;
+
+ #ifdef YYTYPE_INT8
+ typedef YYTYPE_INT8 yytype_int8;
+-#elif (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-typedef signed char yytype_int8;
+ #else
+-typedef short int yytype_int8;
++typedef signed char yytype_int8;
+ #endif
+
+ #ifdef YYTYPE_UINT16
+@@ -232,8 +227,7 @@ typedef short int yytype_int16;
+ # define YYSIZE_T __SIZE_TYPE__
+ # elif defined size_t
+ # define YYSIZE_T size_t
+-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
++# elif ! defined YYSIZE_T
+ # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+ # define YYSIZE_T size_t
+ # else
+@@ -247,39 +241,68 @@ typedef short int yytype_int16;
+ # if defined YYENABLE_NLS && YYENABLE_NLS
+ # if ENABLE_NLS
+ # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+-# define YY_(msgid) dgettext ("bison-runtime", msgid)
++# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+ # endif
+ # endif
+ # ifndef YY_
+-# define YY_(msgid) msgid
++# define YY_(Msgid) Msgid
++# endif
++#endif
++
++#ifndef YY_ATTRIBUTE
++# if (defined __GNUC__ \
++ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
++ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
++# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
++# else
++# define YY_ATTRIBUTE(Spec) /* empty */
++# endif
++#endif
++
++#ifndef YY_ATTRIBUTE_PURE
++# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
++#endif
++
++#ifndef YY_ATTRIBUTE_UNUSED
++# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
++#endif
++
++#if !defined _Noreturn \
++ && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
++# if defined _MSC_VER && 1200 <= _MSC_VER
++# define _Noreturn __declspec (noreturn)
++# else
++# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+ # endif
+ #endif
+
+ /* Suppress unused-variable warnings by "using" E. */
+ #if ! defined lint || defined __GNUC__
+-# define YYUSE(e) ((void) (e))
++# define YYUSE(E) ((void) (E))
+ #else
+-# define YYUSE(e) /* empty */
++# define YYUSE(E) /* empty */
+ #endif
+
+-/* Identity function, used to suppress warnings about constant conditions. */
+-#ifndef lint
+-# define YYID(n) (n)
+-#else
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static int
+-YYID (int yyi)
++#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
++/* Suppress an incorrect diagnostic about yylval being uninitialized. */
++# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
++ _Pragma ("GCC diagnostic push") \
++ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
++ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
++# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
++ _Pragma ("GCC diagnostic pop")
+ #else
+-static int
+-YYID (yyi)
+- int yyi;
++# define YY_INITIAL_VALUE(Value) Value
+ #endif
+-{
+- return yyi;
+-}
++#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
++# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
++# define YY_IGNORE_MAYBE_UNINITIALIZED_END
++#endif
++#ifndef YY_INITIAL_VALUE
++# define YY_INITIAL_VALUE(Value) /* Nothing. */
+ #endif
+
++
+ #if ! defined yyoverflow || YYERROR_VERBOSE
+
+ /* The parser invokes alloca or malloc; define the necessary symbols. */
+@@ -297,9 +320,9 @@ YYID (yyi)
+ # define alloca _alloca
+ # else
+ # define YYSTACK_ALLOC alloca
+-# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
++# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+ # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
++ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+ # ifndef EXIT_SUCCESS
+ # define EXIT_SUCCESS 0
+ # endif
+@@ -309,8 +332,8 @@ YYID (yyi)
+ # endif
+
+ # ifdef YYSTACK_ALLOC
+- /* Pacify GCC's `empty if-body' warning. */
+-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
++ /* Pacify GCC's 'empty if-body' warning. */
++# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+ # ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+@@ -326,7 +349,7 @@ YYID (yyi)
+ # endif
+ # if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+- && (defined YYFREE || defined free)))
++ && (defined YYFREE || defined free)))
+ # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ # ifndef EXIT_SUCCESS
+ # define EXIT_SUCCESS 0
+@@ -334,15 +357,13 @@ YYID (yyi)
+ # endif
+ # ifndef YYMALLOC
+ # define YYMALLOC malloc
+-# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
++# if ! defined malloc && ! defined EXIT_SUCCESS
+ void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+ # endif
+ # endif
+ # ifndef YYFREE
+ # define YYFREE free
+-# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
++# if ! defined free && ! defined EXIT_SUCCESS
+ void free (void *); /* INFRINGES ON USER NAME SPACE */
+ # endif
+ # endif
+@@ -352,8 +373,8 @@ void free (void *); /* INFRINGES ON USER
+
+ #if (! defined yyoverflow \
+ && (! defined __cplusplus \
+- || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
+- && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
++ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
++ && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+ /* A type that is properly aligned for any stack member. */
+ union yyalloc
+@@ -379,35 +400,35 @@ 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_alloc, Stack) \
+- do \
+- { \
+- YYSIZE_T yynewbytes; \
+- YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+- Stack = &yyptr->Stack_alloc; \
+- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+- yyptr += yynewbytes / sizeof (*yyptr); \
+- } \
+- while (YYID (0))
++# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
++ do \
++ { \
++ YYSIZE_T yynewbytes; \
++ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
++ Stack = &yyptr->Stack_alloc; \
++ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
++ yyptr += yynewbytes / sizeof (*yyptr); \
++ } \
++ while (0)
+
+ #endif
+
+ #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+-/* Copy COUNT objects from FROM to TO. The source and destination do
++/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+ # ifndef YYCOPY
+ # if defined __GNUC__ && 1 < __GNUC__
+-# define YYCOPY(To, From, Count) \
+- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
++# define YYCOPY(Dst, Src, Count) \
++ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+ # else
+-# define YYCOPY(To, From, Count) \
+- do \
+- { \
+- YYSIZE_T yyi; \
+- for (yyi = 0; yyi < (Count); yyi++) \
+- (To)[yyi] = (From)[yyi]; \
+- } \
+- while (YYID (0))
++# define YYCOPY(Dst, Src, Count) \
++ do \
++ { \
++ YYSIZE_T yyi; \
++ for (yyi = 0; yyi < (Count); yyi++) \
++ (Dst)[yyi] = (Src)[yyi]; \
++ } \
++ while (0)
+ # endif
+ # endif
+ #endif /* !YYCOPY_NEEDED */
+@@ -418,37 +439,39 @@ union yyalloc
+ #define YYLAST 136
+
+ /* YYNTOKENS -- Number of terminals. */
+-#define YYNTOKENS 48
++#define YYNTOKENS 47
+ /* YYNNTS -- Number of nonterminals. */
+-#define YYNNTS 29
++#define YYNNTS 28
+ /* YYNRULES -- Number of rules. */
+-#define YYNRULES 82
+-/* YYNRULES -- Number of states. */
+-#define YYNSTATES 147
++#define YYNRULES 80
++/* YYNSTATES -- Number of states. */
++#define YYNSTATES 144
+
+-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
++/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
++ by yylex, with out-of-bounds checking. */
+ #define YYUNDEFTOK 2
+-#define YYMAXUTOK 279
++#define YYMAXUTOK 278
+
+-#define YYTRANSLATE(YYX) \
++#define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
++/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
++ as returned by yylex, without out-of-bounds checking. */
+ static const yytype_uint8 yytranslate[] =
+ {
+ 0, 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, 47, 2, 2, 2, 45, 41, 2,
+- 33, 35, 44, 42, 34, 43, 2, 26, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 38, 25,
+- 36, 29, 30, 37, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 46, 2, 2, 2, 44, 40, 2,
++ 32, 34, 43, 41, 33, 42, 2, 25, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 37, 24,
++ 35, 28, 29, 36, 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, 31, 2, 32, 40, 2, 2, 2, 2, 2,
++ 2, 30, 2, 31, 39, 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, 27, 39, 28, 46, 2, 2, 2,
++ 2, 2, 2, 26, 38, 27, 45, 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,
+@@ -463,335 +486,292 @@ static const yytype_uint8 yytranslate[]
+ 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, 14,
+- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
++ 15, 16, 17, 18, 19, 20, 21, 22, 23
+ };
+
+ #if YYDEBUG
+-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+- YYRHS. */
+-static const yytype_uint16 yyprhs[] =
+-{
+- 0, 0, 3, 9, 10, 13, 14, 17, 22, 25,
+- 28, 32, 37, 41, 46, 52, 53, 56, 61, 64,
+- 68, 71, 74, 78, 83, 86, 96, 102, 105, 106,
+- 109, 112, 116, 118, 121, 124, 127, 129, 131, 135,
+- 137, 139, 145, 147, 151, 153, 157, 159, 163, 165,
+- 169, 171, 175, 177, 181, 185, 187, 191, 195, 199,
+- 203, 207, 211, 213, 217, 221, 223, 227, 231, 235,
+- 237, 239, 242, 245, 248, 249, 252, 255, 256, 259,
+- 262, 265, 269
+-};
+-
+-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+-static const yytype_int8 yyrhs[] =
+-{
+- 49, 0, -1, 3, 25, 50, 51, 53, -1, -1,
+- 4, 25, -1, -1, 52, 51, -1, 5, 60, 60,
+- 25, -1, 22, 52, -1, 26, 54, -1, 53, 26,
+- 54, -1, 53, 22, 23, 54, -1, 53, 23, 54,
+- -1, 53, 16, 23, 25, -1, 27, 55, 75, 28,
+- 25, -1, -1, 55, 56, -1, 17, 29, 57, 25,
+- -1, 17, 25, -1, 15, 17, 25, -1, 22, 56,
+- -1, 58, 21, -1, 58, 59, 30, -1, 58, 31,
+- 74, 32, -1, 58, 23, -1, 58, 24, 33, 21,
+- 34, 60, 34, 60, 35, -1, 58, 24, 33, 21,
+- 35, -1, 57, 22, -1, -1, 57, 34, -1, 58,
+- 22, -1, 14, 18, 36, -1, 36, -1, 59, 60,
+- -1, 59, 23, -1, 59, 22, -1, 18, -1, 19,
+- -1, 33, 61, 35, -1, 62, -1, 63, -1, 63,
+- 37, 61, 38, 62, -1, 64, -1, 63, 13, 64,
+- -1, 65, -1, 64, 12, 65, -1, 66, -1, 65,
+- 39, 66, -1, 67, -1, 66, 40, 67, -1, 68,
+- -1, 67, 41, 68, -1, 69, -1, 68, 10, 69,
+- -1, 68, 11, 69, -1, 70, -1, 69, 36, 70,
+- -1, 69, 30, 70, -1, 69, 8, 70, -1, 69,
+- 9, 70, -1, 70, 6, 71, -1, 70, 7, 71,
+- -1, 71, -1, 71, 42, 72, -1, 71, 43, 72,
+- -1, 72, -1, 72, 44, 73, -1, 72, 26, 73,
+- -1, 72, 45, 73, -1, 73, -1, 60, -1, 43,
+- 73, -1, 46, 73, -1, 47, 73, -1, -1, 74,
+- 20, -1, 74, 22, -1, -1, 76, 75, -1, 76,
+- 56, -1, 17, 54, -1, 16, 17, 25, -1, 22,
+- 76, -1
+-};
+-
+-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
++ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+ static const yytype_uint16 yyrline[] =
+ {
+- 0, 108, 108, 119, 122, 130, 133, 140, 144, 152,
+- 156, 161, 172, 182, 197, 205, 208, 215, 219, 223,
+- 227, 235, 239, 243, 247, 251, 267, 277, 285, 288,
+- 292, 299, 315, 320, 339, 353, 360, 361, 362, 369,
+- 373, 374, 378, 379, 383, 384, 388, 389, 393, 394,
+- 398, 399, 403, 404, 405, 409, 410, 411, 412, 413,
+- 417, 418, 419, 423, 424, 425, 429, 430, 431, 432,
+- 436, 437, 438, 439, 444, 447, 451, 459, 462, 466,
+- 474, 478, 482
++ 0, 104, 104, 113, 116, 123, 127, 135, 139, 144,
++ 155, 165, 180, 188, 191, 198, 202, 206, 210, 218,
++ 222, 226, 230, 234, 250, 260, 268, 271, 275, 282,
++ 298, 303, 322, 336, 343, 344, 345, 352, 356, 357,
++ 361, 362, 366, 367, 371, 372, 376, 377, 381, 382,
++ 386, 387, 388, 392, 393, 394, 395, 396, 400, 401,
++ 402, 406, 407, 408, 412, 413, 414, 415, 419, 420,
++ 421, 422, 427, 430, 434, 442, 445, 449, 457, 461,
++ 465
+ };
+ #endif
+
+-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
++#if YYDEBUG || YYERROR_VERBOSE || 0
+ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+ static const char *const yytname[] =
+ {
+- "$end", "error", "$undefined", "DT_V1", "DT_PLUGIN", "DT_MEMRESERVE",
+- "DT_LSHIFT", "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND",
+- "DT_OR", "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME",
+- "DT_LITERAL", "DT_CHAR_LITERAL", "DT_BYTE", "DT_STRING", "DT_LABEL",
+- "DT_REF", "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'='", "'>'", "'['",
+- "']'", "'('", "','", "')'", "'<'", "'?'", "':'", "'|'", "'^'", "'&'",
+- "'+'", "'-'", "'*'", "'%'", "'~'", "'!'", "$accept", "sourcefile",
+- "plugindecl", "memreserves", "memreserve", "devicetree", "nodedef",
+- "proplist", "propdef", "propdata", "propdataprefix", "arrayprefix",
+- "integer_prim", "integer_expr", "integer_trinary", "integer_or",
+- "integer_and", "integer_bitor", "integer_bitxor", "integer_bitand",
+- "integer_eq", "integer_rela", "integer_shift", "integer_add",
+- "integer_mul", "integer_unary", "bytestring", "subnodes", "subnode", 0
++ "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE", "DT_LSHIFT",
++ "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND", "DT_OR",
++ "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME", "DT_LITERAL",
++ "DT_CHAR_LITERAL", "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF",
++ "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'='", "'>'", "'['", "']'",
++ "'('", "','", "')'", "'<'", "'?'", "':'", "'|'", "'^'", "'&'", "'+'",
++ "'-'", "'*'", "'%'", "'~'", "'!'", "$accept", "sourcefile",
++ "memreserves", "memreserve", "devicetree", "nodedef", "proplist",
++ "propdef", "propdata", "propdataprefix", "arrayprefix", "integer_prim",
++ "integer_expr", "integer_trinary", "integer_or", "integer_and",
++ "integer_bitor", "integer_bitxor", "integer_bitand", "integer_eq",
++ "integer_rela", "integer_shift", "integer_add", "integer_mul",
++ "integer_unary", "bytestring", "subnodes", "subnode", YY_NULLPTR
+ };
+ #endif
+
+ # ifdef YYPRINT
+-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+- token YYLEX-NUM. */
++/* YYTOKNUM[NUM] -- (External) token number corresponding to the
++ (internal) symbol number NUM (which must be that of a token). */
+ static const yytype_uint16 yytoknum[] =
+ {
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+- 275, 276, 277, 278, 279, 59, 47, 123, 125, 61,
+- 62, 91, 93, 40, 44, 41, 60, 63, 58, 124,
+- 94, 38, 43, 45, 42, 37, 126, 33
++ 275, 276, 277, 278, 59, 47, 123, 125, 61, 62,
++ 91, 93, 40, 44, 41, 60, 63, 58, 124, 94,
++ 38, 43, 45, 42, 37, 126, 33
+ };
+ # endif
+
+-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+-static const yytype_uint8 yyr1[] =
+-{
+- 0, 48, 49, 50, 50, 51, 51, 52, 52, 53,
+- 53, 53, 53, 53, 54, 55, 55, 56, 56, 56,
+- 56, 57, 57, 57, 57, 57, 57, 57, 58, 58,
+- 58, 59, 59, 59, 59, 59, 60, 60, 60, 61,
+- 62, 62, 63, 63, 64, 64, 65, 65, 66, 66,
+- 67, 67, 68, 68, 68, 69, 69, 69, 69, 69,
+- 70, 70, 70, 71, 71, 71, 72, 72, 72, 72,
+- 73, 73, 73, 73, 74, 74, 74, 75, 75, 75,
+- 76, 76, 76
+-};
++#define YYPACT_NINF -81
+
+-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+-static const yytype_uint8 yyr2[] =
++#define yypact_value_is_default(Yystate) \
++ (!!((Yystate) == (-81)))
++
++#define YYTABLE_NINF -1
++
++#define yytable_value_is_error(Yytable_value) \
++ 0
++
++ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
++ STATE-NUM. */
++static const yytype_int8 yypact[] =
+ {
+- 0, 2, 5, 0, 2, 0, 2, 4, 2, 2,
+- 3, 4, 3, 4, 5, 0, 2, 4, 2, 3,
+- 2, 2, 3, 4, 2, 9, 5, 2, 0, 2,
+- 2, 3, 1, 2, 2, 2, 1, 1, 3, 1,
+- 1, 5, 1, 3, 1, 3, 1, 3, 1, 3,
+- 1, 3, 1, 3, 3, 1, 3, 3, 3, 3,
+- 3, 3, 1, 3, 3, 1, 3, 3, 3, 1,
+- 1, 2, 2, 2, 0, 2, 2, 0, 2, 2,
+- 2, 3, 2
++ 16, -11, 21, 10, -81, 25, 10, 19, 10, -81,
++ -81, -9, 25, -81, 2, 51, -81, -9, -9, -9,
++ -81, 1, -81, -6, 50, 14, 28, 29, 36, 3,
++ 58, 44, -3, -81, 47, -81, -81, 65, 68, 2,
++ 2, -81, -81, -81, -81, -9, -9, -9, -9, -9,
++ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
++ -9, -9, -9, -9, -81, 63, 69, 2, -81, -81,
++ 50, 57, 14, 28, 29, 36, 3, 3, 58, 58,
++ 58, 58, 44, 44, -3, -3, -81, -81, -81, 79,
++ 80, -8, 63, -81, 72, 63, -81, -81, -9, 76,
++ 77, -81, -81, -81, -81, -81, 78, -81, -81, -81,
++ -81, -81, 35, 4, -81, -81, -81, -81, 86, -81,
++ -81, -81, 73, -81, -81, 33, 71, 84, 39, -81,
++ -81, -81, -81, -81, 41, -81, -81, -81, 25, -81,
++ 74, 25, 75, -81
+ };
+
+-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+- Performed when YYTABLE doesn't specify something else to do. Zero
+- means the default is an error. */
++ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
++ Performed when YYTABLE does not specify something else to do. Zero
++ means the default is an error. */
+ static const yytype_uint8 yydefact[] =
+ {
+- 0, 0, 0, 3, 1, 0, 5, 4, 0, 0,
+- 0, 5, 36, 37, 0, 0, 8, 0, 2, 6,
+- 0, 0, 0, 70, 0, 39, 40, 42, 44, 46,
+- 48, 50, 52, 55, 62, 65, 69, 0, 15, 9,
+- 0, 0, 0, 0, 71, 72, 73, 38, 0, 0,
++ 0, 0, 0, 3, 1, 0, 0, 0, 3, 34,
++ 35, 0, 0, 6, 0, 2, 4, 0, 0, 0,
++ 68, 0, 37, 38, 40, 42, 44, 46, 48, 50,
++ 53, 60, 63, 67, 0, 13, 7, 0, 0, 0,
++ 0, 69, 70, 71, 36, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 0, 0, 7, 77, 0,
+- 0, 12, 10, 43, 0, 45, 47, 49, 51, 53,
+- 54, 58, 59, 57, 56, 60, 61, 63, 64, 67,
+- 66, 68, 0, 0, 0, 0, 16, 0, 77, 13,
+- 11, 0, 0, 0, 18, 28, 80, 20, 82, 0,
+- 79, 78, 41, 19, 81, 0, 0, 14, 27, 17,
+- 29, 0, 21, 30, 24, 0, 74, 32, 0, 0,
+- 0, 0, 35, 34, 22, 33, 31, 0, 75, 76,
+- 23, 0, 26, 0, 0, 0, 25
++ 0, 0, 0, 0, 5, 75, 0, 0, 10, 8,
++ 41, 0, 43, 45, 47, 49, 51, 52, 56, 57,
++ 55, 54, 58, 59, 61, 62, 65, 64, 66, 0,
++ 0, 0, 0, 14, 0, 75, 11, 9, 0, 0,
++ 0, 16, 26, 78, 18, 80, 0, 77, 76, 39,
++ 17, 79, 0, 0, 12, 25, 15, 27, 0, 19,
++ 28, 22, 0, 72, 30, 0, 0, 0, 0, 33,
++ 32, 20, 31, 29, 0, 73, 74, 21, 0, 24,
++ 0, 0, 0, 23
+ };
+
+-/* YYDEFGOTO[NTERM-NUM]. */
+-static const yytype_int16 yydefgoto[] =
++ /* YYPGOTO[NTERM-NUM]. */
++static const yytype_int8 yypgoto[] =
+ {
+- -1, 2, 6, 10, 11, 18, 39, 68, 96, 115,
+- 116, 128, 23, 24, 25, 26, 27, 28, 29, 30,
+- 31, 32, 33, 34, 35, 36, 131, 97, 98
++ -81, -81, 100, 104, -81, -38, -81, -80, -81, -81,
++ -81, -5, 66, 13, -81, 70, 67, 81, 64, 82,
++ 37, 27, 34, 38, -14, -81, 22, 24
+ };
+
+-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+- STATE-NUM. */
+-#define YYPACT_NINF -84
+-static const yytype_int8 yypact[] =
++ /* YYDEFGOTO[NTERM-NUM]. */
++static const yytype_int16 yydefgoto[] =
+ {
+- 15, -12, 35, 42, -84, 27, 9, -84, 24, 9,
+- 43, 9, -84, -84, -10, 24, -84, 60, 44, -84,
+- -10, -10, -10, -84, 55, -84, -7, 52, 53, 51,
+- 54, 10, 2, 38, 37, -4, -84, 68, -84, -84,
+- 71, 73, 60, 60, -84, -84, -84, -84, -10, -10,
+- -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
+- -10, -10, -10, -10, -10, -10, -10, -84, 56, 72,
+- 60, -84, -84, 52, 61, 53, 51, 54, 10, 2,
+- 2, 38, 38, 38, 38, 37, 37, -4, -4, -84,
+- -84, -84, 81, 83, 34, 56, -84, 74, 56, -84,
+- -84, -10, 76, 78, -84, -84, -84, -84, -84, 79,
+- -84, -84, -84, -84, -84, -6, 3, -84, -84, -84,
+- -84, 87, -84, -84, -84, 75, -84, -84, 32, 70,
+- 86, 36, -84, -84, -84, -84, -84, 47, -84, -84,
+- -84, 24, -84, 77, 24, 80, -84
++ -1, 2, 7, 8, 15, 36, 65, 93, 112, 113,
++ 125, 20, 21, 22, 23, 24, 25, 26, 27, 28,
++ 29, 30, 31, 32, 33, 128, 94, 95
+ };
+
+-/* YYPGOTO[NTERM-NUM]. */
+-static const yytype_int8 yypgoto[] =
++ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
++ positive, shift that token. If negative, reduce the rule whose
++ number is the opposite. If YYTABLE_NINF, syntax error. */
++static const yytype_uint8 yytable[] =
+ {
+- -84, -84, -84, 98, 101, -84, -41, -84, -83, -84,
+- -84, -84, -8, 63, 12, -84, 66, 67, 65, 69,
+- 82, 29, 18, 25, 26, -17, -84, 20, 28
++ 12, 68, 69, 41, 42, 43, 45, 34, 9, 10,
++ 53, 54, 104, 3, 5, 107, 101, 118, 35, 1,
++ 102, 4, 61, 11, 119, 120, 121, 122, 35, 97,
++ 46, 6, 55, 17, 123, 44, 18, 19, 56, 124,
++ 62, 63, 9, 10, 14, 51, 52, 86, 87, 88,
++ 9, 10, 48, 103, 129, 130, 115, 11, 135, 116,
++ 136, 47, 131, 57, 58, 11, 37, 49, 117, 50,
++ 137, 64, 38, 39, 138, 139, 40, 89, 90, 91,
++ 78, 79, 80, 81, 92, 59, 60, 66, 76, 77,
++ 67, 82, 83, 96, 98, 99, 100, 84, 85, 106,
++ 110, 111, 114, 126, 134, 127, 133, 141, 16, 143,
++ 13, 109, 71, 74, 72, 70, 105, 108, 0, 0,
++ 132, 0, 0, 0, 0, 0, 0, 0, 0, 73,
++ 0, 0, 75, 140, 0, 0, 142
+ };
+
+-/* 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 YYTABLE_NINF, syntax error. */
+-#define YYTABLE_NINF -1
+-static const yytype_uint8 yytable[] =
++static const yytype_int16 yycheck[] =
+ {
+- 15, 71, 72, 44, 45, 46, 48, 37, 12, 13,
+- 56, 57, 107, 3, 8, 110, 118, 121, 1, 119,
+- 54, 55, 64, 14, 122, 123, 124, 125, 120, 100,
+- 49, 9, 58, 20, 126, 4, 21, 22, 59, 127,
+- 65, 66, 12, 13, 60, 61, 5, 89, 90, 91,
+- 12, 13, 7, 106, 132, 133, 138, 14, 139, 104,
+- 40, 38, 134, 105, 50, 14, 41, 42, 140, 17,
+- 43, 92, 93, 94, 81, 82, 83, 84, 95, 62,
+- 63, 141, 142, 79, 80, 85, 86, 38, 87, 88,
+- 47, 52, 51, 67, 69, 53, 70, 99, 102, 101,
+- 103, 113, 109, 114, 117, 129, 136, 137, 130, 19,
+- 16, 144, 74, 112, 73, 146, 76, 75, 111, 0,
+- 135, 77, 0, 108, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 143, 0, 78, 145
++ 5, 39, 40, 17, 18, 19, 12, 12, 17, 18,
++ 7, 8, 92, 24, 4, 95, 24, 13, 26, 3,
++ 28, 0, 25, 32, 20, 21, 22, 23, 26, 67,
++ 36, 21, 29, 42, 30, 34, 45, 46, 35, 35,
++ 43, 44, 17, 18, 25, 9, 10, 61, 62, 63,
++ 17, 18, 38, 91, 21, 22, 21, 32, 19, 24,
++ 21, 11, 29, 5, 6, 32, 15, 39, 33, 40,
++ 31, 24, 21, 22, 33, 34, 25, 14, 15, 16,
++ 53, 54, 55, 56, 21, 41, 42, 22, 51, 52,
++ 22, 57, 58, 24, 37, 16, 16, 59, 60, 27,
++ 24, 24, 24, 17, 20, 32, 35, 33, 8, 34,
++ 6, 98, 46, 49, 47, 45, 92, 95, -1, -1,
++ 125, -1, -1, -1, -1, -1, -1, -1, -1, 48,
++ -1, -1, 50, 138, -1, -1, 141
+ };
+
+-#define yypact_value_is_default(yystate) \
+- ((yystate) == (-84))
+-
+-#define yytable_value_is_error(yytable_value) \
+- YYID (0)
++ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
++ symbol of state STATE-NUM. */
++static const yytype_uint8 yystos[] =
++{
++ 0, 3, 48, 24, 0, 4, 21, 49, 50, 17,
++ 18, 32, 58, 50, 25, 51, 49, 42, 45, 46,
++ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
++ 68, 69, 70, 71, 58, 26, 52, 15, 21, 22,
++ 25, 71, 71, 71, 34, 12, 36, 11, 38, 39,
++ 40, 9, 10, 7, 8, 29, 35, 5, 6, 41,
++ 42, 25, 43, 44, 24, 53, 22, 22, 52, 52,
++ 62, 59, 63, 64, 65, 66, 67, 67, 68, 68,
++ 68, 68, 69, 69, 70, 70, 71, 71, 71, 14,
++ 15, 16, 21, 54, 73, 74, 24, 52, 37, 16,
++ 16, 24, 28, 52, 54, 74, 27, 54, 73, 60,
++ 24, 24, 55, 56, 24, 21, 24, 33, 13, 20,
++ 21, 22, 23, 30, 35, 57, 17, 32, 72, 21,
++ 22, 29, 58, 35, 20, 19, 21, 31, 33, 34,
++ 58, 33, 58, 34
++};
+
+-static const yytype_int16 yycheck[] =
++ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
++static const yytype_uint8 yyr1[] =
+ {
+- 8, 42, 43, 20, 21, 22, 13, 15, 18, 19,
+- 8, 9, 95, 25, 5, 98, 22, 14, 3, 25,
+- 10, 11, 26, 33, 21, 22, 23, 24, 34, 70,
+- 37, 22, 30, 43, 31, 0, 46, 47, 36, 36,
+- 44, 45, 18, 19, 6, 7, 4, 64, 65, 66,
+- 18, 19, 25, 94, 22, 23, 20, 33, 22, 25,
+- 16, 27, 30, 29, 12, 33, 22, 23, 32, 26,
+- 26, 15, 16, 17, 56, 57, 58, 59, 22, 42,
+- 43, 34, 35, 54, 55, 60, 61, 27, 62, 63,
+- 35, 40, 39, 25, 23, 41, 23, 25, 17, 38,
+- 17, 25, 28, 25, 25, 18, 36, 21, 33, 11,
+- 9, 34, 49, 101, 48, 35, 51, 50, 98, -1,
+- 128, 52, -1, 95, -1, -1, -1, -1, -1, -1,
+- -1, -1, -1, 141, -1, 53, 144
++ 0, 47, 48, 49, 49, 50, 50, 51, 51, 51,
++ 51, 51, 52, 53, 53, 54, 54, 54, 54, 55,
++ 55, 55, 55, 55, 55, 55, 56, 56, 56, 57,
++ 57, 57, 57, 57, 58, 58, 58, 59, 60, 60,
++ 61, 61, 62, 62, 63, 63, 64, 64, 65, 65,
++ 66, 66, 66, 67, 67, 67, 67, 67, 68, 68,
++ 68, 69, 69, 69, 70, 70, 70, 70, 71, 71,
++ 71, 71, 72, 72, 72, 73, 73, 73, 74, 74,
++ 74
+ };
+
+-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+- symbol of state STATE-NUM. */
+-static const yytype_uint8 yystos[] =
++ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
++static const yytype_uint8 yyr2[] =
+ {
+- 0, 3, 49, 25, 0, 4, 50, 25, 5, 22,
+- 51, 52, 18, 19, 33, 60, 52, 26, 53, 51,
+- 43, 46, 47, 60, 61, 62, 63, 64, 65, 66,
+- 67, 68, 69, 70, 71, 72, 73, 60, 27, 54,
+- 16, 22, 23, 26, 73, 73, 73, 35, 13, 37,
+- 12, 39, 40, 41, 10, 11, 8, 9, 30, 36,
+- 6, 7, 42, 43, 26, 44, 45, 25, 55, 23,
+- 23, 54, 54, 64, 61, 65, 66, 67, 68, 69,
+- 69, 70, 70, 70, 70, 71, 71, 72, 72, 73,
+- 73, 73, 15, 16, 17, 22, 56, 75, 76, 25,
+- 54, 38, 17, 17, 25, 29, 54, 56, 76, 28,
+- 56, 75, 62, 25, 25, 57, 58, 25, 22, 25,
+- 34, 14, 21, 22, 23, 24, 31, 36, 59, 18,
+- 33, 74, 22, 23, 30, 60, 36, 21, 20, 22,
+- 32, 34, 35, 60, 34, 60, 35
++ 0, 2, 4, 0, 2, 4, 2, 2, 3, 4,
++ 3, 4, 5, 0, 2, 4, 2, 3, 2, 2,
++ 3, 4, 2, 9, 5, 2, 0, 2, 2, 3,
++ 1, 2, 2, 2, 1, 1, 3, 1, 1, 5,
++ 1, 3, 1, 3, 1, 3, 1, 3, 1, 3,
++ 1, 3, 3, 1, 3, 3, 3, 3, 3, 3,
++ 1, 3, 3, 1, 3, 3, 3, 1, 1, 2,
++ 2, 2, 0, 2, 2, 0, 2, 2, 2, 3,
++ 2
+ };
+
+-#define yyerrok (yyerrstatus = 0)
+-#define yyclearin (yychar = YYEMPTY)
+-#define YYEMPTY (-2)
+-#define YYEOF 0
+-
+-#define YYACCEPT goto yyacceptlab
+-#define YYABORT goto yyabortlab
+-#define YYERROR goto yyerrorlab
+-
+-
+-/* Like YYERROR except do call yyerror. This remains here temporarily
+- to ease the transition to the new meaning of YYERROR, for GCC.
+- Once GCC version 2 has supplanted version 1, this can go. However,
+- YYFAIL appears to be in use. Nevertheless, it is formally deprecated
+- in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+- discussed. */
+-
+-#define YYFAIL goto yyerrlab
+-#if defined YYFAIL
+- /* This is here to suppress warnings from the GCC cpp's
+- -Wunused-macros. Normally we don't worry about that warning, but
+- some users do, and we want to make it easy for users to remove
+- YYFAIL uses, which will produce warnings from Bison 2.5. */
+-#endif
+
+-#define YYRECOVERING() (!!yyerrstatus)
++#define yyerrok (yyerrstatus = 0)
++#define yyclearin (yychar = YYEMPTY)
++#define YYEMPTY (-2)
++#define YYEOF 0
++
++#define YYACCEPT goto yyacceptlab
++#define YYABORT goto yyabortlab
++#define YYERROR goto yyerrorlab
+
+-#define YYBACKUP(Token, Value) \
+-do \
+- if (yychar == YYEMPTY && yylen == 1) \
+- { \
+- yychar = (Token); \
+- yylval = (Value); \
+- YYPOPSTACK (1); \
+- goto yybackup; \
+- } \
+- else \
+- { \
+- yyerror (YY_("syntax error: cannot back up")); \
+- YYERROR; \
+- } \
+-while (YYID (0))
+
++#define YYRECOVERING() (!!yyerrstatus)
+
+-#define YYTERROR 1
+-#define YYERRCODE 256
++#define YYBACKUP(Token, Value) \
++do \
++ if (yychar == YYEMPTY) \
++ { \
++ yychar = (Token); \
++ yylval = (Value); \
++ YYPOPSTACK (yylen); \
++ yystate = *yyssp; \
++ goto yybackup; \
++ } \
++ else \
++ { \
++ yyerror (YY_("syntax error: cannot back up")); \
++ YYERROR; \
++ } \
++while (0)
++
++/* Error token number */
++#define YYTERROR 1
++#define YYERRCODE 256
+
+
+ /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+ If N is 0, then set CURRENT to the empty location which ends
+ the previous symbol: RHS[0] (always defined). */
+
+-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+ #ifndef YYLLOC_DEFAULT
+-# 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; \
+- } \
+- else \
+- { \
+- (Current).first_line = (Current).last_line = \
+- YYRHSLOC (Rhs, 0).last_line; \
+- (Current).first_column = (Current).last_column = \
+- YYRHSLOC (Rhs, 0).last_column; \
+- } \
+- while (YYID (0))
++# 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; \
++ } \
++ else \
++ { \
++ (Current).first_line = (Current).last_line = \
++ YYRHSLOC (Rhs, 0).last_line; \
++ (Current).first_column = (Current).last_column = \
++ YYRHSLOC (Rhs, 0).last_column; \
++ } \
++ while (0)
+ #endif
+
++#define YYRHSLOC(Rhs, K) ((Rhs)[K])
++
++
++/* Enable debugging if requested. */
++#if YYDEBUG
++
++# ifndef YYFPRINTF
++# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
++# define YYFPRINTF fprintf
++# endif
++
++# define YYDPRINTF(Args) \
++do { \
++ if (yydebug) \
++ YYFPRINTF Args; \
++} while (0)
++
+
+ /* YY_LOCATION_PRINT -- Print the location on the stream.
+ This macro was not mandated originally: define only if we know
+@@ -799,82 +779,73 @@ while (YYID (0))
+
+ #ifndef YY_LOCATION_PRINT
+ # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
+-# define YY_LOCATION_PRINT(File, Loc) \
+- fprintf (File, "%d.%d-%d.%d", \
+- (Loc).first_line, (Loc).first_column, \
+- (Loc).last_line, (Loc).last_column)
+-# else
+-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+-# endif
+-#endif
+-
+
+-/* YYLEX -- calling `yylex' with the right arguments. */
++/* Print *YYLOCP on YYO. Private, do not rely on its existence. */
+
+-#ifdef YYLEX_PARAM
+-# define YYLEX yylex (YYLEX_PARAM)
+-#else
+-# define YYLEX yylex ()
+-#endif
++YY_ATTRIBUTE_UNUSED
++static unsigned
++yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)
++{
++ unsigned res = 0;
++ int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
++ if (0 <= yylocp->first_line)
++ {
++ res += YYFPRINTF (yyo, "%d", yylocp->first_line);
++ if (0 <= yylocp->first_column)
++ res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
++ }
++ if (0 <= yylocp->last_line)
++ {
++ if (yylocp->first_line < yylocp->last_line)
++ {
++ res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
++ if (0 <= end_col)
++ res += YYFPRINTF (yyo, ".%d", end_col);
++ }
++ else if (0 <= end_col && yylocp->first_column < end_col)
++ res += YYFPRINTF (yyo, "-%d", end_col);
++ }
++ return res;
++ }
+
+-/* Enable debugging if requested. */
+-#if YYDEBUG
++# define YY_LOCATION_PRINT(File, Loc) \
++ yy_location_print_ (File, &(Loc))
+
+-# ifndef YYFPRINTF
+-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+-# define YYFPRINTF fprintf
++# else
++# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+ # endif
++#endif
+
+-# define YYDPRINTF(Args) \
+-do { \
+- if (yydebug) \
+- YYFPRINTF Args; \
+-} while (YYID (0))
+-
+-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
+-do { \
+- if (yydebug) \
+- { \
+- YYFPRINTF (stderr, "%s ", Title); \
+- yy_symbol_print (stderr, \
+- Type, Value, Location); \
+- YYFPRINTF (stderr, "\n"); \
+- } \
+-} while (YYID (0))
+
++# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
++do { \
++ if (yydebug) \
++ { \
++ YYFPRINTF (stderr, "%s ", Title); \
++ yy_symbol_print (stderr, \
++ Type, Value, Location); \
++ YYFPRINTF (stderr, "\n"); \
++ } \
++} while (0)
+
+-/*--------------------------------.
+-| Print this symbol on YYOUTPUT. |
+-`--------------------------------*/
+
+-/*ARGSUSED*/
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
++/*----------------------------------------.
++| Print this symbol's value on YYOUTPUT. |
++`----------------------------------------*/
++
+ static void
+ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
+-#else
+-static void
+-yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
+- FILE *yyoutput;
+- int yytype;
+- YYSTYPE const * const yyvaluep;
+- YYLTYPE const * const yylocationp;
+-#endif
+ {
++ FILE *yyo = yyoutput;
++ YYUSE (yyo);
++ YYUSE (yylocationp);
+ if (!yyvaluep)
+ return;
+- YYUSE (yylocationp);
+ # ifdef YYPRINT
+ if (yytype < YYNTOKENS)
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+-# else
+- YYUSE (yyoutput);
+ # endif
+- switch (yytype)
+- {
+- default:
+- break;
+- }
++ YYUSE (yytype);
+ }
+
+
+@@ -882,23 +853,11 @@ yy_symbol_value_print (yyoutput, yytype,
+ | Print this symbol on YYOUTPUT. |
+ `--------------------------------*/
+
+-#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)
+-#else
+-static void
+-yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
+- FILE *yyoutput;
+- int yytype;
+- YYSTYPE const * const yyvaluep;
+- YYLTYPE const * const yylocationp;
+-#endif
+ {
+- if (yytype < YYNTOKENS)
+- YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+- else
+- YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
++ YYFPRINTF (yyoutput, "%s %s (",
++ yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+
+ YY_LOCATION_PRINT (yyoutput, *yylocationp);
+ YYFPRINTF (yyoutput, ": ");
+@@ -911,16 +870,8 @@ yy_symbol_print (yyoutput, yytype, yyval
+ | TOP (included). |
+ `------------------------------------------------------------------*/
+
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+ static void
+ yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+-#else
+-static void
+-yy_stack_print (yybottom, yytop)
+- yytype_int16 *yybottom;
+- yytype_int16 *yytop;
+-#endif
+ {
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+@@ -931,50 +882,42 @@ yy_stack_print (yybottom, yytop)
+ YYFPRINTF (stderr, "\n");
+ }
+
+-# define YY_STACK_PRINT(Bottom, Top) \
+-do { \
+- if (yydebug) \
+- yy_stack_print ((Bottom), (Top)); \
+-} while (YYID (0))
++# define YY_STACK_PRINT(Bottom, Top) \
++do { \
++ if (yydebug) \
++ yy_stack_print ((Bottom), (Top)); \
++} while (0)
+
+
+ /*------------------------------------------------.
+ | Report that the YYRULE is going to be reduced. |
+ `------------------------------------------------*/
+
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-static void
+-yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
+-#else
+ static void
+-yy_reduce_print (yyvsp, yylsp, yyrule)
+- YYSTYPE *yyvsp;
+- YYLTYPE *yylsp;
+- int yyrule;
+-#endif
++yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
+ {
++ unsigned long int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+- unsigned long int yylno = yyrline[yyrule];
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+- yyrule - 1, yylno);
++ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+- yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+- &(yyvsp[(yyi + 1) - (yynrhs)])
+- , &(yylsp[(yyi + 1) - (yynrhs)]) );
++ yy_symbol_print (stderr,
++ yystos[yyssp[yyi + 1 - yynrhs]],
++ &(yyvsp[(yyi + 1) - (yynrhs)])
++ , &(yylsp[(yyi + 1) - (yynrhs)]) );
+ YYFPRINTF (stderr, "\n");
+ }
+ }
+
+-# define YY_REDUCE_PRINT(Rule) \
+-do { \
+- if (yydebug) \
+- yy_reduce_print (yyvsp, yylsp, Rule); \
+-} while (YYID (0))
++# define YY_REDUCE_PRINT(Rule) \
++do { \
++ if (yydebug) \
++ yy_reduce_print (yyssp, yyvsp, yylsp, Rule); \
++} while (0)
+
+ /* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+@@ -988,7 +931,7 @@ int yydebug;
+
+
+ /* YYINITDEPTH -- initial size of the parser's stacks. */
+-#ifndef YYINITDEPTH
++#ifndef YYINITDEPTH
+ # define YYINITDEPTH 200
+ #endif
+
+@@ -1011,15 +954,8 @@ int yydebug;
+ # define yystrlen strlen
+ # else
+ /* Return the length of YYSTR. */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+ static YYSIZE_T
+ yystrlen (const char *yystr)
+-#else
+-static YYSIZE_T
+-yystrlen (yystr)
+- const char *yystr;
+-#endif
+ {
+ YYSIZE_T yylen;
+ for (yylen = 0; yystr[yylen]; yylen++)
+@@ -1035,16 +971,8 @@ yystrlen (yystr)
+ # else
+ /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+ static char *
+ yystpcpy (char *yydest, const char *yysrc)
+-#else
+-static char *
+-yystpcpy (yydest, yysrc)
+- char *yydest;
+- const char *yysrc;
+-#endif
+ {
+ char *yyd = yydest;
+ const char *yys = yysrc;
+@@ -1074,27 +1002,27 @@ yytnamerr (char *yyres, const char *yyst
+ char const *yyp = yystr;
+
+ for (;;)
+- switch (*++yyp)
+- {
+- case '\'':
+- case ',':
+- goto do_not_strip_quotes;
+-
+- case '\\':
+- if (*++yyp != '\\')
+- goto do_not_strip_quotes;
+- /* Fall through. */
+- default:
+- if (yyres)
+- yyres[yyn] = *yyp;
+- yyn++;
+- break;
+-
+- case '"':
+- if (yyres)
+- yyres[yyn] = '\0';
+- return yyn;
+- }
++ switch (*++yyp)
++ {
++ case '\'':
++ case ',':
++ goto do_not_strip_quotes;
++
++ case '\\':
++ if (*++yyp != '\\')
++ goto do_not_strip_quotes;
++ /* Fall through. */
++ default:
++ if (yyres)
++ yyres[yyn] = *yyp;
++ yyn++;
++ break;
++
++ case '"':
++ if (yyres)
++ yyres[yyn] = '\0';
++ return yyn;
++ }
+ do_not_strip_quotes: ;
+ }
+
+@@ -1117,12 +1045,11 @@ static int
+ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+ yytype_int16 *yyssp, int yytoken)
+ {
+- YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
++ YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+ YYSIZE_T yysize = yysize0;
+- YYSIZE_T yysize1;
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+ /* Internationalized format string. */
+- const char *yyformat = 0;
++ const char *yyformat = YY_NULLPTR;
+ /* Arguments of yyformat. */
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+ /* Number of reported tokens (one for the "unexpected", one per
+@@ -1130,10 +1057,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
+ int yycount = 0;
+
+ /* There are many possibilities here to consider:
+- - Assume YYFAIL is not used. It's too flawed to consider. See
+- <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+- for details. YYERROR is fine as it does not invoke this
+- function.
+ - If this state is a consistent state with a default action, then
+ the only way this function was invoked is if the default action
+ is an error action. In that case, don't check for expected
+@@ -1182,11 +1105,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
+ break;
+ }
+ yyarg[yycount++] = yytname[yyx];
+- yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+- if (! (yysize <= yysize1
+- && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+- return 2;
+- yysize = yysize1;
++ {
++ YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
++ if (! (yysize <= yysize1
++ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
++ return 2;
++ yysize = yysize1;
++ }
+ }
+ }
+ }
+@@ -1206,10 +1131,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
+ # undef YYCASE_
+ }
+
+- yysize1 = yysize + yystrlen (yyformat);
+- if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+- return 2;
+- yysize = yysize1;
++ {
++ YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
++ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
++ return 2;
++ yysize = yysize1;
++ }
+
+ if (*yymsg_alloc < yysize)
+ {
+@@ -1246,50 +1173,21 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
+ | Release the memory associated to this symbol. |
+ `-----------------------------------------------*/
+
+-/*ARGSUSED*/
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+ static void
+ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
+-#else
+-static void
+-yydestruct (yymsg, yytype, yyvaluep, yylocationp)
+- const char *yymsg;
+- int yytype;
+- YYSTYPE *yyvaluep;
+- YYLTYPE *yylocationp;
+-#endif
+ {
+ YYUSE (yyvaluep);
+ YYUSE (yylocationp);
+-
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+- switch (yytype)
+- {
+-
+- default:
+- break;
+- }
++ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
++ YYUSE (yytype);
++ YY_IGNORE_MAYBE_UNINITIALIZED_END
+ }
+
+
+-/* Prevent warnings from -Wmissing-prototypes. */
+-#ifdef YYPARSE_PARAM
+-#if defined __STDC__ || defined __cplusplus
+-int yyparse (void *YYPARSE_PARAM);
+-#else
+-int yyparse ();
+-#endif
+-#else /* ! YYPARSE_PARAM */
+-#if defined __STDC__ || defined __cplusplus
+-int yyparse (void);
+-#else
+-int yyparse ();
+-#endif
+-#endif /* ! YYPARSE_PARAM */
+
+
+ /* The lookahead symbol. */
+@@ -1297,10 +1195,12 @@ int yychar;
+
+ /* The semantic value of the lookahead symbol. */
+ YYSTYPE yylval;
+-
+ /* Location data for the lookahead symbol. */
+-YYLTYPE yylloc;
+-
++YYLTYPE yylloc
++# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
++ = { 1, 1, 1, 1 }
++# endif
++;
+ /* Number of syntax errors so far. */
+ int yynerrs;
+
+@@ -1309,38 +1209,19 @@ int yynerrs;
+ | yyparse. |
+ `----------*/
+
+-#ifdef YYPARSE_PARAM
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+-int
+-yyparse (void *YYPARSE_PARAM)
+-#else
+-int
+-yyparse (YYPARSE_PARAM)
+- void *YYPARSE_PARAM;
+-#endif
+-#else /* ! YYPARSE_PARAM */
+-#if (defined __STDC__ || defined __C99__FUNC__ \
+- || defined __cplusplus || defined _MSC_VER)
+ int
+ yyparse (void)
+-#else
+-int
+-yyparse ()
+-
+-#endif
+-#endif
+ {
+ int yystate;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ /* The stacks and their tools:
+- `yyss': related to states.
+- `yyvs': related to semantic values.
+- `yyls': related to locations.
++ 'yyss': related to states.
++ 'yyvs': related to semantic values.
++ 'yyls': related to locations.
+
+- Refer to the stacks thru separate pointers, to allow yyoverflow
++ Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+@@ -1366,7 +1247,7 @@ yyparse ()
+ int yyn;
+ int yyresult;
+ /* Lookahead token as an internal (translated) token number. */
+- int yytoken;
++ int yytoken = 0;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+@@ -1385,10 +1266,9 @@ yyparse ()
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+- yytoken = 0;
+- yyss = yyssa;
+- yyvs = yyvsa;
+- yyls = yylsa;
++ yyssp = yyss = yyssa;
++ yyvsp = yyvs = yyvsa;
++ yylsp = yyls = yylsa;
+ yystacksize = YYINITDEPTH;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+@@ -1397,21 +1277,7 @@ yyparse ()
+ yyerrstatus = 0;
+ yynerrs = 0;
+ 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 defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
+- /* Initialize the default location before parsing starts. */
+- yylloc.first_line = yylloc.last_line = 1;
+- yylloc.first_column = yylloc.last_column = 1;
+-#endif
+-
++ yylsp[0] = yylloc;
+ goto yysetstate;
+
+ /*------------------------------------------------------------.
+@@ -1432,26 +1298,26 @@ yyparse ()
+
+ #ifdef yyoverflow
+ {
+- /* Give user a chance to reallocate the stack. Use copies of
+- these so that the &'s don't force the real ones into
+- 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
+- conditional around just the two extra args, but that might
+- be undefined if yyoverflow is a macro. */
+- yyoverflow (YY_("memory exhausted"),
+- &yyss1, yysize * sizeof (*yyssp),
+- &yyvs1, yysize * sizeof (*yyvsp),
+- &yyls1, yysize * sizeof (*yylsp),
+- &yystacksize);
+-
+- yyls = yyls1;
+- yyss = yyss1;
+- yyvs = yyvs1;
++ /* Give user a chance to reallocate the stack. Use copies of
++ these so that the &'s don't force the real ones into
++ 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
++ conditional around just the two extra args, but that might
++ be undefined if yyoverflow is a macro. */
++ yyoverflow (YY_("memory exhausted"),
++ &yyss1, yysize * sizeof (*yyssp),
++ &yyvs1, yysize * sizeof (*yyvsp),
++ &yyls1, yysize * sizeof (*yylsp),
++ &yystacksize);
++
++ yyls = yyls1;
++ yyss = yyss1;
++ yyvs = yyvs1;
+ }
+ #else /* no yyoverflow */
+ # ifndef YYSTACK_RELOCATE
+@@ -1459,23 +1325,23 @@ yyparse ()
+ # else
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+- goto yyexhaustedlab;
++ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+- yystacksize = YYMAXDEPTH;
++ yystacksize = YYMAXDEPTH;
+
+ {
+- yytype_int16 *yyss1 = yyss;
+- union yyalloc *yyptr =
+- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+- if (! yyptr)
+- goto yyexhaustedlab;
+- YYSTACK_RELOCATE (yyss_alloc, yyss);
+- YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+- YYSTACK_RELOCATE (yyls_alloc, yyls);
++ yytype_int16 *yyss1 = yyss;
++ union yyalloc *yyptr =
++ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
++ if (! yyptr)
++ goto yyexhaustedlab;
++ YYSTACK_RELOCATE (yyss_alloc, yyss);
++ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
++ YYSTACK_RELOCATE (yyls_alloc, yyls);
+ # undef YYSTACK_RELOCATE
+- if (yyss1 != yyssa)
+- YYSTACK_FREE (yyss1);
++ if (yyss1 != yyssa)
++ YYSTACK_FREE (yyss1);
+ }
+ # endif
+ #endif /* no yyoverflow */
+@@ -1485,10 +1351,10 @@ yyparse ()
+ yylsp = yyls + yysize - 1;
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+- (unsigned long int) yystacksize));
++ (unsigned long int) yystacksize));
+
+ if (yyss + yystacksize - 1 <= yyssp)
+- YYABORT;
++ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+@@ -1517,7 +1383,7 @@ yybackup:
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+- yychar = YYLEX;
++ yychar = yylex ();
+ }
+
+ if (yychar <= YYEOF)
+@@ -1557,7 +1423,9 @@ yybackup:
+ yychar = YYEMPTY;
+
+ yystate = yyn;
++ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
++ YY_IGNORE_MAYBE_UNINITIALIZED_END
+ *++yylsp = yylloc;
+ goto yynewstate;
+
+@@ -1580,7 +1448,7 @@ yyreduce:
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+- `$$ = $1'.
++ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+@@ -1595,322 +1463,273 @@ yyreduce:
+ switch (yyn)
+ {
+ case 2:
+-
+-/* Line 1806 of yacc.c */
+-#line 109 "dtc-parser.y"
++#line 105 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyvsp[(5) - (5)].node)->is_plugin = (yyvsp[(3) - (5)].is_plugin);
+- (yyvsp[(5) - (5)].node)->is_root = 1;
+- the_boot_info = build_boot_info((yyvsp[(4) - (5)].re), (yyvsp[(5) - (5)].node),
+- guess_boot_cpuid((yyvsp[(5) - (5)].node)));
++ the_boot_info = build_boot_info((yyvsp[-1].re), (yyvsp[0].node),
++ guess_boot_cpuid((yyvsp[0].node)));
+ }
++#line 1472 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 3:
+-
+-/* Line 1806 of yacc.c */
+-#line 119 "dtc-parser.y"
++#line 113 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.is_plugin) = 0;
++ (yyval.re) = NULL;
+ }
++#line 1480 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 4:
+-
+-/* Line 1806 of yacc.c */
+-#line 123 "dtc-parser.y"
++#line 117 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.is_plugin) = 1;
++ (yyval.re) = chain_reserve_entry((yyvsp[-1].re), (yyvsp[0].re));
+ }
++#line 1488 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 5:
+-
+-/* Line 1806 of yacc.c */
+-#line 130 "dtc-parser.y"
++#line 124 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.re) = NULL;
++ (yyval.re) = build_reserve_entry((yyvsp[-2].integer), (yyvsp[-1].integer));
+ }
++#line 1496 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 6:
+-
+-/* Line 1806 of yacc.c */
+-#line 134 "dtc-parser.y"
++#line 128 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
++ add_label(&(yyvsp[0].re)->labels, (yyvsp[-1].labelref));
++ (yyval.re) = (yyvsp[0].re);
+ }
++#line 1505 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 7:
+-
+-/* Line 1806 of yacc.c */
+-#line 141 "dtc-parser.y"
++#line 136 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.re) = build_reserve_entry((yyvsp[(2) - (4)].integer), (yyvsp[(3) - (4)].integer));
++ (yyval.node) = name_node((yyvsp[0].node), "");
+ }
++#line 1513 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 8:
+-
+-/* Line 1806 of yacc.c */
+-#line 145 "dtc-parser.y"
++#line 140 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- add_label(&(yyvsp[(2) - (2)].re)->labels, (yyvsp[(1) - (2)].labelref));
+- (yyval.re) = (yyvsp[(2) - (2)].re);
++ (yyval.node) = merge_nodes((yyvsp[-2].node), (yyvsp[0].node));
+ }
++#line 1521 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 9:
+-
+-/* Line 1806 of yacc.c */
+-#line 153 "dtc-parser.y"
++#line 145 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.node) = name_node((yyvsp[(2) - (2)].node), "");
++ struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
++
++ add_label(&target->labels, (yyvsp[-2].labelref));
++ if (target)
++ merge_nodes(target, (yyvsp[0].node));
++ else
++ ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
++ (yyval.node) = (yyvsp[-3].node);
+ }
++#line 1536 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 10:
+-
+-/* Line 1806 of yacc.c */
+-#line 157 "dtc-parser.y"
++#line 156 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.node) = merge_nodes((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));
++ struct node *target = get_node_by_ref((yyvsp[-2].node), (yyvsp[-1].labelref));
++
++ if (target)
++ merge_nodes(target, (yyvsp[0].node));
++ else
++ ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
++ (yyval.node) = (yyvsp[-2].node);
+ }
++#line 1550 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 11:
+-
+-/* Line 1806 of yacc.c */
+-#line 162 "dtc-parser.y"
++#line 166 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- struct node *target = get_node_by_ref((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].labelref));
++ struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
+
+- add_label(&target->labels, (yyvsp[(2) - (4)].labelref));
+ if (target)
+- merge_nodes(target, (yyvsp[(4) - (4)].node));
++ delete_node(target);
+ else
+- ERROR(&(yylsp[(3) - (4)]), "Label or path %s not found", (yyvsp[(3) - (4)].labelref));
+- (yyval.node) = (yyvsp[(1) - (4)].node);
++ ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
++
++
++ (yyval.node) = (yyvsp[-3].node);
+ }
++#line 1566 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 12:
+-
+-/* Line 1806 of yacc.c */
+-#line 173 "dtc-parser.y"
++#line 181 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- 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
+- ERROR(&(yylsp[(2) - (3)]), "Label or path %s not found", (yyvsp[(2) - (3)].labelref));
+- (yyval.node) = (yyvsp[(1) - (3)].node);
++ (yyval.node) = build_node((yyvsp[-3].proplist), (yyvsp[-2].nodelist));
+ }
++#line 1574 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 13:
+-
+-/* Line 1806 of yacc.c */
+-#line 183 "dtc-parser.y"
++#line 188 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- struct node *target = get_node_by_ref((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].labelref));
+-
+- if (target)
+- delete_node(target);
+- else
+- ERROR(&(yylsp[(3) - (4)]), "Label or path %s not found", (yyvsp[(3) - (4)].labelref));
+-
+-
+- (yyval.node) = (yyvsp[(1) - (4)].node);
++ (yyval.proplist) = NULL;
+ }
++#line 1582 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 14:
+-
+-/* Line 1806 of yacc.c */
+-#line 198 "dtc-parser.y"
++#line 192 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
++ (yyval.proplist) = chain_property((yyvsp[0].prop), (yyvsp[-1].proplist));
+ }
++#line 1590 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 15:
+-
+-/* Line 1806 of yacc.c */
+-#line 205 "dtc-parser.y"
++#line 199 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.proplist) = NULL;
++ (yyval.prop) = build_property((yyvsp[-3].propnodename), (yyvsp[-1].data));
+ }
++#line 1598 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 16:
+-
+-/* Line 1806 of yacc.c */
+-#line 209 "dtc-parser.y"
++#line 203 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
++ (yyval.prop) = build_property((yyvsp[-1].propnodename), empty_data);
+ }
++#line 1606 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 17:
+-
+-/* Line 1806 of yacc.c */
+-#line 216 "dtc-parser.y"
++#line 207 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.prop) = build_property((yyvsp[(1) - (4)].propnodename), (yyvsp[(3) - (4)].data));
++ (yyval.prop) = build_property_delete((yyvsp[-1].propnodename));
+ }
++#line 1614 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 18:
+-
+-/* Line 1806 of yacc.c */
+-#line 220 "dtc-parser.y"
++#line 211 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.prop) = build_property((yyvsp[(1) - (2)].propnodename), empty_data);
++ add_label(&(yyvsp[0].prop)->labels, (yyvsp[-1].labelref));
++ (yyval.prop) = (yyvsp[0].prop);
+ }
++#line 1623 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 19:
+-
+-/* Line 1806 of yacc.c */
+-#line 224 "dtc-parser.y"
++#line 219 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.prop) = build_property_delete((yyvsp[(2) - (3)].propnodename));
++ (yyval.data) = data_merge((yyvsp[-1].data), (yyvsp[0].data));
+ }
++#line 1631 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 20:
+-
+-/* Line 1806 of yacc.c */
+-#line 228 "dtc-parser.y"
++#line 223 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- add_label(&(yyvsp[(2) - (2)].prop)->labels, (yyvsp[(1) - (2)].labelref));
+- (yyval.prop) = (yyvsp[(2) - (2)].prop);
++ (yyval.data) = data_merge((yyvsp[-2].data), (yyvsp[-1].array).data);
+ }
++#line 1639 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 21:
+-
+-/* Line 1806 of yacc.c */
+-#line 236 "dtc-parser.y"
++#line 227 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
++ (yyval.data) = data_merge((yyvsp[-3].data), (yyvsp[-1].data));
+ }
++#line 1647 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 22:
+-
+-/* Line 1806 of yacc.c */
+-#line 240 "dtc-parser.y"
++#line 231 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = data_merge((yyvsp[(1) - (3)].data), (yyvsp[(2) - (3)].array).data);
++ (yyval.data) = data_add_marker((yyvsp[-1].data), REF_PATH, (yyvsp[0].labelref));
+ }
++#line 1655 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 23:
+-
+-/* Line 1806 of yacc.c */
+-#line 244 "dtc-parser.y"
+- {
+- (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
+- }
+- break;
+-
+- case 24:
+-
+-/* Line 1806 of yacc.c */
+-#line 248 "dtc-parser.y"
+- {
+- (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
+- }
+- break;
+-
+- case 25:
+-
+-/* Line 1806 of yacc.c */
+-#line 252 "dtc-parser.y"
++#line 235 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- FILE *f = srcfile_relative_open((yyvsp[(4) - (9)].data).val, NULL);
++ FILE *f = srcfile_relative_open((yyvsp[-5].data).val, NULL);
+ struct data d;
+
+- if ((yyvsp[(6) - (9)].integer) != 0)
+- if (fseek(f, (yyvsp[(6) - (9)].integer), SEEK_SET) != 0)
++ if ((yyvsp[-3].integer) != 0)
++ if (fseek(f, (yyvsp[-3].integer), SEEK_SET) != 0)
+ die("Couldn't seek to offset %llu in \"%s\": %s",
+- (unsigned long long)(yyvsp[(6) - (9)].integer), (yyvsp[(4) - (9)].data).val,
++ (unsigned long long)(yyvsp[-3].integer), (yyvsp[-5].data).val,
+ strerror(errno));
+
+- d = data_copy_file(f, (yyvsp[(8) - (9)].integer));
++ d = data_copy_file(f, (yyvsp[-1].integer));
+
+- (yyval.data) = data_merge((yyvsp[(1) - (9)].data), d);
++ (yyval.data) = data_merge((yyvsp[-8].data), d);
+ fclose(f);
+ }
++#line 1675 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 26:
+-
+-/* Line 1806 of yacc.c */
+-#line 268 "dtc-parser.y"
++ case 24:
++#line 251 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- FILE *f = srcfile_relative_open((yyvsp[(4) - (5)].data).val, NULL);
++ FILE *f = srcfile_relative_open((yyvsp[-1].data).val, NULL);
+ struct data d = empty_data;
+
+ d = data_copy_file(f, -1);
+
+- (yyval.data) = data_merge((yyvsp[(1) - (5)].data), d);
++ (yyval.data) = data_merge((yyvsp[-4].data), d);
+ fclose(f);
+ }
++#line 1689 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 27:
+-
+-/* Line 1806 of yacc.c */
+-#line 278 "dtc-parser.y"
++ case 25:
++#line 261 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
+ }
++#line 1697 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 28:
+-
+-/* Line 1806 of yacc.c */
+-#line 285 "dtc-parser.y"
++ case 26:
++#line 268 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = empty_data;
+ }
++#line 1705 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 29:
+-
+-/* Line 1806 of yacc.c */
+-#line 289 "dtc-parser.y"
++ case 27:
++#line 272 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = (yyvsp[(1) - (2)].data);
++ (yyval.data) = (yyvsp[-1].data);
+ }
++#line 1713 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 30:
+-
+-/* Line 1806 of yacc.c */
+-#line 293 "dtc-parser.y"
++ case 28:
++#line 276 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
+ }
++#line 1721 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 31:
+-
+-/* Line 1806 of yacc.c */
+-#line 300 "dtc-parser.y"
++ case 29:
++#line 283 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ unsigned long long bits;
+
+- bits = (yyvsp[(2) - (3)].integer);
++ bits = (yyvsp[-1].integer);
+
+ if ((bits != 8) && (bits != 16) &&
+ (bits != 32) && (bits != 64)) {
+- ERROR(&(yylsp[(2) - (3)]), "Array elements must be"
++ ERROR(&(yylsp[-1]), "Array elements must be"
+ " 8, 16, 32 or 64-bits");
+ bits = 32;
+ }
+@@ -1918,25 +1737,23 @@ yyreduce:
+ (yyval.array).data = empty_data;
+ (yyval.array).bits = bits;
+ }
++#line 1741 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 32:
+-
+-/* Line 1806 of yacc.c */
+-#line 316 "dtc-parser.y"
++ case 30:
++#line 299 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.array).data = empty_data;
+ (yyval.array).bits = 32;
+ }
++#line 1750 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 33:
+-
+-/* Line 1806 of yacc.c */
+-#line 321 "dtc-parser.y"
++ case 31:
++#line 304 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- if ((yyvsp[(1) - (2)].array).bits < 64) {
+- uint64_t mask = (1ULL << (yyvsp[(1) - (2)].array).bits) - 1;
++ if ((yyvsp[-1].array).bits < 64) {
++ uint64_t mask = (1ULL << (yyvsp[-1].array).bits) - 1;
+ /*
+ * Bits above mask must either be all zero
+ * (positive within range of mask) or all one
+@@ -1945,293 +1762,258 @@ yyreduce:
+ * within the mask to one (i.e. | in the
+ * mask), all bits are one.
+ */
+- if (((yyvsp[(2) - (2)].integer) > mask) && (((yyvsp[(2) - (2)].integer) | mask) != -1ULL))
+- ERROR(&(yylsp[(2) - (2)]), "Value out of range for"
+- " %d-bit array element", (yyvsp[(1) - (2)].array).bits);
++ if (((yyvsp[0].integer) > mask) && (((yyvsp[0].integer) | mask) != -1ULL))
++ ERROR(&(yylsp[0]), "Value out of range for"
++ " %d-bit array element", (yyvsp[-1].array).bits);
+ }
+
+- (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, (yyvsp[(2) - (2)].integer), (yyvsp[(1) - (2)].array).bits);
++ (yyval.array).data = data_append_integer((yyvsp[-1].array).data, (yyvsp[0].integer), (yyvsp[-1].array).bits);
+ }
++#line 1773 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 34:
+-
+-/* Line 1806 of yacc.c */
+-#line 340 "dtc-parser.y"
++ case 32:
++#line 323 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- uint64_t val = ~0ULL >> (64 - (yyvsp[(1) - (2)].array).bits);
++ uint64_t val = ~0ULL >> (64 - (yyvsp[-1].array).bits);
+
+- if ((yyvsp[(1) - (2)].array).bits == 32)
+- (yyvsp[(1) - (2)].array).data = data_add_marker((yyvsp[(1) - (2)].array).data,
++ if ((yyvsp[-1].array).bits == 32)
++ (yyvsp[-1].array).data = data_add_marker((yyvsp[-1].array).data,
+ REF_PHANDLE,
+- (yyvsp[(2) - (2)].labelref));
++ (yyvsp[0].labelref));
+ else
+- ERROR(&(yylsp[(2) - (2)]), "References are only allowed in "
++ ERROR(&(yylsp[0]), "References are only allowed in "
+ "arrays with 32-bit elements.");
+
+- (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, val, (yyvsp[(1) - (2)].array).bits);
++ (yyval.array).data = data_append_integer((yyvsp[-1].array).data, val, (yyvsp[-1].array).bits);
+ }
++#line 1791 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 35:
+-
+-/* Line 1806 of yacc.c */
+-#line 354 "dtc-parser.y"
++ case 33:
++#line 337 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.array).data = data_add_marker((yyvsp[(1) - (2)].array).data, LABEL, (yyvsp[(2) - (2)].labelref));
++ (yyval.array).data = data_add_marker((yyvsp[-1].array).data, LABEL, (yyvsp[0].labelref));
+ }
++#line 1799 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 38:
+-
+-/* Line 1806 of yacc.c */
+-#line 363 "dtc-parser.y"
++ case 36:
++#line 346 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.integer) = (yyvsp[(2) - (3)].integer);
++ (yyval.integer) = (yyvsp[-1].integer);
+ }
++#line 1807 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 41:
++ case 39:
++#line 357 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-4].integer) ? (yyvsp[-2].integer) : (yyvsp[0].integer); }
++#line 1813 "dtc-parser.tab.c" /* yacc.c:1646 */
++ break;
+
+-/* Line 1806 of yacc.c */
+-#line 374 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (5)].integer) ? (yyvsp[(3) - (5)].integer) : (yyvsp[(5) - (5)].integer); }
++ case 41:
++#line 362 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) || (yyvsp[0].integer); }
++#line 1819 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 43:
+-
+-/* Line 1806 of yacc.c */
+-#line 379 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) || (yyvsp[(3) - (3)].integer); }
++#line 367 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) && (yyvsp[0].integer); }
++#line 1825 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 45:
+-
+-/* Line 1806 of yacc.c */
+-#line 384 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) && (yyvsp[(3) - (3)].integer); }
++#line 372 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) | (yyvsp[0].integer); }
++#line 1831 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 47:
+-
+-/* Line 1806 of yacc.c */
+-#line 389 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) | (yyvsp[(3) - (3)].integer); }
++#line 377 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) ^ (yyvsp[0].integer); }
++#line 1837 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 49:
+-
+-/* Line 1806 of yacc.c */
+-#line 394 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) ^ (yyvsp[(3) - (3)].integer); }
++#line 382 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) & (yyvsp[0].integer); }
++#line 1843 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 51:
+-
+-/* Line 1806 of yacc.c */
+-#line 399 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) & (yyvsp[(3) - (3)].integer); }
++#line 387 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) == (yyvsp[0].integer); }
++#line 1849 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 53:
+-
+-/* Line 1806 of yacc.c */
+-#line 404 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) == (yyvsp[(3) - (3)].integer); }
++ case 52:
++#line 388 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) != (yyvsp[0].integer); }
++#line 1855 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 54:
++#line 393 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) < (yyvsp[0].integer); }
++#line 1861 "dtc-parser.tab.c" /* yacc.c:1646 */
++ break;
+
+-/* Line 1806 of yacc.c */
+-#line 405 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) != (yyvsp[(3) - (3)].integer); }
++ case 55:
++#line 394 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) > (yyvsp[0].integer); }
++#line 1867 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 56:
+-
+-/* Line 1806 of yacc.c */
+-#line 410 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) < (yyvsp[(3) - (3)].integer); }
++#line 395 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) <= (yyvsp[0].integer); }
++#line 1873 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 57:
+-
+-/* Line 1806 of yacc.c */
+-#line 411 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) > (yyvsp[(3) - (3)].integer); }
++#line 396 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) >= (yyvsp[0].integer); }
++#line 1879 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 58:
+-
+-/* Line 1806 of yacc.c */
+-#line 412 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) <= (yyvsp[(3) - (3)].integer); }
++#line 400 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) << (yyvsp[0].integer); }
++#line 1885 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 59:
+-
+-/* Line 1806 of yacc.c */
+-#line 413 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) >= (yyvsp[(3) - (3)].integer); }
+- break;
+-
+- case 60:
+-
+-/* Line 1806 of yacc.c */
+-#line 417 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) << (yyvsp[(3) - (3)].integer); }
++#line 401 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) >> (yyvsp[0].integer); }
++#line 1891 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 61:
+-
+-/* Line 1806 of yacc.c */
+-#line 418 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) >> (yyvsp[(3) - (3)].integer); }
++#line 406 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) + (yyvsp[0].integer); }
++#line 1897 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 63:
+-
+-/* Line 1806 of yacc.c */
+-#line 423 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) + (yyvsp[(3) - (3)].integer); }
++ case 62:
++#line 407 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) - (yyvsp[0].integer); }
++#line 1903 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 64:
++#line 412 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) * (yyvsp[0].integer); }
++#line 1909 "dtc-parser.tab.c" /* yacc.c:1646 */
++ break;
+
+-/* Line 1806 of yacc.c */
+-#line 424 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) - (yyvsp[(3) - (3)].integer); }
++ case 65:
++#line 413 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) / (yyvsp[0].integer); }
++#line 1915 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 66:
+-
+-/* Line 1806 of yacc.c */
+-#line 429 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) * (yyvsp[(3) - (3)].integer); }
++#line 414 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = (yyvsp[-2].integer) % (yyvsp[0].integer); }
++#line 1921 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 67:
+-
+-/* Line 1806 of yacc.c */
+-#line 430 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) / (yyvsp[(3) - (3)].integer); }
++ case 69:
++#line 420 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = -(yyvsp[0].integer); }
++#line 1927 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 68:
+-
+-/* Line 1806 of yacc.c */
+-#line 431 "dtc-parser.y"
+- { (yyval.integer) = (yyvsp[(1) - (3)].integer) % (yyvsp[(3) - (3)].integer); }
++ case 70:
++#line 421 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = ~(yyvsp[0].integer); }
++#line 1933 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 71:
+-
+-/* Line 1806 of yacc.c */
+-#line 437 "dtc-parser.y"
+- { (yyval.integer) = -(yyvsp[(2) - (2)].integer); }
++#line 422 "dtc-parser.y" /* yacc.c:1646 */
++ { (yyval.integer) = !(yyvsp[0].integer); }
++#line 1939 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 72:
+-
+-/* Line 1806 of yacc.c */
+-#line 438 "dtc-parser.y"
+- { (yyval.integer) = ~(yyvsp[(2) - (2)].integer); }
++#line 427 "dtc-parser.y" /* yacc.c:1646 */
++ {
++ (yyval.data) = empty_data;
++ }
++#line 1947 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 73:
+-
+-/* Line 1806 of yacc.c */
+-#line 439 "dtc-parser.y"
+- { (yyval.integer) = !(yyvsp[(2) - (2)].integer); }
++#line 431 "dtc-parser.y" /* yacc.c:1646 */
++ {
++ (yyval.data) = data_append_byte((yyvsp[-1].data), (yyvsp[0].byte));
++ }
++#line 1955 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 74:
+-
+-/* Line 1806 of yacc.c */
+-#line 444 "dtc-parser.y"
++#line 435 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = empty_data;
++ (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
+ }
++#line 1963 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 75:
+-
+-/* Line 1806 of yacc.c */
+-#line 448 "dtc-parser.y"
++#line 442 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
++ (yyval.nodelist) = NULL;
+ }
++#line 1971 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 76:
+-
+-/* Line 1806 of yacc.c */
+-#line 452 "dtc-parser.y"
++#line 446 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
++ (yyval.nodelist) = chain_node((yyvsp[-1].node), (yyvsp[0].nodelist));
+ }
++#line 1979 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 77:
+-
+-/* Line 1806 of yacc.c */
+-#line 459 "dtc-parser.y"
++#line 450 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.nodelist) = NULL;
++ ERROR(&(yylsp[0]), "Properties must precede subnodes");
++ YYERROR;
+ }
++#line 1988 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 78:
+-
+-/* Line 1806 of yacc.c */
+-#line 463 "dtc-parser.y"
++#line 458 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
++ (yyval.node) = name_node((yyvsp[0].node), (yyvsp[-1].propnodename));
+ }
++#line 1996 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 79:
+-
+-/* Line 1806 of yacc.c */
+-#line 467 "dtc-parser.y"
++#line 462 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- ERROR(&(yylsp[(2) - (2)]), "Properties must precede subnodes");
+- YYERROR;
++ (yyval.node) = name_node(build_node_delete(), (yyvsp[-1].propnodename));
+ }
++#line 2004 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 80:
+-
+-/* Line 1806 of yacc.c */
+-#line 475 "dtc-parser.y"
++#line 466 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.node) = name_node((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].propnodename));
++ add_label(&(yyvsp[0].node)->labels, (yyvsp[-1].labelref));
++ (yyval.node) = (yyvsp[0].node);
+ }
++#line 2013 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 81:
+
+-/* Line 1806 of yacc.c */
+-#line 479 "dtc-parser.y"
+- {
+- (yyval.node) = name_node(build_node_delete(), (yyvsp[(2) - (3)].propnodename));
+- }
+- break;
+-
+- case 82:
+-
+-/* Line 1806 of yacc.c */
+-#line 483 "dtc-parser.y"
+- {
+- add_label(&(yyvsp[(2) - (2)].node)->labels, (yyvsp[(1) - (2)].labelref));
+- (yyval.node) = (yyvsp[(2) - (2)].node);
+- }
+- break;
+-
+-
+-
+-/* Line 1806 of yacc.c */
+-#line 2235 "dtc-parser.tab.c"
++#line 2017 "dtc-parser.tab.c" /* yacc.c:1646 */
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+@@ -2254,7 +2036,7 @@ yyreduce:
+ *++yyvsp = yyval;
+ *++yylsp = yyloc;
+
+- /* Now `shift' the result of the reduction. Determine what state
++ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+@@ -2269,9 +2051,9 @@ yyreduce:
+ goto yynewstate;
+
+
+-/*------------------------------------.
+-| yyerrlab -- here on detecting error |
+-`------------------------------------*/
++/*--------------------------------------.
++| yyerrlab -- here on detecting error. |
++`--------------------------------------*/
+ yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+@@ -2322,20 +2104,20 @@ yyerrlab:
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+- error, discard it. */
++ error, discard it. */
+
+ if (yychar <= YYEOF)
+- {
+- /* Return failure if at end of input. */
+- if (yychar == YYEOF)
+- YYABORT;
+- }
++ {
++ /* Return failure if at end of input. */
++ if (yychar == YYEOF)
++ YYABORT;
++ }
+ else
+- {
+- yydestruct ("Error: discarding",
+- yytoken, &yylval, &yylloc);
+- yychar = YYEMPTY;
+- }
++ {
++ yydestruct ("Error: discarding",
++ yytoken, &yylval, &yylloc);
++ yychar = YYEMPTY;
++ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+@@ -2355,7 +2137,7 @@ yyerrorlab:
+ goto yyerrorlab;
+
+ yyerror_range[1] = yylsp[1-yylen];
+- /* Do not reclaim the symbols of the rule which action triggered
++ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+@@ -2368,35 +2150,37 @@ yyerrorlab:
+ | yyerrlab1 -- common code for both syntax error and YYERROR. |
+ `-------------------------------------------------------------*/
+ yyerrlab1:
+- yyerrstatus = 3; /* Each real token shifted decrements this. */
++ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+- {
+- yyn += YYTERROR;
+- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+- {
+- yyn = yytable[yyn];
+- if (0 < yyn)
+- break;
+- }
+- }
++ {
++ yyn += YYTERROR;
++ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
++ {
++ yyn = yytable[yyn];
++ if (0 < yyn)
++ break;
++ }
++ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+- YYABORT;
++ YYABORT;
+
+ yyerror_range[1] = *yylsp;
+ yydestruct ("Error: popping",
+- yystos[yystate], yyvsp, yylsp);
++ yystos[yystate], yyvsp, yylsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
++ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
++ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ yyerror_range[2] = yylloc;
+ /* Using YYLLOC is tempting, but would change the location of
+@@ -2425,7 +2209,7 @@ yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+-#if !defined(yyoverflow) || YYERROR_VERBOSE
++#if !defined yyoverflow || YYERROR_VERBOSE
+ /*-------------------------------------------------.
+ | yyexhaustedlab -- memory exhaustion comes here. |
+ `-------------------------------------------------*/
+@@ -2444,14 +2228,14 @@ yyreturn:
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, &yylloc);
+ }
+- /* Do not reclaim the symbols of the rule which action triggered
++ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+- yystos[*yyssp], yyvsp, yylsp);
++ yystos[*yyssp], yyvsp, yylsp);
+ YYPOPSTACK (1);
+ }
+ #ifndef yyoverflow
+@@ -2462,18 +2246,12 @@ yyreturn:
+ if (yymsg != yymsgbuf)
+ YYSTACK_FREE (yymsg);
+ #endif
+- /* Make sure YYID is used. */
+- return YYID (yyresult);
++ return yyresult;
+ }
+-
+-
+-
+-/* Line 2067 of yacc.c */
+-#line 489 "dtc-parser.y"
++#line 472 "dtc-parser.y" /* yacc.c:1906 */
+
+
+ void yyerror(char const *s)
+ {
+ ERROR(&yylloc, "%s", s);
+ }
+-
+--- a/scripts/dtc/dtc-parser.tab.h_shipped
++++ b/scripts/dtc/dtc-parser.tab.h_shipped
+@@ -1,19 +1,19 @@
+-/* A Bison parser, made by GNU Bison 2.5. */
++/* A Bison parser, made by GNU Bison 3.0.2. */
+
+ /* Bison interface for Yacc-like parsers in C
+-
+- Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+-
++
++ Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, 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 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, see <http://www.gnu.org/licenses/>. */
+
+@@ -26,50 +26,55 @@
+ 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. */
+
++#ifndef YY_YY_DTC_PARSER_TAB_H_INCLUDED
++# define YY_YY_DTC_PARSER_TAB_H_INCLUDED
++/* Debug traces. */
++#ifndef YYDEBUG
++# define YYDEBUG 0
++#endif
++#if YYDEBUG
++extern int yydebug;
++#endif
+
+-/* Tokens. */
++/* Token type. */
+ #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_PLUGIN = 259,
+- DT_MEMRESERVE = 260,
+- DT_LSHIFT = 261,
+- DT_RSHIFT = 262,
+- DT_LE = 263,
+- DT_GE = 264,
+- DT_EQ = 265,
+- DT_NE = 266,
+- DT_AND = 267,
+- DT_OR = 268,
+- DT_BITS = 269,
+- DT_DEL_PROP = 270,
+- DT_DEL_NODE = 271,
+- DT_PROPNODENAME = 272,
+- DT_LITERAL = 273,
+- DT_CHAR_LITERAL = 274,
+- DT_BYTE = 275,
+- DT_STRING = 276,
+- DT_LABEL = 277,
+- DT_REF = 278,
+- DT_INCBIN = 279
+- };
++ enum yytokentype
++ {
++ DT_V1 = 258,
++ DT_MEMRESERVE = 259,
++ DT_LSHIFT = 260,
++ DT_RSHIFT = 261,
++ DT_LE = 262,
++ DT_GE = 263,
++ DT_EQ = 264,
++ DT_NE = 265,
++ DT_AND = 266,
++ DT_OR = 267,
++ DT_BITS = 268,
++ DT_DEL_PROP = 269,
++ DT_DEL_NODE = 270,
++ DT_PROPNODENAME = 271,
++ DT_LITERAL = 272,
++ DT_CHAR_LITERAL = 273,
++ DT_BYTE = 274,
++ DT_STRING = 275,
++ DT_LABEL = 276,
++ DT_REF = 277,
++ DT_INCBIN = 278
++ };
+ #endif
+
+-
+-
++/* Value type. */
+ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+-typedef union YYSTYPE
++typedef union YYSTYPE YYSTYPE;
++union YYSTYPE
+ {
+-
+-/* Line 2068 of yacc.c */
+-#line 39 "dtc-parser.y"
++#line 38 "dtc-parser.y" /* yacc.c:1909 */
+
+ char *propnodename;
+ char *labelref;
+@@ -87,32 +92,30 @@ typedef union YYSTYPE
+ struct node *nodelist;
+ struct reserve_info *re;
+ uint64_t integer;
+- int is_plugin;
+-
+-
+
+-/* Line 2068 of yacc.c */
+-#line 96 "dtc-parser.tab.h"
+-} YYSTYPE;
++#line 97 "dtc-parser.tab.h" /* yacc.c:1909 */
++};
+ # define YYSTYPE_IS_TRIVIAL 1
+-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+ # define YYSTYPE_IS_DECLARED 1
+ #endif
+
+-extern YYSTYPE yylval;
+-
++/* Location type. */
+ #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
+-typedef struct YYLTYPE
++typedef struct YYLTYPE YYLTYPE;
++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 YYSTYPE yylval;
+ extern YYLTYPE yylloc;
++int yyparse (void);
+
++#endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED */
+--- a/scripts/dtc/dtc-parser.y
++++ b/scripts/dtc/dtc-parser.y
+@@ -19,7 +19,6 @@
+ */
+ %{
+ #include <stdio.h>
+-#include <inttypes.h>
+
+ #include "dtc.h"
+ #include "srcpos.h"
+@@ -53,11 +52,9 @@ extern bool treesource_error;
+ struct node *nodelist;
+ struct reserve_info *re;
+ uint64_t integer;
+- int is_plugin;
+ }
+
+ %token DT_V1
+-%token DT_PLUGIN
+ %token DT_MEMRESERVE
+ %token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
+ %token DT_BITS
+@@ -74,7 +71,6 @@ extern bool treesource_error;
+
+ %type <data> propdata
+ %type <data> propdataprefix
+-%type <is_plugin> plugindecl
+ %type <re> memreserve
+ %type <re> memreserves
+ %type <array> arrayprefix
+@@ -105,23 +101,10 @@ extern bool treesource_error;
+ %%
+
+ sourcefile:
+- DT_V1 ';' plugindecl memreserves devicetree
++ DT_V1 ';' memreserves devicetree
+ {
+- $5->is_plugin = $3;
+- $5->is_root = 1;
+- the_boot_info = build_boot_info($4, $5,
+- guess_boot_cpuid($5));
+- }
+- ;
+-
+-plugindecl:
+- /* empty */
+- {
+- $$ = 0;
+- }
+- | DT_PLUGIN ';'
+- {
+- $$ = 1;
++ the_boot_info = build_boot_info($3, $4,
++ guess_boot_cpuid($4));
+ }
+ ;
+
+--- a/scripts/dtc/dtc.c
++++ b/scripts/dtc/dtc.c
+@@ -29,7 +29,6 @@ int reservenum; /* Number of memory res
+ int minsize; /* Minimum blob size */
+ int padsize; /* Additional padding to blob */
+ int phandle_format = PHANDLE_BOTH; /* Use linux,phandle or phandle properties */
+-int symbol_fixup_support = 0;
+
+ static void fill_fullpaths(struct node *tree, const char *prefix)
+ {
+@@ -52,7 +51,7 @@ static void fill_fullpaths(struct node *
+ #define FDT_VERSION(version) _FDT_VERSION(version)
+ #define _FDT_VERSION(version) #version
+ static const char usage_synopsis[] = "dtc [options] <input file>";
+-static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv@";
++static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv";
+ static struct option const usage_long_opts[] = {
+ {"quiet", no_argument, NULL, 'q'},
+ {"in-format", a_argument, NULL, 'I'},
+@@ -70,7 +69,6 @@ static struct option const usage_long_op
+ {"phandle", a_argument, NULL, 'H'},
+ {"warning", a_argument, NULL, 'W'},
+ {"error", a_argument, NULL, 'E'},
+- {"symbols", a_argument, NULL, '@'},
+ {"help", no_argument, NULL, 'h'},
+ {"version", no_argument, NULL, 'v'},
+ {NULL, no_argument, NULL, 0x0},
+@@ -101,7 +99,6 @@ static const char * const usage_opts_hel
+ "\t\tboth - Both \"linux,phandle\" and \"phandle\" properties",
+ "\n\tEnable/disable warnings (prefix with \"no-\")",
+ "\n\tEnable/disable errors (prefix with \"no-\")",
+- "\n\tSymbols and Fixups support",
+ "\n\tPrint this help and exit",
+ "\n\tPrint version and exit",
+ NULL,
+@@ -189,9 +186,7 @@ int main(int argc, char *argv[])
+ case 'E':
+ parse_checks_option(false, true, optarg);
+ break;
+- case '@':
+- symbol_fixup_support = 1;
+- break;
++
+ case 'h':
+ usage(NULL);
+ default:
+--- a/scripts/dtc/dtc.h
++++ b/scripts/dtc/dtc.h
+@@ -54,7 +54,6 @@ extern int reservenum; /* Number of mem
+ extern int minsize; /* Minimum blob size */
+ extern int padsize; /* Additional padding to blob */
+ extern int phandle_format; /* Use linux,phandle or phandle properties */
+-extern int symbol_fixup_support;/* enable symbols & fixup support */
+
+ #define PHANDLE_LEGACY 0x1
+ #define PHANDLE_EPAPR 0x2
+@@ -133,25 +132,6 @@ struct label {
+ struct label *next;
+ };
+
+-struct fixup_entry {
+- int offset;
+- struct node *node;
+- struct property *prop;
+- struct fixup_entry *next;
+-};
+-
+-struct fixup {
+- char *ref;
+- struct fixup_entry *entries;
+- struct fixup *next;
+-};
+-
+-struct symbol {
+- struct label *label;
+- struct node *node;
+- struct symbol *next;
+-};
+-
+ struct property {
+ bool deleted;
+ char *name;
+@@ -178,12 +158,6 @@ struct node {
+ int addr_cells, size_cells;
+
+ struct label *labels;
+-
+- int is_root;
+- int is_plugin;
+- struct fixup *fixups;
+- struct symbol *symbols;
+- struct fixup_entry *local_fixups;
+ };
+
+ #define for_each_label_withdel(l0, l) \
+@@ -207,18 +181,6 @@ struct node {
+ for_each_child_withdel(n, c) \
+ if (!(c)->deleted)
+
+-#define for_each_fixup(n, f) \
+- for ((f) = (n)->fixups; (f); (f) = (f)->next)
+-
+-#define for_each_fixup_entry(f, fe) \
+- for ((fe) = (f)->entries; (fe); (fe) = (fe)->next)
+-
+-#define for_each_symbol(n, s) \
+- for ((s) = (n)->symbols; (s); (s) = (s)->next)
+-
+-#define for_each_local_fixup_entry(n, fe) \
+- for ((fe) = (n)->local_fixups; (fe); (fe) = (fe)->next)
+-
+ void add_label(struct label **labels, char *label);
+ void delete_labels(struct label **labels);
+
+--- a/scripts/dtc/flattree.c
++++ b/scripts/dtc/flattree.c
+@@ -262,12 +262,6 @@ static void flatten_tree(struct node *tr
+ struct property *prop;
+ struct node *child;
+ bool seen_name_prop = false;
+- struct symbol *sym;
+- struct fixup *f;
+- struct fixup_entry *fe;
+- char *name, *s;
+- const char *fullpath;
+- int namesz, nameoff, vallen;
+
+ if (tree->deleted)
+ return;
+@@ -282,6 +276,8 @@ static void flatten_tree(struct node *tr
+ emit->align(etarget, sizeof(cell_t));
+
+ for_each_property(tree, prop) {
++ int nameoff;
++
+ if (streq(prop->name, "name"))
+ seen_name_prop = true;
+
+@@ -314,139 +310,6 @@ static void flatten_tree(struct node *tr
+ flatten_tree(child, emit, etarget, strbuf, vi);
+ }
+
+- if (!symbol_fixup_support)
+- goto no_symbols;
+-
+- /* add the symbol nodes (if any) */
+- if (tree->symbols) {
+-
+- emit->beginnode(etarget, NULL);
+- emit->string(etarget, "__symbols__", 0);
+- emit->align(etarget, sizeof(cell_t));
+-
+- for_each_symbol(tree, sym) {
+-
+- vallen = strlen(sym->node->fullpath);
+-
+- nameoff = stringtable_insert(strbuf, sym->label->label);
+-
+- emit->property(etarget, NULL);
+- emit->cell(etarget, vallen + 1);
+- emit->cell(etarget, nameoff);
+-
+- if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
+- emit->align(etarget, 8);
+-
+- emit->string(etarget, sym->node->fullpath,
+- strlen(sym->node->fullpath));
+- emit->align(etarget, sizeof(cell_t));
+- }
+-
+- emit->endnode(etarget, NULL);
+- }
+-
+- /* add the fixup nodes */
+- if (tree->fixups) {
+-
+- /* emit the external fixups */
+- emit->beginnode(etarget, NULL);
+- emit->string(etarget, "__fixups__", 0);
+- emit->align(etarget, sizeof(cell_t));
+-
+- for_each_fixup(tree, f) {
+-
+- namesz = 0;
+- for_each_fixup_entry(f, fe) {
+- fullpath = fe->node->fullpath;
+- if (fullpath[0] == '\0')
+- fullpath = "/";
+- namesz += strlen(fullpath) + 1;
+- namesz += strlen(fe->prop->name) + 1;
+- namesz += 32; /* space for :<number> + '\0' */
+- }
+-
+- name = xmalloc(namesz);
+-
+- s = name;
+- for_each_fixup_entry(f, fe) {
+- fullpath = fe->node->fullpath;
+- if (fullpath[0] == '\0')
+- fullpath = "/";
+- snprintf(s, name + namesz - s, "%s:%s:%d",
+- fullpath,
+- fe->prop->name, fe->offset);
+- s += strlen(s) + 1;
+- }
+-
+- nameoff = stringtable_insert(strbuf, f->ref);
+- vallen = s - name - 1;
+-
+- emit->property(etarget, NULL);
+- emit->cell(etarget, vallen + 1);
+- emit->cell(etarget, nameoff);
+-
+- if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
+- emit->align(etarget, 8);
+-
+- emit->string(etarget, name, vallen);
+- emit->align(etarget, sizeof(cell_t));
+-
+- free(name);
+- }
+-
+- emit->endnode(etarget, tree->labels);
+- }
+-
+- /* add the local fixup property */
+- if (tree->local_fixups) {
+-
+- /* emit the external fixups */
+- emit->beginnode(etarget, NULL);
+- emit->string(etarget, "__local_fixups__", 0);
+- emit->align(etarget, sizeof(cell_t));
+-
+- namesz = 0;
+- for_each_local_fixup_entry(tree, fe) {
+- fullpath = fe->node->fullpath;
+- if (fullpath[0] == '\0')
+- fullpath = "/";
+- namesz += strlen(fullpath) + 1;
+- namesz += strlen(fe->prop->name) + 1;
+- namesz += 32; /* space for :<number> + '\0' */
+- }
+-
+- name = xmalloc(namesz);
+-
+- s = name;
+- for_each_local_fixup_entry(tree, fe) {
+- fullpath = fe->node->fullpath;
+- if (fullpath[0] == '\0')
+- fullpath = "/";
+- snprintf(s, name + namesz - s, "%s:%s:%d",
+- fullpath, fe->prop->name,
+- fe->offset);
+- s += strlen(s) + 1;
+- }
+-
+- nameoff = stringtable_insert(strbuf, "fixup");
+- vallen = s - name - 1;
+-
+- emit->property(etarget, NULL);
+- emit->cell(etarget, vallen + 1);
+- emit->cell(etarget, nameoff);
+-
+- if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
+- emit->align(etarget, 8);
+-
+- emit->string(etarget, name, vallen);
+- emit->align(etarget, sizeof(cell_t));
+-
+- free(name);
+-
+- emit->endnode(etarget, tree->labels);
+- }
+-
+-no_symbols:
+ emit->endnode(etarget, tree->labels);
+ }
+
+--- a/scripts/dtc/version_gen.h
++++ b/scripts/dtc/version_gen.h
+@@ -1 +1 @@
+-#define DTC_VERSION "DTC 1.4.1-g9d3649bd-dirty"
++#define DTC_VERSION "DTC 1.4.1-g9d3649bd"
diff --git a/target/linux/brcm2708/patches-4.4/0177-scripts-dtc-Update-to-upstream-version-1.4.1.patch b/target/linux/brcm2708/patches-4.4/0177-scripts-dtc-Update-to-upstream-version-1.4.1.patch
new file mode 100644
index 0000000000..1057e83e3f
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0177-scripts-dtc-Update-to-upstream-version-1.4.1.patch
@@ -0,0 +1,2736 @@
+From 8ed747466ab2fac41d870582b149385d3e8c2d43 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 10 Aug 2015 09:49:15 +0100
+Subject: [PATCH 177/232] scripts/dtc: Update to upstream version 1.4.1
+
+Includes the new localfixups format.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ scripts/dtc/checks.c | 105 ++++-
+ scripts/dtc/dtc-lexer.l | 5 +
+ scripts/dtc/dtc-lexer.lex.c_shipped | 490 ++++++++++++------------
+ scripts/dtc/dtc-parser.tab.c_shipped | 722 ++++++++++++++++++-----------------
+ scripts/dtc/dtc-parser.tab.h_shipped | 46 +--
+ scripts/dtc/dtc-parser.y | 22 +-
+ scripts/dtc/dtc.c | 9 +-
+ scripts/dtc/dtc.h | 40 ++
+ scripts/dtc/flattree.c | 202 ++++++++++
+ scripts/dtc/version_gen.h | 2 +-
+ 10 files changed, 1021 insertions(+), 622 deletions(-)
+
+--- a/scripts/dtc/checks.c
++++ b/scripts/dtc/checks.c
+@@ -458,6 +458,8 @@ static void fixup_phandle_references(str
+ struct node *node, struct property *prop)
+ {
+ struct marker *m = prop->val.markers;
++ struct fixup *f, **fp;
++ struct fixup_entry *fe, **fep;
+ struct node *refnode;
+ cell_t phandle;
+
+@@ -466,11 +468,69 @@ static void fixup_phandle_references(str
+
+ refnode = get_node_by_ref(dt, m->ref);
+ if (! refnode) {
+- FAIL(c, "Reference to non-existent node or label \"%s\"\n",
+- m->ref);
++ if (!dt->is_plugin) {
++ FAIL(c, "Reference to non-existent node or label \"%s\"\n",
++ m->ref);
++ continue;
++ }
++
++ /* allocate fixup entry */
++ fe = xmalloc(sizeof(*fe));
++
++ fe->node = node;
++ fe->prop = prop;
++ fe->offset = m->offset;
++ fe->next = NULL;
++
++ /* search for an already existing fixup */
++ for_each_fixup(dt, f)
++ if (strcmp(f->ref, m->ref) == 0)
++ break;
++
++ /* no fixup found, add new */
++ if (f == NULL) {
++ f = xmalloc(sizeof(*f));
++ f->ref = m->ref;
++ f->entries = NULL;
++ f->next = NULL;
++
++ /* add it to the tree */
++ fp = &dt->fixups;
++ while (*fp)
++ fp = &(*fp)->next;
++ *fp = f;
++ }
++
++ /* and now append fixup entry */
++ fep = &f->entries;
++ while (*fep)
++ fep = &(*fep)->next;
++ *fep = fe;
++
++ /* mark the entry as unresolved */
++ *((cell_t *)(prop->val.val + m->offset)) =
++ cpu_to_fdt32(0xdeadbeef);
+ continue;
+ }
+
++ /* if it's a local reference, we need to record it */
++ if (symbol_fixup_support) {
++
++ /* allocate a new local fixup entry */
++ fe = xmalloc(sizeof(*fe));
++
++ fe->node = node;
++ fe->prop = prop;
++ fe->offset = m->offset;
++ fe->next = NULL;
++
++ /* append it to the local fixups */
++ fep = &dt->local_fixups;
++ while (*fep)
++ fep = &(*fep)->next;
++ *fep = fe;
++ }
++
+ phandle = get_node_phandle(dt, refnode);
+ *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
+ }
+@@ -652,6 +712,45 @@ static void check_obsolete_chosen_interr
+ }
+ TREE_WARNING(obsolete_chosen_interrupt_controller, NULL);
+
++static void check_auto_label_phandles(struct check *c, struct node *dt,
++ struct node *node)
++{
++ struct label *l;
++ struct symbol *s, **sp;
++ int has_label;
++
++ if (!symbol_fixup_support)
++ return;
++
++ has_label = 0;
++ for_each_label(node->labels, l) {
++ has_label = 1;
++ break;
++ }
++
++ if (!has_label)
++ return;
++
++ /* force allocation of a phandle for this node */
++ (void)get_node_phandle(dt, node);
++
++ /* add the symbol */
++ for_each_label(node->labels, l) {
++
++ s = xmalloc(sizeof(*s));
++ s->label = l;
++ s->node = node;
++ s->next = NULL;
++
++ /* add it to the symbols list */
++ sp = &dt->symbols;
++ while (*sp)
++ sp = &((*sp)->next);
++ *sp = s;
++ }
++}
++NODE_WARNING(auto_label_phandles, NULL);
++
+ static struct check *check_table[] = {
+ &duplicate_node_names, &duplicate_property_names,
+ &node_name_chars, &node_name_format, &property_name_chars,
+@@ -670,6 +769,8 @@ static struct check *check_table[] = {
+ &avoid_default_addr_size,
+ &obsolete_chosen_interrupt_controller,
+
++ &auto_label_phandles,
++
+ &always_fail,
+ };
+
+--- a/scripts/dtc/dtc-lexer.l
++++ b/scripts/dtc/dtc-lexer.l
+@@ -113,6 +113,11 @@ static void lexical_error(const char *fm
+ return DT_V1;
+ }
+
++<*>"/plugin/" {
++ DPRINT("Keyword: /plugin/\n");
++ return DT_PLUGIN;
++ }
++
+ <*>"/memreserve/" {
+ DPRINT("Keyword: /memreserve/\n");
+ BEGIN_DEFAULT();
+--- a/scripts/dtc/dtc-lexer.lex.c_shipped
++++ b/scripts/dtc/dtc-lexer.lex.c_shipped
+@@ -9,7 +9,7 @@
+ #define FLEX_SCANNER
+ #define YY_FLEX_MAJOR_VERSION 2
+ #define YY_FLEX_MINOR_VERSION 5
+-#define YY_FLEX_SUBMINOR_VERSION 39
++#define YY_FLEX_SUBMINOR_VERSION 35
+ #if YY_FLEX_SUBMINOR_VERSION > 0
+ #define FLEX_BETA
+ #endif
+@@ -162,12 +162,7 @@ typedef unsigned int flex_uint32_t;
+ typedef struct yy_buffer_state *YY_BUFFER_STATE;
+ #endif
+
+-#ifndef YY_TYPEDEF_YY_SIZE_T
+-#define YY_TYPEDEF_YY_SIZE_T
+-typedef size_t yy_size_t;
+-#endif
+-
+-extern yy_size_t yyleng;
++extern int yyleng;
+
+ extern FILE *yyin, *yyout;
+
+@@ -176,7 +171,6 @@ extern FILE *yyin, *yyout;
+ #define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+- #define YY_LINENO_REWIND_TO(ptr)
+
+ /* Return all but the first "n" matched characters back to the input stream. */
+ #define yyless(n) \
+@@ -194,6 +188,11 @@ extern FILE *yyin, *yyout;
+
+ #define unput(c) yyunput( c, (yytext_ptr) )
+
++#ifndef YY_TYPEDEF_YY_SIZE_T
++#define YY_TYPEDEF_YY_SIZE_T
++typedef size_t yy_size_t;
++#endif
++
+ #ifndef YY_STRUCT_YY_BUFFER_STATE
+ #define YY_STRUCT_YY_BUFFER_STATE
+ struct yy_buffer_state
+@@ -211,7 +210,7 @@ struct yy_buffer_state
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+- yy_size_t yy_n_chars;
++ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+@@ -281,8 +280,8 @@ static YY_BUFFER_STATE * yy_buffer_stack
+
+ /* yy_hold_char holds the character lost when yytext is formed. */
+ static char yy_hold_char;
+-static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */
+-yy_size_t yyleng;
++static int yy_n_chars; /* number of characters read into yy_ch_buf */
++int yyleng;
+
+ /* Points to current character in buffer. */
+ static char *yy_c_buf_p = (char *) 0;
+@@ -310,7 +309,7 @@ static void yy_init_buffer (YY_BUFFER_ST
+
+ YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
+ YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len );
++YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
+
+ void *yyalloc (yy_size_t );
+ void *yyrealloc (void *,yy_size_t );
+@@ -342,7 +341,7 @@ void yyfree (void * );
+
+ /* Begin user sect3 */
+
+-#define yywrap() 1
++#define yywrap(n) 1
+ #define YY_SKIP_YYWRAP
+
+ typedef unsigned char YY_CHAR;
+@@ -373,8 +372,8 @@ static void yy_fatal_error (yyconst char
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+
+-#define YY_NUM_RULES 30
+-#define YY_END_OF_BUFFER 31
++#define YY_NUM_RULES 31
++#define YY_END_OF_BUFFER 32
+ /* This struct is not used in this scanner,
+ but its presence is necessary. */
+ struct yy_trans_info
+@@ -382,25 +381,26 @@ struct yy_trans_info
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+-static yyconst flex_int16_t yy_accept[159] =
++static yyconst flex_int16_t yy_accept[166] =
+ { 0,
+- 0, 0, 0, 0, 0, 0, 0, 0, 31, 29,
+- 18, 18, 29, 29, 29, 29, 29, 29, 29, 29,
+- 29, 29, 29, 29, 29, 29, 15, 16, 16, 29,
+- 16, 10, 10, 18, 26, 0, 3, 0, 27, 12,
+- 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,
+- 21, 23, 25, 24, 22, 0, 9, 28, 0, 0,
+- 0, 14, 14, 16, 16, 16, 10, 10, 10, 0,
+- 12, 0, 11, 0, 0, 0, 20, 0, 0, 0,
+- 0, 0, 0, 0, 0, 16, 10, 10, 10, 0,
+- 13, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+-
+- 0, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 16, 6, 0, 0, 0, 0, 0, 0, 2,
+- 0, 0, 0, 0, 0, 0, 0, 0, 4, 17,
+- 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+- 5, 8, 0, 0, 0, 0, 7, 0
++ 0, 0, 0, 0, 0, 0, 0, 0, 32, 30,
++ 19, 19, 30, 30, 30, 30, 30, 30, 30, 30,
++ 30, 30, 30, 30, 30, 30, 16, 17, 17, 30,
++ 17, 11, 11, 19, 27, 0, 3, 0, 28, 13,
++ 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
++ 0, 22, 24, 26, 25, 23, 0, 10, 29, 0,
++ 0, 0, 15, 15, 17, 17, 17, 11, 11, 11,
++ 0, 13, 0, 12, 0, 0, 0, 21, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 17, 11, 11,
++ 11, 0, 14, 20, 0, 0, 0, 0, 0, 0,
++
++ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 17, 7, 0, 0, 0,
++ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 4, 18, 0, 0, 5, 2,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 1, 0, 0, 0, 0, 6, 9, 0,
++ 0, 0, 0, 8, 0
+ } ;
+
+ static yyconst flex_int32_t yy_ec[256] =
+@@ -416,9 +416,9 @@ static yyconst flex_int32_t yy_ec[256] =
+ 22, 22, 22, 22, 24, 22, 22, 25, 22, 22,
+ 1, 26, 27, 1, 22, 1, 21, 28, 29, 30,
+
+- 31, 21, 22, 22, 32, 22, 22, 33, 34, 35,
+- 36, 37, 22, 38, 39, 40, 41, 42, 22, 25,
+- 43, 22, 44, 45, 46, 1, 1, 1, 1, 1,
++ 31, 21, 32, 22, 33, 22, 22, 34, 35, 36,
++ 37, 38, 22, 39, 40, 41, 42, 43, 22, 25,
++ 44, 22, 45, 46, 47, 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,
+@@ -435,163 +435,165 @@ static yyconst flex_int32_t yy_ec[256] =
+ 1, 1, 1, 1, 1
+ } ;
+
+-static yyconst flex_int32_t yy_meta[47] =
++static yyconst flex_int32_t yy_meta[48] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 2, 3, 1, 2,
+ 2, 2, 4, 5, 5, 5, 6, 1, 1, 1,
+ 7, 8, 8, 8, 8, 1, 1, 7, 7, 7,
+ 7, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+- 8, 8, 8, 3, 1, 4
++ 8, 8, 8, 8, 3, 1, 4
+ } ;
+
+-static yyconst flex_int16_t yy_base[173] =
++static yyconst flex_int16_t yy_base[180] =
+ { 0,
+- 0, 383, 34, 382, 65, 381, 37, 105, 387, 391,
+- 54, 111, 367, 110, 109, 109, 112, 41, 366, 104,
+- 367, 338, 124, 117, 0, 144, 391, 0, 121, 0,
+- 135, 155, 140, 179, 391, 160, 391, 379, 391, 0,
+- 368, 141, 391, 167, 370, 376, 346, 103, 342, 345,
+- 391, 391, 391, 391, 391, 358, 391, 391, 175, 342,
+- 338, 391, 355, 0, 185, 339, 184, 347, 346, 0,
+- 0, 322, 175, 357, 175, 363, 352, 324, 330, 323,
+- 332, 326, 201, 324, 329, 322, 391, 333, 181, 309,
+- 391, 341, 340, 313, 320, 338, 178, 311, 146, 317,
+-
+- 314, 315, 335, 331, 303, 300, 309, 299, 308, 188,
+- 336, 335, 391, 305, 320, 281, 283, 271, 203, 288,
+- 281, 271, 266, 264, 245, 242, 208, 104, 391, 391,
+- 244, 218, 204, 219, 206, 224, 201, 212, 204, 229,
+- 215, 208, 207, 200, 219, 391, 233, 221, 200, 181,
+- 391, 391, 149, 122, 86, 41, 391, 391, 245, 251,
+- 259, 263, 267, 273, 280, 284, 292, 300, 304, 310,
+- 318, 326
++ 0, 393, 35, 392, 66, 391, 38, 107, 397, 401,
++ 55, 113, 377, 112, 111, 111, 114, 42, 376, 106,
++ 377, 347, 126, 120, 0, 147, 401, 0, 124, 0,
++ 137, 158, 170, 163, 401, 153, 401, 389, 401, 0,
++ 378, 120, 401, 131, 380, 386, 355, 139, 351, 355,
++ 351, 401, 401, 401, 401, 401, 367, 401, 401, 185,
++ 350, 346, 401, 364, 0, 185, 347, 189, 356, 355,
++ 0, 0, 330, 180, 366, 141, 372, 361, 332, 338,
++ 331, 341, 334, 326, 205, 331, 337, 329, 401, 341,
++ 167, 316, 401, 349, 348, 320, 328, 346, 180, 318,
++
++ 324, 209, 324, 320, 322, 342, 338, 309, 306, 315,
++ 305, 315, 312, 192, 342, 341, 401, 293, 306, 282,
++ 268, 252, 255, 203, 285, 282, 272, 268, 252, 233,
++ 232, 239, 208, 107, 401, 401, 238, 211, 401, 211,
++ 212, 208, 228, 203, 215, 207, 233, 222, 212, 211,
++ 203, 227, 401, 237, 225, 204, 185, 401, 401, 149,
++ 128, 88, 42, 401, 401, 253, 259, 267, 271, 275,
++ 281, 288, 292, 300, 308, 312, 318, 326, 334
+ } ;
+
+-static yyconst flex_int16_t yy_def[173] =
++static yyconst flex_int16_t yy_def[180] =
+ { 0,
+- 158, 1, 1, 3, 158, 5, 1, 1, 158, 158,
+- 158, 158, 158, 159, 160, 161, 158, 158, 158, 158,
+- 162, 158, 158, 158, 163, 162, 158, 164, 165, 164,
+- 164, 158, 158, 158, 158, 159, 158, 159, 158, 166,
+- 158, 161, 158, 161, 167, 168, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 162, 158, 158, 158, 158,
+- 158, 158, 162, 164, 165, 164, 158, 158, 158, 169,
+- 166, 170, 161, 167, 167, 168, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 164, 158, 158, 169, 170,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+-
+- 158, 164, 158, 158, 158, 158, 158, 158, 158, 171,
+- 158, 164, 158, 158, 158, 158, 158, 158, 171, 158,
+- 171, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 172, 158, 158, 158, 172, 158, 172, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 0, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158
++ 165, 1, 1, 3, 165, 5, 1, 1, 165, 165,
++ 165, 165, 165, 166, 167, 168, 165, 165, 165, 165,
++ 169, 165, 165, 165, 170, 169, 165, 171, 172, 171,
++ 171, 165, 165, 165, 165, 166, 165, 166, 165, 173,
++ 165, 168, 165, 168, 174, 175, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 169, 165, 165, 165,
++ 165, 165, 165, 169, 171, 172, 171, 165, 165, 165,
++ 176, 173, 177, 168, 174, 174, 175, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 171, 165, 165,
++ 176, 177, 165, 165, 165, 165, 165, 165, 165, 165,
++
++ 165, 165, 165, 165, 171, 165, 165, 165, 165, 165,
++ 165, 165, 165, 178, 165, 171, 165, 165, 165, 165,
++ 165, 165, 165, 178, 165, 178, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 179, 165, 165,
++ 165, 179, 165, 179, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 0, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165
+ } ;
+
+-static yyconst flex_int16_t yy_nxt[438] =
++static yyconst flex_int16_t yy_nxt[449] =
+ { 0,
+ 10, 11, 12, 11, 13, 14, 10, 15, 16, 10,
+ 10, 10, 17, 10, 10, 10, 10, 18, 19, 20,
+ 21, 21, 21, 21, 21, 10, 10, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+- 21, 21, 21, 10, 22, 10, 24, 25, 25, 25,
+- 32, 33, 33, 157, 26, 34, 34, 34, 51, 52,
+- 27, 26, 26, 26, 26, 10, 11, 12, 11, 13,
+- 14, 28, 15, 16, 28, 28, 28, 24, 28, 28,
+- 28, 10, 18, 19, 20, 29, 29, 29, 29, 29,
+- 30, 10, 29, 29, 29, 29, 29, 29, 29, 29,
+-
+- 29, 29, 29, 29, 29, 29, 29, 29, 10, 22,
+- 10, 23, 34, 34, 34, 37, 39, 43, 32, 33,
+- 33, 45, 54, 55, 46, 59, 45, 64, 156, 46,
+- 64, 64, 64, 79, 44, 38, 59, 57, 134, 47,
+- 135, 48, 80, 49, 47, 50, 48, 99, 61, 43,
+- 50, 110, 41, 67, 67, 67, 60, 63, 63, 63,
+- 57, 155, 68, 69, 63, 37, 44, 66, 67, 67,
+- 67, 63, 63, 63, 63, 73, 59, 68, 69, 70,
+- 34, 34, 34, 43, 75, 38, 154, 92, 83, 83,
+- 83, 64, 44, 120, 64, 64, 64, 67, 67, 67,
+-
+- 44, 57, 99, 68, 69, 107, 68, 69, 120, 127,
+- 108, 153, 152, 121, 83, 83, 83, 133, 133, 133,
+- 146, 133, 133, 133, 146, 140, 140, 140, 121, 141,
+- 140, 140, 140, 151, 141, 158, 150, 149, 148, 144,
+- 147, 143, 142, 139, 147, 36, 36, 36, 36, 36,
+- 36, 36, 36, 40, 138, 137, 136, 40, 40, 42,
+- 42, 42, 42, 42, 42, 42, 42, 56, 56, 56,
+- 56, 62, 132, 62, 64, 131, 130, 64, 129, 64,
+- 64, 65, 128, 158, 65, 65, 65, 65, 71, 127,
+- 71, 71, 74, 74, 74, 74, 74, 74, 74, 74,
+-
+- 76, 76, 76, 76, 76, 76, 76, 76, 89, 126,
+- 89, 90, 125, 90, 90, 124, 90, 90, 119, 119,
+- 119, 119, 119, 119, 119, 119, 145, 145, 145, 145,
+- 145, 145, 145, 145, 123, 122, 59, 59, 118, 117,
+- 116, 115, 114, 113, 45, 112, 108, 111, 109, 106,
+- 105, 104, 46, 103, 91, 87, 102, 101, 100, 98,
+- 97, 96, 95, 94, 93, 77, 75, 91, 88, 87,
+- 86, 57, 85, 84, 57, 82, 81, 78, 77, 75,
+- 72, 158, 58, 57, 53, 35, 158, 31, 23, 23,
+- 9, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+-
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158
++ 21, 21, 21, 21, 10, 22, 10, 24, 25, 25,
++ 25, 32, 33, 33, 164, 26, 34, 34, 34, 52,
++ 53, 27, 26, 26, 26, 26, 10, 11, 12, 11,
++ 13, 14, 28, 15, 16, 28, 28, 28, 24, 28,
++ 28, 28, 10, 18, 19, 20, 29, 29, 29, 29,
++ 29, 30, 10, 29, 29, 29, 29, 29, 29, 29,
++
++ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
++ 10, 22, 10, 23, 34, 34, 34, 37, 39, 43,
++ 32, 33, 33, 45, 55, 56, 46, 60, 43, 45,
++ 65, 163, 46, 65, 65, 65, 44, 38, 60, 74,
++ 58, 47, 141, 48, 142, 44, 49, 47, 50, 48,
++ 76, 51, 62, 94, 50, 41, 44, 51, 37, 61,
++ 64, 64, 64, 58, 34, 34, 34, 64, 162, 80,
++ 67, 68, 68, 68, 64, 64, 64, 64, 38, 81,
++ 69, 70, 71, 68, 68, 68, 60, 161, 43, 69,
++ 70, 65, 69, 70, 65, 65, 65, 125, 85, 85,
++
++ 85, 58, 68, 68, 68, 44, 102, 110, 125, 133,
++ 102, 69, 70, 111, 114, 160, 159, 126, 85, 85,
++ 85, 140, 140, 140, 140, 140, 140, 153, 126, 147,
++ 147, 147, 153, 148, 147, 147, 147, 158, 148, 165,
++ 157, 156, 155, 151, 150, 149, 146, 154, 145, 144,
++ 143, 139, 154, 36, 36, 36, 36, 36, 36, 36,
++ 36, 40, 138, 137, 136, 40, 40, 42, 42, 42,
++ 42, 42, 42, 42, 42, 57, 57, 57, 57, 63,
++ 135, 63, 65, 134, 165, 65, 133, 65, 65, 66,
++ 132, 131, 66, 66, 66, 66, 72, 130, 72, 72,
++
++ 75, 75, 75, 75, 75, 75, 75, 75, 77, 77,
++ 77, 77, 77, 77, 77, 77, 91, 129, 91, 92,
++ 128, 92, 92, 127, 92, 92, 124, 124, 124, 124,
++ 124, 124, 124, 124, 152, 152, 152, 152, 152, 152,
++ 152, 152, 60, 60, 123, 122, 121, 120, 119, 118,
++ 117, 45, 116, 111, 115, 113, 112, 109, 108, 107,
++ 46, 106, 93, 89, 105, 104, 103, 101, 100, 99,
++ 98, 97, 96, 95, 78, 76, 93, 90, 89, 88,
++ 58, 87, 86, 58, 84, 83, 82, 79, 78, 76,
++ 73, 165, 59, 58, 54, 35, 165, 31, 23, 23,
++
++ 9, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165
+ } ;
+
+-static yyconst flex_int16_t yy_chk[438] =
++static yyconst flex_int16_t yy_chk[449] =
+ { 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, 1, 1, 1, 1, 1,
+- 1, 1, 1, 1, 1, 1, 3, 3, 3, 3,
+- 7, 7, 7, 156, 3, 11, 11, 11, 18, 18,
+- 3, 3, 3, 3, 3, 5, 5, 5, 5, 5,
++ 1, 1, 1, 1, 1, 1, 1, 3, 3, 3,
++ 3, 7, 7, 7, 163, 3, 11, 11, 11, 18,
++ 18, 3, 3, 3, 3, 3, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+- 5, 8, 12, 12, 12, 14, 15, 16, 8, 8,
+- 8, 17, 20, 20, 17, 23, 24, 29, 155, 24,
+- 29, 29, 29, 48, 16, 14, 31, 29, 128, 17,
+- 128, 17, 48, 17, 24, 17, 24, 99, 24, 42,
+- 24, 99, 15, 33, 33, 33, 23, 26, 26, 26,
+- 26, 154, 33, 33, 26, 36, 42, 31, 32, 32,
+- 32, 26, 26, 26, 26, 44, 59, 32, 32, 32,
+- 34, 34, 34, 73, 75, 36, 153, 75, 59, 59,
+- 59, 65, 44, 110, 65, 65, 65, 67, 67, 67,
+-
+- 73, 65, 83, 89, 89, 97, 67, 67, 119, 127,
+- 97, 150, 149, 110, 83, 83, 83, 133, 133, 133,
+- 141, 127, 127, 127, 145, 136, 136, 136, 119, 136,
+- 140, 140, 140, 148, 140, 147, 144, 143, 142, 139,
+- 141, 138, 137, 135, 145, 159, 159, 159, 159, 159,
+- 159, 159, 159, 160, 134, 132, 131, 160, 160, 161,
+- 161, 161, 161, 161, 161, 161, 161, 162, 162, 162,
+- 162, 163, 126, 163, 164, 125, 124, 164, 123, 164,
+- 164, 165, 122, 121, 165, 165, 165, 165, 166, 120,
+- 166, 166, 167, 167, 167, 167, 167, 167, 167, 167,
+-
+- 168, 168, 168, 168, 168, 168, 168, 168, 169, 118,
+- 169, 170, 117, 170, 170, 116, 170, 170, 171, 171,
+- 171, 171, 171, 171, 171, 171, 172, 172, 172, 172,
+- 172, 172, 172, 172, 115, 114, 112, 111, 109, 108,
+- 107, 106, 105, 104, 103, 102, 101, 100, 98, 96,
+- 95, 94, 93, 92, 90, 88, 86, 85, 84, 82,
+- 81, 80, 79, 78, 77, 76, 74, 72, 69, 68,
+- 66, 63, 61, 60, 56, 50, 49, 47, 46, 45,
++ 5, 5, 5, 8, 12, 12, 12, 14, 15, 16,
++ 8, 8, 8, 17, 20, 20, 17, 23, 42, 24,
++ 29, 162, 24, 29, 29, 29, 16, 14, 31, 44,
++ 29, 17, 134, 17, 134, 42, 17, 24, 17, 24,
++ 76, 17, 24, 76, 24, 15, 44, 24, 36, 23,
++ 26, 26, 26, 26, 34, 34, 34, 26, 161, 48,
++ 31, 32, 32, 32, 26, 26, 26, 26, 36, 48,
++ 32, 32, 32, 33, 33, 33, 60, 160, 74, 91,
++ 91, 66, 33, 33, 66, 66, 66, 114, 60, 60,
++
++ 60, 66, 68, 68, 68, 74, 85, 99, 124, 133,
++ 102, 68, 68, 99, 102, 157, 156, 114, 85, 85,
++ 85, 133, 133, 133, 140, 140, 140, 148, 124, 143,
++ 143, 143, 152, 143, 147, 147, 147, 155, 147, 154,
++ 151, 150, 149, 146, 145, 144, 142, 148, 141, 138,
++ 137, 132, 152, 166, 166, 166, 166, 166, 166, 166,
++ 166, 167, 131, 130, 129, 167, 167, 168, 168, 168,
++ 168, 168, 168, 168, 168, 169, 169, 169, 169, 170,
++ 128, 170, 171, 127, 126, 171, 125, 171, 171, 172,
++ 123, 122, 172, 172, 172, 172, 173, 121, 173, 173,
++
++ 174, 174, 174, 174, 174, 174, 174, 174, 175, 175,
++ 175, 175, 175, 175, 175, 175, 176, 120, 176, 177,
++ 119, 177, 177, 118, 177, 177, 178, 178, 178, 178,
++ 178, 178, 178, 178, 179, 179, 179, 179, 179, 179,
++ 179, 179, 116, 115, 113, 112, 111, 110, 109, 108,
++ 107, 106, 105, 104, 103, 101, 100, 98, 97, 96,
++ 95, 94, 92, 90, 88, 87, 86, 84, 83, 82,
++ 81, 80, 79, 78, 77, 75, 73, 70, 69, 67,
++ 64, 62, 61, 57, 51, 50, 49, 47, 46, 45,
+ 41, 38, 22, 21, 19, 13, 9, 6, 4, 2,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158, 158, 158, 158,
+- 158, 158, 158, 158, 158, 158, 158
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165, 165, 165,
++ 165, 165, 165, 165, 165, 165, 165, 165
+ } ;
+
+ static yy_state_type yy_last_accepting_state;
+@@ -662,7 +664,7 @@ static int dts_version = 1;
+ static void push_input_file(const char *filename);
+ static bool pop_input_file(void);
+ static void lexical_error(const char *fmt, ...);
+-#line 666 "dtc-lexer.lex.c"
++#line 668 "dtc-lexer.lex.c"
+
+ #define INITIAL 0
+ #define BYTESTRING 1
+@@ -704,7 +706,7 @@ FILE *yyget_out (void );
+
+ void yyset_out (FILE * out_str );
+
+-yy_size_t yyget_leng (void );
++int yyget_leng (void );
+
+ char *yyget_text (void );
+
+@@ -853,6 +855,10 @@ YY_DECL
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
++#line 68 "dtc-lexer.l"
++
++#line 861 "dtc-lexer.lex.c"
++
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+@@ -879,11 +885,6 @@ YY_DECL
+ yy_load_buffer_state( );
+ }
+
+- {
+-#line 68 "dtc-lexer.l"
+-
+-#line 886 "dtc-lexer.lex.c"
+-
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+@@ -901,7 +902,7 @@ YY_DECL
+ yy_match:
+ do
+ {
+- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
++ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+@@ -910,13 +911,13 @@ 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 >= 159 )
++ if ( yy_current_state >= 166 )
+ 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_current_state != 158 );
++ while ( yy_current_state != 165 );
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+
+@@ -1007,23 +1008,31 @@ case 5:
+ YY_RULE_SETUP
+ #line 116 "dtc-lexer.l"
+ {
++ DPRINT("Keyword: /plugin/\n");
++ return DT_PLUGIN;
++ }
++ YY_BREAK
++case 6:
++YY_RULE_SETUP
++#line 121 "dtc-lexer.l"
++{
+ DPRINT("Keyword: /memreserve/\n");
+ BEGIN_DEFAULT();
+ return DT_MEMRESERVE;
+ }
+ YY_BREAK
+-case 6:
++case 7:
+ YY_RULE_SETUP
+-#line 122 "dtc-lexer.l"
++#line 127 "dtc-lexer.l"
+ {
+ DPRINT("Keyword: /bits/\n");
+ BEGIN_DEFAULT();
+ return DT_BITS;
+ }
+ YY_BREAK
+-case 7:
++case 8:
+ YY_RULE_SETUP
+-#line 128 "dtc-lexer.l"
++#line 133 "dtc-lexer.l"
+ {
+ DPRINT("Keyword: /delete-property/\n");
+ DPRINT("<PROPNODENAME>\n");
+@@ -1031,9 +1040,9 @@ YY_RULE_SETUP
+ return DT_DEL_PROP;
+ }
+ YY_BREAK
+-case 8:
++case 9:
+ YY_RULE_SETUP
+-#line 135 "dtc-lexer.l"
++#line 140 "dtc-lexer.l"
+ {
+ DPRINT("Keyword: /delete-node/\n");
+ DPRINT("<PROPNODENAME>\n");
+@@ -1041,9 +1050,9 @@ YY_RULE_SETUP
+ return DT_DEL_NODE;
+ }
+ YY_BREAK
+-case 9:
++case 10:
+ YY_RULE_SETUP
+-#line 142 "dtc-lexer.l"
++#line 147 "dtc-lexer.l"
+ {
+ DPRINT("Label: %s\n", yytext);
+ yylval.labelref = xstrdup(yytext);
+@@ -1051,9 +1060,9 @@ YY_RULE_SETUP
+ return DT_LABEL;
+ }
+ YY_BREAK
+-case 10:
++case 11:
+ YY_RULE_SETUP
+-#line 149 "dtc-lexer.l"
++#line 154 "dtc-lexer.l"
+ {
+ char *e;
+ DPRINT("Integer Literal: '%s'\n", yytext);
+@@ -1073,10 +1082,10 @@ YY_RULE_SETUP
+ return DT_LITERAL;
+ }
+ YY_BREAK
+-case 11:
+-/* rule 11 can match eol */
++case 12:
++/* rule 12 can match eol */
+ YY_RULE_SETUP
+-#line 168 "dtc-lexer.l"
++#line 173 "dtc-lexer.l"
+ {
+ struct data d;
+ DPRINT("Character literal: %s\n", yytext);
+@@ -1098,18 +1107,18 @@ YY_RULE_SETUP
+ return DT_CHAR_LITERAL;
+ }
+ YY_BREAK
+-case 12:
++case 13:
+ YY_RULE_SETUP
+-#line 189 "dtc-lexer.l"
++#line 194 "dtc-lexer.l"
+ { /* label reference */
+ DPRINT("Ref: %s\n", yytext+1);
+ yylval.labelref = xstrdup(yytext+1);
+ return DT_REF;
+ }
+ YY_BREAK
+-case 13:
++case 14:
+ YY_RULE_SETUP
+-#line 195 "dtc-lexer.l"
++#line 200 "dtc-lexer.l"
+ { /* new-style path reference */
+ yytext[yyleng-1] = '\0';
+ DPRINT("Ref: %s\n", yytext+2);
+@@ -1117,27 +1126,27 @@ YY_RULE_SETUP
+ return DT_REF;
+ }
+ YY_BREAK
+-case 14:
++case 15:
+ YY_RULE_SETUP
+-#line 202 "dtc-lexer.l"
++#line 207 "dtc-lexer.l"
+ {
+ yylval.byte = strtol(yytext, NULL, 16);
+ DPRINT("Byte: %02x\n", (int)yylval.byte);
+ return DT_BYTE;
+ }
+ YY_BREAK
+-case 15:
++case 16:
+ YY_RULE_SETUP
+-#line 208 "dtc-lexer.l"
++#line 213 "dtc-lexer.l"
+ {
+ DPRINT("/BYTESTRING\n");
+ BEGIN_DEFAULT();
+ return ']';
+ }
+ YY_BREAK
+-case 16:
++case 17:
+ YY_RULE_SETUP
+-#line 214 "dtc-lexer.l"
++#line 219 "dtc-lexer.l"
+ {
+ DPRINT("PropNodeName: %s\n", yytext);
+ yylval.propnodename = xstrdup((yytext[0] == '\\') ?
+@@ -1146,75 +1155,75 @@ YY_RULE_SETUP
+ return DT_PROPNODENAME;
+ }
+ YY_BREAK
+-case 17:
++case 18:
+ YY_RULE_SETUP
+-#line 222 "dtc-lexer.l"
++#line 227 "dtc-lexer.l"
+ {
+ DPRINT("Binary Include\n");
+ return DT_INCBIN;
+ }
+ YY_BREAK
+-case 18:
+-/* rule 18 can match eol */
+-YY_RULE_SETUP
+-#line 227 "dtc-lexer.l"
+-/* eat whitespace */
+- YY_BREAK
+ case 19:
+ /* rule 19 can match eol */
+ YY_RULE_SETUP
+-#line 228 "dtc-lexer.l"
+-/* eat C-style comments */
++#line 232 "dtc-lexer.l"
++/* eat whitespace */
+ YY_BREAK
+ case 20:
+ /* rule 20 can match eol */
+ YY_RULE_SETUP
+-#line 229 "dtc-lexer.l"
+-/* eat C++-style comments */
++#line 233 "dtc-lexer.l"
++/* eat C-style comments */
+ YY_BREAK
+ case 21:
++/* rule 21 can match eol */
+ YY_RULE_SETUP
+-#line 231 "dtc-lexer.l"
+-{ return DT_LSHIFT; };
++#line 234 "dtc-lexer.l"
++/* eat C++-style comments */
+ YY_BREAK
+ case 22:
+ YY_RULE_SETUP
+-#line 232 "dtc-lexer.l"
+-{ return DT_RSHIFT; };
++#line 236 "dtc-lexer.l"
++{ return DT_LSHIFT; };
+ YY_BREAK
+ case 23:
+ YY_RULE_SETUP
+-#line 233 "dtc-lexer.l"
+-{ return DT_LE; };
++#line 237 "dtc-lexer.l"
++{ return DT_RSHIFT; };
+ YY_BREAK
+ case 24:
+ YY_RULE_SETUP
+-#line 234 "dtc-lexer.l"
+-{ return DT_GE; };
++#line 238 "dtc-lexer.l"
++{ return DT_LE; };
+ YY_BREAK
+ case 25:
+ YY_RULE_SETUP
+-#line 235 "dtc-lexer.l"
+-{ return DT_EQ; };
++#line 239 "dtc-lexer.l"
++{ return DT_GE; };
+ YY_BREAK
+ case 26:
+ YY_RULE_SETUP
+-#line 236 "dtc-lexer.l"
+-{ return DT_NE; };
++#line 240 "dtc-lexer.l"
++{ return DT_EQ; };
+ YY_BREAK
+ case 27:
+ YY_RULE_SETUP
+-#line 237 "dtc-lexer.l"
+-{ return DT_AND; };
++#line 241 "dtc-lexer.l"
++{ return DT_NE; };
+ YY_BREAK
+ case 28:
+ YY_RULE_SETUP
+-#line 238 "dtc-lexer.l"
+-{ return DT_OR; };
++#line 242 "dtc-lexer.l"
++{ return DT_AND; };
+ YY_BREAK
+ case 29:
+ YY_RULE_SETUP
+-#line 240 "dtc-lexer.l"
++#line 243 "dtc-lexer.l"
++{ return DT_OR; };
++ YY_BREAK
++case 30:
++YY_RULE_SETUP
++#line 245 "dtc-lexer.l"
+ {
+ DPRINT("Char: %c (\\x%02x)\n", yytext[0],
+ (unsigned)yytext[0]);
+@@ -1230,12 +1239,12 @@ YY_RULE_SETUP
+ return yytext[0];
+ }
+ YY_BREAK
+-case 30:
++case 31:
+ YY_RULE_SETUP
+-#line 255 "dtc-lexer.l"
++#line 260 "dtc-lexer.l"
+ ECHO;
+ YY_BREAK
+-#line 1239 "dtc-lexer.lex.c"
++#line 1248 "dtc-lexer.lex.c"
+
+ case YY_END_OF_BUFFER:
+ {
+@@ -1365,7 +1374,6 @@ ECHO;
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+- } /* end of user's declarations */
+ } /* end of yylex */
+
+ /* yy_get_next_buffer - try to read in a new buffer
+@@ -1421,21 +1429,21 @@ static int yy_get_next_buffer (void)
+
+ else
+ {
+- yy_size_t num_to_read =
++ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+- YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
++ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+- yy_size_t new_size = b->yy_buf_size * 2;
++ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+@@ -1466,7 +1474,7 @@ static int yy_get_next_buffer (void)
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+- (yy_n_chars), num_to_read );
++ (yy_n_chars), (size_t) num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+@@ -1528,7 +1536,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 >= 159 )
++ if ( yy_current_state >= 166 )
+ yy_c = yy_meta[(unsigned int) yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+@@ -1556,13 +1564,13 @@ 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 >= 159 )
++ if ( yy_current_state >= 166 )
+ 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 == 158);
++ yy_is_jam = (yy_current_state == 165);
+
+- return yy_is_jam ? 0 : yy_current_state;
++ return yy_is_jam ? 0 : yy_current_state;
+ }
+
+ #ifndef YY_NO_INPUT
+@@ -1589,7 +1597,7 @@ static int yy_get_next_buffer (void)
+
+ else
+ { /* need more input */
+- yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
++ int offset = (yy_c_buf_p) - (yytext_ptr);
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+@@ -1863,7 +1871,7 @@ void yypop_buffer_state (void)
+ */
+ static void yyensure_buffer_stack (void)
+ {
+- yy_size_t num_to_alloc;
++ int num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+@@ -1960,12 +1968,12 @@ YY_BUFFER_STATE yy_scan_string (yyconst
+ *
+ * @return the newly allocated buffer state object.
+ */
+-YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len )
++YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
+ {
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+- yy_size_t i;
++ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+@@ -2047,7 +2055,7 @@ FILE *yyget_out (void)
+ /** Get the length of the current token.
+ *
+ */
+-yy_size_t yyget_leng (void)
++int yyget_leng (void)
+ {
+ return yyleng;
+ }
+@@ -2195,7 +2203,7 @@ void yyfree (void * ptr )
+
+ #define YYTABLES_NAME "yytables"
+
+-#line 254 "dtc-lexer.l"
++#line 260 "dtc-lexer.l"
+
+
+
+--- a/scripts/dtc/dtc-parser.tab.c_shipped
++++ b/scripts/dtc/dtc-parser.tab.c_shipped
+@@ -65,6 +65,7 @@
+ #line 20 "dtc-parser.y" /* yacc.c:339 */
+
+ #include <stdio.h>
++#include <inttypes.h>
+
+ #include "dtc.h"
+ #include "srcpos.h"
+@@ -80,7 +81,7 @@ extern void yyerror(char const *s);
+ extern struct boot_info *the_boot_info;
+ extern bool treesource_error;
+
+-#line 84 "dtc-parser.tab.c" /* yacc.c:339 */
++#line 85 "dtc-parser.tab.c" /* yacc.c:339 */
+
+ # ifndef YY_NULLPTR
+ # if defined __cplusplus && 201103L <= __cplusplus
+@@ -116,26 +117,27 @@ extern int yydebug;
+ enum yytokentype
+ {
+ DT_V1 = 258,
+- DT_MEMRESERVE = 259,
+- DT_LSHIFT = 260,
+- DT_RSHIFT = 261,
+- DT_LE = 262,
+- DT_GE = 263,
+- DT_EQ = 264,
+- DT_NE = 265,
+- DT_AND = 266,
+- DT_OR = 267,
+- DT_BITS = 268,
+- DT_DEL_PROP = 269,
+- DT_DEL_NODE = 270,
+- DT_PROPNODENAME = 271,
+- DT_LITERAL = 272,
+- DT_CHAR_LITERAL = 273,
+- DT_BYTE = 274,
+- DT_STRING = 275,
+- DT_LABEL = 276,
+- DT_REF = 277,
+- DT_INCBIN = 278
++ DT_PLUGIN = 259,
++ DT_MEMRESERVE = 260,
++ DT_LSHIFT = 261,
++ DT_RSHIFT = 262,
++ DT_LE = 263,
++ DT_GE = 264,
++ DT_EQ = 265,
++ DT_NE = 266,
++ DT_AND = 267,
++ DT_OR = 268,
++ DT_BITS = 269,
++ DT_DEL_PROP = 270,
++ DT_DEL_NODE = 271,
++ DT_PROPNODENAME = 272,
++ DT_LITERAL = 273,
++ DT_CHAR_LITERAL = 274,
++ DT_BYTE = 275,
++ DT_STRING = 276,
++ DT_LABEL = 277,
++ DT_REF = 278,
++ DT_INCBIN = 279
+ };
+ #endif
+
+@@ -144,7 +146,7 @@ extern int yydebug;
+ typedef union YYSTYPE YYSTYPE;
+ union YYSTYPE
+ {
+-#line 38 "dtc-parser.y" /* yacc.c:355 */
++#line 39 "dtc-parser.y" /* yacc.c:355 */
+
+ char *propnodename;
+ char *labelref;
+@@ -162,8 +164,9 @@ union YYSTYPE
+ struct node *nodelist;
+ struct reserve_info *re;
+ uint64_t integer;
++ bool is_plugin;
+
+-#line 167 "dtc-parser.tab.c" /* yacc.c:355 */
++#line 170 "dtc-parser.tab.c" /* yacc.c:355 */
+ };
+ # define YYSTYPE_IS_TRIVIAL 1
+ # define YYSTYPE_IS_DECLARED 1
+@@ -192,7 +195,7 @@ int yyparse (void);
+
+ /* Copy the second part of user declarations. */
+
+-#line 196 "dtc-parser.tab.c" /* yacc.c:358 */
++#line 199 "dtc-parser.tab.c" /* yacc.c:358 */
+
+ #ifdef short
+ # undef short
+@@ -439,18 +442,18 @@ union yyalloc
+ #define YYLAST 136
+
+ /* YYNTOKENS -- Number of terminals. */
+-#define YYNTOKENS 47
++#define YYNTOKENS 48
+ /* YYNNTS -- Number of nonterminals. */
+-#define YYNNTS 28
++#define YYNNTS 29
+ /* YYNRULES -- Number of rules. */
+-#define YYNRULES 80
++#define YYNRULES 82
+ /* YYNSTATES -- Number of states. */
+-#define YYNSTATES 144
++#define YYNSTATES 147
+
+ /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
+ by yylex, with out-of-bounds checking. */
+ #define YYUNDEFTOK 2
+-#define YYMAXUTOK 278
++#define YYMAXUTOK 279
+
+ #define YYTRANSLATE(YYX) \
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+@@ -462,16 +465,16 @@ static const yytype_uint8 yytranslate[]
+ 0, 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, 46, 2, 2, 2, 44, 40, 2,
+- 32, 34, 43, 41, 33, 42, 2, 25, 2, 2,
+- 2, 2, 2, 2, 2, 2, 2, 2, 37, 24,
+- 35, 28, 29, 36, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 47, 2, 2, 2, 45, 41, 2,
++ 33, 35, 44, 42, 34, 43, 2, 26, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 38, 25,
++ 36, 29, 30, 37, 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, 30, 2, 31, 39, 2, 2, 2, 2, 2,
++ 2, 31, 2, 32, 40, 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, 26, 38, 27, 45, 2, 2, 2,
++ 2, 2, 2, 27, 39, 28, 46, 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,
+@@ -486,22 +489,22 @@ static const yytype_uint8 yytranslate[]
+ 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, 14,
+- 15, 16, 17, 18, 19, 20, 21, 22, 23
++ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
+ };
+
+ #if YYDEBUG
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+ static const yytype_uint16 yyrline[] =
+ {
+- 0, 104, 104, 113, 116, 123, 127, 135, 139, 144,
+- 155, 165, 180, 188, 191, 198, 202, 206, 210, 218,
+- 222, 226, 230, 234, 250, 260, 268, 271, 275, 282,
+- 298, 303, 322, 336, 343, 344, 345, 352, 356, 357,
+- 361, 362, 366, 367, 371, 372, 376, 377, 381, 382,
+- 386, 387, 388, 392, 393, 394, 395, 396, 400, 401,
+- 402, 406, 407, 408, 412, 413, 414, 415, 419, 420,
+- 421, 422, 427, 430, 434, 442, 445, 449, 457, 461,
+- 465
++ 0, 108, 108, 118, 121, 129, 132, 139, 143, 151,
++ 155, 160, 171, 181, 196, 204, 207, 214, 218, 222,
++ 226, 234, 238, 242, 246, 250, 266, 276, 284, 287,
++ 291, 298, 314, 319, 338, 352, 359, 360, 361, 368,
++ 372, 373, 377, 378, 382, 383, 387, 388, 392, 393,
++ 397, 398, 402, 403, 404, 408, 409, 410, 411, 412,
++ 416, 417, 418, 422, 423, 424, 428, 429, 430, 431,
++ 435, 436, 437, 438, 443, 446, 450, 458, 461, 465,
++ 473, 477, 481
+ };
+ #endif
+
+@@ -510,19 +513,19 @@ static const yytype_uint16 yyrline[] =
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+ static const char *const yytname[] =
+ {
+- "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE", "DT_LSHIFT",
+- "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND", "DT_OR",
+- "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME", "DT_LITERAL",
+- "DT_CHAR_LITERAL", "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF",
+- "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'='", "'>'", "'['", "']'",
+- "'('", "','", "')'", "'<'", "'?'", "':'", "'|'", "'^'", "'&'", "'+'",
+- "'-'", "'*'", "'%'", "'~'", "'!'", "$accept", "sourcefile",
+- "memreserves", "memreserve", "devicetree", "nodedef", "proplist",
+- "propdef", "propdata", "propdataprefix", "arrayprefix", "integer_prim",
+- "integer_expr", "integer_trinary", "integer_or", "integer_and",
+- "integer_bitor", "integer_bitxor", "integer_bitand", "integer_eq",
+- "integer_rela", "integer_shift", "integer_add", "integer_mul",
+- "integer_unary", "bytestring", "subnodes", "subnode", YY_NULLPTR
++ "$end", "error", "$undefined", "DT_V1", "DT_PLUGIN", "DT_MEMRESERVE",
++ "DT_LSHIFT", "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND",
++ "DT_OR", "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME",
++ "DT_LITERAL", "DT_CHAR_LITERAL", "DT_BYTE", "DT_STRING", "DT_LABEL",
++ "DT_REF", "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'='", "'>'", "'['",
++ "']'", "'('", "','", "')'", "'<'", "'?'", "':'", "'|'", "'^'", "'&'",
++ "'+'", "'-'", "'*'", "'%'", "'~'", "'!'", "$accept", "sourcefile",
++ "plugindecl", "memreserves", "memreserve", "devicetree", "nodedef",
++ "proplist", "propdef", "propdata", "propdataprefix", "arrayprefix",
++ "integer_prim", "integer_expr", "integer_trinary", "integer_or",
++ "integer_and", "integer_bitor", "integer_bitxor", "integer_bitand",
++ "integer_eq", "integer_rela", "integer_shift", "integer_add",
++ "integer_mul", "integer_unary", "bytestring", "subnodes", "subnode", YY_NULLPTR
+ };
+ #endif
+
+@@ -533,16 +536,16 @@ static const yytype_uint16 yytoknum[] =
+ {
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+- 275, 276, 277, 278, 59, 47, 123, 125, 61, 62,
+- 91, 93, 40, 44, 41, 60, 63, 58, 124, 94,
+- 38, 43, 45, 42, 37, 126, 33
++ 275, 276, 277, 278, 279, 59, 47, 123, 125, 61,
++ 62, 91, 93, 40, 44, 41, 60, 63, 58, 124,
++ 94, 38, 43, 45, 42, 37, 126, 33
+ };
+ # endif
+
+-#define YYPACT_NINF -81
++#define YYPACT_NINF -84
+
+ #define yypact_value_is_default(Yystate) \
+- (!!((Yystate) == (-81)))
++ (!!((Yystate) == (-84)))
+
+ #define YYTABLE_NINF -1
+
+@@ -553,21 +556,21 @@ static const yytype_uint16 yytoknum[] =
+ STATE-NUM. */
+ static const yytype_int8 yypact[] =
+ {
+- 16, -11, 21, 10, -81, 25, 10, 19, 10, -81,
+- -81, -9, 25, -81, 2, 51, -81, -9, -9, -9,
+- -81, 1, -81, -6, 50, 14, 28, 29, 36, 3,
+- 58, 44, -3, -81, 47, -81, -81, 65, 68, 2,
+- 2, -81, -81, -81, -81, -9, -9, -9, -9, -9,
+- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+- -9, -9, -9, -9, -81, 63, 69, 2, -81, -81,
+- 50, 57, 14, 28, 29, 36, 3, 3, 58, 58,
+- 58, 58, 44, 44, -3, -3, -81, -81, -81, 79,
+- 80, -8, 63, -81, 72, 63, -81, -81, -9, 76,
+- 77, -81, -81, -81, -81, -81, 78, -81, -81, -81,
+- -81, -81, 35, 4, -81, -81, -81, -81, 86, -81,
+- -81, -81, 73, -81, -81, 33, 71, 84, 39, -81,
+- -81, -81, -81, -81, 41, -81, -81, -81, 25, -81,
+- 74, 25, 75, -81
++ 15, -12, 35, 42, -84, 27, 9, -84, 24, 9,
++ 43, 9, -84, -84, -10, 24, -84, 60, 44, -84,
++ -10, -10, -10, -84, 55, -84, -7, 52, 53, 51,
++ 54, 10, 2, 38, 37, -4, -84, 68, -84, -84,
++ 71, 73, 60, 60, -84, -84, -84, -84, -10, -10,
++ -10, -10, -10, -10, -10, -10, -10, -10, -10, -10,
++ -10, -10, -10, -10, -10, -10, -10, -84, 56, 72,
++ 60, -84, -84, 52, 61, 53, 51, 54, 10, 2,
++ 2, 38, 38, 38, 38, 37, 37, -4, -4, -84,
++ -84, -84, 81, 83, 34, 56, -84, 74, 56, -84,
++ -84, -10, 76, 78, -84, -84, -84, -84, -84, 79,
++ -84, -84, -84, -84, -84, -6, 3, -84, -84, -84,
++ -84, 87, -84, -84, -84, 75, -84, -84, 32, 70,
++ 86, 36, -84, -84, -84, -84, -84, 47, -84, -84,
++ -84, 24, -84, 77, 24, 80, -84
+ };
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+@@ -575,37 +578,37 @@ static const yytype_int8 yypact[] =
+ means the default is an error. */
+ static const yytype_uint8 yydefact[] =
+ {
+- 0, 0, 0, 3, 1, 0, 0, 0, 3, 34,
+- 35, 0, 0, 6, 0, 2, 4, 0, 0, 0,
+- 68, 0, 37, 38, 40, 42, 44, 46, 48, 50,
+- 53, 60, 63, 67, 0, 13, 7, 0, 0, 0,
+- 0, 69, 70, 71, 36, 0, 0, 0, 0, 0,
++ 0, 0, 0, 3, 1, 0, 5, 4, 0, 0,
++ 0, 5, 36, 37, 0, 0, 8, 0, 2, 6,
++ 0, 0, 0, 70, 0, 39, 40, 42, 44, 46,
++ 48, 50, 52, 55, 62, 65, 69, 0, 15, 9,
++ 0, 0, 0, 0, 71, 72, 73, 38, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+- 0, 0, 0, 0, 5, 75, 0, 0, 10, 8,
+- 41, 0, 43, 45, 47, 49, 51, 52, 56, 57,
+- 55, 54, 58, 59, 61, 62, 65, 64, 66, 0,
+- 0, 0, 0, 14, 0, 75, 11, 9, 0, 0,
+- 0, 16, 26, 78, 18, 80, 0, 77, 76, 39,
+- 17, 79, 0, 0, 12, 25, 15, 27, 0, 19,
+- 28, 22, 0, 72, 30, 0, 0, 0, 0, 33,
+- 32, 20, 31, 29, 0, 73, 74, 21, 0, 24,
+- 0, 0, 0, 23
++ 0, 0, 0, 0, 0, 0, 0, 7, 77, 0,
++ 0, 12, 10, 43, 0, 45, 47, 49, 51, 53,
++ 54, 58, 59, 57, 56, 60, 61, 63, 64, 67,
++ 66, 68, 0, 0, 0, 0, 16, 0, 77, 13,
++ 11, 0, 0, 0, 18, 28, 80, 20, 82, 0,
++ 79, 78, 41, 19, 81, 0, 0, 14, 27, 17,
++ 29, 0, 21, 30, 24, 0, 74, 32, 0, 0,
++ 0, 0, 35, 34, 22, 33, 31, 0, 75, 76,
++ 23, 0, 26, 0, 0, 0, 25
+ };
+
+ /* YYPGOTO[NTERM-NUM]. */
+ static const yytype_int8 yypgoto[] =
+ {
+- -81, -81, 100, 104, -81, -38, -81, -80, -81, -81,
+- -81, -5, 66, 13, -81, 70, 67, 81, 64, 82,
+- 37, 27, 34, 38, -14, -81, 22, 24
++ -84, -84, -84, 98, 101, -84, -41, -84, -83, -84,
++ -84, -84, -8, 63, 12, -84, 66, 67, 65, 69,
++ 82, 29, 18, 25, 26, -17, -84, 20, 28
+ };
+
+ /* YYDEFGOTO[NTERM-NUM]. */
+ static const yytype_int16 yydefgoto[] =
+ {
+- -1, 2, 7, 8, 15, 36, 65, 93, 112, 113,
+- 125, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+- 29, 30, 31, 32, 33, 128, 94, 95
++ -1, 2, 6, 10, 11, 18, 39, 68, 96, 115,
++ 116, 128, 23, 24, 25, 26, 27, 28, 29, 30,
++ 31, 32, 33, 34, 35, 36, 131, 97, 98
+ };
+
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+@@ -613,87 +616,87 @@ static const yytype_int16 yydefgoto[] =
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+ static const yytype_uint8 yytable[] =
+ {
+- 12, 68, 69, 41, 42, 43, 45, 34, 9, 10,
+- 53, 54, 104, 3, 5, 107, 101, 118, 35, 1,
+- 102, 4, 61, 11, 119, 120, 121, 122, 35, 97,
+- 46, 6, 55, 17, 123, 44, 18, 19, 56, 124,
+- 62, 63, 9, 10, 14, 51, 52, 86, 87, 88,
+- 9, 10, 48, 103, 129, 130, 115, 11, 135, 116,
+- 136, 47, 131, 57, 58, 11, 37, 49, 117, 50,
+- 137, 64, 38, 39, 138, 139, 40, 89, 90, 91,
+- 78, 79, 80, 81, 92, 59, 60, 66, 76, 77,
+- 67, 82, 83, 96, 98, 99, 100, 84, 85, 106,
+- 110, 111, 114, 126, 134, 127, 133, 141, 16, 143,
+- 13, 109, 71, 74, 72, 70, 105, 108, 0, 0,
+- 132, 0, 0, 0, 0, 0, 0, 0, 0, 73,
+- 0, 0, 75, 140, 0, 0, 142
++ 15, 71, 72, 44, 45, 46, 48, 37, 12, 13,
++ 56, 57, 107, 3, 8, 110, 118, 121, 1, 119,
++ 54, 55, 64, 14, 122, 123, 124, 125, 120, 100,
++ 49, 9, 58, 20, 126, 4, 21, 22, 59, 127,
++ 65, 66, 12, 13, 60, 61, 5, 89, 90, 91,
++ 12, 13, 7, 106, 132, 133, 138, 14, 139, 104,
++ 40, 38, 134, 105, 50, 14, 41, 42, 140, 17,
++ 43, 92, 93, 94, 81, 82, 83, 84, 95, 62,
++ 63, 141, 142, 79, 80, 85, 86, 38, 87, 88,
++ 47, 52, 51, 67, 69, 53, 70, 99, 102, 101,
++ 103, 113, 109, 114, 117, 129, 136, 137, 130, 19,
++ 16, 144, 74, 112, 73, 146, 76, 75, 111, 0,
++ 135, 77, 0, 108, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 143, 0, 78, 145
+ };
+
+ static const yytype_int16 yycheck[] =
+ {
+- 5, 39, 40, 17, 18, 19, 12, 12, 17, 18,
+- 7, 8, 92, 24, 4, 95, 24, 13, 26, 3,
+- 28, 0, 25, 32, 20, 21, 22, 23, 26, 67,
+- 36, 21, 29, 42, 30, 34, 45, 46, 35, 35,
+- 43, 44, 17, 18, 25, 9, 10, 61, 62, 63,
+- 17, 18, 38, 91, 21, 22, 21, 32, 19, 24,
+- 21, 11, 29, 5, 6, 32, 15, 39, 33, 40,
+- 31, 24, 21, 22, 33, 34, 25, 14, 15, 16,
+- 53, 54, 55, 56, 21, 41, 42, 22, 51, 52,
+- 22, 57, 58, 24, 37, 16, 16, 59, 60, 27,
+- 24, 24, 24, 17, 20, 32, 35, 33, 8, 34,
+- 6, 98, 46, 49, 47, 45, 92, 95, -1, -1,
+- 125, -1, -1, -1, -1, -1, -1, -1, -1, 48,
+- -1, -1, 50, 138, -1, -1, 141
++ 8, 42, 43, 20, 21, 22, 13, 15, 18, 19,
++ 8, 9, 95, 25, 5, 98, 22, 14, 3, 25,
++ 10, 11, 26, 33, 21, 22, 23, 24, 34, 70,
++ 37, 22, 30, 43, 31, 0, 46, 47, 36, 36,
++ 44, 45, 18, 19, 6, 7, 4, 64, 65, 66,
++ 18, 19, 25, 94, 22, 23, 20, 33, 22, 25,
++ 16, 27, 30, 29, 12, 33, 22, 23, 32, 26,
++ 26, 15, 16, 17, 56, 57, 58, 59, 22, 42,
++ 43, 34, 35, 54, 55, 60, 61, 27, 62, 63,
++ 35, 40, 39, 25, 23, 41, 23, 25, 17, 38,
++ 17, 25, 28, 25, 25, 18, 36, 21, 33, 11,
++ 9, 34, 49, 101, 48, 35, 51, 50, 98, -1,
++ 128, 52, -1, 95, -1, -1, -1, -1, -1, -1,
++ -1, -1, -1, 141, -1, 53, 144
+ };
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+ static const yytype_uint8 yystos[] =
+ {
+- 0, 3, 48, 24, 0, 4, 21, 49, 50, 17,
+- 18, 32, 58, 50, 25, 51, 49, 42, 45, 46,
+- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
+- 68, 69, 70, 71, 58, 26, 52, 15, 21, 22,
+- 25, 71, 71, 71, 34, 12, 36, 11, 38, 39,
+- 40, 9, 10, 7, 8, 29, 35, 5, 6, 41,
+- 42, 25, 43, 44, 24, 53, 22, 22, 52, 52,
+- 62, 59, 63, 64, 65, 66, 67, 67, 68, 68,
+- 68, 68, 69, 69, 70, 70, 71, 71, 71, 14,
+- 15, 16, 21, 54, 73, 74, 24, 52, 37, 16,
+- 16, 24, 28, 52, 54, 74, 27, 54, 73, 60,
+- 24, 24, 55, 56, 24, 21, 24, 33, 13, 20,
+- 21, 22, 23, 30, 35, 57, 17, 32, 72, 21,
+- 22, 29, 58, 35, 20, 19, 21, 31, 33, 34,
+- 58, 33, 58, 34
++ 0, 3, 49, 25, 0, 4, 50, 25, 5, 22,
++ 51, 52, 18, 19, 33, 60, 52, 26, 53, 51,
++ 43, 46, 47, 60, 61, 62, 63, 64, 65, 66,
++ 67, 68, 69, 70, 71, 72, 73, 60, 27, 54,
++ 16, 22, 23, 26, 73, 73, 73, 35, 13, 37,
++ 12, 39, 40, 41, 10, 11, 8, 9, 30, 36,
++ 6, 7, 42, 43, 26, 44, 45, 25, 55, 23,
++ 23, 54, 54, 64, 61, 65, 66, 67, 68, 69,
++ 69, 70, 70, 70, 70, 71, 71, 72, 72, 73,
++ 73, 73, 15, 16, 17, 22, 56, 75, 76, 25,
++ 54, 38, 17, 17, 25, 29, 54, 56, 76, 28,
++ 56, 75, 62, 25, 25, 57, 58, 25, 22, 25,
++ 34, 14, 21, 22, 23, 24, 31, 36, 59, 18,
++ 33, 74, 22, 23, 30, 60, 36, 21, 20, 22,
++ 32, 34, 35, 60, 34, 60, 35
+ };
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+ static const yytype_uint8 yyr1[] =
+ {
+- 0, 47, 48, 49, 49, 50, 50, 51, 51, 51,
+- 51, 51, 52, 53, 53, 54, 54, 54, 54, 55,
+- 55, 55, 55, 55, 55, 55, 56, 56, 56, 57,
+- 57, 57, 57, 57, 58, 58, 58, 59, 60, 60,
+- 61, 61, 62, 62, 63, 63, 64, 64, 65, 65,
+- 66, 66, 66, 67, 67, 67, 67, 67, 68, 68,
+- 68, 69, 69, 69, 70, 70, 70, 70, 71, 71,
+- 71, 71, 72, 72, 72, 73, 73, 73, 74, 74,
+- 74
++ 0, 48, 49, 50, 50, 51, 51, 52, 52, 53,
++ 53, 53, 53, 53, 54, 55, 55, 56, 56, 56,
++ 56, 57, 57, 57, 57, 57, 57, 57, 58, 58,
++ 58, 59, 59, 59, 59, 59, 60, 60, 60, 61,
++ 62, 62, 63, 63, 64, 64, 65, 65, 66, 66,
++ 67, 67, 68, 68, 68, 69, 69, 69, 69, 69,
++ 70, 70, 70, 71, 71, 71, 72, 72, 72, 72,
++ 73, 73, 73, 73, 74, 74, 74, 75, 75, 75,
++ 76, 76, 76
+ };
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+ static const yytype_uint8 yyr2[] =
+ {
+- 0, 2, 4, 0, 2, 4, 2, 2, 3, 4,
+- 3, 4, 5, 0, 2, 4, 2, 3, 2, 2,
+- 3, 4, 2, 9, 5, 2, 0, 2, 2, 3,
+- 1, 2, 2, 2, 1, 1, 3, 1, 1, 5,
+- 1, 3, 1, 3, 1, 3, 1, 3, 1, 3,
+- 1, 3, 3, 1, 3, 3, 3, 3, 3, 3,
+- 1, 3, 3, 1, 3, 3, 3, 1, 1, 2,
+- 2, 2, 0, 2, 2, 0, 2, 2, 2, 3,
+- 2
++ 0, 2, 5, 0, 2, 0, 2, 4, 2, 2,
++ 3, 4, 3, 4, 5, 0, 2, 4, 2, 3,
++ 2, 2, 3, 4, 2, 9, 5, 2, 0, 2,
++ 2, 3, 1, 2, 2, 2, 1, 1, 3, 1,
++ 1, 5, 1, 3, 1, 3, 1, 3, 1, 3,
++ 1, 3, 1, 3, 3, 1, 3, 3, 3, 3,
++ 3, 3, 1, 3, 3, 1, 3, 3, 3, 1,
++ 1, 2, 2, 2, 0, 2, 2, 0, 2, 2,
++ 2, 3, 2
+ };
+
+
+@@ -1463,65 +1466,82 @@ yyreduce:
+ switch (yyn)
+ {
+ case 2:
+-#line 105 "dtc-parser.y" /* yacc.c:1646 */
++#line 109 "dtc-parser.y" /* yacc.c:1646 */
+ {
++ (yyvsp[0].node)->is_plugin = (yyvsp[-2].is_plugin);
+ the_boot_info = build_boot_info((yyvsp[-1].re), (yyvsp[0].node),
+ guess_boot_cpuid((yyvsp[0].node)));
+ }
+-#line 1472 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1476 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 3:
+-#line 113 "dtc-parser.y" /* yacc.c:1646 */
++#line 118 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.re) = NULL;
++ (yyval.is_plugin) = false;
+ }
+-#line 1480 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1484 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 4:
+-#line 117 "dtc-parser.y" /* yacc.c:1646 */
++#line 122 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.re) = chain_reserve_entry((yyvsp[-1].re), (yyvsp[0].re));
++ (yyval.is_plugin) = true;
+ }
+-#line 1488 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1492 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 5:
+-#line 124 "dtc-parser.y" /* yacc.c:1646 */
++#line 129 "dtc-parser.y" /* yacc.c:1646 */
+ {
+- (yyval.re) = build_reserve_entry((yyvsp[-2].integer), (yyvsp[-1].integer));
++ (yyval.re) = NULL;
+ }
+-#line 1496 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1500 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+ case 6:
+-#line 128 "dtc-parser.y" /* yacc.c:1646 */
++#line 133 "dtc-parser.y" /* yacc.c:1646 */
++ {
++ (yyval.re) = chain_reserve_entry((yyvsp[-1].re), (yyvsp[0].re));
++ }
++#line 1508 "dtc-parser.tab.c" /* yacc.c:1646 */
++ break;
++
++ case 7:
++#line 140 "dtc-parser.y" /* yacc.c:1646 */
++ {
++ (yyval.re) = build_reserve_entry((yyvsp[-2].integer), (yyvsp[-1].integer));
++ }
++#line 1516 "dtc-parser.tab.c" /* yacc.c:1646 */
++ break;
++
++ case 8:
++#line 144 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ add_label(&(yyvsp[0].re)->labels, (yyvsp[-1].labelref));
+ (yyval.re) = (yyvsp[0].re);
+ }
+-#line 1505 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1525 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 7:
+-#line 136 "dtc-parser.y" /* yacc.c:1646 */
++ case 9:
++#line 152 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.node) = name_node((yyvsp[0].node), "");
+ }
+-#line 1513 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1533 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 8:
+-#line 140 "dtc-parser.y" /* yacc.c:1646 */
++ case 10:
++#line 156 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.node) = merge_nodes((yyvsp[-2].node), (yyvsp[0].node));
+ }
+-#line 1521 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1541 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 9:
+-#line 145 "dtc-parser.y" /* yacc.c:1646 */
++ case 11:
++#line 161 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
+
+@@ -1532,11 +1552,11 @@ yyreduce:
+ ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
+ (yyval.node) = (yyvsp[-3].node);
+ }
+-#line 1536 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1556 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 10:
+-#line 156 "dtc-parser.y" /* yacc.c:1646 */
++ case 12:
++#line 172 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ struct node *target = get_node_by_ref((yyvsp[-2].node), (yyvsp[-1].labelref));
+
+@@ -1546,11 +1566,11 @@ yyreduce:
+ ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
+ (yyval.node) = (yyvsp[-2].node);
+ }
+-#line 1550 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1570 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 11:
+-#line 166 "dtc-parser.y" /* yacc.c:1646 */
++ case 13:
++#line 182 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
+
+@@ -1562,100 +1582,100 @@ yyreduce:
+
+ (yyval.node) = (yyvsp[-3].node);
+ }
+-#line 1566 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1586 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 12:
+-#line 181 "dtc-parser.y" /* yacc.c:1646 */
++ case 14:
++#line 197 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.node) = build_node((yyvsp[-3].proplist), (yyvsp[-2].nodelist));
+ }
+-#line 1574 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1594 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 13:
+-#line 188 "dtc-parser.y" /* yacc.c:1646 */
++ case 15:
++#line 204 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.proplist) = NULL;
+ }
+-#line 1582 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1602 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 14:
+-#line 192 "dtc-parser.y" /* yacc.c:1646 */
++ case 16:
++#line 208 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.proplist) = chain_property((yyvsp[0].prop), (yyvsp[-1].proplist));
+ }
+-#line 1590 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1610 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 15:
+-#line 199 "dtc-parser.y" /* yacc.c:1646 */
++ case 17:
++#line 215 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.prop) = build_property((yyvsp[-3].propnodename), (yyvsp[-1].data));
+ }
+-#line 1598 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1618 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 16:
+-#line 203 "dtc-parser.y" /* yacc.c:1646 */
++ case 18:
++#line 219 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.prop) = build_property((yyvsp[-1].propnodename), empty_data);
+ }
+-#line 1606 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1626 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 17:
+-#line 207 "dtc-parser.y" /* yacc.c:1646 */
++ case 19:
++#line 223 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.prop) = build_property_delete((yyvsp[-1].propnodename));
+ }
+-#line 1614 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1634 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 18:
+-#line 211 "dtc-parser.y" /* yacc.c:1646 */
++ case 20:
++#line 227 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ add_label(&(yyvsp[0].prop)->labels, (yyvsp[-1].labelref));
+ (yyval.prop) = (yyvsp[0].prop);
+ }
+-#line 1623 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1643 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 19:
+-#line 219 "dtc-parser.y" /* yacc.c:1646 */
++ case 21:
++#line 235 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_merge((yyvsp[-1].data), (yyvsp[0].data));
+ }
+-#line 1631 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1651 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 20:
+-#line 223 "dtc-parser.y" /* yacc.c:1646 */
++ case 22:
++#line 239 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_merge((yyvsp[-2].data), (yyvsp[-1].array).data);
+ }
+-#line 1639 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1659 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 21:
+-#line 227 "dtc-parser.y" /* yacc.c:1646 */
++ case 23:
++#line 243 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_merge((yyvsp[-3].data), (yyvsp[-1].data));
+ }
+-#line 1647 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1667 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 22:
+-#line 231 "dtc-parser.y" /* yacc.c:1646 */
++ case 24:
++#line 247 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_add_marker((yyvsp[-1].data), REF_PATH, (yyvsp[0].labelref));
+ }
+-#line 1655 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1675 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 23:
+-#line 235 "dtc-parser.y" /* yacc.c:1646 */
++ case 25:
++#line 251 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ FILE *f = srcfile_relative_open((yyvsp[-5].data).val, NULL);
+ struct data d;
+@@ -1671,11 +1691,11 @@ yyreduce:
+ (yyval.data) = data_merge((yyvsp[-8].data), d);
+ fclose(f);
+ }
+-#line 1675 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1695 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 24:
+-#line 251 "dtc-parser.y" /* yacc.c:1646 */
++ case 26:
++#line 267 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ FILE *f = srcfile_relative_open((yyvsp[-1].data).val, NULL);
+ struct data d = empty_data;
+@@ -1685,43 +1705,43 @@ yyreduce:
+ (yyval.data) = data_merge((yyvsp[-4].data), d);
+ fclose(f);
+ }
+-#line 1689 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1709 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 25:
+-#line 261 "dtc-parser.y" /* yacc.c:1646 */
++ case 27:
++#line 277 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
+ }
+-#line 1697 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1717 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 26:
+-#line 268 "dtc-parser.y" /* yacc.c:1646 */
++ case 28:
++#line 284 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = empty_data;
+ }
+-#line 1705 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1725 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 27:
+-#line 272 "dtc-parser.y" /* yacc.c:1646 */
++ case 29:
++#line 288 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = (yyvsp[-1].data);
+ }
+-#line 1713 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1733 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 28:
+-#line 276 "dtc-parser.y" /* yacc.c:1646 */
++ case 30:
++#line 292 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
+ }
+-#line 1721 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1741 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 29:
+-#line 283 "dtc-parser.y" /* yacc.c:1646 */
++ case 31:
++#line 299 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ unsigned long long bits;
+
+@@ -1737,20 +1757,20 @@ yyreduce:
+ (yyval.array).data = empty_data;
+ (yyval.array).bits = bits;
+ }
+-#line 1741 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1761 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 30:
+-#line 299 "dtc-parser.y" /* yacc.c:1646 */
++ case 32:
++#line 315 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.array).data = empty_data;
+ (yyval.array).bits = 32;
+ }
+-#line 1750 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1770 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 31:
+-#line 304 "dtc-parser.y" /* yacc.c:1646 */
++ case 33:
++#line 320 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ if ((yyvsp[-1].array).bits < 64) {
+ uint64_t mask = (1ULL << (yyvsp[-1].array).bits) - 1;
+@@ -1769,11 +1789,11 @@ yyreduce:
+
+ (yyval.array).data = data_append_integer((yyvsp[-1].array).data, (yyvsp[0].integer), (yyvsp[-1].array).bits);
+ }
+-#line 1773 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1793 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 32:
+-#line 323 "dtc-parser.y" /* yacc.c:1646 */
++ case 34:
++#line 339 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ uint64_t val = ~0ULL >> (64 - (yyvsp[-1].array).bits);
+
+@@ -1787,233 +1807,233 @@ yyreduce:
+
+ (yyval.array).data = data_append_integer((yyvsp[-1].array).data, val, (yyvsp[-1].array).bits);
+ }
+-#line 1791 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1811 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 33:
+-#line 337 "dtc-parser.y" /* yacc.c:1646 */
++ case 35:
++#line 353 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.array).data = data_add_marker((yyvsp[-1].array).data, LABEL, (yyvsp[0].labelref));
+ }
+-#line 1799 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1819 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 36:
+-#line 346 "dtc-parser.y" /* yacc.c:1646 */
++ case 38:
++#line 362 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.integer) = (yyvsp[-1].integer);
+ }
+-#line 1807 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1827 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 39:
+-#line 357 "dtc-parser.y" /* yacc.c:1646 */
++ case 41:
++#line 373 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-4].integer) ? (yyvsp[-2].integer) : (yyvsp[0].integer); }
+-#line 1813 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1833 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 41:
+-#line 362 "dtc-parser.y" /* yacc.c:1646 */
++ case 43:
++#line 378 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) || (yyvsp[0].integer); }
+-#line 1819 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1839 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 43:
+-#line 367 "dtc-parser.y" /* yacc.c:1646 */
++ case 45:
++#line 383 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) && (yyvsp[0].integer); }
+-#line 1825 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1845 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 45:
+-#line 372 "dtc-parser.y" /* yacc.c:1646 */
++ case 47:
++#line 388 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) | (yyvsp[0].integer); }
+-#line 1831 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1851 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 47:
+-#line 377 "dtc-parser.y" /* yacc.c:1646 */
++ case 49:
++#line 393 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) ^ (yyvsp[0].integer); }
+-#line 1837 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1857 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 49:
+-#line 382 "dtc-parser.y" /* yacc.c:1646 */
++ case 51:
++#line 398 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) & (yyvsp[0].integer); }
+-#line 1843 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1863 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 51:
+-#line 387 "dtc-parser.y" /* yacc.c:1646 */
++ case 53:
++#line 403 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) == (yyvsp[0].integer); }
+-#line 1849 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1869 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 52:
+-#line 388 "dtc-parser.y" /* yacc.c:1646 */
++ case 54:
++#line 404 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) != (yyvsp[0].integer); }
+-#line 1855 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1875 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 54:
+-#line 393 "dtc-parser.y" /* yacc.c:1646 */
++ case 56:
++#line 409 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) < (yyvsp[0].integer); }
+-#line 1861 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1881 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 55:
+-#line 394 "dtc-parser.y" /* yacc.c:1646 */
++ case 57:
++#line 410 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) > (yyvsp[0].integer); }
+-#line 1867 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1887 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 56:
+-#line 395 "dtc-parser.y" /* yacc.c:1646 */
++ case 58:
++#line 411 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) <= (yyvsp[0].integer); }
+-#line 1873 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1893 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 57:
+-#line 396 "dtc-parser.y" /* yacc.c:1646 */
++ case 59:
++#line 412 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) >= (yyvsp[0].integer); }
+-#line 1879 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1899 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 58:
+-#line 400 "dtc-parser.y" /* yacc.c:1646 */
++ case 60:
++#line 416 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) << (yyvsp[0].integer); }
+-#line 1885 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1905 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 59:
+-#line 401 "dtc-parser.y" /* yacc.c:1646 */
++ case 61:
++#line 417 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) >> (yyvsp[0].integer); }
+-#line 1891 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1911 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 61:
+-#line 406 "dtc-parser.y" /* yacc.c:1646 */
++ case 63:
++#line 422 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) + (yyvsp[0].integer); }
+-#line 1897 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1917 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 62:
+-#line 407 "dtc-parser.y" /* yacc.c:1646 */
++ case 64:
++#line 423 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) - (yyvsp[0].integer); }
+-#line 1903 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1923 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 64:
+-#line 412 "dtc-parser.y" /* yacc.c:1646 */
++ case 66:
++#line 428 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) * (yyvsp[0].integer); }
+-#line 1909 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1929 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 65:
+-#line 413 "dtc-parser.y" /* yacc.c:1646 */
++ case 67:
++#line 429 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) / (yyvsp[0].integer); }
+-#line 1915 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1935 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 66:
+-#line 414 "dtc-parser.y" /* yacc.c:1646 */
++ case 68:
++#line 430 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = (yyvsp[-2].integer) % (yyvsp[0].integer); }
+-#line 1921 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1941 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 69:
+-#line 420 "dtc-parser.y" /* yacc.c:1646 */
++ case 71:
++#line 436 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = -(yyvsp[0].integer); }
+-#line 1927 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1947 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 70:
+-#line 421 "dtc-parser.y" /* yacc.c:1646 */
++ case 72:
++#line 437 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = ~(yyvsp[0].integer); }
+-#line 1933 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1953 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 71:
+-#line 422 "dtc-parser.y" /* yacc.c:1646 */
++ case 73:
++#line 438 "dtc-parser.y" /* yacc.c:1646 */
+ { (yyval.integer) = !(yyvsp[0].integer); }
+-#line 1939 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1959 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 72:
+-#line 427 "dtc-parser.y" /* yacc.c:1646 */
++ case 74:
++#line 443 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = empty_data;
+ }
+-#line 1947 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1967 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 73:
+-#line 431 "dtc-parser.y" /* yacc.c:1646 */
++ case 75:
++#line 447 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_append_byte((yyvsp[-1].data), (yyvsp[0].byte));
+ }
+-#line 1955 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1975 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 74:
+-#line 435 "dtc-parser.y" /* yacc.c:1646 */
++ case 76:
++#line 451 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
+ }
+-#line 1963 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1983 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 75:
+-#line 442 "dtc-parser.y" /* yacc.c:1646 */
++ case 77:
++#line 458 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.nodelist) = NULL;
+ }
+-#line 1971 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1991 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 76:
+-#line 446 "dtc-parser.y" /* yacc.c:1646 */
++ case 78:
++#line 462 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.nodelist) = chain_node((yyvsp[-1].node), (yyvsp[0].nodelist));
+ }
+-#line 1979 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 1999 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 77:
+-#line 450 "dtc-parser.y" /* yacc.c:1646 */
++ case 79:
++#line 466 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ ERROR(&(yylsp[0]), "Properties must precede subnodes");
+ YYERROR;
+ }
+-#line 1988 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 2008 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 78:
+-#line 458 "dtc-parser.y" /* yacc.c:1646 */
++ case 80:
++#line 474 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.node) = name_node((yyvsp[0].node), (yyvsp[-1].propnodename));
+ }
+-#line 1996 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 2016 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 79:
+-#line 462 "dtc-parser.y" /* yacc.c:1646 */
++ case 81:
++#line 478 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ (yyval.node) = name_node(build_node_delete(), (yyvsp[-1].propnodename));
+ }
+-#line 2004 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 2024 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+- case 80:
+-#line 466 "dtc-parser.y" /* yacc.c:1646 */
++ case 82:
++#line 482 "dtc-parser.y" /* yacc.c:1646 */
+ {
+ add_label(&(yyvsp[0].node)->labels, (yyvsp[-1].labelref));
+ (yyval.node) = (yyvsp[0].node);
+ }
+-#line 2013 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 2033 "dtc-parser.tab.c" /* yacc.c:1646 */
+ break;
+
+
+-#line 2017 "dtc-parser.tab.c" /* yacc.c:1646 */
++#line 2037 "dtc-parser.tab.c" /* yacc.c:1646 */
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+@@ -2248,7 +2268,7 @@ yyreturn:
+ #endif
+ return yyresult;
+ }
+-#line 472 "dtc-parser.y" /* yacc.c:1906 */
++#line 488 "dtc-parser.y" /* yacc.c:1906 */
+
+
+ void yyerror(char const *s)
+--- a/scripts/dtc/dtc-parser.tab.h_shipped
++++ b/scripts/dtc/dtc-parser.tab.h_shipped
+@@ -46,26 +46,27 @@ extern int yydebug;
+ enum yytokentype
+ {
+ DT_V1 = 258,
+- DT_MEMRESERVE = 259,
+- DT_LSHIFT = 260,
+- DT_RSHIFT = 261,
+- DT_LE = 262,
+- DT_GE = 263,
+- DT_EQ = 264,
+- DT_NE = 265,
+- DT_AND = 266,
+- DT_OR = 267,
+- DT_BITS = 268,
+- DT_DEL_PROP = 269,
+- DT_DEL_NODE = 270,
+- DT_PROPNODENAME = 271,
+- DT_LITERAL = 272,
+- DT_CHAR_LITERAL = 273,
+- DT_BYTE = 274,
+- DT_STRING = 275,
+- DT_LABEL = 276,
+- DT_REF = 277,
+- DT_INCBIN = 278
++ DT_PLUGIN = 259,
++ DT_MEMRESERVE = 260,
++ DT_LSHIFT = 261,
++ DT_RSHIFT = 262,
++ DT_LE = 263,
++ DT_GE = 264,
++ DT_EQ = 265,
++ DT_NE = 266,
++ DT_AND = 267,
++ DT_OR = 268,
++ DT_BITS = 269,
++ DT_DEL_PROP = 270,
++ DT_DEL_NODE = 271,
++ DT_PROPNODENAME = 272,
++ DT_LITERAL = 273,
++ DT_CHAR_LITERAL = 274,
++ DT_BYTE = 275,
++ DT_STRING = 276,
++ DT_LABEL = 277,
++ DT_REF = 278,
++ DT_INCBIN = 279
+ };
+ #endif
+
+@@ -74,7 +75,7 @@ extern int yydebug;
+ typedef union YYSTYPE YYSTYPE;
+ union YYSTYPE
+ {
+-#line 38 "dtc-parser.y" /* yacc.c:1909 */
++#line 39 "dtc-parser.y" /* yacc.c:1909 */
+
+ char *propnodename;
+ char *labelref;
+@@ -92,8 +93,9 @@ union YYSTYPE
+ struct node *nodelist;
+ struct reserve_info *re;
+ uint64_t integer;
++ bool is_plugin;
+
+-#line 97 "dtc-parser.tab.h" /* yacc.c:1909 */
++#line 99 "dtc-parser.tab.h" /* yacc.c:1909 */
+ };
+ # define YYSTYPE_IS_TRIVIAL 1
+ # define YYSTYPE_IS_DECLARED 1
+--- a/scripts/dtc/dtc-parser.y
++++ b/scripts/dtc/dtc-parser.y
+@@ -19,6 +19,7 @@
+ */
+ %{
+ #include <stdio.h>
++#include <inttypes.h>
+
+ #include "dtc.h"
+ #include "srcpos.h"
+@@ -52,9 +53,11 @@ extern bool treesource_error;
+ struct node *nodelist;
+ struct reserve_info *re;
+ uint64_t integer;
++ bool is_plugin;
+ }
+
+ %token DT_V1
++%token DT_PLUGIN
+ %token DT_MEMRESERVE
+ %token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
+ %token DT_BITS
+@@ -71,6 +74,7 @@ extern bool treesource_error;
+
+ %type <data> propdata
+ %type <data> propdataprefix
++%type <is_plugin> plugindecl
+ %type <re> memreserve
+ %type <re> memreserves
+ %type <array> arrayprefix
+@@ -101,10 +105,22 @@ extern bool treesource_error;
+ %%
+
+ sourcefile:
+- DT_V1 ';' memreserves devicetree
++ DT_V1 ';' plugindecl memreserves devicetree
+ {
+- the_boot_info = build_boot_info($3, $4,
+- guess_boot_cpuid($4));
++ $5->is_plugin = $3;
++ the_boot_info = build_boot_info($4, $5,
++ guess_boot_cpuid($5));
++ }
++ ;
++
++plugindecl:
++ /* empty */
++ {
++ $$ = false;
++ }
++ | DT_PLUGIN ';'
++ {
++ $$ = true;
+ }
+ ;
+
+--- a/scripts/dtc/dtc.c
++++ b/scripts/dtc/dtc.c
+@@ -29,6 +29,7 @@ int reservenum; /* Number of memory res
+ int minsize; /* Minimum blob size */
+ int padsize; /* Additional padding to blob */
+ int phandle_format = PHANDLE_BOTH; /* Use linux,phandle or phandle properties */
++int symbol_fixup_support = 0;
+
+ static void fill_fullpaths(struct node *tree, const char *prefix)
+ {
+@@ -51,7 +52,7 @@ static void fill_fullpaths(struct node *
+ #define FDT_VERSION(version) _FDT_VERSION(version)
+ #define _FDT_VERSION(version) #version
+ static const char usage_synopsis[] = "dtc [options] <input file>";
+-static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv";
++static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:@hv";
+ static struct option const usage_long_opts[] = {
+ {"quiet", no_argument, NULL, 'q'},
+ {"in-format", a_argument, NULL, 'I'},
+@@ -69,6 +70,7 @@ static struct option const usage_long_op
+ {"phandle", a_argument, NULL, 'H'},
+ {"warning", a_argument, NULL, 'W'},
+ {"error", a_argument, NULL, 'E'},
++ {"symbols", no_argument, NULL, '@'},
+ {"help", no_argument, NULL, 'h'},
+ {"version", no_argument, NULL, 'v'},
+ {NULL, no_argument, NULL, 0x0},
+@@ -99,6 +101,7 @@ static const char * const usage_opts_hel
+ "\t\tboth - Both \"linux,phandle\" and \"phandle\" properties",
+ "\n\tEnable/disable warnings (prefix with \"no-\")",
+ "\n\tEnable/disable errors (prefix with \"no-\")",
++ "\n\tEnable symbols/fixup support",
+ "\n\tPrint this help and exit",
+ "\n\tPrint version and exit",
+ NULL,
+@@ -186,7 +189,9 @@ int main(int argc, char *argv[])
+ case 'E':
+ parse_checks_option(false, true, optarg);
+ break;
+-
++ case '@':
++ symbol_fixup_support = 1;
++ break;
+ case 'h':
+ usage(NULL);
+ default:
+--- a/scripts/dtc/dtc.h
++++ b/scripts/dtc/dtc.h
+@@ -54,6 +54,7 @@ extern int reservenum; /* Number of mem
+ extern int minsize; /* Minimum blob size */
+ extern int padsize; /* Additional padding to blob */
+ extern int phandle_format; /* Use linux,phandle or phandle properties */
++extern int symbol_fixup_support;/* enable symbols & fixup support */
+
+ #define PHANDLE_LEGACY 0x1
+ #define PHANDLE_EPAPR 0x2
+@@ -132,6 +133,26 @@ struct label {
+ struct label *next;
+ };
+
++struct fixup_entry {
++ int offset;
++ struct node *node;
++ struct property *prop;
++ struct fixup_entry *next;
++ bool local_fixup_generated;
++};
++
++struct fixup {
++ char *ref;
++ struct fixup_entry *entries;
++ struct fixup *next;
++};
++
++struct symbol {
++ struct label *label;
++ struct node *node;
++ struct symbol *next;
++};
++
+ struct property {
+ bool deleted;
+ char *name;
+@@ -158,6 +179,13 @@ struct node {
+ int addr_cells, size_cells;
+
+ struct label *labels;
++
++ struct symbol *symbols;
++ struct fixup_entry *local_fixups;
++ bool emit_local_fixup_node;
++
++ bool is_plugin;
++ struct fixup *fixups;
+ };
+
+ #define for_each_label_withdel(l0, l) \
+@@ -181,6 +209,18 @@ struct node {
+ for_each_child_withdel(n, c) \
+ if (!(c)->deleted)
+
++#define for_each_fixup(n, f) \
++ for ((f) = (n)->fixups; (f); (f) = (f)->next)
++
++#define for_each_fixup_entry(f, fe) \
++ for ((fe) = (f)->entries; (fe); (fe) = (fe)->next)
++
++#define for_each_symbol(n, s) \
++ for ((s) = (n)->symbols; (s); (s) = (s)->next)
++
++#define for_each_local_fixup_entry(n, fe) \
++ for ((fe) = (n)->local_fixups; (fe); (fe) = (fe)->next)
++
+ void add_label(struct label **labels, char *label);
+ void delete_labels(struct label **labels);
+
+--- a/scripts/dtc/flattree.c
++++ b/scripts/dtc/flattree.c
+@@ -255,6 +255,204 @@ static int stringtable_insert(struct dat
+ return i;
+ }
+
++static void emit_local_fixups(struct node *tree, struct emitter *emit,
++ void *etarget, struct data *strbuf, struct version_info *vi,
++ struct node *node)
++{
++ struct fixup_entry *fe, *fen;
++ struct node *child;
++ int nameoff, count;
++ cell_t *buf;
++ struct data d;
++
++ if (node->emit_local_fixup_node) {
++
++ /* emit the external fixups (do not emit /) */
++ if (node != tree) {
++ emit->beginnode(etarget, NULL);
++ emit->string(etarget, node->name, 0);
++ emit->align(etarget, sizeof(cell_t));
++ }
++
++ for_each_local_fixup_entry(tree, fe) {
++ if (fe->node != node || fe->local_fixup_generated)
++ continue;
++
++ /* count the number of fixup entries */
++ count = 0;
++ for_each_local_fixup_entry(tree, fen) {
++ if (fen->prop != fe->prop)
++ continue;
++ fen->local_fixup_generated = true;
++ count++;
++ }
++
++ /* allocate buffer */
++ buf = xmalloc(count * sizeof(cell_t));
++
++ /* collect all the offsets in buffer */
++ count = 0;
++ for_each_local_fixup_entry(tree, fen) {
++ if (fen->prop != fe->prop)
++ continue;
++ fen->local_fixup_generated = true;
++ buf[count++] = cpu_to_fdt32(fen->offset);
++ }
++ d = empty_data;
++ d.len = count * sizeof(cell_t);
++ d.val = (char *)buf;
++
++ nameoff = stringtable_insert(strbuf, fe->prop->name);
++ emit->property(etarget, fe->prop->labels);
++ emit->cell(etarget, count * sizeof(cell_t));
++ emit->cell(etarget, nameoff);
++
++ if ((vi->flags & FTF_VARALIGN) &&
++ (count * sizeof(cell_t)) >= 8)
++ emit->align(etarget, 8);
++
++ emit->data(etarget, d);
++ emit->align(etarget, sizeof(cell_t));
++
++ free(buf);
++ }
++ }
++
++ for_each_child(node, child)
++ emit_local_fixups(tree, emit, etarget, strbuf, vi, child);
++
++ if (node->emit_local_fixup_node && node != tree)
++ emit->endnode(etarget, tree->labels);
++}
++
++static void emit_symbols_node(struct node *tree, struct emitter *emit,
++ void *etarget, struct data *strbuf,
++ struct version_info *vi)
++{
++ struct symbol *sym;
++ int nameoff, vallen;
++
++ /* do nothing if no symbols */
++ if (!tree->symbols)
++ return;
++
++ emit->beginnode(etarget, NULL);
++ emit->string(etarget, "__symbols__", 0);
++ emit->align(etarget, sizeof(cell_t));
++
++ for_each_symbol(tree, sym) {
++
++ vallen = strlen(sym->node->fullpath);
++
++ nameoff = stringtable_insert(strbuf, sym->label->label);
++
++ emit->property(etarget, NULL);
++ emit->cell(etarget, vallen + 1);
++ emit->cell(etarget, nameoff);
++
++ if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
++ emit->align(etarget, 8);
++
++ emit->string(etarget, sym->node->fullpath,
++ strlen(sym->node->fullpath));
++ emit->align(etarget, sizeof(cell_t));
++ }
++
++ emit->endnode(etarget, NULL);
++}
++
++static void emit_local_fixups_node(struct node *tree, struct emitter *emit,
++ void *etarget, struct data *strbuf,
++ struct version_info *vi)
++{
++ struct fixup_entry *fe;
++ struct node *node;
++
++ /* do nothing if no local fixups */
++ if (!tree->local_fixups)
++ return;
++
++ /* mark all nodes that need a local fixup generated (and parents) */
++ for_each_local_fixup_entry(tree, fe) {
++ node = fe->node;
++ while (node != NULL && !node->emit_local_fixup_node) {
++ node->emit_local_fixup_node = true;
++ node = node->parent;
++ }
++ }
++
++ /* emit the local fixups node now */
++ emit->beginnode(etarget, NULL);
++ emit->string(etarget, "__local_fixups__", 0);
++ emit->align(etarget, sizeof(cell_t));
++
++ emit_local_fixups(tree, emit, etarget, strbuf, vi, tree);
++
++ emit->endnode(etarget, tree->labels);
++}
++
++static void emit_fixups_node(struct node *tree, struct emitter *emit,
++ void *etarget, struct data *strbuf,
++ struct version_info *vi)
++{
++ struct fixup *f;
++ struct fixup_entry *fe;
++ char *name, *s;
++ const char *fullpath;
++ int namesz, nameoff, vallen;
++
++ /* do nothing if no fixups */
++ if (!tree->fixups)
++ return;
++
++ /* emit the external fixups */
++ emit->beginnode(etarget, NULL);
++ emit->string(etarget, "__fixups__", 0);
++ emit->align(etarget, sizeof(cell_t));
++
++ for_each_fixup(tree, f) {
++
++ namesz = 0;
++ for_each_fixup_entry(f, fe) {
++ fullpath = fe->node->fullpath;
++ if (fullpath[0] == '\0')
++ fullpath = "/";
++ namesz += strlen(fullpath) + 1;
++ namesz += strlen(fe->prop->name) + 1;
++ namesz += 32; /* space for :<number> + '\0' */
++ }
++
++ name = xmalloc(namesz);
++
++ s = name;
++ for_each_fixup_entry(f, fe) {
++ fullpath = fe->node->fullpath;
++ if (fullpath[0] == '\0')
++ fullpath = "/";
++ snprintf(s, name + namesz - s, "%s:%s:%d", fullpath,
++ fe->prop->name, fe->offset);
++ s += strlen(s) + 1;
++ }
++
++ nameoff = stringtable_insert(strbuf, f->ref);
++ vallen = s - name - 1;
++
++ emit->property(etarget, NULL);
++ emit->cell(etarget, vallen + 1);
++ emit->cell(etarget, nameoff);
++
++ if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
++ emit->align(etarget, 8);
++
++ emit->string(etarget, name, vallen);
++ emit->align(etarget, sizeof(cell_t));
++
++ free(name);
++ }
++
++ emit->endnode(etarget, tree->labels);
++}
++
+ static void flatten_tree(struct node *tree, struct emitter *emit,
+ void *etarget, struct data *strbuf,
+ struct version_info *vi)
+@@ -310,6 +508,10 @@ static void flatten_tree(struct node *tr
+ flatten_tree(child, emit, etarget, strbuf, vi);
+ }
+
++ emit_symbols_node(tree, emit, etarget, strbuf, vi);
++ emit_local_fixups_node(tree, emit, etarget, strbuf, vi);
++ emit_fixups_node(tree, emit, etarget, strbuf, vi);
++
+ emit->endnode(etarget, tree->labels);
+ }
+
+--- a/scripts/dtc/version_gen.h
++++ b/scripts/dtc/version_gen.h
+@@ -1 +1 @@
+-#define DTC_VERSION "DTC 1.4.1-g9d3649bd"
++#define DTC_VERSION "DTC 1.4.1-g25efc119"
diff --git a/target/linux/brcm2708/patches-4.4/0178-configfs-implement-binary-attributes.patch b/target/linux/brcm2708/patches-4.4/0178-configfs-implement-binary-attributes.patch
new file mode 100644
index 0000000000..27c83ea866
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0178-configfs-implement-binary-attributes.patch
@@ -0,0 +1,639 @@
+From 7499c16ca9e47899ff65070af57588a8f541f707 Mon Sep 17 00:00:00 2001
+From: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
+Date: Thu, 22 Oct 2015 23:30:04 +0300
+Subject: [PATCH 178/232] configfs: implement binary attributes
+
+ConfigFS lacked binary attributes up until now. This patch
+introduces support for binary attributes in a somewhat similar
+manner of sysfs binary attributes albeit with changes that
+fit the configfs usage model.
+
+Problems that configfs binary attributes fix are everything that
+requires a binary blob as part of the configuration of a resource,
+such as bitstream loading for FPGAs, DTBs for dynamically created
+devices etc.
+
+Look at Documentation/filesystems/configfs/configfs.txt for internals
+and howto use them.
+
+This patch is against linux-next as of today that contains
+Christoph's configfs rework.
+
+Signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
+[hch: folded a fix from Geert Uytterhoeven <geert+renesas@glider.be>]
+[hch: a few tiny updates based on review feedback]
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+---
+ Documentation/filesystems/configfs/configfs.txt | 57 +++++-
+ fs/configfs/configfs_internal.h | 14 +-
+ fs/configfs/dir.c | 18 +-
+ fs/configfs/file.c | 255 +++++++++++++++++++++++-
+ fs/configfs/inode.c | 2 +-
+ include/linux/configfs.h | 50 +++++
+ 6 files changed, 374 insertions(+), 22 deletions(-)
+
+--- a/Documentation/filesystems/configfs/configfs.txt
++++ b/Documentation/filesystems/configfs/configfs.txt
+@@ -51,15 +51,27 @@ configfs tree is always there, whether m
+ An item is created via mkdir(2). The item's attributes will also
+ appear at this time. readdir(3) can determine what the attributes are,
+ read(2) can query their default values, and write(2) can store new
+-values. Like sysfs, attributes should be ASCII text files, preferably
+-with only one value per file. The same efficiency caveats from sysfs
+-apply. Don't mix more than one attribute in one attribute file.
+-
+-Like sysfs, configfs expects write(2) to store the entire buffer at
+-once. When writing to configfs attributes, userspace processes should
+-first read the entire file, modify the portions they wish to change, and
+-then write the entire buffer back. Attribute files have a maximum size
+-of one page (PAGE_SIZE, 4096 on i386).
++values. Don't mix more than one attribute in one attribute file.
++
++There are two types of configfs attributes:
++
++* Normal attributes, which similar to sysfs attributes, are small ASCII text
++files, with a maximum size of one page (PAGE_SIZE, 4096 on i386). Preferably
++only one value per file should be used, and the same caveats from sysfs apply.
++Configfs expects write(2) to store the entire buffer at once. When writing to
++normal configfs attributes, userspace processes should first read the entire
++file, modify the portions they wish to change, and then write the entire
++buffer back.
++
++* Binary attributes, which are somewhat similar to sysfs binary attributes,
++but with a few slight changes to semantics. The PAGE_SIZE limitation does not
++apply, but the whole binary item must fit in single kernel vmalloc'ed buffer.
++The write(2) calls from user space are buffered, and the attributes'
++write_bin_attribute method will be invoked on the final close, therefore it is
++imperative for user-space to check the return code of close(2) in order to
++verify that the operation finished successfully.
++To avoid a malicious user OOMing the kernel, there's a per-binary attribute
++maximum buffer value.
+
+ When an item needs to be destroyed, remove it with rmdir(2). An
+ item cannot be destroyed if any other item has a link to it (via
+@@ -171,6 +183,7 @@ among other things. For that, it needs
+ struct configfs_item_operations *ct_item_ops;
+ struct configfs_group_operations *ct_group_ops;
+ struct configfs_attribute **ct_attrs;
++ struct configfs_bin_attribute **ct_bin_attrs;
+ };
+
+ The most basic function of a config_item_type is to define what
+@@ -201,6 +214,32 @@ be called whenever userspace asks for a
+ attribute is writable and provides a ->store method, that method will be
+ be called whenever userspace asks for a write(2) on the attribute.
+
++[struct configfs_bin_attribute]
++
++ struct configfs_attribute {
++ struct configfs_attribute cb_attr;
++ void *cb_private;
++ size_t cb_max_size;
++ };
++
++The binary attribute is used when the one needs to use binary blob to
++appear as the contents of a file in the item's configfs directory.
++To do so add the binary attribute to the NULL-terminated array
++config_item_type->ct_bin_attrs, and the item appears in configfs, the
++attribute file will appear with the configfs_bin_attribute->cb_attr.ca_name
++filename. configfs_bin_attribute->cb_attr.ca_mode specifies the file
++permissions.
++The cb_private member is provided for use by the driver, while the
++cb_max_size member specifies the maximum amount of vmalloc buffer
++to be used.
++
++If binary attribute is readable and the config_item provides a
++ct_item_ops->read_bin_attribute() method, that method will be called
++whenever userspace asks for a read(2) on the attribute. The converse
++will happen for write(2). The reads/writes are bufferred so only a
++single read/write will occur; the attributes' need not concern itself
++with it.
++
+ [struct config_group]
+
+ A config_item cannot live in a vacuum. The only way one can be created
+--- a/fs/configfs/configfs_internal.h
++++ b/fs/configfs/configfs_internal.h
+@@ -53,13 +53,14 @@ struct configfs_dirent {
+ #define CONFIGFS_ROOT 0x0001
+ #define CONFIGFS_DIR 0x0002
+ #define CONFIGFS_ITEM_ATTR 0x0004
++#define CONFIGFS_ITEM_BIN_ATTR 0x0008
+ #define CONFIGFS_ITEM_LINK 0x0020
+ #define CONFIGFS_USET_DIR 0x0040
+ #define CONFIGFS_USET_DEFAULT 0x0080
+ #define CONFIGFS_USET_DROPPING 0x0100
+ #define CONFIGFS_USET_IN_MKDIR 0x0200
+ #define CONFIGFS_USET_CREATING 0x0400
+-#define CONFIGFS_NOT_PINNED (CONFIGFS_ITEM_ATTR)
++#define CONFIGFS_NOT_PINNED (CONFIGFS_ITEM_ATTR | CONFIGFS_ITEM_BIN_ATTR)
+
+ extern struct mutex configfs_symlink_mutex;
+ extern spinlock_t configfs_dirent_lock;
+@@ -72,6 +73,8 @@ extern struct inode * configfs_new_inode
+ extern int configfs_create(struct dentry *, umode_t mode, void (*init)(struct inode *));
+
+ extern int configfs_create_file(struct config_item *, const struct configfs_attribute *);
++extern int configfs_create_bin_file(struct config_item *,
++ const struct configfs_bin_attribute *);
+ extern int configfs_make_dirent(struct configfs_dirent *,
+ struct dentry *, void *, umode_t, int);
+ extern int configfs_dirent_is_ready(struct configfs_dirent *);
+@@ -88,7 +91,7 @@ extern void configfs_release_fs(void);
+ extern struct rw_semaphore configfs_rename_sem;
+ extern const struct file_operations configfs_dir_operations;
+ extern const struct file_operations configfs_file_operations;
+-extern const struct file_operations bin_fops;
++extern const struct file_operations configfs_bin_file_operations;
+ extern const struct inode_operations configfs_dir_inode_operations;
+ extern const struct inode_operations configfs_root_inode_operations;
+ extern const struct inode_operations configfs_symlink_inode_operations;
+@@ -119,6 +122,13 @@ static inline struct configfs_attribute
+ return ((struct configfs_attribute *) sd->s_element);
+ }
+
++static inline struct configfs_bin_attribute *to_bin_attr(struct dentry *dentry)
++{
++ struct configfs_attribute *attr = to_attr(dentry);
++
++ return container_of(attr, struct configfs_bin_attribute, cb_attr);
++}
++
+ static inline struct config_item *configfs_get_config_item(struct dentry *dentry)
+ {
+ struct config_item * item = NULL;
+--- a/fs/configfs/dir.c
++++ b/fs/configfs/dir.c
+@@ -255,6 +255,12 @@ static void configfs_init_file(struct in
+ inode->i_fop = &configfs_file_operations;
+ }
+
++static void configfs_init_bin_file(struct inode *inode)
++{
++ inode->i_size = 0;
++ inode->i_fop = &configfs_bin_file_operations;
++}
++
+ static void init_symlink(struct inode * inode)
+ {
+ inode->i_op = &configfs_symlink_inode_operations;
+@@ -423,7 +429,9 @@ static int configfs_attach_attr(struct c
+ spin_unlock(&configfs_dirent_lock);
+
+ error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG,
+- configfs_init_file);
++ (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) ?
++ configfs_init_bin_file :
++ configfs_init_file);
+ if (error) {
+ configfs_put(sd);
+ return error;
+@@ -583,6 +591,7 @@ static int populate_attrs(struct config_
+ {
+ struct config_item_type *t = item->ci_type;
+ struct configfs_attribute *attr;
++ struct configfs_bin_attribute *bin_attr;
+ int error = 0;
+ int i;
+
+@@ -594,6 +603,13 @@ static int populate_attrs(struct config_
+ break;
+ }
+ }
++ if (t->ct_bin_attrs) {
++ for (i = 0; (bin_attr = t->ct_bin_attrs[i]) != NULL; i++) {
++ error = configfs_create_bin_file(item, bin_attr);
++ if (error)
++ break;
++ }
++ }
+
+ if (error)
+ detach_attrs(item);
+--- a/fs/configfs/file.c
++++ b/fs/configfs/file.c
+@@ -28,6 +28,7 @@
+ #include <linux/module.h>
+ #include <linux/slab.h>
+ #include <linux/mutex.h>
++#include <linux/vmalloc.h>
+ #include <asm/uaccess.h>
+
+ #include <linux/configfs.h>
+@@ -48,6 +49,10 @@ struct configfs_buffer {
+ struct configfs_item_operations * ops;
+ struct mutex mutex;
+ int needs_read_fill;
++ bool read_in_progress;
++ bool write_in_progress;
++ char *bin_buffer;
++ int bin_buffer_size;
+ };
+
+
+@@ -123,6 +128,87 @@ out:
+ return retval;
+ }
+
++/**
++ * configfs_read_bin_file - read a binary attribute.
++ * @file: file pointer.
++ * @buf: buffer to fill.
++ * @count: number of bytes to read.
++ * @ppos: starting offset in file.
++ *
++ * Userspace wants to read a binary attribute file. The attribute
++ * descriptor is in the file's ->d_fsdata. The target item is in the
++ * directory's ->d_fsdata.
++ *
++ * We check whether we need to refill the buffer. If so we will
++ * call the attributes' attr->read() twice. The first time we
++ * will pass a NULL as a buffer pointer, which the attributes' method
++ * will use to return the size of the buffer required. If no error
++ * occurs we will allocate the buffer using vmalloc and call
++ * attr->read() again passing that buffer as an argument.
++ * Then we just copy to user-space using simple_read_from_buffer.
++ */
++
++static ssize_t
++configfs_read_bin_file(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ struct configfs_buffer *buffer = file->private_data;
++ struct dentry *dentry = file->f_path.dentry;
++ struct config_item *item = to_item(dentry->d_parent);
++ struct configfs_bin_attribute *bin_attr = to_bin_attr(dentry);
++ ssize_t retval = 0;
++ ssize_t len = min_t(size_t, count, PAGE_SIZE);
++
++ mutex_lock(&buffer->mutex);
++
++ /* we don't support switching read/write modes */
++ if (buffer->write_in_progress) {
++ retval = -ETXTBSY;
++ goto out;
++ }
++ buffer->read_in_progress = 1;
++
++ if (buffer->needs_read_fill) {
++ /* perform first read with buf == NULL to get extent */
++ len = bin_attr->read(item, NULL, 0);
++ if (len <= 0) {
++ retval = len;
++ goto out;
++ }
++
++ /* do not exceed the maximum value */
++ if (bin_attr->cb_max_size && len > bin_attr->cb_max_size) {
++ retval = -EFBIG;
++ goto out;
++ }
++
++ buffer->bin_buffer = vmalloc(len);
++ if (buffer->bin_buffer == NULL) {
++ retval = -ENOMEM;
++ goto out;
++ }
++ buffer->bin_buffer_size = len;
++
++ /* perform second read to fill buffer */
++ len = bin_attr->read(item, buffer->bin_buffer, len);
++ if (len < 0) {
++ retval = len;
++ vfree(buffer->bin_buffer);
++ buffer->bin_buffer_size = 0;
++ buffer->bin_buffer = NULL;
++ goto out;
++ }
++
++ buffer->needs_read_fill = 0;
++ }
++
++ retval = simple_read_from_buffer(buf, count, ppos, buffer->bin_buffer,
++ buffer->bin_buffer_size);
++out:
++ mutex_unlock(&buffer->mutex);
++ return retval;
++}
++
+
+ /**
+ * fill_write_buffer - copy buffer from userspace.
+@@ -209,10 +295,80 @@ configfs_write_file(struct file *file, c
+ return len;
+ }
+
+-static int check_perm(struct inode * inode, struct file * file)
++/**
++ * configfs_write_bin_file - write a binary attribute.
++ * @file: file pointer
++ * @buf: data to write
++ * @count: number of bytes
++ * @ppos: starting offset
++ *
++ * Writing to a binary attribute file is similar to a normal read.
++ * We buffer the consecutive writes (binary attribute files do not
++ * support lseek) in a continuously growing buffer, but we don't
++ * commit until the close of the file.
++ */
++
++static ssize_t
++configfs_write_bin_file(struct file *file, const char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ struct configfs_buffer *buffer = file->private_data;
++ struct dentry *dentry = file->f_path.dentry;
++ struct configfs_bin_attribute *bin_attr = to_bin_attr(dentry);
++ void *tbuf = NULL;
++ ssize_t len;
++
++ mutex_lock(&buffer->mutex);
++
++ /* we don't support switching read/write modes */
++ if (buffer->read_in_progress) {
++ len = -ETXTBSY;
++ goto out;
++ }
++ buffer->write_in_progress = 1;
++
++ /* buffer grows? */
++ if (*ppos + count > buffer->bin_buffer_size) {
++
++ if (bin_attr->cb_max_size &&
++ *ppos + count > bin_attr->cb_max_size) {
++ len = -EFBIG;
++ }
++
++ tbuf = vmalloc(*ppos + count);
++ if (tbuf == NULL) {
++ len = -ENOMEM;
++ goto out;
++ }
++
++ /* copy old contents */
++ if (buffer->bin_buffer) {
++ memcpy(tbuf, buffer->bin_buffer,
++ buffer->bin_buffer_size);
++ vfree(buffer->bin_buffer);
++ }
++
++ /* clear the new area */
++ memset(tbuf + buffer->bin_buffer_size, 0,
++ *ppos + count - buffer->bin_buffer_size);
++ buffer->bin_buffer = tbuf;
++ buffer->bin_buffer_size = *ppos + count;
++ }
++
++ len = simple_write_to_buffer(buffer->bin_buffer,
++ buffer->bin_buffer_size, ppos, buf, count);
++ if (len > 0)
++ *ppos += len;
++out:
++ mutex_unlock(&buffer->mutex);
++ return len;
++}
++
++static int check_perm(struct inode * inode, struct file * file, int type)
+ {
+ struct config_item *item = configfs_get_config_item(file->f_path.dentry->d_parent);
+ struct configfs_attribute * attr = to_attr(file->f_path.dentry);
++ struct configfs_bin_attribute *bin_attr = NULL;
+ struct configfs_buffer * buffer;
+ struct configfs_item_operations * ops = NULL;
+ int error = 0;
+@@ -220,6 +376,9 @@ static int check_perm(struct inode * ino
+ if (!item || !attr)
+ goto Einval;
+
++ if (type & CONFIGFS_ITEM_BIN_ATTR)
++ bin_attr = to_bin_attr(file->f_path.dentry);
++
+ /* Grab the module reference for this attribute if we have one */
+ if (!try_module_get(attr->ca_owner)) {
+ error = -ENODEV;
+@@ -236,9 +395,14 @@ static int check_perm(struct inode * ino
+ * and we must have a store method.
+ */
+ if (file->f_mode & FMODE_WRITE) {
+- if (!(inode->i_mode & S_IWUGO) || !attr->store)
++ if (!(inode->i_mode & S_IWUGO))
+ goto Eaccess;
+
++ if ((type & CONFIGFS_ITEM_ATTR) && !attr->store)
++ goto Eaccess;
++
++ if ((type & CONFIGFS_ITEM_BIN_ATTR) && !bin_attr->write)
++ goto Eaccess;
+ }
+
+ /* File needs read support.
+@@ -246,7 +410,13 @@ static int check_perm(struct inode * ino
+ * must be a show method for it.
+ */
+ if (file->f_mode & FMODE_READ) {
+- if (!(inode->i_mode & S_IRUGO) || !attr->show)
++ if (!(inode->i_mode & S_IRUGO))
++ goto Eaccess;
++
++ if ((type & CONFIGFS_ITEM_ATTR) && !attr->show)
++ goto Eaccess;
++
++ if ((type & CONFIGFS_ITEM_BIN_ATTR) && !bin_attr->read)
+ goto Eaccess;
+ }
+
+@@ -260,6 +430,8 @@ static int check_perm(struct inode * ino
+ }
+ mutex_init(&buffer->mutex);
+ buffer->needs_read_fill = 1;
++ buffer->read_in_progress = 0;
++ buffer->write_in_progress = 0;
+ buffer->ops = ops;
+ file->private_data = buffer;
+ goto Done;
+@@ -277,12 +449,7 @@ static int check_perm(struct inode * ino
+ return error;
+ }
+
+-static int configfs_open_file(struct inode * inode, struct file * filp)
+-{
+- return check_perm(inode,filp);
+-}
+-
+-static int configfs_release(struct inode * inode, struct file * filp)
++static int configfs_release(struct inode *inode, struct file *filp)
+ {
+ struct config_item * item = to_item(filp->f_path.dentry->d_parent);
+ struct configfs_attribute * attr = to_attr(filp->f_path.dentry);
+@@ -303,6 +470,47 @@ static int configfs_release(struct inode
+ return 0;
+ }
+
++static int configfs_open_file(struct inode *inode, struct file *filp)
++{
++ return check_perm(inode, filp, CONFIGFS_ITEM_ATTR);
++}
++
++static int configfs_open_bin_file(struct inode *inode, struct file *filp)
++{
++ return check_perm(inode, filp, CONFIGFS_ITEM_BIN_ATTR);
++}
++
++static int configfs_release_bin_file(struct inode *inode, struct file *filp)
++{
++ struct configfs_buffer *buffer = filp->private_data;
++ struct dentry *dentry = filp->f_path.dentry;
++ struct config_item *item = to_item(dentry->d_parent);
++ struct configfs_bin_attribute *bin_attr = to_bin_attr(dentry);
++ ssize_t len = 0;
++ int ret;
++
++ buffer->read_in_progress = 0;
++
++ if (buffer->write_in_progress) {
++ buffer->write_in_progress = 0;
++
++ len = bin_attr->write(item, buffer->bin_buffer,
++ buffer->bin_buffer_size);
++
++ /* vfree on NULL is safe */
++ vfree(buffer->bin_buffer);
++ buffer->bin_buffer = NULL;
++ buffer->bin_buffer_size = 0;
++ buffer->needs_read_fill = 1;
++ }
++
++ ret = configfs_release(inode, filp);
++ if (len < 0)
++ return len;
++ return ret;
++}
++
++
+ const struct file_operations configfs_file_operations = {
+ .read = configfs_read_file,
+ .write = configfs_write_file,
+@@ -311,6 +519,14 @@ const struct file_operations configfs_fi
+ .release = configfs_release,
+ };
+
++const struct file_operations configfs_bin_file_operations = {
++ .read = configfs_read_bin_file,
++ .write = configfs_write_bin_file,
++ .llseek = NULL, /* bin file is not seekable */
++ .open = configfs_open_bin_file,
++ .release = configfs_release_bin_file,
++};
++
+ /**
+ * configfs_create_file - create an attribute file for an item.
+ * @item: item we're creating for.
+@@ -332,3 +548,24 @@ int configfs_create_file(struct config_i
+ return error;
+ }
+
++/**
++ * configfs_create_bin_file - create a binary attribute file for an item.
++ * @item: item we're creating for.
++ * @attr: atrribute descriptor.
++ */
++
++int configfs_create_bin_file(struct config_item *item,
++ const struct configfs_bin_attribute *bin_attr)
++{
++ struct dentry *dir = item->ci_dentry;
++ struct configfs_dirent *parent_sd = dir->d_fsdata;
++ umode_t mode = (bin_attr->cb_attr.ca_mode & S_IALLUGO) | S_IFREG;
++ int error = 0;
++
++ mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_NORMAL);
++ error = configfs_make_dirent(parent_sd, NULL, (void *) bin_attr, mode,
++ CONFIGFS_ITEM_BIN_ATTR);
++ mutex_unlock(&dir->d_inode->i_mutex);
++
++ return error;
++}
+--- a/fs/configfs/inode.c
++++ b/fs/configfs/inode.c
+@@ -218,7 +218,7 @@ const unsigned char * configfs_get_name(
+ if (sd->s_type & (CONFIGFS_DIR | CONFIGFS_ITEM_LINK))
+ return sd->s_dentry->d_name.name;
+
+- if (sd->s_type & CONFIGFS_ITEM_ATTR) {
++ if (sd->s_type & (CONFIGFS_ITEM_ATTR | CONFIGFS_ITEM_BIN_ATTR)) {
+ attr = sd->s_element;
+ return attr->ca_name;
+ }
+--- a/include/linux/configfs.h
++++ b/include/linux/configfs.h
+@@ -51,6 +51,7 @@ struct module;
+ struct configfs_item_operations;
+ struct configfs_group_operations;
+ struct configfs_attribute;
++struct configfs_bin_attribute;
+ struct configfs_subsystem;
+
+ struct config_item {
+@@ -84,6 +85,7 @@ struct config_item_type {
+ struct configfs_item_operations *ct_item_ops;
+ struct configfs_group_operations *ct_group_ops;
+ struct configfs_attribute **ct_attrs;
++ struct configfs_bin_attribute **ct_bin_attrs;
+ };
+
+ /**
+@@ -154,6 +156,54 @@ static struct configfs_attribute _pfx##a
+ .store = _pfx##_name##_store, \
+ }
+
++struct file;
++struct vm_area_struct;
++
++struct configfs_bin_attribute {
++ struct configfs_attribute cb_attr; /* std. attribute */
++ void *cb_private; /* for user */
++ size_t cb_max_size; /* max core size */
++ ssize_t (*read)(struct config_item *, void *, size_t);
++ ssize_t (*write)(struct config_item *, const void *, size_t);
++};
++
++#define CONFIGFS_BIN_ATTR(_pfx, _name, _priv, _maxsz) \
++static struct configfs_bin_attribute _pfx##attr_##_name = { \
++ .cb_attr = { \
++ .ca_name = __stringify(_name), \
++ .ca_mode = S_IRUGO | S_IWUSR, \
++ .ca_owner = THIS_MODULE, \
++ }, \
++ .cb_private = _priv, \
++ .cb_max_size = _maxsz, \
++ .read = _pfx##_name##_read, \
++ .write = _pfx##_name##_write, \
++}
++
++#define CONFIGFS_BIN_ATTR_RO(_pfx, _name, _priv, _maxsz) \
++static struct configfs_attribute _pfx##attr_##_name = { \
++ .cb_attr = { \
++ .ca_name = __stringify(_name), \
++ .ca_mode = S_IRUGO, \
++ .ca_owner = THIS_MODULE, \
++ }, \
++ .cb_private = _priv, \
++ .cb_max_size = _maxsz, \
++ .read = _pfx##_name##_read, \
++}
++
++#define CONFIGFS_BIN_ATTR_WO(_pfx, _name, _priv, _maxsz) \
++static struct configfs_attribute _pfx##attr_##_name = { \
++ .cb_attr = { \
++ .ca_name = __stringify(_name), \
++ .ca_mode = S_IWUSR, \
++ .ca_owner = THIS_MODULE, \
++ }, \
++ .cb_private = _priv, \
++ .cb_max_size = _maxsz, \
++ .write = _pfx##_name##_write, \
++}
++
+ /*
+ * If allow_link() exists, the item can symlink(2) out to other
+ * items. If the item is a group, it may support mkdir(2).
diff --git a/target/linux/brcm2708/patches-4.4/0179-OF-DT-Overlay-configfs-interface.patch b/target/linux/brcm2708/patches-4.4/0179-OF-DT-Overlay-configfs-interface.patch
new file mode 100644
index 0000000000..cb7eadb622
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0179-OF-DT-Overlay-configfs-interface.patch
@@ -0,0 +1,408 @@
+From 54ca6e08ce89f5e33de78db7deff727c12513397 Mon Sep 17 00:00:00 2001
+From: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
+Date: Wed, 3 Dec 2014 13:23:28 +0200
+Subject: [PATCH 179/232] OF: DT-Overlay configfs interface
+
+This is a port of Pantelis Antoniou's v3 port that makes use of the
+new upstreamed configfs support for binary attributes.
+
+Original commit message:
+
+Add a runtime interface to using configfs for generic device tree overlay
+usage. With it its possible to use device tree overlays without having
+to use a per-platform overlay manager.
+
+Please see Documentation/devicetree/configfs-overlays.txt for more info.
+
+Changes since v2:
+- Removed ifdef CONFIG_OF_OVERLAY (since for now it's required)
+- Created a documentation entry
+- Slight rewording in Kconfig
+
+Changes since v1:
+- of_resolve() -> of_resolve_phandles().
+
+Originally-signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ Documentation/devicetree/configfs-overlays.txt | 31 +++
+ drivers/of/Kconfig | 7 +
+ drivers/of/Makefile | 1 +
+ drivers/of/configfs.c | 314 +++++++++++++++++++++++++
+ 4 files changed, 353 insertions(+)
+ create mode 100644 Documentation/devicetree/configfs-overlays.txt
+ create mode 100644 drivers/of/configfs.c
+
+--- /dev/null
++++ b/Documentation/devicetree/configfs-overlays.txt
+@@ -0,0 +1,31 @@
++Howto use the configfs overlay interface.
++
++A device-tree configfs entry is created in /config/device-tree/overlays
++and and it is manipulated using standard file system I/O.
++Note that this is a debug level interface, for use by developers and
++not necessarily something accessed by normal users due to the
++security implications of having direct access to the kernel's device tree.
++
++* To create an overlay you mkdir the directory:
++
++ # mkdir /config/device-tree/overlays/foo
++
++* Either you echo the overlay firmware file to the path property file.
++
++ # echo foo.dtbo >/config/device-tree/overlays/foo/path
++
++* Or you cat the contents of the overlay to the dtbo file
++
++ # cat foo.dtbo >/config/device-tree/overlays/foo/dtbo
++
++The overlay file will be applied, and devices will be created/destroyed
++as required.
++
++To remove it simply rmdir the directory.
++
++ # rmdir /config/device-tree/overlays/foo
++
++The rationalle of the dual interface (firmware & direct copy) is that each is
++better suited to different use patterns. The firmware interface is what's
++intended to be used by hardware managers in the kernel, while the copy interface
++make sense for developers (since it avoids problems with namespaces).
+--- a/drivers/of/Kconfig
++++ b/drivers/of/Kconfig
+@@ -112,4 +112,11 @@ config OF_OVERLAY
+ While this option is selected automatically when needed, you can
+ enable it manually to improve device tree unit test coverage.
+
++config OF_CONFIGFS
++ bool "Device Tree Overlay ConfigFS interface"
++ select CONFIGFS_FS
++ select OF_OVERLAY
++ help
++ Enable a simple user-space driven DT overlay interface.
++
+ endif # OF
+--- a/drivers/of/Makefile
++++ b/drivers/of/Makefile
+@@ -1,4 +1,5 @@
+ obj-y = base.o device.o platform.o
++obj-$(CONFIG_OF_CONFIGFS) += configfs.o
+ obj-$(CONFIG_OF_DYNAMIC) += dynamic.o
+ obj-$(CONFIG_OF_FLATTREE) += fdt.o
+ obj-$(CONFIG_OF_EARLY_FLATTREE) += fdt_address.o
+--- /dev/null
++++ b/drivers/of/configfs.c
+@@ -0,0 +1,314 @@
++/*
++ * Configfs entries for device-tree
++ *
++ * Copyright (C) 2013 - Pantelis Antoniou <panto@antoniou-consulting.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ */
++#include <linux/ctype.h>
++#include <linux/cpu.h>
++#include <linux/module.h>
++#include <linux/of.h>
++#include <linux/of_fdt.h>
++#include <linux/spinlock.h>
++#include <linux/slab.h>
++#include <linux/proc_fs.h>
++#include <linux/configfs.h>
++#include <linux/types.h>
++#include <linux/stat.h>
++#include <linux/limits.h>
++#include <linux/file.h>
++#include <linux/vmalloc.h>
++#include <linux/firmware.h>
++
++#include "of_private.h"
++
++struct cfs_overlay_item {
++ struct config_item item;
++
++ char path[PATH_MAX];
++
++ const struct firmware *fw;
++ struct device_node *overlay;
++ int ov_id;
++
++ void *dtbo;
++ int dtbo_size;
++};
++
++static int create_overlay(struct cfs_overlay_item *overlay, void *blob)
++{
++ int err;
++
++ /* unflatten the tree */
++ of_fdt_unflatten_tree(blob, &overlay->overlay);
++ if (overlay->overlay == NULL) {
++ pr_err("%s: failed to unflatten tree\n", __func__);
++ err = -EINVAL;
++ goto out_err;
++ }
++ pr_debug("%s: unflattened OK\n", __func__);
++
++ /* mark it as detached */
++ of_node_set_flag(overlay->overlay, OF_DETACHED);
++
++ /* perform resolution */
++ err = of_resolve_phandles(overlay->overlay);
++ if (err != 0) {
++ pr_err("%s: Failed to resolve tree\n", __func__);
++ goto out_err;
++ }
++ pr_debug("%s: resolved OK\n", __func__);
++
++ err = of_overlay_create(overlay->overlay);
++ if (err < 0) {
++ pr_err("%s: Failed to create overlay (err=%d)\n",
++ __func__, err);
++ goto out_err;
++ }
++ overlay->ov_id = err;
++
++out_err:
++ return err;
++}
++
++static inline struct cfs_overlay_item *to_cfs_overlay_item(
++ struct config_item *item)
++{
++ return item ? container_of(item, struct cfs_overlay_item, item) : NULL;
++}
++
++static ssize_t cfs_overlay_item_path_show(struct config_item *item,
++ char *page)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++ return sprintf(page, "%s\n", overlay->path);
++}
++
++static ssize_t cfs_overlay_item_path_store(struct config_item *item,
++ const char *page, size_t count)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++ const char *p = page;
++ char *s;
++ int err;
++
++ /* if it's set do not allow changes */
++ if (overlay->path[0] != '\0' || overlay->dtbo_size > 0)
++ return -EPERM;
++
++ /* copy to path buffer (and make sure it's always zero terminated */
++ count = snprintf(overlay->path, sizeof(overlay->path) - 1, "%s", p);
++ overlay->path[sizeof(overlay->path) - 1] = '\0';
++
++ /* strip trailing newlines */
++ s = overlay->path + strlen(overlay->path);
++ while (s > overlay->path && *--s == '\n')
++ *s = '\0';
++
++ pr_debug("%s: path is '%s'\n", __func__, overlay->path);
++
++ err = request_firmware(&overlay->fw, overlay->path, NULL);
++ if (err != 0)
++ goto out_err;
++
++ err = create_overlay(overlay, (void *)overlay->fw->data);
++ if (err != 0)
++ goto out_err;
++
++ return count;
++
++out_err:
++
++ release_firmware(overlay->fw);
++ overlay->fw = NULL;
++
++ overlay->path[0] = '\0';
++ return err;
++}
++
++static ssize_t cfs_overlay_item_status_show(struct config_item *item,
++ char *page)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++
++ return sprintf(page, "%s\n",
++ overlay->ov_id >= 0 ? "applied" : "unapplied");
++}
++
++CONFIGFS_ATTR(cfs_overlay_item_, path);
++CONFIGFS_ATTR_RO(cfs_overlay_item_, status);
++
++static struct configfs_attribute *cfs_overlay_attrs[] = {
++ &cfs_overlay_item_attr_path,
++ &cfs_overlay_item_attr_status,
++ NULL,
++};
++
++ssize_t cfs_overlay_item_dtbo_read(struct config_item *item,
++ void *buf, size_t max_count)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++
++ pr_debug("%s: buf=%p max_count=%u\n", __func__,
++ buf, max_count);
++
++ if (overlay->dtbo == NULL)
++ return 0;
++
++ /* copy if buffer provided */
++ if (buf != NULL) {
++ /* the buffer must be large enough */
++ if (overlay->dtbo_size > max_count)
++ return -ENOSPC;
++
++ memcpy(buf, overlay->dtbo, overlay->dtbo_size);
++ }
++
++ return overlay->dtbo_size;
++}
++
++ssize_t cfs_overlay_item_dtbo_write(struct config_item *item,
++ const void *buf, size_t count)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++ int err;
++
++ /* if it's set do not allow changes */
++ if (overlay->path[0] != '\0' || overlay->dtbo_size > 0)
++ return -EPERM;
++
++ /* copy the contents */
++ overlay->dtbo = kmemdup(buf, count, GFP_KERNEL);
++ if (overlay->dtbo == NULL)
++ return -ENOMEM;
++
++ overlay->dtbo_size = count;
++
++ err = create_overlay(overlay, overlay->dtbo);
++ if (err != 0)
++ goto out_err;
++
++ return count;
++
++out_err:
++ kfree(overlay->dtbo);
++ overlay->dtbo = NULL;
++ overlay->dtbo_size = 0;
++
++ return err;
++}
++
++CONFIGFS_BIN_ATTR(cfs_overlay_item_, dtbo, NULL, SZ_1M);
++
++static struct configfs_bin_attribute *cfs_overlay_bin_attrs[] = {
++ &cfs_overlay_item_attr_dtbo,
++ NULL,
++};
++
++static void cfs_overlay_release(struct config_item *item)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++
++ if (overlay->ov_id >= 0)
++ of_overlay_destroy(overlay->ov_id);
++ if (overlay->fw)
++ release_firmware(overlay->fw);
++ /* kfree with NULL is safe */
++ kfree(overlay->dtbo);
++ kfree(overlay);
++}
++
++static struct configfs_item_operations cfs_overlay_item_ops = {
++ .release = cfs_overlay_release,
++};
++
++static struct config_item_type cfs_overlay_type = {
++ .ct_item_ops = &cfs_overlay_item_ops,
++ .ct_attrs = cfs_overlay_attrs,
++ .ct_bin_attrs = cfs_overlay_bin_attrs,
++ .ct_owner = THIS_MODULE,
++};
++
++static struct config_item *cfs_overlay_group_make_item(
++ struct config_group *group, const char *name)
++{
++ struct cfs_overlay_item *overlay;
++
++ overlay = kzalloc(sizeof(*overlay), GFP_KERNEL);
++ if (!overlay)
++ return ERR_PTR(-ENOMEM);
++ overlay->ov_id = -1;
++
++ config_item_init_type_name(&overlay->item, name, &cfs_overlay_type);
++ return &overlay->item;
++}
++
++static void cfs_overlay_group_drop_item(struct config_group *group,
++ struct config_item *item)
++{
++ struct cfs_overlay_item *overlay = to_cfs_overlay_item(item);
++
++ config_item_put(&overlay->item);
++}
++
++static struct configfs_group_operations overlays_ops = {
++ .make_item = cfs_overlay_group_make_item,
++ .drop_item = cfs_overlay_group_drop_item,
++};
++
++static struct config_item_type overlays_type = {
++ .ct_group_ops = &overlays_ops,
++ .ct_owner = THIS_MODULE,
++};
++
++static struct configfs_group_operations of_cfs_ops = {
++ /* empty - we don't allow anything to be created */
++};
++
++static struct config_item_type of_cfs_type = {
++ .ct_group_ops = &of_cfs_ops,
++ .ct_owner = THIS_MODULE,
++};
++
++struct config_group of_cfs_overlay_group;
++
++struct config_group *of_cfs_def_groups[] = {
++ &of_cfs_overlay_group,
++ NULL
++};
++
++static struct configfs_subsystem of_cfs_subsys = {
++ .su_group = {
++ .cg_item = {
++ .ci_namebuf = "device-tree",
++ .ci_type = &of_cfs_type,
++ },
++ .default_groups = of_cfs_def_groups,
++ },
++ .su_mutex = __MUTEX_INITIALIZER(of_cfs_subsys.su_mutex),
++};
++
++static int __init of_cfs_init(void)
++{
++ int ret;
++
++ pr_info("%s\n", __func__);
++
++ config_group_init(&of_cfs_subsys.su_group);
++ config_group_init_type_name(&of_cfs_overlay_group, "overlays",
++ &overlays_type);
++
++ ret = configfs_register_subsystem(&of_cfs_subsys);
++ if (ret != 0) {
++ pr_err("%s: failed to register subsys\n", __func__);
++ goto out;
++ }
++ pr_info("%s: OK\n", __func__);
++out:
++ return ret;
++}
++late_initcall(of_cfs_init);
diff --git a/target/linux/brcm2708/patches-4.4/0180-Protect-__release_resource-against-resources-without.patch b/target/linux/brcm2708/patches-4.4/0180-Protect-__release_resource-against-resources-without.patch
new file mode 100644
index 0000000000..936cd00cb8
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0180-Protect-__release_resource-against-resources-without.patch
@@ -0,0 +1,28 @@
+From c841449374b2acd024ae8971bbd2474c6ba27309 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 13 Mar 2015 12:43:36 +0000
+Subject: [PATCH 180/232] Protect __release_resource against resources without
+ parents
+
+Without this patch, removing a device tree overlay can crash here.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ kernel/resource.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/kernel/resource.c
++++ b/kernel/resource.c
+@@ -237,6 +237,12 @@ static int __release_resource(struct res
+ {
+ struct resource *tmp, **p;
+
++ if (!old->parent) {
++ WARN(old->sibling, "sibling but no parent");
++ if (old->sibling)
++ return -EINVAL;
++ return 0;
++ }
+ p = &old->parent->child;
+ for (;;) {
+ tmp = *p;
diff --git a/target/linux/brcm2708/patches-4.4/0181-BCM270X_DT-Add-a-.dtbo-target-use-for-overlays.patch b/target/linux/brcm2708/patches-4.4/0181-BCM270X_DT-Add-a-.dtbo-target-use-for-overlays.patch
new file mode 100644
index 0000000000..e60c266250
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0181-BCM270X_DT-Add-a-.dtbo-target-use-for-overlays.patch
@@ -0,0 +1,193 @@
+From 420e1b8c5cec3bbccd4c260ff836a71e54df084e Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 13 Mar 2015 20:00:21 +0000
+Subject: [PATCH 181/232] BCM270X_DT: Add a .dtbo target, use for overlays
+
+Change the filenames and extensions to keep the pre-DDT style of
+overlay (<name>-overlay.dtb) distinct from new ones that use a
+different style of local fixups (<name>.dtbo), and to match other
+platforms.
+
+The RPi firmware uses the DDTK trailer atom to choose which type of
+overlay to use for each kernel.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/.gitignore | 2 +-
+ arch/arm/boot/dts/overlays/Makefile | 135 +++++++++++++++++-------------------
+ scripts/Makefile.lib | 10 +++
+ 3 files changed, 76 insertions(+), 71 deletions(-)
+
+--- a/arch/arm/boot/.gitignore
++++ b/arch/arm/boot/.gitignore
+@@ -3,4 +3,4 @@ zImage
+ xipImage
+ bootpImage
+ uImage
+-*.dtb
++*.dtb*
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -12,78 +12,73 @@ ifeq ($(CONFIG_ARCH_BCM2835),y)
+ RPI_DT_OVERLAYS=y
+ endif
+
+-dtb-$(RPI_DT_OVERLAYS) += ads7846-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += at86rf233-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += dwc2-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += dwc-otg-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += dht11-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += enc28j60-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += gpio-ir-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += gpio-poweroff-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += hifiberry-amp-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += hifiberry-dac-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += hifiberry-dacplus-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += hifiberry-digi-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += hy28a-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += hy28b-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += i2c-rtc-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += i2c-gpio-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += i2c0-bcm2708-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += i2c1-bcm2708-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += i2s-mmap-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += iqaudio-dac-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += iqaudio-dacplus-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += lirc-rpi-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += mcp2515-can0-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += mcp2515-can1-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += mmc-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += mz61581-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pi3-disable-bt-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pi3-miniuart-bt-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += piscreen-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += piscreen2r-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pitft28-capacitive-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pitft28-resistive-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pps-gpio-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pwm-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += pwm-2chan-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += raspidac3-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += rpi-backlight-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += rpi-dac-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += rpi-display-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += rpi-ft5406-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += rpi-proto-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += rpi-sense-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += sdhost-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += sdio-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += sdtweak-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += smi-dev-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += smi-nand-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += smi-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi1-1cs-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi1-2cs-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi1-3cs-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi2-1cs-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi2-2cs-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi2-3cs-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += spi-gpio35-39-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += tinylcd35-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += uart1-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += vc4-kms-v3d-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += vga666-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += w1-gpio-overlay.dtb
+-dtb-$(RPI_DT_OVERLAYS) += w1-gpio-pullup-overlay.dtb
++dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += enc28j60.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += gpio-ir.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += gpio-poweroff.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += hifiberry-amp.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += hifiberry-dac.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += hifiberry-dacplus.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += hifiberry-digi.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += hy28a.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += hy28b.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2c-rtc.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2c-gpio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2c0-bcm2708.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2c1-bcm2708.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2s-mmap.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += iqaudio-dac.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += iqaudio-dacplus.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += mmc.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += mz61581.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pi3-disable-bt.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pi3-miniuart-bt.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += piscreen.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += piscreen2r.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pitft28-capacitive.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pitft28-resistive.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pps-gpio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pwm.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pwm-2chan.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += raspidac3.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += rpi-backlight.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += rpi-dac.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += rpi-display.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += rpi-ft5406.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += rpi-proto.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += rpi-sense.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += sdtweak.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += smi-dev.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += smi-nand.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += smi.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi1-1cs.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi1-2cs.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi1-3cs.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi2-1cs.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi2-2cs.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi2-3cs.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi-gpio35-39.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += tinylcd35.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += uart1.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += vc4-kms-v3d.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += vga666.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += w1-gpio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += w1-gpio-pullup.dtbo
+
+ targets += dtbs dtbs_install
+-targets += $(dtb-y)
++targets += $(dtbo-y)
+
+ endif
+
+-always := $(dtb-y)
+-clean-files := *.dtb
+-
+-# Enable fixups to support overlays on BCM2708 platforms
+-ifeq ($(RPI_DT_OVERLAYS),y)
+- DTC_FLAGS ?= -@
+-endif
++always := $(dtbo-y)
++clean-files := *.dtbo
+--- a/scripts/Makefile.lib
++++ b/scripts/Makefile.lib
+@@ -292,6 +292,16 @@ cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
+ $(obj)/%.dtb: $(src)/%.dts FORCE
+ $(call if_changed_dep,dtc)
+
++quiet_cmd_dtco = DTCO $@
++cmd_dtco = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
++ $(objtree)/scripts/dtc/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)/%-overlay.dts FORCE
++ $(call if_changed_dep,dtco)
++
+ dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
+
+ # Bzip2
diff --git a/target/linux/brcm2708/patches-4.4/0182-scripts-knlinfo-Decode-DDTK-atom.patch b/target/linux/brcm2708/patches-4.4/0182-scripts-knlinfo-Decode-DDTK-atom.patch
new file mode 100644
index 0000000000..13a223b07d
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0182-scripts-knlinfo-Decode-DDTK-atom.patch
@@ -0,0 +1,31 @@
+From e56b2ead4021e94eb15f8dd7240c607fe61ce57f Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 29 May 2015 11:18:58 +0100
+Subject: [PATCH 182/232] scripts/knlinfo: Decode DDTK atom
+
+Show the DDTK atom as being a boolean.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ scripts/knlinfo | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/scripts/knlinfo
++++ b/scripts/knlinfo
+@@ -16,6 +16,7 @@ my $trailer_magic = 'RPTL';
+
+ my %atom_formats =
+ (
++ 'DDTK' => \&format_bool,
+ 'DTOK' => \&format_bool,
+ 'KVer' => \&format_string,
+ '270X' => \&format_bool,
+@@ -148,7 +149,7 @@ sub format_atom
+ sub format_bool
+ {
+ my ($data) = @_;
+- return unpack('V', $data) ? 'true' : 'false';
++ return unpack('V', $data) ? 'y' : 'n';
+ }
+
+ sub format_int
diff --git a/target/linux/brcm2708/patches-4.4/0183-Enable-Dynamic-Device-Tree-for-bcmrpi_defconfig-and-.patch b/target/linux/brcm2708/patches-4.4/0183-Enable-Dynamic-Device-Tree-for-bcmrpi_defconfig-and-.patch
new file mode 100644
index 0000000000..694b1f7b25
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0183-Enable-Dynamic-Device-Tree-for-bcmrpi_defconfig-and-.patch
@@ -0,0 +1,40 @@
+From aa7d45428dba9267190fa17a424db693628856f6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 29 May 2015 11:48:59 +0100
+Subject: [PATCH 183/232] Enable Dynamic Device Tree for bcmrpi_defconfig and
+ bcm2709_defconfig
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/configs/bcm2709_defconfig | 2 +-
+ arch/arm/configs/bcmrpi_defconfig | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -403,6 +403,7 @@ CONFIG_MTD=m
+ CONFIG_MTD_BLOCK=m
+ CONFIG_MTD_NAND=m
+ CONFIG_MTD_UBI=m
++CONFIG_OF_CONFIGFS=y
+ CONFIG_ZRAM=m
+ CONFIG_ZRAM_LZ4_COMPRESS=y
+ CONFIG_BLK_DEV_LOOP=y
+@@ -1161,7 +1162,6 @@ CONFIG_NTFS_FS=m
+ CONFIG_NTFS_RW=y
+ CONFIG_TMPFS=y
+ CONFIG_TMPFS_POSIX_ACL=y
+-CONFIG_CONFIGFS_FS=y
+ CONFIG_ECRYPT_FS=m
+ CONFIG_HFS_FS=m
+ CONFIG_HFSPLUS_FS=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -396,6 +396,7 @@ CONFIG_MTD=m
+ CONFIG_MTD_BLOCK=m
+ CONFIG_MTD_NAND=m
+ CONFIG_MTD_UBI=m
++CONFIG_OF_OVERLAY=y
+ CONFIG_ZRAM=m
+ CONFIG_ZRAM_LZ4_COMPRESS=y
+ CONFIG_BLK_DEV_LOOP=y
diff --git a/target/linux/brcm2708/patches-4.4/0184-SQUASH-Add-CONFIG_OF_CONFIGFS-to-bcmrpi_defconfig.patch b/target/linux/brcm2708/patches-4.4/0184-SQUASH-Add-CONFIG_OF_CONFIGFS-to-bcmrpi_defconfig.patch
new file mode 100644
index 0000000000..21d8e0de6a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0184-SQUASH-Add-CONFIG_OF_CONFIGFS-to-bcmrpi_defconfig.patch
@@ -0,0 +1,29 @@
+From 293a0e05a554b39c3d3587f0631c495485ec903b Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Sun, 13 Mar 2016 16:14:44 +0000
+Subject: [PATCH 184/232] SQUASH: Add CONFIG_OF_CONFIGFS to bcmrpi_defconfig
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/configs/bcmrpi_defconfig | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -396,7 +396,7 @@ CONFIG_MTD=m
+ CONFIG_MTD_BLOCK=m
+ CONFIG_MTD_NAND=m
+ CONFIG_MTD_UBI=m
+-CONFIG_OF_OVERLAY=y
++CONFIG_OF_CONFIGFS=y
+ CONFIG_ZRAM=m
+ CONFIG_ZRAM_LZ4_COMPRESS=y
+ CONFIG_BLK_DEV_LOOP=y
+@@ -1169,7 +1169,6 @@ CONFIG_NTFS_FS=m
+ CONFIG_NTFS_RW=y
+ CONFIG_TMPFS=y
+ CONFIG_TMPFS_POSIX_ACL=y
+-CONFIG_CONFIGFS_FS=y
+ CONFIG_ECRYPT_FS=m
+ CONFIG_HFS_FS=m
+ CONFIG_HFSPLUS_FS=m
diff --git a/target/linux/brcm2708/patches-4.4/0185-dts-kbuild-dtbs_install-installs-.dtbo-files-too.patch b/target/linux/brcm2708/patches-4.4/0185-dts-kbuild-dtbs_install-installs-.dtbo-files-too.patch
new file mode 100644
index 0000000000..b87aab5aec
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0185-dts-kbuild-dtbs_install-installs-.dtbo-files-too.patch
@@ -0,0 +1,42 @@
+From e948b371fbb724b7d715dee41c0db5ef5a028a13 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 14 Mar 2016 16:56:54 +0000
+Subject: [PATCH 185/232] dts, kbuild: dtbs_install installs .dtbo files too
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ scripts/Makefile.dtbinst | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+--- a/scripts/Makefile.dtbinst
++++ b/scripts/Makefile.dtbinst
+@@ -29,6 +29,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
+@@ -37,15 +38,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/target/linux/brcm2708/patches-4.4/0186-bcm2835-sdhost-Workaround-for-slow-sectors.patch b/target/linux/brcm2708/patches-4.4/0186-bcm2835-sdhost-Workaround-for-slow-sectors.patch
new file mode 100644
index 0000000000..26f64a1811
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0186-bcm2835-sdhost-Workaround-for-slow-sectors.patch
@@ -0,0 +1,118 @@
+From c215c0d855343400b53ae2ec8b015a3f4a3eb27e Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 15 Mar 2016 14:10:29 +0000
+Subject: [PATCH 186/232] bcm2835-sdhost: Workaround for "slow" sectors
+
+Some cards have been seen to cause timeouts after certain sectors are
+read. This workaround enforces a minimum delay between the stop after
+reading one of those sectors and a subsequent data command.
+
+Using CMD23 (SET_BLOCK_COUNT) avoids this problem, so good cards will
+not be penalised by this workaround.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/host/bcm2835-sdhost.c | 50 +++++++++++++++++++++++++++++++++++----
+ 1 file changed, 46 insertions(+), 4 deletions(-)
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -202,9 +202,12 @@ struct bcm2835_host {
+ int max_delay; /* maximum length of time spent waiting */
+ struct timeval stop_time; /* when the last stop was issued */
+ u32 delay_after_stop; /* minimum time between stop and subsequent data transfer */
++ u32 delay_after_this_stop; /* minimum time between this stop and subsequent data transfer */
+ u32 overclock_50; /* frequency to use when 50MHz is requested (in MHz) */
+ u32 overclock; /* Current frequency if overclocked, else zero */
+ u32 pio_limit; /* Maximum block count for PIO (0 = always DMA) */
++
++ u32 sectors; /* Cached card size in sectors */
+ };
+
+ #if ENABLE_LOG
+@@ -425,6 +428,7 @@ static void bcm2835_sdhost_reset_interna
+ bcm2835_sdhost_set_power(host, true);
+ mdelay(10);
+ host->clock = 0;
++ host->sectors = 0;
+ bcm2835_sdhost_write(host, host->hcfg, SDHCFG);
+ bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
+ mmiowb();
+@@ -880,6 +884,24 @@ static void bcm2835_sdhost_prepare_data(
+ host->flush_fifo = 0;
+ host->data->bytes_xfered = 0;
+
++ if (!host->sectors && host->mmc->card) {
++ struct mmc_card *card = host->mmc->card;
++ if (!mmc_card_sd(card) && mmc_card_blockaddr(card)) {
++ /*
++ * The EXT_CSD sector count is in number of 512 byte
++ * sectors.
++ */
++ host->sectors = card->ext_csd.sectors;
++ } else {
++ /*
++ * The CSD capacity field is in units of read_blkbits.
++ * set_capacity takes units of 512 bytes.
++ */
++ host->sectors = card->csd.capacity <<
++ (card->csd.read_blkbits - 9);
++ }
++ }
++
+ if (!host->dma_desc) {
+ /* Use PIO */
+ int flags = SG_MITER_ATOMIC;
+@@ -989,7 +1011,7 @@ bool bcm2835_sdhost_send_command(struct
+
+ if (cmd->data) {
+ log_event("CMDD", cmd->data->blocks, cmd->data->blksz);
+- if (host->delay_after_stop) {
++ if (host->delay_after_this_stop) {
+ struct timeval now;
+ int time_since_stop;
+ do_gettimeofday(&now);
+@@ -998,12 +1020,32 @@ bool bcm2835_sdhost_send_command(struct
+ /* Possibly less than one second */
+ time_since_stop = time_since_stop * 1000000 +
+ (now.tv_usec - host->stop_time.tv_usec);
+- if (time_since_stop < host->delay_after_stop)
+- udelay(host->delay_after_stop -
++ if (time_since_stop <
++ host->delay_after_this_stop)
++ udelay(host->delay_after_this_stop -
+ time_since_stop);
+ }
+ }
+
++ host->delay_after_this_stop = host->delay_after_stop;
++ if ((cmd->data->flags & MMC_DATA_READ) && !host->use_sbc) {
++ /* See if read crosses one of the hazardous sectors */
++ u32 first_blk, last_blk;
++
++ /* Intentionally include the following sector because
++ without CMD23/SBC the read may run on. */
++ first_blk = host->mrq->cmd->arg;
++ last_blk = first_blk + cmd->data->blocks;
++
++ if (((last_blk >= (host->sectors - 64)) &&
++ (first_blk <= (host->sectors - 64))) ||
++ ((last_blk >= (host->sectors - 32)) &&
++ (first_blk <= (host->sectors - 32)))) {
++ host->delay_after_this_stop =
++ max(250u, host->delay_after_stop);
++ }
++ }
++
+ if (cmd->data->flags & MMC_DATA_WRITE)
+ sdcmd |= SDCMD_WRITE_CMD;
+ if (cmd->data->flags & MMC_DATA_READ)
+@@ -1078,7 +1120,7 @@ static void bcm2835_sdhost_transfer_comp
+ if (!host->use_busy)
+ bcm2835_sdhost_finish_command(host, NULL);
+
+- if (host->delay_after_stop)
++ if (host->delay_after_this_stop)
+ do_gettimeofday(&host->stop_time);
+ }
+ } else {
diff --git a/target/linux/brcm2708/patches-4.4/0187-BCM270X_DT-Add-labels-to-spidev-nodes.patch b/target/linux/brcm2708/patches-4.4/0187-BCM270X_DT-Add-labels-to-spidev-nodes.patch
new file mode 100644
index 0000000000..f1b0bece86
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0187-BCM270X_DT-Add-labels-to-spidev-nodes.patch
@@ -0,0 +1,114 @@
+From 605effb19bd81578339b66e642ff5e5d4f86babd Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 15 Mar 2016 15:49:16 +0000
+Subject: [PATCH 187/232] BCM270X_DT: Add labels to spidev nodes
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 4 ++--
+ arch/arm/boot/dts/bcm2708-rpi-b.dts | 4 ++--
+ arch/arm/boot/dts/bcm2708-rpi-cm.dts | 4 ++--
+ arch/arm/boot/dts/bcm2709-rpi-2-b.dts | 4 ++--
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 4 ++--
+ 5 files changed, 10 insertions(+), 10 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
+@@ -59,7 +59,7 @@
+ pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
+ cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+
+- spidev@0{
++ spidev0: spidev@0{
+ compatible = "spidev";
+ reg = <0>; /* CE0 */
+ #address-cells = <1>;
+@@ -67,7 +67,7 @@
+ spi-max-frequency = <500000>;
+ };
+
+- spidev@1{
++ spidev1: spidev@1{
+ compatible = "spidev";
+ reg = <1>; /* CE1 */
+ #address-cells = <1>;
+--- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
+@@ -59,7 +59,7 @@
+ pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
+ cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+
+- spidev@0{
++ spidev0: spidev@0{
+ compatible = "spidev";
+ reg = <0>; /* CE0 */
+ #address-cells = <1>;
+@@ -67,7 +67,7 @@
+ spi-max-frequency = <500000>;
+ };
+
+- spidev@1{
++ spidev1: spidev@1{
+ compatible = "spidev";
+ reg = <1>; /* CE1 */
+ #address-cells = <1>;
+--- a/arch/arm/boot/dts/bcm2708-rpi-cm.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dts
+@@ -42,7 +42,7 @@
+ pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
+ cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+
+- spidev@0{
++ spidev0: spidev@0{
+ compatible = "spidev";
+ reg = <0>; /* CE0 */
+ #address-cells = <1>;
+@@ -50,7 +50,7 @@
+ spi-max-frequency = <500000>;
+ };
+
+- spidev@1{
++ spidev1: spidev@1{
+ compatible = "spidev";
+ reg = <1>; /* CE1 */
+ #address-cells = <1>;
+--- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
++++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
+@@ -59,7 +59,7 @@
+ pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
+ cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+
+- spidev@0{
++ spidev0: spidev@0{
+ compatible = "spidev";
+ reg = <0>; /* CE0 */
+ #address-cells = <1>;
+@@ -67,7 +67,7 @@
+ spi-max-frequency = <500000>;
+ };
+
+- spidev@1{
++ spidev1: spidev@1{
+ compatible = "spidev";
+ reg = <1>; /* CE1 */
+ #address-cells = <1>;
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -110,7 +110,7 @@
+ pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
+ cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+
+- spidev@0{
++ spidev0: spidev@0{
+ compatible = "spidev";
+ reg = <0>; /* CE0 */
+ #address-cells = <1>;
+@@ -118,7 +118,7 @@
+ spi-max-frequency = <500000>;
+ };
+
+- spidev@1{
++ spidev1: spidev@1{
+ compatible = "spidev";
+ reg = <1>; /* CE1 */
+ #address-cells = <1>;
diff --git a/target/linux/brcm2708/patches-4.4/0188-BCM270X_DT-Use-spidev-labels-in-overlays.patch b/target/linux/brcm2708/patches-4.4/0188-BCM270X_DT-Use-spidev-labels-in-overlays.patch
new file mode 100644
index 0000000000..29c1695120
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0188-BCM270X_DT-Use-spidev-labels-in-overlays.patch
@@ -0,0 +1,628 @@
+From 666d717a56639ca89b6bba18a325b1c530683fac Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 15 Mar 2016 16:27:26 +0000
+Subject: [PATCH 188/232] BCM270X_DT: Use spidev labels in overlays
+
+---
+ arch/arm/boot/dts/overlays/ads7846-overlay.dts | 22 ++++++++++-------
+ arch/arm/boot/dts/overlays/at86rf233-overlay.dts | 11 +++++----
+ arch/arm/boot/dts/overlays/enc28j60-overlay.dts | 11 +++++----
+ arch/arm/boot/dts/overlays/hy28a-overlay.dts | 22 ++++++++++-------
+ arch/arm/boot/dts/overlays/hy28b-overlay.dts | 22 ++++++++++-------
+ .../arm/boot/dts/overlays/mcp2515-can0-overlay.dts | 16 ++++++++-----
+ .../arm/boot/dts/overlays/mcp2515-can1-overlay.dts | 16 ++++++++-----
+ arch/arm/boot/dts/overlays/mz61581-overlay.dts | 22 ++++++++++-------
+ arch/arm/boot/dts/overlays/piscreen-overlay.dts | 22 ++++++++++-------
+ arch/arm/boot/dts/overlays/piscreen2r-overlay.dts | 22 ++++++++++-------
+ .../dts/overlays/pitft28-capacitive-overlay.dts | 17 +++++++------
+ .../dts/overlays/pitft28-resistive-overlay.dts | 24 ++++++++++++-------
+ arch/arm/boot/dts/overlays/rpi-display-overlay.dts | 22 ++++++++++-------
+ arch/arm/boot/dts/overlays/tinylcd35-overlay.dts | 28 +++++++++++++---------
+ 14 files changed, 174 insertions(+), 103 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/ads7846-overlay.dts
++++ b/arch/arm/boot/dts/overlays/ads7846-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ ads7846_pins: ads7846_pins {
+@@ -35,7 +41,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/at86rf233-overlay.dts
++++ b/arch/arm/boot/dts/overlays/at86rf233-overlay.dts
+@@ -14,10 +14,6 @@
+
+ status = "okay";
+
+- spidev@0{
+- status = "disabled";
+- };
+-
+ lowpan0: at86rf233@0 {
+ compatible = "atmel,at86rf233";
+ reg = <0>;
+@@ -32,6 +28,13 @@
+ };
+
+ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
++
++ fragment@2 {
+ target = <&gpio>;
+ __overlay__ {
+ lowpan0_pins: lowpan0_pins {
+--- a/arch/arm/boot/dts/overlays/enc28j60-overlay.dts
++++ b/arch/arm/boot/dts/overlays/enc28j60-overlay.dts
+@@ -14,10 +14,6 @@
+
+ status = "okay";
+
+- spidev@0{
+- status = "disabled";
+- };
+-
+ eth1: enc28j60@0{
+ compatible = "microchip,enc28j60";
+ reg = <0>; /* CE0 */
+@@ -32,6 +28,13 @@
+ };
+
+ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
++
++ fragment@2 {
+ target = <&gpio>;
+ __overlay__ {
+ eth1_pins: eth1_pins {
+--- a/arch/arm/boot/dts/overlays/hy28a-overlay.dts
++++ b/arch/arm/boot/dts/overlays/hy28a-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ hy28a_pins: hy28a_pins {
+@@ -34,7 +40,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/hy28b-overlay.dts
++++ b/arch/arm/boot/dts/overlays/hy28b-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ hy28b_pins: hy28b_pins {
+@@ -34,7 +40,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts
++++ b/arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts
+@@ -12,14 +12,18 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
+- spidev@0{
+- status = "disabled";
+- };
+ };
+ };
+
+- /* the interrupt pin of the can-controller */
+ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
++
++ /* the interrupt pin of the can-controller */
++ fragment@2 {
+ target = <&gpio>;
+ __overlay__ {
+ can0_pins: can0_pins {
+@@ -30,7 +34,7 @@
+ };
+
+ /* the clock/oscillator of the can-controller */
+- fragment@2 {
++ fragment@3 {
+ target-path = "/clocks";
+ __overlay__ {
+ /* external oscillator of mcp2515 on SPI0.0 */
+@@ -43,7 +47,7 @@
+ };
+
+ /* the spi config of the can-controller itself binding everything together */
+- fragment@3 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts
++++ b/arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts
+@@ -12,14 +12,18 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
+- spidev@1{
+- status = "disabled";
+- };
+ };
+ };
+
+- /* the interrupt pin of the can-controller */
+ fragment@1 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
++
++ /* the interrupt pin of the can-controller */
++ fragment@2 {
+ target = <&gpio>;
+ __overlay__ {
+ can1_pins: can1_pins {
+@@ -30,7 +34,7 @@
+ };
+
+ /* the clock/oscillator of the can-controller */
+- fragment@2 {
++ fragment@3 {
+ target-path = "/clocks";
+ __overlay__ {
+ /* external oscillator of mcp2515 on spi0.1 */
+@@ -43,7 +47,7 @@
+ };
+
+ /* the spi config of the can-controller itself binding everything together */
+- fragment@3 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/mz61581-overlay.dts
++++ b/arch/arm/boot/dts/overlays/mz61581-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ mz61581_pins: mz61581_pins {
+@@ -34,7 +40,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/piscreen-overlay.dts
++++ b/arch/arm/boot/dts/overlays/piscreen-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ piscreen_pins: piscreen_pins {
+@@ -34,7 +40,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/piscreen2r-overlay.dts
++++ b/arch/arm/boot/dts/overlays/piscreen2r-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ piscreen2_pins: piscreen2_pins {
+@@ -34,7 +40,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts
+@@ -13,14 +13,17 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
+-
+- spidev@0{
+- status = "disabled";
+- };
+ };
+ };
+
+- fragment@1 {
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
++
++ fragment@2 {
+ target = <&gpio>;
+ __overlay__ {
+ pitft_pins: pitft_pins {
+@@ -31,7 +34,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@3 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+@@ -55,7 +58,7 @@
+ };
+ };
+
+- fragment@3 {
++ fragment@4 {
+ target = <&i2c1>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ pitft_pins: pitft_pins {
+@@ -35,7 +41,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+@@ -95,7 +101,7 @@
+ };
+ };
+
+- fragment@3 {
++ fragment@5 {
+ target-path = "/soc";
+ __overlay__ {
+ backlight {
+--- a/arch/arm/boot/dts/overlays/rpi-display-overlay.dts
++++ b/arch/arm/boot/dts/overlays/rpi-display-overlay.dts
+@@ -13,18 +13,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ rpi_display_pins: rpi_display_pins {
+@@ -35,7 +41,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+--- a/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts
++++ b/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts
+@@ -30,18 +30,24 @@
+ target = <&spi0>;
+ __overlay__ {
+ status = "okay";
++ };
++ };
+
+- spidev@0{
+- status = "disabled";
+- };
++ fragment@1 {
++ target = <&spidev0>;
++ __overlay__ {
++ status = "disabled";
++ };
++ };
+
+- spidev@1{
+- status = "disabled";
+- };
++ fragment@2 {
++ target = <&spidev1>;
++ __overlay__ {
++ status = "disabled";
+ };
+ };
+
+- fragment@1 {
++ fragment@3 {
+ target = <&gpio>;
+ __overlay__ {
+ tinylcd35_pins: tinylcd35_pins {
+@@ -60,7 +66,7 @@
+ };
+ };
+
+- fragment@2 {
++ fragment@4 {
+ target = <&spi0>;
+ __overlay__ {
+ /* needed to avoid dtc warning */
+@@ -124,7 +130,7 @@
+
+ /* RTC */
+
+- fragment@3 {
++ fragment@5 {
+ target = <&i2c1>;
+ __overlay__ {
+ #address-cells = <1>;
+@@ -138,7 +144,7 @@
+ };
+ };
+
+- fragment@4 {
++ fragment@6 {
+ target = <&i2c1>;
+ __overlay__ {
+ #address-cells = <1>;
+@@ -156,7 +162,7 @@
+ * Values for input event code is found under the
+ * 'Keys and buttons' heading in include/uapi/linux/input.h
+ */
+- fragment@5 {
++ fragment@7 {
+ target-path = "/soc";
+ __overlay__ {
+ keypad: keypad {
diff --git a/target/linux/brcm2708/patches-4.4/0189-BCM270X_DT-Build-and-document-the-wittypi-overlay.patch b/target/linux/brcm2708/patches-4.4/0189-BCM270X_DT-Build-and-document-the-wittypi-overlay.patch
new file mode 100644
index 0000000000..d5606e54df
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0189-BCM270X_DT-Build-and-document-the-wittypi-overlay.patch
@@ -0,0 +1,50 @@
+From 3259cf06132d0987314a37f39b0b18750b127eba Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 15 Mar 2016 16:41:37 +0000
+Subject: [PATCH 189/232] BCM270X_DT: Build and document the wittypi overlay
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/Makefile | 1 +
+ arch/arm/boot/dts/overlays/README | 8 ++++++++
+ arch/arm/boot/dts/overlays/wittypi-overlay.dts | 2 +-
+ 3 files changed, 10 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -74,6 +74,7 @@ dtbo-$(RPI_DT_OVERLAYS) += vc4-kms-v3d.d
+ dtbo-$(RPI_DT_OVERLAYS) += vga666.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += w1-gpio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += w1-gpio-pullup.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += wittypi.dtbo
+
+ targets += dtbs dtbs_install
+ targets += $(dtbo-y)
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -920,6 +920,14 @@ Params: gpiopin GPIO for
+ extpullup GPIO for external pullup (default "5")
+
+
++Name: wittypi
++Info: Configures the wittypi RTC module.
++Load: dtoverlay=wittypi,<param>=<val>
++Params: led_gpio GPIO for LED (default "17")
++ led_trigger Choose which activity the LED tracks (default
++ "default-on")
++
++
+ Troubleshooting
+ ===============
+
+--- a/arch/arm/boot/dts/overlays/wittypi-overlay.dts
++++ b/arch/arm/boot/dts/overlays/wittypi-overlay.dts
+@@ -37,7 +37,7 @@
+ };
+
+ __overrides__ {
+- led_gpio = <&wittypi_led>,"gpios:4";
++ led_gpio = <&wittypi_led>,"gpios:4";
+ led_trigger = <&wittypi_led>,"linux,default-trigger";
+ };
+
diff --git a/target/linux/brcm2708/patches-4.4/0190-scripts-dtc-Fix-UMR-causing-corrupt-dtbo-overlay-fil.patch b/target/linux/brcm2708/patches-4.4/0190-scripts-dtc-Fix-UMR-causing-corrupt-dtbo-overlay-fil.patch
new file mode 100644
index 0000000000..b6525b564a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0190-scripts-dtc-Fix-UMR-causing-corrupt-dtbo-overlay-fil.patch
@@ -0,0 +1,27 @@
+From cd57bc1baa3d03746b6bf78996cbd46460558c28 Mon Sep 17 00:00:00 2001
+From: Matthias Reichl <hias@horus.com>
+Date: Tue, 15 Mar 2016 21:13:39 +0100
+Subject: [PATCH 190/232] scripts/dtc: Fix UMR causing corrupt dtbo overlay
+ files
+
+struct fixup_entry is allocated from the heap but it's member
+local_fixup_generated was never initialized. This lead to
+corrupted dtbo files.
+
+Fix this by initializing local_fixup_generated to false.
+
+Signed-off-by: Matthias Reichl <hias@horus.com>
+---
+ scripts/dtc/checks.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/scripts/dtc/checks.c
++++ b/scripts/dtc/checks.c
+@@ -523,6 +523,7 @@ static void fixup_phandle_references(str
+ fe->prop = prop;
+ fe->offset = m->offset;
+ fe->next = NULL;
++ fe->local_fixup_generated = false;
+
+ /* append it to the local fixups */
+ fep = &dt->local_fixups;
diff --git a/target/linux/brcm2708/patches-4.4/0191-BCM270X_DT-Add-dtparam-for-uart1.patch b/target/linux/brcm2708/patches-4.4/0191-BCM270X_DT-Add-dtparam-for-uart1.patch
new file mode 100644
index 0000000000..a7009cf2aa
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0191-BCM270X_DT-Add-dtparam-for-uart1.patch
@@ -0,0 +1,77 @@
+From d171758951c497d0cd557040884ffb4efd231c3c Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 16 Mar 2016 08:35:06 +0000
+Subject: [PATCH 191/232] BCM270X_DT: Add dtparam for uart1
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 1 +
+ arch/arm/boot/dts/bcm2708-rpi-b.dts | 1 +
+ arch/arm/boot/dts/bcm2708-rpi-cm.dts | 1 +
+ arch/arm/boot/dts/bcm2709-rpi-2-b.dts | 1 +
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 1 +
+ arch/arm/boot/dts/overlays/README | 3 +++
+ 6 files changed, 8 insertions(+)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
+@@ -120,6 +120,7 @@
+ __overrides__ {
+ uart0 = <&uart0>,"status";
+ uart0_clkrate = <&clk_uart0>,"clock-frequency:0";
++ uart1 = <&uart1>,"status";
+ i2s = <&i2s>,"status";
+ spi = <&spi0>,"status";
+ i2c0 = <&i2c0>,"status";
+--- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
+@@ -114,6 +114,7 @@
+ __overrides__ {
+ uart0 = <&uart0>,"status";
+ uart0_clkrate = <&clk_uart0>,"clock-frequency:0";
++ uart1 = <&uart1>,"status";
+ i2s = <&i2s>,"status";
+ spi = <&spi0>,"status";
+ i2c0 = <&i2c0>,"status";
+--- a/arch/arm/boot/dts/bcm2708-rpi-cm.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dts
+@@ -89,6 +89,7 @@
+ __overrides__ {
+ uart0 = <&uart0>,"status";
+ uart0_clkrate = <&clk_uart0>,"clock-frequency:0";
++ uart1 = <&uart1>,"status";
+ i2s = <&i2s>,"status";
+ spi = <&spi0>,"status";
+ i2c0 = <&i2c0>,"status";
+--- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
++++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
+@@ -120,6 +120,7 @@
+ __overrides__ {
+ uart0 = <&uart0>,"status";
+ uart0_clkrate = <&clk_uart0>,"clock-frequency:0";
++ uart1 = <&uart1>,"status";
+ i2s = <&i2s>,"status";
+ spi = <&spi0>,"status";
+ i2c0 = <&i2c0>,"status";
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -171,6 +171,7 @@
+ __overrides__ {
+ uart0 = <&uart0>,"status";
+ uart0_clkrate = <&clk_uart0>,"clock-frequency:0";
++ uart1 = <&uart1>,"status";
+ i2s = <&i2s>,"status";
+ spi = <&spi0>,"status";
+ i2c0 = <&i2c0>,"status";
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -124,6 +124,9 @@ Params:
+
+ uart0 Set to "off" to disable uart0 (default "on")
+
++ uart1 Set to "on" or "off" to enable or disable uart1
++ (default varies)
++
+ watchdog Set to "on" to enable the hardware watchdog
+ (default "off")
+
diff --git a/target/linux/brcm2708/patches-4.4/0192-dwc-overlay-Use-label-so-overrides-can-apply.patch b/target/linux/brcm2708/patches-4.4/0192-dwc-overlay-Use-label-so-overrides-can-apply.patch
new file mode 100644
index 0000000000..fa8983c694
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0192-dwc-overlay-Use-label-so-overrides-can-apply.patch
@@ -0,0 +1,34 @@
+From 916634f9a59abd7f0de793ac5b523a89c882dbdf Mon Sep 17 00:00:00 2001
+From: Przemek Rudy <prudy1@o2.pl>
+Date: Fri, 11 Mar 2016 22:41:26 +0100
+Subject: [PATCH 192/232] dwc-overlay: Use label so overrides can apply.
+
+---
+ arch/arm/boot/dts/overlays/dwc2-overlay.dts | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/dwc2-overlay.dts
++++ b/arch/arm/boot/dts/overlays/dwc2-overlay.dts
+@@ -8,7 +8,7 @@
+ target = <&usb>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+- __overlay__ {
++ dwc2_usb: __overlay__ {
+ compatible = "brcm,bcm2835-usb";
+ reg = <0x7e980000 0x10000>;
+ interrupts = <1 9>;
+@@ -21,9 +21,9 @@
+ };
+
+ __overrides__ {
+- dr_mode = <&usb>, "dr_mode";
+- g-np-tx-fifo-size = <&usb>,"g-np-tx-fifo-size:0";
+- g-rx-fifo-size = <&usb>,"g-rx-fifo-size:0";
+- g-tx-fifo-size = <&usb>,"g-tx-fifo-size:0";
++ dr_mode = <&dwc2_usb>, "dr_mode";
++ g-np-tx-fifo-size = <&dwc2_usb>,"g-np-tx-fifo-size:0";
++ g-rx-fifo-size = <&dwc2_usb>,"g-rx-fifo-size:0";
++ g-tx-fifo-size = <&dwc2_usb>,"g-tx-fifo-size:0";
+ };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0193-drm-vc4-Add-a-debugfs-node-for-tracking-execution-st.patch b/target/linux/brcm2708/patches-4.4/0193-drm-vc4-Add-a-debugfs-node-for-tracking-execution-st.patch
new file mode 100644
index 0000000000..8b5832409a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0193-drm-vc4-Add-a-debugfs-node-for-tracking-execution-st.patch
@@ -0,0 +1,56 @@
+From b30fecff47b19f93b4d20706bc6c6e6c0b972344 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 22 Jan 2016 13:06:39 -0800
+Subject: [PATCH 193/232] drm/vc4: Add a debugfs node for tracking execution
+ state.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_debugfs.c | 1 +
+ drivers/gpu/drm/vc4/vc4_drv.h | 1 +
+ drivers/gpu/drm/vc4/vc4_gem.c | 14 ++++++++++++++
+ 3 files changed, 16 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_debugfs.c
++++ b/drivers/gpu/drm/vc4/vc4_debugfs.c
+@@ -17,6 +17,7 @@
+
+ static const struct drm_info_list vc4_debugfs_list[] = {
+ {"bo_stats", vc4_bo_stats_debugfs, 0},
++ {"gem_exec", vc4_gem_exec_debugfs, 0},
+ {"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
+ {"hvs_regs", vc4_hvs_debugfs_regs, 0},
+ {"crtc0_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)0},
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -403,6 +403,7 @@ void vc4_job_handle_completed(struct vc4
+ int vc4_queue_seqno_cb(struct drm_device *dev,
+ struct vc4_seqno_cb *cb, uint64_t seqno,
+ void (*func)(struct vc4_seqno_cb *cb));
++int vc4_gem_exec_debugfs(struct seq_file *m, void *arg);
+
+ /* vc4_hdmi.c */
+ extern struct platform_driver vc4_hdmi_driver;
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -31,6 +31,20 @@
+ #include "vc4_regs.h"
+ #include "vc4_trace.h"
+
++#ifdef CONFIG_DEBUG_FS
++int vc4_gem_exec_debugfs(struct seq_file *m, void *unused)
++{
++ struct drm_info_node *node = (struct drm_info_node *)m->private;
++ struct drm_device *dev = node->minor->dev;
++ struct vc4_dev *vc4 = to_vc4_dev(dev);
++
++ seq_printf(m, "Emitted seqno: 0x%016llx\n", vc4->emit_seqno);
++ seq_printf(m, "Finished seqno: 0x%016llx\n", vc4->finished_seqno);
++
++ return 0;
++}
++#endif /* CONFIG_DEBUG_FS */
++
+ static void
+ vc4_queue_hangcheck(struct drm_device *dev)
+ {
diff --git a/target/linux/brcm2708/patches-4.4/0194-drm-vc4-Include-vc4_drm.h-in-uapi-in-downstream-buil.patch b/target/linux/brcm2708/patches-4.4/0194-drm-vc4-Include-vc4_drm.h-in-uapi-in-downstream-buil.patch
new file mode 100644
index 0000000000..599a38a13a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0194-drm-vc4-Include-vc4_drm.h-in-uapi-in-downstream-buil.patch
@@ -0,0 +1,21 @@
+From 64da292638fcacae979a5e8b3239969ec4275eb9 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jan 2016 13:03:33 -0800
+Subject: [PATCH 194/232] drm/vc4: Include vc4_drm.h in uapi in downstream
+ build.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ include/uapi/drm/Kbuild | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/include/uapi/drm/Kbuild
++++ b/include/uapi/drm/Kbuild
+@@ -14,6 +14,7 @@ header-y += radeon_drm.h
+ header-y += savage_drm.h
+ header-y += sis_drm.h
+ header-y += tegra_drm.h
++header-y += vc4_drm.h
+ header-y += via_drm.h
+ header-y += vmwgfx_drm.h
+ header-y += msm_drm.h
diff --git a/target/linux/brcm2708/patches-4.4/0195-drm-vc4-Validate-that-WAIT_BO-padding-is-cleared.patch b/target/linux/brcm2708/patches-4.4/0195-drm-vc4-Validate-that-WAIT_BO-padding-is-cleared.patch
new file mode 100644
index 0000000000..ea2a610f86
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0195-drm-vc4-Validate-that-WAIT_BO-padding-is-cleared.patch
@@ -0,0 +1,25 @@
+From 4b02ed240cad8575c197d01d083a10e398f768bd Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jan 2016 13:05:00 -0800
+Subject: [PATCH 195/232] drm/vc4: Validate that WAIT_BO padding is cleared.
+
+This is ABI future-proofing if we ever want to extend the pad to mean
+something.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -761,6 +761,9 @@ vc4_wait_bo_ioctl(struct drm_device *dev
+ struct drm_gem_object *gem_obj;
+ struct vc4_bo *bo;
+
++ if (args->pad != 0)
++ return -EINVAL;
++
+ gem_obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+ if (!gem_obj) {
+ DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
diff --git a/target/linux/brcm2708/patches-4.4/0196-drm-vc4-Fix-the-clear-color-for-the-first-tile-rende.patch b/target/linux/brcm2708/patches-4.4/0196-drm-vc4-Fix-the-clear-color-for-the-first-tile-rende.patch
new file mode 100644
index 0000000000..bc4c81286a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0196-drm-vc4-Fix-the-clear-color-for-the-first-tile-rende.patch
@@ -0,0 +1,49 @@
+From 7ff02c91259682b40b5ce8a90f114925d71572c0 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jan 2016 13:52:41 -0800
+Subject: [PATCH 196/232] drm/vc4: Fix the clear color for the first tile
+ rendered.
+
+Apparently in hardware (as opposed to simulation), the clear colors
+need to be uploaded before the render config, otherwise they won't
+take effect. Fixes igt's vc4_wait_bo/used-bo-* subtests.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_render_cl.c | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_render_cl.c
++++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
+@@ -321,15 +321,6 @@ static int vc4_create_rcl_bo(struct drm_
+ list_add_tail(&to_vc4_bo(&setup->rcl->base)->unref_head,
+ &exec->unref_list);
+
+- rcl_u8(setup, VC4_PACKET_TILE_RENDERING_MODE_CONFIG);
+- rcl_u32(setup,
+- (setup->color_write ? (setup->color_write->paddr +
+- args->color_write.offset) :
+- 0));
+- rcl_u16(setup, args->width);
+- rcl_u16(setup, args->height);
+- rcl_u16(setup, args->color_write.bits);
+-
+ /* The tile buffer gets cleared when the previous tile is stored. If
+ * the clear values changed between frames, then the tile buffer has
+ * stale clear values in it, so we have to do a store in None mode (no
+@@ -349,6 +340,15 @@ static int vc4_create_rcl_bo(struct drm_
+ rcl_u32(setup, 0); /* no address, since we're in None mode */
+ }
+
++ rcl_u8(setup, VC4_PACKET_TILE_RENDERING_MODE_CONFIG);
++ rcl_u32(setup,
++ (setup->color_write ? (setup->color_write->paddr +
++ args->color_write.offset) :
++ 0));
++ rcl_u16(setup, args->width);
++ rcl_u16(setup, args->height);
++ rcl_u16(setup, args->color_write.bits);
++
+ for (y = min_y_tile; y <= max_y_tile; y++) {
+ for (x = min_x_tile; x <= max_x_tile; x++) {
+ bool first = (x == min_x_tile && y == min_y_tile);
diff --git a/target/linux/brcm2708/patches-4.4/0197-drm-vc4-Return-an-ERR_PTR-from-BO-creation-instead-o.patch b/target/linux/brcm2708/patches-4.4/0197-drm-vc4-Return-an-ERR_PTR-from-BO-creation-instead-o.patch
new file mode 100644
index 0000000000..9043036868
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0197-drm-vc4-Return-an-ERR_PTR-from-BO-creation-instead-o.patch
@@ -0,0 +1,137 @@
+From d6211c47e6671faf74389dbcbe29454c5997defb Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jan 2016 14:13:12 -0800
+Subject: [PATCH 197/232] drm/vc4: Return an ERR_PTR from BO creation instead
+ of NULL.
+
+Fixes igt vc4_create_bo/create-bo-0 by returning -EINVAL from the
+ioctl instead of -ENOMEM.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_bo.c | 23 +++++++++++++----------
+ drivers/gpu/drm/vc4/vc4_gem.c | 4 ++--
+ drivers/gpu/drm/vc4/vc4_irq.c | 2 +-
+ drivers/gpu/drm/vc4/vc4_render_cl.c | 4 ++--
+ drivers/gpu/drm/vc4/vc4_validate.c | 4 ++--
+ 5 files changed, 20 insertions(+), 17 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_bo.c
++++ b/drivers/gpu/drm/vc4/vc4_bo.c
+@@ -213,10 +213,10 @@ struct vc4_bo *vc4_bo_create(struct drm_
+ size_t size = roundup(unaligned_size, PAGE_SIZE);
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
+ struct drm_gem_cma_object *cma_obj;
+- int pass;
++ int pass, ret;
+
+ if (size == 0)
+- return NULL;
++ return ERR_PTR(-EINVAL);
+
+ /* First, try to get a vc4_bo from the kernel BO cache. */
+ if (from_cache) {
+@@ -247,14 +247,17 @@ struct vc4_bo *vc4_bo_create(struct drm_
+ * unreferenced BOs to the cache, and then
+ * free the cache.
+ */
+- vc4_wait_for_seqno(dev, vc4->emit_seqno, ~0ull, true);
++ ret = vc4_wait_for_seqno(dev, vc4->emit_seqno, ~0ull,
++ true);
++ if (ret)
++ return ERR_PTR(ret);
+ vc4_job_handle_completed(vc4);
+ vc4_bo_cache_purge(dev);
+ break;
+ case 3:
+ DRM_ERROR("Failed to allocate from CMA:\n");
+ vc4_bo_stats_dump(vc4);
+- return NULL;
++ return ERR_PTR(-ENOMEM);
+ }
+ }
+
+@@ -276,8 +279,8 @@ int vc4_dumb_create(struct drm_file *fil
+ args->size = args->pitch * args->height;
+
+ bo = vc4_bo_create(dev, args->size, false);
+- if (!bo)
+- return -ENOMEM;
++ if (IS_ERR(bo))
++ return PTR_ERR(bo);
+
+ ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
+ drm_gem_object_unreference_unlocked(&bo->base.base);
+@@ -460,8 +463,8 @@ int vc4_create_bo_ioctl(struct drm_devic
+ * get zeroed, and that might leak data between users.
+ */
+ bo = vc4_bo_create(dev, args->size, false);
+- if (!bo)
+- return -ENOMEM;
++ if (IS_ERR(bo))
++ return PTR_ERR(bo);
+
+ ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
+ drm_gem_object_unreference_unlocked(&bo->base.base);
+@@ -513,8 +516,8 @@ vc4_create_shader_bo_ioctl(struct drm_de
+ }
+
+ bo = vc4_bo_create(dev, args->size, true);
+- if (!bo)
+- return -ENOMEM;
++ if (IS_ERR(bo))
++ return PTR_ERR(bo);
+
+ ret = copy_from_user(bo->base.vaddr,
+ (void __user *)(uintptr_t)args->data,
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -593,9 +593,9 @@ vc4_get_bcl(struct drm_device *dev, stru
+ }
+
+ bo = vc4_bo_create(dev, exec_size, true);
+- if (!bo) {
++ if (IS_ERR(bo)) {
+ DRM_ERROR("Couldn't allocate BO for binning\n");
+- ret = PTR_ERR(exec->exec_bo);
++ ret = PTR_ERR(bo);
+ goto fail;
+ }
+ exec->exec_bo = &bo->base;
+--- a/drivers/gpu/drm/vc4/vc4_irq.c
++++ b/drivers/gpu/drm/vc4/vc4_irq.c
+@@ -57,7 +57,7 @@ vc4_overflow_mem_work(struct work_struct
+ struct vc4_bo *bo;
+
+ bo = vc4_bo_create(dev, 256 * 1024, true);
+- if (!bo) {
++ if (IS_ERR(bo)) {
+ DRM_ERROR("Couldn't allocate binner overflow mem\n");
+ return;
+ }
+--- a/drivers/gpu/drm/vc4/vc4_render_cl.c
++++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
+@@ -316,8 +316,8 @@ static int vc4_create_rcl_bo(struct drm_
+ size += xtiles * ytiles * loop_body_size;
+
+ setup->rcl = &vc4_bo_create(dev, size, true)->base;
+- if (!setup->rcl)
+- return -ENOMEM;
++ if (IS_ERR(setup->rcl))
++ return PTR_ERR(setup->rcl);
+ list_add_tail(&to_vc4_bo(&setup->rcl->base)->unref_head,
+ &exec->unref_list);
+
+--- a/drivers/gpu/drm/vc4/vc4_validate.c
++++ b/drivers/gpu/drm/vc4/vc4_validate.c
+@@ -401,8 +401,8 @@ validate_tile_binning_config(VALIDATE_AR
+ tile_bo = vc4_bo_create(dev, exec->tile_alloc_offset + tile_alloc_size,
+ true);
+ exec->tile_bo = &tile_bo->base;
+- if (!exec->tile_bo)
+- return -ENOMEM;
++ if (IS_ERR(exec->tile_bo))
++ return PTR_ERR(exec->tile_bo);
+ list_add_tail(&tile_bo->unref_head, &exec->unref_list);
+
+ /* tile alloc address. */
diff --git a/target/linux/brcm2708/patches-4.4/0198-drm-vc4-Fix-ERESTARTSYS-error-return-from-BO-waits.patch b/target/linux/brcm2708/patches-4.4/0198-drm-vc4-Fix-ERESTARTSYS-error-return-from-BO-waits.patch
new file mode 100644
index 0000000000..5ce96be4e0
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0198-drm-vc4-Fix-ERESTARTSYS-error-return-from-BO-waits.patch
@@ -0,0 +1,32 @@
+From 39e77e9d67511ac9bfbb00ab471fc7b0374dcdf6 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jan 2016 14:32:41 -0800
+Subject: [PATCH 198/232] drm/vc4: Fix -ERESTARTSYS error return from BO waits.
+
+This caused the wait ioctls to claim that waiting had completed when
+we actually got interrupted by a signal before it was done. Fixes
+broken rendering throttling that produced serious lag in X window
+dragging.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -352,12 +352,10 @@ vc4_wait_for_seqno(struct drm_device *de
+ finish_wait(&vc4->job_wait_queue, &wait);
+ trace_vc4_wait_for_seqno_end(dev, seqno);
+
+- if (ret && ret != -ERESTARTSYS) {
++ if (ret && ret != -ERESTARTSYS)
+ DRM_ERROR("timeout waiting for render thread idle\n");
+- return ret;
+- }
+
+- return 0;
++ return ret;
+ }
+
+ static void
diff --git a/target/linux/brcm2708/patches-4.4/0199-drm-vc4-Drop-error-message-on-seqno-wait-timeouts.patch b/target/linux/brcm2708/patches-4.4/0199-drm-vc4-Drop-error-message-on-seqno-wait-timeouts.patch
new file mode 100644
index 0000000000..34bcc248d1
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0199-drm-vc4-Drop-error-message-on-seqno-wait-timeouts.patch
@@ -0,0 +1,27 @@
+From a9221f160c28301850d5368d283c751b18950f2a Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jan 2016 14:33:50 -0800
+Subject: [PATCH 199/232] drm/vc4: Drop error message on seqno wait timeouts.
+
+These ioctls end up getting exposed to userspace, and having normal
+user requests print DRM errors is obviously wrong. The message was
+originally to give us some idea of what happened when a hang occurred,
+but we have a DRM_INFO from reset for that.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -352,9 +352,6 @@ vc4_wait_for_seqno(struct drm_device *de
+ finish_wait(&vc4->job_wait_queue, &wait);
+ trace_vc4_wait_for_seqno_end(dev, seqno);
+
+- if (ret && ret != -ERESTARTSYS)
+- DRM_ERROR("timeout waiting for render thread idle\n");
+-
+ return ret;
+ }
+
diff --git a/target/linux/brcm2708/patches-4.4/0200-BCM270X_DT-Add-1-bit-SDIO-using-minimal-pins.patch b/target/linux/brcm2708/patches-4.4/0200-BCM270X_DT-Add-1-bit-SDIO-using-minimal-pins.patch
new file mode 100644
index 0000000000..3aea5f67e6
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0200-BCM270X_DT-Add-1-bit-SDIO-using-minimal-pins.patch
@@ -0,0 +1,81 @@
+From 19d839cafdd5ddb1233df5be821d702e655d2d16 Mon Sep 17 00:00:00 2001
+From: campag <dave-lowe@ntlworld.com>
+Date: Wed, 24 Feb 2016 16:45:42 +0000
+Subject: [PATCH 200/232] BCM270X_DT: Add 1-bit SDIO using minimal pins...
+
+... for that mode: GPIOs 22-25.
+---
+ arch/arm/boot/dts/overlays/README | 21 ++++++++++++++
+ arch/arm/boot/dts/overlays/sdio-1bit-overlay.dts | 36 ++++++++++++++++++++++++
+ 2 files changed, 57 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/sdio-1bit-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -709,6 +709,27 @@ Params: overclock_50 SD Clock
+ bus_width Set the SDIO host bus width (default 4 bits)
+
+
++Name: sdio-1bit
++Info: Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock,
++ and enables 1-bit SDIO via GPIOs 22-25.
++Load: dtoverlay=sdio-1bit,<param>=<val>
++Params: overclock_50 SD Clock (in MHz) to use when the MMC framework
++ requests 50MHz
++
++ sdio_overclock SDIO Clock (in MHz) to use when the MMC
++ framework requests 50MHz
++
++ force_pio Disable DMA support (default off)
++
++ pio_limit Number of blocks above which to use DMA
++ (default 1)
++
++ debug Enable debug output (default off)
++
++ poll_once Disable SDIO-device polling every second
++ (default on: polling once at boot-time)
++
++
+ Name: sdtweak
+ Info: Tunes the bcm2835-sdhost SD/MMC driver
+ Load: dtoverlay=sdtweak,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/sdio-1bit-overlay.dts
+@@ -0,0 +1,36 @@
++/* Enable 1-bit SDIO from MMC interface via GPIOs 22-25. Includes sdhost overlay. */
++
++/include/ "sdhost-overlay.dts"
++
++/{
++ compatible = "brcm,bcm2708";
++
++ fragment@3 {
++ target = <&mmc>;
++ sdio_mmc: __overlay__ {
++ compatible = "brcm,bcm2835-mmc";
++ pinctrl-names = "default";
++ pinctrl-0 = <&sdio_pins>;
++ non-removable;
++ bus-width = <1>;
++ brcm,overclock-50 = <0>;
++ status = "okay";
++ };
++ };
++
++ fragment@4 {
++ target = <&gpio>;
++ __overlay__ {
++ sdio_pins: sdio_pins {
++ brcm,pins = <22 23 24 25>;
++ brcm,function = <7 7 7 7>; /* ALT3 = SD1 */
++ brcm,pull = <0 2 2 2>;
++ };
++ };
++ };
++
++ __overrides__ {
++ poll_once = <&sdio_mmc>,"non-removable?";
++ sdio_overclock = <&sdio_mmc>,"brcm,overclock-50:0";
++ };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0202-Add-overlay-and-enable-support-for-QCA7000-board.patch b/target/linux/brcm2708/patches-4.4/0202-Add-overlay-and-enable-support-for-QCA7000-board.patch
new file mode 100644
index 0000000000..e2d168b9c1
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0202-Add-overlay-and-enable-support-for-QCA7000-board.patch
@@ -0,0 +1,127 @@
+From 76d3e26b821b2490619f4762b5f604e77636fdb1 Mon Sep 17 00:00:00 2001
+From: Michael Heimpold <michael.heimpold@i2se.com>
+Date: Fri, 29 Jan 2016 12:00:37 +0100
+Subject: [PATCH 202/232] Add overlay and enable support for QCA7000 board
+
+This adds a device tree overlay for the QCA7000 which can be used
+when attaching an I2SE's PLC Stamp micro EVK to the Raspberry Pi.
+
+This Evaluation Board embeds a QCA7000 chip, a Homeplug Green PHY
+powerline chip from Qualcomm/Atheros for the Internet of Things.
+
+This patch also enables the required QCA7000 driver module
+in the default configurations.
+
+Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
+Signed-off-by: Michael Heimpold <michael.heimpold@i2se.com>
+---
+ arch/arm/boot/dts/overlays/Makefile | 1 +
+ arch/arm/boot/dts/overlays/README | 8 ++++
+ arch/arm/boot/dts/overlays/qca7000-overlay.dts | 52 ++++++++++++++++++++++++++
+ arch/arm/configs/bcm2709_defconfig | 1 +
+ arch/arm/configs/bcmrpi_defconfig | 1 +
+ 5 files changed, 63 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/qca7000-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -48,6 +48,7 @@ dtbo-$(RPI_DT_OVERLAYS) += pitft28-resis
+ dtbo-$(RPI_DT_OVERLAYS) += pps-gpio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += pwm.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += pwm-2chan.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += qca7000.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += raspidac3.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += rpi-backlight.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += rpi-dac.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -625,6 +625,14 @@ Params: pin Output p
+ clock PWM clock frequency (informational)
+
+
++Name: qca7000
++Info: I2SE's Evaluation Board for PLC Stamp micro
++Load: dtoverlay=qca7000,<param>=<val>
++Params: int_pin GPIO pin for interrupt signal (default 23)
++
++ speed SPI bus speed (default 12 MHz)
++
++
+ Name: raspidac3
+ Info: Configures the RaspiDAV Rev.3x audio card
+ Load: dtoverlay=raspidac3
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/qca7000-overlay.dts
+@@ -0,0 +1,52 @@
++// Overlay for the Qualcomm Atheros QCA7000 on I2SE's PLC Stamp micro EVK
++// Visit: https://www.i2se.com/product/plc-stamp-micro-evk for details
++
++/dts-v1/;
++/plugin/;
++
++/ {
++ compatible = "brcm,bcm2708";
++
++ fragment@0 {
++ target = <&spi0>;
++ __overlay__ {
++ /* needed to avoid dtc warning */
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ status = "okay";
++
++ spidev@0 {
++ status = "disabled";
++ };
++
++ eth1: qca7000@0 {
++ compatible = "qca,qca7000";
++ reg = <0>; /* CE0 */
++ pinctrl-names = "default";
++ pinctrl-0 = <&eth1_pins>;
++ interrupt-parent = <&gpio>;
++ interrupts = <23 0x1>; /* rising edge */
++ spi-max-frequency = <12000000>;
++ status = "okay";
++ };
++ };
++ };
++
++ fragment@1 {
++ target = <&gpio>;
++ __overlay__ {
++ eth1_pins: eth1_pins {
++ brcm,pins = <23>;
++ brcm,function = <0>; /* in */
++ brcm,pull = <0>; /* none */
++ };
++ };
++ };
++
++ __overrides__ {
++ int_pin = <&eth1>, "interrupts:0",
++ <&eth1_pins>, "brcm,pins:0";
++ speed = <&eth1>, "spi-max-frequency:0";
++ };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -446,6 +446,7 @@ CONFIG_NETCONSOLE=m
+ CONFIG_TUN=m
+ CONFIG_VETH=m
+ CONFIG_ENC28J60=m
++CONFIG_QCA7000=m
+ CONFIG_MDIO_BITBANG=m
+ CONFIG_PPP=m
+ CONFIG_PPP_BSDCOMP=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -439,6 +439,7 @@ CONFIG_NETCONSOLE=m
+ CONFIG_TUN=m
+ CONFIG_VETH=m
+ CONFIG_ENC28J60=m
++CONFIG_QCA7000=m
+ CONFIG_MDIO_BITBANG=m
+ CONFIG_PPP=m
+ CONFIG_PPP_BSDCOMP=m
diff --git a/target/linux/brcm2708/patches-4.4/0203-serial-Take-care-starting-a-hung-up-tty-s-port.patch b/target/linux/brcm2708/patches-4.4/0203-serial-Take-care-starting-a-hung-up-tty-s-port.patch
new file mode 100644
index 0000000000..5ab6d2e509
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0203-serial-Take-care-starting-a-hung-up-tty-s-port.patch
@@ -0,0 +1,28 @@
+From c9276ae7cfecbd1df477ff31116682e72dd6d8f7 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 9 Mar 2016 13:28:24 +0000
+Subject: [PATCH 203/232] serial: Take care starting a hung-up tty's port
+
+tty_port_hangup sets a port's tty field to NULL (holding the port lock),
+but uart_tx_stopped, called from __uart_start (with the port lock),
+uses the tty field without checking for NULL.
+
+Change uart_tx_stopped to treat a NULL tty field as another stopped
+indication.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ include/linux/serial_core.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/linux/serial_core.h
++++ b/include/linux/serial_core.h
+@@ -397,7 +397,7 @@ int uart_resume_port(struct uart_driver
+ static inline int uart_tx_stopped(struct uart_port *port)
+ {
+ struct tty_struct *tty = port->state->port.tty;
+- if (tty->stopped || port->hw_stopped)
++ if (!tty || tty->stopped || port->hw_stopped)
+ return 1;
+ return 0;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0204-pi3-miniuart-bt-overlay-Correct-and-clarify-info.patch b/target/linux/brcm2708/patches-4.4/0204-pi3-miniuart-bt-overlay-Correct-and-clarify-info.patch
new file mode 100644
index 0000000000..656b9010d7
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0204-pi3-miniuart-bt-overlay-Correct-and-clarify-info.patch
@@ -0,0 +1,41 @@
+From b7bbcabcce3f31bca25f17d68fb9eb0e2e045184 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 17 Mar 2016 10:16:16 +0000
+Subject: [PATCH 204/232] pi3-miniuart-bt-overlay: Correct and clarify info
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/README | 6 ++++--
+ arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts | 6 ++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -511,8 +511,10 @@ Name: pi3-miniuart-bt
+ Info: Switch Pi3 Bluetooth function to use the mini-UART (ttyS0) and restore
+ UART0/ttyAMA0 over GPIOs 14 & 15. Note that this may reduce the maximum
+ usable baudrate.
+- N.B. It is also necessary to edit /lib/systemd/system/hciuart.server
+- and replace ttyAMA0 with ttyS0.
++ N.B. It is also necessary to edit /lib/systemd/system/hciuart.service
++ and replace ttyAMA0 with ttyS0, unless you have a system with udev rules
++ that create /dev/serial0 and /dev/serial1, in which case use
++ /dev/serial1 instead because it will always be correct.
+ Load: dtoverlay=pi3-miniuart-bt
+ Params: <None>
+
+--- a/arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts
+@@ -5,8 +5,10 @@
+ UART0/ttyAMA0 over GPIOs 14 & 15. Note that this may reduce the maximum
+ usable baudrate.
+
+- It is also necessary to edit /lib/systemd/system/hciuart.server and
+- replace ttyAMA0 with ttyS0.
++ It is also necessary to edit /lib/systemd/system/hciuart.service and
++ replace ttyAMA0 with ttyS0, unless you have a system with udev rules
++ that create /dev/serial0 and /dev/serial1, in which case use /dev/serial1
++ instead because it will always be correct.
+
+ If cmdline.txt uses the alias serial0 to refer to the user-accessable port
+ then the firmware will replace with the appropriate port whether or not
diff --git a/target/linux/brcm2708/patches-4.4/0205-pwm-overlays-Params-must-have-in-overlay-targets.patch b/target/linux/brcm2708/patches-4.4/0205-pwm-overlays-Params-must-have-in-overlay-targets.patch
new file mode 100644
index 0000000000..188239d39a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0205-pwm-overlays-Params-must-have-in-overlay-targets.patch
@@ -0,0 +1,52 @@
+From 05a2610389127e4cfcc2b9afdec83e1176b205bc Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 17 Mar 2016 10:41:56 +0000
+Subject: [PATCH 205/232] pwm overlays: Params must have in-overlay targets
+
+---
+ arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts | 9 ++++++++-
+ arch/arm/boot/dts/overlays/pwm-overlay.dts | 9 ++++++++-
+ 2 files changed, 16 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts
+@@ -36,11 +36,18 @@ N.B.:
+ };
+ };
+
++ fragment@2 {
++ target = <&clk_pwm>;
++ frag2: __overlay__ {
++ clock-frequency = <100000000>;
++ };
++ };
++
+ __overrides__ {
+ pin = <&pwm_pins>,"brcm,pins:0";
+ pin2 = <&pwm_pins>,"brcm,pins:4";
+ func = <&pwm_pins>,"brcm,function:0";
+ func2 = <&pwm_pins>,"brcm,function:4";
+- clock = <&clk_pwm>,"clock-frequency:0";
++ clock = <&frag2>,"clock-frequency:0";
+ };
+ };
+--- a/arch/arm/boot/dts/overlays/pwm-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pwm-overlay.dts
+@@ -34,9 +34,16 @@ N.B.:
+ };
+ };
+
++ fragment@2 {
++ target = <&clk_pwm>;
++ frag2: __overlay__ {
++ clock-frequency = <100000000>;
++ };
++ };
++
+ __overrides__ {
+ pin = <&pwm_pins>,"brcm,pins:0";
+ func = <&pwm_pins>,"brcm,function:0";
+- clock = <&clk_pwm>,"clock-frequency:0";
++ clock = <&frag2>,"clock-frequency:0";
+ };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0206-BCM270X_DT-Switch-Compute-Module-to-MMC.patch b/target/linux/brcm2708/patches-4.4/0206-BCM270X_DT-Switch-Compute-Module-to-MMC.patch
new file mode 100644
index 0000000000..e89917b178
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0206-BCM270X_DT-Switch-Compute-Module-to-MMC.patch
@@ -0,0 +1,53 @@
+From 985c06bd528e49fd44155c3da0c6107c46d947cc Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 18 Mar 2016 13:06:29 +0000
+Subject: [PATCH 206/232] BCM270X_DT: Switch Compute Module to MMC
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708-rpi-cm.dtsi | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi
++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi
+@@ -8,9 +8,9 @@
+ };
+
+ &gpio {
+- sdhost_pins: sdhost_pins {
++ mmc_pins: mmc_pins {
+ brcm,pins = <48 49 50 51 52 53>;
+- brcm,function = <4>; /* alt0 */
++ brcm,function = <7>; /* alt3 */
+ };
+ };
+
+@@ -22,12 +22,14 @@
+ };
+ };
+
+-&sdhost {
++
++&mmc {
+ pinctrl-names = "default";
+- pinctrl-0 = <&sdhost_pins>;
+- bus-width = <4>;
++ pinctrl-0 = <&mmc_pins>;
+ non-removable;
++ bus-width = <4>;
+ status = "okay";
++ brcm,overclock-50 = <0>;
+ };
+
+ &fb {
+@@ -45,9 +47,6 @@
+ audio = <&audio>,"status";
+ watchdog = <&watchdog>,"status";
+ random = <&random>,"status";
+- sd_overclock = <&sdhost>,"brcm,overclock-50:0";
+- sd_force_pio = <&sdhost>,"brcm,force-pio?";
+- sd_pio_limit = <&sdhost>,"brcm,pio-limit:0";
+- sd_debug = <&sdhost>,"brcm,debug";
++ sd_overclock = <&mmc>,"brcm,overclock-50:0";
+ };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0207-dwc_otg-Don-t-free-qh-align-buffers-in-atomic-contex.patch b/target/linux/brcm2708/patches-4.4/0207-dwc_otg-Don-t-free-qh-align-buffers-in-atomic-contex.patch
new file mode 100644
index 0000000000..201cdc834a
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0207-dwc_otg-Don-t-free-qh-align-buffers-in-atomic-contex.patch
@@ -0,0 +1,44 @@
+From 4558f488edf41daddd4bceed975f3af8cee89033 Mon Sep 17 00:00:00 2001
+From: P33M <P33M@github.com>
+Date: Fri, 18 Mar 2016 17:38:37 +0000
+Subject: [PATCH 207/232] dwc_otg: Don't free qh align buffers in atomic
+ context
+
+---
+ drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
++++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c
+@@ -56,6 +56,9 @@ void dwc_otg_hcd_qh_free(dwc_otg_hcd_t *
+ {
+ dwc_otg_qtd_t *qtd, *qtd_tmp;
+ dwc_irqflags_t flags;
++ uint32_t buf_size = 0;
++ uint8_t *align_buf_virt = NULL;
++ dwc_dma_t align_buf_dma;
+
+ /* Free each QTD in the QTD list */
+ DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags);
+@@ -67,17 +70,19 @@ void dwc_otg_hcd_qh_free(dwc_otg_hcd_t *
+ if (hcd->core_if->dma_desc_enable) {
+ dwc_otg_hcd_qh_free_ddma(hcd, qh);
+ } else if (qh->dw_align_buf) {
+- uint32_t buf_size;
+ if (qh->ep_type == UE_ISOCHRONOUS) {
+ buf_size = 4096;
+ } else {
+ buf_size = hcd->core_if->core_params->max_transfer_size;
+ }
+- DWC_DMA_FREE(buf_size, qh->dw_align_buf, qh->dw_align_buf_dma);
++ align_buf_virt = qh->dw_align_buf;
++ align_buf_dma = qh->dw_align_buf_dma;
+ }
+
+ DWC_FREE(qh);
+ DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags);
++ if (align_buf_virt)
++ DWC_DMA_FREE(buf_size, align_buf_virt, align_buf_dma);
+ return;
+ }
+
diff --git a/target/linux/brcm2708/patches-4.4/0208-dwc_otg-Enable-the-hack-for-Split-Interrupt-transact.patch b/target/linux/brcm2708/patches-4.4/0208-dwc_otg-Enable-the-hack-for-Split-Interrupt-transact.patch
new file mode 100644
index 0000000000..88000fddfb
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0208-dwc_otg-Enable-the-hack-for-Split-Interrupt-transact.patch
@@ -0,0 +1,28 @@
+From 7956536a3d78ba0ef8ec990651b315664ed70f90 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Mon, 21 Mar 2016 15:38:38 +0000
+Subject: [PATCH 208/232] dwc_otg: Enable the hack for Split Interrupt
+ transactions by default
+
+dwc_otg.fiq_fsm_mask=0xF has long been a suggestion for users with audio stutters or other USB bandwidth issues.
+So far we are aware of many success stories but no failure caused by this setting.
+Make it a default to learn more.
+
+See: https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=70437
+
+Signed-off-by: popcornmix <popcornmix@gmail.com>
+---
+ drivers/usb/host/dwc_otg/dwc_otg_driver.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/host/dwc_otg/dwc_otg_driver.c
++++ b/drivers/usb/host/dwc_otg/dwc_otg_driver.c
+@@ -247,7 +247,7 @@ bool fiq_fsm_enable = true;
+ //Bulk split-transaction NAK holdoff in microframes
+ uint16_t nak_holdoff = 8;
+
+-unsigned short fiq_fsm_mask = 0x07;
++unsigned short fiq_fsm_mask = 0x0F;
+
+ /**
+ * This function shows the Driver Version.
diff --git a/target/linux/brcm2708/patches-4.4/0209-BCM270X_DT-Remove-explicit-claiming-of-UART-pins.patch b/target/linux/brcm2708/patches-4.4/0209-BCM270X_DT-Remove-explicit-claiming-of-UART-pins.patch
new file mode 100644
index 0000000000..d99119e8bd
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0209-BCM270X_DT-Remove-explicit-claiming-of-UART-pins.patch
@@ -0,0 +1,89 @@
+From adc10c5da2b83bbc8c893e3a745b43890f27e2ac Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Sat, 19 Mar 2016 16:51:37 +0000
+Subject: [PATCH 209/232] BCM270X_DT: Remove explicit claiming of UART pins
+
+It is convenient to be able to map a different function to the UART
+pins (e.g. DPI for vga666) without having to disable the UART first.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 6 +++---
+ .../boot/dts/overlays/pi3-disable-bt-overlay.dts | 10 ++++-----
+ .../boot/dts/overlays/pi3-miniuart-bt-overlay.dts | 25 +++++++++++-----------
+ 3 files changed, 20 insertions(+), 21 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -57,9 +57,9 @@
+ };
+
+ uart1_pins: uart1_pins {
+- brcm,pins = <14 15>;
+- brcm,function = <2>; /* alt5=UART1 */
+- brcm,pull = <0 2>;
++ brcm,pins;
++ brcm,function;
++ brcm,pull;
+ };
+ };
+
+--- a/arch/arm/boot/dts/overlays/pi3-disable-bt-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pi3-disable-bt-overlay.dts
+@@ -28,13 +28,11 @@
+ };
+
+ fragment@2 {
+- target = <&gpio>;
++ target = <&uart0_pins>;
+ __overlay__ {
+- uart0_pins: uart0_pins {
+- brcm,pins = <14 15>;
+- brcm,function = <4>; /* alt0 */
+- brcm,pull = <0 2>;
+- };
++ brcm,pins;
++ brcm,function;
++ brcm,pull;
+ };
+ };
+
+--- a/arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pi3-miniuart-bt-overlay.dts
+@@ -37,23 +37,24 @@
+ };
+
+ fragment@2 {
+- target = <&gpio>;
++ target = <&uart0_pins>;
+ __overlay__ {
+- uart0_pins: uart0_pins {
+- brcm,pins = <14 15>;
+- brcm,function = <4>; /* alt0 */
+- brcm,pull = <0 2>;
+- };
+-
+- uart1_pins: uart1_pins {
+- brcm,pins = <32 33>;
+- brcm,function = <2>; /* alt5=UART1 */
+- brcm,pull = <0 2>;
+- };
++ brcm,pins;
++ brcm,function;
++ brcm,pull;
+ };
+ };
+
+ fragment@3 {
++ target = <&uart1_pins>;
++ __overlay__ {
++ brcm,pins = <32 33>;
++ brcm,function = <2>; /* alt5=UART1 */
++ brcm,pull = <0 2>;
++ };
++ };
++
++ fragment@4 {
+ target-path = "/aliases";
+ __overlay__ {
+ serial0 = "/soc/uart@7e201000";
diff --git a/target/linux/brcm2708/patches-4.4/0210-lirc_rpi-Lower-IR-reception-error-to-debug.patch b/target/linux/brcm2708/patches-4.4/0210-lirc_rpi-Lower-IR-reception-error-to-debug.patch
new file mode 100644
index 0000000000..d7c0722095
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0210-lirc_rpi-Lower-IR-reception-error-to-debug.patch
@@ -0,0 +1,21 @@
+From 79e3ee1d325bf1aea9e255127dd132265b734efe Mon Sep 17 00:00:00 2001
+From: Rodrigo Freire <rfreire@rf.usersys.redhat.com>
+Date: Tue, 22 Mar 2016 12:40:33 -0300
+Subject: [PATCH 210/232] lirc_rpi: Lower IR reception error to debug
+
+Lowers a IR reception error condition message to KERNEL_DEBUG
+---
+ drivers/staging/media/lirc/lirc_rpi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/staging/media/lirc/lirc_rpi.c
++++ b/drivers/staging/media/lirc/lirc_rpi.c
+@@ -271,7 +271,7 @@ static irqreturn_t irq_handler(int i, vo
+ data = PULSE_MASK; /* really long time */
+ if (!(signal^sense)) {
+ /* sanity check */
+- printk(KERN_WARNING LIRC_DRIVER_NAME
++ printk(KERN_DEBUG LIRC_DRIVER_NAME
+ ": AIEEEE: %d %d %lx %lx %lx %lx\n",
+ signal, sense, tv.tv_sec, lasttv.tv_sec,
+ tv.tv_usec, lasttv.tv_usec);
diff --git a/target/linux/brcm2708/patches-4.4/0211-vchiq_arm-Access-the-dequeue_pending-flag-locked.patch b/target/linux/brcm2708/patches-4.4/0211-vchiq_arm-Access-the-dequeue_pending-flag-locked.patch
new file mode 100644
index 0000000000..77158ea793
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0211-vchiq_arm-Access-the-dequeue_pending-flag-locked.patch
@@ -0,0 +1,58 @@
+From 26eb219f0645eb9848887ca25c0a073a9a40d852 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 23 Mar 2016 14:16:25 +0000
+Subject: [PATCH 211/232] vchiq_arm: Access the dequeue_pending flag locked
+
+Reading through this code looking for another problem (now found in userland)
+the use of dequeue_pending outside a lock didn't seem safe.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ .../misc/vc04_services/interface/vchiq_arm/vchiq_arm.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+--- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
+@@ -279,6 +279,7 @@ service_callback(VCHIQ_REASON_T reason,
+ USER_SERVICE_T *user_service;
+ VCHIQ_SERVICE_T *service;
+ VCHIQ_INSTANCE_T instance;
++ int skip_completion = 0;
+ DEBUG_INITIALISE(g_state.local)
+
+ DEBUG_TRACE(SERVICE_CALLBACK_LINE);
+@@ -345,9 +346,6 @@ service_callback(VCHIQ_REASON_T reason,
+ user_service->msg_queue[user_service->msg_insert &
+ (MSG_QUEUE_SIZE - 1)] = header;
+ user_service->msg_insert++;
+- spin_unlock(&msg_queue_spinlock);
+-
+- up(&user_service->insert_event);
+
+ /* If there is a thread waiting in DEQUEUE_MESSAGE, or if
+ ** there is a MESSAGE_AVAILABLE in the completion queue then
+@@ -356,13 +354,22 @@ service_callback(VCHIQ_REASON_T reason,
+ if (((user_service->message_available_pos -
+ instance->completion_remove) >= 0) ||
+ user_service->dequeue_pending) {
+- DEBUG_TRACE(SERVICE_CALLBACK_LINE);
+ user_service->dequeue_pending = 0;
+- return VCHIQ_SUCCESS;
++ skip_completion = 1;
+ }
+
++ spin_unlock(&msg_queue_spinlock);
++
++ up(&user_service->insert_event);
++
+ header = NULL;
+ }
++
++ if (skip_completion) {
++ DEBUG_TRACE(SERVICE_CALLBACK_LINE);
++ return VCHIQ_SUCCESS;
++ }
++
+ DEBUG_TRACE(SERVICE_CALLBACK_LINE);
+
+ return add_completion(instance, reason, header, user_service,
diff --git a/target/linux/brcm2708/patches-4.4/0212-BCM270X_DT-Add-pi3-act-led-overlay.patch b/target/linux/brcm2708/patches-4.4/0212-BCM270X_DT-Add-pi3-act-led-overlay.patch
new file mode 100644
index 0000000000..c3f0ea0930
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0212-BCM270X_DT-Add-pi3-act-led-overlay.patch
@@ -0,0 +1,94 @@
+From 10cd986960d2ad1fd881fa3338af40e612076ba4 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 23 Mar 2016 15:57:14 +0000
+Subject: [PATCH 212/232] BCM270X_DT: Add pi3-act-led overlay
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/Makefile | 1 +
+ arch/arm/boot/dts/overlays/README | 19 +++++++++++++++
+ arch/arm/boot/dts/overlays/pi3-act-led-overlay.dts | 27 ++++++++++++++++++++++
+ 3 files changed, 47 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/pi3-act-led-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -39,6 +39,7 @@ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mmc.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mz61581.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += pi3-act-led.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += pi3-disable-bt.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += pi3-miniuart-bt.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += piscreen.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -136,12 +136,14 @@ Params:
+
+ act_led_activelow Set to "on" to invert the sense of the LED
+ (default "off")
++ N.B. For Pi3 see pi3-act-led overlay.
+
+ act_led_gpio Set which GPIO to use for the activity LED
+ (in case you want to connect it to an external
+ device)
+ (default "16" on a non-Plus board, "47" on a
+ Plus or Pi 2)
++ N.B. For Pi3 see pi3-act-led overlay.
+
+ pwr_led_trigger
+ pwr_led_activelow
+@@ -499,6 +501,23 @@ Params: speed Display
+ [ The pcf8563-rtc overlay has been deleted. See i2c-rtc. ]
+
+
++Name: pi3-act-led
++Info: Pi3 uses a GPIO expander to drive the LEDs which can only be accessed
++ from the VPU. There is a special driver for this with a separate DT
++ node, which has the unfortunate consequence of breaking the
++ act_led_gpio and act_led_activelow dtparams.
++ This overlay changes the GPIO controller back to the standard one and
++ restores the dtparams.
++Load: dtoverlay=pi3-act-led,<param>=<val>
++Params: activelow Set to "on" to invert the sense of the LED
++ (default "off")
++
++ gpio Set which GPIO to use for the activity LED
++ (in case you want to connect it to an external
++ device)
++ REQUIRED
++
++
+ Name: pi3-disable-bt
+ Info: Disable Pi3 Bluetooth and restore UART0/ttyAMA0 over GPIOs 14 & 15
+ N.B. To disable the systemd service that initialises the modem so it
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/pi3-act-led-overlay.dts
+@@ -0,0 +1,27 @@
++/dts-v1/;
++/plugin/;
++
++/* Pi3 uses a GPIO expander to drive the LEDs which can only be accessed
++ from the VPU. There is a special driver for this with a separate DT node,
++ which has the unfortunate consequence of breaking the act_led_gpio and
++ act_led_activelow dtparams.
++
++ This overlay changes the GPIO controller back to the standard one and
++ restores the dtparams.
++*/
++
++/{
++ compatible = "brcm,bcm2708";
++
++ fragment@0 {
++ target = <&act_led>;
++ frag0: __overlay__ {
++ gpios = <&gpio 0 0>;
++ };
++ };
++
++ __overrides__ {
++ gpio = <&frag0>,"gpios:4";
++ activelow = <&frag0>,"gpios:8";
++ };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0213-vchiq_arm-Service-callbacks-must-not-fail.patch b/target/linux/brcm2708/patches-4.4/0213-vchiq_arm-Service-callbacks-must-not-fail.patch
new file mode 100644
index 0000000000..4979218fc0
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0213-vchiq_arm-Service-callbacks-must-not-fail.patch
@@ -0,0 +1,26 @@
+From 2faaa2ccef9e4c595bd26f14285c225ceea6097e Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 23 Mar 2016 20:53:47 +0000
+Subject: [PATCH 213/232] vchiq_arm: Service callbacks must not fail
+
+Service callbacks are not allowed to return an error. The internal callback
+that delivers events and messages to user tasks does not enqueue them if
+the service is closing, but this is not an error and should not be
+reported as such.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
+@@ -224,7 +224,7 @@ add_completion(VCHIQ_INSTANCE_T instance
+ } else if (instance->closing) {
+ vchiq_log_info(vchiq_arm_log_level,
+ "service_callback closing");
+- return VCHIQ_ERROR;
++ return VCHIQ_SUCCESS;
+ }
+ DEBUG_TRACE(SERVICE_CALLBACK_LINE);
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0214-Add-configs-and-overlay-for-PCA9548-I2C-mux.patch b/target/linux/brcm2708/patches-4.4/0214-Add-configs-and-overlay-for-PCA9548-I2C-mux.patch
new file mode 100644
index 0000000000..cb41cceee4
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0214-Add-configs-and-overlay-for-PCA9548-I2C-mux.patch
@@ -0,0 +1,133 @@
+From 09e64d48934eb812bab8667dcce81d0387092644 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <6by9@users.noreply.github.com>
+Date: Thu, 17 Mar 2016 18:16:16 +0000
+Subject: [PATCH 214/232] Add configs and overlay for PCA9548 I2C mux
+
+Adds kernel configs for I2C muxes and a dt overlay for PCA9548
+that adds the 8 muxed I2C buses and mux device.
+---
+ arch/arm/boot/dts/overlays/Makefile | 1 +
+ arch/arm/boot/dts/overlays/README | 6 ++
+ .../boot/dts/overlays/i2c-mux-pca9548a-overlay.dts | 67 ++++++++++++++++++++++
+ arch/arm/configs/bcm2709_defconfig | 2 +
+ arch/arm/configs/bcmrpi_defconfig | 2 +
+ 5 files changed, 78 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/i2c-mux-pca9548a-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -29,6 +29,7 @@ dtbo-$(RPI_DT_OVERLAYS) += hy28a.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += hy28b.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c-rtc.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c-gpio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2c-mux-pca9548a.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c0-bcm2708.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c1-bcm2708.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2s-mmap.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -360,6 +360,12 @@ Params: i2c_gpio_sda GPIO use
+ (default "2" = ~100kHz)
+
+
++Name: i2c-mux-pca9548a
++Info: Adds support for an NXP PCA9548A I2C multiplexer on i2c_arm
++Load: dtoverlay=i2c-mux-pca9548a,<param>=<val>
++Params: addr I2C address of PCA9548A (default 0x70)
++
++
+ Name: i2c-rtc
+ Info: Adds support for a number of I2C Real Time Clock devices
+ Load: dtoverlay=i2c-rtc,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/i2c-mux-pca9548a-overlay.dts
+@@ -0,0 +1,67 @@
++// Definitions for NXP PCA9548A I2C mux on ARM I2C bus.
++/dts-v1/;
++/plugin/;
++
++/{
++ compatible = "brcm,bcm2708";
++
++ fragment@0 {
++ target = <&i2c_arm>;
++ __overlay__ {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ status = "okay";
++
++ i2cmux: mux@70 {
++ compatible = "nxp,pca9548";
++ reg = <0x70>;
++ #address-cells = <1>;
++ #size-cells = <0>;
++
++ i2c@0 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <0>;
++ };
++ i2c@1 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <1>;
++ };
++ i2c@2 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <2>;
++ };
++ i2c@3 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <3>;
++ };
++ i2c@4 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <4>;
++ };
++ i2c@5 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <5>;
++ };
++ i2c@6 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <6>;
++ };
++ i2c@7 {
++ #address-cells = <1>;
++ #size-cells = <0>;
++ reg = <7>;
++ };
++ };
++ };
++ };
++ __overrides__ {
++ addr = <&i2cmux>,"reg:0";
++ };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -600,6 +600,8 @@ CONFIG_I2C=y
+ CONFIG_I2C_CHARDEV=m
+ CONFIG_I2C_BCM2708=m
+ CONFIG_I2C_GPIO=m
++CONFIG_I2C_MUX=m
++CONFIG_I2C_MUX_PCA954x=m
+ CONFIG_SPI=y
+ CONFIG_SPI_BCM2835=m
+ CONFIG_SPI_BCM2835AUX=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -593,6 +593,8 @@ CONFIG_I2C=y
+ CONFIG_I2C_CHARDEV=m
+ CONFIG_I2C_BCM2708=m
+ CONFIG_I2C_GPIO=m
++CONFIG_I2C_MUX=m
++CONFIG_I2C_MUX_PCA954x=m
+ CONFIG_SPI=y
+ CONFIG_SPI_BCM2835=m
+ CONFIG_SPI_BCM2835AUX=m
diff --git a/target/linux/brcm2708/patches-4.4/0215-BCM270X_DT-Add-DS1339-to-i2c-rtc-overlay.patch b/target/linux/brcm2708/patches-4.4/0215-BCM270X_DT-Add-DS1339-to-i2c-rtc-overlay.patch
new file mode 100644
index 0000000000..d27966fc9f
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0215-BCM270X_DT-Add-DS1339-to-i2c-rtc-overlay.patch
@@ -0,0 +1,58 @@
+From 6ec2115ccc87288132b345ab2cd05aed2d3beb97 Mon Sep 17 00:00:00 2001
+From: Nicolas Boullis <nboullis@debian.org>
+Date: Wed, 23 Mar 2016 23:40:15 +0100
+Subject: [PATCH 215/232] BCM270X_DT: Add DS1339 to i2c-rtc overlay
+
+---
+ arch/arm/boot/dts/overlays/README | 4 ++++
+ arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts | 8 ++++++++
+ 2 files changed, 12 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -371,6 +371,8 @@ Info: Adds support for a number of I2C
+ Load: dtoverlay=i2c-rtc,<param>=<val>
+ Params: ds1307 Select the DS1307 device
+
++ ds1339 Select the DS1339 device
++
+ ds3231 Select the DS3231 device
+
+ mcp7941x Select the MCP7941x device
+@@ -381,6 +383,8 @@ Params: ds1307 Select t
+
+ pcf8563 Select the PCF8563 device
+
++ trickle-resistor-ohms Resistor value for trickle charge (DS1339-only)
++
+
+ Name: i2c0-bcm2708
+ Info: Enable the i2c_bcm2708 driver for the i2c0 bus
+--- a/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts
+@@ -17,6 +17,12 @@
+ reg = <0x68>;
+ status = "disable";
+ };
++ ds1339: ds1339@68 {
++ compatible = "dallas,ds1339";
++ trickle-resistor-ohms = <0>;
++ reg = <0x68>;
++ status = "disable";
++ };
+ mcp7941x: mcp7941x@6f {
+ compatible = "microchip,mcp7941x";
+ reg = <0x6f>;
+@@ -46,10 +52,12 @@
+ };
+ __overrides__ {
+ ds1307 = <&ds1307>,"status";
++ ds1339 = <&ds1339>,"status";
+ ds3231 = <&ds3231>,"status";
+ mcp7941x = <&mcp7941x>,"status";
+ pcf2127 = <&pcf2127>,"status";
+ pcf8523 = <&pcf8523>,"status";
+ pcf8563 = <&pcf8563>,"status";
++ trickle-resistor-ohms = <&ds1339>,"trickle-resistor-ohms:0";
+ };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0216-copy_from_user-CPU_SW_DOMAIN_PAN-compatibility.patch b/target/linux/brcm2708/patches-4.4/0216-copy_from_user-CPU_SW_DOMAIN_PAN-compatibility.patch
new file mode 100644
index 0000000000..5ead9b2338
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0216-copy_from_user-CPU_SW_DOMAIN_PAN-compatibility.patch
@@ -0,0 +1,53 @@
+From a160443a0d967ea6394cd0d1b7a0ab8ef2da3ff1 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 29 Mar 2016 15:32:30 +0100
+Subject: [PATCH 216/232] copy_from_user: CPU_SW_DOMAIN_PAN compatibility
+
+The downstream copy_from_user acceleration must also play nice with
+CONFIG_CPU_SW_DOMAIN_PAN.
+
+See: https://github.com/raspberrypi/linux/issues/1381
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/lib/uaccess_with_memcpy.c | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+--- a/arch/arm/lib/uaccess_with_memcpy.c
++++ b/arch/arm/lib/uaccess_with_memcpy.c
+@@ -186,6 +186,7 @@ out:
+ unsigned long noinline
+ __copy_from_user_memcpy(void *to, const void __user *from, unsigned long n)
+ {
++ unsigned long ua_flags;
+ int atomic;
+
+ if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
+@@ -217,7 +218,9 @@ __copy_from_user_memcpy(void *to, const
+ if (tocopy > n)
+ tocopy = n;
+
++ ua_flags = uaccess_save_and_enable();
+ memcpy(to, (const void *)from, tocopy);
++ uaccess_restore(ua_flags);
+ to += tocopy;
+ from += tocopy;
+ n -= tocopy;
+@@ -261,9 +264,14 @@ arm_copy_from_user(void *to, const void
+ * With frame pointer disabled, tail call optimization kicks in
+ * as well making this test almost invisible.
+ */
+- if (n < COPY_FROM_USER_THRESHOLD)
+- return __copy_from_user_std(to, from, n);
+- return __copy_from_user_memcpy(to, from, n);
++ if (n < COPY_TO_USER_THRESHOLD) {
++ unsigned long ua_flags = uaccess_save_and_enable();
++ n = __copy_from_user_std(to, from, n);
++ uaccess_restore(ua_flags);
++ } else {
++ n = __copy_from_user_memcpy(to, from, n);
++ }
++ return n;
+ }
+
+ static unsigned long noinline
diff --git a/target/linux/brcm2708/patches-4.4/0217-bcm2835-sdhost-Adjust-to-core-clock-changes.patch b/target/linux/brcm2708/patches-4.4/0217-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
new file mode 100644
index 0000000000..f671944f15
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0217-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
@@ -0,0 +1,339 @@
+From 4b89d07fd299a0f4e25321920cb74416ba2e638e Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 30 Mar 2016 16:33:09 +0100
+Subject: [PATCH 217/232] bcm2835-sdhost: Adjust to core clock changes
+
+The SDHOST block uses the core clock, so previously it has been
+necessary to prevent the core clock from changing in order to maintain
+performance and prevent accidental SD bus overclocking.
+
+With this patch the sdhost driver is notified of clock changes, allowing
+it to delay them while an SD access is outstanding and to delay new SD
+accesses while the clock is changing. This feature is disabled in the
+case where the core frequency can never change.
+
+Now that the driver copes with changes to the core clock, it is safe
+to disable the io_is_busy feature of the on-demand governor.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/host/Kconfig | 1 +
+ drivers/mmc/host/bcm2835-sdhost.c | 140 ++++++++++++++++++++++++++++++++------
+ 2 files changed, 119 insertions(+), 22 deletions(-)
+
+--- a/drivers/mmc/host/Kconfig
++++ b/drivers/mmc/host/Kconfig
+@@ -36,6 +36,7 @@ config MMC_BCM2835_PIO_DMA_BARRIER
+ config MMC_BCM2835_SDHOST
+ tristate "Support for the SDHost controller on BCM2708/9"
+ depends on MACH_BCM2708 || MACH_BCM2709 || ARCH_BCM2835
++ depends on RASPBERRYPI_FIRMWARE
+ help
+ This selects the SDHost controller on BCM2835/6.
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -50,6 +50,10 @@
+ #include <linux/of_dma.h>
+ #include <linux/time.h>
+ #include <linux/workqueue.h>
++#include <linux/cpufreq.h>
++#include <linux/semaphore.h>
++#include <soc/bcm2835/raspberrypi-firmware.h>
++
+
+ #define DRIVER_NAME "sdhost-bcm2835"
+
+@@ -136,6 +140,8 @@
+
+ #define MHZ 1000000
+
++#define RPI_FIRMWARE_CLOCK_CORE 4
++
+
+ struct bcm2835_host {
+ spinlock_t lock;
+@@ -151,7 +157,9 @@ struct bcm2835_host {
+
+ bool slow_card; /* Force 11-bit divisor */
+
+- unsigned int max_clk; /* Max possible freq */
++ unsigned int max_clk; /* Max src clock freq */
++ unsigned int min_clk; /* Min src clock freq */
++ unsigned int cur_clk; /* Current src clock freq */
+
+ struct tasklet_struct finish_tasklet; /* Tasklet structures */
+
+@@ -183,6 +191,7 @@ struct bcm2835_host {
+ unsigned int use_sbc:1; /* Send CMD23 */
+
+ unsigned int debug:1; /* Enable debug output */
++ unsigned int variable_clock:1; /* The core clock may change */
+
+ /*DMA part*/
+ struct dma_chan *dma_chan_rxtx; /* DMA channel for reads and writes */
+@@ -208,6 +217,9 @@ struct bcm2835_host {
+ u32 pio_limit; /* Maximum block count for PIO (0 = always DMA) */
+
+ u32 sectors; /* Cached card size in sectors */
++
++ struct notifier_block cpufreq_nb; /* The cpufreq callback list item */
++ struct semaphore cpufreq_semaphore; /* Interlock between SD activity and cpufreq changes */
+ };
+
+ #if ENABLE_LOG
+@@ -227,6 +239,10 @@ static u32 sdhost_log_idx;
+ static spinlock_t log_lock;
+ static void __iomem *timer_base;
+
++static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
++ unsigned long action, void *data);
++static unsigned int get_core_clock(unsigned int mode);
++
+ #define LOG_ENTRIES (256*1)
+ #define LOG_SIZE (sizeof(LOG_ENTRY_T)*LOG_ENTRIES)
+
+@@ -448,20 +464,14 @@ static void bcm2835_sdhost_reset(struct
+
+ static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios);
+
+-static void bcm2835_sdhost_init(struct bcm2835_host *host, int soft)
++static void bcm2835_sdhost_init(struct bcm2835_host *host)
+ {
+- pr_debug("bcm2835_sdhost_init(%d)\n", soft);
++ pr_debug("bcm2835_sdhost_init()\n");
+
+ /* Set interrupt enables */
+ host->hcfg = SDHCFG_BUSY_IRPT_EN;
+
+ bcm2835_sdhost_reset_internal(host);
+-
+- if (soft) {
+- /* force clock reconfiguration */
+- host->clock = 0;
+- bcm2835_sdhost_set_ios(host->mmc, &host->mmc->ios);
+- }
+ }
+
+ static void bcm2835_sdhost_wait_transfer_complete(struct bcm2835_host *host)
+@@ -1499,10 +1509,10 @@ static irqreturn_t bcm2835_sdhost_irq(in
+ return result;
+ }
+
+-void bcm2835_sdhost_set_clock(struct bcm2835_host *host, unsigned int clock)
++void bcm2835_sdhost_set_clock(struct bcm2835_host *host)
+ {
+ int div = 0; /* Initialized for compiler warning */
+- unsigned int input_clock = clock;
++ unsigned int clock = host->clock;
+
+ if (host->debug)
+ pr_info("%s: set_clock(%d)\n", mmc_hostname(host->mmc), clock);
+@@ -1543,17 +1553,17 @@ void bcm2835_sdhost_set_clock(struct bcm
+ return;
+ }
+
+- div = host->max_clk / clock;
++ div = host->cur_clk / clock;
+ if (div < 2)
+ div = 2;
+- if ((host->max_clk / div) > clock)
++ if ((host->cur_clk / div) > clock)
+ div++;
+ div -= 2;
+
+ if (div > SDCDIV_MAX_CDIV)
+ div = SDCDIV_MAX_CDIV;
+
+- clock = host->max_clk / (div + 2);
++ clock = host->cur_clk / (div + 2);
+ host->mmc->actual_clock = clock;
+
+ /* Calibrate some delays */
+@@ -1561,7 +1571,7 @@ void bcm2835_sdhost_set_clock(struct bcm
+ host->ns_per_fifo_word = (1000000000/clock) *
+ ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
+
+- if (clock > input_clock) {
++ if (clock > host->clock) {
+ /* Save the closest value, to make it easier
+ to reduce in the event of error */
+ host->overclock_50 = (clock/MHZ);
+@@ -1587,9 +1597,9 @@ void bcm2835_sdhost_set_clock(struct bcm
+ bcm2835_sdhost_write(host, host->mmc->actual_clock/2, SDTOUT);
+
+ if (host->debug)
+- pr_info("%s: clock=%d -> max_clk=%d, cdiv=%x (actual clock %d)\n",
+- mmc_hostname(host->mmc), input_clock,
+- host->max_clk, host->cdiv, host->mmc->actual_clock);
++ pr_info("%s: clock=%d -> cur_clk=%d, cdiv=%x (actual clock %d)\n",
++ mmc_hostname(host->mmc), host->clock,
++ host->cur_clk, host->cdiv, host->mmc->actual_clock);
+ }
+
+ static void bcm2835_sdhost_request(struct mmc_host *mmc, struct mmc_request *mrq)
+@@ -1638,6 +1648,13 @@ static void bcm2835_sdhost_request(struc
+ (mrq->data->blocks > host->pio_limit))
+ bcm2835_sdhost_prepare_dma(host, mrq->data);
+
++ if (host->variable_clock &&
++ (down_killable(&host->cpufreq_semaphore) != 0)) {
++ mrq->cmd->error = -EINTR;
++ mmc_request_done(mmc, mrq);
++ return;
++ }
++
+ spin_lock_irqsave(&host->lock, flags);
+
+ WARN_ON(host->mrq != NULL);
+@@ -1687,6 +1704,52 @@ static void bcm2835_sdhost_request(struc
+ spin_unlock_irqrestore(&host->lock, flags);
+ }
+
++static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
++ unsigned long action, void *data)
++{
++ struct cpufreq_freqs *freq = data;
++ struct bcm2835_host *host;
++
++ host = container_of(nb, struct bcm2835_host, cpufreq_nb);
++
++ if (freq->cpu == 0) {
++ switch (action) {
++ case CPUFREQ_PRECHANGE:
++ if (down_killable(&host->cpufreq_semaphore) != 0)
++ return NOTIFY_BAD;
++ break;
++ case CPUFREQ_POSTCHANGE:
++ if (freq->new > freq->old)
++ host->cur_clk = host->max_clk;
++ else
++ host->cur_clk = host->min_clk;
++ bcm2835_sdhost_set_clock(host);
++ up(&host->cpufreq_semaphore);
++ break;
++ default:
++ break;
++ }
++ }
++ return NOTIFY_OK;
++}
++
++static unsigned int get_core_clock(unsigned int mode)
++{
++ struct rpi_firmware *fw = rpi_firmware_get(NULL);
++ struct {
++ u32 id;
++ u32 val;
++ } packet;
++ int ret;
++
++ packet.id = RPI_FIRMWARE_CLOCK_CORE;
++ ret = rpi_firmware_property(fw, mode, &packet, sizeof(packet));
++ if (ret)
++ return 0;
++
++ return packet.val;
++}
++
+ static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+ {
+
+@@ -1700,13 +1763,16 @@ static void bcm2835_sdhost_set_ios(struc
+ ios->clock, ios->power_mode, ios->bus_width,
+ ios->timing, ios->signal_voltage, ios->drv_type);
+
++ if (ios->clock && !host->cur_clk)
++ host->cur_clk = get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
++
+ spin_lock_irqsave(&host->lock, flags);
+
+ log_event("IOS<", ios->clock, 0);
+
+ if (!ios->clock || ios->clock != host->clock) {
+- bcm2835_sdhost_set_clock(host, ios->clock);
+ host->clock = ios->clock;
++ bcm2835_sdhost_set_clock(host);
+ }
+
+ /* set bus width */
+@@ -1795,7 +1861,7 @@ static void bcm2835_sdhost_tasklet_finis
+ host->overclock_50--;
+ pr_warn("%s: reducing overclock due to errors\n",
+ mmc_hostname(host->mmc));
+- bcm2835_sdhost_set_clock(host,50*MHZ);
++ bcm2835_sdhost_set_clock(host);
+ mrq->cmd->error = -EILSEQ;
+ mrq->cmd->retries = 1;
+ }
+@@ -1813,6 +1879,9 @@ static void bcm2835_sdhost_tasklet_finis
+
+ spin_unlock_irqrestore(&host->lock, flags);
+
++ if (host->variable_clock)
++ up(&host->cpufreq_semaphore);
++
+ if (terminate_chan)
+ {
+ int err = dmaengine_terminate_all(terminate_chan);
+@@ -1915,10 +1984,10 @@ int bcm2835_sdhost_add_host(struct bcm28
+ setup_timer(&host->timer, bcm2835_sdhost_timeout,
+ (unsigned long)host);
+
+- bcm2835_sdhost_init(host, 0);
++ bcm2835_sdhost_init(host);
+
+ ret = request_irq(host->irq, bcm2835_sdhost_irq, 0 /*IRQF_SHARED*/,
+- mmc_hostname(mmc), host);
++ mmc_hostname(mmc), host);
+ if (ret) {
+ pr_err("%s: failed to request IRQ %d: %d\n",
+ mmc_hostname(mmc), host->irq, ret);
+@@ -1953,6 +2022,7 @@ static int bcm2835_sdhost_probe(struct p
+ struct bcm2835_host *host;
+ struct mmc_host *mmc;
+ const __be32 *addr;
++ unsigned int max_clk;
+ int ret;
+
+ pr_debug("bcm2835_sdhost_probe\n");
+@@ -2062,6 +2132,28 @@ static int bcm2835_sdhost_probe(struct p
+ if (ret)
+ goto err;
+
++ /* Query the core clock frequencies */
++ host->min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
++ max_clk = get_core_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE);
++ if (max_clk != host->max_clk) {
++ pr_warn("%s: Expected max clock %d, found %d\n",
++ mmc_hostname(mmc), host->max_clk, max_clk);
++ host->max_clk = max_clk;
++ }
++
++ if (host->min_clk != host->max_clk) {
++ host->cpufreq_nb.notifier_call =
++ bcm2835_sdhost_cpufreq_callback;
++ sema_init(&host->cpufreq_semaphore, 1);
++ cpufreq_register_notifier(&host->cpufreq_nb,
++ CPUFREQ_TRANSITION_NOTIFIER);
++ host->variable_clock = 1;
++ host->cur_clk = 0; /* Get this later */
++ } else {
++ host->variable_clock = 0;
++ host->cur_clk = host->max_clk;
++ }
++
+ platform_set_drvdata(pdev, host);
+
+ pr_debug("bcm2835_sdhost_probe -> OK\n");
+@@ -2081,6 +2173,10 @@ static int bcm2835_sdhost_remove(struct
+
+ pr_debug("bcm2835_sdhost_remove\n");
+
++ if (host->variable_clock)
++ cpufreq_unregister_notifier(&host->cpufreq_nb,
++ CPUFREQ_TRANSITION_NOTIFIER);
++
+ mmc_remove_host(host->mmc);
+
+ bcm2835_sdhost_set_power(host, false);
diff --git a/target/linux/brcm2708/patches-4.4/0218-BCM270X_DT-Document-hazards-of-sdhost-overlay.patch b/target/linux/brcm2708/patches-4.4/0218-BCM270X_DT-Document-hazards-of-sdhost-overlay.patch
new file mode 100644
index 0000000000..1686969631
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0218-BCM270X_DT-Document-hazards-of-sdhost-overlay.patch
@@ -0,0 +1,34 @@
+From 73f4b796019a7e9b7314851657aebd5f92f3ff75 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 30 Mar 2016 17:07:15 +0100
+Subject: [PATCH 218/232] BCM270X_DT: Document hazards of sdhost overlay
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/README | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -712,7 +712,11 @@ Params: <None>
+
+
+ Name: sdhost
+-Info: Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock
++Info: Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock.
++ N.B. This overlay is designed for situations where the mmc driver is
++ the default, so it disables the other (mmc) interface - this will kill
++ WiFi on a Pi3. If this isn't what you want, either use the sdtweak
++ overlay or the new sd_* dtparams of the base DTBs.
+ Load: dtoverlay=sdhost,<param>=<val>
+ Params: overclock_50 Clock (in MHz) to use when the MMC framework
+ requests 50MHz
+@@ -771,6 +775,8 @@ Params: overclock_50 SD Clock
+
+ Name: sdtweak
+ Info: Tunes the bcm2835-sdhost SD/MMC driver
++ N.B. This functionality is now available via the sd_* dtparams in the
++ base DTB.
+ Load: dtoverlay=sdtweak,<param>=<val>
+ Params: overclock_50 Clock (in MHz) to use when the MMC framework
+ requests 50MHz
diff --git a/target/linux/brcm2708/patches-4.4/0219-cpufreq-Temporarily-ignore-io_is_busy-1.patch b/target/linux/brcm2708/patches-4.4/0219-cpufreq-Temporarily-ignore-io_is_busy-1.patch
new file mode 100644
index 0000000000..c6938b4206
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0219-cpufreq-Temporarily-ignore-io_is_busy-1.patch
@@ -0,0 +1,31 @@
+From 2af1218a8a0220fec526f64d03977b8451afb4c8 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 30 Mar 2016 17:23:15 +0100
+Subject: [PATCH 219/232] cpufreq: Temporarily ignore io_is_busy=1
+
+To speed testing of the new sdhost driver that adapts to changes in
+core_freq, hack the on-demand governor to treat io_is_busy=1 as
+io_is_busy=0. The io_is_busy feature can still be forced using
+io_is_busy=2.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/cpufreq/cpufreq_ondemand.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/cpufreq/cpufreq_ondemand.c
++++ b/drivers/cpufreq/cpufreq_ondemand.c
+@@ -307,7 +307,12 @@ static ssize_t store_io_is_busy(struct d
+ ret = sscanf(buf, "%u", &input);
+ if (ret != 1)
+ return -EINVAL;
+- od_tuners->io_is_busy = !!input;
++ // XXX temporary hack
++ if (input > 1)
++ input = 1;
++ else
++ input = 0;
++ od_tuners->io_is_busy = input;
+
+ /* we need to re-evaluate prev_cpu_idle */
+ for_each_online_cpu(j) {
diff --git a/target/linux/brcm2708/patches-4.4/0220-Revert-cpufreq-Temporarily-ignore-io_is_busy-1.patch b/target/linux/brcm2708/patches-4.4/0220-Revert-cpufreq-Temporarily-ignore-io_is_busy-1.patch
new file mode 100644
index 0000000000..423b801ce8
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0220-Revert-cpufreq-Temporarily-ignore-io_is_busy-1.patch
@@ -0,0 +1,26 @@
+From c353af0f83220068c10f6593b1767576b9b6cc18 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 30 Mar 2016 20:18:38 +0100
+Subject: [PATCH 220/232] Revert "cpufreq: Temporarily ignore io_is_busy=1"
+
+This reverts commit 2af1218a8a0220fec526f64d03977b8451afb4c8.
+---
+ drivers/cpufreq/cpufreq_ondemand.c | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+--- a/drivers/cpufreq/cpufreq_ondemand.c
++++ b/drivers/cpufreq/cpufreq_ondemand.c
+@@ -307,12 +307,7 @@ static ssize_t store_io_is_busy(struct d
+ ret = sscanf(buf, "%u", &input);
+ if (ret != 1)
+ return -EINVAL;
+- // XXX temporary hack
+- if (input > 1)
+- input = 1;
+- else
+- input = 0;
+- od_tuners->io_is_busy = input;
++ od_tuners->io_is_busy = !!input;
+
+ /* we need to re-evaluate prev_cpu_idle */
+ for_each_online_cpu(j) {
diff --git a/target/linux/brcm2708/patches-4.4/0221-net-sched-add-skb_at_tc_ingress-helper.patch b/target/linux/brcm2708/patches-4.4/0221-net-sched-add-skb_at_tc_ingress-helper.patch
new file mode 100644
index 0000000000..df8f3dc0e1
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0221-net-sched-add-skb_at_tc_ingress-helper.patch
@@ -0,0 +1,50 @@
+From a436f21ba8e57517734c24d2b571d5aed888be36 Mon Sep 17 00:00:00 2001
+From: Daniel Borkmann <daniel@iogearbox.net>
+Date: Thu, 7 Jan 2016 15:50:22 +0100
+Subject: [PATCH 221/232] net, sched: add skb_at_tc_ingress helper
+
+Add a skb_at_tc_ingress() as this will be needed elsewhere as well and
+can hide the ugly ifdef.
+
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ include/net/sch_generic.h | 9 +++++++++
+ net/sched/cls_bpf.c | 6 +-----
+ 2 files changed, 10 insertions(+), 5 deletions(-)
+
+--- a/include/net/sch_generic.h
++++ b/include/net/sch_generic.h
+@@ -408,6 +408,15 @@ bool tcf_destroy(struct tcf_proto *tp, b
+ void tcf_destroy_chain(struct tcf_proto __rcu **fl);
+ int skb_do_redirect(struct sk_buff *);
+
++static inline bool skb_at_tc_ingress(const struct sk_buff *skb)
++{
++#ifdef CONFIG_NET_CLS_ACT
++ return G_TC_AT(skb->tc_verd) & AT_INGRESS;
++#else
++ return false;
++#endif
++}
++
+ /* Reset all TX qdiscs greater then index of a device. */
+ static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
+ {
+--- a/net/sched/cls_bpf.c
++++ b/net/sched/cls_bpf.c
+@@ -79,12 +79,8 @@ static int cls_bpf_classify(struct sk_bu
+ struct tcf_result *res)
+ {
+ struct cls_bpf_head *head = rcu_dereference_bh(tp->root);
++ bool at_ingress = skb_at_tc_ingress(skb);
+ struct cls_bpf_prog *prog;
+-#ifdef CONFIG_NET_CLS_ACT
+- bool at_ingress = G_TC_AT(skb->tc_verd) & AT_INGRESS;
+-#else
+- bool at_ingress = false;
+-#endif
+ int ret = -1;
+
+ if (unlikely(!skb_mac_header_was_set(skb)))
diff --git a/target/linux/brcm2708/patches-4.4/0222-net-fix-bridge-multicast-packet-checksum-validation.patch b/target/linux/brcm2708/patches-4.4/0222-net-fix-bridge-multicast-packet-checksum-validation.patch
new file mode 100644
index 0000000000..b3f105be02
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0222-net-fix-bridge-multicast-packet-checksum-validation.patch
@@ -0,0 +1,75 @@
+From 966e306c7690f118bedf2f5de94e22e487bd39ec Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
+Date: Wed, 24 Feb 2016 04:21:42 +0100
+Subject: [PATCH 222/232] net: fix bridge multicast packet checksum validation
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We need to update the skb->csum after pulling the skb, otherwise
+an unnecessary checksum (re)computation can ocure for IGMP/MLD packets
+in the bridge code. Additionally this fixes the following splats for
+network devices / bridge ports with support for and enabled RX checksum
+offloading:
+
+[...]
+[ 43.986968] eth0: hw csum failure
+[ 43.990344] CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.4.0 #2
+[ 43.996193] Hardware name: BCM2709
+[ 43.999647] [<800204e0>] (unwind_backtrace) from [<8001cf14>] (show_stack+0x10/0x14)
+[ 44.007432] [<8001cf14>] (show_stack) from [<801ab614>] (dump_stack+0x80/0x90)
+[ 44.014695] [<801ab614>] (dump_stack) from [<802e4548>] (__skb_checksum_complete+0x6c/0xac)
+[ 44.023090] [<802e4548>] (__skb_checksum_complete) from [<803a055c>] (ipv6_mc_validate_checksum+0x104/0x178)
+[ 44.032959] [<803a055c>] (ipv6_mc_validate_checksum) from [<802e111c>] (skb_checksum_trimmed+0x130/0x188)
+[ 44.042565] [<802e111c>] (skb_checksum_trimmed) from [<803a06e8>] (ipv6_mc_check_mld+0x118/0x338)
+[ 44.051501] [<803a06e8>] (ipv6_mc_check_mld) from [<803b2c98>] (br_multicast_rcv+0x5dc/0xd00)
+[ 44.060077] [<803b2c98>] (br_multicast_rcv) from [<803aa510>] (br_handle_frame_finish+0xac/0x51c)
+[...]
+
+Fixes: 9afd85c9e455 ("net: Export IGMP/MLD message validation code")
+Reported-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ net/core/skbuff.c | 22 ++++++++++++++++++++--
+ 1 file changed, 20 insertions(+), 2 deletions(-)
+
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -2965,6 +2965,24 @@ int skb_append_pagefrags(struct sk_buff
+ EXPORT_SYMBOL_GPL(skb_append_pagefrags);
+
+ /**
++ * skb_push_rcsum - push skb and update receive checksum
++ * @skb: buffer to update
++ * @len: length of data pulled
++ *
++ * This function performs an skb_push on the packet and updates
++ * the CHECKSUM_COMPLETE checksum. It should be used on
++ * receive path processing instead of skb_push unless you know
++ * that the checksum difference is zero (e.g., a valid IP header)
++ * or you are setting ip_summed to CHECKSUM_NONE.
++ */
++static unsigned char *skb_push_rcsum(struct sk_buff *skb, unsigned len)
++{
++ skb_push(skb, len);
++ skb_postpush_rcsum(skb, skb->data, len);
++ return skb->data;
++}
++
++/**
+ * skb_pull_rcsum - pull skb and update receive checksum
+ * @skb: buffer to update
+ * @len: length of data pulled
+@@ -4101,9 +4119,9 @@ struct sk_buff *skb_checksum_trimmed(str
+ if (!pskb_may_pull(skb_chk, offset))
+ goto err;
+
+- __skb_pull(skb_chk, offset);
++ skb_pull_rcsum(skb_chk, offset);
+ ret = skb_chkf(skb_chk);
+- __skb_push(skb_chk, offset);
++ skb_push_rcsum(skb_chk, offset);
+
+ if (ret)
+ goto err;
diff --git a/target/linux/brcm2708/patches-4.4/0223-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch b/target/linux/brcm2708/patches-4.4/0223-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch
new file mode 100644
index 0000000000..1793d5e109
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0223-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch
@@ -0,0 +1,124 @@
+From 7ce01cd3013b7c9f1b257a6033b6d1f67fed5b5c Mon Sep 17 00:00:00 2001
+From: Daniel Borkmann <daniel@iogearbox.net>
+Date: Thu, 7 Jan 2016 15:50:23 +0100
+Subject: [PATCH 223/232] bpf: add skb_postpush_rcsum and fix dev_forward_skb
+ occasions
+
+Add a small helper skb_postpush_rcsum() and fix up redirect locations
+that need CHECKSUM_COMPLETE fixups on ingress. dev_forward_skb() expects
+a proper csum that covers also Ethernet header, f.e. since 2c26d34bbcc0
+("net/core: Handle csum for CHECKSUM_COMPLETE VXLAN forwarding"), we
+also do skb_postpull_rcsum() after pulling Ethernet header off via
+eth_type_trans().
+
+When using eBPF in a netns setup f.e. with vxlan in collect metadata mode,
+I can trigger the following csum issue with an IPv6 setup:
+
+ [ 505.144065] dummy1: hw csum failure
+ [...]
+ [ 505.144108] Call Trace:
+ [ 505.144112] <IRQ> [<ffffffff81372f08>] dump_stack+0x44/0x5c
+ [ 505.144134] [<ffffffff81607cea>] netdev_rx_csum_fault+0x3a/0x40
+ [ 505.144142] [<ffffffff815fee3f>] __skb_checksum_complete+0xcf/0xe0
+ [ 505.144149] [<ffffffff816f0902>] nf_ip6_checksum+0xb2/0x120
+ [ 505.144161] [<ffffffffa08c0e0e>] icmpv6_error+0x17e/0x328 [nf_conntrack_ipv6]
+ [ 505.144170] [<ffffffffa0898eca>] ? ip6t_do_table+0x2fa/0x645 [ip6_tables]
+ [ 505.144177] [<ffffffffa08c0725>] ? ipv6_get_l4proto+0x65/0xd0 [nf_conntrack_ipv6]
+ [ 505.144189] [<ffffffffa06c9a12>] nf_conntrack_in+0xc2/0x5a0 [nf_conntrack]
+ [ 505.144196] [<ffffffffa08c039c>] ipv6_conntrack_in+0x1c/0x20 [nf_conntrack_ipv6]
+ [ 505.144204] [<ffffffff8164385d>] nf_iterate+0x5d/0x70
+ [ 505.144210] [<ffffffff816438d6>] nf_hook_slow+0x66/0xc0
+ [ 505.144218] [<ffffffff816bd302>] ipv6_rcv+0x3f2/0x4f0
+ [ 505.144225] [<ffffffff816bca40>] ? ip6_make_skb+0x1b0/0x1b0
+ [ 505.144232] [<ffffffff8160b77b>] __netif_receive_skb_core+0x36b/0x9a0
+ [ 505.144239] [<ffffffff8160bdc8>] ? __netif_receive_skb+0x18/0x60
+ [ 505.144245] [<ffffffff8160bdc8>] __netif_receive_skb+0x18/0x60
+ [ 505.144252] [<ffffffff8160ccff>] process_backlog+0x9f/0x140
+ [ 505.144259] [<ffffffff8160c4a5>] net_rx_action+0x145/0x320
+ [...]
+
+What happens is that on ingress, we push Ethernet header back in, either
+from cls_bpf or right before skb_do_redirect(), but without updating csum.
+The "hw csum failure" can be fixed by using the new skb_postpush_rcsum()
+helper for the dev_forward_skb() case to correct the csum diff again.
+
+Thanks to Hannes Frederic Sowa for the csum_partial() idea!
+
+Fixes: 3896d655f4d4 ("bpf: introduce bpf_clone_redirect() helper")
+Fixes: 27b29f63058d ("bpf: add bpf_redirect() helper")
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Acked-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ include/linux/skbuff.h | 17 +++++++++++++++++
+ net/core/filter.c | 17 +++++++++++++----
+ 2 files changed, 30 insertions(+), 4 deletions(-)
+
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -2737,6 +2737,23 @@ static inline void skb_postpull_rcsum(st
+
+ unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
+
++static inline void skb_postpush_rcsum(struct sk_buff *skb,
++ const void *start, unsigned int len)
++{
++ /* For performing the reverse operation to skb_postpull_rcsum(),
++ * we can instead of ...
++ *
++ * skb->csum = csum_add(skb->csum, csum_partial(start, len, 0));
++ *
++ * ... just use this equivalent version here to save a few
++ * instructions. Feeding csum of 0 in csum_partial() and later
++ * on adding skb->csum is equivalent to feed skb->csum in the
++ * first place.
++ */
++ if (skb->ip_summed == CHECKSUM_COMPLETE)
++ skb->csum = csum_partial(start, len, skb->csum);
++}
++
+ /**
+ * pskb_trim_rcsum - trim received skb and update checksum
+ * @skb: buffer to trim
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -1288,8 +1288,9 @@ static u64 bpf_skb_store_bytes(u64 r1, u
+ /* skb_store_bits cannot return -EFAULT here */
+ skb_store_bits(skb, offset, ptr, len);
+
+- if (BPF_RECOMPUTE_CSUM(flags) && skb->ip_summed == CHECKSUM_COMPLETE)
+- skb->csum = csum_add(skb->csum, csum_partial(ptr, len, 0));
++ if (BPF_RECOMPUTE_CSUM(flags))
++ skb_postpush_rcsum(skb, ptr, len);
++
+ return 0;
+ }
+
+@@ -1415,8 +1416,12 @@ static u64 bpf_clone_redirect(u64 r1, u6
+ if (unlikely(!skb2))
+ return -ENOMEM;
+
+- if (BPF_IS_REDIRECT_INGRESS(flags))
++ if (BPF_IS_REDIRECT_INGRESS(flags)) {
++ if (skb_at_tc_ingress(skb2))
++ skb_postpush_rcsum(skb2, skb_mac_header(skb2),
++ skb2->mac_len);
+ return dev_forward_skb(dev, skb2);
++ }
+
+ skb2->dev = dev;
+ skb_sender_cpu_clear(skb2);
+@@ -1459,8 +1464,12 @@ int skb_do_redirect(struct sk_buff *skb)
+ return -EINVAL;
+ }
+
+- if (BPF_IS_REDIRECT_INGRESS(ri->flags))
++ if (BPF_IS_REDIRECT_INGRESS(ri->flags)) {
++ if (skb_at_tc_ingress(skb))
++ skb_postpush_rcsum(skb, skb_mac_header(skb),
++ skb->mac_len);
+ return dev_forward_skb(dev, skb);
++ }
+
+ skb->dev = dev;
+ skb_sender_cpu_clear(skb);
diff --git a/target/linux/brcm2708/patches-4.4/0224-bcm2835-sdhost-Precalc-divisors-and-overclocks.patch b/target/linux/brcm2708/patches-4.4/0224-bcm2835-sdhost-Precalc-divisors-and-overclocks.patch
new file mode 100644
index 0000000000..14c2e8c861
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0224-bcm2835-sdhost-Precalc-divisors-and-overclocks.patch
@@ -0,0 +1,270 @@
+From 20260462773366a5734e5268dae0a4c179a21a2d Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 31 Mar 2016 15:44:53 +0100
+Subject: [PATCH 224/232] bcm2835-sdhost: Precalc divisors and overclocks
+
+Recalculating the clock divisors when the core clock changes is wasteful
+and makes it harder to manage the overclock settings. Instead,
+precalculate them and only report significant changes.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/host/bcm2835-sdhost.c | 152 ++++++++++++++++++++++----------------
+ 1 file changed, 88 insertions(+), 64 deletions(-)
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -154,12 +154,15 @@ struct bcm2835_host {
+ u32 pio_timeout; /* In jiffies */
+
+ int clock; /* Current clock speed */
++ int clocks[2];
+
+ bool slow_card; /* Force 11-bit divisor */
+
+ unsigned int max_clk; /* Max src clock freq */
+- unsigned int min_clk; /* Min src clock freq */
+- unsigned int cur_clk; /* Current src clock freq */
++ unsigned int src_clks[2]; /* Min/max src clock freqs */
++ unsigned int cur_clk_idx; /* Index of current clock */
++ unsigned int next_clk_idx; /* Next clock index */
++ unsigned int cdivs[2];
+
+ struct tasklet_struct finish_tasklet; /* Tasklet structures */
+
+@@ -213,7 +216,7 @@ struct bcm2835_host {
+ u32 delay_after_stop; /* minimum time between stop and subsequent data transfer */
+ u32 delay_after_this_stop; /* minimum time between this stop and subsequent data transfer */
+ u32 overclock_50; /* frequency to use when 50MHz is requested (in MHz) */
+- u32 overclock; /* Current frequency if overclocked, else zero */
++ u32 prev_overclock_50;
+ u32 pio_limit; /* Maximum block count for PIO (0 = always DMA) */
+
+ u32 sectors; /* Cached card size in sectors */
+@@ -1509,10 +1512,35 @@ static irqreturn_t bcm2835_sdhost_irq(in
+ return result;
+ }
+
++static void bcm2835_sdhost_select_clock(struct bcm2835_host *host, int idx)
++{
++ unsigned int clock = host->clocks[idx];
++ unsigned int cdiv = host->cdivs[idx];
++
++ host->mmc->actual_clock = clock;
++ host->ns_per_fifo_word = (1000000000/clock) *
++ ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
++
++ host->cdiv = cdiv;
++ bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
++
++ /* Set the timeout to 500ms */
++ bcm2835_sdhost_write(host, clock/2, SDTOUT);
++
++ host->cur_clk_idx = host->next_clk_idx = idx;
++
++ if (host->debug)
++ pr_info("%s: clock=%d -> src_clk=%d, cdiv=%x (actual %d)\n",
++ mmc_hostname(host->mmc), host->clock,
++ host->src_clks[idx], host->cdiv,
++ host->mmc->actual_clock);
++}
++
+ void bcm2835_sdhost_set_clock(struct bcm2835_host *host)
+ {
+ int div = 0; /* Initialized for compiler warning */
+ unsigned int clock = host->clock;
++ int clk_idx;
+
+ if (host->debug)
+ pr_info("%s: set_clock(%d)\n", mmc_hostname(host->mmc), clock);
+@@ -1553,53 +1581,45 @@ void bcm2835_sdhost_set_clock(struct bcm
+ return;
+ }
+
+- div = host->cur_clk / clock;
+- if (div < 2)
+- div = 2;
+- if ((host->cur_clk / div) > clock)
+- div++;
+- div -= 2;
+-
+- if (div > SDCDIV_MAX_CDIV)
+- div = SDCDIV_MAX_CDIV;
+-
+- clock = host->cur_clk / (div + 2);
+- host->mmc->actual_clock = clock;
+-
+- /* Calibrate some delays */
+-
+- host->ns_per_fifo_word = (1000000000/clock) *
+- ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
++ /* Calculate the clock divisors */
++ for (clk_idx = 0; clk_idx <= host->variable_clock; clk_idx++)
++ {
++ unsigned int cur_clk = host->src_clks[clk_idx];
++ unsigned int actual_clock;
+
+- if (clock > host->clock) {
+- /* Save the closest value, to make it easier
+- to reduce in the event of error */
+- host->overclock_50 = (clock/MHZ);
+-
+- if (clock != host->overclock) {
+- pr_warn("%s: overclocking to %dHz\n",
+- mmc_hostname(host->mmc), clock);
+- host->overclock = clock;
++ div = cur_clk / clock;
++ if (div < 2)
++ div = 2;
++ if ((cur_clk / div) > clock)
++ div++;
++ div -= 2;
++
++ if (div > SDCDIV_MAX_CDIV)
++ div = SDCDIV_MAX_CDIV;
++ actual_clock = cur_clk / (div + 2);
++
++ host->cdivs[clk_idx] = div;
++ host->clocks[clk_idx] = actual_clock;
++
++ if (host->overclock_50 != host->prev_overclock_50) {
++ const char *clk_name = "";
++ if (host->variable_clock)
++ clk_name = clk_idx ? " (turbo)" : " (normal)";
++ if (actual_clock > host->clock)
++ pr_info("%s: overclocking to %dHz%s\n",
++ mmc_hostname(host->mmc),
++ actual_clock, clk_name);
++ else if ((host->overclock_50 < 50) && (clk_idx == 0))
++ pr_info("%s: cancelling overclock%s\n",
++ mmc_hostname(host->mmc),
++ host->variable_clock ? "s" : "");
+ }
+ }
+- else if (host->overclock)
+- {
+- host->overclock = 0;
+- if (clock == 50 * MHZ)
+- pr_warn("%s: cancelling overclock\n",
+- mmc_hostname(host->mmc));
+- }
+
+- host->cdiv = div;
+- bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
++ if (host->clock == 50*MHZ)
++ host->prev_overclock_50 = host->overclock_50;
+
+- /* Set the timeout to 500ms */
+- bcm2835_sdhost_write(host, host->mmc->actual_clock/2, SDTOUT);
+-
+- if (host->debug)
+- pr_info("%s: clock=%d -> cur_clk=%d, cdiv=%x (actual clock %d)\n",
+- mmc_hostname(host->mmc), host->clock,
+- host->cur_clk, host->cdiv, host->mmc->actual_clock);
++ bcm2835_sdhost_select_clock(host, host->cur_clk_idx);
+ }
+
+ static void bcm2835_sdhost_request(struct mmc_host *mmc, struct mmc_request *mrq)
+@@ -1657,6 +1677,9 @@ static void bcm2835_sdhost_request(struc
+
+ spin_lock_irqsave(&host->lock, flags);
+
++ if (host->next_clk_idx != host->cur_clk_idx)
++ bcm2835_sdhost_select_clock(host, host->next_clk_idx);
++
+ WARN_ON(host->mrq != NULL);
+ host->mrq = mrq;
+
+@@ -1719,11 +1742,7 @@ static int bcm2835_sdhost_cpufreq_callba
+ return NOTIFY_BAD;
+ break;
+ case CPUFREQ_POSTCHANGE:
+- if (freq->new > freq->old)
+- host->cur_clk = host->max_clk;
+- else
+- host->cur_clk = host->min_clk;
+- bcm2835_sdhost_set_clock(host);
++ host->next_clk_idx = (freq->new > freq->old);
+ up(&host->cpufreq_semaphore);
+ break;
+ default:
+@@ -1763,8 +1782,11 @@ static void bcm2835_sdhost_set_ios(struc
+ ios->clock, ios->power_mode, ios->bus_width,
+ ios->timing, ios->signal_voltage, ios->drv_type);
+
+- if (ios->clock && !host->cur_clk)
+- host->cur_clk = get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
++ if (ios->clock && (host->cur_clk_idx == -1)) {
++ unsigned int cur_clk =
++ get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
++ host->cur_clk_idx = (cur_clk == host->src_clks[0]) ? 0 : 1;
++ }
+
+ spin_lock_irqsave(&host->lock, flags);
+
+@@ -1854,11 +1876,12 @@ static void bcm2835_sdhost_tasklet_finis
+
+ /* Drop the overclock after any data corruption, or after any
+ error overclocked */
+- if (host->overclock) {
++ if (host->clock > 50*MHZ) {
+ if ((mrq->cmd && mrq->cmd->error) ||
+ (mrq->data && mrq->data->error) ||
+ (mrq->stop && mrq->stop->error)) {
+- host->overclock_50--;
++ host->overclock_50 = (host->clock/MHZ) - 1;
++
+ pr_warn("%s: reducing overclock due to errors\n",
+ mmc_hostname(host->mmc));
+ bcm2835_sdhost_set_clock(host);
+@@ -2022,7 +2045,7 @@ static int bcm2835_sdhost_probe(struct p
+ struct bcm2835_host *host;
+ struct mmc_host *mmc;
+ const __be32 *addr;
+- unsigned int max_clk;
++ unsigned int max_clk, min_clk;
+ int ret;
+
+ pr_debug("bcm2835_sdhost_probe\n");
+@@ -2128,12 +2151,8 @@ static int bcm2835_sdhost_probe(struct p
+ else
+ mmc->caps |= MMC_CAP_4_BIT_DATA;
+
+- ret = bcm2835_sdhost_add_host(host);
+- if (ret)
+- goto err;
+-
+ /* Query the core clock frequencies */
+- host->min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
++ min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
+ max_clk = get_core_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE);
+ if (max_clk != host->max_clk) {
+ pr_warn("%s: Expected max clock %d, found %d\n",
+@@ -2141,19 +2160,24 @@ static int bcm2835_sdhost_probe(struct p
+ host->max_clk = max_clk;
+ }
+
+- if (host->min_clk != host->max_clk) {
++ host->src_clks[0] = min_clk;
++ host->cur_clk_idx = -1;
++ if (max_clk != min_clk) {
++ host->src_clks[1] = max_clk;
+ host->cpufreq_nb.notifier_call =
+ bcm2835_sdhost_cpufreq_callback;
+ sema_init(&host->cpufreq_semaphore, 1);
+ cpufreq_register_notifier(&host->cpufreq_nb,
+ CPUFREQ_TRANSITION_NOTIFIER);
+ host->variable_clock = 1;
+- host->cur_clk = 0; /* Get this later */
+ } else {
+ host->variable_clock = 0;
+- host->cur_clk = host->max_clk;
+ }
+
++ ret = bcm2835_sdhost_add_host(host);
++ if (ret)
++ goto err;
++
+ platform_set_drvdata(pdev, host);
+
+ pr_debug("bcm2835_sdhost_probe -> OK\n");
diff --git a/target/linux/brcm2708/patches-4.4/0225-Revert-bcm2835-sdhost-Precalc-divisors-and-overclock.patch b/target/linux/brcm2708/patches-4.4/0225-Revert-bcm2835-sdhost-Precalc-divisors-and-overclock.patch
new file mode 100644
index 0000000000..e83ac3765b
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0225-Revert-bcm2835-sdhost-Precalc-divisors-and-overclock.patch
@@ -0,0 +1,267 @@
+From 9524a87ecce1788c8f77d2b86deee65d11b4190d Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 4 Apr 2016 12:35:32 +0100
+Subject: [PATCH 225/232] Revert "bcm2835-sdhost: Precalc divisors and
+ overclocks"
+
+This reverts commit 20260462773366a5734e5268dae0a4c179a21a2d.
+---
+ drivers/mmc/host/bcm2835-sdhost.c | 152 ++++++++++++++++----------------------
+ 1 file changed, 64 insertions(+), 88 deletions(-)
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -154,15 +154,12 @@ struct bcm2835_host {
+ u32 pio_timeout; /* In jiffies */
+
+ int clock; /* Current clock speed */
+- int clocks[2];
+
+ bool slow_card; /* Force 11-bit divisor */
+
+ unsigned int max_clk; /* Max src clock freq */
+- unsigned int src_clks[2]; /* Min/max src clock freqs */
+- unsigned int cur_clk_idx; /* Index of current clock */
+- unsigned int next_clk_idx; /* Next clock index */
+- unsigned int cdivs[2];
++ unsigned int min_clk; /* Min src clock freq */
++ unsigned int cur_clk; /* Current src clock freq */
+
+ struct tasklet_struct finish_tasklet; /* Tasklet structures */
+
+@@ -216,7 +213,7 @@ struct bcm2835_host {
+ u32 delay_after_stop; /* minimum time between stop and subsequent data transfer */
+ u32 delay_after_this_stop; /* minimum time between this stop and subsequent data transfer */
+ u32 overclock_50; /* frequency to use when 50MHz is requested (in MHz) */
+- u32 prev_overclock_50;
++ u32 overclock; /* Current frequency if overclocked, else zero */
+ u32 pio_limit; /* Maximum block count for PIO (0 = always DMA) */
+
+ u32 sectors; /* Cached card size in sectors */
+@@ -1512,35 +1509,10 @@ static irqreturn_t bcm2835_sdhost_irq(in
+ return result;
+ }
+
+-static void bcm2835_sdhost_select_clock(struct bcm2835_host *host, int idx)
+-{
+- unsigned int clock = host->clocks[idx];
+- unsigned int cdiv = host->cdivs[idx];
+-
+- host->mmc->actual_clock = clock;
+- host->ns_per_fifo_word = (1000000000/clock) *
+- ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
+-
+- host->cdiv = cdiv;
+- bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
+-
+- /* Set the timeout to 500ms */
+- bcm2835_sdhost_write(host, clock/2, SDTOUT);
+-
+- host->cur_clk_idx = host->next_clk_idx = idx;
+-
+- if (host->debug)
+- pr_info("%s: clock=%d -> src_clk=%d, cdiv=%x (actual %d)\n",
+- mmc_hostname(host->mmc), host->clock,
+- host->src_clks[idx], host->cdiv,
+- host->mmc->actual_clock);
+-}
+-
+ void bcm2835_sdhost_set_clock(struct bcm2835_host *host)
+ {
+ int div = 0; /* Initialized for compiler warning */
+ unsigned int clock = host->clock;
+- int clk_idx;
+
+ if (host->debug)
+ pr_info("%s: set_clock(%d)\n", mmc_hostname(host->mmc), clock);
+@@ -1581,45 +1553,53 @@ void bcm2835_sdhost_set_clock(struct bcm
+ return;
+ }
+
+- /* Calculate the clock divisors */
+- for (clk_idx = 0; clk_idx <= host->variable_clock; clk_idx++)
+- {
+- unsigned int cur_clk = host->src_clks[clk_idx];
+- unsigned int actual_clock;
++ div = host->cur_clk / clock;
++ if (div < 2)
++ div = 2;
++ if ((host->cur_clk / div) > clock)
++ div++;
++ div -= 2;
++
++ if (div > SDCDIV_MAX_CDIV)
++ div = SDCDIV_MAX_CDIV;
++
++ clock = host->cur_clk / (div + 2);
++ host->mmc->actual_clock = clock;
++
++ /* Calibrate some delays */
++
++ host->ns_per_fifo_word = (1000000000/clock) *
++ ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
+
+- div = cur_clk / clock;
+- if (div < 2)
+- div = 2;
+- if ((cur_clk / div) > clock)
+- div++;
+- div -= 2;
+-
+- if (div > SDCDIV_MAX_CDIV)
+- div = SDCDIV_MAX_CDIV;
+- actual_clock = cur_clk / (div + 2);
+-
+- host->cdivs[clk_idx] = div;
+- host->clocks[clk_idx] = actual_clock;
+-
+- if (host->overclock_50 != host->prev_overclock_50) {
+- const char *clk_name = "";
+- if (host->variable_clock)
+- clk_name = clk_idx ? " (turbo)" : " (normal)";
+- if (actual_clock > host->clock)
+- pr_info("%s: overclocking to %dHz%s\n",
+- mmc_hostname(host->mmc),
+- actual_clock, clk_name);
+- else if ((host->overclock_50 < 50) && (clk_idx == 0))
+- pr_info("%s: cancelling overclock%s\n",
+- mmc_hostname(host->mmc),
+- host->variable_clock ? "s" : "");
++ if (clock > host->clock) {
++ /* Save the closest value, to make it easier
++ to reduce in the event of error */
++ host->overclock_50 = (clock/MHZ);
++
++ if (clock != host->overclock) {
++ pr_warn("%s: overclocking to %dHz\n",
++ mmc_hostname(host->mmc), clock);
++ host->overclock = clock;
+ }
+ }
++ else if (host->overclock)
++ {
++ host->overclock = 0;
++ if (clock == 50 * MHZ)
++ pr_warn("%s: cancelling overclock\n",
++ mmc_hostname(host->mmc));
++ }
+
+- if (host->clock == 50*MHZ)
+- host->prev_overclock_50 = host->overclock_50;
++ host->cdiv = div;
++ bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
+
+- bcm2835_sdhost_select_clock(host, host->cur_clk_idx);
++ /* Set the timeout to 500ms */
++ bcm2835_sdhost_write(host, host->mmc->actual_clock/2, SDTOUT);
++
++ if (host->debug)
++ pr_info("%s: clock=%d -> cur_clk=%d, cdiv=%x (actual clock %d)\n",
++ mmc_hostname(host->mmc), host->clock,
++ host->cur_clk, host->cdiv, host->mmc->actual_clock);
+ }
+
+ static void bcm2835_sdhost_request(struct mmc_host *mmc, struct mmc_request *mrq)
+@@ -1677,9 +1657,6 @@ static void bcm2835_sdhost_request(struc
+
+ spin_lock_irqsave(&host->lock, flags);
+
+- if (host->next_clk_idx != host->cur_clk_idx)
+- bcm2835_sdhost_select_clock(host, host->next_clk_idx);
+-
+ WARN_ON(host->mrq != NULL);
+ host->mrq = mrq;
+
+@@ -1742,7 +1719,11 @@ static int bcm2835_sdhost_cpufreq_callba
+ return NOTIFY_BAD;
+ break;
+ case CPUFREQ_POSTCHANGE:
+- host->next_clk_idx = (freq->new > freq->old);
++ if (freq->new > freq->old)
++ host->cur_clk = host->max_clk;
++ else
++ host->cur_clk = host->min_clk;
++ bcm2835_sdhost_set_clock(host);
+ up(&host->cpufreq_semaphore);
+ break;
+ default:
+@@ -1782,11 +1763,8 @@ static void bcm2835_sdhost_set_ios(struc
+ ios->clock, ios->power_mode, ios->bus_width,
+ ios->timing, ios->signal_voltage, ios->drv_type);
+
+- if (ios->clock && (host->cur_clk_idx == -1)) {
+- unsigned int cur_clk =
+- get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
+- host->cur_clk_idx = (cur_clk == host->src_clks[0]) ? 0 : 1;
+- }
++ if (ios->clock && !host->cur_clk)
++ host->cur_clk = get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
+
+ spin_lock_irqsave(&host->lock, flags);
+
+@@ -1876,12 +1854,11 @@ static void bcm2835_sdhost_tasklet_finis
+
+ /* Drop the overclock after any data corruption, or after any
+ error overclocked */
+- if (host->clock > 50*MHZ) {
++ if (host->overclock) {
+ if ((mrq->cmd && mrq->cmd->error) ||
+ (mrq->data && mrq->data->error) ||
+ (mrq->stop && mrq->stop->error)) {
+- host->overclock_50 = (host->clock/MHZ) - 1;
+-
++ host->overclock_50--;
+ pr_warn("%s: reducing overclock due to errors\n",
+ mmc_hostname(host->mmc));
+ bcm2835_sdhost_set_clock(host);
+@@ -2045,7 +2022,7 @@ static int bcm2835_sdhost_probe(struct p
+ struct bcm2835_host *host;
+ struct mmc_host *mmc;
+ const __be32 *addr;
+- unsigned int max_clk, min_clk;
++ unsigned int max_clk;
+ int ret;
+
+ pr_debug("bcm2835_sdhost_probe\n");
+@@ -2151,8 +2128,12 @@ static int bcm2835_sdhost_probe(struct p
+ else
+ mmc->caps |= MMC_CAP_4_BIT_DATA;
+
++ ret = bcm2835_sdhost_add_host(host);
++ if (ret)
++ goto err;
++
+ /* Query the core clock frequencies */
+- min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
++ host->min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
+ max_clk = get_core_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE);
+ if (max_clk != host->max_clk) {
+ pr_warn("%s: Expected max clock %d, found %d\n",
+@@ -2160,24 +2141,19 @@ static int bcm2835_sdhost_probe(struct p
+ host->max_clk = max_clk;
+ }
+
+- host->src_clks[0] = min_clk;
+- host->cur_clk_idx = -1;
+- if (max_clk != min_clk) {
+- host->src_clks[1] = max_clk;
++ if (host->min_clk != host->max_clk) {
+ host->cpufreq_nb.notifier_call =
+ bcm2835_sdhost_cpufreq_callback;
+ sema_init(&host->cpufreq_semaphore, 1);
+ cpufreq_register_notifier(&host->cpufreq_nb,
+ CPUFREQ_TRANSITION_NOTIFIER);
+ host->variable_clock = 1;
++ host->cur_clk = 0; /* Get this later */
+ } else {
+ host->variable_clock = 0;
++ host->cur_clk = host->max_clk;
+ }
+
+- ret = bcm2835_sdhost_add_host(host);
+- if (ret)
+- goto err;
+-
+ platform_set_drvdata(pdev, host);
+
+ pr_debug("bcm2835_sdhost_probe -> OK\n");
diff --git a/target/linux/brcm2708/patches-4.4/0226-Revert-bcm2835-sdhost-Adjust-to-core-clock-changes.patch b/target/linux/brcm2708/patches-4.4/0226-Revert-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
new file mode 100644
index 0000000000..55f777f883
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0226-Revert-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
@@ -0,0 +1,327 @@
+From 28035a98dc9820c065dc64ad3016a1f71a9911f2 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 4 Apr 2016 12:35:51 +0100
+Subject: [PATCH 226/232] Revert "bcm2835-sdhost: Adjust to core clock changes"
+
+This reverts commit 4b89d07fd299a0f4e25321920cb74416ba2e638e.
+---
+ drivers/mmc/host/Kconfig | 1 -
+ drivers/mmc/host/bcm2835-sdhost.c | 140 ++++++--------------------------------
+ 2 files changed, 22 insertions(+), 119 deletions(-)
+
+--- a/drivers/mmc/host/Kconfig
++++ b/drivers/mmc/host/Kconfig
+@@ -36,7 +36,6 @@ config MMC_BCM2835_PIO_DMA_BARRIER
+ config MMC_BCM2835_SDHOST
+ tristate "Support for the SDHost controller on BCM2708/9"
+ depends on MACH_BCM2708 || MACH_BCM2709 || ARCH_BCM2835
+- depends on RASPBERRYPI_FIRMWARE
+ help
+ This selects the SDHost controller on BCM2835/6.
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -50,10 +50,6 @@
+ #include <linux/of_dma.h>
+ #include <linux/time.h>
+ #include <linux/workqueue.h>
+-#include <linux/cpufreq.h>
+-#include <linux/semaphore.h>
+-#include <soc/bcm2835/raspberrypi-firmware.h>
+-
+
+ #define DRIVER_NAME "sdhost-bcm2835"
+
+@@ -140,8 +136,6 @@
+
+ #define MHZ 1000000
+
+-#define RPI_FIRMWARE_CLOCK_CORE 4
+-
+
+ struct bcm2835_host {
+ spinlock_t lock;
+@@ -157,9 +151,7 @@ struct bcm2835_host {
+
+ bool slow_card; /* Force 11-bit divisor */
+
+- unsigned int max_clk; /* Max src clock freq */
+- unsigned int min_clk; /* Min src clock freq */
+- unsigned int cur_clk; /* Current src clock freq */
++ unsigned int max_clk; /* Max possible freq */
+
+ struct tasklet_struct finish_tasklet; /* Tasklet structures */
+
+@@ -191,7 +183,6 @@ struct bcm2835_host {
+ unsigned int use_sbc:1; /* Send CMD23 */
+
+ unsigned int debug:1; /* Enable debug output */
+- unsigned int variable_clock:1; /* The core clock may change */
+
+ /*DMA part*/
+ struct dma_chan *dma_chan_rxtx; /* DMA channel for reads and writes */
+@@ -217,9 +208,6 @@ struct bcm2835_host {
+ u32 pio_limit; /* Maximum block count for PIO (0 = always DMA) */
+
+ u32 sectors; /* Cached card size in sectors */
+-
+- struct notifier_block cpufreq_nb; /* The cpufreq callback list item */
+- struct semaphore cpufreq_semaphore; /* Interlock between SD activity and cpufreq changes */
+ };
+
+ #if ENABLE_LOG
+@@ -239,10 +227,6 @@ static u32 sdhost_log_idx;
+ static spinlock_t log_lock;
+ static void __iomem *timer_base;
+
+-static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
+- unsigned long action, void *data);
+-static unsigned int get_core_clock(unsigned int mode);
+-
+ #define LOG_ENTRIES (256*1)
+ #define LOG_SIZE (sizeof(LOG_ENTRY_T)*LOG_ENTRIES)
+
+@@ -464,14 +448,20 @@ static void bcm2835_sdhost_reset(struct
+
+ static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios);
+
+-static void bcm2835_sdhost_init(struct bcm2835_host *host)
++static void bcm2835_sdhost_init(struct bcm2835_host *host, int soft)
+ {
+- pr_debug("bcm2835_sdhost_init()\n");
++ pr_debug("bcm2835_sdhost_init(%d)\n", soft);
+
+ /* Set interrupt enables */
+ host->hcfg = SDHCFG_BUSY_IRPT_EN;
+
+ bcm2835_sdhost_reset_internal(host);
++
++ if (soft) {
++ /* force clock reconfiguration */
++ host->clock = 0;
++ bcm2835_sdhost_set_ios(host->mmc, &host->mmc->ios);
++ }
+ }
+
+ static void bcm2835_sdhost_wait_transfer_complete(struct bcm2835_host *host)
+@@ -1509,10 +1499,10 @@ static irqreturn_t bcm2835_sdhost_irq(in
+ return result;
+ }
+
+-void bcm2835_sdhost_set_clock(struct bcm2835_host *host)
++void bcm2835_sdhost_set_clock(struct bcm2835_host *host, unsigned int clock)
+ {
+ int div = 0; /* Initialized for compiler warning */
+- unsigned int clock = host->clock;
++ unsigned int input_clock = clock;
+
+ if (host->debug)
+ pr_info("%s: set_clock(%d)\n", mmc_hostname(host->mmc), clock);
+@@ -1553,17 +1543,17 @@ void bcm2835_sdhost_set_clock(struct bcm
+ return;
+ }
+
+- div = host->cur_clk / clock;
++ div = host->max_clk / clock;
+ if (div < 2)
+ div = 2;
+- if ((host->cur_clk / div) > clock)
++ if ((host->max_clk / div) > clock)
+ div++;
+ div -= 2;
+
+ if (div > SDCDIV_MAX_CDIV)
+ div = SDCDIV_MAX_CDIV;
+
+- clock = host->cur_clk / (div + 2);
++ clock = host->max_clk / (div + 2);
+ host->mmc->actual_clock = clock;
+
+ /* Calibrate some delays */
+@@ -1571,7 +1561,7 @@ void bcm2835_sdhost_set_clock(struct bcm
+ host->ns_per_fifo_word = (1000000000/clock) *
+ ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
+
+- if (clock > host->clock) {
++ if (clock > input_clock) {
+ /* Save the closest value, to make it easier
+ to reduce in the event of error */
+ host->overclock_50 = (clock/MHZ);
+@@ -1597,9 +1587,9 @@ void bcm2835_sdhost_set_clock(struct bcm
+ bcm2835_sdhost_write(host, host->mmc->actual_clock/2, SDTOUT);
+
+ if (host->debug)
+- pr_info("%s: clock=%d -> cur_clk=%d, cdiv=%x (actual clock %d)\n",
+- mmc_hostname(host->mmc), host->clock,
+- host->cur_clk, host->cdiv, host->mmc->actual_clock);
++ pr_info("%s: clock=%d -> max_clk=%d, cdiv=%x (actual clock %d)\n",
++ mmc_hostname(host->mmc), input_clock,
++ host->max_clk, host->cdiv, host->mmc->actual_clock);
+ }
+
+ static void bcm2835_sdhost_request(struct mmc_host *mmc, struct mmc_request *mrq)
+@@ -1648,13 +1638,6 @@ static void bcm2835_sdhost_request(struc
+ (mrq->data->blocks > host->pio_limit))
+ bcm2835_sdhost_prepare_dma(host, mrq->data);
+
+- if (host->variable_clock &&
+- (down_killable(&host->cpufreq_semaphore) != 0)) {
+- mrq->cmd->error = -EINTR;
+- mmc_request_done(mmc, mrq);
+- return;
+- }
+-
+ spin_lock_irqsave(&host->lock, flags);
+
+ WARN_ON(host->mrq != NULL);
+@@ -1704,52 +1687,6 @@ static void bcm2835_sdhost_request(struc
+ spin_unlock_irqrestore(&host->lock, flags);
+ }
+
+-static int bcm2835_sdhost_cpufreq_callback(struct notifier_block *nb,
+- unsigned long action, void *data)
+-{
+- struct cpufreq_freqs *freq = data;
+- struct bcm2835_host *host;
+-
+- host = container_of(nb, struct bcm2835_host, cpufreq_nb);
+-
+- if (freq->cpu == 0) {
+- switch (action) {
+- case CPUFREQ_PRECHANGE:
+- if (down_killable(&host->cpufreq_semaphore) != 0)
+- return NOTIFY_BAD;
+- break;
+- case CPUFREQ_POSTCHANGE:
+- if (freq->new > freq->old)
+- host->cur_clk = host->max_clk;
+- else
+- host->cur_clk = host->min_clk;
+- bcm2835_sdhost_set_clock(host);
+- up(&host->cpufreq_semaphore);
+- break;
+- default:
+- break;
+- }
+- }
+- return NOTIFY_OK;
+-}
+-
+-static unsigned int get_core_clock(unsigned int mode)
+-{
+- struct rpi_firmware *fw = rpi_firmware_get(NULL);
+- struct {
+- u32 id;
+- u32 val;
+- } packet;
+- int ret;
+-
+- packet.id = RPI_FIRMWARE_CLOCK_CORE;
+- ret = rpi_firmware_property(fw, mode, &packet, sizeof(packet));
+- if (ret)
+- return 0;
+-
+- return packet.val;
+-}
+-
+ static void bcm2835_sdhost_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+ {
+
+@@ -1763,16 +1700,13 @@ static void bcm2835_sdhost_set_ios(struc
+ ios->clock, ios->power_mode, ios->bus_width,
+ ios->timing, ios->signal_voltage, ios->drv_type);
+
+- if (ios->clock && !host->cur_clk)
+- host->cur_clk = get_core_clock(RPI_FIRMWARE_GET_CLOCK_RATE);
+-
+ spin_lock_irqsave(&host->lock, flags);
+
+ log_event("IOS<", ios->clock, 0);
+
+ if (!ios->clock || ios->clock != host->clock) {
++ bcm2835_sdhost_set_clock(host, ios->clock);
+ host->clock = ios->clock;
+- bcm2835_sdhost_set_clock(host);
+ }
+
+ /* set bus width */
+@@ -1861,7 +1795,7 @@ static void bcm2835_sdhost_tasklet_finis
+ host->overclock_50--;
+ pr_warn("%s: reducing overclock due to errors\n",
+ mmc_hostname(host->mmc));
+- bcm2835_sdhost_set_clock(host);
++ bcm2835_sdhost_set_clock(host,50*MHZ);
+ mrq->cmd->error = -EILSEQ;
+ mrq->cmd->retries = 1;
+ }
+@@ -1879,9 +1813,6 @@ static void bcm2835_sdhost_tasklet_finis
+
+ spin_unlock_irqrestore(&host->lock, flags);
+
+- if (host->variable_clock)
+- up(&host->cpufreq_semaphore);
+-
+ if (terminate_chan)
+ {
+ int err = dmaengine_terminate_all(terminate_chan);
+@@ -1984,10 +1915,10 @@ int bcm2835_sdhost_add_host(struct bcm28
+ setup_timer(&host->timer, bcm2835_sdhost_timeout,
+ (unsigned long)host);
+
+- bcm2835_sdhost_init(host);
++ bcm2835_sdhost_init(host, 0);
+
+ ret = request_irq(host->irq, bcm2835_sdhost_irq, 0 /*IRQF_SHARED*/,
+- mmc_hostname(mmc), host);
++ mmc_hostname(mmc), host);
+ if (ret) {
+ pr_err("%s: failed to request IRQ %d: %d\n",
+ mmc_hostname(mmc), host->irq, ret);
+@@ -2022,7 +1953,6 @@ static int bcm2835_sdhost_probe(struct p
+ struct bcm2835_host *host;
+ struct mmc_host *mmc;
+ const __be32 *addr;
+- unsigned int max_clk;
+ int ret;
+
+ pr_debug("bcm2835_sdhost_probe\n");
+@@ -2132,28 +2062,6 @@ static int bcm2835_sdhost_probe(struct p
+ if (ret)
+ goto err;
+
+- /* Query the core clock frequencies */
+- host->min_clk = get_core_clock(RPI_FIRMWARE_GET_MIN_CLOCK_RATE);
+- max_clk = get_core_clock(RPI_FIRMWARE_GET_MAX_CLOCK_RATE);
+- if (max_clk != host->max_clk) {
+- pr_warn("%s: Expected max clock %d, found %d\n",
+- mmc_hostname(mmc), host->max_clk, max_clk);
+- host->max_clk = max_clk;
+- }
+-
+- if (host->min_clk != host->max_clk) {
+- host->cpufreq_nb.notifier_call =
+- bcm2835_sdhost_cpufreq_callback;
+- sema_init(&host->cpufreq_semaphore, 1);
+- cpufreq_register_notifier(&host->cpufreq_nb,
+- CPUFREQ_TRANSITION_NOTIFIER);
+- host->variable_clock = 1;
+- host->cur_clk = 0; /* Get this later */
+- } else {
+- host->variable_clock = 0;
+- host->cur_clk = host->max_clk;
+- }
+-
+ platform_set_drvdata(pdev, host);
+
+ pr_debug("bcm2835_sdhost_probe -> OK\n");
+@@ -2173,10 +2081,6 @@ static int bcm2835_sdhost_remove(struct
+
+ pr_debug("bcm2835_sdhost_remove\n");
+
+- if (host->variable_clock)
+- cpufreq_unregister_notifier(&host->cpufreq_nb,
+- CPUFREQ_TRANSITION_NOTIFIER);
+-
+ mmc_remove_host(host->mmc);
+
+ bcm2835_sdhost_set_power(host, false);
diff --git a/target/linux/brcm2708/patches-4.4/0227-bcm2835-sdhost-Firmware-manages-the-clock-divisor.patch b/target/linux/brcm2708/patches-4.4/0227-bcm2835-sdhost-Firmware-manages-the-clock-divisor.patch
new file mode 100644
index 0000000000..828692dd9d
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0227-bcm2835-sdhost-Firmware-manages-the-clock-divisor.patch
@@ -0,0 +1,226 @@
+From 08532d242d7702ae0add95096aa49c5e96e066e2 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 4 Apr 2016 16:03:18 +0100
+Subject: [PATCH 227/232] bcm2835-sdhost: Firmware manages the clock divisor
+
+The bcm2835-sdhost driver hands control of the CDIV clock divisor
+register to matching firmware, allowing it to adjust to a changing
+core clock. This removes the need to use the performance governor or
+to enable io_is_busy on the on-demand governor in order to get the
+best SD performance.
+
+N.B. As SD clocks must be an integer divisor of the core clock, it is
+possible that the SD clock for "turbo" mode can be different (even
+lower) than "normal" mode.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/host/bcm2835-sdhost.c | 120 ++++++++++++++++++-----------
+ include/soc/bcm2835/raspberrypi-firmware.h | 1 +
+ 2 files changed, 74 insertions(+), 47 deletions(-)
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -50,6 +50,7 @@
+ #include <linux/of_dma.h>
+ #include <linux/time.h>
+ #include <linux/workqueue.h>
++#include <soc/bcm2835/raspberrypi-firmware.h>
+
+ #define DRIVER_NAME "sdhost-bcm2835"
+
+@@ -183,6 +184,7 @@ struct bcm2835_host {
+ unsigned int use_sbc:1; /* Send CMD23 */
+
+ unsigned int debug:1; /* Enable debug output */
++ unsigned int firmware_sets_cdiv:1; /* Let the firmware manage the clock */
+
+ /*DMA part*/
+ struct dma_chan *dma_chan_rxtx; /* DMA channel for reads and writes */
+@@ -430,7 +432,7 @@ static void bcm2835_sdhost_reset_interna
+ host->clock = 0;
+ host->sectors = 0;
+ bcm2835_sdhost_write(host, host->hcfg, SDHCFG);
+- bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
++ bcm2835_sdhost_write(host, SDCDIV_MAX_CDIV, SDCDIV);
+ mmiowb();
+ }
+
+@@ -1534,62 +1536,75 @@ void bcm2835_sdhost_set_clock(struct bcm
+
+ host->mmc->actual_clock = 0;
+
+- if (clock < 100000) {
+- /* Can't stop the clock, but make it as slow as possible
+- * to show willing
+- */
+- host->cdiv = SDCDIV_MAX_CDIV;
+- bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
+- return;
+- }
+-
+- div = host->max_clk / clock;
+- if (div < 2)
+- div = 2;
+- if ((host->max_clk / div) > clock)
+- div++;
+- div -= 2;
++ if (host->firmware_sets_cdiv) {
++ u32 msg[3] = { clock, 0, 0 };
+
+- if (div > SDCDIV_MAX_CDIV)
+- div = SDCDIV_MAX_CDIV;
++ rpi_firmware_property(rpi_firmware_get(NULL),
++ RPI_FIRMWARE_SET_SDHOST_CLOCK,
++ &msg, sizeof(msg));
+
+- clock = host->max_clk / (div + 2);
+- host->mmc->actual_clock = clock;
++ clock = max(msg[1], msg[2]);
++ } else {
++ if (clock < 100000) {
++ /* Can't stop the clock, but make it as slow as
++ * possible to show willing
++ */
++ host->cdiv = SDCDIV_MAX_CDIV;
++ bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
++ return;
++ }
++
++ div = host->max_clk / clock;
++ if (div < 2)
++ div = 2;
++ if ((host->max_clk / div) > clock)
++ div++;
++ div -= 2;
++
++ if (div > SDCDIV_MAX_CDIV)
++ div = SDCDIV_MAX_CDIV;
++
++ clock = host->max_clk / (div + 2);
++
++ host->cdiv = div;
++ bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
++
++ if (host->debug)
++ pr_info("%s: clock=%d -> max_clk=%d, cdiv=%x "
++ "(actual clock %d)\n",
++ mmc_hostname(host->mmc), input_clock,
++ host->max_clk, host->cdiv,
++ clock);
++ }
+
+ /* Calibrate some delays */
+
+ host->ns_per_fifo_word = (1000000000/clock) *
+ ((host->mmc->caps & MMC_CAP_4_BIT_DATA) ? 8 : 32);
+
+- if (clock > input_clock) {
+- /* Save the closest value, to make it easier
+- to reduce in the event of error */
+- host->overclock_50 = (clock/MHZ);
+-
+- if (clock != host->overclock) {
+- pr_warn("%s: overclocking to %dHz\n",
+- mmc_hostname(host->mmc), clock);
+- host->overclock = clock;
++ if (input_clock == 50 * MHZ) {
++ if (clock > input_clock) {
++ /* Save the closest value, to make it easier
++ to reduce in the event of error */
++ host->overclock_50 = (clock/MHZ);
++
++ if (clock != host->overclock) {
++ pr_warn("%s: overclocking to %dHz\n",
++ mmc_hostname(host->mmc), clock);
++ host->overclock = clock;
++ }
++ } else if (host->overclock) {
++ host->overclock = 0;
++ if (clock == 50 * MHZ)
++ pr_warn("%s: cancelling overclock\n",
++ mmc_hostname(host->mmc));
+ }
+ }
+- else if (host->overclock)
+- {
+- host->overclock = 0;
+- if (clock == 50 * MHZ)
+- pr_warn("%s: cancelling overclock\n",
+- mmc_hostname(host->mmc));
+- }
+-
+- host->cdiv = div;
+- bcm2835_sdhost_write(host, host->cdiv, SDCDIV);
+
+ /* Set the timeout to 500ms */
+- bcm2835_sdhost_write(host, host->mmc->actual_clock/2, SDTOUT);
++ bcm2835_sdhost_write(host, clock/2, SDTOUT);
+
+- if (host->debug)
+- pr_info("%s: clock=%d -> max_clk=%d, cdiv=%x (actual clock %d)\n",
+- mmc_hostname(host->mmc), input_clock,
+- host->max_clk, host->cdiv, host->mmc->actual_clock);
++ host->mmc->actual_clock = clock;
+ }
+
+ static void bcm2835_sdhost_request(struct mmc_host *mmc, struct mmc_request *mrq)
+@@ -1704,11 +1719,6 @@ static void bcm2835_sdhost_set_ios(struc
+
+ log_event("IOS<", ios->clock, 0);
+
+- if (!ios->clock || ios->clock != host->clock) {
+- bcm2835_sdhost_set_clock(host, ios->clock);
+- host->clock = ios->clock;
+- }
+-
+ /* set bus width */
+ host->hcfg &= ~SDHCFG_WIDE_EXT_BUS;
+ if (ios->bus_width == MMC_BUS_WIDTH_4)
+@@ -1721,6 +1731,11 @@ static void bcm2835_sdhost_set_ios(struc
+
+ bcm2835_sdhost_write(host, host->hcfg, SDHCFG);
+
++ if (!ios->clock || ios->clock != host->clock) {
++ bcm2835_sdhost_set_clock(host, ios->clock);
++ host->clock = ios->clock;
++ }
++
+ mmiowb();
+
+ spin_unlock_irqrestore(&host->lock, flags);
+@@ -1953,6 +1968,7 @@ static int bcm2835_sdhost_probe(struct p
+ struct bcm2835_host *host;
+ struct mmc_host *mmc;
+ const __be32 *addr;
++ u32 msg[3];
+ int ret;
+
+ pr_debug("bcm2835_sdhost_probe\n");
+@@ -2058,6 +2074,16 @@ static int bcm2835_sdhost_probe(struct p
+ else
+ mmc->caps |= MMC_CAP_4_BIT_DATA;
+
++ msg[0] = 0;
++ msg[1] = ~0;
++ msg[2] = ~0;
++
++ rpi_firmware_property(rpi_firmware_get(NULL),
++ RPI_FIRMWARE_SET_SDHOST_CLOCK,
++ &msg, sizeof(msg));
++
++ host->firmware_sets_cdiv = (msg[1] != ~0);
++
+ ret = bcm2835_sdhost_add_host(host);
+ if (ret)
+ goto err;
+--- a/include/soc/bcm2835/raspberrypi-firmware.h
++++ b/include/soc/bcm2835/raspberrypi-firmware.h
+@@ -79,6 +79,7 @@ enum rpi_firmware_property_tag {
+ RPI_FIRMWARE_SET_VOLTAGE = 0x00038003,
+ RPI_FIRMWARE_SET_TURBO = 0x00038009,
+ RPI_FIRMWARE_SET_CUSTOMER_OTP = 0x00038021,
++ RPI_FIRMWARE_SET_SDHOST_CLOCK = 0x00038042,
+
+ /* Dispmanx TAGS */
+ RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,
diff --git a/target/linux/brcm2708/patches-4.4/0228-Revert-Revert-cpufreq-Temporarily-ignore-io_is_busy-.patch b/target/linux/brcm2708/patches-4.4/0228-Revert-Revert-cpufreq-Temporarily-ignore-io_is_busy-.patch
new file mode 100644
index 0000000000..b6e678bcbe
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0228-Revert-Revert-cpufreq-Temporarily-ignore-io_is_busy-.patch
@@ -0,0 +1,27 @@
+From 9f0a3f09ec2d80fed2781b341527ae6bd5666cd8 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Mon, 4 Apr 2016 19:52:27 +0100
+Subject: [PATCH 228/232] Revert "Revert "cpufreq: Temporarily ignore
+ io_is_busy=1""
+
+This reverts commit c353af0f83220068c10f6593b1767576b9b6cc18.
+---
+ drivers/cpufreq/cpufreq_ondemand.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/cpufreq/cpufreq_ondemand.c
++++ b/drivers/cpufreq/cpufreq_ondemand.c
+@@ -307,7 +307,12 @@ static ssize_t store_io_is_busy(struct d
+ ret = sscanf(buf, "%u", &input);
+ if (ret != 1)
+ return -EINVAL;
+- od_tuners->io_is_busy = !!input;
++ // XXX temporary hack
++ if (input > 1)
++ input = 1;
++ else
++ input = 0;
++ od_tuners->io_is_busy = input;
+
+ /* we need to re-evaluate prev_cpu_idle */
+ for_each_online_cpu(j) {
diff --git a/target/linux/brcm2708/patches-4.4/0229-config-Enabled-IPV6_SUBTREES.patch b/target/linux/brcm2708/patches-4.4/0229-config-Enabled-IPV6_SUBTREES.patch
new file mode 100644
index 0000000000..314ea7fc2b
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0229-config-Enabled-IPV6_SUBTREES.patch
@@ -0,0 +1,30 @@
+From ed825c0f1cfce352d446f33ef7f798134b8d6cb6 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Thu, 31 Mar 2016 16:49:52 +0100
+Subject: [PATCH 229/232] config: Enabled IPV6_SUBTREES
+
+---
+ arch/arm/configs/bcm2709_defconfig | 1 +
+ arch/arm/configs/bcmrpi_defconfig | 1 +
+ 2 files changed, 2 insertions(+)
+
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -106,6 +106,7 @@ CONFIG_INET6_ESP=m
+ CONFIG_INET6_IPCOMP=m
+ CONFIG_IPV6_TUNNEL=m
+ CONFIG_IPV6_MULTIPLE_TABLES=y
++CONFIG_IPV6_SUBTREES=y
+ CONFIG_IPV6_MROUTE=y
+ CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
+ CONFIG_IPV6_PIMSM_V2=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -73,6 +73,7 @@ CONFIG_INET=y
+ CONFIG_IP_MULTICAST=y
+ CONFIG_IP_ADVANCED_ROUTER=y
+ CONFIG_IP_MULTIPLE_TABLES=y
++CONFIG_IPV6_SUBTREES=y
+ CONFIG_IP_ROUTE_MULTIPATH=y
+ CONFIG_IP_ROUTE_VERBOSE=y
+ CONFIG_IP_PNP=y
diff --git a/target/linux/brcm2708/patches-4.4/0230-add-smsc95xx-packetsize-module_param.patch b/target/linux/brcm2708/patches-4.4/0230-add-smsc95xx-packetsize-module_param.patch
new file mode 100644
index 0000000000..b4005c9d98
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0230-add-smsc95xx-packetsize-module_param.patch
@@ -0,0 +1,42 @@
+From 3cea4c3fef10a33547949610d9a81ac9950b5be9 Mon Sep 17 00:00:00 2001
+From: Sam Nazarko <email@samnazarko.co.uk>
+Date: Fri, 1 Apr 2016 17:27:21 +0100
+Subject: [PATCH 230/232] add smsc95xx packetsize module_param
+
+Signed-off-by: Sam Nazarko <email@samnazarko.co.uk>
+---
+ drivers/net/usb/smsc95xx.c | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/usb/smsc95xx.c
++++ b/drivers/net/usb/smsc95xx.c
+@@ -83,6 +83,10 @@ static char *macaddr = ":";
+ module_param(macaddr, charp, 0);
+ MODULE_PARM_DESC(macaddr, "MAC address");
+
++static int packetsize = 0;
++module_param(packetsize, int, 0644);
++MODULE_PARM_DESC(packetsize, "Override the RX URB packet size");
++
+ static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index,
+ u32 *data, int in_pm)
+ {
+@@ -1006,13 +1010,13 @@ static int smsc95xx_reset(struct usbnet
+
+ if (!turbo_mode) {
+ burst_cap = 0;
+- dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE;
++ dev->rx_urb_size = packetsize ? packetsize : MAX_SINGLE_PACKET_SIZE;
+ } else if (dev->udev->speed == USB_SPEED_HIGH) {
+- burst_cap = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE;
+- dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE;
++ dev->rx_urb_size = packetsize ? packetsize : DEFAULT_HS_BURST_CAP_SIZE;
++ burst_cap = dev->rx_urb_size / HS_USB_PKT_SIZE;
+ } else {
+- burst_cap = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE;
+- dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE;
++ dev->rx_urb_size = packetsize ? packetsize : DEFAULT_FS_BURST_CAP_SIZE;
++ burst_cap = dev->rx_urb_size / FS_USB_PKT_SIZE;
+ }
+
+ netif_dbg(dev, ifup, dev->net, "rx_urb_size=%ld\n",
diff --git a/target/linux/brcm2708/patches-4.4/0231-reboot-Use-power-off-rather-than-busy-spinning-when-.patch b/target/linux/brcm2708/patches-4.4/0231-reboot-Use-power-off-rather-than-busy-spinning-when-.patch
new file mode 100644
index 0000000000..f659a6809e
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0231-reboot-Use-power-off-rather-than-busy-spinning-when-.patch
@@ -0,0 +1,25 @@
+From 3ce05d6e2e4994e06ec73ff95969ae189681a8e8 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Tue, 5 Apr 2016 19:40:12 +0100
+Subject: [PATCH 231/232] reboot: Use power off rather than busy spinning when
+ halt is requested
+
+---
+ arch/arm/kernel/reboot.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+--- a/arch/arm/kernel/reboot.c
++++ b/arch/arm/kernel/reboot.c
+@@ -102,11 +102,7 @@ void machine_shutdown(void)
+ */
+ void machine_halt(void)
+ {
+- local_irq_disable();
+- smp_send_stop();
+-
+- local_irq_disable();
+- while (1);
++ machine_power_off();
+ }
+
+ /*
diff --git a/target/linux/brcm2708/patches-4.4/0232-Revert-bcm2835-dma-Fix-dreq-not-set-for-slave-transf.patch b/target/linux/brcm2708/patches-4.4/0232-Revert-bcm2835-dma-Fix-dreq-not-set-for-slave-transf.patch
new file mode 100644
index 0000000000..84b3777084
--- /dev/null
+++ b/target/linux/brcm2708/patches-4.4/0232-Revert-bcm2835-dma-Fix-dreq-not-set-for-slave-transf.patch
@@ -0,0 +1,32 @@
+From ccb9ab7ba94d7b005f4fd820f1cb91caf73dbf89 Mon Sep 17 00:00:00 2001
+From: HiassofT <github@hias.horus.com>
+Date: Wed, 6 Apr 2016 21:45:01 +0200
+Subject: [PATCH 232/232] Revert "bcm2835-dma: Fix dreq not set for slave
+ transfers"
+
+This reverts commit 8ad957e866a1fe1450f663f2b00a57d7de44904c.
+
+
+
+DMA channels are set in devicetree, thus dreq will be set,
+
+and this commit is no longer needed.
+
+
+
+Signed-off-by: Matthias Reichl <hias@horus.com>
+---
+ drivers/dma/bcm2835-dma.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -679,8 +679,6 @@ static int bcm2835_dma_slave_config(stru
+ }
+
+ c->cfg = *cfg;
+- if (!c->dreq)
+- c->dreq = cfg->slave_id;
+
+ return 0;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/1001-smsc95xx-disable-hw-csum.patch b/target/linux/brcm2708/patches-4.4/1001-smsc95xx-disable-hw-csum.patch
deleted file mode 100644
index eff1f0049c..0000000000
--- a/target/linux/brcm2708/patches-4.4/1001-smsc95xx-disable-hw-csum.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/net/usb/smsc95xx.c
-+++ b/drivers/net/usb/smsc95xx.c
-@@ -42,7 +42,7 @@
- #define LAN95XX_EEPROM_MAGIC (0x9500)
- #define EEPROM_MAC_OFFSET (0x01)
- #define DEFAULT_TX_CSUM_ENABLE (true)
--#define DEFAULT_RX_CSUM_ENABLE (true)
-+#define DEFAULT_RX_CSUM_ENABLE (false)
- #define SMSC95XX_INTERNAL_PHY_ID (1)
- #define SMSC95XX_TX_OVERHEAD (8)
- #define SMSC95XX_TX_OVERHEAD_CSUM (12)