brcm2708: update linux 4.4 patches to latest version
authorÁlvaro Fernández Rojas <noltari@gmail.com>
Sat, 10 Sep 2016 12:54:26 +0000 (14:54 +0200)
committerÁlvaro Fernández Rojas <noltari@gmail.com>
Sat, 10 Sep 2016 12:54:26 +0000 (14:54 +0200)
As usual these patches were extracted and rebased from the raspberry pi repo:
https://github.com/raspberrypi/linux/tree/rpi-4.4.y

Also adds support for Raspberry Pi Compute Module 3 (untested).

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
572 files changed:
target/linux/brcm2708/image/Makefile
target/linux/brcm2708/image/config.txt
target/linux/brcm2708/modules.mk
target/linux/brcm2708/patches-4.4/0001-smsx95xx-fix-crimes-against-truesize.patch
target/linux/brcm2708/patches-4.4/0002-smsc95xx-Disable-turbo-mode-by-default.patch
target/linux/brcm2708/patches-4.4/0003-vmstat-Workaround-for-issue-where-dirty-page-count-g.patch
target/linux/brcm2708/patches-4.4/0004-BCM2835_DT-Fix-I2S-register-map.patch
target/linux/brcm2708/patches-4.4/0005-irq-bcm2836-Prevent-spurious-interrupts-and-trap-the.patch
target/linux/brcm2708/patches-4.4/0006-irqchip-bcm2835-Add-FIQ-support.patch
target/linux/brcm2708/patches-4.4/0007-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch
target/linux/brcm2708/patches-4.4/0008-serial-8250-Don-t-crash-when-nr_uarts-is-0.patch
target/linux/brcm2708/patches-4.4/0009-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch
target/linux/brcm2708/patches-4.4/0010-pinctrl-bcm2835-Fix-interrupt-handling-for-GPIOs-28-.patch
target/linux/brcm2708/patches-4.4/0011-pinctrl-bcm2835-Only-request-the-interrupts-listed-i.patch
target/linux/brcm2708/patches-4.4/0012-spi-bcm2835-Support-pin-groups-other-than-7-11.patch
target/linux/brcm2708/patches-4.4/0013-ARM-bcm2835-Set-Serial-number-and-Revision.patch
target/linux/brcm2708/patches-4.4/0014-bcm2835-i2s-get-base-address-for-DMA-from-devicetree.patch
target/linux/brcm2708/patches-4.4/0015-bcm2835-i2s-add-24bit-support-update-bclk_ratio-to-m.patch
target/linux/brcm2708/patches-4.4/0016-bcm2835-i2s-setup-clock-only-if-CPU-is-clock-master.patch
target/linux/brcm2708/patches-4.4/0017-bcm2835-i2s-Eliminate-debugfs-directory-error.patch
target/linux/brcm2708/patches-4.4/0018-bcm2835-i2s-Register-PCM-device.patch
target/linux/brcm2708/patches-4.4/0019-bcm2835-i2s-Enable-MMAP-support-via-a-DT-property.patch
target/linux/brcm2708/patches-4.4/0020-dmaengine-bcm2835-Add-slave-dma-support.patch
target/linux/brcm2708/patches-4.4/0021-dmaengine-bcm2835-set-residue_granularity-field.patch
target/linux/brcm2708/patches-4.4/0022-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch
target/linux/brcm2708/patches-4.4/0023-bcm2835-dma-Fix-dreq-not-set-for-slave-transfers.patch
target/linux/brcm2708/patches-4.4/0024-bcm2835-dma-Limit-cyclic-transfers-on-lite-channels-.patch
target/linux/brcm2708/patches-4.4/0025-bcm2835-Add-support-for-uart1.patch
target/linux/brcm2708/patches-4.4/0026-firmware-bcm2835-Add-missing-property-tags.patch
target/linux/brcm2708/patches-4.4/0027-Main-bcm2708-bcm2709-linux-port.patch
target/linux/brcm2708/patches-4.4/0028-squash-include-ARCH_BCM2708-ARCH_BCM2709.patch
target/linux/brcm2708/patches-4.4/0029-Add-dwc_otg-driver.patch
target/linux/brcm2708/patches-4.4/0030-bcm2708-framebuffer-driver.patch
target/linux/brcm2708/patches-4.4/0031-dmaengine-Add-support-for-BCM2708.patch
target/linux/brcm2708/patches-4.4/0032-MMC-added-alternative-MMC-driver.patch
target/linux/brcm2708/patches-4.4/0033-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch
target/linux/brcm2708/patches-4.4/0034-cma-Add-vc_cma-driver-to-enable-use-of-CMA.patch
target/linux/brcm2708/patches-4.4/0035-bcm2708-alsa-sound-driver.patch
target/linux/brcm2708/patches-4.4/0036-bcm2708-vchiq-driver.patch
target/linux/brcm2708/patches-4.4/0037-vc_mem-Add-vc_mem-driver.patch
target/linux/brcm2708/patches-4.4/0038-vcsm-VideoCore-shared-memory-service-for-BCM2835.patch
target/linux/brcm2708/patches-4.4/0039-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch
target/linux/brcm2708/patches-4.4/0040-Add-SMI-driver.patch
target/linux/brcm2708/patches-4.4/0041-Add-SMI-NAND-driver.patch
target/linux/brcm2708/patches-4.4/0042-lirc-added-support-for-RaspberryPi-GPIO.patch
target/linux/brcm2708/patches-4.4/0043-Add-cpufreq-driver.patch
target/linux/brcm2708/patches-4.4/0044-Added-hwmon-thermal-driver-for-reporting-core-temper.patch
target/linux/brcm2708/patches-4.4/0045-Add-Chris-Boot-s-i2c-driver.patch
target/linux/brcm2708/patches-4.4/0046-char-broadcom-Add-vcio-module.patch
target/linux/brcm2708/patches-4.4/0047-firmware-bcm2835-Support-ARCH_BCM270x.patch
target/linux/brcm2708/patches-4.4/0048-bcm2835-add-v4l2-camera-device.patch
target/linux/brcm2708/patches-4.4/0049-scripts-Add-mkknlimg-and-knlinfo-scripts-from-tools-.patch
target/linux/brcm2708/patches-4.4/0050-fdt-Add-support-for-the-CONFIG_CMDLINE_EXTEND-option.patch
target/linux/brcm2708/patches-4.4/0051-BCM2708-Add-core-Device-Tree-support.patch
target/linux/brcm2708/patches-4.4/0052-bcm2835-Match-with-BCM2708-Device-Trees.patch
target/linux/brcm2708/patches-4.4/0053-fbdev-add-FBIOCOPYAREA-ioctl.patch
target/linux/brcm2708/patches-4.4/0057-Speed-up-console-framebuffer-imageblit-function.patch
target/linux/brcm2708/patches-4.4/0058-Allow-mac-address-to-be-set-in-smsc95xx.patch
target/linux/brcm2708/patches-4.4/0059-enabling-the-realtime-clock-1-wire-chip-DS1307-and-1.patch
target/linux/brcm2708/patches-4.4/0060-Added-Device-IDs-for-August-DVB-T-205.patch
target/linux/brcm2708/patches-4.4/0061-config-Enable-CONFIG_MEMCG-but-leave-it-disabled-due.patch
target/linux/brcm2708/patches-4.4/0062-ASoC-Add-support-for-PCM5102A-codec.patch
target/linux/brcm2708/patches-4.4/0063-ASoC-Add-support-for-HifiBerry-DAC.patch
target/linux/brcm2708/patches-4.4/0064-ASoC-Add-support-for-Rpi-DAC.patch
target/linux/brcm2708/patches-4.4/0065-ASoC-wm8804-Implement-MCLK-configuration-options-add.patch
target/linux/brcm2708/patches-4.4/0066-ASoC-BCM-Add-support-for-HiFiBerry-Digi.-Driver-is-b.patch
target/linux/brcm2708/patches-4.4/0067-ASoC-wm8804-Set-idle_bias_off-to-false-Idle-bias-has.patch
target/linux/brcm2708/patches-4.4/0068-Add-IQaudIO-Sound-Card-support-for-Raspberry-Pi.patch
target/linux/brcm2708/patches-4.4/0069-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch
target/linux/brcm2708/patches-4.4/0070-Added-support-for-HiFiBerry-DAC.patch
target/linux/brcm2708/patches-4.4/0071-Added-driver-for-HiFiBerry-Amp-amplifier-add-on-boar.patch
target/linux/brcm2708/patches-4.4/0072-Update-ds1307-driver-for-device-tree-support.patch
target/linux/brcm2708/patches-4.4/0073-BCM270x_DT-Add-pwr_led-and-the-required-input-trigge.patch
target/linux/brcm2708/patches-4.4/0074-enc28j60-Add-device-tree-compatible-string-and-an-ov.patch
target/linux/brcm2708/patches-4.4/0075-Add-driver-for-rpi-proto.patch
target/linux/brcm2708/patches-4.4/0076-config-Add-default-configs.patch
target/linux/brcm2708/patches-4.4/0077-bcm2835-bcm2835_defconfig.patch
target/linux/brcm2708/patches-4.4/0078-rpi-ft5406-Add-touchscreen-driver-for-pi-LCD-display.patch
target/linux/brcm2708/patches-4.4/0079-Improve-__copy_to_user-and-__copy_from_user-performa.patch
target/linux/brcm2708/patches-4.4/0080-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch
target/linux/brcm2708/patches-4.4/0081-spidev-Add-spidev-compatible-string-to-silence-warni.patch
target/linux/brcm2708/patches-4.4/0082-scripts-dtc-Add-overlay-support.patch
target/linux/brcm2708/patches-4.4/0083-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch
target/linux/brcm2708/patches-4.4/0084-RaspiDAC3-support.patch
target/linux/brcm2708/patches-4.4/0085-tpa6130a2-Add-headphone-switch-control.patch
target/linux/brcm2708/patches-4.4/0086-irq-bcm2835-Fix-building-with-2708.patch
target/linux/brcm2708/patches-4.4/0087-rpi_display-add-backlight-driver-and-overlay.patch
target/linux/brcm2708/patches-4.4/0088-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch
target/linux/brcm2708/patches-4.4/0089-scripts-Multi-platform-support-for-mkknlimg-and-knli.patch
target/linux/brcm2708/patches-4.4/0090-drm-vc4-Add-suport-for-3D-rendering-using-the-V3D-en.patch
target/linux/brcm2708/patches-4.4/0091-drm-vc4-Force-HDMI-to-connected.patch
target/linux/brcm2708/patches-4.4/0092-drm-vc4-bo-cache-locking-fixes.patch
target/linux/brcm2708/patches-4.4/0093-drm-vc4-bo-cache-locking-cleanup.patch
target/linux/brcm2708/patches-4.4/0094-drm-vc4-Use-job_lock-to-protect-seqno_cb_list.patch
target/linux/brcm2708/patches-4.4/0095-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
target/linux/brcm2708/patches-4.4/0096-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
target/linux/brcm2708/patches-4.4/0097-drm-vc4-Add-support-for-more-display-plane-formats.patch
target/linux/brcm2708/patches-4.4/0098-drm-vc4-No-need-to-stop-the-stopped-threads.patch
target/linux/brcm2708/patches-4.4/0099-drm-vc4-Remove-extra-barrier-s-aroudn-CTnCA-CTnEA-se.patch
target/linux/brcm2708/patches-4.4/0100-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch
target/linux/brcm2708/patches-4.4/0101-drm-vc4-Enable-VC4-modules-and-increase-CMA-size-wit.patch
target/linux/brcm2708/patches-4.4/0102-squash-fixups.patch
target/linux/brcm2708/patches-4.4/0103-squash-add-missing-vc4-kms-v3d-overlay.dtb-to-makefi.patch
target/linux/brcm2708/patches-4.4/0104-clk-bcm2835-Also-build-the-driver-for-downstream-ker.patch
target/linux/brcm2708/patches-4.4/0105-dts-Added-overlay-for-gpio_ir_recv-driver.patch
target/linux/brcm2708/patches-4.4/0106-Build-i2c_gpio-module-and-add-a-device-tree-overlay-.patch
target/linux/brcm2708/patches-4.4/0107-New-overlay-for-PiScreen2r.patch
target/linux/brcm2708/patches-4.4/0108-dts-Added-overlay-for-Adafruit-PiTFT-2.8-capacitive-.patch
target/linux/brcm2708/patches-4.4/0109-Add-support-for-the-HiFiBerry-DAC-Pro.patch
target/linux/brcm2708/patches-4.4/0110-BCM270X_DT-Add-at86rf233-overlay.patch
target/linux/brcm2708/patches-4.4/0111-mm-Remove-the-PFN-busy-warning.patch
target/linux/brcm2708/patches-4.4/0112-drm-Put-an-optional-field-in-the-driver-struct-for-G.patch
target/linux/brcm2708/patches-4.4/0113-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch
target/linux/brcm2708/patches-4.4/0114-drm-vc4-Update-a-bunch-of-code-to-match-upstream-sub.patch
target/linux/brcm2708/patches-4.4/0115-drm-Use-the-driver-s-gem_object_free-function-from-C.patch
target/linux/brcm2708/patches-4.4/0116-drm-vc4-Add-support-for-MSAA-rendering.patch
target/linux/brcm2708/patches-4.4/0117-drm-vc4-A-few-more-non-functional-changes-to-sync-to.patch
target/linux/brcm2708/patches-4.4/0118-drm-vc4-Use-hpd-gpios-for-HDMI-GPIO-like-what-landed.patch
target/linux/brcm2708/patches-4.4/0119-drm-vc4-Synchronize-validation-code-for-v2-submissio.patch
target/linux/brcm2708/patches-4.4/0120-MMC-Do-not-use-mmc_debug-if-CONFIG_MMC_BCM2835-is-no.patch
target/linux/brcm2708/patches-4.4/0121-Extend-clock-timeout-fix-modprobe-baudrate-parameter.patch
target/linux/brcm2708/patches-4.4/0122-bcm270x_dt-Add-dwc2-and-dwc-otg-overlays.patch
target/linux/brcm2708/patches-4.4/0123-BCM270X_DT-Add-the-sdtweak-overlay-for-tuning-sdhost.patch
target/linux/brcm2708/patches-4.4/0124-bcm2835-mmc-Don-t-override-bus-width-capabilities-fr.patch
target/linux/brcm2708/patches-4.4/0125-SDIO-overlay-add-bus_width-parameter.patch
target/linux/brcm2708/patches-4.4/0126-bcm2835-extend-allowed-range-of-channels-and-sampler.patch
target/linux/brcm2708/patches-4.4/0127-bcm2835-restrict-channels-rate-to-8-960000.patch
target/linux/brcm2708/patches-4.4/0128-rpi-update-vc_vchi_audioserv_defs.h.patch
target/linux/brcm2708/patches-4.4/0129-bcm2835-implement-channel-map-API.patch
target/linux/brcm2708/patches-4.4/0130-bcm2835-access-controls-under-the-audio-mutex.patch
target/linux/brcm2708/patches-4.4/0131-bcm2835-always-use-2-4-8-channels-for-multichannel-l.patch
target/linux/brcm2708/patches-4.4/0132-bcm2835-only-allow-stereo-if-analogue-jack-is-select.patch
target/linux/brcm2708/patches-4.4/0133-bcm2835-interpolate-audio-delay.patch
target/linux/brcm2708/patches-4.4/0134-bcm2835-sdhost-Add-workaround-for-odd-behaviour-on-s.patch
target/linux/brcm2708/patches-4.4/0135-bcm2835-sdhost-Add-debug_flags-dtparam.patch
target/linux/brcm2708/patches-4.4/0136-BCM270X_DT-Add-sdio_overclock-parameter-to-sdio-over.patch
target/linux/brcm2708/patches-4.4/0137-rtc-ds1307-add-support-for-the-DT-property-wakeup-so.patch
target/linux/brcm2708/patches-4.4/0138-dt-overlay-add-wittypi-overlay.dts.patch
target/linux/brcm2708/patches-4.4/0139-FIXUP-i2c_bcm2708-Don-t-change-module-baudrate-param.patch
target/linux/brcm2708/patches-4.4/0140-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch
target/linux/brcm2708/patches-4.4/0141-Limit-PCM512x-Digital-gain-to-0dB-by-default-with-Hi.patch
target/linux/brcm2708/patches-4.4/0142-BCM270X_DT-Adjust-overlay-README-formatting.patch
target/linux/brcm2708/patches-4.4/0143-bcm2835-sdhost-Major-revision.patch
target/linux/brcm2708/patches-4.4/0144-BCM270X_DT-Add-dtparams-for-the-SD-interface.patch
target/linux/brcm2708/patches-4.4/0145-dcw_otg-trim-xfer-length-when-buffer-larger-than-all.patch
target/linux/brcm2708/patches-4.4/0146-bcm2835-sdhost-Restore-ATOMIC-flag-to-PIO-sg-mapping.patch
target/linux/brcm2708/patches-4.4/0147-Updated-smsc95xx-driver-to-check-for-a-valid-MAC-add.patch
target/linux/brcm2708/patches-4.4/0148-dcw_otg-Make-trimming-messages-less-noisy.patch
target/linux/brcm2708/patches-4.4/0149-BCM270X_DT-at86rf233-overlay-drop-to-3MHz.patch
target/linux/brcm2708/patches-4.4/0150-bcm2835-sdhost-Downgrade-log-message-status.patch
target/linux/brcm2708/patches-4.4/0151-config-Enable-HCI-over-UARTs.patch
target/linux/brcm2708/patches-4.4/0152-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch
target/linux/brcm2708/patches-4.4/0153-amba_pl011-Don-t-use-DT-aliases-for-numbering.patch
target/linux/brcm2708/patches-4.4/0154-clk-bcm2835-Add-bindings-for-the-auxiliary-periphera.patch
target/linux/brcm2708/patches-4.4/0155-clk-bcm2835-Add-a-driver-for-the-auxiliary-periphera.patch
target/linux/brcm2708/patches-4.4/0156-Aux-SPI-1-2-implementation.patch
target/linux/brcm2708/patches-4.4/0157-ASoC-bcm-add-missing-.owner-fields-in-sound-card-dri.patch
target/linux/brcm2708/patches-4.4/0158-smsx95xx-Add-option-to-disable-the-crimes-against-tr.patch
target/linux/brcm2708/patches-4.4/0159-bcm2835-virtgpio-Virtual-GPIO-driver.patch
target/linux/brcm2708/patches-4.4/0160-BCM270X_DT-Add-Pi3-support.patch
target/linux/brcm2708/patches-4.4/0161-DT-Add-overlays-to-configure-I2C-pins.patch
target/linux/brcm2708/patches-4.4/0162-bcm2835-camera-fix-a-bug-in-computation-of-frame-tim.patch
target/linux/brcm2708/patches-4.4/0163-BCM270X_DT-Add-pi3-disable-bt-overlay.patch
target/linux/brcm2708/patches-4.4/0164-BCM270X_DT-Add-pi3-miniuart-bt-DT-overlay.patch
target/linux/brcm2708/patches-4.4/0165-Pi3-DT-Add-dtparams-for-the-SD-interface.patch
target/linux/brcm2708/patches-4.4/0166-vchiq_arm-Tweak-the-logging-output.patch
target/linux/brcm2708/patches-4.4/0167-bcm2835-sdhost-Only-claim-one-DMA-channel.patch
target/linux/brcm2708/patches-4.4/0168-bcm2835-mmc-Only-claim-one-DMA-channel.patch
target/linux/brcm2708/patches-4.4/0169-config-rebuild-with-savedefconfig.patch
target/linux/brcm2708/patches-4.4/0170-config-Add-module-for-mcp3422-ADC.patch
target/linux/brcm2708/patches-4.4/0171-Pi3-DT-Add-pull-ups-on-the-UART-RX-lines.patch
target/linux/brcm2708/patches-4.4/0173-BCM270X_DT-rpi-display-overlay-add-swapxy-param.patch
target/linux/brcm2708/patches-4.4/0174-Remove-I2S-config-from-bt_pins.patch
target/linux/brcm2708/patches-4.4/0175-Revert-scripts-dtc-Add-overlay-support.patch
target/linux/brcm2708/patches-4.4/0176-scripts-dtc-Update-to-upstream-version-1.4.1.patch
target/linux/brcm2708/patches-4.4/0177-configfs-implement-binary-attributes.patch
target/linux/brcm2708/patches-4.4/0178-OF-DT-Overlay-configfs-interface.patch
target/linux/brcm2708/patches-4.4/0179-Protect-__release_resource-against-resources-without.patch
target/linux/brcm2708/patches-4.4/0180-BCM270X_DT-Add-a-.dtbo-target-use-for-overlays.patch
target/linux/brcm2708/patches-4.4/0181-scripts-knlinfo-Decode-DDTK-atom.patch
target/linux/brcm2708/patches-4.4/0182-Enable-Dynamic-Device-Tree-for-bcmrpi_defconfig-and-.patch
target/linux/brcm2708/patches-4.4/0183-SQUASH-Add-CONFIG_OF_CONFIGFS-to-bcmrpi_defconfig.patch
target/linux/brcm2708/patches-4.4/0184-dts-kbuild-dtbs_install-installs-.dtbo-files-too.patch
target/linux/brcm2708/patches-4.4/0185-bcm2835-sdhost-Workaround-for-slow-sectors.patch
target/linux/brcm2708/patches-4.4/0186-BCM270X_DT-Add-labels-to-spidev-nodes.patch
target/linux/brcm2708/patches-4.4/0187-BCM270X_DT-Use-spidev-labels-in-overlays.patch
target/linux/brcm2708/patches-4.4/0188-BCM270X_DT-Build-and-document-the-wittypi-overlay.patch
target/linux/brcm2708/patches-4.4/0189-scripts-dtc-Fix-UMR-causing-corrupt-dtbo-overlay-fil.patch
target/linux/brcm2708/patches-4.4/0190-BCM270X_DT-Add-dtparam-for-uart1.patch
target/linux/brcm2708/patches-4.4/0191-dwc-overlay-Use-label-so-overrides-can-apply.patch
target/linux/brcm2708/patches-4.4/0192-drm-vc4-Add-a-debugfs-node-for-tracking-execution-st.patch
target/linux/brcm2708/patches-4.4/0193-drm-vc4-Include-vc4_drm.h-in-uapi-in-downstream-buil.patch
target/linux/brcm2708/patches-4.4/0194-drm-vc4-Validate-that-WAIT_BO-padding-is-cleared.patch
target/linux/brcm2708/patches-4.4/0195-drm-vc4-Fix-the-clear-color-for-the-first-tile-rende.patch
target/linux/brcm2708/patches-4.4/0196-drm-vc4-Return-an-ERR_PTR-from-BO-creation-instead-o.patch
target/linux/brcm2708/patches-4.4/0197-drm-vc4-Fix-ERESTARTSYS-error-return-from-BO-waits.patch
target/linux/brcm2708/patches-4.4/0198-drm-vc4-Drop-error-message-on-seqno-wait-timeouts.patch
target/linux/brcm2708/patches-4.4/0199-BCM270X_DT-Add-1-bit-SDIO-using-minimal-pins.patch
target/linux/brcm2708/patches-4.4/0201-Add-overlay-and-enable-support-for-QCA7000-board.patch
target/linux/brcm2708/patches-4.4/0202-serial-Take-care-starting-a-hung-up-tty-s-port.patch
target/linux/brcm2708/patches-4.4/0203-pi3-miniuart-bt-overlay-Correct-and-clarify-info.patch
target/linux/brcm2708/patches-4.4/0204-pwm-overlays-Params-must-have-in-overlay-targets.patch
target/linux/brcm2708/patches-4.4/0205-BCM270X_DT-Switch-Compute-Module-to-MMC.patch
target/linux/brcm2708/patches-4.4/0206-dwc_otg-Don-t-free-qh-align-buffers-in-atomic-contex.patch
target/linux/brcm2708/patches-4.4/0207-dwc_otg-Enable-the-hack-for-Split-Interrupt-transact.patch
target/linux/brcm2708/patches-4.4/0208-BCM270X_DT-Remove-explicit-claiming-of-UART-pins.patch
target/linux/brcm2708/patches-4.4/0209-lirc_rpi-Lower-IR-reception-error-to-debug.patch
target/linux/brcm2708/patches-4.4/0210-vchiq_arm-Access-the-dequeue_pending-flag-locked.patch
target/linux/brcm2708/patches-4.4/0211-BCM270X_DT-Add-pi3-act-led-overlay.patch
target/linux/brcm2708/patches-4.4/0212-vchiq_arm-Service-callbacks-must-not-fail.patch
target/linux/brcm2708/patches-4.4/0213-Add-configs-and-overlay-for-PCA9548-I2C-mux.patch
target/linux/brcm2708/patches-4.4/0214-BCM270X_DT-Add-DS1339-to-i2c-rtc-overlay.patch
target/linux/brcm2708/patches-4.4/0215-copy_from_user-CPU_SW_DOMAIN_PAN-compatibility.patch
target/linux/brcm2708/patches-4.4/0216-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
target/linux/brcm2708/patches-4.4/0217-BCM270X_DT-Document-hazards-of-sdhost-overlay.patch
target/linux/brcm2708/patches-4.4/0218-cpufreq-Temporarily-ignore-io_is_busy-1.patch
target/linux/brcm2708/patches-4.4/0219-Revert-cpufreq-Temporarily-ignore-io_is_busy-1.patch
target/linux/brcm2708/patches-4.4/0220-net-sched-add-skb_at_tc_ingress-helper.patch
target/linux/brcm2708/patches-4.4/0221-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch [deleted file]
target/linux/brcm2708/patches-4.4/0222-bcm2835-sdhost-Precalc-divisors-and-overclocks.patch
target/linux/brcm2708/patches-4.4/0223-Revert-bcm2835-sdhost-Precalc-divisors-and-overclock.patch
target/linux/brcm2708/patches-4.4/0224-Revert-bcm2835-sdhost-Adjust-to-core-clock-changes.patch
target/linux/brcm2708/patches-4.4/0225-bcm2835-sdhost-Firmware-manages-the-clock-divisor.patch
target/linux/brcm2708/patches-4.4/0226-Revert-Revert-cpufreq-Temporarily-ignore-io_is_busy-.patch
target/linux/brcm2708/patches-4.4/0227-config-Enabled-IPV6_SUBTREES.patch
target/linux/brcm2708/patches-4.4/0228-add-smsc95xx-packetsize-module_param.patch
target/linux/brcm2708/patches-4.4/0229-reboot-Use-power-off-rather-than-busy-spinning-when-.patch
target/linux/brcm2708/patches-4.4/0230-Revert-bcm2835-dma-Fix-dreq-not-set-for-slave-transf.patch
target/linux/brcm2708/patches-4.4/0231-RPi-config-Add-CONFIG_PWM_PCA9685-for-NXP-PCA9685-dr.patch
target/linux/brcm2708/patches-4.4/0232-BCM270X_DT-Don-t-generate-linux-phandle-props.patch
target/linux/brcm2708/patches-4.4/0233-V4L2-driver-updates-1393.patch
target/linux/brcm2708/patches-4.4/0234-bcm2835-sdhost-Reset-the-clock-in-task-context.patch
target/linux/brcm2708/patches-4.4/0235-config-Enable-CONFIG_IPV6_ROUTER_PREF-for-networks-w.patch
target/linux/brcm2708/patches-4.4/0236-Enable-hid-betopff-module.patch
target/linux/brcm2708/patches-4.4/0237-config-Make-IPV6-a-module-and-regenerate-with-defcon.patch
target/linux/brcm2708/patches-4.4/0238-BCM270X_DT-Add-dpi24-overlay.patch
target/linux/brcm2708/patches-4.4/0239-Modify-IQAudIO-DAC-ASoC-driver-to-set-card-dai-confi.patch
target/linux/brcm2708/patches-4.4/0240-Add-support-for-the-Digital-Dreamtime-Akkordion-musi.patch
target/linux/brcm2708/patches-4.4/0241-Add-Support-for-BoomBerry-Audio-boards.patch
target/linux/brcm2708/patches-4.4/0242-Add-support-for-mcp7940x-family-of-RTC.patch
target/linux/brcm2708/patches-4.4/0243-bcm2709_defconfig-Fix-typo-on-BoomBerry-configuratio.patch
target/linux/brcm2708/patches-4.4/0244-boomberry-dac-Adjust-for-ALSA-API-change.patch
target/linux/brcm2708/patches-4.4/0245-vmcs-Remove-unused-sm_cache_map_vector-definition-14.patch
target/linux/brcm2708/patches-4.4/0246-scripts-mkknlimg-Append-a-trailer-for-all-input.patch
target/linux/brcm2708/patches-4.4/0247-bcm2835_thermal-Don-t-report-unsupported-trip-type.patch
target/linux/brcm2708/patches-4.4/0248-scripts-dtc-Only-emit-local-fixups-for-overlays.patch
target/linux/brcm2708/patches-4.4/0249-bcm2835-do-not-require-substream-for-accessing-chmap.patch
target/linux/brcm2708/patches-4.4/0250-bcm2835-add-fallback-channel-layouts-if-channel-map-.patch
target/linux/brcm2708/patches-4.4/0251-bcm2835-log-which-channel-map-is-set.patch
target/linux/brcm2708/patches-4.4/0252-clk-bcm2835-add-a-round-up-ability-to-the-clock-divi.patch
target/linux/brcm2708/patches-4.4/0253-clk-bcm2835-Support-for-clock-parent-selection.patch
target/linux/brcm2708/patches-4.4/0254-clk-bcm2835-Add-PWM-clock-support.patch
target/linux/brcm2708/patches-4.4/0255-clk-bcm2835-added-missing-clock-register-definitions.patch
target/linux/brcm2708/patches-4.4/0256-clk-bcm2835-correctly-enable-fractional-clock-suppor.patch
target/linux/brcm2708/patches-4.4/0257-clk-bcm2835-clean-up-coding-style-issues.patch
target/linux/brcm2708/patches-4.4/0258-clk-bcm2835-expose-raw-clock-registers-via-debugfs.patch
target/linux/brcm2708/patches-4.4/0259-clk-bcm2835-remove-use-of-BCM2835_CLOCK_COUNT-in-dri.patch
target/linux/brcm2708/patches-4.4/0260-clk-bcm2835-reorganize-bcm2835_clock_array-assignmen.patch
target/linux/brcm2708/patches-4.4/0261-clk-bcm2835-enable-management-of-PCM-clock.patch
target/linux/brcm2708/patches-4.4/0262-clk-bcm2835-add-missing-PLL-clock-dividers.patch
target/linux/brcm2708/patches-4.4/0263-clk-bcm2835-add-missing-osc-and-per-clocks.patch
target/linux/brcm2708/patches-4.4/0264-ARM-bcm2835-Define-two-new-packets-from-the-latest-f.patch
target/linux/brcm2708/patches-4.4/0265-ARM-bcm2835-add-rpi-power-domain-driver.patch
target/linux/brcm2708/patches-4.4/0266-ARM-bcm2835-clarify-RASPBERRYPI_FIRMWARE-dependency.patch
target/linux/brcm2708/patches-4.4/0267-ARM-bcm2708-Enable-building-power-domain-driver.patch
target/linux/brcm2708/patches-4.4/0268-bcm2708-Add-RASPBERRYPI_POWER-to-the-defconfigs.patch
target/linux/brcm2708/patches-4.4/0269-bcm2708-Add-the-power-domain-driver-to-the-device-tr.patch
target/linux/brcm2708/patches-4.4/0270-bcm2708-Reference-the-HDMI-power-domain-for-the-HDMI.patch
target/linux/brcm2708/patches-4.4/0271-drm-vc4-copy_to_user-returns-the-number-of-bytes-rem.patch
target/linux/brcm2708/patches-4.4/0272-drm-vc4-allocate-enough-memory-in-vc4_save_hang_stat.patch
target/linux/brcm2708/patches-4.4/0273-drm-vc4-fix-warning-in-validate-printf.patch
target/linux/brcm2708/patches-4.4/0274-drm-vc4-Improve-comments-on-vc4_plane_state-members.patch
target/linux/brcm2708/patches-4.4/0275-drm-vc4-Add-missing-__iomem-annotation-to-hw_dlist.patch
target/linux/brcm2708/patches-4.4/0276-drm-vc4-Move-the-plane-clipping-scaling-setup-to-a-s.patch
target/linux/brcm2708/patches-4.4/0277-drm-vc4-Add-a-proper-short-circut-path-for-legacy-cu.patch
target/linux/brcm2708/patches-4.4/0278-drm-vc4-Make-the-CRTCs-cooperate-on-allocating-displ.patch
target/linux/brcm2708/patches-4.4/0279-drm-vc4-Add-more-display-planes-to-each-CRTC.patch
target/linux/brcm2708/patches-4.4/0280-drm-vc4-Fix-which-value-is-being-used-for-source-ima.patch
target/linux/brcm2708/patches-4.4/0281-drm-vc4-Add-support-for-scaling-of-display-planes.patch
target/linux/brcm2708/patches-4.4/0282-drm-vc4-Add-support-for-YUV-planes.patch
target/linux/brcm2708/patches-4.4/0283-drm-vc4-Fix-spurious-GPU-resets-due-to-BO-reuse.patch
target/linux/brcm2708/patches-4.4/0284-drm-vc4-Fix-a-framebuffer-reference-leak-on-async-fl.patch
target/linux/brcm2708/patches-4.4/0285-drm-vc4-Bring-HDMI-up-from-power-off-if-necessary.patch
target/linux/brcm2708/patches-4.4/0286-drm-vc4-Add-another-reg-to-HDMI-debug-dumping.patch
target/linux/brcm2708/patches-4.4/0287-drm-vc4-Fix-the-name-of-the-VSYNCD_EVEN-register.patch
target/linux/brcm2708/patches-4.4/0288-drm-vc4-Fix-setting-of-vertical-timings-in-the-CRTC.patch
target/linux/brcm2708/patches-4.4/0289-drm-vc4-Initialize-scaler-DISPBKGND-on-modeset.patch
target/linux/brcm2708/patches-4.4/0290-drm-vc4-improve-throughput-by-pipelining-binning-and.patch
target/linux/brcm2708/patches-4.4/0291-drm-vc4-Let-gpiolib-know-that-we-re-OK-with-sleeping.patch
target/linux/brcm2708/patches-4.4/0292-drm-vc4-Respect-GPIO_ACTIVE_LOW-on-HDMI-HPD-if-set-i.patch
target/linux/brcm2708/patches-4.4/0293-drm-vc4-Return-EFAULT-on-copy_from_user-failure.patch
target/linux/brcm2708/patches-4.4/0294-drm-vc4-Recognize-a-more-specific-compatible-string-.patch
target/linux/brcm2708/patches-4.4/0295-ARM-bcm2708-Move-the-CMA-range-down-for-kernel-4.4.patch
target/linux/brcm2708/patches-4.4/0296-clk-bcm2835-fix-check-of-error-code-returned-by-devm.patch
target/linux/brcm2708/patches-4.4/0297-vchiq_arm-Add-completion-records-under-the-mutex.patch
target/linux/brcm2708/patches-4.4/0298-config-Add-DRM_UDL-module.patch
target/linux/brcm2708/patches-4.4/0299-bcm2835-i2s-Reduce-the-TX-DREQ-threshold.patch
target/linux/brcm2708/patches-4.4/0300-V4L2-Request-maximum-resolution-from-GPU.patch
target/linux/brcm2708/patches-4.4/0301-ARM-bcm2835-add-i2s-gpio28-31-for-cm.patch
target/linux/brcm2708/patches-4.4/0302-drm-vc4-Add-DT-parameters-to-control-CMA-usage.patch
target/linux/brcm2708/patches-4.4/0303-SQUASH-BCM270X_DT-Add-make-rule-for-sdio-1bit.patch
target/linux/brcm2708/patches-4.4/0304-dts-add-overlay-for-pitft22.patch
target/linux/brcm2708/patches-4.4/0305-BCM270X_DT-Sound-DT-adjustments-for-Dynamic-DT.patch
target/linux/brcm2708/patches-4.4/0306-BCM270X_DT-Fix-codec-use-in-hifiberry-dac-overlay.patch
target/linux/brcm2708/patches-4.4/0309-Revert-bcm2835-log-which-channel-map-is-set.patch
target/linux/brcm2708/patches-4.4/0310-Revert-bcm2835-add-fallback-channel-layouts-if-chann.patch
target/linux/brcm2708/patches-4.4/0311-Revert-bcm2835-do-not-require-substream-for-accessin.patch
target/linux/brcm2708/patches-4.4/0312-Revert-bcm2835-interpolate-audio-delay.patch
target/linux/brcm2708/patches-4.4/0313-Revert-bcm2835-only-allow-stereo-if-analogue-jack-is.patch
target/linux/brcm2708/patches-4.4/0314-Revert-bcm2835-always-use-2-4-8-channels-for-multich.patch
target/linux/brcm2708/patches-4.4/0315-Revert-bcm2835-implement-channel-map-API.patch
target/linux/brcm2708/patches-4.4/0316-Revert-bcm2835-extend-allowed-range-of-channels-and-.patch
target/linux/brcm2708/patches-4.4/0317-pinctrl-bcm2835-Return-pins-to-inputs-when-freed.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0318-BCM270X_DT-i2c0-bcm2708-pin-group-params.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0318-pinctrl-bcm2835-Return-pins-to-inputs-when-freed.patch [deleted file]
target/linux/brcm2708/patches-4.4/0319-BCM270X_DT-i2c0-bcm2708-pin-group-params.patch [deleted file]
target/linux/brcm2708/patches-4.4/0319-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0320-Revert-rpi-update-vc_vchi_audioserv_defs.h.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0320-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch [deleted file]
target/linux/brcm2708/patches-4.4/0321-Revert-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0321-Revert-rpi-update-vc_vchi_audioserv_defs.h.patch [deleted file]
target/linux/brcm2708/patches-4.4/0322-ARM-adau1977-adc-Add-basic-machine-driver-for-adau19.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0322-Revert-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch [deleted file]
target/linux/brcm2708/patches-4.4/0323-ARM-adau1977-adc-Add-basic-machine-driver-for-adau19.patch [deleted file]
target/linux/brcm2708/patches-4.4/0323-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0324-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch [deleted file]
target/linux/brcm2708/patches-4.4/0324-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0325-BCM270X_DT-Move-vc4-node-contents-to-bcm2708_common..patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0325-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch [deleted file]
target/linux/brcm2708/patches-4.4/0326-BCM270X_DT-Move-vc4-node-contents-to-bcm2708_common..patch [deleted file]
target/linux/brcm2708/patches-4.4/0326-BCM270X_DT-Set-correct-HDMI-HPD-GPIO-levels-for-vari.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0327-BCM270X_DT-Set-correct-HDMI-HPD-GPIO-levels-for-vari.patch [deleted file]
target/linux/brcm2708/patches-4.4/0327-Revert-drm-vc4-Force-HDMI-to-connected.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0328-BCM270X-Include-DRM_PANEL_SIMPLE-in-the-defconfigs.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0328-Revert-drm-vc4-Force-HDMI-to-connected.patch [deleted file]
target/linux/brcm2708/patches-4.4/0329-BCM270X-Include-DRM_PANEL_SIMPLE-in-the-defconfigs.patch [deleted file]
target/linux/brcm2708/patches-4.4/0329-drm-Add-an-encoder-and-connector-type-enum-for-DPI.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0330-drm-Add-an-encoder-and-connector-type-enum-for-DPI.patch [deleted file]
target/linux/brcm2708/patches-4.4/0330-dt-bindings-Add-binding-docs-for-V3D.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0331-drm-vc4-Add-DPI-driver.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0331-dt-bindings-Add-binding-docs-for-V3D.patch [deleted file]
target/linux/brcm2708/patches-4.4/0332-drm-vc4-Add-DPI-driver.patch [deleted file]
target/linux/brcm2708/patches-4.4/0332-drm-vc4-Fix-NULL-deref-in-HDMI-init-error-path.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0333-drm-vc4-Fix-NULL-deref-in-HDMI-init-error-path.patch [deleted file]
target/linux/brcm2708/patches-4.4/0333-drm-vc4-Kick-out-the-simplefb-framebuffer-before-we-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0334-drm-vc4-Kick-out-the-simplefb-framebuffer-before-we-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0334-drm-vc4-Rename-async-to-nonblock.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0335-drm-vc4-Add-support-for-gamma-ramps.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0335-drm-vc4-Rename-async-to-nonblock.patch [deleted file]
target/linux/brcm2708/patches-4.4/0336-drm-vc4-Add-missing-render-node-support.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0336-drm-vc4-Add-support-for-gamma-ramps.patch [deleted file]
target/linux/brcm2708/patches-4.4/0337-drm-panel-simple-Add-the-7-DPI-panel-from-Adafruit.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0337-drm-vc4-Add-missing-render-node-support.patch [deleted file]
target/linux/brcm2708/patches-4.4/0338-BCM270X_DT-Add-the-disabled-by-default-DPI-device-no.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0338-drm-panel-simple-Add-the-7-DPI-panel-from-Adafruit.patch [deleted file]
target/linux/brcm2708/patches-4.4/0339-BCM270X_DT-Add-the-disabled-by-default-DPI-device-no.patch [deleted file]
target/linux/brcm2708/patches-4.4/0339-drm-vc4-Fix-get_vblank_counter-with-proper-no-op-for.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0340-drm-vc4-Fix-drm_vblank_put-get-imbalance-in-page-fli.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0340-drm-vc4-Fix-get_vblank_counter-with-proper-no-op-for.patch [deleted file]
target/linux/brcm2708/patches-4.4/0341-BCM270X_DT-Add-umbrella-I2C-Mux-overlay-i2c-mux.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0341-drm-vc4-Fix-drm_vblank_put-get-imbalance-in-page-fli.patch [deleted file]
target/linux/brcm2708/patches-4.4/0342-BCM270X_DT-Add-umbrella-I2C-Mux-overlay-i2c-mux.patch [deleted file]
target/linux/brcm2708/patches-4.4/0342-BCM270X_DT-Include-address-override-for-pca9542.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0343-BCM270X_DT-Fix-the-tinylcd35-overlay-RTC-support.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0343-BCM270X_DT-Include-address-override-for-pca9542.patch [deleted file]
target/linux/brcm2708/patches-4.4/0344-BCM270X_DT-Fix-the-tinylcd35-overlay-RTC-support.patch [deleted file]
target/linux/brcm2708/patches-4.4/0344-clk-Allow-clocks-to-be-marked-as-CRITICAL.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0345-clk-Allow-clocks-to-be-marked-as-CRITICAL.patch [deleted file]
target/linux/brcm2708/patches-4.4/0345-clk-bcm2835-Mark-the-VPU-clock-as-critical.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0346-clk-bcm2835-Mark-GPIO-clocks-enabled-at-boot-as-crit.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0346-clk-bcm2835-Mark-the-VPU-clock-as-critical.patch [deleted file]
target/linux/brcm2708/patches-4.4/0347-clk-bcm2835-Mark-GPIO-clocks-enabled-at-boot-as-crit.patch [deleted file]
target/linux/brcm2708/patches-4.4/0347-clk-bcm2835-Skip-PLLC-clocks-when-deciding-on-a-new-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0348-clk-bcm2835-Skip-PLLC-clocks-when-deciding-on-a-new-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0348-mmc-Add-MMC_QUIRK_ERASE_BROKEN-for-some-cards.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0349-New-AudioInjector.net-Pi-soundcard-with-low-jitter-a.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0349-mmc-Add-MMC_QUIRK_ERASE_BROKEN-for-some-cards.patch [deleted file]
target/linux/brcm2708/patches-4.4/0350-New-AudioInjector.net-Pi-soundcard-with-low-jitter-a.patch [deleted file]
target/linux/brcm2708/patches-4.4/0350-mmc-Apply-QUIRK_BROKEN_ERASE-to-other-capacities.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0351-mmc-Apply-QUIRK_BROKEN_ERASE-to-other-capacities.patch [deleted file]
target/linux/brcm2708/patches-4.4/0352-mmc-Add-card_quirks-module-parameter-log-quirks.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0353-mmc-Add-card_quirks-module-parameter-log-quirks.patch [deleted file]
target/linux/brcm2708/patches-4.4/0353-rtc-ds1307-ensure-that-any-pending-alarm-is-cleared-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0354-Revert-Revert-drm-vc4-Force-HDMI-to-connected.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0354-rtc-ds1307-ensure-that-any-pending-alarm-is-cleared-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0355-Revert-Revert-drm-vc4-Force-HDMI-to-connected.patch [deleted file]
target/linux/brcm2708/patches-4.4/0355-config-Add-NF_MATCH_RPFILTER.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0356-Added-Overlay-for-Microchip-MCP23017-I2C-gpio-expand.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0356-config-Add-NF_MATCH_RPFILTER.patch [deleted file]
target/linux/brcm2708/patches-4.4/0357-Added-Overlay-for-Microchip-MCP23017-I2C-gpio-expand.patch [deleted file]
target/linux/brcm2708/patches-4.4/0363-bcm2835-camera-Fix-max-min-error-when-looping-over-c.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0364-Change-BoomBerry-name-to-JustBoom-in-all-locations-d.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0364-bcm2835-camera-Fix-max-min-error-when-looping-over-c.patch [deleted file]
target/linux/brcm2708/patches-4.4/0365-Change-BoomBerry-name-to-JustBoom-in-all-locations-d.patch [deleted file]
target/linux/brcm2708/patches-4.4/0368-Add-dt-param-to-force-HiFiBerry-DAC-Pro-into-slave-m.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0369-Add-dt-param-to-force-HiFiBerry-DAC-Pro-into-slave-m.patch [deleted file]
target/linux/brcm2708/patches-4.4/0369-simple-add-sound-dai-cells-to-I2S-def.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0370-BCM2835-V4L2-Increase-minimum-resolution-to-32x32.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0370-simple-add-sound-dai-cells-to-I2S-def.patch [deleted file]
target/linux/brcm2708/patches-4.4/0371-BCM2835-V4L2-Increase-minimum-resolution-to-32x32.patch [deleted file]
target/linux/brcm2708/patches-4.4/0371-config-Add-support-for-Logitech-Rumblepad.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0372-New-driver-for-RRA-DigiDAC1-soundcard-using-WM8741-W.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0372-config-Add-support-for-Logitech-Rumblepad.patch [deleted file]
target/linux/brcm2708/patches-4.4/0373-New-driver-for-RRA-DigiDAC1-soundcard-using-WM8741-W.patch [deleted file]
target/linux/brcm2708/patches-4.4/0374-BCM2835-V4L2-Correct-handling-for-BGR24-vs-RGB24.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0375-BCM270X_DT-Add-mcp23017-to-the-overlay-Makefile.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0375-BCM2835-V4L2-Correct-handling-for-BGR24-vs-RGB24.patch [deleted file]
target/linux/brcm2708/patches-4.4/0376-BCM270X_DT-Add-mcp23017-to-the-overlay-Makefile.patch [deleted file]
target/linux/brcm2708/patches-4.4/0376-BCM270X_DT-Sort-entries-to-placate-check-script.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0377-BCM270X_DT-Sort-entries-to-placate-check-script.patch [deleted file]
target/linux/brcm2708/patches-4.4/0377-gpio-ir-overlay-gpio_pin-shouldn-t-change-pull-setti.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0378-gpio-ir-overlay-gpio_pin-shouldn-t-change-pull-setti.patch [deleted file]
target/linux/brcm2708/patches-4.4/0378-media-rc-core-define-a-default-timeout-for-drivers.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0379-media-rc-core-define-a-default-timeout-for-drivers.patch [deleted file]
target/linux/brcm2708/patches-4.4/0379-media-rc-gpio-ir-recv-add-timeout-on-idle.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0380-media-rc-gpio-ir-recv-add-timeout-on-idle.patch [deleted file]
target/linux/brcm2708/patches-4.4/0380-smsir.h-remove-a-now-duplicated-definition-IR_DEFAUL.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0381-Implement-a-wakeup-source-option-for-the-i2c-rtc-Dev.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0381-smsir.h-remove-a-now-duplicated-definition-IR_DEFAUL.patch [deleted file]
target/linux/brcm2708/patches-4.4/0382-BCM270X_DT-Fix-rpi-dac-overlay.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0382-Implement-a-wakeup-source-option-for-the-i2c-rtc-Dev.patch [deleted file]
target/linux/brcm2708/patches-4.4/0383-BCM270X_DT-Fix-rpi-dac-overlay.patch [deleted file]
target/linux/brcm2708/patches-4.4/0383-BCM270X_DT-Make-i2c-gpio-usable-by-other-overlays.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0384-BCM270X_DT-Make-i2c-gpio-usable-by-other-overlays.patch [deleted file]
target/linux/brcm2708/patches-4.4/0387-Add-ads1015-overlay.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0388-Add-ads1015-overlay.patch [deleted file]
target/linux/brcm2708/patches-4.4/0388-Fixed-MCP23017-section-in-overlay-README.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0389-Fixed-MCP23017-section-in-overlay-README.patch [deleted file]
target/linux/brcm2708/patches-4.4/0389-Revert-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0390-Revert-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch [deleted file]
target/linux/brcm2708/patches-4.4/0390-Revert-bcm2835-dma-Limit-cyclic-transfers-on-lite-ch.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0391-Revert-bcm2835-dma-Limit-cyclic-transfers-on-lite-ch.patch [deleted file]
target/linux/brcm2708/patches-4.4/0391-Revert-dmaengine-bcm2835-Load-driver-early-and-suppo.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0392-Revert-dmaengine-bcm2835-Add-slave-dma-support.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0392-Revert-dmaengine-bcm2835-Load-driver-early-and-suppo.patch [deleted file]
target/linux/brcm2708/patches-4.4/0393-Revert-dmaengine-bcm2835-Add-slave-dma-support.patch [deleted file]
target/linux/brcm2708/patches-4.4/0393-dmaengine-bcm2835-remove-unnecessary-masking-of-dma-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0394-dmaengine-bcm2835-add-additional-defines-for-DMA-reg.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0394-dmaengine-bcm2835-remove-unnecessary-masking-of-dma-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0395-dmaengine-bcm2835-add-additional-defines-for-DMA-reg.patch [deleted file]
target/linux/brcm2708/patches-4.4/0395-dmaengine-bcm2835-move-cyclic-member-from-bcm2835_ch.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0396-dmaengine-bcm2835-move-controlblock-chain-generation.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0396-dmaengine-bcm2835-move-cyclic-member-from-bcm2835_ch.patch [deleted file]
target/linux/brcm2708/patches-4.4/0397-dmaengine-bcm2835-limit-max-length-based-on-channel-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0397-dmaengine-bcm2835-move-controlblock-chain-generation.patch [deleted file]
target/linux/brcm2708/patches-4.4/0398-dmaengine-bcm2835-add-slave_sg-support-to-bcm2835-dm.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0398-dmaengine-bcm2835-limit-max-length-based-on-channel-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0399-dmaengine-bcm2835-add-dma_memcopy-support-to-bcm2835.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0399-dmaengine-bcm2835-add-slave_sg-support-to-bcm2835-dm.patch [deleted file]
target/linux/brcm2708/patches-4.4/0400-dmaengine-bcm2835-add-dma_memcopy-support-to-bcm2835.patch [deleted file]
target/linux/brcm2708/patches-4.4/0400-dmaengine-bcm2835-use-platform_get_irq_byname.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0401-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0401-dmaengine-bcm2835-use-platform_get_irq_byname.patch [deleted file]
target/linux/brcm2708/patches-4.4/0402-ARM-bcm270x-changed-bcrm-dma-channel-mask-to-mask-ou.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0402-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch [deleted file]
target/linux/brcm2708/patches-4.4/0403-ARM-bcm270x-changed-bcrm-dma-channel-mask-to-mask-ou.patch [deleted file]
target/linux/brcm2708/patches-4.4/0403-ARM-bcm2835-add-interrupt-names-and-apply-correct-ma.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0404-ARM-bcm2835-add-interrupt-names-and-apply-correct-ma.patch [deleted file]
target/linux/brcm2708/patches-4.4/0404-ARM-bcm2835-make-dma-channel-0-available-for-kms-set.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0405-ARM-bcm2835-make-dma-channel-0-available-for-kms-set.patch [deleted file]
target/linux/brcm2708/patches-4.4/0405-dmaengine-bcm2835-Fix-cyclic-DMA-period-splitting.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0406-dmaengine-bcm2835-Avoid-splitting-periods-into-very-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0406-dmaengine-bcm2835-Fix-cyclic-DMA-period-splitting.patch [deleted file]
target/linux/brcm2708/patches-4.4/0407-dmaengine-bcm2835-Avoid-splitting-periods-into-very-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0407-dmaengine-bcm2835-Fix-polling-for-completion-of-DMA-.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0408-dmaengine-bcm2835-Fix-polling-for-completion-of-DMA-.patch [deleted file]
target/linux/brcm2708/patches-4.4/0409-BCM270X_DT-Add-spi-rtc-overlay-on-SPI0.0.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0410-BCM270X_DT-Add-spi-rtc-overlay-on-SPI0.0.patch [deleted file]
target/linux/brcm2708/patches-4.4/0410-rtc-Add-SPI-alias-for-pcf2123-driver.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0411-Added-support-for-headphones-microphone-and-bclk_rat.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0411-rtc-Add-SPI-alias-for-pcf2123-driver.patch [deleted file]
target/linux/brcm2708/patches-4.4/0412-Added-support-for-headphones-microphone-and-bclk_rat.patch [deleted file]
target/linux/brcm2708/patches-4.4/0412-IQaudIO-auto-mute-for-AMP-and-DigiAMP.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0413-IQaudIO-auto-mute-for-AMP-and-DigiAMP.patch [deleted file]
target/linux/brcm2708/patches-4.4/0413-mmc-Apply-ERASE_BROKEN-quirks-correctly.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0414-enable-led-support-for-xpad-driver-fixes-flashing-le.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0414-mmc-Apply-ERASE_BROKEN-quirks-correctly.patch [deleted file]
target/linux/brcm2708/patches-4.4/0415-Add-critical-information-for-getting-pi3-miniuart-bt.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0415-enable-led-support-for-xpad-driver-fixes-flashing-le.patch [deleted file]
target/linux/brcm2708/patches-4.4/0416-Add-critical-information-for-getting-pi3-miniuart-bt.patch [deleted file]
target/linux/brcm2708/patches-4.4/0416-bcm2835-sdhost-Improvements-to-error-recovery.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0417-bcm2835-sdhost-Improvements-to-error-recovery.patch [deleted file]
target/linux/brcm2708/patches-4.4/0417-pinctrl-bcm2835-Fix-return-type-of-bcm2835_pmx_free.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0418-Add-IQAudIO-Digi-WM8804-board-support.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0418-pinctrl-bcm2835-Fix-return-type-of-bcm2835_pmx_free.patch [deleted file]
target/linux/brcm2708/patches-4.4/0419-Add-IQAudIO-Digi-WM8804-board-support.patch [deleted file]
target/linux/brcm2708/patches-4.4/0419-dts-Add-overlay-for-NXP-SC16IS752-Dual-UART-with-SPI.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0420-dts-Add-overlay-for-NXP-SC16IS752-Dual-UART-with-SPI.patch [deleted file]
target/linux/brcm2708/patches-4.4/0420-spi-bcm2835-Disable-forced-software-CS.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0421-BCM270X_DT-Overlay-to-re-enable-HW-CS-on-SPI0.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0421-spi-bcm2835-Disable-forced-software-CS.patch [deleted file]
target/linux/brcm2708/patches-4.4/0422-Add-support-for-Dion-Audio-LOCO-DAC-AMP-HAT.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0422-BCM270X_DT-Overlay-to-re-enable-HW-CS-on-SPI0.patch [deleted file]
target/linux/brcm2708/patches-4.4/0423-ASoc-wm8731-add-32bit-mode.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0423-Add-support-for-Dion-Audio-LOCO-DAC-AMP-HAT.patch [deleted file]
target/linux/brcm2708/patches-4.4/0424-BCM270X_DT-Declare-the-audio-PWM-pins-explicitly.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0425-BCM270X_DT-Restore-lost-closing-brace.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0426-config-Add-driver-for-mcp23017-I2C-GPIO-expander.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0427-vchiq_arm-Avoid-use-of-mutex-in-add_completion.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0428-bcm2708_fb-Default-framebuffer-to-32-bit.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0429-fix-auto-sense-in-lirc_rpi-driver.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0430-enable-gembird-joypad-support.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0431-Added-HiFiBerry-Digi-Pro-driver.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0432-clk-bcm2835-Mark-the-CM-SDRAM-clock-s-parent-as-crit.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0433-clk-bcm2835-Don-t-rate-change-PLLs-on-behalf-of-divi.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0434-clk-bcm2835-Do-appropriate-name-lookups-for-DSI1-s-p.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0435-clk-bcm2835-Add-an-enum-for-the-DSI1-pixel-clock.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0436-drm-fb_cma_helper-Remove-implicit-call-to-disable_un.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0437-overlays-Add-assert_falling_edge-to-pps-gpio-overlay.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0438-drm-mipi-dsi-Unregister-bus-at-exit.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0439-drm-mipi-dsi-Allow-to-build-drm-mipi-dsi-as-a-module.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0440-drm-vc4-Fix-flipped-HVS-channels-for-DSI0-1.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0441-drm-vc4-Add-support-for-feeding-DSI-encoders-from-th.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0442-drm-vc4-Start-switching-to-using-debugfs_reg32-helpe.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0443-drm-vc4-Add-DSI1-driver.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0444-drm-panel-Add-support-for-the-Raspberry-Pi-7-Touchsc.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0445-BCM270X-Add-the-DSI-panel-to-the-defconfig.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0446-BCM270X-Add-the-DSI-and-DSI-panel-nodes-to-the-VC4-o.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0447-of-Export-of_device_uevent_modalias-for-DRM_MIPI_DSI.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0448-drm-Emit-modalias-uevents-for-the-DSI-devices-we-cre.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0449-gpu-drm-vc4_hdmi-add-missing-of_node_put-after-calli.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0450-drm-vc4-Use-for_each_plane_in_state.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0451-drm-vc4-Fix-ioctl-permissions-for-render-nodes.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0452-drm-vc4-Make-pageflip-completion-handling-more-robus.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0453-drm-vc4-clean-up-error-exit-path-on-failed-dpi_conne.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0454-drm-vc4-enable-XBGR8888-and-ABGR8888-pixel-formats.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0455-drm-vc4-Bind-the-HVS-before-we-bind-the-individual-C.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0456-drm-vc4-Implement-precise-vblank-timestamping.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0457-drm-vc4-remove-redundant-ret-status-check.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0458-drm-vc4-add-extern-C-guard-for-the-UAPI-header.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0459-drm-vc4-Fix-definition-of-QPU_R_MS_REV_FLAGS.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0460-drm-vc4-Fix-a-the-the-typo-in-a-comment.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0461-drm-vc4-Return-EBUSY-if-there-s-already-a-pending-fl.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0462-config-Enable-SENSORS_LM75.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0463-config-Enable-SERIAL_SC16IS7XX.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0464-snd-bcm2835-Don-t-allow-responses-from-VC-to-be-inte.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0465-BCM270X-Connect-V3D-to-its-power-domain.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0466-drm-vc4-Enable-runtime-PM.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0467-drm-vc4-Drop-firmware-node-getting-now-that-we-use-t.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0468-drm-vc4-Use-runtime-PM-to-power-cycle-the-device-whe.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0469-drm-panel-Drop-debug-printf-from-the-Raspberry-Pi-to.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0470-drm-vc4-Replace-HDMI-force-connected-with-an-EDID-pr.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0471-net-ethernet-enc28j60-add-device-tree-support.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0472-enc28j60-Fix-race-condition-in-enc28j60-driver.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0473-Add-cm3-dts-file.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0474-BCM270X-Drop-HPD-setting-from-the-common-dtsi.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0475-BCM2710-Drop-incorrect-HDMI-HPD-line-from-the-DT.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0476-drm-vc4-Add-a-getparam-ioctl-for-getting-the-V3D-ide.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0477-drm-vc4-Move-validation-s-current-max-ip-into-the-va.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0478-drm-vc4-Add-a-bitmap-of-branch-targets-during-shader.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0479-drm-vc4-Add-support-for-branching-in-shader-validati.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0480-drm-vc4-Add-a-getparam-to-signal-support-for-branche.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0481-drm-vc4-Don-t-force-new-binner-overflow-allocation-p.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0482-drm-vc4-Use-drm_free_large-on-handles-to-match-its-a.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0483-drm-vc4-Fix-oops-when-userspace-hands-in-a-bad-BO.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0484-drm-vc4-Fix-overflow-mem-unreferencing-when-the-binn.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0485-config-Enable-SERIAL_SC16IS7XX_SPI.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0486-Overlay-for-Microchip-MCP23S08-17-SPI-gpio-expanders.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0487-BCM270X_DT-Add-audio_pins-to-CM-dtb.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0488-BCM270X_DT-Don-t-enable-UART0-in-CM3-dtb.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0489-overlays-Add-audremap-overlay.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0490-overlays-Add-swap_lr-and-enable_jack-to-audremap.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0491-overlays-Clarify-gpio-poweroff-semantics-in-README.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0492-overlays-added-sc16is750-UART-over-I2C-1617.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0493-Bluetooth-Fix-l2cap_sock_setsockopt-with-optname-BT_.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0494-config-Add-CONFIG_IPVLAN-module.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0495-config-Add-CONFIG_VXLAN-module.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0496-Fixes-i2c_bcm2708-Write-to-FIFO-correctly-v2-1574.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0497-bcm2835-sdhost-Don-t-exit-cmd-wait-loop-on-error.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0498-BCM270X_DT-Use-bcm2835-sdhost-on-Compute-Module.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0499-fbmem-Ensure-that-parameters-are-properly-checked-wi.patch [new file with mode: 0644]
target/linux/brcm2708/patches-4.4/0500-config-Enabled-SENSORS_INA2XX-module.patch [new file with mode: 0644]

index 81a7647ec295fb24ad10fdf6ae734480c863a2a3..85c72e27da0905fb86e382748e8787a3fe5c8dba 100644 (file)
@@ -68,8 +68,8 @@ ifeq ($(SUBTARGET),bcm2709)
 endif
 
 define Device/rpi-3
-  DEVICE_TITLE := Raspberry Pi 3 B
-  DEVICE_DTS := bcm2710-rpi-3-b
+  DEVICE_TITLE := Raspberry Pi 3 B/CM
+  DEVICE_DTS := bcm2710-rpi-3-b bcm2710-rpi-cm3
   DEVICE_PACKAGES := brcmfmac43430-firmware-sdio kmod-brcmfmac wpad-mini
 endef
 ifeq ($(SUBTARGET),bcm2710)
index 23adf276755dd485ac100acf44dd024c83920418..b0fbd7a5eb4152a0a0a6c44fcc0b04667986b933 100644 (file)
@@ -947,6 +947,7 @@ dtparam=spi=on
 #dtoverlay=hifiberry-dac
 #dtoverlay=hifiberry-dacplus
 #dtoverlay=hifiberry-digi
+#dtoverlay=hifiberry-digi-pro
 #dtoverlay=iqaudio-dac
 #dtoverlay=iqaudio-dacplus
 #dtoverlay=iqaudio-digi-wm8804-audio
index 70ef662897ec0a68ba2f7d7a4931d04c8fbdab85..4cfdd6d7c4861db2ba21cb661aa3d369dfafb694 100644 (file)
@@ -183,7 +183,7 @@ endef
 $(eval $(call KernelPackage,sound-soc-hifiberry-dacplus))
 
 define KernelPackage/sound-soc-hifiberry-digi
-  TITLE:=Support for HifiBerry Digi
+  TITLE:=Support for HifiBerry Digi / Digi+ / Digi+ Pro
   KCONFIG:= \
        CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI \
        CONFIG_SND_SOC_WM8804
index 9b384a265ad88305fe2b0968f3e14965c6cdbfd9..5e6a82cb15e62651aca2ec11f340094e50250dd8 100644 (file)
@@ -1,7 +1,7 @@
-From 047957666a5478b924a129892c54ab9c41816a43 Mon Sep 17 00:00:00 2001
+From 4f81faf37ec66edd44da24800c5a5ae87edae808 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/423] smsx95xx: fix crimes against truesize
+Subject: [PATCH] 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.
 
index 9fc6c91ac8482006f02cf613f19985539a736227..1a79fd08df7ad293239b7fdf5a63806861497ea2 100644 (file)
@@ -1,7 +1,7 @@
-From 4b0c62e74a6e2e01e7d37fb6be0865df77c0ad03 Mon Sep 17 00:00:00 2001
+From 588a0950ef065eb5a0b36974394245ae2c9fc75b Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 17 Apr 2015 16:58:45 +0100
-Subject: [PATCH 002/423] smsc95xx: Disable turbo mode by default
+Subject: [PATCH] smsc95xx: Disable turbo mode by default
 
 ---
  drivers/net/usb/smsc95xx.c | 2 +-
index 74ada1637ea41361e64e5aa8011158a4e725be7a..e93fc31b8e28fe7c715fa671bc7d1777f4e88d94 100644 (file)
@@ -1,8 +1,8 @@
-From d69c65cb5ad6738d5bec2531df75824c44459800 Mon Sep 17 00:00:00 2001
+From 8ca7ff8021f8d9bcbac83bd4584da9bbc854b829 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 18 Jun 2014 13:42:01 +0100
-Subject: [PATCH 003/423] vmstat: Workaround for issue where dirty page count
goes negative
+Subject: [PATCH] vmstat: Workaround for issue where dirty page count goes
+ negative
 
 See:
 https://github.com/raspberrypi/linux/issues/617
index 8585c23a7cedafb002c500b4b537fd3dc38d7313..bd4e1f731d9ffdf8d1d917c36e53de6ebb960285 100644 (file)
@@ -1,7 +1,7 @@
-From 7d5a47372854564f8071edeaf217360d2f53cde0 Mon Sep 17 00:00:00 2001
+From 7aa3931981956896b353b58c068a941f522182bf 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/423] BCM2835_DT: Fix I2S register map
+Subject: [PATCH] BCM2835_DT: Fix I2S register map
 
 ---
  Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt   | 4 ++--
index bcc521efbfe6e099ba6aef9d332d7650674b6ea2..3977b8d9b378eb656f7ccfa6b8d03948485f26b2 100644 (file)
@@ -1,8 +1,7 @@
-From 8ec469e6ed6a5dd357c04322dfc4e2ddbfcc040b Mon Sep 17 00:00:00 2001
+From 71609ab22785edd13b385920b1b0c6de24adc901 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/423] irq-bcm2836: Prevent spurious interrupts, and trap
- them early
+Subject: [PATCH] irq-bcm2836: Prevent spurious interrupts, and trap them early
 
 The old arch-specific IRQ macros included a dsb to ensure the
 write to clear the mailbox interrupt completed before returning
index 592773c8a74541395d3d637edf675f05528e0694..8ad59ed4d7c941b139f49ef08d142fed80781969 100644 (file)
@@ -1,7 +1,7 @@
-From daf4407e90396b12f87cfd75651505dee67f1c0c Mon Sep 17 00:00:00 2001
+From e34586ca8f6b346d1ee37230f26c7ad44ca15786 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/423] irqchip: bcm2835: Add FIQ support
+Subject: [PATCH] irqchip: bcm2835: Add FIQ support
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 53cec549f0ef8471688da405464df938e71250ee..b58728de5464bb32a7d530cb36814a0b02f4bc0f 100644 (file)
@@ -1,7 +1,7 @@
-From d6cad8a047430f5095e43e0d0e8f083e6ab411df Mon Sep 17 00:00:00 2001
+From e6387565d57b8d3912948dfb89d27705ef04bb89 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/423] irqchip: irq-bcm2835: Add 2836 FIQ support
+Subject: [PATCH] irqchip: irq-bcm2835: Add 2836 FIQ support
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 156798d97bf051363f7f68aac5ff1e2a05c1bb37..49ead897225a520714cf94fe57a1543bd1bebc92 100644 (file)
@@ -1,7 +1,7 @@
-From cc33367763a6674463698cffab1a4a653df4ebd3 Mon Sep 17 00:00:00 2001
+From 5638cf1b2b8a418553790662c414b29ced8521dd 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/423] serial: 8250: Don't crash when nr_uarts is 0
+Subject: [PATCH] serial: 8250: Don't crash when nr_uarts is 0
 
 ---
  drivers/tty/serial/8250/8250_core.c | 2 ++
index f0f47cbc29f91d8eff747f6465dfb8b49faf076a..c9c093635b9bb0af546dec8f83e8c5089667131d 100644 (file)
@@ -1,8 +1,7 @@
-From f168c856794b7a771661df395f3fd16b8c8435b3 Mon Sep 17 00:00:00 2001
+From d64c6c6de97acb1f18415dfeeabd7e19294830a1 Mon Sep 17 00:00:00 2001
 From: notro <notro@tronnes.org>
 Date: Thu, 10 Jul 2014 13:59:47 +0200
-Subject: [PATCH 009/423] pinctrl-bcm2835: Set base to 0 give expected gpio
- numbering
+Subject: [PATCH] pinctrl-bcm2835: Set base to 0 give expected gpio numbering
 
 Signed-off-by: Noralf Tronnes <notro@tronnes.org>
 ---
index 0b84e729e668cc766276410c43c1d85db9d206a7..44e79fad25967b63420a73bf19fb2c9d9f0dea73 100644 (file)
@@ -1,8 +1,8 @@
-From 62e5e9d21249eb4818c37bbcc07b334f97684f0b Mon Sep 17 00:00:00 2001
+From 1d1f6e6688a282e9b091fcb56719893c72e88a3a 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/423] pinctrl-bcm2835: Fix interrupt handling for GPIOs
28-31 and 46-53
+Subject: [PATCH] pinctrl-bcm2835: Fix interrupt handling for GPIOs 28-31 and
+ 46-53
 
 Contrary to the documentation, the BCM2835 GPIO controller actually has
 four interrupt lines - one each for the three IRQ groups and one common. Rather
index 20cbbcfb8c440c4e2347ffa5fad038fe6542af95..7ac6970a9e1705d7a4f4fea852e2d23f77cec733 100644 (file)
@@ -1,8 +1,8 @@
-From 33665d0e0cca6401025655121d66450716353f75 Mon Sep 17 00:00:00 2001
+From d52d6e440040cd5139f9f9ef0071ea00b103302e 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/423] pinctrl-bcm2835: Only request the interrupts listed
in the DTB
+Subject: [PATCH] pinctrl-bcm2835: Only request the interrupts listed in the
+ DTB
 
 Although the GPIO controller can generate three interrupts (four counting
 the common one), the device tree files currently only specify two. In the
index 5eb0f9c7bd2539b78e1e2b059e84679970487476..13ef4396e9b425e8642b48aef37302255d27571c 100644 (file)
@@ -1,7 +1,7 @@
-From 9cb63901af94334ee9f4bf55f731633ea478626a Mon Sep 17 00:00:00 2001
+From 41c1cc2920df75124c931cd58f6b67ec586a5a6a 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/423] spi-bcm2835: Support pin groups other than 7-11
+Subject: [PATCH] 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
index 125b3fdfadb7f67d8425d3da8eac878197ecebc9..a1b4af0c9dafc13fba286adf60b43483ca9dd33a 100644 (file)
@@ -1,7 +1,7 @@
-From d9bc838cde2a45c850c3a23d96c8ebe9715ea253 Mon Sep 17 00:00:00 2001
+From 3b9d28ec938020106f431f5a47ab5525b73bb0d0 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/423] ARM: bcm2835: Set Serial number and Revision
+Subject: [PATCH] ARM: bcm2835: Set Serial number and Revision
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 3ac376a454bcfde421d3cd3931bf6b5d7d6ff348..9e551b9ebc8c9d914b5bf082a8eff634159ca602 100644 (file)
@@ -1,7 +1,7 @@
-From 5d071d8a4f3a0c60bd48071d64f9d311d019d296 Mon Sep 17 00:00:00 2001
+From 17025015a60ffc92d09ade98131ed080bbf09106 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/423] bcm2835-i2s: get base address for DMA from devicetree
+Subject: [PATCH] bcm2835-i2s: get base address for DMA from devicetree
 
 Code copied from spi-bcm2835. Get physical address from devicetree
 instead of using hardcoded constant.
index 9dfb283247f07bc0f1bfedb236df8e853b4139a2..5afab2e6d10001635a14ac2bcc237f9540865c08 100644 (file)
@@ -1,8 +1,8 @@
-From b4e96aa5e8f7825050d7ef74ec59d684cedcc8f1 Mon Sep 17 00:00:00 2001
+From fb1dbd3a7ff1ae0ccd429a4decafc882473f5d94 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/423] bcm2835-i2s: add 24bit support, update bclk_ratio to
more correct values
+Subject: [PATCH] bcm2835-i2s: add 24bit support, update bclk_ratio to more
+ correct values
 
 Code ported from bcm2708-i2s driver in Raspberry Pi tree.
 
index dfcb747140e730b6e90d599dd67b7470f52edaf9..e61700f9763c64a52aaf272675da69b18fa4044c 100644 (file)
@@ -1,7 +1,7 @@
-From bd46c6f9df173b2b81bac5cb19814f0b66063b25 Mon Sep 17 00:00:00 2001
+From 63e23a08bd0bcf782f870bacaf82404e36a6a1bd 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/423] bcm2835-i2s: setup clock only if CPU is clock master
+Subject: [PATCH] bcm2835-i2s: setup clock only if CPU is clock master
 
 Code ported from bcm2708-i2s driver in Raspberry Pi tree.
 
index bfa51fed03b9d7db5517506efc1ae8ec22a4ccdb..306dd977b43ddf63aa2bfed22c98831977ddf80d 100644 (file)
@@ -1,7 +1,7 @@
-From 83f3ec096572e1f1878eb5f97632e7830fc606bd Mon Sep 17 00:00:00 2001
+From 487c53a0c7bbf586ccc441dfc6f7021dc5f1522d 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/423] bcm2835-i2s: Eliminate debugfs directory error
+Subject: [PATCH] bcm2835-i2s: Eliminate debugfs directory error
 
 Code ported from bcm2708-i2s driver in Raspberry Pi tree.
 
index 44a2b00dd93a4e3e752c81214b6531b5bd1784c2..f7470a36cb81382296ce784114dfd100d6f43bb1 100644 (file)
@@ -1,7 +1,7 @@
-From c096f1d64ef032af2c9f2713727de6ec849969c5 Mon Sep 17 00:00:00 2001
+From d86d8ab0405b4eecee7516670e9497ce450c1bbe 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/423] bcm2835-i2s: Register PCM device
+Subject: [PATCH] bcm2835-i2s: Register PCM device
 
 Code ported from bcm2708-i2s driver in Raspberry Pi tree.
 
index 2f16bf7f1ae573bdea05570c347a8d398291cd45..6624efba473f1da122c4f2611dc1a0ac15fbe09d 100644 (file)
@@ -1,7 +1,7 @@
-From ec8796e8ccf92931ff87fb7626be8f3e63ddc2d0 Mon Sep 17 00:00:00 2001
+From 4d08d5e742e59e1e73787bfeca27595d5afbf1af 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/423] bcm2835-i2s: Enable MMAP support via a DT property
+Subject: [PATCH] bcm2835-i2s: Enable MMAP support via a DT property
 
 Code ported from bcm2708-i2s driver in Raspberry Pi tree.
 
index 8155cc751a961bb97c543c88a093d4e0d86d42ef..651f96ea676a06834cd0b9743bd109fcc3afec57 100644 (file)
@@ -1,7 +1,7 @@
-From a272c5805686c77e924f85e314cb5df77bea40be Mon Sep 17 00:00:00 2001
+From c9f03ab8241d445daebd5fb8c4cf63c976460e2d 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/423] dmaengine: bcm2835: Add slave dma support
+Subject: [PATCH] dmaengine: bcm2835: Add slave dma support
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 7be45f7c7083cfaf21672a1b87ce84c0ee4fc01b..336f50d3cdaa6a3d781f6e87b9ee79d42f746189 100644 (file)
@@ -1,7 +1,7 @@
-From 5780349e26ba486276936393f666bea55c5dbf1e Mon Sep 17 00:00:00 2001
+From f4f1c7f4084eca4b826a07a43c467e2febe57f1e 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/423] dmaengine: bcm2835: set residue_granularity field
+Subject: [PATCH] dmaengine: bcm2835: set residue_granularity field
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 9f86ae9bed99adeb41951c9b8ed4e8e8e1dac0f9..00ba9cd5548c48b6ed907203b7a1227077daa18d 100644 (file)
@@ -1,8 +1,7 @@
-From 24e006fc71be77120ac237af3797f4aa103ca0e1 Mon Sep 17 00:00:00 2001
+From d7714e2a4e40cbeb4e69fb7465621f2014b358d2 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/423] dmaengine: bcm2835: Load driver early and support
- legacy API
+Subject: [PATCH] dmaengine: bcm2835: Load driver early and support legacy API
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 490cadb0ce79c6128f14bbc81e886d36fc031703..403e2970bc303efa6bc416dc82fe9c988709eedc 100644 (file)
@@ -1,7 +1,7 @@
-From 411b5abcce1b72fdba106a7236548b8b5315a6e6 Mon Sep 17 00:00:00 2001
+From 93e23eca701dfbf20def2a598af43d64c39bd9b8 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/423] bcm2835-dma: Fix dreq not set for slave transfers
+Subject: [PATCH] bcm2835-dma: Fix dreq not set for slave transfers
 
 Set dreq to slave_id if it is not set like in bcm2708-dmaengine.
 ---
index b332fe6f194998670ff9d984706f421fcb209a21..92f1c030cd50de0be36427fd63ddf53f1d787bb4 100644 (file)
@@ -1,8 +1,7 @@
-From 8eb5210cea099d814f9e583358343d8680c5d05d Mon Sep 17 00:00:00 2001
+From fc5bc111e65b27883284591aec9db5a290665ac9 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/423] bcm2835-dma: Limit cyclic transfers on lite channels
- to 32k
+Subject: [PATCH] bcm2835-dma: Limit cyclic transfers on lite channels to 32k
 
 Transfers larger than 32k cause repeated clicking with I2S soundcards.
 The exact reason is yet unknown, so limit to 32k as bcm2708-dmaengine
index f7faeff0c2cfbd138873b689c8f51aed2d42dd38..d1c8941488279600082a2b22891ca94a48a8da2a 100644 (file)
@@ -1,7 +1,7 @@
-From c8963aeb4b3fbebc8e1de91a65e9f188a1e43d59 Mon Sep 17 00:00:00 2001
+From e95d949879bf632a5fa82c9a1c5607b40388484e 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/423] bcm2835: Add support for uart1
+Subject: [PATCH] bcm2835: Add support for uart1
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index f303420394a670b8fc6dde4cf582201eaef35bbf..14c3aac713c0de5d5486f349351bec5ed59299f0 100644 (file)
@@ -1,7 +1,7 @@
-From ed165fd5d29fa90e6605cb4b87ec5cd35e4209c7 Mon Sep 17 00:00:00 2001
+From 65277e76bcc581bb99f98bb69d9b603bdbfa1d98 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/423] firmware: bcm2835: Add missing property tags
+Subject: [PATCH] firmware: bcm2835: Add missing property tags
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 7fd31ebeda5b5e50c9e16e5181aef41e1b15ad70..766e49990f3cf4c3cf6227b1f5ebdc5e422f050c 100644 (file)
@@ -1,7 +1,7 @@
-From 50d8450a9fd5b05873e3b404e2089067920d53c1 Mon Sep 17 00:00:00 2001
+From cea9e735ed55e4e75819e984290cf147e9712c73 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Sun, 12 May 2013 12:24:19 +0100
-Subject: [PATCH 027/423] Main bcm2708/bcm2709 linux port
+Subject: [PATCH] Main bcm2708/bcm2709 linux port
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 99a6bedcd82530d0d1797d929a3b67fdbae00cca..63231fab6d72fa2fea86f5c632269fcd74c31622 100644 (file)
@@ -1,7 +1,7 @@
-From f455b928205d24aebbf0cc3cf5a9fff4cfb9563e Mon Sep 17 00:00:00 2001
+From 613412454d5196c8982a3abc0820389c16599a51 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 11 Nov 2015 21:01:15 +0000
-Subject: [PATCH 028/423] squash: include ARCH_BCM2708 / ARCH_BCM2709
+Subject: [PATCH] squash: include ARCH_BCM2708 / ARCH_BCM2709
 
 ---
  drivers/char/hw_random/Kconfig    |  2 +-
index 379d35c1531e02fe14ba5f845cc360f7c2b86be3..57f442cf5f09384f2adaa00d168c5fa055222cbc 100644 (file)
@@ -1,7 +1,7 @@
-From 89ea7c60a305783a6790e7e7e91b1451cd40fe78 Mon Sep 17 00:00:00 2001
+From 130a06f0f8becad1e93d3dda1ce96d6e5413ee39 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 1 May 2013 19:46:17 +0100
-Subject: [PATCH 029/423] Add dwc_otg driver
+Subject: [PATCH] Add dwc_otg driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 7e9426a8a225c239a7991eb6a666db412ba93ea8..18be5797eeb81e5fdb3ddcdb1d5d4cdc198b9b1c 100644 (file)
@@ -1,7 +1,7 @@
-From 006091f6aa1f34a2b92fb8ff1defd86d232b7e90 Mon Sep 17 00:00:00 2001
+From c634714a43035371d4035b65e67413dcf1ff0f8e Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 17 Jun 2015 17:06:34 +0100
-Subject: [PATCH 030/423] bcm2708 framebuffer driver
+Subject: [PATCH] bcm2708 framebuffer driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 14dd81be2dd25fbe335c41130859dfc17ce1c4d8..067b5ad0132a00826a0e86522f673d7c1069d132 100644 (file)
@@ -1,7 +1,7 @@
-From 6ab9b89c4a3def17db462e0902bb0ba325a7c191 Mon Sep 17 00:00:00 2001
+From 5fca3a9b2f0c0c928fa94368cdb767829a696ed5 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/423] dmaengine: Add support for BCM2708
+Subject: [PATCH] dmaengine: Add support for BCM2708
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index a22069109ba507aec146d1841f95b9c168da4a84..2c9534f19da7d3e092672add2f8407e718724b71 100644 (file)
@@ -1,7 +1,7 @@
-From ed0042e046abbd2cee8425ff8e8c535cb025c22a Mon Sep 17 00:00:00 2001
+From 28aa7cada5d110ced59ef0d9392a7fb3121cc551 Mon Sep 17 00:00:00 2001
 From: gellert <gellert@raspberrypi.org>
 Date: Fri, 15 Aug 2014 16:35:06 +0100
-Subject: [PATCH 032/423] MMC: added alternative MMC driver
+Subject: [PATCH] MMC: added alternative MMC driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 333c30289f7a8cd1169a53ac72afda6fd0c747f7..5ec38b2fb69e64aac02b9876554ec64cf5af9ad8 100644 (file)
@@ -1,8 +1,7 @@
-From 7b251a5ab7f06c8f5720a0d49529e0dbe0514503 Mon Sep 17 00:00:00 2001
+From 0c9b7e17d022e45363737d67da590524416f8e3d Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 25 Mar 2015 17:49:47 +0000
-Subject: [PATCH 033/423] Adding bcm2835-sdhost driver, and an overlay to
- enable it
+Subject: [PATCH] Adding bcm2835-sdhost driver, and an overlay to enable it
 
 BCM2835 has two SD card interfaces. This driver uses the other one.
 
index 3773cd734abe82112c4bf41095bc0471b9f32ae3..e9a6ed1147687612473c26e7f4cb54eacaf76625 100644 (file)
@@ -1,7 +1,7 @@
-From effd8d3a65306de4f6cb43aa2139a75d181d9cee Mon Sep 17 00:00:00 2001
+From dec8e7bfb37280733ec278955f1bd8dd2bc176b8 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 3 Jul 2013 00:31:47 +0100
-Subject: [PATCH 034/423] cma: Add vc_cma driver to enable use of CMA
+Subject: [PATCH] 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
index 06b770f4e5a83496362e7f2dfa8819c36906e971..f4bbcf39831ba95d50d552c4f98e1c5da52d65ad 100644 (file)
@@ -1,7 +1,7 @@
-From 809b8fb074a009dec508c02986b27979c5d78b1d Mon Sep 17 00:00:00 2001
+From b3f75cc54e1ee4612cfb34e2a91e03e3d1923534 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Mon, 26 Mar 2012 22:15:50 +0100
-Subject: [PATCH 035/423] bcm2708: alsa sound driver
+Subject: [PATCH] bcm2708: alsa sound driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 3b94b8e694fb8efa08f189e21d48bfc91db87dba..508652189895a9b9c9bd7e067f319a6e0cdeadec 100644 (file)
@@ -1,7 +1,7 @@
-From 1b37904494fc7c9923dde14aa08a63405d89d989 Mon Sep 17 00:00:00 2001
+From 9a1f0040b1f125f8729c772c1ad8e6940b923d7a Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 2 Jul 2013 23:42:01 +0100
-Subject: [PATCH 036/423] bcm2708 vchiq driver
+Subject: [PATCH] bcm2708 vchiq driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 189c77172fb9d9d3a9703f3bd115386e9304dc1b..ead1162c9e8846521b18c8d7fec4ec7d4441b046 100644 (file)
@@ -1,7 +1,7 @@
-From 1dc99a2709085bc7bda11bd457280e9f00fd173b Mon Sep 17 00:00:00 2001
+From bad77c41a36b52033392a19b2b6d51037f2614a5 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 17 Jun 2015 16:07:06 +0100
-Subject: [PATCH 037/423] vc_mem: Add vc_mem driver
+Subject: [PATCH] vc_mem: Add vc_mem driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index e6e088ccb3c034597b8436270d6c8c49b5001b3b..fd193b0e2e4189d79298181375eba992dedf28cc 100644 (file)
@@ -1,7 +1,7 @@
-From 98151664c3404e6ce9abe16241aaef78d260c967 Mon Sep 17 00:00:00 2001
+From 6bdbcad7cce6f6a6fc02f67add6b82d3fcc9e0c6 Mon Sep 17 00:00:00 2001
 From: Tim Gover <tgover@broadcom.com>
 Date: Tue, 22 Jul 2014 15:41:04 +0100
-Subject: [PATCH 038/423] vcsm: VideoCore shared memory service for BCM2835
+Subject: [PATCH] vcsm: VideoCore shared memory service for BCM2835
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index f9d03e154f095270d503dc4cfca30fc9c1193c94..25a2ae76bd80916e61ee71f1cd4084c4caf5dbf7 100644 (file)
@@ -1,7 +1,7 @@
-From ccfc207deae0f9e76975908af6c16460a4e05650 Mon Sep 17 00:00:00 2001
+From 5dc37246986844910511379a5c57ca87a50c6c0d Mon Sep 17 00:00:00 2001
 From: Luke Wren <luke@raspberrypi.org>
 Date: Fri, 21 Aug 2015 23:14:48 +0100
-Subject: [PATCH 039/423] Add /dev/gpiomem device for rootless user GPIO access
+Subject: [PATCH] Add /dev/gpiomem device for rootless user GPIO access
 
 Signed-off-by: Luke Wren <luke@raspberrypi.org>
 
index e6e8da6b97365a3b6df54eafaf01179e1c7eb434..c69862fe7c7956ca9579580b962277692b7ec8b7 100644 (file)
@@ -1,7 +1,7 @@
-From d2e199c4c3e599a0166cbaed671f5446a366ccd6 Mon Sep 17 00:00:00 2001
+From d85d7801b25872d08bd848c40da8fce973db5e46 Mon Sep 17 00:00:00 2001
 From: Luke Wren <wren6991@gmail.com>
 Date: Sat, 5 Sep 2015 01:14:45 +0100
-Subject: [PATCH 040/423] Add SMI driver
+Subject: [PATCH] Add SMI driver
 
 Signed-off-by: Luke Wren <wren6991@gmail.com>
 ---
index 3c5692a125dea4e0a31a0eb29dff1eda92da3217..b5fe99009f030518d4c26be7f1abab5033d04af8 100644 (file)
@@ -1,7 +1,7 @@
-From f7066cd5ed22219015dd9e55dd2070f4822da956 Mon Sep 17 00:00:00 2001
+From b1718d13dae01f04ead925c9562bf18634bbf267 Mon Sep 17 00:00:00 2001
 From: Luke Wren <wren6991@gmail.com>
 Date: Sat, 5 Sep 2015 01:16:10 +0100
-Subject: [PATCH 041/423] Add SMI NAND driver
+Subject: [PATCH] Add SMI NAND driver
 
 Signed-off-by: Luke Wren <wren6991@gmail.com>
 ---
index dd4a033f14486cb1f183c5f90db6f6e92b96be7b..d9e9079b38ba81af42943e493899416a19f7fed4 100644 (file)
@@ -1,7 +1,7 @@
-From 687cb2fff7d0f3480fd39e5ffbebe912e46fa972 Mon Sep 17 00:00:00 2001
+From b4269ab1d08d22959ec26ce1d31a45a1c5e85191 Mon Sep 17 00:00:00 2001
 From: Aron Szabo <aron@aron.ws>
 Date: Sat, 16 Jun 2012 12:15:55 +0200
-Subject: [PATCH 042/423] lirc: added support for RaspberryPi GPIO
+Subject: [PATCH] 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
index 884abdf55f99b171f7dd395ad0b047608874846f..11659f6747c7e87478db170f9b7cd28a165e4028 100644 (file)
@@ -1,7 +1,7 @@
-From bf5b94ef7f3f667e384108aa84bee8195da04383 Mon Sep 17 00:00:00 2001
+From f3f2bddacba23cab954a421d490bd17364e69d2d Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 3 Jul 2013 00:49:20 +0100
-Subject: [PATCH 043/423] Add cpufreq driver
+Subject: [PATCH] Add cpufreq driver
 
 Signed-off-by: popcornmix <popcornmix@gmail.com>
 ---
index f55071da8ff86f16f67004025db3f2cf1e794fff..deb88d4c963b516bf5a820952f7583cb91354f61 100644 (file)
@@ -1,8 +1,8 @@
-From 83b388b35dea05c454a5b2eceec0eff06cc863fb Mon Sep 17 00:00:00 2001
+From 688fec3024a2648a48396168a73ada00131682e1 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 26 Mar 2013 19:24:24 +0000
-Subject: [PATCH 044/423] Added hwmon/thermal driver for reporting core
temperature. Thanks Dorian
+Subject: [PATCH] Added hwmon/thermal driver for reporting core temperature.
+ Thanks Dorian
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 874796ab0dfe45f7a5d8d7ed5f7ed7a2947f3624..21d0674c1f6d3aedd4b6cbcfddd3c39c0477fbe2 100644 (file)
@@ -1,7 +1,7 @@
-From d25b6fcbf3005ae61c5a1940b8a0a47ee545289b Mon Sep 17 00:00:00 2001
+From b78bc1bb96c2db043c3be03c1bcccefa22621543 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 17 Jun 2015 15:44:08 +0100
-Subject: [PATCH 045/423] Add Chris Boot's i2c driver
+Subject: [PATCH] Add Chris Boot's i2c driver
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 92f728cc38c5a9ebaae1a227eee338f6420cb41b..0b21588e575fb8c0db892f96b056c5ec47b01f8b 100644 (file)
@@ -1,7 +1,7 @@
-From ea599a4e38ae921ec5aa8966163ea442357281df Mon Sep 17 00:00:00 2001
+From 0fed71c0553d0bc86798f395c7e354cd132c9802 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 046/423] char: broadcom: Add vcio module
+Subject: [PATCH] char: broadcom: Add vcio module
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 5e9b745a186cf8a83a5c9b3c8be38b2c3c67b395..2713d7fd76d74fdb9708ea11ac04b319d526926e 100644 (file)
@@ -1,7 +1,7 @@
-From 996a87d316243001486fe36b36a7b6ffb4dd1b28 Mon Sep 17 00:00:00 2001
+From 2d716ee18a62c6e8b3a2e28a225bb3484693b6d2 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 047/423] firmware: bcm2835: Support ARCH_BCM270x
+Subject: [PATCH] firmware: bcm2835: Support ARCH_BCM270x
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 51b150168d5ddf20b8f32ea185bf83e134476e49..6f59f573abd9cbabc8dc1b9742fdbf0d9bcec844 100644 (file)
@@ -1,7 +1,7 @@
-From b7c2738cecfa7e32e689f9e9f51f7a0283c6e494 Mon Sep 17 00:00:00 2001
+From b2868be5ed011e649590efdbcc6356bee4fcf257 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 048/423] bcm2835: add v4l2 camera device
+Subject: [PATCH] bcm2835: add v4l2 camera device
 
 - Supports raw YUV capture, preview, JPEG and H264.
 - Uses videobuf2 for data transfer, using dma_buf.
index ddde5441726f84fbfa2ab090f747a7b4eff56302..06d2a0bcf197921d4a2e30e6fd75fa7955231821 100644 (file)
@@ -1,8 +1,7 @@
-From 5ea28aea74a57b9cbbb59ee7df29c5994fc6ad81 Mon Sep 17 00:00:00 2001
+From 10a2bc39e76f415f9a42166ccc7af7e7b43565fc Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 11 May 2015 09:00:42 +0100
-Subject: [PATCH 049/423] scripts: Add mkknlimg and knlinfo scripts from tools
- repo
+Subject: [PATCH] scripts: Add mkknlimg and knlinfo scripts from tools repo
 
 The Raspberry Pi firmware looks for a trailer on the kernel image to
 determine whether it was compiled with Device Tree support enabled.
index c1308c5d41de1bce4104ac845ae437c2e1f86593..60bed19c76e6a31eab3d554b3ed49149922882cc 100644 (file)
@@ -1,7 +1,7 @@
-From ef0a1dc5b8069728671aa1d4a9cee2a2beda16be Mon Sep 17 00:00:00 2001
+From 5e3dd32b2906cc4f07b81f18de3d4a23c417e8fc Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 5 Dec 2014 17:26:26 +0000
-Subject: [PATCH 050/423] fdt: Add support for the CONFIG_CMDLINE_EXTEND option
+Subject: [PATCH] fdt: Add support for the CONFIG_CMDLINE_EXTEND option
 
 ---
  drivers/of/fdt.c | 29 ++++++++++++++++++++++++-----
index 8f0f23102ad31d359d35c1957ac92605f7c8a7a1..9631c93a7d7be2f811f2944e3f34dd6a7fbd0341 100644 (file)
@@ -1,7 +1,7 @@
-From c159387861a9b3e1b0f9fe12d6afe06f0cb8994d Mon Sep 17 00:00:00 2001
+From 48b5e0d194a88c4de6956f94ddd788e126de0a77 Mon Sep 17 00:00:00 2001
 From: notro <notro@tronnes.org>
 Date: Wed, 9 Jul 2014 14:46:08 +0200
-Subject: [PATCH 051/423] BCM2708: Add core Device Tree support
+Subject: [PATCH] BCM2708: Add core Device Tree support
 
 Add the bare minimum needed to boot BCM2708 from a Device Tree.
 
index bd48e736477d9fa4416514f28be02d2723dd53e4..5d3ebc5e9da6d6787476205df883dbfb8e1715cf 100644 (file)
@@ -1,7 +1,7 @@
-From d867b1d6a7470aec5946b495a10a311742b08c18 Mon Sep 17 00:00:00 2001
+From a8bd4a9fead66a720889c5693bf0d21608d9e2c0 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 052/423] bcm2835: Match with BCM2708 Device Trees
+Subject: [PATCH] bcm2835: Match with BCM2708 Device Trees
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index b4944e47711f998acdb7f9a7e92fe0755a6eddfd..2a07c75040ad4671ccce4043cf4d5371f7121704 100644 (file)
@@ -1,7 +1,7 @@
-From 6e0a601e2a1eb727b7b3f00c41e5d54197087feb Mon Sep 17 00:00:00 2001
+From a05a655545efe01002cf061b4373a9bb0071a302 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 053/423] fbdev: add FBIOCOPYAREA ioctl
+Subject: [PATCH] fbdev: add FBIOCOPYAREA ioctl
 
 Based on the patch authored by Ali Gholami Rudi at
     https://lkml.org/lkml/2009/7/13/153
index 05bbf2a9e617020c59d9bef2642f4117e88cbdfe..8325ba9735631b3aafa432d2354320a255f6e7b6 100644 (file)
@@ -1,7 +1,7 @@
-From 90df15f55607a4ec3b29374c5f7781300160bac3 Mon Sep 17 00:00:00 2001
+From 4d7fd18a26cbb4a3cab0aff6ed48070e3aaf3599 Mon Sep 17 00:00:00 2001
 From: Harm Hanemaaijer <fgenfb@yahoo.com>
 Date: Thu, 20 Jun 2013 20:21:39 +0200
-Subject: [PATCH 057/423] Speed up console framebuffer imageblit function
+Subject: [PATCH] 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
index afc515a73280d9f771819f228ccaa1fe2bb32265..31adff746e61ed6f02e3e989dd35b8eb916df891 100644 (file)
@@ -1,7 +1,7 @@
-From 531927425d5bfd1525c7d47d321eeddff1eb3364 Mon Sep 17 00:00:00 2001
+From e681d15368e0c4515a5ee4bf238f859e8c501cf9 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 26 Mar 2013 17:26:38 +0000
-Subject: [PATCH 058/423] Allow mac address to be set in smsc95xx
+Subject: [PATCH] Allow mac address to be set in smsc95xx
 
 Signed-off-by: popcornmix <popcornmix@gmail.com>
 ---
index ef5bf1d52ee2be3cc0f5747476404ac0ca36b939..890bd744e32f1acbd0139c3f0e06adc7550d4593 100644 (file)
@@ -1,8 +1,8 @@
-From f339686c292d0a4e50fbe6f9ccb294291f103605 Mon Sep 17 00:00:00 2001
+From cab5187fbbc59808bab951b7f2736c4f0deff9fa Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 8 May 2013 11:46:50 +0100
-Subject: [PATCH 059/423] enabling the realtime clock 1-wire chip DS1307 and
1-wire on GPIO4 (as a module)
+Subject: [PATCH] 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
 See: https://github.com/raspberrypi/linux/pull/457
index 09c6aad3ddc76a1200388e46e78452e57a4aeed1..457377205ab2460d5f922fb7f4483d8683b12d98 100644 (file)
@@ -1,7 +1,7 @@
-From 934350e21fb2edfd042742892bbd4ea5173208ab Mon Sep 17 00:00:00 2001
+From c21be4772d67bc0b6bd3a59ce878b5dae705af44 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 3 Jul 2013 00:54:08 +0100
-Subject: [PATCH 060/423] Added Device IDs for August DVB-T 205
+Subject: [PATCH] Added Device IDs for August DVB-T 205
 
 ---
  drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 4 ++++
index 6418cc0af3419aa43e74c34c2a3aed369a7d28e7..662d90dd2c16b920604d68290ef0c37bda0b9201 100644 (file)
@@ -1,8 +1,8 @@
-From 1ca424ef0079f90d9c5d1310bcbefe928b5e3fec Mon Sep 17 00:00:00 2001
+From 7106c05e5f71588e746c786f93b1fca9dcdd3c50 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 18 Dec 2013 22:16:19 +0000
-Subject: [PATCH 061/423] config: Enable CONFIG_MEMCG, but leave it disabled
(due to memory cost). Enable with cgroup_enable=memory.
+Subject: [PATCH] config: Enable CONFIG_MEMCG, but leave it disabled (due to
+ memory cost). Enable with cgroup_enable=memory.
 
 ---
  kernel/cgroup.c | 23 ++++++++++++++++++++++-
index 12a87afe23bba28a3657b7c66ef41570a6e58bbc..3001849ce1dd1265c41c48f4179fa0d6559a30ee 100644 (file)
@@ -1,7 +1,7 @@
-From fe45c479a680651326d22e6b966df63b2e719f70 Mon Sep 17 00:00:00 2001
+From dbcc62f3ac4f3996b77cfb6b00ec26dc99f2521b 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 062/423] ASoC: Add support for PCM5102A codec
+Subject: [PATCH] ASoC: Add support for PCM5102A codec
 
 Some definitions to support the PCM5102A codec
 by Texas Instruments.
index 5b90e115d765a9bc7471adebe1f1ad243c48f429..943febc5c168d0bb0ec9be534f547de56005409f 100644 (file)
@@ -1,7 +1,7 @@
-From 35b87454d0cc08adf25c4e4e50cfbcae16af45eb Mon Sep 17 00:00:00 2001
+From 592ac515f17d49627b6653375267bad5c4bb1e5c 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 063/423] ASoC: Add support for HifiBerry DAC
+Subject: [PATCH] ASoC: Add support for HifiBerry DAC
 
 This adds a machine driver for the HifiBerry DAC.
 It is a sound card that can
index 8e6e1e0b5eda299aa9e59c11fc8c9523691b85a8..5adc0476de754634f09dbb3151b6d73e00644cc2 100644 (file)
@@ -1,7 +1,7 @@
-From 3f7614446e868612ab9099c7c959f43f29aa7e03 Mon Sep 17 00:00:00 2001
+From ffd6597f0c3cff5d2171347f23b9a98d4e6fa95e 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 064/423] ASoC: Add support for Rpi-DAC
+Subject: [PATCH] ASoC: Add support for Rpi-DAC
 
 ---
  sound/soc/bcm/Kconfig       |   7 +++
index fa021636232d0fd3cc5ba1aeaf10a20f6eb0c2ac..b71141cc2c7bc3c58e5e97788a83ac8dcdf0096e 100644 (file)
@@ -1,16 +1,16 @@
-From 6148931ae669f041a7036c9eb0ec1b225275c1dd Mon Sep 17 00:00:00 2001
+From 34e0545c33b0f444a5dd8c066cfe37420e95db33 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 065/423] 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
- additional mclk_div divider, it is now possible to control the behaviour.
- This allows using 256xfs PLL frequency on all sample rates up to 96kHz. It
- should allow lower jitter and better signal quality. The behavior has to be
- controlled by the sound card driver, because some sample frequency share the
- same setting. e.g. 192kHz and 96kHz use 24.576MHz master clock. The only
difference is the MCLK divider.
+Subject: [PATCH] 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 additional
+ mclk_div divider, it is now possible to control the behaviour. This allows
+ using 256xfs PLL frequency on all sample rates up to 96kHz. It should allow
+ lower jitter and better signal quality. The behavior has to be controlled by
+ the sound card driver, because some sample frequency share the same setting.
+ e.g. 192kHz and 96kHz use 24.576MHz master clock. The only difference is the
+ MCLK divider.
 
 This also added support for 32bit data.
 
index fb95a676f0a429a9ac05434eeb4b4794fbd6a808..727e72728e0df4a501fd3274f58049fbcc86073b 100644 (file)
@@ -1,8 +1,8 @@
-From 8678473916702a1f744f65ca953febb10c297827 Mon Sep 17 00:00:00 2001
+From 1d300db91ccab78593f0ea40d4e1c8a931232197 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 066/423] ASoC: BCM:Add support for HiFiBerry Digi. Driver is
based on the patched WM8804 driver.
+Subject: [PATCH] ASoC: BCM:Add support for HiFiBerry Digi. Driver is based on
+ the patched WM8804 driver.
 
 Signed-off-by: Daniel Matuschek <daniel@matuschek.net>
 
index 4cd07fd4eb7440ff38f9a41ce42c30db148c7f41..f9c706798a50a0d8ed47088938736fb56c5f1e3e 100644 (file)
@@ -1,8 +1,8 @@
-From db3e779eb462f937984d57ed072b84c736ac179c Mon Sep 17 00:00:00 2001
+From 0dd064b656993f40c09c055a6bef13fa023ceedf 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 067/423] ASoC: wm8804: Set idle_bias_off to false Idle bias
has been change to remove warning on driver startup
+Subject: [PATCH] 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>
 ---
index 0088c6ec12822979f7cb802e79d7c7b4bc22e9b8..2c86d25ce35170f210cbca879b7c4b7bb624b66f 100644 (file)
@@ -1,7 +1,7 @@
-From b4efbfd86348893b2317131b7d355f64e619ab06 Mon Sep 17 00:00:00 2001
+From 8a4af475fccaff7b70b3d93ef1730001a2376063 Mon Sep 17 00:00:00 2001
 From: Gordon Garrity <gordon@iqaudio.com>
 Date: Sat, 8 Mar 2014 16:56:57 +0000
-Subject: [PATCH 068/423] Add IQaudIO Sound Card support for Raspberry Pi
+Subject: [PATCH] Add IQaudIO Sound Card support for Raspberry Pi
 
 Set a limit of 0dB on Digital Volume Control
 
index aeadeb69ef60fed8b4e43b2da083e5cfdfdee375..c3b599900a8facf81ae2c687042146a96eea11b8 100644 (file)
@@ -1,7 +1,7 @@
-From 2238f04766e0b653319a3291b546ba49d651ce81 Mon Sep 17 00:00:00 2001
+From 8529e2130a7d67c7595746e5cf618e6058c3315c Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Mon, 14 Jul 2014 22:02:09 +0100
-Subject: [PATCH 069/423] hid: Reduce default mouse polling interval to 60Hz
+Subject: [PATCH] hid: Reduce default mouse polling interval to 60Hz
 
 Reduces overhead when using X
 ---
index dcdddf3e47a9b71c77cc6365c33b332f58b440b1..a6a55f3af73e2bb58143b57dafd789fa6e580287 100644 (file)
@@ -1,7 +1,7 @@
-From 3d116a8311017380e686bdddf80143d1a6cf885e Mon Sep 17 00:00:00 2001
+From aaa93fd9dee0084d0c2d9b50021fe7f2a2457fd7 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 070/423] Added support for HiFiBerry DAC+
+Subject: [PATCH] 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.
index 7c3fb9d0cc50f039bb357eb8d94a35ddd6d5b04a..1d71ac9fdc1196dfdc3270fac67d9122ad614c27 100644 (file)
@@ -1,7 +1,7 @@
-From 7266f151fac2e09d08b71dc0bdd404506dc00055 Mon Sep 17 00:00:00 2001
+From 4f718b9dbd8bd3d9ce465351463b0240116f4945 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 071/423] Added driver for HiFiBerry Amp amplifier add-on board
+Subject: [PATCH] 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.
index e3322fb84c80f8341cc12055b8db4ba9e2d2dec9..0259d5edf1084d34f14d4370151ba1c5250156e6 100644 (file)
@@ -1,7 +1,7 @@
-From 62e75253eba759318d83706ba162a14c53182ff5 Mon Sep 17 00:00:00 2001
+From 5527e5534c58f8555d699d10d2d67afc3aa768e0 Mon Sep 17 00:00:00 2001
 From: Ryan Coe <bluemrp9@gmail.com>
 Date: Sat, 31 Jan 2015 18:25:49 -0700
-Subject: [PATCH 072/423] Update ds1307 driver for device-tree support
+Subject: [PATCH] Update ds1307 driver for device-tree support
 
 Signed-off-by: Ryan Coe <bluemrp9@gmail.com>
 ---
index 44b2866877b5dc1f54bffc254a5819646c5fa195..63ac021aaddb90611c3152dafe3ec231330982f5 100644 (file)
@@ -1,8 +1,7 @@
-From 8404a4fe589f3b7a42eb4d3e61719d76dfb83658 Mon Sep 17 00:00:00 2001
+From b19a2e678c297e81b8b9ab6db1f4775be1c678a8 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 6 Feb 2015 13:50:57 +0000
-Subject: [PATCH 073/423] BCM270x_DT: Add pwr_led, and the required "input"
- trigger
+Subject: [PATCH] BCM270x_DT: Add pwr_led, and the required "input" trigger
 
 The "input" trigger makes the associated GPIO an input.  This is to support
 the Raspberry Pi PWR LED, which is driven by external hardware in normal use.
index b11ad3b96b15a28e16ad7311ce4eaa7dbb60d040..bb88376441a72cd032b254aa3a222bff602f4bfa 100644 (file)
@@ -1,8 +1,7 @@
-From ec66f897c2625ff0764c64229b4756b0b6f88a03 Mon Sep 17 00:00:00 2001
+From 2eb050c58ca0620dd91af4e49a584118fadd9398 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 27 Feb 2015 15:10:24 +0000
-Subject: [PATCH 074/423] enc28j60: Add device tree compatible string and an
- overlay
+Subject: [PATCH] enc28j60: Add device tree compatible string and an overlay
 
 ---
  drivers/net/ethernet/microchip/enc28j60.c | 7 +++++++
index 3ee2aef630447656aaa24b07abec9f9f57fbf2c2..20f0dc36a18a28a2d4cb93e21d12ea1c76e14f80 100644 (file)
@@ -1,7 +1,7 @@
-From f48bdbd9477a98b4ab42e72c45ce7162eb09c030 Mon Sep 17 00:00:00 2001
+From bae12047250724b26ffd0acdceeede7dfe766f52 Mon Sep 17 00:00:00 2001
 From: Waldemar Brodkorb <wbrodkorb@conet.de>
 Date: Wed, 25 Mar 2015 09:26:17 +0100
-Subject: [PATCH 075/423] Add driver for rpi-proto
+Subject: [PATCH] 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
index 7500bb2438aa35100e2c4c19f53dc14768f5ae34..4f4934849ba60cf3366a3c7eca3161a093d5b638 100644 (file)
@@ -1,7 +1,7 @@
-From 212f11d668fe451c892828d1882ddc5d8b591621 Mon Sep 17 00:00:00 2001
+From b9a95c01f53d1ae5e2e5d24682d7533ee1f487a8 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Mon, 13 Apr 2015 17:16:29 +0100
-Subject: [PATCH 076/423] config: Add default configs
+Subject: [PATCH] config: Add default configs
 
 ---
  arch/arm/configs/bcm2709_defconfig | 1254 +++++++++++++++++++++++++++++++++++
index 28309e20e47518040158d91921a7195f916115b3..1726f5a1d4959ca11c8bafd2f550d5b6d33d08f3 100644 (file)
@@ -1,7 +1,7 @@
-From cc0e6881fbf29462ec038d308a655c935a9096f7 Mon Sep 17 00:00:00 2001
+From c06545159fe86fd45a9ff570e0a1b7cf04c2ebe0 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 077/423] bcm2835: bcm2835_defconfig
+Subject: [PATCH] bcm2835: bcm2835_defconfig
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 50b55fd3a0625403d34111e513b8cb789f018c76..960b19fc766fcb16e0133f197b46dc8b7dcf1a49 100644 (file)
@@ -1,7 +1,7 @@
-From 6910ec0ffdad51f2a970f8080545c3ce621f3042 Mon Sep 17 00:00:00 2001
+From 1c0f57f0ad2d226ec0d1ef1e91a38c3abdee891a Mon Sep 17 00:00:00 2001
 From: Gordon Hollingworth <gordon@raspberrypi.org>
 Date: Tue, 12 May 2015 14:47:56 +0100
-Subject: [PATCH 078/423] rpi-ft5406: Add touchscreen driver for pi LCD display
+Subject: [PATCH] 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
 
index c685572f64154322bd5d4b1d052d31520b1fc627..235008e2a22cd01e3a5e89119e0512abca942c2b 100644 (file)
@@ -1,8 +1,7 @@
-From efa4432e1c5b0a373108e2f4cefc23d882939e0c Mon Sep 17 00:00:00 2001
+From 74c81d3d8233d758e3e58f9a72dd6370d08077ac Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 13 Oct 2014 11:47:53 +0100
-Subject: [PATCH 079/423] Improve __copy_to_user and __copy_from_user
- performance
+Subject: [PATCH] Improve __copy_to_user and __copy_from_user performance
 
 Provide a __copy_from_user that uses memcpy. On BCM2708, use
 optimised memcpy/memmove/memcmp/memset implementations.
index 2f6dcccf8c580df2d5f0b4df773ad77888a5763c..d02152db493ac99941f2e206301f9b31fae23529 100644 (file)
@@ -1,7 +1,7 @@
-From 2fd2d651ece51accc95f9f9fcb8256e7d05a26df Mon Sep 17 00:00:00 2001
+From 24703d6981447867a7092997e29ac911698ec77d Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 25 Jun 2015 12:16:11 +0100
-Subject: [PATCH 080/423] gpio-poweroff: Allow it to work on Raspberry Pi
+Subject: [PATCH] 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
index cddfab2afab39030b8bc902ed9626c14b0601e9c..875d31944f27525b9cfb481bb2d32169587c5be2 100644 (file)
@@ -1,8 +1,7 @@
-From 2cba4b03311a1d55f96d6e759ffb234f67d02080 Mon Sep 17 00:00:00 2001
+From 962e7c5c04075063b86f389043dcfe1ac948a868 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 14 Jul 2015 10:26:09 +0100
-Subject: [PATCH 081/423] spidev: Add "spidev" compatible string to silence
- warning
+Subject: [PATCH] spidev: Add "spidev" compatible string to silence warning
 
 See: https://github.com/raspberrypi/linux/issues/1054
 ---
index 89155375876109ea6388878e93af25349424c3bf..31c02d61ab570eb9dffe8bbe05b7acec6cc09fc4 100644 (file)
@@ -1,7 +1,7 @@
-From 48bbf5d241136bc7cf19db80aeb4b09040dde4da Mon Sep 17 00:00:00 2001
+From cd035dbd2c541ab1f517f79d6b7c54948a91ed8b Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 14 Jul 2015 17:00:18 +0100
-Subject: [PATCH 082/423] scripts/dtc: Add overlay support
+Subject: [PATCH] scripts/dtc: Add overlay support
 
 ---
  scripts/dtc/checks.c                 |  119 ++-
index f2b07d2c80f1b03027b891dcf52ab457a95c4388..7d491d514938f6b05916c3bd499bf68b0fac115f 100644 (file)
@@ -1,7 +1,7 @@
-From cb1da07eaac82084fe16f086989d98b5590a4d61 Mon Sep 17 00:00:00 2001
+From 2b475b95bcf5487bd23b7a636ce36fae98f6e81a 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 083/423] mfd: Add Raspberry Pi Sense HAT core driver
+Subject: [PATCH] mfd: Add Raspberry Pi Sense HAT core driver
 
 ---
  drivers/input/joystick/Kconfig           |   8 +
index 035088d34eb1a4094a427f4173d19d54b7690d28..b1870462f4ab6af3e5cac3b985216e57f15aade2 100644 (file)
@@ -1,7 +1,7 @@
-From 10cbc09000e1d326cff1273f92423c30f9a848a9 Mon Sep 17 00:00:00 2001
+From 89afb4f891b10c2f736cfac22f274e33ebc5256e Mon Sep 17 00:00:00 2001
 From: Jan Grulich <jan@grulich.eu>
 Date: Mon, 24 Aug 2015 16:03:47 +0100
-Subject: [PATCH 084/423] RaspiDAC3 support
+Subject: [PATCH] RaspiDAC3 support
 
 Signed-off-by: Jan Grulich <jan@grulich.eu>
 
index 2919498e5eef11d66bd60c635c36f8692a454b4c..aca4d75103155b8dc9b8d2df354d521a3fcc1b67 100644 (file)
@@ -1,7 +1,7 @@
-From dcfb4303fbbc327ec5f1b990d12c79384cd5a8db Mon Sep 17 00:00:00 2001
+From d182e9b8453b663bb0c75f73e1791bf78f2d4bcc Mon Sep 17 00:00:00 2001
 From: Jan Grulich <jan@grulich.eu>
 Date: Mon, 24 Aug 2015 16:02:34 +0100
-Subject: [PATCH 085/423] tpa6130a2: Add headphone switch control
+Subject: [PATCH] tpa6130a2: Add headphone switch control
 
 Signed-off-by: Jan Grulich <jan@grulich.eu>
 ---
index 4e76983a7437ac1cda469021722d66912ef79e61..edd36602d7e5544b1c02da4d2a393006241d1f57 100644 (file)
@@ -1,7 +1,7 @@
-From 20bc23d5669c1a70a03db60768eb3d4b100a658f Mon Sep 17 00:00:00 2001
+From 80bd42a96b7c6a20219803609651acd9e49f4db6 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Mon, 28 Sep 2015 23:38:59 +0100
-Subject: [PATCH 086/423] irq-bcm2835: Fix building with 2708
+Subject: [PATCH] irq-bcm2835: Fix building with 2708
 
 ---
  drivers/irqchip/irq-bcm2835.c | 3 ++-
index f1a7db89b831cc89368581c3686d2d0cc140cc42..db292ccd5c80f81a0d80717766428217b5e1cf2e 100644 (file)
@@ -1,7 +1,7 @@
-From cabbd4561f8a04b087fb867cedb002cd5170375f Mon Sep 17 00:00:00 2001
+From a8124cba46bd8d4d8fdf9e09fe3046b01ff21c42 Mon Sep 17 00:00:00 2001
 From: P33M <P33M@github.com>
 Date: Wed, 21 Oct 2015 14:55:21 +0100
-Subject: [PATCH 087/423] rpi_display: add backlight driver and overlay
+Subject: [PATCH] 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
index 364f4ffe7f6dcafd7228071b6939ca7fe520bcc0..ef15b9ececba5d287e20140bc0be84daaf00858d 100644 (file)
@@ -1,7 +1,7 @@
-From c0af79182427336015c026314b7c35a82c24b7aa Mon Sep 17 00:00:00 2001
+From 7e7500431515d41e1498cef0984ef6f9b91cac67 Mon Sep 17 00:00:00 2001
 From: Matthias Reichl <hias@horus.com>
 Date: Mon, 16 Nov 2015 14:05:35 +0000
-Subject: [PATCH 088/423] bcm2835-dma: Fix up convert to DMA pool
+Subject: [PATCH] bcm2835-dma: Fix up convert to DMA pool
 
 ---
  drivers/dma/bcm2835-dma.c | 36 ++++++++++++++++++++++++++----------
index 8b93b5a1cb57f609d17022fecf7ac6c1120e0c53..a3bd0a0c09ed55dd7d8e173b532262c19dcdb324 100644 (file)
@@ -1,8 +1,7 @@
-From 644468c76c90757811b1490557d7fa1ab8e9477b Mon Sep 17 00:00:00 2001
+From 93ede86bcccc686cdc933e0711289b0312f0361a Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 11 Nov 2015 11:38:59 +0000
-Subject: [PATCH 089/423] scripts: Multi-platform support for mkknlimg and
- knlinfo
+Subject: [PATCH] scripts: Multi-platform support for mkknlimg and knlinfo
 
 The firmware uses tags in the kernel trailer to choose which dtb file
 to load. Current firmware loads bcm2835-*.dtb if the '283x' tag is true,
index 3a8892bdc1edf10da983b3b9434ce1174f9c7bb3..c3ca12800d39fc309401e2b19f799966ec54964f 100644 (file)
@@ -1,8 +1,7 @@
-From b2366bf5c6c6c13d7d3b0e7099c6e71f4f775df6 Mon Sep 17 00:00:00 2001
+From a70ea1cd22e9b4e7278dfea3b2d6fb87e8902ca3 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 2 Mar 2015 13:01:12 -0800
-Subject: [PATCH 090/423] drm/vc4: Add suport for 3D rendering using the V3D
- engine.
+Subject: [PATCH] drm/vc4: Add suport for 3D rendering using the V3D engine.
 
 This is a squash of the out-of-tree development series.  Since that
 series contained code from the first "get a demo triangle rendered
index a6f78ef3552440ad02a53d2b3237e92ddccc2a0f..00a22d384ec49ece63f968edd11ec4cdf2057f53 100644 (file)
@@ -1,7 +1,7 @@
-From ffe4a5fe0c4dfb0c58193b6ff2e5e7eb37b350ad Mon Sep 17 00:00:00 2001
+From 1c356bdfac710d5427cfeac2ce2216d0bb17a6db Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Wed, 14 Oct 2015 11:32:14 -0700
-Subject: [PATCH 091/423] drm/vc4: Force HDMI to connected.
+Subject: [PATCH] drm/vc4: Force HDMI to connected.
 
 For some reason on the downstream tree, the HPD GPIO isn't working.
 
index b8df5457fb8391904e39b6425a051086c47787ad..df465b4178d37e0e9a20f6c96ced5aabbb169652 100644 (file)
@@ -1,7 +1,7 @@
-From ac56795420156559b5381fbf4ad1f607baca2935 Mon Sep 17 00:00:00 2001
+From 99cab11df7185247a24977d8cbcf5d660d0f861b Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 19 Oct 2015 08:23:18 -0700
-Subject: [PATCH 092/423] drm/vc4: bo cache locking fixes.
+Subject: [PATCH] drm/vc4: bo cache locking fixes.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 223524e7538a0056d35e62def53ce46a27df1db5..b0ae22f807b2001dc0fa83dc03d829ff7390b5c4 100644 (file)
@@ -1,7 +1,7 @@
-From 0ff2836cb0c35edfaa40124957f5884527bd4c1e Mon Sep 17 00:00:00 2001
+From beac608ce63d6537a89f3de8080a1c2d16aa1a4c Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 19 Oct 2015 08:29:41 -0700
-Subject: [PATCH 093/423] drm/vc4: bo cache locking cleanup.
+Subject: [PATCH] drm/vc4: bo cache locking cleanup.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 8292103ff5f3be5aba2bc31e13a0abeb47760836..4a29fc15ec9134483e048de78317da67d0cf55ef 100644 (file)
@@ -1,7 +1,7 @@
-From 616e0a78750f2c92c52ac7f6638a8f5a901afdaf Mon Sep 17 00:00:00 2001
+From 454b9dabe51753598732a2d91f742abdd82f3b18 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 19 Oct 2015 08:32:24 -0700
-Subject: [PATCH 094/423] drm/vc4: Use job_lock to protect seqno_cb_list.
+Subject: [PATCH] drm/vc4: Use job_lock to protect seqno_cb_list.
 
 We're (mostly) not supposed to be using struct_mutex in drivers these
 days.
index edc6f7534c7e244a01e425653e8a6edc7e700449..0cf7654920896b32a3e0e99e5c71e4ca71b2d139 100644 (file)
@@ -1,7 +1,7 @@
-From c554ca947004989217c25487dfadedd633928dc3 Mon Sep 17 00:00:00 2001
+From 72634a2adb667d991249e66e691878cd7e7722a0 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/423] drm/vc4: Drop struct_mutex around CL validation.
+Subject: [PATCH] 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
index 1ab2a2f4b3b976ce2269e8c774e9406b93ed2c0e..98412c140eea1d54714ec2a23c173af208088dfe 100644 (file)
@@ -1,7 +1,7 @@
-From c43a9027e42856592c071e5bbc7e38e8f236ce51 Mon Sep 17 00:00:00 2001
+From 81fcdac0b54488a1fea35a0fe2e799511888fa84 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/423] drm/vc4: Drop struct_mutex around CL validation.
+Subject: [PATCH] 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
index 8e479a9f2e305cc2957009e40ec460d9d7a05fd7..6f0ad8aef82d3b0208b5c482b7b3ed5600c642d6 100644 (file)
@@ -1,7 +1,7 @@
-From ea5d1ac38aba536dcd088cbf8eae229e4651ccbd Mon Sep 17 00:00:00 2001
+From 593759c954e9ac7b237bb4e2136a12952ae107d0 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 20 Oct 2015 13:59:15 +0100
-Subject: [PATCH 097/423] drm/vc4: Add support for more display plane formats.
+Subject: [PATCH] drm/vc4: Add support for more display plane formats.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 004c1a33ce1e8d20088573ab35fe25c95e7cc184..18dffd6d8a30fb90221f584a78bc7b6b96473602 100644 (file)
@@ -1,7 +1,7 @@
-From 910b5fa15403115a76d5ee2a4f7932b051454e9c Mon Sep 17 00:00:00 2001
+From ab2cd74a31d3da208cc6264ab79c1c0ee503498d Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 23 Oct 2015 12:31:56 +0100
-Subject: [PATCH 098/423] drm/vc4: No need to stop the stopped threads.
+Subject: [PATCH] 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.
index 47bde13eca985d782cc97fc975505bec8ad02328..432a60ebf4a31335e8462789a15cbe90d55dfc8c 100644 (file)
@@ -1,8 +1,7 @@
-From bc2764818666e6b24c4dc41e65a472a3fd0bdd74 Mon Sep 17 00:00:00 2001
+From 7ab57c24a8c094163c2a5da180edbba0c45b5765 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 23 Oct 2015 12:33:43 +0100
-Subject: [PATCH 099/423] drm/vc4: Remove extra barrier()s aroudn CTnCA/CTnEA
- setup.
+Subject: [PATCH] drm/vc4: Remove extra barrier()s aroudn CTnCA/CTnEA setup.
 
 The writel() that these expand to already does barriers.
 
index ca8c8b6193d615b06639e71b8aba41f94afd913f..e15cae83bcdfcbb2f4fb70cb01026348b017d90f 100644 (file)
@@ -1,7 +1,7 @@
-From b474d69ad1b4e5032c565868082e36f64854106e Mon Sep 17 00:00:00 2001
+From b1cfa411e68e4afc1d8bedda4ae1924108a5c2fa Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 23 Oct 2015 14:57:22 +0100
-Subject: [PATCH 100/423] drm/vc4: Fix a typo in a V3D debug register.
+Subject: [PATCH] drm/vc4: Fix a typo in a V3D debug register.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index ff4640653943462392360f82267d59df8fbfc81f..5cf4a64036e693dd2b1223bd8dc25ef5b96f1b92 100644 (file)
@@ -1,8 +1,8 @@
-From 29e3799c22dba7bb579a8caacc957f888965b2dc Mon Sep 17 00:00:00 2001
+From 7a4238c79a815c0cb87eecb30897f6710f5e4a82 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 2 Nov 2015 17:07:33 +0000
-Subject: [PATCH 101/423] drm/vc4: Enable VC4 modules, and increase CMA size
with overlay
+Subject: [PATCH] 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,
 or the Pi will almost hang, reporting stalls in kernel threads.
index eb92ddfba7bfbab6bf4307c90fdf0eb5435d2e92..f9046563b4747b7b3d2b76ecb45be52659e20369 100644 (file)
@@ -1,7 +1,7 @@
-From 9727788fde8cab56ee1f6957aa6a0d369401dfbb Mon Sep 17 00:00:00 2001
+From 505327ef0c6712565139bfbae6fde8c881566088 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 18 Nov 2015 18:29:58 +0000
-Subject: [PATCH 102/423] squash: fixups
+Subject: [PATCH] squash: fixups
 
 ---
  drivers/gpu/drm/vc4/Kconfig   | 2 +-
index d8f12f318b933f96044c11da9a7fcac491416287..ee54a402980dcc514e9b1a0fc62ef7d2043d37de 100644 (file)
@@ -1,8 +1,7 @@
-From aefe0ee79893899fcbbaeac2c1ea27828d5b9645 Mon Sep 17 00:00:00 2001
+From fd632236b26e841d032acc5fce6cdd4d50780daa Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 18 Nov 2015 20:26:03 +0000
-Subject: [PATCH 103/423] squash: add missing vc4-kms-v3d-overlay.dtb to
- makefile
+Subject: [PATCH] squash: add missing vc4-kms-v3d-overlay.dtb to makefile
 
 ---
  arch/arm/boot/dts/overlays/Makefile | 1 +
index 93b752e36271b3c0d2347071978cb898c42574b3..3cf0524c70c1c1464843a987771a570e1a25efdd 100644 (file)
@@ -1,8 +1,7 @@
-From 02f9b12f8c9335eb9312bbde0f2a06ae52d35191 Mon Sep 17 00:00:00 2001
+From d8d6facbd16527ccc11a926e769ec3e86f60dcdb Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 12 Oct 2015 11:23:34 -0700
-Subject: [PATCH 104/423] clk: bcm2835: Also build the driver for downstream
- kernels.
+Subject: [PATCH] clk: bcm2835: Also build the driver for downstream kernels.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 25cecf26c65aa7f6a155fcc3100edc98bf9d469c..da3fcce9fabd3bfe051f0dccfb979f1dbe5aaeb4 100644 (file)
@@ -1,7 +1,7 @@
-From 9bf65a0b3903fdd475b8c6a59426c415ecdf3ec3 Mon Sep 17 00:00:00 2001
+From d47719348c1c616d8ffa42d9ae8827147c0251ea Mon Sep 17 00:00:00 2001
 From: Holger Steinhaus <hsteinhaus@gmx.de>
 Date: Sat, 14 Nov 2015 18:37:43 +0100
-Subject: [PATCH 105/423] dts: Added overlay for gpio_ir_recv driver
+Subject: [PATCH] dts: Added overlay for gpio_ir_recv driver
 
 ---
  arch/arm/boot/dts/overlays/Makefile            |  1 +
index f3cecaafb97795c2f1c5434c997dac3d4d8215c8..5b3a401df084c076442c159b8558fdf8efb4bf0f 100644 (file)
@@ -1,8 +1,8 @@
-From 377a971a6d66cd45f011daeb17eaf6cbba59f54c Mon Sep 17 00:00:00 2001
+From 85b8ee017f92d4aa0e004e01878cab3ba5b88851 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 106/423] Build i2c_gpio module and add a device tree overlay
to configure it.
+Subject: [PATCH] Build i2c_gpio module and add a device tree overlay to
+ configure it.
 
 ---
  arch/arm/boot/dts/overlays/Makefile             |  1 +
index 22ed096c59d5e1383ab062b2dcaf158e511ec26b..94bb91f37b5104c2751f4593d209aad5c799f15f 100644 (file)
@@ -1,7 +1,7 @@
-From 40fb51ca3709e962289b659216d5fa29758b5044 Mon Sep 17 00:00:00 2001
+From 1e78b98d827b57373b0a984af0ceb21e576b6037 Mon Sep 17 00:00:00 2001
 From: mwilliams03 <mark.mwilliams@gmail.com>
 Date: Sun, 18 Oct 2015 17:07:24 -0700
-Subject: [PATCH 107/423] New overlay for PiScreen2r
+Subject: [PATCH] New overlay for PiScreen2r
 
 ---
  arch/arm/boot/dts/overlays/Makefile               |   1 +
index a840bb8cd81fc1589b878d80f175b7b4fee42f54..3deca391b1346f1439fa05a06f10754cdf8421b9 100644 (file)
@@ -1,8 +1,8 @@
-From 413f3dadca77a06ea8f0ed1f83a2adc99cdc1fe0 Mon Sep 17 00:00:00 2001
+From cd12f8bd219b60685803c427847909f5151d8143 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 108/423] dts: Added overlay for Adafruit PiTFT 2.8" capacitive
touch screen
+Subject: [PATCH] dts: Added overlay for Adafruit PiTFT 2.8" capacitive touch
+ screen
 
 ---
  arch/arm/boot/dts/overlays/Makefile                |  1 +
index a1834b6fff6fbf093caf8a99589dbb073ef4f4a5..cce82ef42214ca5704bfcf871d06e298df676327 100644 (file)
@@ -1,7 +1,7 @@
-From 03155cfced4c9bf25f22f125aeeb820ca4d08e64 Mon Sep 17 00:00:00 2001
+From bc4c561b1b11b068263addb6ca5055136859cc5e Mon Sep 17 00:00:00 2001
 From: Stuart MacLean <stuart@hifiberry.com>
 Date: Fri, 2 Oct 2015 15:12:59 +0100
-Subject: [PATCH 109/423] Add support for the HiFiBerry DAC+ Pro.
+Subject: [PATCH] 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.
 
index c3b98b55f405cfc3544bcb5d4067c316ac193ed7..614ab0c1a3bb7b97c9a42147a390110bcca0fbe0 100644 (file)
@@ -1,7 +1,7 @@
-From 787c2642cbfe90d0ea548926f3eab12bc5d3e378 Mon Sep 17 00:00:00 2001
+From c952f560bf95867368542c0f2e46abe536ad9afc Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 5 Oct 2015 10:47:45 +0100
-Subject: [PATCH 110/423] BCM270X_DT: Add at86rf233 overlay
+Subject: [PATCH] BCM270X_DT: Add at86rf233 overlay
 
 Add an overlay to support the Atmel AT86RF233 WPAN transceiver on spi0.0.
 
index 59e61b74869f883102bd7cc263cc636a569f0293..d2e3547312eb178d1e40de007a194865aa77f10f 100644 (file)
@@ -1,7 +1,7 @@
-From 2da545ccd7f9bada3a8afe11c735f772a1907acc Mon Sep 17 00:00:00 2001
+From daf482fad156e7bf39e3e2a26183452068796e7d Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Thu, 18 Dec 2014 16:07:15 -0800
-Subject: [PATCH 111/423] mm: Remove the PFN busy warning
+Subject: [PATCH] mm: Remove the PFN busy warning
 
 See commit dae803e165a11bc88ca8dbc07a11077caf97bbcb -- the warning is
 expected sometimes when using CMA.  However, that commit still spams
index 6777acd2bcea36483a7c18709e4856fc98a22661..91694add7750c73360887c834ad5c7d17ddb1d7e 100644 (file)
@@ -1,8 +1,8 @@
-From 1936051dc9366b134607f626e92a6c58f3a645e6 Mon Sep 17 00:00:00 2001
+From a1fbf2a0424262c6f2d974aa5a6e71d47288e1a8 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Wed, 19 Nov 2014 12:06:38 -0800
-Subject: [PATCH 112/423] drm: Put an optional field in the driver struct for
GEM obj struct size.
+Subject: [PATCH] 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
 of the code.
index efb7f9f5edb98a2b7075b80fcae2d3ee43b61091..16dbe75b43a100e700c8b4af23e2ffc1df324e40 100644 (file)
@@ -1,8 +1,8 @@
-From 513851ff3c5601e7ebcbc0d22df31a0c8ef141e6 Mon Sep 17 00:00:00 2001
+From 66b424ecf55290f394d004e13f800bec1b44a87a Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 30 Oct 2015 10:09:02 -0700
-Subject: [PATCH 113/423] drm/vc4: Add an interface for capturing the GPU state
after a hang.
+Subject: [PATCH] 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
 what was going on.
index d7065fc88bee77d4edfc616157216e8496b7cb5e..d99aca9b1ed387ac26956901617141ee15dbe5ff 100644 (file)
@@ -1,8 +1,7 @@
-From 20619faf6bc00265bb70b0ef189a1f8618f3e508 Mon Sep 17 00:00:00 2001
+From c6f6dec9e9b7956d7261f11caf6e2a0b78a54d89 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 4 Dec 2015 11:35:34 -0800
-Subject: [PATCH 114/423] drm/vc4: Update a bunch of code to match upstream
- submission.
+Subject: [PATCH] drm/vc4: Update a bunch of code to match upstream submission.
 
 This gets almost everything matching, except for the MSAA support and
 using generic PM domains.
index 3b99f259264059b34b04c14aa1cad100490c8ad2..f7eaf9152bf4c6ea8843b1ab45782808b8c4b92d 100644 (file)
@@ -1,8 +1,8 @@
-From ea38a9fb0b8312167361ea9957b4f7a3233492aa Mon Sep 17 00:00:00 2001
+From 3fb1fdfad76d7ebbe1c78e262f57e636cfa2545d Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 11 Dec 2015 19:45:03 -0800
-Subject: [PATCH 115/423] drm: Use the driver's gem_object_free function from
CMA helpers.
+Subject: [PATCH] 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
 own teardown (waiting for GPU to finish, updating bo_stats tracking).
index c4546a0fc47b30eb97a6b37bddcfca9a46cd7e94..d8cc64678a5decc25a83c53f384aab8bda0ef743 100644 (file)
@@ -1,7 +1,7 @@
-From 37a1421ea161a9da980cae4ff81a3fb5521d5090 Mon Sep 17 00:00:00 2001
+From 3fcab2551c8649da57ad5fc5166f85edd870f641 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 17 Jul 2015 13:15:50 -0700
-Subject: [PATCH 116/423] drm/vc4: Add support for MSAA rendering.
+Subject: [PATCH] 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
index 3a6798f02e29c15bab2df60634b8d29cc788e17e..8cf3997326f06d05488da3954b34a7da25cd1818 100644 (file)
@@ -1,7 +1,7 @@
-From a7d3659d3eefde8fc449f0ca33584a9490165d15 Mon Sep 17 00:00:00 2001
+From 4c19d1b2713fd0452edfc479cea4628229048994 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 8 Dec 2015 14:00:43 -0800
-Subject: [PATCH 117/423] drm/vc4: A few more non-functional changes to sync to
+Subject: [PATCH] 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,
index f4627ae6d16530269ac1372a4ef4ebcb2935826d..ea9ba0b2f9556f2b002d554146cc78c9c035f4c7 100644 (file)
@@ -1,8 +1,8 @@
-From d3e66a857abb05fe9eb367e0a8160584ec1db1a7 Mon Sep 17 00:00:00 2001
+From b45971f3b371a7e50bfa2ebd8545abaf299182d5 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 15 Dec 2015 23:46:32 +0000
-Subject: [PATCH 118/423] drm/vc4: Use "hpd-gpios" for HDMI GPIO, like what
landed upstream.
+Subject: [PATCH] drm/vc4: Use "hpd-gpios" for HDMI GPIO, like what landed
+ upstream.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 4fe630f98f4838860a649c7ed26ebc9b297fa3ca..0a855188d89ef77797ea2497ac53409a05b2b7df 100644 (file)
@@ -1,8 +1,8 @@
-From 10caa2cc688e4837723da80f010e89a79e040c26 Mon Sep 17 00:00:00 2001
+From 837fa77c227eda3ebdab64b24acb3dc94599e76d Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 7 Dec 2015 12:35:01 -0800
-Subject: [PATCH 119/423] drm/vc4: Synchronize validation code for v2
submission upstream.
+Subject: [PATCH] drm/vc4: Synchronize validation code for v2 submission
+ upstream.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 405980232b5d9413b0aa5e16e01f33781a3b78ef..4a81e5a3aadda31d826712abf6613ec59e27a230 100644 (file)
@@ -1,8 +1,7 @@
-From f6d5c3deefad3bf030e1410afeac8f562ed7be4d Mon Sep 17 00:00:00 2001
+From 6a602d99694b69c8cd19970f7d2b019dadaaaa09 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 120/423] MMC: Do not use mmc_debug if CONFIG_MMC_BCM2835 is
- not set
+Subject: [PATCH] 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
 since mmc_debug was not defined but used in drivers/mmc/core/quirks.c.
index 0969926d343fc07bca5557452ca7776690104e75..eb39fffbc21a20b6b89618600b8a9b1ed3672404 100644 (file)
@@ -1,8 +1,7 @@
-From 4baa30f9ca6367b354e98536f838d0b60499a51e Mon Sep 17 00:00:00 2001
+From 29171b2e2b69a4edb84bd228e1d9ea0451e7dcd2 Mon Sep 17 00:00:00 2001
 From: Devon Fyson <devonfyson@gmail.com>
 Date: Wed, 30 Dec 2015 16:40:47 -0500
-Subject: [PATCH 121/423] Extend clock timeout, fix modprobe baudrate
- parameter.
+Subject: [PATCH] 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.
 ---
index 39a0733027ee8f56dd151f19669f5be595b691e3..03a2eca16b058e499ef3d9d84ad6182a0410b24c 100644 (file)
@@ -1,7 +1,7 @@
-From 0af77632d0318f69474e46a0473e64854562842c Mon Sep 17 00:00:00 2001
+From 9715590cd5024b1eb657d06a6eb60a48751e221c 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 122/423] bcm270x_dt: Add dwc2 and dwc-otg overlays
+Subject: [PATCH] bcm270x_dt: Add dwc2 and dwc-otg overlays
 
 ---
  arch/arm/boot/dts/overlays/Makefile            |  2 ++
index 2bdcdc1ebecf93420c6d9d5be3f9ac3f4299f2e4..abb58a35d3406f2fbf4b00cb16eeda228b7b15d9 100644 (file)
@@ -1,8 +1,7 @@
-From 2d13c12edb132e32ab3e500cd1f783cc7bba84ac Mon Sep 17 00:00:00 2001
+From 5c8479b7e82155eed9e86658935dda7bf8202b8d Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 4 Jan 2016 14:42:17 +0000
-Subject: [PATCH 123/423] BCM270X_DT: Add the sdtweak overlay, for tuning
- sdhost
+Subject: [PATCH] BCM270X_DT: Add the sdtweak overlay, for tuning sdhost
 
 The sdhost overlay declares the sdhost interface and allows parameters
 to be set. This is overkill for situations where the user just wants to
index 5f379bcb7995b39c903a8b8aba9bfb66a63a6e97..907b1fe303e424058a0ec525b8d27204ecdef676 100644 (file)
@@ -1,8 +1,8 @@
-From a49c5fc29582017da47598db437cf253e7620e7e Mon Sep 17 00:00:00 2001
+From 5e45aa3d7aa8a59d82fb57cafd341e2c8c908f81 Mon Sep 17 00:00:00 2001
 From: Andrew Litt <ajlitt@splunge.net>
 Date: Mon, 11 Jan 2016 07:54:21 +0000
-Subject: [PATCH 124/423] bcm2835-mmc: Don't override bus width capabilities
from devicetree
+Subject: [PATCH] bcm2835-mmc: Don't override bus width capabilities from
+ devicetree
 
 Take out the force setting of the MMC_CAP_4_BIT_DATA host capability
 so that the result read from devicetree via mmc_of_parse() is
index 6de7437040755ff214d3c04d80cec716dbe20989..6a3d874c44b971c84649ad39fcd608df231986fe 100644 (file)
@@ -1,7 +1,7 @@
-From c7f6e0ebbdbff464b2eaad598adb9e592e7e5a21 Mon Sep 17 00:00:00 2001
+From bafb94810a17cd66baa5d220f6005d8f1db1e516 Mon Sep 17 00:00:00 2001
 From: Andrew Litt <ajlitt@splunge.net>
 Date: Mon, 11 Jan 2016 07:55:54 +0000
-Subject: [PATCH 125/423] SDIO-overlay: add bus_width parameter
+Subject: [PATCH] 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
index fca4df95701197e3c3db69b38b12aaae489b22b4..b9c2918bd95bb7b42ace10aab42edefd7f77af99 100644 (file)
@@ -1,8 +1,7 @@
-From 05c2e0a07f9b7f7f348f05f127871be618b66ad8 Mon Sep 17 00:00:00 2001
+From 0b6eb4c6015ead6da180ef4a4da695b660bcb99f Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:41:45 +0100
-Subject: [PATCH 126/423] bcm2835: extend allowed range of channels and
- samplerates
+Subject: [PATCH] bcm2835: extend allowed range of channels and samplerates
 
 Allow everything the videocore accepts.
 ---
index 0883222cd561534a8f65f9f92ba52192271c6b61..52601b139de3bf9fc2e3bef32a99252d2602cd68 100644 (file)
@@ -1,7 +1,7 @@
-From eeb06bfcdcc321f270753d6ba822c9212c49db00 Mon Sep 17 00:00:00 2001
+From 4b235ff95b0fcfa9731c1159402f4fef0e26f1d3 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:42:18 +0100
-Subject: [PATCH 127/423] bcm2835: restrict channels*rate to 8*960000
+Subject: [PATCH] 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
index 8efedf074298b01120671fb9ef9bde5aab3acf63..a6b211dfe7e762ca08aa9fbd2c98fe9edae4fdf0 100644 (file)
@@ -1,7 +1,7 @@
-From 74e3804dcc18b79f64c2f9d36e5481277ee2f7eb Mon Sep 17 00:00:00 2001
+From fa0c088b7f7372b6946a2f2139f0e391cace34d6 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:42:48 +0100
-Subject: [PATCH 128/423] rpi: update vc_vchi_audioserv_defs.h
+Subject: [PATCH] rpi: update vc_vchi_audioserv_defs.h
 
 Add audioserv 3 extensions. The changes were taken from the paste
 linked here:
index 256d38bd5272700c5f824896ee97b5801784a5cb..6f3f5a45d58754a8b1ce99d3a68bba5ab8bdbe63 100644 (file)
@@ -1,7 +1,7 @@
-From 134223185c5da1678106310a2ca98146d8d80c49 Mon Sep 17 00:00:00 2001
+From 55349969a1914b515956c14f3fafd25df5c827a9 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:43:12 +0100
-Subject: [PATCH 129/423] bcm2835: implement channel map API
+Subject: [PATCH] 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
index 5d925076a21f0a037df1bc402810d275d86b1550..099c8ec0f206f70fc9805ca6b5017a51ae971e06 100644 (file)
@@ -1,7 +1,7 @@
-From 8aa6bca1b7f62cc2b953d6384138bb262dc16434 Mon Sep 17 00:00:00 2001
+From 7067b04bc0f05e25621868e47e3de42befa8ac61 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:43:35 +0100
-Subject: [PATCH 130/423] bcm2835: access controls under the audio mutex
+Subject: [PATCH] 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
index c12a10404bd8244b521ba73665a08e2b156a0b02..731091d49ea9189ab82f9a3719f77525966cf7da 100644 (file)
@@ -1,8 +1,7 @@
-From bbbdf3afb567a7bded1b606d34ba6d97cbf1fb0a Mon Sep 17 00:00:00 2001
+From db9dc8093738d064963257f19b8b6d927d137dd9 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:44:03 +0100
-Subject: [PATCH 131/423] bcm2835: always use 2/4/8 channels for multichannel
- layouts
+Subject: [PATCH] bcm2835: always use 2/4/8 channels for multichannel layouts
 
 Pad the unused channels with NA. This means userspace needs to write
 additional, silent padding channels, which is not ideal, but better
index 84b6a5dfc1f113c5c13a681bd32185abe0e7af69..98be6d2b8a9134534a3bd328d41c8cb2eef86c95 100644 (file)
@@ -1,8 +1,7 @@
-From 9e26f4ac9231419f7dcc0f793fb2d1f17748eae9 Mon Sep 17 00:00:00 2001
+From 8bf3ca92ea1352a4b97258eee4b225240e525a54 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:44:24 +0100
-Subject: [PATCH 132/423] bcm2835: only allow stereo if analogue jack is
- selected
+Subject: [PATCH] bcm2835: only allow stereo if analogue jack is selected
 
 Sending more than 2 channels to videocore while outputting to analogue
 mysteriously outputs heavy artifacts. So just paint it over with a
index 79a40407d7c35af38e5112a47f26f055a671aeec..3ea75eed0b420ff183f99c05c77f46784e9f651d 100644 (file)
@@ -1,7 +1,7 @@
-From 44ea54f0017696e00153c389a274b97938f093e9 Mon Sep 17 00:00:00 2001
+From 7756cf7615123045c60b9f9e311d2491a5e23424 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Wed, 13 Jan 2016 19:44:47 +0100
-Subject: [PATCH 133/423] bcm2835: interpolate audio delay
+Subject: [PATCH] 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
index 014fd5db2a80f699636f90dcd399452550b7b130..8eda6d5949e98d546917c662219a8751449b792f 100644 (file)
@@ -1,8 +1,8 @@
-From 58389f0ac10212334f0146ca72a4ef364e8c15df Mon Sep 17 00:00:00 2001
+From 2e34fd2e06d95cd4e4e29d94ce016ab4426f75af Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 19 Jan 2016 17:16:38 +0000
-Subject: [PATCH 134/423] bcm2835-sdhost: Add workaround for odd behaviour on
some cards
+Subject: [PATCH] bcm2835-sdhost: Add workaround for odd behaviour on some
+ cards
 
 For reasons not understood, the sdhost driver fails when reading
 sectors very near the end of some SD cards. The problem could
index f7d9d3de176797f4da5e1eaa043311f2e2137944..40866492149b4271c730fa918d5da21970ba736a 100644 (file)
@@ -1,7 +1,7 @@
-From 2b579856474546abebe0a3e38899893bbd7345c2 Mon Sep 17 00:00:00 2001
+From 8349a032c4e1d3f9c3c5e4bb66064b6addf6f111 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 22 Jan 2016 16:03:24 +0000
-Subject: [PATCH 135/423] bcm2835-sdhost: Add debug_flags dtparam
+Subject: [PATCH] bcm2835-sdhost: Add debug_flags dtparam
 
 Bit zero disables the single-read-sectors map:
 
index ab0ebbbc0b9dbbb7f90bcd6fc4fda2abb6140968..13aec51cac615f3ef426bd7430bd845e5512e782 100644 (file)
@@ -1,8 +1,7 @@
-From b02faf882ad1216f89a12391f1499e7c47dbbb13 Mon Sep 17 00:00:00 2001
+From 1bb36898f708926752ef4afa43c62056b376d7a4 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 25 Jan 2016 09:12:06 +0000
-Subject: [PATCH 136/423] BCM270X_DT: Add sdio_overclock parameter to sdio
- overlay
+Subject: [PATCH] BCM270X_DT: Add sdio_overclock parameter to sdio overlay
 
 The sdio_overclock parameter is like the overclock_50 parameter, i.e.
 it sets an alternate frequency (in MHz) to use when the MMC framework
index 626519ff3f964801ecd72f689f0185573f604179..7be2d88f8c31e5361247d033a6605e3a88ad5679 100644 (file)
@@ -1,8 +1,7 @@
-From a74004694a521e40b57db19b761265759d4279e2 Mon Sep 17 00:00:00 2001
+From e4bd962eeb728b924ebdaca077c2136280a190f2 Mon Sep 17 00:00:00 2001
 From: Michael Lange <linuxstuff@milaw.biz>
 Date: Thu, 21 Jan 2016 18:10:16 +0100
-Subject: [PATCH 137/423] rtc: ds1307: add support for the DT property
- 'wakeup-source'
+Subject: [PATCH] rtc: ds1307: add support for the DT property 'wakeup-source'
 
 For RTC chips with no IRQ directly connected to the SoC, the RTC chip
 can be forced as a wakeup source by stating that explicitly in
index 88cef6df3a8aa69fd341ca8e2f8a82e7757bcb23..a08502152e9ecb20d18f6e0e6f4a9f99c4f10091 100644 (file)
@@ -1,7 +1,7 @@
-From 8f9769d2ca0c6743ccaac0f5a43e8a690aaec3c1 Mon Sep 17 00:00:00 2001
+From 44a37e094bbe4dd9ee63fb1d5426b3945981fd26 Mon Sep 17 00:00:00 2001
 From: vitalogy <vitalogy_github@milaw.biz>
 Date: Tue, 19 Jan 2016 07:02:02 +0100
-Subject: [PATCH 138/423] dt-overlay: add wittypi-overlay.dts
+Subject: [PATCH] dt-overlay: add wittypi-overlay.dts
 
 ---
  arch/arm/boot/dts/overlays/wittypi-overlay.dts | 44 ++++++++++++++++++++++++++
index bcb163677516ff1a8fe714ab4e4bcb9c943bd40f..37cf64ac3aab223f27bb300fd87d90bc6d946063 100644 (file)
@@ -1,8 +1,7 @@
-From cdc262a3377780a97c4bf2054d55ec8752d80e89 Mon Sep 17 00:00:00 2001
+From 4efc768113042d0b48fdb4e170d5469f93f6e20b Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 19 Jan 2016 16:28:05 +0000
-Subject: [PATCH 139/423] FIXUP i2c_bcm2708: Don't change module baudrate
- parameter
+Subject: [PATCH] FIXUP i2c_bcm2708: Don't change module baudrate parameter
 
 Overwriting the baudrate module parameter creates an apparent
 forced baudrate for i2c busses after the first. Not only does this
index 20489bb0dd8913c72b93785d7ed08e71c173babd..0af3a52d8823a26a3c6527b6c1c9185d28c907cd 100644 (file)
@@ -1,8 +1,8 @@
-From ccbc06892764dda07be0a17c8541f3dc18de97c6 Mon Sep 17 00:00:00 2001
+From 290cec3c415ef37c10465f201545f26423241249 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 140/423] Allow up to 24dB digital gain to be applied when
using IQAudIO DAC+
+Subject: [PATCH] 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
 codec "Digital" volume control should not be limited to 0dB gain,
index 8ad2afabc21976e6aab8783cf9b3a91781fb5b57..7003f57639d277ee3d1f33fb6d87a13ce67b104f 100644 (file)
@@ -1,8 +1,8 @@
-From 427a1c87dc8100722e3a8c7476573fe3715f5b5a Mon Sep 17 00:00:00 2001
+From 3f38eac723b07d22f70a77ae006d18eb84218a9e 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 141/423] Limit PCM512x "Digital" gain to 0dB by default with
HiFiBerry DAC+
+Subject: [PATCH] Limit PCM512x "Digital" gain to 0dB by default with HiFiBerry
+ DAC+
 
 24db_digital_gain DT param can be used to specify that PCM512x
 codec "Digital" volume control should not be limited to 0dB gain,
index 614f5b6fc2f00a1af459a5bd77c9d4433b3a945f..20b44254f4a74131b8d289c222fac4096452badf 100644 (file)
@@ -1,7 +1,7 @@
-From 305469eecd74e0c7e78b1646dfbc3bdd498b341e Mon Sep 17 00:00:00 2001
+From 8d559133434730d0a1c5f661e6cdaca27f6ee184 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 8 Feb 2016 09:46:33 +0000
-Subject: [PATCH 142/423] BCM270X_DT: Adjust overlay README formatting
+Subject: [PATCH] BCM270X_DT: Adjust overlay README formatting
 
 ---
  arch/arm/boot/dts/overlays/README | 414 +++++++++++++++++++-------------------
index 90a15a41ebf9853c4970ca0dddd4a944c869c1ef..9a8364a29a8a3b3bc7be0c5f6466687694385488 100644 (file)
@@ -1,7 +1,7 @@
-From 8fcc1b75df2cfc5e75b36ab6cf62232291b47df1 Mon Sep 17 00:00:00 2001
+From da5b64aae5cb189a2a2e24a459e84cb5fab5d864 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 11 Feb 2016 16:51:01 +0000
-Subject: [PATCH 143/423] bcm2835-sdhost: Major revision
+Subject: [PATCH] bcm2835-sdhost: Major revision
 
 This is a significant revision of the bcm2835-sdhost driver. It
 improves on the original in a number of ways:
index a1db24cdccce2723b765a854b13a7ee59094890e..5ff574f6f72c152001a022f1ee2b5c9177f0a3c0 100644 (file)
@@ -1,7 +1,7 @@
-From 367af45e7a38258b1198af604070cc09198b1a61 Mon Sep 17 00:00:00 2001
+From f6031fa472bf8ce9eaba902b00cd2af3d00f0fb4 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 12 Feb 2016 15:38:00 +0000
-Subject: [PATCH 144/423] BCM270X_DT: Add dtparams for the SD interface
+Subject: [PATCH] BCM270X_DT: Add dtparams for the SD interface
 
 Add new base dtparams sd_overclock, sd_force_pio, sd_pio_limit
 and sd_debug.
index 5217c72c8ef166c4ef9f861c4369eb8ac07901dc..70d0764c30e0d48c63d69ec5e560d17aaf553a4e 100644 (file)
@@ -1,8 +1,8 @@
-From f9149b39714c2115a49fe806f3e5117fa2f55ec8 Mon Sep 17 00:00:00 2001
+From 20c4f162386eea18273c461a183244a472ecc1da Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 12 Feb 2016 14:50:25 +0000
-Subject: [PATCH 145/423] dcw_otg: trim xfer length when buffer larger than
allocated size is received
+Subject: [PATCH] dcw_otg: trim xfer length when buffer larger than allocated
+ size is received
 
 ---
  drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 11 +++++++++++
index b3a1e2f6819e4179d50b7a7499d907ba935fc05e..6ca2b5408174b89cac549333ed4f61c0d550fa97 100644 (file)
@@ -1,7 +1,7 @@
-From 865b951f9bc7ce938c240eb17e829fd666a3f5eb Mon Sep 17 00:00:00 2001
+From 2ace17c79f413a43950944cf282235ea3de8c6e2 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 15 Feb 2016 10:00:27 +0000
-Subject: [PATCH 146/423] bcm2835-sdhost: Restore ATOMIC flag to PIO sg mapping
+Subject: [PATCH] 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.
index ac947ae41bea0bf8dda82af7ab925bd00f321442..476e01b68079365846719269f92b2d8821037c76 100644 (file)
@@ -1,9 +1,8 @@
-From af4e7094adf051d1cec6ebc04cfbc5d3049ce126 Mon Sep 17 00:00:00 2001
+From ef351705676a8a3906bfbc3696e7d44bcc3a320b Mon Sep 17 00:00:00 2001
 From: Craig Roberts <cjr@craigroberts.net>
 Date: Tue, 16 Feb 2016 10:03:42 +0000
-Subject: [PATCH 147/423] Updated smsc95xx driver to check for a valid MAC
- address in eeprom before using smsc95xx.macaddr parameter passed on command
- line.
+Subject: [PATCH] Updated smsc95xx driver to check for a valid MAC address in
+ eeprom before using smsc95xx.macaddr parameter passed on command line.
 
 The built-in RPi adaptor will still get a MAC address based on the parameter passed on the command line as the RPi hardware does not have an eeprom,
 however usb->ethernet adaptors using the same driver should have an eeprom with MAC address as part of their hardware and therefore will use this
index 9e20d191df80079ecfde3691b07a5db5ccf216bc..790d2969bacd6706e1752cfb81c3bb2513bc4562 100644 (file)
@@ -1,7 +1,7 @@
-From f65f992c827f63ab148a991fe3599804704fa338 Mon Sep 17 00:00:00 2001
+From 82973637f761439a9ff507bf7a0a4aa325d98870 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 17 Feb 2016 19:02:31 +0000
-Subject: [PATCH 148/423] dcw_otg: Make trimming messages less noisy
+Subject: [PATCH] dcw_otg: Make trimming messages less noisy
 
 ---
  drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c | 6 ++++--
index d73f1a2a5f5fec032d73d5a8c88eb36b223f692d..47db7aa8db58ef898383a26ed7c5527fac15ebe1 100644 (file)
@@ -1,7 +1,7 @@
-From dbf8f761e366f4c93e8c2c2a1558561faa762f9f Mon Sep 17 00:00:00 2001
+From dfcdab5a069fb85d39ae9b0b86dca5f7277a5a47 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 18 Feb 2016 15:28:14 +0000
-Subject: [PATCH 149/423] BCM270X_DT: at86rf233 overlay - drop to 3MHz
+Subject: [PATCH] BCM270X_DT: at86rf233 overlay - drop to 3MHz
 
 The consensus is that 6MHz is too fast, but that 3MHz is OK.
 
index 9776c10285204e3c2959ae10caff7de7de5e4323..a39efeb84ad6b4da06f1be20821be447ce2d5eb2 100644 (file)
@@ -1,7 +1,7 @@
-From c7dc70d85fa909f1ffb7b490f93b56cabf0b155f Mon Sep 17 00:00:00 2001
+From 0f091b751bab3fcedb2281d3a201c42c627c7867 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 19 Feb 2016 12:04:48 +0000
-Subject: [PATCH 150/423] bcm2835-sdhost: Downgrade log message status
+Subject: [PATCH] bcm2835-sdhost: Downgrade log message status
 
 ---
  drivers/mmc/host/bcm2835-sdhost.c | 4 ++--
index d98d401b716954db1a8072eb6a730b9c35db5c80..e39870746ef7d3786a08f3481b2bf1c0e311da64 100644 (file)
@@ -1,7 +1,7 @@
-From 6c1cfd3b278d6f0656f33646392c81f41b2dc5ac Mon Sep 17 00:00:00 2001
+From 87614bfb6cc2eba2b5dd80596a76866f42bef42a Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 15 Jan 2016 16:48:27 +0000
-Subject: [PATCH 151/423] config: Enable HCI over UARTs
+Subject: [PATCH] config: Enable HCI over UARTs
 
 ---
  arch/arm/configs/bcm2709_defconfig | 3 +++
index 963fa86ee713bb61915e5c0335c27d97715ddcdf..05c2ae26415244ba03d57a106c8799b642d0a6fe 100644 (file)
@@ -1,7 +1,7 @@
-From f736186a0650f05ba00fa51957b25d6486ea3358 Mon Sep 17 00:00:00 2001
+From fc507785b54db0e908719ba738531f45fb1797d3 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 17 Dec 2015 13:37:07 +0000
-Subject: [PATCH 152/423] hci_h5: Don't send conf_req when ACTIVE
+Subject: [PATCH] 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.
index 8c2872c1e0ca61a2d2a9426e27d624d0f1231bf3..7cadb2a8eaedfa1fdc83a1fc60ecaf03910b0e6b 100644 (file)
@@ -1,7 +1,7 @@
-From 36b4312e6c109ead13feef44315fa73d1e1fa9f0 Mon Sep 17 00:00:00 2001
+From e0f147530d17dfe705fee528c40232047bd1ee47 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 23 Feb 2016 17:26:48 +0000
-Subject: [PATCH 153/423] amba_pl011: Don't use DT aliases for numbering
+Subject: [PATCH] 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
index 526dcc7111b3af4fbf0629d6f811c83b908202a5..7e1b2bab29b0fdc90efde19ed1f9316b976343b8 100644 (file)
@@ -1,8 +1,8 @@
-From 36dba68f842fac976afdd4487958d014ffdb130d Mon Sep 17 00:00:00 2001
+From 0ace9f0a0b1d5768cec58a69bd0d4fffd5995ad2 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 15 Dec 2015 15:35:57 -0800
-Subject: [PATCH 154/423] clk: bcm2835: Add bindings for the auxiliary
peripheral clock gates.
+Subject: [PATCH] clk: bcm2835: Add bindings for the auxiliary peripheral clock
+ gates.
 
 These will be used for enabling UART1, SPI1, and SPI2.
 
index 868ebbe72bf5b4289454518bb4a527c224b02fac..f095a7a884d0fe82b376f8d2adb2526a690b282f 100644 (file)
@@ -1,8 +1,8 @@
-From 308d421f734ecdf5664603b87d2b327c2f46f810 Mon Sep 17 00:00:00 2001
+From 19a393608fdcadad7fdde85e4439f05d10381d84 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 15 Dec 2015 15:35:58 -0800
-Subject: [PATCH 155/423] clk: bcm2835: Add a driver for the auxiliary
peripheral clock gates.
+Subject: [PATCH] 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
 additions.  As a result, they didn't get integrated in the same way as
index 58e8b0a4a3cc8224d76c908b622e93f962dca535..8094495f34994ef4898eaadb6027596054612430 100644 (file)
@@ -1,7 +1,7 @@
-From 70fb111800b9bb01e4c95ea9e351cb15748f692f Mon Sep 17 00:00:00 2001
+From fb47ac65c77bd2bc6480bb45a0bef29056108984 Mon Sep 17 00:00:00 2001
 From: Fraser <github@frasersdev.net>
 Date: Tue, 23 Feb 2016 10:04:37 +1100
-Subject: [PATCH 156/423] Aux SPI 1&2 implementation
+Subject: [PATCH] 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
index 92919b2f4f7ab89e31b69d84d822f71b63961bae..953b0f2f17d2ac74a52a9ca1fc675c81f46b49f0 100644 (file)
@@ -1,8 +1,7 @@
-From 5590ca50d54491e5fc3f273f03198a1b08fd88cc Mon Sep 17 00:00:00 2001
+From 8369af719005849271d4c50a87dc6422b83dc276 Mon Sep 17 00:00:00 2001
 From: Matthias Reichl <hias@horus.com>
 Date: Tue, 23 Feb 2016 17:28:23 +0100
-Subject: [PATCH 157/423] ASoC: bcm: add missing .owner fields in sound card
- drivers
+Subject: [PATCH] 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
 and one can remove the card driver module while it's in use (eg playback
index bd052f24e1a5a2bd5b38fb2c996822280d0fc2f4..b94313ca838e087225012d230574deffccc88fce 100644 (file)
@@ -1,8 +1,8 @@
-From 10a0c1a532cb7800e2eb56ac6e38dedbaf262ce5 Mon Sep 17 00:00:00 2001
+From 3bd2928682ee70f260d9c62a17d1a5e43f979fec Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Wed, 20 Jan 2016 17:50:09 +0000
-Subject: [PATCH 158/423] smsx95xx: Add option to disable the crimes against
truesize fix
+Subject: [PATCH] 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
 See issue 1248.
index d78cabe1d809ca7d07c9257b224544b5f987ba3e..e0bcd93426ab38898899234cfd20d7799629e91f 100644 (file)
@@ -1,7 +1,7 @@
-From e08489bbbba7a911dc99495e152c4366ed646db8 Mon Sep 17 00:00:00 2001
+From fba2e30e3511cbc94249468490843723268a0c39 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 23 Feb 2016 19:56:04 +0000
-Subject: [PATCH 159/423] bcm2835-virtgpio: Virtual GPIO driver
+Subject: [PATCH] bcm2835-virtgpio: Virtual GPIO driver
 
 Add a virtual GPIO driver that uses the firmware mailbox interface to
 request that the VPU toggles LEDs.
index ec015cd23ac40beea4497dfd476a92caa5fd65f9..04c5e0969eb5653ee1b1234198107573f08315e2 100644 (file)
@@ -1,7 +1,7 @@
-From 5985096850e6608704489e7c7936d885fb3a3507 Mon Sep 17 00:00:00 2001
+From d5ed78c5a2305b7952f4e86f4de4c68630875264 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 21 Jan 2016 17:57:49 +0000
-Subject: [PATCH 160/423] BCM270X_DT: Add Pi3 support
+Subject: [PATCH] BCM270X_DT: Add Pi3 support
 
 ---
  arch/arm/boot/dts/Makefile            |   1 +
index ccadd82ea1972a5010810add6f278820f50aa2ce..145c6e705c7e60fecb06dfdcb89a4455354e9519 100644 (file)
@@ -1,7 +1,7 @@
-From f2f877b174c8dc15f77cbaea553edf21c74d525c Mon Sep 17 00:00:00 2001
+From ff7f4e8e8f46f1132b1013cf1799abb7dde687cb 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 161/423] DT: Add overlays to configure I2C pins
+Subject: [PATCH] DT: Add overlays to configure I2C pins
 
 Lifted from
 https://www.raspberrypi.org/forums/viewtopic.php?f=107&t=120938&p=825883
index 8753693d5180da5075851793761e43cd7038105d..04616bf6ea37ea7438f25854034aa29f2b905ff9 100644 (file)
@@ -1,8 +1,7 @@
-From c2132fecb5584da2653ce99ebbfb382673489e94 Mon Sep 17 00:00:00 2001
+From 185f82a6c86933b1df3ba8ec99f82fbcdd77d396 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 162/423] bcm2835-camera: fix a bug in computation of frame
- timestamp
+Subject: [PATCH] bcm2835-camera: fix a bug in computation of frame timestamp
 
 Fixes #1318
 ---
index 7ac4ca8fb17199de0a9fa7531773516abf9fee14..d2c554c5bc3e31bf2cafa1316e9c153f3868237e 100644 (file)
@@ -1,7 +1,7 @@
-From a8b3a8c0c610b29be2d685548a1b21269b651b33 Mon Sep 17 00:00:00 2001
+From f74038a8afbdbb109f831befeb53ce2b641a8805 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 2 Mar 2016 10:59:05 +0000
-Subject: [PATCH 163/423] BCM270X_DT: Add pi3-disable-bt overlay
+Subject: [PATCH] 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:
index 3cad9ca52952d76f5e5edb38fa1510335d91ba51..27d7390007ef00994846bb5f654d4c03c6a8568f 100644 (file)
@@ -1,7 +1,7 @@
-From 8a2725220ebcc2207c979e2c816a911aa20fa3f3 Mon Sep 17 00:00:00 2001
+From 3a7f5db20ed4d685ce8b5336f859d547bdd98a85 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 7 Mar 2016 09:53:03 +0000
-Subject: [PATCH 164/423] BCM270X_DT: Add pi3-miniuart-bt DT overlay
+Subject: [PATCH] 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
index d1b6ce72d07a434836809dac31d47a18face1b78..ecccb2a17db09147d42b6aecdb3b5190ea523ace 100644 (file)
@@ -1,7 +1,7 @@
-From bcd71e5dd7b7f9ad1a5b7b77edc3350feede7bfb Mon Sep 17 00:00:00 2001
+From a241da2b069599afab9ee1259855d3c2e509894d Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 7 Mar 2016 13:38:39 +0000
-Subject: [PATCH 165/423] Pi3 DT: Add dtparams for the SD interface
+Subject: [PATCH] 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.
index e6b704a01e41704f833b91d50dd82300d14e970f..d29386233592e86d15e8b76d0b19f8ceb71dfb1e 100644 (file)
@@ -1,7 +1,7 @@
-From 0b72e9bbaf15534b6437d6377a20870125bfcb06 Mon Sep 17 00:00:00 2001
+From 37f28c9626c8217166a1096e1d6432fca73a0849 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 7 Mar 2016 15:05:11 +0000
-Subject: [PATCH 166/423] vchiq_arm: Tweak the logging output
+Subject: [PATCH] vchiq_arm: Tweak the logging output
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 8cc918b4a9d4061ecd64af507d55bd3d33c1cfa3..c487d6629228ed7bf628a8d95799f22f1f5dd06a 100644 (file)
@@ -1,7 +1,7 @@
-From 71804345eb4c8408fb50b0f15b750915776a20ad Mon Sep 17 00:00:00 2001
+From 5f0af4369aeb791f481e05447e1d4d05579367cd Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 7 Mar 2016 16:46:39 +0000
-Subject: [PATCH 167/423] bcm2835-sdhost: Only claim one DMA channel
+Subject: [PATCH] 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
index 4444c54a8e8d7fdf811e6cfb349b109b5a3c26b0..8d7852136035b5056378bd4cf94a0e446e826fa2 100644 (file)
@@ -1,7 +1,7 @@
-From c9c0bca2cf5a88e1bbfe1c0ebfc190e3f9c80bef Mon Sep 17 00:00:00 2001
+From fba9024580be3eed90cce59f776fc27e6ca8fbc9 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 8 Mar 2016 09:49:16 +0000
-Subject: [PATCH 168/423] bcm2835-mmc: Only claim one DMA channel
+Subject: [PATCH] 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
index 2a40041c0fc2b93ffdddb90a5ad81cb9f23acd09..186667ab46026ef58e8dc47441f52fbe7d2f803a 100644 (file)
@@ -1,7 +1,7 @@
-From 3ca8b2725059ac5f0255f6304777af2b3f6d8d38 Mon Sep 17 00:00:00 2001
+From fe221477aa6c78391646e226c029a56e34595873 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 8 Mar 2016 17:08:39 +0000
-Subject: [PATCH 169/423] config: rebuild with savedefconfig
+Subject: [PATCH] config: rebuild with savedefconfig
 
 ---
  arch/arm/configs/bcm2709_defconfig | 3 +--
index 938362a1682b7a4afa8c0abbb4c9078b37d03ee9..b1806928e107df576a65756e15ddcbeee34fccf0 100644 (file)
@@ -1,7 +1,7 @@
-From 3ff0e5914f2868ff8fdbb42247e96726296bea5d Mon Sep 17 00:00:00 2001
+From 8ceec2dfed10944e299b4114d756dbe494baaaec Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 8 Mar 2016 17:06:33 +0000
-Subject: [PATCH 170/423] config: Add module for mcp3422 ADC
+Subject: [PATCH] config: Add module for mcp3422 ADC
 
 ---
  arch/arm/configs/bcm2709_defconfig | 1 +
index e81681981cb6b4c061147f376f21105fefb201d7..94f24ea24b4cd68fb0d27eb16794daced3d7771a 100644 (file)
@@ -1,7 +1,7 @@
-From 89946d941588d63fb3a84c039acb154a4441e3f0 Mon Sep 17 00:00:00 2001
+From e1fd7a9ccd89e291334d4a9d6b7d1f3040d7aad0 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 8 Mar 2016 16:18:57 +0000
-Subject: [PATCH 171/423] Pi3 DT: Add pull-ups on the UART RX lines
+Subject: [PATCH] Pi3 DT: Add pull-ups on the UART RX lines
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index e783f33f3c7c73ec9ce9a45d7c8103c8e22b5fa8..f6d1fc96f9d9d86bdef7260e987c81c6df87f3cd 100644 (file)
@@ -1,7 +1,7 @@
-From 7a33a72a9f2fd1091cd8b5f38bd9468c3fdbfdb9 Mon Sep 17 00:00:00 2001
+From 94ffee1a2cbfa8016ca9e4782342618bf88a14c7 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 9 Mar 2016 21:28:52 +0000
-Subject: [PATCH 173/423] BCM270X_DT: rpi-display overlay - add swapxy param
+Subject: [PATCH] BCM270X_DT: rpi-display overlay - add swapxy param
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 11972b6030f1b8e9017bed1ab8fc4800183a4154..f064c03a2f6289f425066fa1bd8f4ef3859d72eb 100644 (file)
@@ -1,7 +1,7 @@
-From aa4e7d0b5d49c77ace418c07ba301fafb53c38ef Mon Sep 17 00:00:00 2001
+From 1bdb6cc0903dce08e168a6d23ba6675202c3dd0f 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 174/423] Remove I2S config from bt_pins.
+Subject: [PATCH] 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.
index 3f1f955f958e103b8f787879a3f9c5ccd686a352..50e54786e61462f47fff8036731575a774069b71 100644 (file)
@@ -1,7 +1,7 @@
-From 769fa207da8b9cf5e87f67fc7a1d4644257e29da Mon Sep 17 00:00:00 2001
+From f8a8a35b960f948c60c9d0a4b544366c9154d5a0 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 10 Aug 2015 09:44:59 +0100
-Subject: [PATCH 175/423] Revert "scripts/dtc: Add overlay support"
+Subject: [PATCH] Revert "scripts/dtc: Add overlay support"
 
 This reverts commit fa6d1755c2fdd9451077d8248e3804f0619f19b9.
 ---
index 2c5f00465ef899869004992b7d5584fe11fbfc1d..82a744363a8a5b7a930d3909a6944da87271d4f6 100644 (file)
@@ -1,7 +1,7 @@
-From 58d2939986c3db3d57cad899a758cf5e325072c5 Mon Sep 17 00:00:00 2001
+From c128c19379082f13558d4b51ae7d15a209bd9918 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 10 Aug 2015 09:49:15 +0100
-Subject: [PATCH 176/423] scripts/dtc: Update to upstream version 1.4.1
+Subject: [PATCH] scripts/dtc: Update to upstream version 1.4.1
 
 Includes the new localfixups format.
 
index d80a7f36f7275bf247b39da85925418fe7403f10..03d68146e3f9d0b43e441c874abc20ae6b0819f3 100644 (file)
@@ -1,7 +1,7 @@
-From 4105c60fc35515eb614e54b5ca51e2da2f6e78e7 Mon Sep 17 00:00:00 2001
+From 14ea3d6ac7fea0e515bbde859379b0a43b6d67b9 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 177/423] configfs: implement binary attributes
+Subject: [PATCH] configfs: implement binary attributes
 
 ConfigFS lacked binary attributes up until now. This patch
 introduces support for binary attributes in a somewhat similar
index d4ee94c490f154e05935371e3121a9ca50896bab..4dae3cfa755b482b168cd56a8a1e788d4f42cbb3 100644 (file)
@@ -1,7 +1,7 @@
-From 4f9177551b224eb3cf97bbe797a2909bb6ab2998 Mon Sep 17 00:00:00 2001
+From 9745f13ee715e7f47ac11a31d0f75b9661b63344 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 178/423] OF: DT-Overlay configfs interface
+Subject: [PATCH] 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.
index d450c09748983df63450b66ea95edd5c53038874..39f260cd45ad61c0a3ff117f33053e32b26e88e3 100644 (file)
@@ -1,8 +1,7 @@
-From b20701a18267d97ae47407f713bda22e2b647bc1 Mon Sep 17 00:00:00 2001
+From 984c98b47f9ffd5f57599e604df2cc09c63f74ba Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 13 Mar 2015 12:43:36 +0000
-Subject: [PATCH 179/423] Protect __release_resource against resources without
- parents
+Subject: [PATCH] Protect __release_resource against resources without parents
 
 Without this patch, removing a device tree overlay can crash here.
 
index 816edda380ebea1885dbb50af581e3448a70f527..45de5b83e8baee886d9b9938ac6053d5ade830f1 100644 (file)
@@ -1,7 +1,7 @@
-From 931d7ab56b2798d9b72ef2308d981d824335b7de Mon Sep 17 00:00:00 2001
+From 95aee427e91922408870627e6e3d66f975791336 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 13 Mar 2015 20:00:21 +0000
-Subject: [PATCH 180/423] BCM270X_DT: Add a .dtbo target, use for overlays
+Subject: [PATCH] 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
index 1dc828359261f1bb1b1d5150b14378dcfebe1069..e793f1a08ffc747094b0cd420541a3513fba961b 100644 (file)
@@ -1,7 +1,7 @@
-From 97ce4cd9a2b9c596c382c4af688518eaf6a5a84b Mon Sep 17 00:00:00 2001
+From 5f1a77a98df6352d585a906a61166062cb43c14b Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 29 May 2015 11:18:58 +0100
-Subject: [PATCH 181/423] scripts/knlinfo: Decode DDTK atom
+Subject: [PATCH] scripts/knlinfo: Decode DDTK atom
 
 Show the DDTK atom as being a boolean.
 
index a1ced936100a4df954397ba4da9cf4c798ded2d7..418a8d77e928507d0bfe98653f44bda30d33cfa3 100644 (file)
@@ -1,7 +1,7 @@
-From b6d96f1dc239d7b7e71aa658156c893e46e6a2bf Mon Sep 17 00:00:00 2001
+From 6d4c8ab1f16bc536dd5d858341e1c0d0b67d930b Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 29 May 2015 11:48:59 +0100
-Subject: [PATCH 182/423] Enable Dynamic Device Tree for bcmrpi_defconfig and
+Subject: [PATCH] Enable Dynamic Device Tree for bcmrpi_defconfig and
  bcm2709_defconfig
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
index 1a2e0c6d42500cc219991a3a3d263b0d529a28d5..0100df7a1b5a981de83a25ed1b3760dd29d523d7 100644 (file)
@@ -1,7 +1,7 @@
-From dbe624ecbe5f601297665da59ba6cfc11e8150d4 Mon Sep 17 00:00:00 2001
+From fbc9f06dc47543dbd6b7f2806f6535082eac3696 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Sun, 13 Mar 2016 16:14:44 +0000
-Subject: [PATCH 183/423] SQUASH: Add CONFIG_OF_CONFIGFS to bcmrpi_defconfig
+Subject: [PATCH] SQUASH: Add CONFIG_OF_CONFIGFS to bcmrpi_defconfig
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 501c0fc966088e9dc0403e9ffa499e31686c2927..68898477b57afe67625b030479cca3af3b7c08cc 100644 (file)
@@ -1,7 +1,7 @@
-From ac5048f5b6df22924f23952107e3810f999387bf Mon Sep 17 00:00:00 2001
+From 68bdbeeade267f4aff7a4eaf9a122baf306982f4 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 14 Mar 2016 16:56:54 +0000
-Subject: [PATCH 184/423] dts, kbuild: dtbs_install installs .dtbo files too
+Subject: [PATCH] dts, kbuild: dtbs_install installs .dtbo files too
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 9b68f5b70eef71a28d3d429b6ffbd11e6fad335e..76406471463ef7176418e89a8bc677eda3a09241 100644 (file)
@@ -1,7 +1,7 @@
-From 4f52f1f19ee9c54eb0022eeff03a380fca01384b Mon Sep 17 00:00:00 2001
+From a4a7cdd3364de9fa9edfb32a64fa0e7a577d9143 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 15 Mar 2016 14:10:29 +0000
-Subject: [PATCH 185/423] bcm2835-sdhost: Workaround for "slow" sectors
+Subject: [PATCH] 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
index 0355f09c03dc59183f41febe2e9029938795066f..d2277b960dae3b419db07e881bf379e5a94359b4 100644 (file)
@@ -1,7 +1,7 @@
-From 69b8da40b814a65b49a19058e906b26b44303fba Mon Sep 17 00:00:00 2001
+From bf6a2bb922c5ef6831d40eb934597733836080bf Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 15 Mar 2016 15:49:16 +0000
-Subject: [PATCH 186/423] BCM270X_DT: Add labels to spidev nodes
+Subject: [PATCH] BCM270X_DT: Add labels to spidev nodes
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 50d139fee945827ca11c325d0d86af4b0c455129..e1facfa72dac6cdab55e3e9cfe527eb00e100bc9 100644 (file)
@@ -1,7 +1,7 @@
-From 37d926b159b0cb6ebe80c24b9641e12b6fbd3dd5 Mon Sep 17 00:00:00 2001
+From 66c35d065749cfb8b128077cfc1a114674273bea Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 15 Mar 2016 16:27:26 +0000
-Subject: [PATCH 187/423] BCM270X_DT: Use spidev labels in overlays
+Subject: [PATCH] BCM270X_DT: Use spidev labels in overlays
 
 ---
  arch/arm/boot/dts/overlays/ads7846-overlay.dts     | 22 ++++++++++-------
index bdfd289e7d2707974c3d7ea4e37cb5c1f0ca4dd6..d74ce04a63dea5296b9630b4000f470e1d473fde 100644 (file)
@@ -1,7 +1,7 @@
-From 286f21ae694dd4e3798011d771f6833318f8371c Mon Sep 17 00:00:00 2001
+From 3b2ac4714efbc144e8df9fd939498313958eaac5 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 15 Mar 2016 16:41:37 +0000
-Subject: [PATCH 188/423] BCM270X_DT: Build and document the wittypi overlay
+Subject: [PATCH] BCM270X_DT: Build and document the wittypi overlay
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index a028ec78e8cb93979c53c5ac1a48fe27e0021223..cfa53d4ed89059047790d96ebde3f29a02e58fb0 100644 (file)
@@ -1,8 +1,7 @@
-From 65d8417f8d87161c1bc6b6b0bc43a32a89546ee4 Mon Sep 17 00:00:00 2001
+From c12c80f4a33ca959cb0a62c6284bbc27cdce0b48 Mon Sep 17 00:00:00 2001
 From: Matthias Reichl <hias@horus.com>
 Date: Tue, 15 Mar 2016 21:13:39 +0100
-Subject: [PATCH 189/423] scripts/dtc: Fix UMR causing corrupt dtbo overlay
- files
+Subject: [PATCH] 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
index 9e3f2fe9799a93ac3c9a4f836e5c93ec3da4b39b..b70754852534d1138ee91e13807ae813ad81f5cb 100644 (file)
@@ -1,7 +1,7 @@
-From 0913a8d9a13e327cd592970da2555c32963a90e7 Mon Sep 17 00:00:00 2001
+From 64b838bcfcd490561e919bd569da8ab3afb83f83 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 16 Mar 2016 08:35:06 +0000
-Subject: [PATCH 190/423] BCM270X_DT: Add dtparam for uart1
+Subject: [PATCH] BCM270X_DT: Add dtparam for uart1
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index d7ca6acdfddfc8589d779ffa3aef064fe1b79e63..0e0583e6661bf66e05442d855a14bd53545a512b 100644 (file)
@@ -1,7 +1,7 @@
-From 664a65f96f3a1afdacf3697460fb57e3a34080fb Mon Sep 17 00:00:00 2001
+From a81b12982d9624ad84d05996233239bb7e213f70 Mon Sep 17 00:00:00 2001
 From: Przemek Rudy <prudy1@o2.pl>
 Date: Fri, 11 Mar 2016 22:41:26 +0100
-Subject: [PATCH 191/423] dwc-overlay: Use label so overrides can apply.
+Subject: [PATCH] dwc-overlay: Use label so overrides can apply.
 
 ---
  arch/arm/boot/dts/overlays/dwc2-overlay.dts | 10 +++++-----
index 7b57c64f7e89c5a969edfb38aac84af9bd903f27..2a0ffc5d8e0ed770b25f41c52b940476e1ab81aa 100644 (file)
@@ -1,8 +1,7 @@
-From 52a53c8b62c8e5500ffa6131ed367c0271c05679 Mon Sep 17 00:00:00 2001
+From 2bcb714370ae69fe808d7e2061927c2ea1753ff7 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 22 Jan 2016 13:06:39 -0800
-Subject: [PATCH 192/423] drm/vc4: Add a debugfs node for tracking execution
- state.
+Subject: [PATCH] drm/vc4: Add a debugfs node for tracking execution state.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index f3db1bde1c38de4247bcf88edf2063887fe5e5e0..da107905fecf3ef723efd11c033279b24291ea25 100644 (file)
@@ -1,8 +1,7 @@
-From aa0275b3a1823ea863d2f9f2635cc6ca446adb92 Mon Sep 17 00:00:00 2001
+From e8da5a4c9dfbb65205cc9e4d448af3e8965af88d Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 25 Jan 2016 13:03:33 -0800
-Subject: [PATCH 193/423] drm/vc4: Include vc4_drm.h in uapi in downstream
- build.
+Subject: [PATCH] drm/vc4: Include vc4_drm.h in uapi in downstream build.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 7e76e2b184b97b6c617cfef3b2837106524e5618..f53dcecbd618dbf24a3222ac7a2ead7e6d9d0ed6 100644 (file)
@@ -1,7 +1,7 @@
-From 5528526faa0302e28b284590f761d43d66e85632 Mon Sep 17 00:00:00 2001
+From baf132f97c5fa25c0dcec59369e225e759ab22e6 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 25 Jan 2016 13:05:00 -0800
-Subject: [PATCH 194/423] drm/vc4: Validate that WAIT_BO padding is cleared.
+Subject: [PATCH] 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.
index 06b501291f4c0c61d010b7f8ab494aa4efb6d320..a1a3d6be1e3819c40f4a057573362e8d70da61f3 100644 (file)
@@ -1,8 +1,7 @@
-From 68cbe5055b8b2d1b96fd6b5009f16064783e6b00 Mon Sep 17 00:00:00 2001
+From 339e2ea50b25fe0183161cee31f640e691f2a1c0 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 25 Jan 2016 13:52:41 -0800
-Subject: [PATCH 195/423] drm/vc4: Fix the clear color for the first tile
- rendered.
+Subject: [PATCH] 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
index 1ef827b9c90eb60f9726b913933585c79a1f6bda..f9daa878d206cb7982312ab6e650c3480f7a3678 100644 (file)
@@ -1,8 +1,7 @@
-From 8833c229e00291163a2464d82d0d7902e24466ca Mon Sep 17 00:00:00 2001
+From 96cfc336eb33c0152c4aff462bd6a21cd75cc731 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 25 Jan 2016 14:13:12 -0800
-Subject: [PATCH 196/423] drm/vc4: Return an ERR_PTR from BO creation instead
- of NULL.
+Subject: [PATCH] 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.
index c1129516b1f7d1b795fc36f10506491c8686273e..0d185a63e63247ea4bf64cf5b40bd75f287ed989 100644 (file)
@@ -1,7 +1,7 @@
-From a60ba3cce2f5fb3bb34443d4b5ba8cbf135e6163 Mon Sep 17 00:00:00 2001
+From 0304e9381edf30280122d981e5a1b8dedc4c003f Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 25 Jan 2016 14:32:41 -0800
-Subject: [PATCH 197/423] drm/vc4: Fix -ERESTARTSYS error return from BO waits.
+Subject: [PATCH] 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
index f61a459e82f6081f7da120c2b144fbc0b91ebc31..c0ec5260c1cea55e4bb1953f7b4085b6b75fb1e0 100644 (file)
@@ -1,7 +1,7 @@
-From e3ff132f57aa1837e2ec8deff44c263157962bb6 Mon Sep 17 00:00:00 2001
+From d12dd7a58fcc585b75fae60ab230a51b2ac9a6cb Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 25 Jan 2016 14:33:50 -0800
-Subject: [PATCH 198/423] drm/vc4: Drop error message on seqno wait timeouts.
+Subject: [PATCH] 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
index 24ea18ccbbfb686d03c0e7d9d637234c5f48ed33..9e0044673d9fe33ff816d70bb9488d3415d99518 100644 (file)
@@ -1,7 +1,7 @@
-From e1b1b8a6f9dbdcf019b8975d5ced5a0393b23dd3 Mon Sep 17 00:00:00 2001
+From 895c93a3efd6653df6bbabc12c2e0205be5560dd Mon Sep 17 00:00:00 2001
 From: campag <dave-lowe@ntlworld.com>
 Date: Wed, 24 Feb 2016 16:45:42 +0000
-Subject: [PATCH 199/423] BCM270X_DT: Add 1-bit SDIO using minimal pins...
+Subject: [PATCH] BCM270X_DT: Add 1-bit SDIO using minimal pins...
 
 ... for that mode: GPIOs 22-25.
 ---
index 51e58851a1bced465d4684d80f8cdd3dada97ad4..56e6b506b4e4fd4e66f347da2526fbc64fee1cec 100644 (file)
@@ -1,7 +1,7 @@
-From 51405bd458e0e16e1b1a912e6361c83633567de1 Mon Sep 17 00:00:00 2001
+From 52ca91f1e28a45f4584432525b149f32a0048dd0 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 201/423] Add overlay and enable support for QCA7000 board
+Subject: [PATCH] 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.
index a5049d8bd8efb9bf34d7d0b645dfc9f99c57fa84..e917d443e2e17616e0885fc27900594a77076de0 100644 (file)
@@ -1,7 +1,7 @@
-From 91796069d412600985585cbb8d72cb5dbf7d9a2e Mon Sep 17 00:00:00 2001
+From baaee4dd48573d8de4e22d812717c6863ba4b7e6 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 9 Mar 2016 13:28:24 +0000
-Subject: [PATCH 202/423] serial: Take care starting a hung-up tty's port
+Subject: [PATCH] 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),
index feef4ca3e4ce2601c87f0b08c93d7ba70cb11af2..340be02969322a9b5bf1d59c396f7651401849bf 100644 (file)
@@ -1,7 +1,7 @@
-From c920022cc697e98b64bc9af5fc64ca0f2c802ccd Mon Sep 17 00:00:00 2001
+From f763209fb1c001b84b03ba86c72db7a7ae8fb441 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 17 Mar 2016 10:16:16 +0000
-Subject: [PATCH 203/423] pi3-miniuart-bt-overlay: Correct and clarify info
+Subject: [PATCH] pi3-miniuart-bt-overlay: Correct and clarify info
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 1aee8c51cdfead727c8280b20fab6a39a1ae9b0f..8921375b8344cc7915bdc567b5946787c003acb5 100644 (file)
@@ -1,7 +1,7 @@
-From 0ba5b23995c38e7c477647aaf84df0a0dc136b70 Mon Sep 17 00:00:00 2001
+From 45513400f0b487f9bbca90e823fa591ef741dad8 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 17 Mar 2016 10:41:56 +0000
-Subject: [PATCH 204/423] pwm overlays: Params must have in-overlay targets
+Subject: [PATCH] pwm overlays: Params must have in-overlay targets
 
 ---
  arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts | 9 ++++++++-
index eb3b1dea928357bd239e571d1e714ec58b6d9f8c..a328f35b7507089de985d5f246deae5263714c71 100644 (file)
@@ -1,7 +1,7 @@
-From ffb63fd81160a7ec5876a7e3f29b78b68e481bc7 Mon Sep 17 00:00:00 2001
+From 263f82e038a8ae204e6beaf2102ad9d91d5ca4ee Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 18 Mar 2016 13:06:29 +0000
-Subject: [PATCH 205/423] BCM270X_DT: Switch Compute Module to MMC
+Subject: [PATCH] BCM270X_DT: Switch Compute Module to MMC
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 934289225f03ea57d797bb9ab2fbb18235d45476..5c9edea13c87e125b40c04d7e8fe99557663a35b 100644 (file)
@@ -1,8 +1,7 @@
-From d309ffcbd73c0fb942d4f92b1a5089a40fe3855e Mon Sep 17 00:00:00 2001
+From c237ff4a1325ac94169ed1f5f9022f1358b79ac9 Mon Sep 17 00:00:00 2001
 From: P33M <P33M@github.com>
 Date: Fri, 18 Mar 2016 17:38:37 +0000
-Subject: [PATCH 206/423] dwc_otg: Don't free qh align buffers in atomic
- context
+Subject: [PATCH] dwc_otg: Don't free qh align buffers in atomic context
 
 ---
  drivers/usb/host/dwc_otg/dwc_otg_hcd_queue.c | 9 +++++++--
index 560b6b2f905458601766c6fff90611f612657a89..783efbae42a1f0819750e83c01ab33779ceaafb3 100644 (file)
@@ -1,8 +1,8 @@
-From 7db6ea3f5e135665bb4275d8b74bbe900d9aad7a Mon Sep 17 00:00:00 2001
+From 87dd923568a28a6784581a3f4c18970b834779a8 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Mon, 21 Mar 2016 15:38:38 +0000
-Subject: [PATCH 207/423] dwc_otg: Enable the hack for Split Interrupt
transactions by default
+Subject: [PATCH] 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.
index 78b540534b501e8d6c24e323bb1e5813360ea362..d4eb172f6cb9783ce2747539e8cecd496950d834 100644 (file)
@@ -1,7 +1,7 @@
-From 4416c9473baa7439421aba5b58bc55cfc23f0a15 Mon Sep 17 00:00:00 2001
+From 678f08c4c3fd62b5e3cd95cc9596733354b2ba19 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Sat, 19 Mar 2016 16:51:37 +0000
-Subject: [PATCH 208/423] BCM270X_DT: Remove explicit claiming of UART pins
+Subject: [PATCH] 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.
index 9376121bfb1794e6e68ea0f435fe864e1fc09d1b..663d9cc7b0ded0d680f672825b399abe26c8f32e 100644 (file)
@@ -1,7 +1,7 @@
-From 324d6d326ca794bf6d639b85c9745628b99b47c9 Mon Sep 17 00:00:00 2001
+From f05cfb491a1895d0975be326a9e7e061c6db2d5a 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 209/423] lirc_rpi: Lower IR reception error to debug
+Subject: [PATCH] lirc_rpi: Lower IR reception error to debug
 
 Lowers a IR reception error condition message to KERNEL_DEBUG
 ---
index 664d110becedf2becb5822a051119826999c3119..861f8853fc3d5d7e3ad94d5fed46ec515d2ab4e3 100644 (file)
@@ -1,7 +1,7 @@
-From 8a4ce18b5f3ca5570666284a3a0208534dd41c26 Mon Sep 17 00:00:00 2001
+From 39afc75832ce9cd81f09b035630dd30e325f1797 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 23 Mar 2016 14:16:25 +0000
-Subject: [PATCH 210/423] vchiq_arm: Access the dequeue_pending flag locked
+Subject: [PATCH] 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.
index 018cbf70c0221321f769f600856e5c91c14fa74e..9a9ec8108efc7ae8bbbb98778fa420a4c537fa43 100644 (file)
@@ -1,7 +1,7 @@
-From 47e82ea7d35926f12bd642e1ad2727b9a128536a Mon Sep 17 00:00:00 2001
+From 48ba5a6ae0158827e416d8b8cd21680672737b79 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 23 Mar 2016 15:57:14 +0000
-Subject: [PATCH 211/423] BCM270X_DT: Add pi3-act-led overlay
+Subject: [PATCH] BCM270X_DT: Add pi3-act-led overlay
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 134abc8cce73dea2b5fdc3e28513d012d7cb0e7b..533a3a295de41a3a318b9a2529f39adf1247bdd6 100644 (file)
@@ -1,7 +1,7 @@
-From 81e1683aced46435585f3a0a81e47f9bc7609abf Mon Sep 17 00:00:00 2001
+From 827e46013755254e526f0b682495ee88066a05a3 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 23 Mar 2016 20:53:47 +0000
-Subject: [PATCH 212/423] vchiq_arm: Service callbacks must not fail
+Subject: [PATCH] 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
index 3ad04108e566bd85d33d8dec1efa3642ad908c97..d7bb6a215b2f0c105028f5be5a6d5f1f3c626f5e 100644 (file)
@@ -1,7 +1,7 @@
-From 9a4c1bb2dd7727a0592ec0456b6763bd9d12bf2b Mon Sep 17 00:00:00 2001
+From 07207eccca9d4439d69e56fb5df378ac669087bf 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 213/423] Add configs and overlay for PCA9548 I2C mux
+Subject: [PATCH] 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.
index 853311762ed4a4c0dff596c590a77c9a2af077b9..3155ccea7cb420cbffd8001069b2e4bc3761dd38 100644 (file)
@@ -1,7 +1,7 @@
-From 1523d333d0f5df470b0c0beedc9aa0b5a26e03aa Mon Sep 17 00:00:00 2001
+From d491a6a5acfeacccf0a24171babc0d5cf80a91da Mon Sep 17 00:00:00 2001
 From: Nicolas Boullis <nboullis@debian.org>
 Date: Wed, 23 Mar 2016 23:40:15 +0100
-Subject: [PATCH 214/423] BCM270X_DT: Add DS1339 to i2c-rtc overlay
+Subject: [PATCH] BCM270X_DT: Add DS1339 to i2c-rtc overlay
 
 ---
  arch/arm/boot/dts/overlays/README              | 4 ++++
index 3859d090a1216bb0538b876f30dc1937ea5c6d5d..0203f96ab6071c17f18474e47a5aa467c4990c52 100644 (file)
@@ -1,7 +1,7 @@
-From b6d043f90d9f788b1aae010f76884c62c646c9bf Mon Sep 17 00:00:00 2001
+From 2f3fc168789eb4952a99e19c046867516fc522f7 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 29 Mar 2016 15:32:30 +0100
-Subject: [PATCH 215/423] copy_from_user: CPU_SW_DOMAIN_PAN compatibility
+Subject: [PATCH] copy_from_user: CPU_SW_DOMAIN_PAN compatibility
 
 The downstream copy_from_user acceleration must also play nice with
 CONFIG_CPU_SW_DOMAIN_PAN.
index 09d6647f1e83e3063b546a1e2160f4f7502fcb0c..4717b20aeb317460b84f9669d435cfcaa530db09 100644 (file)
@@ -1,7 +1,7 @@
-From 3410a0f56bdd85a526ce87eebb1b14b9f7b28f87 Mon Sep 17 00:00:00 2001
+From f48a0653d0d30576b57061c30e3907e3363b6107 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 30 Mar 2016 16:33:09 +0100
-Subject: [PATCH 216/423] bcm2835-sdhost: Adjust to core clock changes
+Subject: [PATCH] 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
index 79f686490f84dc652b6f588ef1bb4d12240e8399..b30040f86ca384a86f396100fc1ec61bdc1a4879 100644 (file)
@@ -1,7 +1,7 @@
-From cef80f622db0010b80505bb5ffe200918e1c5cdb Mon Sep 17 00:00:00 2001
+From b80428cf646d37e5b84103807a7259f8dccfe4d0 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 30 Mar 2016 17:07:15 +0100
-Subject: [PATCH 217/423] BCM270X_DT: Document hazards of sdhost overlay
+Subject: [PATCH] BCM270X_DT: Document hazards of sdhost overlay
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 030485b328b3a439fd3eb128d2f2966f026b6364..1997e325533d7e9c46ee3c86931dd4767ca4d798 100644 (file)
@@ -1,7 +1,7 @@
-From 282da1ae4ebaa2fbc33b6dc96f4d483c43715a51 Mon Sep 17 00:00:00 2001
+From 6a91406ee4a03844ef1dd7b9db4f4d52eee9047d Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 30 Mar 2016 17:23:15 +0100
-Subject: [PATCH 218/423] cpufreq: Temporarily ignore io_is_busy=1
+Subject: [PATCH] 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
index 98e9e6e29e50f21f4f7224e4398154a4e1e2412b..3cdd24e2d31596403fc857c95ca597273f6d3b5d 100644 (file)
@@ -1,7 +1,7 @@
-From 80f0513490df97cbc5cea73c6047fd80388467c3 Mon Sep 17 00:00:00 2001
+From 29e93302df7295b89c3819c304ce25d7830bd857 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 30 Mar 2016 20:18:38 +0100
-Subject: [PATCH 219/423] Revert "cpufreq: Temporarily ignore io_is_busy=1"
+Subject: [PATCH] Revert "cpufreq: Temporarily ignore io_is_busy=1"
 
 This reverts commit 2af1218a8a0220fec526f64d03977b8451afb4c8.
 ---
index 6a19b8e219763fd875360e57272f9f15178a6bd0..38f86fd9b7578c85a1ba7ea30ab2f13db69475af 100644 (file)
@@ -1,7 +1,7 @@
-From 5383498b7d0c4976b35d0a1dfaa0e71f20541440 Mon Sep 17 00:00:00 2001
+From cb795ee030d3ed4b792e795e545b81c00254df25 Mon Sep 17 00:00:00 2001
 From: Daniel Borkmann <daniel@iogearbox.net>
 Date: Thu, 7 Jan 2016 15:50:22 +0100
-Subject: [PATCH 220/423] net, sched: add skb_at_tc_ingress helper
+Subject: [PATCH] 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.
diff --git a/target/linux/brcm2708/patches-4.4/0221-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch b/target/linux/brcm2708/patches-4.4/0221-bpf-add-skb_postpush_rcsum-and-fix-dev_forward_skb-o.patch
deleted file mode 100644 (file)
index ee8548f..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-From 367956e87b62ae1f015ccbff58c7920a2e7a3511 Mon Sep 17 00:00:00 2001
-From: Daniel Borkmann <daniel@iogearbox.net>
-Date: Thu, 7 Jan 2016 15:50:23 +0100
-Subject: [PATCH 221/423] 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>
----
- net/core/filter.c | 17 +++++++++++++----
- 1 file changed, 13 insertions(+), 4 deletions(-)
-
---- a/net/core/filter.c
-+++ b/net/core/filter.c
-@@ -1291,8 +1291,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);
index 2b8813491cff88ecd078326106e0a1ec111d0ca7..9863595bc0f2adab3b479f4839e3b56ff2259858 100644 (file)
@@ -1,7 +1,7 @@
-From 5891d0fea3401ae4248fb98d6e70c9e6ffcf1aab Mon Sep 17 00:00:00 2001
+From 4a680ce7ef96ac561e02c1e02951a210092a2ef6 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 31 Mar 2016 15:44:53 +0100
-Subject: [PATCH 222/423] bcm2835-sdhost: Precalc divisors and overclocks
+Subject: [PATCH] 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,
index 87e438228558508bc428f01a896f4a5455732aae..108750191aa4e81ccee3f01851fdf425fcca8c77 100644 (file)
@@ -1,8 +1,7 @@
-From 4d85eac2b4821741269c9e49a0f3d0589291c83a Mon Sep 17 00:00:00 2001
+From 664ffae1f5e89a69f12f83717c2a7efccea008ca Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 4 Apr 2016 12:35:32 +0100
-Subject: [PATCH 223/423] Revert "bcm2835-sdhost: Precalc divisors and
- overclocks"
+Subject: [PATCH] Revert "bcm2835-sdhost: Precalc divisors and overclocks"
 
 This reverts commit 20260462773366a5734e5268dae0a4c179a21a2d.
 ---
index bf0b1e8b17b8c765433efd368d7029fba8d989ce..55d5c8987176e3a5d834ecd8cccbe57237df98b7 100644 (file)
@@ -1,7 +1,7 @@
-From 2f5c0928b44b0d34a975b4fb8165c26a134d7097 Mon Sep 17 00:00:00 2001
+From fe985856bc342027d498cfb5e261fef698ac336b Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 4 Apr 2016 12:35:51 +0100
-Subject: [PATCH 224/423] Revert "bcm2835-sdhost: Adjust to core clock changes"
+Subject: [PATCH] Revert "bcm2835-sdhost: Adjust to core clock changes"
 
 This reverts commit 4b89d07fd299a0f4e25321920cb74416ba2e638e.
 ---
index 27f070bc7b3f3d9fd213593f76c71a3b17269404..8d503b844c25ecb6807a8e359bd7d0996cf2320a 100644 (file)
@@ -1,7 +1,7 @@
-From 0b7ab0214a63a19c8c1a383b3ef89713c91e0251 Mon Sep 17 00:00:00 2001
+From 38575eb0b705f13b039b433687cf2a70cd8d425b Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 4 Apr 2016 16:03:18 +0100
-Subject: [PATCH 225/423] bcm2835-sdhost: Firmware manages the clock divisor
+Subject: [PATCH] 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
index 91d52ce337bd31be74681221d9bb1c8907a02eb5..c3bd751496c7a5a0affed28aa9be937142935c04 100644 (file)
@@ -1,8 +1,7 @@
-From 136379745690939706d830547ff754e770e832eb Mon Sep 17 00:00:00 2001
+From 086b24cf253a55acfaa185310fa19b7493ddbe3f Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Mon, 4 Apr 2016 19:52:27 +0100
-Subject: [PATCH 226/423] Revert "Revert "cpufreq: Temporarily ignore
- io_is_busy=1""
+Subject: [PATCH] Revert "Revert "cpufreq: Temporarily ignore io_is_busy=1""
 
 This reverts commit c353af0f83220068c10f6593b1767576b9b6cc18.
 ---
index 06f24e4c33f0f59940dea7ced54c00976be6ee1c..8dd8dfef56e5a8bb7e1f0d701aba88988c104190 100644 (file)
@@ -1,7 +1,7 @@
-From ad66c705ec0cd980297425e2d0541c68eedf1557 Mon Sep 17 00:00:00 2001
+From 2791d33cb965581363a616e116574b16cf279a5a Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Thu, 31 Mar 2016 16:49:52 +0100
-Subject: [PATCH 227/423] config: Enabled IPV6_SUBTREES
+Subject: [PATCH] config: Enabled IPV6_SUBTREES
 
 ---
  arch/arm/configs/bcm2709_defconfig | 1 +
index 622eaa927c5702d147e786071a61d76264ceed3d..7258c94d77821e3d8d903a6694347cc8b8dcc852 100644 (file)
@@ -1,7 +1,7 @@
-From fefd3cd13f39ac77c50b63abcb41dd01163e127a Mon Sep 17 00:00:00 2001
+From 8e367cd08419234412d2d9b430d2ebe7d528b931 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 228/423] add smsc95xx packetsize module_param
+Subject: [PATCH] add smsc95xx packetsize module_param
 
 Signed-off-by: Sam Nazarko <email@samnazarko.co.uk>
 ---
index 87296ac45fde278587ecab33e26057f8daa73fcf..278aa619d43d0917116d6fc25dc86932159147fb 100644 (file)
@@ -1,8 +1,8 @@
-From c927d6c160408b033223d7cf7795e2ec0faa78fa Mon Sep 17 00:00:00 2001
+From 9891143d60d8c653db23b6fafaa402fc1de12588 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 5 Apr 2016 19:40:12 +0100
-Subject: [PATCH 229/423] reboot: Use power off rather than busy spinning when
halt is requested
+Subject: [PATCH] reboot: Use power off rather than busy spinning when halt is
+ requested
 
 ---
  arch/arm/kernel/reboot.c | 6 +-----
index 0058a5b2e937c629b743414f0c4157fcf25613d1..c4f36e1fce5c495b6d3e8ed74924498a8e45c630 100644 (file)
@@ -1,8 +1,7 @@
-From dc09000595f912aec73956e6db7be266c434fd3e Mon Sep 17 00:00:00 2001
+From 8fa158cb700b0fdbb76ede07ec2103b5930e0913 Mon Sep 17 00:00:00 2001
 From: HiassofT <github@hias.horus.com>
 Date: Wed, 6 Apr 2016 21:45:01 +0200
-Subject: [PATCH 230/423] Revert "bcm2835-dma: Fix dreq not set for slave
- transfers"
+Subject: [PATCH] Revert "bcm2835-dma: Fix dreq not set for slave transfers"
 
 This reverts commit 8ad957e866a1fe1450f663f2b00a57d7de44904c.
 
index 2d2e07c966e5bda6dd510a9d523c763cc3ed02ab..f1c6433fdf522ac8d7368c25ee4fb42fd5e10892 100644 (file)
@@ -1,8 +1,8 @@
-From f736b53bdc910c364e8f2cd0f0c1bf1edf41f048 Mon Sep 17 00:00:00 2001
+From 2026557f3f9df2d0563f71b4bd704956c4cfd4ab Mon Sep 17 00:00:00 2001
 From: Dave Stevenson <6by9@users.noreply.github.com>
 Date: Fri, 1 Apr 2016 15:28:46 +0100
-Subject: [PATCH 231/423] RPi config: Add CONFIG_PWM_PCA9685 for NXP PCA9685
driver over I2C
+Subject: [PATCH] RPi config: Add CONFIG_PWM_PCA9685 for NXP PCA9685 driver
+ over I2C
 
 Includes DT overlay to configure it.
 
index b77fef193733ab783ac98dda05c90ee879a80525..a6630fdeac51c1312760461208251899b1c0cb63 100644 (file)
@@ -1,7 +1,7 @@
-From 3d7cb0d28c79c6418a3666803960881e21e5c974 Mon Sep 17 00:00:00 2001
+From 28cb7cf5480a77df08bba1e30e7070dff46463d7 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 8 Apr 2016 17:43:27 +0100
-Subject: [PATCH 232/423] BCM270X_DT: Don't generate "linux,phandle" props
+Subject: [PATCH] BCM270X_DT: Don't generate "linux,phandle" props
 
 The EPAPR standard says to use "phandle" properties to store phandles,
 rather than the deprecated "linux,phandle" version. By default, dtc
index 89198b28176cfec30b9f4dd9c8bd900ee61deb50..92a834a59b5c26cee11d4654f530bfaf214fab7a 100644 (file)
@@ -1,7 +1,7 @@
-From 901e004652b14261a036e259adac0a380bbb724b Mon Sep 17 00:00:00 2001
+From 35730c81cb94119c117901bbdcc148baf35aa37c Mon Sep 17 00:00:00 2001
 From: 6by9 <6by9@users.noreply.github.com>
 Date: Fri, 8 Apr 2016 18:15:43 +0100
-Subject: [PATCH 233/423] V4L2 driver updates (#1393)
+Subject: [PATCH] V4L2 driver updates (#1393)
 
 * BCM2835-V4L2: Correct ISO control and add V4L2_CID_ISO_SENSITIVITY_AUTO
 
index b15a89db7b839492a8cb1edb57bc8626332bfe27..a01d406dfa81cf9570b8a9098eb53f3359bb7d4f 100644 (file)
@@ -1,7 +1,7 @@
-From f900cc706eca16b68d335810173b253229109ec5 Mon Sep 17 00:00:00 2001
+From b61249080d5492fdb4bcf22e1672dc773a9bd95a Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 11 Apr 2016 12:50:58 +0100
-Subject: [PATCH 234/423] bcm2835-sdhost: Reset the clock in task context
+Subject: [PATCH] bcm2835-sdhost: Reset the clock in task context
 
 Since reprogramming the clock can now involve a round-trip to the
 firmware it must not be done at atomic context, and a tasklet
index 0db27e0d954325e1035dc488abe16e8383822db0..0b69ca32da34e6b66b5cdea7aa52f9eba1115aa3 100644 (file)
@@ -1,8 +1,8 @@
-From 9e67abb08bb66fcffa1540bc18b98beeda7d6285 Mon Sep 17 00:00:00 2001
+From 715ff3d10588ca8b2a72acbc918ba4849a1f988c Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Thu, 7 Apr 2016 12:44:24 +0100
-Subject: [PATCH 235/423] config: Enable CONFIG_IPV6_ROUTER_PREF for networks
with multiple routers
+Subject: [PATCH] config: Enable CONFIG_IPV6_ROUTER_PREF for networks with
+ multiple routers
 
 ---
  arch/arm/configs/bcm2709_defconfig | 1 +
index c66e4289be1a04c40708dbea637a27bdbe6db78e..9b3f2f65eda85af6614bd3060788a931df0ad0c5 100644 (file)
@@ -1,7 +1,7 @@
-From b7d3c1f41a346bccd4a8ec3f553a6f109677c37b Mon Sep 17 00:00:00 2001
+From 0561be97d8de22572d91d78c807b1bb4a38255f3 Mon Sep 17 00:00:00 2001
 From: jochenberger <fooberger@gmail.com>
 Date: Thu, 7 Apr 2016 21:38:46 +0200
-Subject: [PATCH 236/423] Enable hid-betopff module
+Subject: [PATCH] Enable hid-betopff module
 
 Add force feedback support for Betop based devices
 https://github.com/raspberrypi/linux/blob/rpi-4.1.y/drivers/hid/hid-betopff.c
index fb606a48e15ac2153815503d74a0df4de68cf10b..2bd1e96a8f26fc907aa63c4f1d8b1b3a0e5498e1 100644 (file)
@@ -1,8 +1,7 @@
-From 66e5546f065bd4c854e6ccfe192942a76137e80f Mon Sep 17 00:00:00 2001
+From 9efe69a81ab2f031cbfeccb2f606a241f155e6b5 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 12 Apr 2016 12:45:16 +0100
-Subject: [PATCH 237/423] config: Make IPV6 a module and regenerate with
- defconfig
+Subject: [PATCH] config: Make IPV6 a module and regenerate with defconfig
 
 ---
  arch/arm/configs/bcm2709_defconfig | 4 ++--
index 8d24a94fce6d652b63f1ae33d57e7e97657286c1..66d79857487c85762858ea4f2731a5857c501870 100644 (file)
@@ -1,7 +1,7 @@
-From 6db3147b0daf8b893eba23c305ec5e39354587d2 Mon Sep 17 00:00:00 2001
+From f88c6236440972207406742d87692859b4f15612 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 5 Apr 2016 13:01:54 +0100
-Subject: [PATCH 238/423] BCM270X_DT: Add dpi24 overlay
+Subject: [PATCH] BCM270X_DT: Add dpi24 overlay
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 33a15e99d511d9ba6b7690d1a631502e02a0e2ee..9d6927a878b6dcc477e444454364663bd5720e5b 100644 (file)
@@ -1,8 +1,8 @@
-From e26827db219f8221e20aba5e7f564d61b4fa2be3 Mon Sep 17 00:00:00 2001
+From 6e50eac8d374fa7d6ed3e02564851bc250443402 Mon Sep 17 00:00:00 2001
 From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
 Date: Thu, 14 Apr 2016 00:57:33 +0100
-Subject: [PATCH 239/423] Modify IQAudIO DAC+ ASoC driver to set card/dai
config from dt
+Subject: [PATCH] Modify IQAudIO DAC+ ASoC driver to set card/dai config from
+ dt
 
 Add the ability to set the card name, dai name and dai stream name, from
 dt config.
index 5560412571feec4e08fde45bdfccba8d75dd640c..a767d3ede1909351cbe693ca2b88f0aeb467c5ba 100644 (file)
@@ -1,8 +1,7 @@
-From 69211c7619dd7788d92c8e9c8e47de6a2ac66d76 Mon Sep 17 00:00:00 2001
+From 0a36540c6a3b383a554412bf65cc75d65f7b77f8 Mon Sep 17 00:00:00 2001
 From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
 Date: Thu, 14 Apr 2016 01:00:58 +0100
-Subject: [PATCH 240/423] Add support for the Digital Dreamtime Akkordion music
- player.
+Subject: [PATCH] Add support for the Digital Dreamtime Akkordion music player.
 
 Support the Digital Dreamtime Akkordion using the OEM IQAudIO DAC+ or
 DACZero modules. Set ALSA card name, ("Akkordion"), from dt config.
index c1c88f1d6b2074bd46f67b8a266c7b0688298309..e0f62c9135ebbc992ab220cab9db76f4905fe325 100644 (file)
@@ -1,7 +1,7 @@
-From acfc71e5a52a8c2389341052d9d4d3f2d807f962 Mon Sep 17 00:00:00 2001
+From 3120b4247e34e255f4f43d291df4b779b3e9d4c8 Mon Sep 17 00:00:00 2001
 From: Aaron Shaw <shawaj@gmail.com>
 Date: Thu, 7 Apr 2016 21:26:21 +0100
-Subject: [PATCH 241/423] Add Support for BoomBerry Audio boards
+Subject: [PATCH] Add Support for BoomBerry Audio boards
 
 ---
  arch/arm/boot/dts/overlays/Makefile                |   2 +
index d0a50ef866d1a528018380cfb2777bbb164f7e56..9974349c5c198041a73ae7937a6aeedc93914c7e 100644 (file)
@@ -1,7 +1,7 @@
-From 0046657bca51cfb61edcb38cef3039d304863a25 Mon Sep 17 00:00:00 2001
+From 215eb99b0a93a3365c7e3819b2701b416f88a25a Mon Sep 17 00:00:00 2001
 From: Aaron Shaw <shawaj@gmail.com>
 Date: Fri, 8 Apr 2016 00:06:00 +0100
-Subject: [PATCH 242/423] Add support for mcp7940x family of RTC
+Subject: [PATCH] Add support for mcp7940x family of RTC
 
 ---
  arch/arm/boot/dts/overlays/README              | 2 ++
index e66f0a4b0bd2fd044777730c037e0dc379226797..bfdc32924c56354d56e70fc0345f93f1e6dfccf4 100644 (file)
@@ -1,8 +1,8 @@
-From eecfe86df596a7b589040300fead9621aaaa24de Mon Sep 17 00:00:00 2001
+From ab1d490040fb4f7ea284feebb8a1e78bd6d54176 Mon Sep 17 00:00:00 2001
 From: Jeremy McDermond <nh6z@nh6z.net>
 Date: Thu, 14 Apr 2016 09:39:20 -0700
-Subject: [PATCH 243/423] bcm2709_defconfig:  Fix typo on BoomBerry
configuration directive
+Subject: [PATCH] bcm2709_defconfig:  Fix typo on BoomBerry configuration
+ directive
 
 The BoomBerry configuration directive in bcm2709_defconfig has a typo.
 ---
index a5ce314b401d1efcf4009fc7d624063030ef252c..f9cfb57261fb86c2750a536f922b04f72f925c67 100644 (file)
@@ -1,7 +1,7 @@
-From b2722225844f050026ed43446d67d26032af05ed Mon Sep 17 00:00:00 2001
+From 9d3c4c7019c68e5eb1c1635c8878f5c6bff3e120 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Fri, 15 Apr 2016 10:48:39 +0100
-Subject: [PATCH 244/423] boomberry-dac: Adjust for ALSA API change
+Subject: [PATCH] boomberry-dac: Adjust for ALSA API change
 
 As of 4.4, snd_soc_limit_volume now takes a struct snd_soc_card *
 rather than a struct snd_soc_codec *.
index b89b4c4ecdedf4a16e452e92fea4207d1c52dce7..e4ad3c4f8645467abef42a0647a7659118d77e24 100644 (file)
@@ -1,8 +1,7 @@
-From 9a9153d6a6e2c413ff568a9e26dd4711060c0732 Mon Sep 17 00:00:00 2001
+From 39aaeeb6912c97ede930b463c99b7848d1340a45 Mon Sep 17 00:00:00 2001
 From: Khem Raj <raj.khem@gmail.com>
 Date: Sun, 17 Apr 2016 04:44:47 -0700
-Subject: [PATCH 245/423] vmcs: Remove unused sm_cache_map_vector definition
- (#1411)
+Subject: [PATCH] vmcs: Remove unused sm_cache_map_vector definition (#1411)
 
 The code using it also ifdef'ed with 0, anyyd gcc 6
 complains
index eab548aebfb65ceae7a9a54e5c2060b04bd7c6fe..99bfb66594ba9bb998087c3d6af098f472d9a84b 100644 (file)
@@ -1,7 +1,7 @@
-From de215293c91853f39344b66ea18ca49b975f4783 Mon Sep 17 00:00:00 2001
+From 27c3944874a034975d23722b10d6d7e6b7dd930d Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 18 Apr 2016 11:56:53 +0100
-Subject: [PATCH 246/423] scripts/mkknlimg: Append a trailer for all input
+Subject: [PATCH] scripts/mkknlimg: Append a trailer for all input
 
 Now that the firmware assumes an unsigned kernel is DT-capable, it is
 helpful to be able to mark a kernel as being non-DT-capable.
index 14401e2f09f7d65e062ebb74c1b25a0e6719aa88..95ba5d653d332be78f7e8cf1fbf80ad981b57071 100644 (file)
@@ -1,7 +1,7 @@
-From 9f8cfdfbb0850aed63d1489469b36f53affa99aa Mon Sep 17 00:00:00 2001
+From bd462524b465fc6aeed292cca8c2da19be3d9887 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Tue, 19 Apr 2016 12:57:52 +0100
-Subject: [PATCH 247/423] bcm2835_thermal: Don't report unsupported trip type
+Subject: [PATCH] bcm2835_thermal: Don't report unsupported trip type
 
 ---
  drivers/thermal/bcm2835-thermal.c | 34 +---------------------------------
index 511763f7cff4fa16eec09e51d69f32305a40103c..a73bb234e7783a61e67bedfad150d60ba3b14ab6 100644 (file)
@@ -1,7 +1,7 @@
-From fffbc0bb693d462619402b4ca134c3d591e799bf Mon Sep 17 00:00:00 2001
+From e9e95f1830775a13ccd1a3746d7fa526ed2c722c Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 19 Apr 2016 13:55:29 +0100
-Subject: [PATCH 248/423] scripts/dtc: Only emit local fixups for overlays
+Subject: [PATCH] scripts/dtc: Only emit local fixups for overlays
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index 25b661768467bd3392fb2f0b4134fe08ffa95745..d50c80287e345dfa3db96595ba30db189b0c7d5b 100644 (file)
@@ -1,8 +1,7 @@
-From afad9ef007320f0cda5b97004d07a52e8387e912 Mon Sep 17 00:00:00 2001
+From 955fba9c62f43238b5c3687a78ed812ac95edd44 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Tue, 19 Apr 2016 16:08:35 +0200
-Subject: [PATCH 249/423] bcm2835: do not require substream for accessing chmap
- ctl
+Subject: [PATCH] bcm2835: do not require substream for accessing chmap ctl
 
 Fixes alsasctl store/restore operation.
 ---
index 9285411b4450010f48c75f4ea4e7e33f093f39f8..b498d00fb6423b2c228ae0da70ac9aa901b3970e 100644 (file)
@@ -1,8 +1,8 @@
-From 7c2791eb1e01c8714d5553bd2bd5e611394a6517 Mon Sep 17 00:00:00 2001
+From f3e1f2d9d34ab1cfafc4df7d67b7c65619b69ce0 Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Tue, 19 Apr 2016 16:29:41 +0200
-Subject: [PATCH 250/423] bcm2835: add fallback channel layouts if channel map
API is not used
+Subject: [PATCH] bcm2835: add fallback channel layouts if channel map API is
+ not used
 
 Should be more useful than just forcing stereo.
 
index 4b53f36012b9bf9ada27a74ec61c7d443a0c1f18..9f56fb03c5a236ff8db2332e1b6eb76801319e9e 100644 (file)
@@ -1,7 +1,7 @@
-From 317cae9751a3e08bbddaeb6099e05c7700884a30 Mon Sep 17 00:00:00 2001
+From 221eae6137f4ed70aa0c55decd7a0659391cd30b Mon Sep 17 00:00:00 2001
 From: wm4 <wm4@nowhere>
 Date: Tue, 19 Apr 2016 16:38:03 +0200
-Subject: [PATCH 251/423] bcm2835: log which channel map is set
+Subject: [PATCH] bcm2835: log which channel map is set
 
 ---
  sound/arm/bcm2835-vchiq.c | 5 +++++
index 47e3fe7b71c973781931100c230e08c024edd1b2..ae18b44d9441dcf64931ce211c4ab1234b093460 100644 (file)
@@ -1,8 +1,7 @@
-From a216a6ac7b7efad9d9d62ffa6be5fd1809953b6d Mon Sep 17 00:00:00 2001
+From 01993e1dda68d85ff6cf11cab6051bcefa46d2c1 Mon Sep 17 00:00:00 2001
 From: Remi Pommarel <repk@triplefau.lt>
 Date: Sun, 6 Dec 2015 17:22:46 +0100
-Subject: [PATCH 252/423] clk: bcm2835: add a round up ability to the clock
- divisor
+Subject: [PATCH] clk: bcm2835: add a round up ability to the clock divisor
 
 Make bcm2835_clock_choose_div to optionally round up the chosen MASH divisor
 so that the resulting average rate will not be higher than the requested one.
index a6078da960ce86b25209d685d5a55ac942e07e27..db53ad343e9f8f72752c4f378d3e461f86c5105a 100644 (file)
@@ -1,7 +1,7 @@
-From 29085f56d20e9c563b183a003f39f7cfc7884b17 Mon Sep 17 00:00:00 2001
+From c9de2447d4b9cf641276d74902405a0b5e1c2a8d Mon Sep 17 00:00:00 2001
 From: Remi Pommarel <repk@triplefau.lt>
 Date: Sun, 6 Dec 2015 17:22:47 +0100
-Subject: [PATCH 253/423] clk: bcm2835: Support for clock parent selection
+Subject: [PATCH] clk: bcm2835: Support for clock parent selection
 
 Some bcm2835 clocks used by hardware (like "PWM" or "H264") can have multiple
 parent clocks. These clocks divide the rate of a parent which can be selected by
index 6a6b0d82758c29d80cdab6615334e7f2a0679d73..5bf7066979161fc19c72e835cc65d3c81ae96ea7 100644 (file)
@@ -1,7 +1,7 @@
-From fc112f40c9d15990686e0481db5bb5ed23567299 Mon Sep 17 00:00:00 2001
+From cbf30c2377959725bfcccc8cbb5b98fe6af4aefb Mon Sep 17 00:00:00 2001
 From: Remi Pommarel <repk@triplefau.lt>
 Date: Sun, 6 Dec 2015 17:22:48 +0100
-Subject: [PATCH 254/423] clk: bcm2835: Add PWM clock support
+Subject: [PATCH] clk: bcm2835: Add PWM clock support
 
 Register the pwm clock for bcm2835.
 
index 8e570dee9447391cef7e6dd055be03c86ff62741..db44df7cf1195081d3229c4ce02a422e2133a2b9 100644 (file)
@@ -1,8 +1,7 @@
-From b1871ea5430a67f6476c666b70985924f27a88a0 Mon Sep 17 00:00:00 2001
+From f9855ea88630c3fdf6508db8775f34103f363f50 Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Tue, 22 Dec 2015 20:13:08 +0000
-Subject: [PATCH 255/423] clk: bcm2835: added missing clock register
- definitions
+Subject: [PATCH] clk: bcm2835: added missing clock register definitions
 
 Added missing CTRL and DIV clock register definitions for:
 PCM, SLIM, TCNT, TEC, TD0, TD1
index 3ecd5e36ff3207fd5a4720960ea6530a058e5093..1313aead1669f6b90a83172a998bfbd9a9f68bee 100644 (file)
@@ -1,8 +1,7 @@
-From 7182f4321e85d4911762f7dd2b38e6e1a7919073 Mon Sep 17 00:00:00 2001
+From 111293a9f0aa27bfdbb0ca864d9524691bb5934f Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 11:39:21 +0000
-Subject: [PATCH 256/423] clk: bcm2835: correctly enable fractional clock
- support
+Subject: [PATCH] clk: bcm2835: correctly enable fractional clock support
 
 The current driver calculates the clock divider with
 fractional support enabled.
index 30ef85aa63f3ec35eea1d85f5b9c149af1f40780..1c05e87ee5cfc043303ccf078e7eefc94f62505b 100644 (file)
@@ -1,7 +1,7 @@
-From 9da8191efd09a55914c0078ee23317cd79c48b15 Mon Sep 17 00:00:00 2001
+From 30ffff91447cd2d0dc6afd6ada53b13bc04f2f05 Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 11:39:22 +0000
-Subject: [PATCH 257/423] clk: bcm2835: clean up coding style issues
+Subject: [PATCH] clk: bcm2835: clean up coding style issues
 
 Fix all the checkpatch complaints for clk-bcm2835.c
 
index 764ed2bb586c8889ce5df0a974c4b14975b9fd2d..f1f118a2b33377b4d97780074707f5ac86999dc6 100644 (file)
@@ -1,7 +1,7 @@
-From f057d681e2af27bd013072cf8b46df927d4c03d1 Mon Sep 17 00:00:00 2001
+From 57390bceca1ef7df484290d3864b76a217c6b553 Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 14:20:15 +0000
-Subject: [PATCH 258/423] clk: bcm2835: expose raw clock-registers via debugfs
+Subject: [PATCH] clk: bcm2835: expose raw clock-registers via debugfs
 
 For debugging purposes under some circumstance
 it helps to be able to see the actual clock registers.
index fca8c89567e73381b04e1a32a75efb5c286447f3..acce39c069c7ef9e8a50f6edd872596faac4e416 100644 (file)
@@ -1,8 +1,7 @@
-From 6cf07099604e362169932d82444a0f234cc8cbe0 Mon Sep 17 00:00:00 2001
+From 061e3130a957f04af48ff703209096e8a0b5655e Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 12:51:41 +0000
-Subject: [PATCH 259/423] clk: bcm2835: remove use of BCM2835_CLOCK_COUNT in
- driver
+Subject: [PATCH] clk: bcm2835: remove use of BCM2835_CLOCK_COUNT in driver
 
 As the use of BCM2835_CLOCK_COUNT in
 include/dt-bindings/clock/bcm2835.h is frowned upon as
index 7705ab00e7cfc84bcadd8f0338d26d6f7e201fef..21513f0ec21c20a75f8a7a33c78b33940b217a96 100644 (file)
@@ -1,8 +1,7 @@
-From fd09548954d1301cce55d136aaeecd617d36b491 Mon Sep 17 00:00:00 2001
+From c0e6c2ae19400047ad0f744f95b6997b579e0ffc Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 12:51:42 +0000
-Subject: [PATCH 260/423] clk: bcm2835: reorganize bcm2835_clock_array
- assignment
+Subject: [PATCH] clk: bcm2835: reorganize bcm2835_clock_array assignment
 
 Reorganize bcm2835_clock_array so that there is no more
 need for separate bcm2835_*_data structures to be defined.
index 42481fdad58682c301b9695212de13fac12bd040..c14dcebc458b76938ab8f13543150d27a1d3a38e 100644 (file)
@@ -1,7 +1,7 @@
-From be05b91c313b122b4b1cb92bea7582b92eff3950 Mon Sep 17 00:00:00 2001
+From 5be1920e2cfc7e351aeff3920607c4d96fed9f1a Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 12:51:43 +0000
-Subject: [PATCH 261/423] clk: bcm2835: enable management of PCM clock
+Subject: [PATCH] clk: bcm2835: enable management of PCM clock
 
 Enable the PCM clock in the SOC, which is used by the
 bcm2835-i2s driver.
index dd71a4d6e734feffefa350af1b1c3e37d725c2e1..2bb2db6b35592e9d464e7dc877c3d07e136b8739 100644 (file)
@@ -1,7 +1,7 @@
-From bea282aec8f05b08fd5185f7aeb75050a00c1d49 Mon Sep 17 00:00:00 2001
+From 0bd7afe408b2afd845f3b4971cfa641653716a12 Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 15:43:56 +0000
-Subject: [PATCH 262/423] clk: bcm2835: add missing PLL clock dividers
+Subject: [PATCH] clk: bcm2835: add missing PLL clock dividers
 
 Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
 Signed-off-by: Eric Anholt <eric@anholt.net>
index 553de1dfc9273d649cb83bdb95d49b19ed582350..697f3733b848426cd7ddeaf2ccdbd7b6f67291ed 100644 (file)
@@ -1,7 +1,7 @@
-From f634bd6444b004d080a6bbcee812f95669d6a91f Mon Sep 17 00:00:00 2001
+From 3f26e43abb4c245d41dfbed03d82c3bc36044b04 Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Mon, 29 Feb 2016 15:43:57 +0000
-Subject: [PATCH 263/423] clk: bcm2835: add missing osc and per clocks
+Subject: [PATCH] clk: bcm2835: add missing osc and per clocks
 
 Add AVE0, DFT, GP0, GP1, GP2, SLIM, SMI, TEC, DPI, CAM0, CAM1, DSI0E,
 and DSI1E.  PULSE is not added because it has an extra divider.
index 9ceb0721db48b9860bcf753a9e85d9c037297caa..cfe6c9547c84e2a1497d6b410114c084e59c6237 100644 (file)
@@ -1,7 +1,7 @@
-From 2d65549219b48c5da3bcc743477567b41017c96f Mon Sep 17 00:00:00 2001
+From 0021fdc59ccc2901f9ae829eb89d624a518eab27 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 1 Dec 2015 16:49:12 -0800
-Subject: [PATCH 264/423] ARM: bcm2835: Define two new packets from the latest
+Subject: [PATCH] ARM: bcm2835: Define two new packets from the latest
  firmware.
 
 These packets give us direct access to the firmware's power management
index c3330a634431dba616df3c69b1535df7ac8340d6..a27859774bf1c27bcf8fd5a424d92b4f49fcf21b 100644 (file)
@@ -1,7 +1,7 @@
-From 0e371c743ab0adb7ada29fbe13712d7ab5696382 Mon Sep 17 00:00:00 2001
+From fab8814aede95569e5dfe3bad78ceda471bd341f Mon Sep 17 00:00:00 2001
 From: Alexander Aring <alex.aring@gmail.com>
 Date: Wed, 16 Dec 2015 16:26:47 -0800
-Subject: [PATCH 265/423] ARM: bcm2835: add rpi power domain driver
+Subject: [PATCH] ARM: bcm2835: add rpi power domain driver
 
 This patch adds support for several power domains on Raspberry Pi,
 including USB (so it can be enabled even if the bootloader didn't do
index 734762ddce1c00040352b778aae6c4c9d8e34f18..210ea4f366d85bce25cfb51dda76797253b26085 100644 (file)
@@ -1,7 +1,7 @@
-From b07da9e061614b18af32b80e75843e85a0171e56 Mon Sep 17 00:00:00 2001
+From 98f387ec974ccd45054a13211ed8d91d46bbe4cc Mon Sep 17 00:00:00 2001
 From: Arnd Bergmann <arnd@arndb.de>
 Date: Thu, 31 Dec 2015 23:39:14 +0100
-Subject: [PATCH 266/423] ARM: bcm2835: clarify RASPBERRYPI_FIRMWARE dependency
+Subject: [PATCH] ARM: bcm2835: clarify RASPBERRYPI_FIRMWARE dependency
 
 The firmware driver can be a loadable module, but the power domain
 can only be built-in, so we get a build error in an allmodconfig
index e6decc36d86c565a4180f545ae0bb7d72d3c48c2..f97b2e768565a6ff0286b4d8527515c2531195cf 100644 (file)
@@ -1,7 +1,7 @@
-From befc30415610ee28c619b14b8cee501184b43bf8 Mon Sep 17 00:00:00 2001
+From 5b934c573b70da98f70b98aa20a1f96bba8ef9b2 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 19 Apr 2016 15:55:02 -0700
-Subject: [PATCH 267/423] ARM: bcm2708: Enable building power domain driver.
+Subject: [PATCH] ARM: bcm2708: Enable building power domain driver.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index 3d6b740318ca27da536278931cd78f40e6c830c3..f11638e845d3e0fa251534b93616be7b54953c9f 100644 (file)
@@ -1,7 +1,7 @@
-From b4ca3f0d1ec696492df39df6878a96d1ec14458a Mon Sep 17 00:00:00 2001
+From 9d065d6d38cb379a36e655c98f5e42cbfc1de0b2 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 19 Apr 2016 14:23:30 -0700
-Subject: [PATCH 268/423] bcm2708: Add RASPBERRYPI_POWER to the defconfigs.
+Subject: [PATCH] bcm2708: Add RASPBERRYPI_POWER to the defconfigs.
 
 This will be used by the GPU driver for powering on HDMI at boot time
 and for 3D hang reset.
index 2c6a619212860bb5354efdcb55f861a8fb7fd185..c7c2148bbd1c47ab6ab3d5055a8df6c2643c0536 100644 (file)
@@ -1,8 +1,7 @@
-From 5a8fe845b22e7ecef4b0d0d7fdfaa21794fa48c9 Mon Sep 17 00:00:00 2001
+From 61a1a146c39f694a1d347ac251ebd9b7d804064f Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 19 Apr 2016 14:36:31 -0700
-Subject: [PATCH 269/423] bcm2708: Add the power domain driver to the device
- tree.
+Subject: [PATCH] bcm2708: Add the power domain driver to the device tree.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index c4adce66ed0c189b0dde13a74b723852a6ab55f0..95c9d91c5da0889f4f3ec820f6949479f69b19d7 100644 (file)
@@ -1,8 +1,7 @@
-From e3f9f86ddec3e4a07333fa7f368440e09a7252ce Mon Sep 17 00:00:00 2001
+From 8c3b6b58d1f49ce8a352379cd48647e8116659ca Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 19 Apr 2016 14:40:08 -0700
-Subject: [PATCH 270/423] bcm2708: Reference the HDMI power domain for the HDMI
- driver.
+Subject: [PATCH] bcm2708: Reference the HDMI power domain for the HDMI driver.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 ---
index b630dad659ed127563590c0e47660704e2a96abc..3ced0ef28cd712f87a30baa7e72732a83b634c45 100644 (file)
@@ -1,8 +1,7 @@
-From a11ebfca5c605cdd30599edf201a65ece99b05fe Mon Sep 17 00:00:00 2001
+From e1d56edafff76ade96b5dce25e7cf1300213929b Mon Sep 17 00:00:00 2001
 From: Dan Carpenter <dan.carpenter@oracle.com>
 Date: Thu, 17 Dec 2015 15:36:28 +0300
-Subject: [PATCH 271/423] drm/vc4: copy_to_user() returns the number of bytes
- remaining
+Subject: [PATCH] drm/vc4: copy_to_user() returns the number of bytes remaining
 
 The copy_to/from_user() functions return the number of bytes remaining
 to be copied.  We want to return error codes here.
index 06c7a0682427ea597996da6780a63eeee5dabbad..6d1cbc777c44bc53e10b53aff3fc31c704ed48d3 100644 (file)
@@ -1,8 +1,7 @@
-From 5c182b5f46cb781e945b3e567ac97fbb369d75d4 Mon Sep 17 00:00:00 2001
+From 6d29873e5a006db5b342630976b5527c8049acd2 Mon Sep 17 00:00:00 2001
 From: Dan Carpenter <dan.carpenter@oracle.com>
 Date: Thu, 17 Dec 2015 15:39:08 +0300
-Subject: [PATCH 272/423] drm/vc4: allocate enough memory in
- vc4_save_hang_state()
+Subject: [PATCH] drm/vc4: allocate enough memory in vc4_save_hang_state()
 
 "state" is smaller than "kernel_state" so we end up corrupting memory.
 
index 4d3d94c7416a02a7dd2cb1cf85c4db91c788e08c..a654f1469002ffe4356ffb2b9ecafb249c0bf6ec 100644 (file)
@@ -1,7 +1,7 @@
-From eeafab86c1440009e0a09819019f0d6b562650a1 Mon Sep 17 00:00:00 2001
+From 015bc9646e2ff3586789757645aeee592819d843 Mon Sep 17 00:00:00 2001
 From: Dave Airlie <airlied@redhat.com>
 Date: Mon, 18 Jan 2016 09:10:42 +1000
-Subject: [PATCH 273/423] drm/vc4: fix warning in validate printf.
+Subject: [PATCH] drm/vc4: fix warning in validate printf.
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index f7215c746d0734c4b3b8100e32ad4120ff89c54b..c31bfbe0f254aa15a7572f6cf3de832572754a3c 100644 (file)
@@ -1,7 +1,7 @@
-From 91b875c48c7aee103c14418730bc9ceb96aa18ac Mon Sep 17 00:00:00 2001
+From 2fa85567b77dc0a771cdeb37a4e6fb27ec23100d Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 28 Dec 2015 14:14:09 -0800
-Subject: [PATCH 274/423] drm/vc4: Improve comments on vc4_plane_state members.
+Subject: [PATCH] drm/vc4: Improve comments on vc4_plane_state members.
 
 Signed-off-by: Eric Anholt <eric@anholt.net>
 (cherry picked from commit f427fb16cf756548c39256b569cf083f39bcc4e9)
index 091a2b7fd5d35adf133935863dd19658e17cc7dc..e37fffc281937b959d88efd6bc8deafb8795b5b4 100644 (file)
@@ -1,7 +1,7 @@
-From e0ab0c8c87b39aaf254f3b5625509dce3daeb216 Mon Sep 17 00:00:00 2001
+From 66c0f03718b26cb3bf47c60ef94770fab9728464 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 28 Dec 2015 14:14:57 -0800
-Subject: [PATCH 275/423] drm/vc4: Add missing __iomem annotation to hw_dlist.
+Subject: [PATCH] drm/vc4: Add missing __iomem annotation to hw_dlist.
 
 This is the pointer to the HVS device's memory where we stored the
 contents of *dlist.
index af7bbe162b90873974cca1a78904a4af06a10c96..0be0676c4f38ce515243975f0bb1ed5924bcc890 100644 (file)
@@ -1,8 +1,8 @@
-From fd6dfd0af2ab83d8df5d7b17a52fbf0284e42f2b Mon Sep 17 00:00:00 2001
+From eb708cc358e2f94461f971012c9c477a41b01237 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 28 Dec 2015 14:34:44 -0800
-Subject: [PATCH 276/423] drm/vc4: Move the plane clipping/scaling setup to a
separate function.
+Subject: [PATCH] drm/vc4: Move the plane clipping/scaling setup to a separate
+ function.
 
 As we add actual scaling, this is going to get way more complicated.
 
index 891383e78ee34e7348157a8458f7ba47c166260d..0e7274803b645f0c89a200ddec24161eb077f71f 100644 (file)
@@ -1,8 +1,8 @@
-From 3f24f34e62b4bdcff3a5d46e847b200b5380b5ee Mon Sep 17 00:00:00 2001
+From 81f885f1ab1729bb2d14ca44d4861e0bb982b324 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Wed, 30 Dec 2015 11:50:22 -0800
-Subject: [PATCH 277/423] drm/vc4: Add a proper short-circut path for legacy
cursor updates.
+Subject: [PATCH] drm/vc4: Add a proper short-circut path for legacy cursor
+ updates.
 
 Previously, on every modeset we would allocate new display list
 memory, recompute changed planes, write all of them to the new memory,
index f235996659fd42f09eff932a24a89bacf4be7542..c676273d7707c4c8b35adde0ca23ef319f95a939 100644 (file)
@@ -1,8 +1,8 @@
-From 417b8c7dcc6cad23f255a4307dda97d04f9c9b5b Mon Sep 17 00:00:00 2001
+From 1c86cb2794cdba850675a95de59acf505a3d7654 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 28 Dec 2015 13:25:41 -0800
-Subject: [PATCH 278/423] drm/vc4: Make the CRTCs cooperate on allocating
display lists.
+Subject: [PATCH] drm/vc4: Make the CRTCs cooperate on allocating display
+ lists.
 
 So far, we've only ever lit up one CRTC, so this has been fine.  To
 extend to more displays or more planes, we need to make sure we don't
index 3deccf57c11b32651a08f92a4081caae7a233f1b..8cfb9ea87a0e17f457c5352152ea6d24ee181e5d 100644 (file)
@@ -1,7 +1,7 @@
-From a4e111deb5b2aaff6cd633135825c40d03b3ac74 Mon Sep 17 00:00:00 2001
+From dfda3a55b70ee0b1227ec4551d6376d463dd14b9 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 20 Oct 2015 14:18:56 +0100
-Subject: [PATCH 279/423] drm/vc4: Add more display planes to each CRTC.
+Subject: [PATCH] drm/vc4: Add more display planes to each CRTC.
 
 Previously we only did the primary and cursor plane, but overlay
 planes are useful and just require this setup to add, since all planes
index 980fed138814efc8f5e4725d4e5137025cb1aa88..ecfc9da637f53d900d9fc955ff9de832c8f6d9c4 100644 (file)
@@ -1,8 +1,7 @@
-From 265a20f8e1c0e3578aea9dcf9d2ea93ea909b76b Mon Sep 17 00:00:00 2001
+From 4ac20cea599c0f91b3240013ce603e608cab2d6a Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 28 Dec 2015 14:45:25 -0800
-Subject: [PATCH 280/423] drm/vc4: Fix which value is being used for source
- image size.
+Subject: [PATCH] drm/vc4: Fix which value is being used for source image size.
 
 This doesn't matter yet since we only allow 1:1 scaling, but the
 comment clearly says we should be using the source size.
index 8fd1294726a2a0d89054020eb9a8d3b5fdc9d18b..e7e5986c9f971a15158eacea19147017d07d0b88 100644 (file)
@@ -1,7 +1,7 @@
-From 8d513c7a67cce0bf0ef312323753eccbd0f3f71a Mon Sep 17 00:00:00 2001
+From 0b7d1c1de27840bd1a32bc0a28c8354e362b38ca Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 20 Oct 2015 16:06:57 +0100
-Subject: [PATCH 281/423] drm/vc4: Add support for scaling of display planes.
+Subject: [PATCH] drm/vc4: Add support for scaling of display planes.
 
 This implements a simple policy for choosing scaling modes
 (trapezoidal for decimation, PPF for magnification), and a single PPF
index fbc712667ea394f009e2e6bf585e3136e98d2209..ed999d24112f0bed6a1f8ba0cb17674f4f3a66ed 100644 (file)
@@ -1,7 +1,7 @@
-From 40707ee2d92a2d229aa6b328c93aec0e3026c2a7 Mon Sep 17 00:00:00 2001
+From 64f2da0496d51f7260e18aeed6e72ed09fec7b00 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Wed, 30 Dec 2015 12:25:44 -0800
-Subject: [PATCH 282/423] drm/vc4: Add support for YUV planes.
+Subject: [PATCH] drm/vc4: Add support for YUV planes.
 
 This supports 420 and 422 subsampling with 2 or 3 planes, tested with
 modetest.  It doesn't set up chroma subsampling position (which it
index efbcafa136ff9bf63a15b3ebffad3a9a2a78d708..f699b30f2cde3d9b4dae0212aa7e8182d92aafc1 100644 (file)
@@ -1,7 +1,7 @@
-From afe4e8694c719164db2918fe267658e4971bafaa Mon Sep 17 00:00:00 2001
+From bb79ceb9166d67ad8d658dead2f62bda7668f139 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 8 Feb 2016 11:19:14 -0800
-Subject: [PATCH 283/423] drm/vc4: Fix spurious GPU resets due to BO reuse.
+Subject: [PATCH] drm/vc4: Fix spurious GPU resets due to BO reuse.
 
 We were tracking the "where are the head pointers pointing" globally,
 so if another job reused the same BOs and execution was at the same
index 01736579581f6eabea8fd50da2af19c7cc8bda5f..366ac24c59c6e4393fb595aa88813b0d78846c9f 100644 (file)
@@ -1,8 +1,8 @@
-From 0a26ed79b85b1fd55b88a1c3b5d1b4c3382b03f9 Mon Sep 17 00:00:00 2001
+From 2ee2a1f157f4eb81c2aca3a076fe74c1e587d2f8 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 5 Feb 2016 15:06:15 -0800
-Subject: [PATCH 284/423] drm/vc4: Fix a framebuffer reference leak on async
flip interrupt.
+Subject: [PATCH] drm/vc4: Fix a framebuffer reference leak on async flip
+ interrupt.
 
 We'd need X to queue up an async pageflip while another is
 outstanding, and then take a SIGIO.  I think X actually avoids sending
index a435d654d4f3e394a673a20857070b1e727cef8e..5391264828a2c772f138dee7991a3d8deff82437 100644 (file)
@@ -1,7 +1,7 @@
-From aae3a606556af7e815414df480aa49e1e56d1bc1 Mon Sep 17 00:00:00 2001
+From 17467b182d70d76c27d8e498abb281b28f58f92c Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 12 Feb 2016 14:15:14 -0800
-Subject: [PATCH 285/423] drm/vc4: Bring HDMI up from power off if necessary.
+Subject: [PATCH] drm/vc4: Bring HDMI up from power off if necessary.
 
 If the firmware hadn't brought up HDMI for us, we need to do its
 power-on reset sequence (reset HD and and clear its STANDBY bits,
index a24389964d8cc525aab572a3a5750fb618eaf27d..eb087dfb6bedc0668eac6c1b5d726a7ad01f408d 100644 (file)
@@ -1,7 +1,7 @@
-From 6b4cbec225aa2ab85069aecfae8c328892cc7a3d Mon Sep 17 00:00:00 2001
+From 00d72cb223055ccdac7e9cda524b00a26a63c13e Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 12 Feb 2016 15:16:56 -0800
-Subject: [PATCH 286/423] drm/vc4: Add another reg to HDMI debug dumping.
+Subject: [PATCH] drm/vc4: Add another reg to HDMI debug dumping.
 
 This is also involved in the HDMI setup sequence so it's nice to see
 it.
index ac4b27ded9b88acdb116ab1b00d3258c23221ceb..4e8a119deddb1252c8b7937369d4309451c429c5 100644 (file)
@@ -1,7 +1,7 @@
-From 3793554fcc4a8aa0545f109b5e8413c3ba42b823 Mon Sep 17 00:00:00 2001
+From 7c26f1c9cbdcaa0e8e3c6b740273f4722ce5c4ed Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 15 Feb 2016 17:06:02 -0800
-Subject: [PATCH 287/423] drm/vc4: Fix the name of the VSYNCD_EVEN register.
+Subject: [PATCH] drm/vc4: Fix the name of the VSYNCD_EVEN register.
 
 It's used for delaying vsync in interlaced mode.
 
index 4542ac4b6dace97afa03515344f8b605994cb7d9..97f1c6ad0c6761c89fb9dadb344e9587bc07cd42 100644 (file)
@@ -1,7 +1,7 @@
-From aaf3c3ab336f0ff54be5b7eb4de5adca3cd2c05a Mon Sep 17 00:00:00 2001
+From 9654afa1c26516e3461cd8575f08b367fe5ff42a Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 15 Feb 2016 17:31:41 -0800
-Subject: [PATCH 288/423] drm/vc4: Fix setting of vertical timings in the CRTC.
+Subject: [PATCH] drm/vc4: Fix setting of vertical timings in the CRTC.
 
 It looks like when I went to add the interlaced bits, I just took the
 existing PV_VERT* block and indented it, instead of copy and pasting
index ebda4542ffc592e517e0ba43ce80c5469c07f6f5..608a4678837a66cc23efef957cee9422e9fd17ef 100644 (file)
@@ -1,7 +1,7 @@
-From bf75b498fa8699b0b3230c33cc16a0633ff0e65c Mon Sep 17 00:00:00 2001
+From a4d7f252c7aca463cd85dd21f5929e4ba12a2a41 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 16 Feb 2016 10:24:08 -0800
-Subject: [PATCH 289/423] drm/vc4: Initialize scaler DISPBKGND on modeset.
+Subject: [PATCH] drm/vc4: Initialize scaler DISPBKGND on modeset.
 
 We weren't updating the interlaced bit, so we'd scan out incorrectly
 if the firmware had brought up the TV encoder and we were switching to
index 11f7bd2ffbbfe0e209f29d14634325bef760b0eb..e03e76140273cc7c9ff8721c287fc8bb55406250 100644 (file)
@@ -1,7 +1,7 @@
-From 346367864363fa323ee502d9e8fb36b964cbbdb0 Mon Sep 17 00:00:00 2001
+From 1624a40cc0b7760e60b842b15fe46859940a9f48 Mon Sep 17 00:00:00 2001
 From: Varad Gautam <varadgautam@gmail.com>
 Date: Wed, 17 Feb 2016 19:08:21 +0530
-Subject: [PATCH 290/423] drm/vc4: improve throughput by pipelining binning and
+Subject: [PATCH] drm/vc4: improve throughput by pipelining binning and
  rendering jobs
 
 The hardware provides us with separate threads for binning and
index daf76bc5efa7d75caede3185dfae116d32f71000..d282d259fc574f9353a9ee3d99b2c72d272aea54 100644 (file)
@@ -1,8 +1,8 @@
-From 52a8cd7d35e6c8860c2449e04ae305a3cdc671f1 Mon Sep 17 00:00:00 2001
+From 92bceb9faef5ef033e79b746aa8d5fd465548fbc Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 29 Feb 2016 17:53:00 -0800
-Subject: [PATCH 291/423] drm/vc4: Let gpiolib know that we're OK with sleeping
for HPD.
+Subject: [PATCH] drm/vc4: Let gpiolib know that we're OK with sleeping for
+ HPD.
 
 Fixes an error thrown every few seconds when we poll HPD when it's on
 a I2C to GPIO expander.
index cb5311062b579590462f76c72e7908e7150d2583..e6f8e9b06fd50efc7d8cbfbbebdf676624539f6f 100644 (file)
@@ -1,8 +1,8 @@
-From dd556129599f962e6da90bcd1150d8604979ceee Mon Sep 17 00:00:00 2001
+From ce00fb0111a4b7c47dc301d7d4845736ee9bb493 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Mon, 29 Feb 2016 17:53:01 -0800
-Subject: [PATCH 292/423] drm/vc4: Respect GPIO_ACTIVE_LOW on HDMI HPD if set
in the devicetree.
+Subject: [PATCH] drm/vc4: Respect GPIO_ACTIVE_LOW on HDMI HPD if set in the
+ devicetree.
 
 The original Raspberry Pi had the GPIO active high, but the later
 models are active low.  The DT GPIO bindings allow specifying the
index 082dec57a7f1bea1d2d05fbb6dd3ff41b1ae4cf2..202425f57ab8f662aacd59d4f540e8216f944bed 100644 (file)
@@ -1,7 +1,7 @@
-From deb04405c9c7362840387414fcf33f01d056c697 Mon Sep 17 00:00:00 2001
+From b73a3233de4b17d80cfb100dcda2216cb3fcf8c6 Mon Sep 17 00:00:00 2001
 From: Dan Carpenter <dan.carpenter@oracle.com>
 Date: Tue, 8 Mar 2016 15:09:41 +0300
-Subject: [PATCH 293/423] drm/vc4: Return -EFAULT on copy_from_user() failure
+Subject: [PATCH] drm/vc4: Return -EFAULT on copy_from_user() failure
 
 The copy_from_user() function returns the number of bytes not copied but
 we want to return a negative error code.
index 14cc70261bd9be4d23c10678f0cfb02bb3f1f7a7..c7fe18cf2a6d5c922caa377d35f49962e99f3cb3 100644 (file)
@@ -1,8 +1,7 @@
-From 16410f120e31739e61b0a89f91539cd551e088cc Mon Sep 17 00:00:00 2001
+From 4e30b1819e50588d5a3720ad1ac42cfbcb913101 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Fri, 4 Mar 2016 12:32:07 -0800
-Subject: [PATCH 294/423] drm/vc4: Recognize a more specific compatible string
- for V3D.
+Subject: [PATCH] drm/vc4: Recognize a more specific compatible string for V3D.
 
 The Raspberry Pi Foundation's firmware updates are shipping device
 trees using the old string, so we'll keep recognizing that as this rev
index a6afa301e5d61ec0f8f4fe7d9d48878750afddf0..4661e4a703cf9781249c0ef9cd8bc665c23e731f 100644 (file)
@@ -1,7 +1,7 @@
-From 08b78882a19227210b133f5fd66c923c4dec2d5d Mon Sep 17 00:00:00 2001
+From 6cdbac4755ed4e63299ea24635597e1d1188e8c8 Mon Sep 17 00:00:00 2001
 From: Eric Anholt <eric@anholt.net>
 Date: Tue, 19 Apr 2016 17:21:06 -0700
-Subject: [PATCH 295/423] ARM: bcm2708: Move the CMA range down for kernel 4.4.
+Subject: [PATCH] ARM: bcm2708: Move the CMA range down for kernel 4.4.
 
 The previous area no longer works, for reasons I haven't investigated.
 Just move it somewhere that works.
index 11a5abad12393daa3500c0db94f1c6244fc73ddb..376d992748b86e7662e276ff62aaee272fd01c5b 100644 (file)
@@ -1,7 +1,7 @@
-From 962b219e1cbec5b7fc6a3b5c9e03077ca759695d Mon Sep 17 00:00:00 2001
+From e16d40b0eafe97952af1005d8b1ab97ce4440066 Mon Sep 17 00:00:00 2001
 From: Vladimir Zapolskiy <vz@mleia.com>
 Date: Sun, 6 Mar 2016 03:21:35 +0200
-Subject: [PATCH 296/423] clk: bcm2835: fix check of error code returned by
+Subject: [PATCH] clk: bcm2835: fix check of error code returned by
  devm_ioremap_resource()
 
 The change fixes potential oops while accessing iomem on invalid
index 8075b63a88ea345d58a8a508e7d03d3ac2144bd9..6dd4180b008663397089f592171ef99b4796ff69 100644 (file)
@@ -1,7 +1,7 @@
-From 3ea5efb1f91da877b375eccb94e1cd4517fd8638 Mon Sep 17 00:00:00 2001
+From d4bbd21245e600f32074724152f77a4ae9904047 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 21 Apr 2016 13:49:32 +0100
-Subject: [PATCH 297/423] vchiq_arm: Add completion records under the mutex
+Subject: [PATCH] vchiq_arm: Add completion records under the mutex
 
 An issue was observed when flushing openmax components
 which generate a large number of messages returning
index 4dd489c631a482fdc16c8519b6b5c4683f1d4b38..1b0aff70e016a327291e43cc2d15db8b1888978b 100644 (file)
@@ -1,7 +1,7 @@
-From 51453a026306a2b1c7ccad6bcc9ab95a24d49bc3 Mon Sep 17 00:00:00 2001
+From 03fb94e9e8e68ba9809bdd0f966346ea2807d1dd Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 21 Apr 2016 16:07:15 +0100
-Subject: [PATCH 298/423] config: Add DRM_UDL module
+Subject: [PATCH] config: Add DRM_UDL module
 
 See: https://github.com/raspberrypi/linux/issues/1422
 
index d4b4492d6b0380cce0584ad3b6e526384a0b0972..1048b2ae3134e14e087397799406594b93368672 100644 (file)
@@ -1,7 +1,7 @@
-From c2dd47a309d6eee486191ef7805ba3f544ff3dae Mon Sep 17 00:00:00 2001
+From a7f989cdcb11a8ff5bbb51a675e3662872b5dd55 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Thu, 21 Apr 2016 15:44:14 +0100
-Subject: [PATCH 299/423] bcm2835-i2s: Reduce the TX DREQ threshold
+Subject: [PATCH] bcm2835-i2s: Reduce the TX DREQ threshold
 
 TX FIFO overrun is thought to be the cause of channel swapping, so
 reducing the DREQ threshold seems reasonable and appears to be
index f980400a37bb856e01407d63fdef9af8425ee234..9c3bdeae1ac9528de06a95bb5d017740fb0171e0 100644 (file)
@@ -1,7 +1,7 @@
-From 99f198703d9ba6c286ca936850a12e6ca3f6b78b Mon Sep 17 00:00:00 2001
+From 4bf5d7236db0e122eb20cf73699557122f49c9dc Mon Sep 17 00:00:00 2001
 From: Dave Stevenson <6by9@users.noreply.github.com>
 Date: Sat, 16 Apr 2016 23:09:54 +0100
-Subject: [PATCH 300/423] V4L2: Request maximum resolution from GPU
+Subject: [PATCH] V4L2: Request maximum resolution from GPU
 
 Get resolution information about the sensors from the GPU
 and advertise it correctly.
index 6ec13c9a848635fa6367806cad5cbaec8b227b84..132ee07ca979cbb5132231c89be39df748697cac 100644 (file)
@@ -1,7 +1,7 @@
-From 19244064105686007a875c423970e3113da4e73c Mon Sep 17 00:00:00 2001
+From c865e89f79eca5a324d541a03aa4725bc0614f64 Mon Sep 17 00:00:00 2001
 From: Martin Sperl <kernel@martin.sperl.org>
 Date: Sat, 23 Apr 2016 15:21:41 +0000
-Subject: [PATCH 301/423] ARM: bcm2835: add i2s-gpio28-31 for cm
+Subject: [PATCH] ARM: bcm2835: add i2s-gpio28-31 for cm
 
 Add i2s-gpio28-31 overlay for compute module
 so that i2s is using gpio28-31
index 5f04f2ff163447c53eb71bbd8e0a8848cd30139b..34f0e8053dda8ef04e855472329a8748397f3aec 100644 (file)
@@ -1,7 +1,7 @@
-From 5f632f8aba2da50bba83537926a1d3a466ca2a51 Mon Sep 17 00:00:00 2001
+From 4f7d976e703d5196ade9d27074ce4bb49c11bb52 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Sun, 24 Apr 2016 17:28:15 +0100
-Subject: [PATCH 302/423] drm/vc4: Add DT parameters to control CMA usage
+Subject: [PATCH] drm/vc4: Add DT parameters to control CMA usage
 
 Example: dtoverlay=vc4-kms-v3d,cma-128
 
index 9c0916908fdb96da9e0272d059a8e704e285957b..866983f0be0427e9c2bb0e7bf6c03beeac131d08 100644 (file)
@@ -1,7 +1,7 @@
-From 2745d40fb64e1663fba690f69ea0a87a171a43f6 Mon Sep 17 00:00:00 2001
+From 314c504fe66cf918a847fd0ab5a4c9f82def6e06 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Mon, 25 Apr 2016 10:43:36 +0100
-Subject: [PATCH 303/423] SQUASH: BCM270X_DT: Add make rule for sdio-1bit
+Subject: [PATCH] SQUASH: BCM270X_DT: Add make rule for sdio-1bit
 
 See: https://github.com/raspberrypi/linux/pull/1301
 
index 2c3706f4c499ab6b46cbc5ad558255fafe051e1a..e6f53cdd6b5a625e03afaac64b9f973f40f559cd 100644 (file)
@@ -1,7 +1,7 @@
-From 2e099f313b5fa1f2eb508da3b7322dea3c27053d Mon Sep 17 00:00:00 2001
+From d2ecf44fbe03bd988a608473d5b515d21fab8950 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Petter=20Mab=C3=A4cker?= <petter@technux.se>
 Date: Fri, 8 Jan 2016 09:02:44 +0100
-Subject: [PATCH 304/423] dts: add overlay for pitft22
+Subject: [PATCH] dts: add overlay for pitft22
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
index 3b348506a025c993eab75203d2983e2f88a540c7..db5ecb2722621cb2cfd0c037f045767db0deb84e 100644 (file)
@@ -1,7 +1,7 @@
-From ef21e99d52371ca26385dce327687880143316a1 Mon Sep 17 00:00:00 2001
+From 5bab2e037ad60c491b7a48171b33fb1413e91352 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Tue, 26 Apr 2016 10:44:59 +0100
-Subject: [PATCH 305/423] BCM270X_DT: Sound DT adjustments for Dynamic DT
+Subject: [PATCH] BCM270X_DT: Sound DT adjustments for Dynamic DT
 
 There are a number of issues when loading and unloading overlays for
 sound cards:
index 8cbc0c8d86d4d7f5fe049167ea71d977db44249e..e32f9f37b4d3de0f81f64d531a354971de719b07 100644 (file)
@@ -1,7 +1,7 @@
-From 27105cf8f4de0124cfdeb3413d5475aff3c8f00f Mon Sep 17 00:00:00 2001
+From 5f01fff2c8d665404e11aff29278d63f6250af61 Mon Sep 17 00:00:00 2001
 From: Phil Elwell <phil@raspberrypi.org>
 Date: Wed, 27 Apr 2016 12:01:41 +0100
-Subject: [PATCH 306/423] BCM270X_DT: Fix codec use in hifiberry-dac overlay
+Subject: [PATCH] BCM270X_DT: Fix codec use in hifiberry-dac overlay
 
 Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 ---
index aafca79c0fe31e10da968c28817023406c2dae92..d04a1eb4461fff457fccf9810e14b4d9769cfd74 100644 (file)
@@ -1,7 +1,7 @@
-From ad45da06f725ba7f1280c69e0476919d87f8030c Mon Sep 17 00:00:00 2001
+From 593366c81d96fb54152093ab5ca3d62607440cf8 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:27:33 +0100
-Subject: [PATCH 309/423] Revert "bcm2835: log which channel map is set"
+Subject: [PATCH] Revert "bcm2835: log which channel map is set"
 
 This reverts commit cd560b8658868d9652ab31754e02f86daf6831ba.
 ---
index 9f8d7d9603746fcaf155199a06289d10746b9674..56497d139aee63f0b098e26b38ffb050e9c3bb7c 100644 (file)
@@ -1,8 +1,8 @@
-From f8473a921ad7208ca5b4218571f3ffd267b18cff Mon Sep 17 00:00:00 2001
+From ed9e011f0f6a823a2e278ce7dd9e8bb620b08e56 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:27:35 +0100
-Subject: [PATCH 310/423] Revert "bcm2835: add fallback channel layouts if
channel map API is not used"
+Subject: [PATCH] Revert "bcm2835: add fallback channel layouts if channel map
+ API is not used"
 
 This reverts commit ceacfff9f86f89826dbc8a6df667f485894327d1.
 ---
index 152ab91980b0b3947060c98007bd778fea7ee971..83b675d6805f563a92f4e29daff20c4d51689015 100644 (file)
@@ -1,8 +1,8 @@
-From 75045e771ab867b6cd397b1d1280e81584ddc401 Mon Sep 17 00:00:00 2001
+From e26366439123ef9f20f7728942f35937035c9c73 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:27:36 +0100
-Subject: [PATCH 311/423] Revert "bcm2835: do not require substream for
accessing chmap ctl"
+Subject: [PATCH] Revert "bcm2835: do not require substream for accessing chmap
+ ctl"
 
 This reverts commit a05b4815196018c329ea98c24205bc6fa9c097e0.
 ---
index a972170c196410e0fbd0f26dd3424ac576ce4fe2..0b50d279b070e10144dc9277ac743d066110322a 100644 (file)
@@ -1,7 +1,7 @@
-From 65978c7586dc8fe403a3a3bebf40de881b8d2741 Mon Sep 17 00:00:00 2001
+From 30abbf1d6db5eb081c9693958b098d86758aa7f4 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:27:37 +0100
-Subject: [PATCH 312/423] Revert "bcm2835: interpolate audio delay"
+Subject: [PATCH] Revert "bcm2835: interpolate audio delay"
 
 This reverts commit 83eca613d0eddd2c8299f114b8fe573ccaffdefc.
 ---
index ce48ff162a3f62a54eb99ac7190158a0f6c664f4..c601196725ff29770a5d947e40d64b06efea156c 100644 (file)
@@ -1,8 +1,8 @@
-From 71c5f4311cf466ec59d058102c21b12c93d46a64 Mon Sep 17 00:00:00 2001
+From ad3d718e72cdc2c01c22578831603ea1981f9906 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:28:06 +0100
-Subject: [PATCH 313/423] Revert "bcm2835: only allow stereo if analogue jack
is selected"
+Subject: [PATCH] Revert "bcm2835: only allow stereo if analogue jack is
+ selected"
 
 This reverts commit 5f7049894f47b3836838cd68e29ee883179c80b3.
 ---
index 4d8e508ee07bd54d02a960541f609fab24dbd7ed..e1efbf78d1fbf0f105e211a2e9ce5cd69364c1ef 100644 (file)
@@ -1,8 +1,8 @@
-From 36b6b25b8fe95dc3d4c9b0ded58827b5660e1a87 Mon Sep 17 00:00:00 2001
+From 506c92b9847bb1fb0ef2fab567b74da572c2ad97 Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:28:08 +0100
-Subject: [PATCH 314/423] Revert "bcm2835: always use 2/4/8 channels for
multichannel layouts"
+Subject: [PATCH] Revert "bcm2835: always use 2/4/8 channels for multichannel
+ layouts"
 
 This reverts commit 06931f74092d86087144f070b06a4444df8b444b.
 ---
index d6c5b6ca3b82d2b7b50b4b6de746bcefe9cf6cbf..d5d70b350d43846b8fb09d30b1bb201b0ecdc36c 100644 (file)
@@ -1,7 +1,7 @@
-From f830d4081e228776a7236be435921016b3ae1347 Mon Sep 17 00:00:00 2001
+From 1e3a2bebcbd26fdf1b0d13d2219186163708ae4c Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:29:03 +0100
-Subject: [PATCH 315/423] Revert "bcm2835: implement channel map API"
+Subject: [PATCH] Revert "bcm2835: implement channel map API"
 
 This reverts commit 5efba3f8c180c39609a8d40033ef92046ef0de75.
 ---
index cb549a0a4731862264e2974af01874dfa3017af4..c128686e2dc20baeb632ca280e0b6008e56a276b 100644 (file)
@@ -1,7 +1,7 @@
-From c46ed63ab5c1c24f3732aa410e9b9661d4c18ce7 Mon Sep 17 00:00:00 2001
+From cb54a471f7066a763b9da5d33d6613fe15d2aa3d Mon Sep 17 00:00:00 2001
 From: popcornmix <popcornmix@gmail.com>
 Date: Fri, 29 Apr 2016 17:30:00 +0100
-Subject: [PATCH 316/423] Revert "bcm2835: extend allowed range of channels and
+Subject: [PATCH] Revert "bcm2835: extend allowed range of channels and
  samplerates"
 
 This reverts commit 688a5f0daa45e0a51b324707768d472e1d715c13.
diff --git a/target/linux/brcm2708/patches-4.4/0317-pinctrl-bcm2835-Return-pins-to-inputs-when-freed.patch b/target/linux/brcm2708/patches-4.4/0317-pinctrl-bcm2835-Return-pins-to-inputs-when-freed.patch
new file mode 100644 (file)
index 0000000..685cd79
--- /dev/null
@@ -0,0 +1,40 @@
+From 550960c37d5de04808943e9ae6cecb16ad003070 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 6 May 2016 12:32:47 +0100
+Subject: [PATCH] pinctrl-bcm2835: Return pins to inputs when freed
+
+When dynamically unloading overlays, it is important that freed pins are
+restored to being inputs to prevent functions from being enabled in
+multiple places at once.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/pinctrl/bcm/pinctrl-bcm2835.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+@@ -831,6 +831,15 @@ static const struct pinctrl_ops bcm2835_
+       .dt_free_map = bcm2835_pctl_dt_free_map,
+ };
++static void bcm2835_pmx_free(struct pinctrl_dev *pctldev,
++              unsigned offset)
++{
++      struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
++
++      /* disable by setting to GPIO_IN */
++      bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
++}
++
+ static int bcm2835_pmx_get_functions_count(struct pinctrl_dev *pctldev)
+ {
+       return BCM2835_FSEL_COUNT;
+@@ -890,6 +899,7 @@ static int bcm2835_pmx_gpio_set_directio
+ }
+ static const struct pinmux_ops bcm2835_pmx_ops = {
++      .free = bcm2835_pmx_free,
+       .get_functions_count = bcm2835_pmx_get_functions_count,
+       .get_function_name = bcm2835_pmx_get_function_name,
+       .get_function_groups = bcm2835_pmx_get_function_groups,
diff --git a/target/linux/brcm2708/patches-4.4/0318-BCM270X_DT-i2c0-bcm2708-pin-group-params.patch b/target/linux/brcm2708/patches-4.4/0318-BCM270X_DT-i2c0-bcm2708-pin-group-params.patch
new file mode 100644 (file)
index 0000000..fdebd34
--- /dev/null
@@ -0,0 +1,99 @@
+From 9b6cc71b7159bebe78cd1ee823a479c0ca485c82 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 6 May 2016 12:53:16 +0100
+Subject: [PATCH] BCM270X_DT: i2c0-bcm2708 - pin group params
+
+Add parameters to set pin groups as a unit, setting the pin function
+appropriately. The parameters are:
+  pins_0_1
+  pins_28_29
+  pins_44_45
+  pins_46_47
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/README                  | 11 ++++--
+ .../arm/boot/dts/overlays/i2c0-bcm2708-overlay.dts | 43 +++++++++++++++++-----
+ 2 files changed, 42 insertions(+), 12 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -449,10 +449,15 @@ Params: ds1307                  Select t
+ Name:   i2c0-bcm2708
+-Info:   Enable the i2c_bcm2708 driver for the i2c0 bus
++Info:   Enable the i2c_bcm2708 driver for the i2c0 bus. Not all pin combinations
++        are usable on all platforms.
+ Load:   dtoverlay=i2c0-bcm2708,<param>=<val>
+-Params: sda0_pin                GPIO pin for SDA0 (0, 28 [or 44] - default 0)
+-        scl0_pin                GPIO pin for SCL0 (1, 29 [or 45] - default 1)
++Params: sda0_pin                GPIO pin for SDA0 (deprecated - use pins_*)
++        scl0_pin                GPIO pin for SCL0 (deprecated - use pins_*)
++        pins_0_1                Use pins 0 and 1 (default)
++        pins_28_29              Use pins 28 and 29
++        pins_44_45              Use pins 44 and 45
++        pins_46_47              Use pins 46 and 47
+ Name:   i2c1-bcm2708
+--- a/arch/arm/boot/dts/overlays/i2c0-bcm2708-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c0-bcm2708-overlay.dts
+@@ -14,23 +14,48 @@
+    fragment@0 {
+       target = <&i2c0>;
+       __overlay__ {
+-         pinctrl-0 = <&i2c0_pins>;
+          status = "okay";
+       };
+    };
+    fragment@1 {
+-      target = <&gpio>;
+-      __overlay__ {
+-         i2c0_pins: i2c0 {
+-            brcm,pins = <0 1>;
+-            brcm,function = <4>; /* alt0 */
+-         };
++      target = <&i2c0_pins>;
++      frag1: __overlay__ {
++         brcm,pins = <0 1>;
++         brcm,function = <4>; /* alt0 */
++      };
++   };
++
++   fragment@2 {
++      target = <&i2c0_pins>;
++      __dormant__ {
++         brcm,pins = <28 29>;
++         brcm,function = <4>; /* alt0 */
++      };
++   };
++
++   fragment@3 {
++      target = <&i2c0_pins>;
++      __dormant__ {
++         brcm,pins = <44 45>;
++         brcm,function = <5>; /* alt1 */
++      };
++   };
++
++   fragment@4 {
++      target = <&i2c0_pins>;
++      __dormant__ {
++         brcm,pins = <46 47>;
++         brcm,function = <4>; /* alt0 */
+       };
+    };
+    __overrides__ {
+-      sda0_pin = <&i2c0_pins>,"brcm,pins:0";
+-      scl0_pin = <&i2c0_pins>,"brcm,pins:4";
++      sda0_pin = <&frag1>,"brcm,pins:0";
++      scl0_pin = <&frag1>,"brcm,pins:4";
++      pins_0_1   = <0>,"+1-2-3-4";
++      pins_28_29 = <0>,"-1+2-3-4";
++      pins_44_45 = <0>,"-1-2+3-4";
++      pins_46_47 = <0>,"-1-2-3+4";
+    };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0318-pinctrl-bcm2835-Return-pins-to-inputs-when-freed.patch b/target/linux/brcm2708/patches-4.4/0318-pinctrl-bcm2835-Return-pins-to-inputs-when-freed.patch
deleted file mode 100644 (file)
index 89bc34a..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-From a336b35810263be890a30356837c75dc54b2e3be Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 6 May 2016 12:32:47 +0100
-Subject: [PATCH 318/423] pinctrl-bcm2835: Return pins to inputs when freed
-
-When dynamically unloading overlays, it is important that freed pins are
-restored to being inputs to prevent functions from being enabled in
-multiple places at once.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/pinctrl/bcm/pinctrl-bcm2835.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
---- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
-+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
-@@ -831,6 +831,15 @@ static const struct pinctrl_ops bcm2835_
-       .dt_free_map = bcm2835_pctl_dt_free_map,
- };
-+static void bcm2835_pmx_free(struct pinctrl_dev *pctldev,
-+              unsigned offset)
-+{
-+      struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
-+
-+      /* disable by setting to GPIO_IN */
-+      bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
-+}
-+
- static int bcm2835_pmx_get_functions_count(struct pinctrl_dev *pctldev)
- {
-       return BCM2835_FSEL_COUNT;
-@@ -890,6 +899,7 @@ static int bcm2835_pmx_gpio_set_directio
- }
- static const struct pinmux_ops bcm2835_pmx_ops = {
-+      .free = bcm2835_pmx_free,
-       .get_functions_count = bcm2835_pmx_get_functions_count,
-       .get_function_name = bcm2835_pmx_get_function_name,
-       .get_function_groups = bcm2835_pmx_get_function_groups,
diff --git a/target/linux/brcm2708/patches-4.4/0319-BCM270X_DT-i2c0-bcm2708-pin-group-params.patch b/target/linux/brcm2708/patches-4.4/0319-BCM270X_DT-i2c0-bcm2708-pin-group-params.patch
deleted file mode 100644 (file)
index 04f2e11..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-From e239ab77f367aff3bcb1d2ed807c438cf0f2ffe8 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 6 May 2016 12:53:16 +0100
-Subject: [PATCH 319/423] BCM270X_DT: i2c0-bcm2708 - pin group params
-
-Add parameters to set pin groups as a unit, setting the pin function
-appropriately. The parameters are:
-  pins_0_1
-  pins_28_29
-  pins_44_45
-  pins_46_47
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/README                  | 11 ++++--
- .../arm/boot/dts/overlays/i2c0-bcm2708-overlay.dts | 43 +++++++++++++++++-----
- 2 files changed, 42 insertions(+), 12 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -449,10 +449,15 @@ Params: ds1307                  Select t
- Name:   i2c0-bcm2708
--Info:   Enable the i2c_bcm2708 driver for the i2c0 bus
-+Info:   Enable the i2c_bcm2708 driver for the i2c0 bus. Not all pin combinations
-+        are usable on all platforms.
- Load:   dtoverlay=i2c0-bcm2708,<param>=<val>
--Params: sda0_pin                GPIO pin for SDA0 (0, 28 [or 44] - default 0)
--        scl0_pin                GPIO pin for SCL0 (1, 29 [or 45] - default 1)
-+Params: sda0_pin                GPIO pin for SDA0 (deprecated - use pins_*)
-+        scl0_pin                GPIO pin for SCL0 (deprecated - use pins_*)
-+        pins_0_1                Use pins 0 and 1 (default)
-+        pins_28_29              Use pins 28 and 29
-+        pins_44_45              Use pins 44 and 45
-+        pins_46_47              Use pins 46 and 47
- Name:   i2c1-bcm2708
---- a/arch/arm/boot/dts/overlays/i2c0-bcm2708-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/i2c0-bcm2708-overlay.dts
-@@ -14,23 +14,48 @@
-    fragment@0 {
-       target = <&i2c0>;
-       __overlay__ {
--         pinctrl-0 = <&i2c0_pins>;
-          status = "okay";
-       };
-    };
-    fragment@1 {
--      target = <&gpio>;
--      __overlay__ {
--         i2c0_pins: i2c0 {
--            brcm,pins = <0 1>;
--            brcm,function = <4>; /* alt0 */
--         };
-+      target = <&i2c0_pins>;
-+      frag1: __overlay__ {
-+         brcm,pins = <0 1>;
-+         brcm,function = <4>; /* alt0 */
-+      };
-+   };
-+
-+   fragment@2 {
-+      target = <&i2c0_pins>;
-+      __dormant__ {
-+         brcm,pins = <28 29>;
-+         brcm,function = <4>; /* alt0 */
-+      };
-+   };
-+
-+   fragment@3 {
-+      target = <&i2c0_pins>;
-+      __dormant__ {
-+         brcm,pins = <44 45>;
-+         brcm,function = <5>; /* alt1 */
-+      };
-+   };
-+
-+   fragment@4 {
-+      target = <&i2c0_pins>;
-+      __dormant__ {
-+         brcm,pins = <46 47>;
-+         brcm,function = <4>; /* alt0 */
-       };
-    };
-    __overrides__ {
--      sda0_pin = <&i2c0_pins>,"brcm,pins:0";
--      scl0_pin = <&i2c0_pins>,"brcm,pins:4";
-+      sda0_pin = <&frag1>,"brcm,pins:0";
-+      scl0_pin = <&frag1>,"brcm,pins:4";
-+      pins_0_1   = <0>,"+1-2-3-4";
-+      pins_28_29 = <0>,"-1+2-3-4";
-+      pins_44_45 = <0>,"-1-2+3-4";
-+      pins_46_47 = <0>,"-1-2-3+4";
-    };
- };
diff --git a/target/linux/brcm2708/patches-4.4/0319-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch b/target/linux/brcm2708/patches-4.4/0319-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch
new file mode 100644 (file)
index 0000000..13ee212
--- /dev/null
@@ -0,0 +1,30 @@
+From 708cc4c531fdf3b6061589031cd15b9382e042b8 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 6 May 2016 12:40:37 +0100
+Subject: [PATCH] config: Add CONFIG_DRM_LOAD_EDID_FIRMWARE
+
+---
+ 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
+@@ -815,6 +815,7 @@ CONFIG_VIDEO_TW9906=m
+ CONFIG_VIDEO_OV7640=m
+ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
++CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -807,6 +807,7 @@ CONFIG_VIDEO_TW9906=m
+ CONFIG_VIDEO_OV7640=m
+ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
++CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
diff --git a/target/linux/brcm2708/patches-4.4/0320-Revert-rpi-update-vc_vchi_audioserv_defs.h.patch b/target/linux/brcm2708/patches-4.4/0320-Revert-rpi-update-vc_vchi_audioserv_defs.h.patch
new file mode 100644 (file)
index 0000000..a2e5b6e
--- /dev/null
@@ -0,0 +1,63 @@
+From 61a0378d024e96bfe068fac75a4ed401eef46676 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 6 May 2016 17:18:57 +0100
+Subject: [PATCH] Revert "rpi: update vc_vchi_audioserv_defs.h"
+
+This reverts commit 64fa9f963dffab0145f7960a593422064bb0aa8d.
+---
+ sound/arm/vc_vchi_audioserv_defs.h | 13 ++-----------
+ 1 file changed, 2 insertions(+), 11 deletions(-)
+
+--- a/sound/arm/vc_vchi_audioserv_defs.h
++++ b/sound/arm/vc_vchi_audioserv_defs.h
+@@ -16,7 +16,7 @@
+ #define _VC_AUDIO_DEFS_H_
+ #define VC_AUDIOSERV_MIN_VER 1
+-#define VC_AUDIOSERV_VER 3
++#define VC_AUDIOSERV_VER 2
+ // FourCC code used for VCHI connection
+ #define VC_AUDIO_SERVER_NAME  MAKE_FOURCC("AUDS")
+@@ -36,7 +36,6 @@ typedef enum {
+       VC_AUDIO_MSG_TYPE_START,        // Configure audio
+       VC_AUDIO_MSG_TYPE_STOP, // Configure audio
+       VC_AUDIO_MSG_TYPE_WRITE,        // Configure audio
+-      VC_AUDIO_MSG_TYPE_LATENCY,      // request latency in cycles
+       VC_AUDIO_MSG_TYPE_MAX
+ } VC_AUDIO_MSG_TYPE;
+@@ -45,7 +44,6 @@ typedef struct {
+       uint32_t channels;
+       uint32_t samplerate;
+       uint32_t bps;
+-      uint32_t channelmap;
+ } VC_AUDIO_CONFIG_T;
+@@ -86,12 +84,6 @@ typedef struct {
+       uint16_t max_packet;
+ } VC_AUDIO_WRITE_T;
+-// query latency in samples of sink
+-typedef struct
+-{
+-      uint32_t dummy;
+-} VC_AUDIO_LATENCY_T;
+-
+ // Generic result for a request (VC->HOST)
+ typedef struct {
+       int32_t success;        // Success value
+@@ -116,10 +108,9 @@ typedef struct {
+               VC_AUDIO_START_T start;
+               VC_AUDIO_STOP_T stop;
+               VC_AUDIO_WRITE_T write;
+-              VC_AUDIO_LATENCY_T latency;
+               VC_AUDIO_RESULT_T result;
+               VC_AUDIO_COMPLETE_T complete;
+       } u;
+ } VC_AUDIO_MSG_T;
+-#endif // _VC_AUDIO_DEFS_H_
+\ No newline at end of file
++#endif // _VC_AUDIO_DEFS_H_
diff --git a/target/linux/brcm2708/patches-4.4/0320-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch b/target/linux/brcm2708/patches-4.4/0320-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch
deleted file mode 100644 (file)
index 82df548..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From e43e0bc1fe4a0a1c9e02b7a66dc9481e54c6f8cd Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Fri, 6 May 2016 12:40:37 +0100
-Subject: [PATCH 320/423] config: Add CONFIG_DRM_LOAD_EDID_FIRMWARE
-
----
- 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
-@@ -815,6 +815,7 @@ CONFIG_VIDEO_TW9906=m
- CONFIG_VIDEO_OV7640=m
- CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
-+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -807,6 +807,7 @@ CONFIG_VIDEO_TW9906=m
- CONFIG_VIDEO_OV7640=m
- CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
-+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
diff --git a/target/linux/brcm2708/patches-4.4/0321-Revert-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch b/target/linux/brcm2708/patches-4.4/0321-Revert-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch
new file mode 100644 (file)
index 0000000..bcfe02b
--- /dev/null
@@ -0,0 +1,31 @@
+From d796713d0e6da4b9fdfd88350f0321d8f63ccf91 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 6 May 2016 17:21:58 +0100
+Subject: [PATCH] Revert "config: Add CONFIG_DRM_LOAD_EDID_FIRMWARE"
+
+This reverts commit 417aed4cb35a479e001c8389fd8d97c3ea612999.
+---
+ arch/arm/configs/bcm2709_defconfig | 1 -
+ arch/arm/configs/bcmrpi_defconfig  | 1 -
+ 2 files changed, 2 deletions(-)
+
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -815,7 +815,6 @@ CONFIG_VIDEO_TW9906=m
+ CONFIG_VIDEO_OV7640=m
+ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
+-CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -807,7 +807,6 @@ CONFIG_VIDEO_TW9906=m
+ CONFIG_VIDEO_OV7640=m
+ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
+-CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
diff --git a/target/linux/brcm2708/patches-4.4/0321-Revert-rpi-update-vc_vchi_audioserv_defs.h.patch b/target/linux/brcm2708/patches-4.4/0321-Revert-rpi-update-vc_vchi_audioserv_defs.h.patch
deleted file mode 100644 (file)
index 0820c8a..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-From 07abcf3c2c3ae76a2be75e4fcc85ecd49d727a8a Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Fri, 6 May 2016 17:18:57 +0100
-Subject: [PATCH 321/423] Revert "rpi: update vc_vchi_audioserv_defs.h"
-
-This reverts commit 64fa9f963dffab0145f7960a593422064bb0aa8d.
----
- sound/arm/vc_vchi_audioserv_defs.h | 13 ++-----------
- 1 file changed, 2 insertions(+), 11 deletions(-)
-
---- a/sound/arm/vc_vchi_audioserv_defs.h
-+++ b/sound/arm/vc_vchi_audioserv_defs.h
-@@ -16,7 +16,7 @@
- #define _VC_AUDIO_DEFS_H_
- #define VC_AUDIOSERV_MIN_VER 1
--#define VC_AUDIOSERV_VER 3
-+#define VC_AUDIOSERV_VER 2
- // FourCC code used for VCHI connection
- #define VC_AUDIO_SERVER_NAME  MAKE_FOURCC("AUDS")
-@@ -36,7 +36,6 @@ typedef enum {
-       VC_AUDIO_MSG_TYPE_START,        // Configure audio
-       VC_AUDIO_MSG_TYPE_STOP, // Configure audio
-       VC_AUDIO_MSG_TYPE_WRITE,        // Configure audio
--      VC_AUDIO_MSG_TYPE_LATENCY,      // request latency in cycles
-       VC_AUDIO_MSG_TYPE_MAX
- } VC_AUDIO_MSG_TYPE;
-@@ -45,7 +44,6 @@ typedef struct {
-       uint32_t channels;
-       uint32_t samplerate;
-       uint32_t bps;
--      uint32_t channelmap;
- } VC_AUDIO_CONFIG_T;
-@@ -86,12 +84,6 @@ typedef struct {
-       uint16_t max_packet;
- } VC_AUDIO_WRITE_T;
--// query latency in samples of sink
--typedef struct
--{
--      uint32_t dummy;
--} VC_AUDIO_LATENCY_T;
--
- // Generic result for a request (VC->HOST)
- typedef struct {
-       int32_t success;        // Success value
-@@ -116,10 +108,9 @@ typedef struct {
-               VC_AUDIO_START_T start;
-               VC_AUDIO_STOP_T stop;
-               VC_AUDIO_WRITE_T write;
--              VC_AUDIO_LATENCY_T latency;
-               VC_AUDIO_RESULT_T result;
-               VC_AUDIO_COMPLETE_T complete;
-       } u;
- } VC_AUDIO_MSG_T;
--#endif // _VC_AUDIO_DEFS_H_
-\ No newline at end of file
-+#endif // _VC_AUDIO_DEFS_H_
diff --git a/target/linux/brcm2708/patches-4.4/0322-ARM-adau1977-adc-Add-basic-machine-driver-for-adau19.patch b/target/linux/brcm2708/patches-4.4/0322-ARM-adau1977-adc-Add-basic-machine-driver-for-adau19.patch
new file mode 100644 (file)
index 0000000..e6ba866
--- /dev/null
@@ -0,0 +1,285 @@
+From e6728a3fb4b185e632a63b7d0d61838d8d690548 Mon Sep 17 00:00:00 2001
+From: Andrey Grodzovsky <andrey2805@gmail.com>
+Date: Tue, 3 May 2016 22:10:59 -0400
+Subject: [PATCH] ARM: adau1977-adc: Add basic machine driver for adau1977
+ codec driver.
+
+This commit adds basic support for the codec usage including: Device tree overlay,
+binding I2S bus and setting I2S mode, clock source and frequency setting according
+to spec.
+
+Signed-off-by: Andrey Grodzovsky <andrey2805@gmail.com>
+---
+ arch/arm/boot/dts/overlays/Makefile                |   1 +
+ arch/arm/boot/dts/overlays/README                  |   7 ++
+ .../arm/boot/dts/overlays/adau1977-adc-overlay.dts |  53 +++++++++
+ arch/arm/configs/bcm2709_defconfig                 |   1 +
+ arch/arm/configs/bcmrpi_defconfig                  |   1 +
+ sound/soc/bcm/Kconfig                              |   7 ++
+ sound/soc/bcm/Makefile                             |   2 +
+ sound/soc/bcm/adau1977-adc.c                       | 125 +++++++++++++++++++++
+ 8 files changed, 197 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts
+ create mode 100644 sound/soc/bcm/adau1977-adc.c
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -12,6 +12,7 @@ ifeq ($(CONFIG_ARCH_BCM2835),y)
+    RPI_DT_OVERLAYS=y
+ endif
++dtbo-$(RPI_DT_OVERLAYS) += adau1977-adc.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -161,6 +161,13 @@ Params:
+         and the other i2c baudrate parameters.
++Name:   adau1977-adc
++Info:   Overlay for activation of ADAU1977 ADC codec over I2C for control
++        and I2S for data.
++Load:   dtoverlay=adau1977-adc
++Params: <None>
++
++
+ Name:   ads7846
+ Info:   ADS7846 Touch controller
+ Load:   dtoverlay=ads7846,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts
+@@ -0,0 +1,53 @@
++// Definitions for ADAU1977 ADC
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++    
++      fragment@0 {
++              target = <&soc>;
++              
++              __overlay__ {
++                      codec_supply: fixedregulator@0 {
++                              compatible = "regulator-fixed";
++                              regulator-name = "AVDD";
++                              regulator-min-microvolt = <3300000>;
++                              regulator-max-microvolt = <3300000>;
++                      };
++              };
++      };
++      
++      fragment@1 {
++              target = <&i2c>;
++              
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++                      
++                      adau1977: codec@11 {
++                              compatible = "adi,adau1977";
++                              reg = <0x11>;
++                              reset-gpios = <&gpio 5 0>;
++                              AVDD-supply = <&codec_supply>;
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@3 {
++              target = <&sound>;
++              __overlay__ {
++                      compatible = "adi,adau1977-adc";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -861,6 +861,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
+ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
++CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+ CONFIG_SND_SIMPLE_CARD=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -853,6 +853,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
+ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
++CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+ CONFIG_SND_SIMPLE_CARD=m
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -78,3 +78,10 @@ config SND_BCM2708_SOC_RASPIDAC3
+       select SND_SOC_TPA6130A2
+       help
+         Say Y or M if you want to add support for RaspiDAC Rev.3x.
++
++config SND_BCM2708_SOC_ADAU1977_ADC
++      tristate "Support for ADAU1977 ADC"
++      depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
++      select SND_SOC_ADAU1977_I2C
++      help
++        Say Y or M if you want to add support for ADAU1977 ADC.
+--- a/sound/soc/bcm/Makefile
++++ b/sound/soc/bcm/Makefile
+@@ -4,6 +4,7 @@ snd-soc-bcm2835-i2s-objs := bcm2835-i2s.
+ obj-$(CONFIG_SND_BCM2835_SOC_I2S) += snd-soc-bcm2835-i2s.o
+ # BCM2708 Machine Support
++snd-soc-adau1977-adc-objs := adau1977-adc.o
+ snd-soc-hifiberry-dac-objs := hifiberry_dac.o
+ snd-soc-hifiberry-dacplus-objs := hifiberry_dacplus.o
+ snd-soc-hifiberry-digi-objs := hifiberry_digi.o
+@@ -15,6 +16,7 @@ snd-soc-rpi-proto-objs := rpi-proto.o
+ snd-soc-iqaudio-dac-objs := iqaudio-dac.o
+ snd-soc-raspidac3-objs := raspidac3.o
++obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS) += snd-soc-hifiberry-dacplus.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI) += snd-soc-hifiberry-digi.o
+--- /dev/null
++++ b/sound/soc/bcm/adau1977-adc.c
+@@ -0,0 +1,125 @@
++/*
++ * ASoC Driver for ADAU1977 ADC
++ *
++ * Author:    Andrey Grodzovsky <andrey2805@gmail.com>
++ *            Copyright 2016
++ *
++ * This file is based on hifibery_dac driver by Florian Meier.
++ * 
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/jack.h>
++
++enum adau1977_clk_id {
++    ADAU1977_SYSCLK,
++};
++ 
++enum adau1977_sysclk_src {
++    ADAU1977_SYSCLK_SRC_MCLK,
++    ADAU1977_SYSCLK_SRC_LRCLK,
++};
++
++static int eval_adau1977_init(struct snd_soc_pcm_runtime *rtd)
++{
++      int ret;
++      struct snd_soc_dai *codec_dai = rtd->codec_dai;
++      
++      ret = snd_soc_dai_set_tdm_slot(codec_dai, 0, 0, 0, 0);
++      if (ret < 0)
++              return ret;
++
++      return snd_soc_codec_set_sysclk(rtd->codec, ADAU1977_SYSCLK,
++                      ADAU1977_SYSCLK_SRC_MCLK, 11289600, SND_SOC_CLOCK_IN);
++}
++ 
++static struct snd_soc_dai_link snd_rpi_adau1977_dai[] = {
++      {
++      .name = "adau1977",
++      .stream_name = "ADAU1977", 
++      .cpu_dai_name = "bcm2708-i2s.0", 
++      .codec_dai_name = "adau1977-hifi",
++      .platform_name = "bcm2708-i2s.0",
++      .codec_name = "adau1977.1-0011",
++      .init = eval_adau1977_init,
++      .dai_fmt = SND_SOC_DAIFMT_I2S |
++              SND_SOC_DAIFMT_NB_NF |
++              SND_SOC_DAIFMT_CBM_CFM,
++      },
++};
++
++/* audio machine driver */
++static struct snd_soc_card snd_adau1977_adc = {
++      .name         = "snd_rpi_adau1977_adc",
++      .owner        = THIS_MODULE,
++      .dai_link     = snd_rpi_adau1977_dai,
++      .num_links    = ARRAY_SIZE(snd_rpi_adau1977_dai),
++};
++
++static int snd_adau1977_adc_probe(struct platform_device *pdev)
++{
++      int ret = 0;
++
++      snd_adau1977_adc.dev = &pdev->dev;
++      if (pdev->dev.of_node) {
++          struct device_node *i2s_node;
++          struct snd_soc_dai_link *dai = &snd_rpi_adau1977_dai[0];
++          i2s_node = of_parse_phandle(pdev->dev.of_node,
++                                      "i2s-controller", 0);
++
++          if (i2s_node) {
++              dai->cpu_dai_name = NULL;
++              dai->cpu_of_node = i2s_node;
++              dai->platform_name = NULL;
++              dai->platform_of_node = i2s_node;
++          }
++      }
++
++      ret = snd_soc_register_card(&snd_adau1977_adc);
++      if (ret)
++              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
++
++      return ret;
++}
++
++static int snd_adau1977_adc_remove(struct platform_device *pdev)
++{
++      return snd_soc_unregister_card(&snd_adau1977_adc);
++}
++
++static const struct of_device_id snd_adau1977_adc_of_match[] = {
++      { .compatible = "adi,adau1977-adc", },
++      {},
++};
++
++MODULE_DEVICE_TABLE(of, snd_adau1977_adc_of_match);
++
++static struct platform_driver snd_adau1977_adc_driver = {
++        .driver = {
++                .name   = "snd-adau1977-adc",
++                .owner  = THIS_MODULE,
++              .of_match_table = snd_adau1977_adc_of_match,
++        },
++        .probe          = snd_adau1977_adc_probe,
++        .remove         = snd_adau1977_adc_remove,
++};
++
++module_platform_driver(snd_adau1977_adc_driver);
++
++MODULE_AUTHOR("Andrey Grodzovsky <andrey2805@gmail.com>");
++MODULE_DESCRIPTION("ASoC Driver for ADAU1977 ADC");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0322-Revert-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch b/target/linux/brcm2708/patches-4.4/0322-Revert-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch
deleted file mode 100644 (file)
index 54bf7a8..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From 19526f5f7bdd0ffe5f079197598f1276fed9bcff Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Fri, 6 May 2016 17:21:58 +0100
-Subject: [PATCH 322/423] Revert "config: Add CONFIG_DRM_LOAD_EDID_FIRMWARE"
-
-This reverts commit 417aed4cb35a479e001c8389fd8d97c3ea612999.
----
- arch/arm/configs/bcm2709_defconfig | 1 -
- arch/arm/configs/bcmrpi_defconfig  | 1 -
- 2 files changed, 2 deletions(-)
-
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -815,7 +815,6 @@ CONFIG_VIDEO_TW9906=m
- CONFIG_VIDEO_OV7640=m
- CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
--CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -807,7 +807,6 @@ CONFIG_VIDEO_TW9906=m
- CONFIG_VIDEO_OV7640=m
- CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
--CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
diff --git a/target/linux/brcm2708/patches-4.4/0323-ARM-adau1977-adc-Add-basic-machine-driver-for-adau19.patch b/target/linux/brcm2708/patches-4.4/0323-ARM-adau1977-adc-Add-basic-machine-driver-for-adau19.patch
deleted file mode 100644 (file)
index 76fdef6..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-From 8c2a8f26d78f29aa349b184a9e87586df735b51e Mon Sep 17 00:00:00 2001
-From: Andrey Grodzovsky <andrey2805@gmail.com>
-Date: Tue, 3 May 2016 22:10:59 -0400
-Subject: [PATCH 323/423] ARM: adau1977-adc: Add basic machine driver for
- adau1977 codec driver.
-
-This commit adds basic support for the codec usage including: Device tree overlay,
-binding I2S bus and setting I2S mode, clock source and frequency setting according
-to spec.
-
-Signed-off-by: Andrey Grodzovsky <andrey2805@gmail.com>
----
- arch/arm/boot/dts/overlays/Makefile                |   1 +
- arch/arm/boot/dts/overlays/README                  |   7 ++
- .../arm/boot/dts/overlays/adau1977-adc-overlay.dts |  53 +++++++++
- arch/arm/configs/bcm2709_defconfig                 |   1 +
- arch/arm/configs/bcmrpi_defconfig                  |   1 +
- sound/soc/bcm/Kconfig                              |   7 ++
- sound/soc/bcm/Makefile                             |   2 +
- sound/soc/bcm/adau1977-adc.c                       | 125 +++++++++++++++++++++
- 8 files changed, 197 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts
- create mode 100644 sound/soc/bcm/adau1977-adc.c
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -12,6 +12,7 @@ ifeq ($(CONFIG_ARCH_BCM2835),y)
-    RPI_DT_OVERLAYS=y
- endif
-+dtbo-$(RPI_DT_OVERLAYS) += adau1977-adc.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -161,6 +161,13 @@ Params:
-         and the other i2c baudrate parameters.
-+Name:   adau1977-adc
-+Info:   Overlay for activation of ADAU1977 ADC codec over I2C for control
-+        and I2S for data.
-+Load:   dtoverlay=adau1977-adc
-+Params: <None>
-+
-+
- Name:   ads7846
- Info:   ADS7846 Touch controller
- Load:   dtoverlay=ads7846,<param>=<val>
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts
-@@ -0,0 +1,53 @@
-+// Definitions for ADAU1977 ADC
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+    
-+      fragment@0 {
-+              target = <&soc>;
-+              
-+              __overlay__ {
-+                      codec_supply: fixedregulator@0 {
-+                              compatible = "regulator-fixed";
-+                              regulator-name = "AVDD";
-+                              regulator-min-microvolt = <3300000>;
-+                              regulator-max-microvolt = <3300000>;
-+                      };
-+              };
-+      };
-+      
-+      fragment@1 {
-+              target = <&i2c>;
-+              
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+                      
-+                      adau1977: codec@11 {
-+                              compatible = "adi,adau1977";
-+                              reg = <0x11>;
-+                              reset-gpios = <&gpio 5 0>;
-+                              AVDD-supply = <&codec_supply>;
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@3 {
-+              target = <&sound>;
-+              __overlay__ {
-+                      compatible = "adi,adau1977-adc";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+};
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -861,6 +861,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
- CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
-+CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
- CONFIG_SND_SIMPLE_CARD=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -853,6 +853,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
- CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
-+CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
- CONFIG_SND_SIMPLE_CARD=m
---- a/sound/soc/bcm/Kconfig
-+++ b/sound/soc/bcm/Kconfig
-@@ -78,3 +78,10 @@ config SND_BCM2708_SOC_RASPIDAC3
-       select SND_SOC_TPA6130A2
-       help
-         Say Y or M if you want to add support for RaspiDAC Rev.3x.
-+
-+config SND_BCM2708_SOC_ADAU1977_ADC
-+      tristate "Support for ADAU1977 ADC"
-+      depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-+      select SND_SOC_ADAU1977_I2C
-+      help
-+        Say Y or M if you want to add support for ADAU1977 ADC.
---- a/sound/soc/bcm/Makefile
-+++ b/sound/soc/bcm/Makefile
-@@ -4,6 +4,7 @@ snd-soc-bcm2835-i2s-objs := bcm2835-i2s.
- obj-$(CONFIG_SND_BCM2835_SOC_I2S) += snd-soc-bcm2835-i2s.o
- # BCM2708 Machine Support
-+snd-soc-adau1977-adc-objs := adau1977-adc.o
- snd-soc-hifiberry-dac-objs := hifiberry_dac.o
- snd-soc-hifiberry-dacplus-objs := hifiberry_dacplus.o
- snd-soc-hifiberry-digi-objs := hifiberry_digi.o
-@@ -15,6 +16,7 @@ snd-soc-rpi-proto-objs := rpi-proto.o
- snd-soc-iqaudio-dac-objs := iqaudio-dac.o
- snd-soc-raspidac3-objs := raspidac3.o
-+obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS) += snd-soc-hifiberry-dacplus.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI) += snd-soc-hifiberry-digi.o
---- /dev/null
-+++ b/sound/soc/bcm/adau1977-adc.c
-@@ -0,0 +1,125 @@
-+/*
-+ * ASoC Driver for ADAU1977 ADC
-+ *
-+ * Author:    Andrey Grodzovsky <andrey2805@gmail.com>
-+ *            Copyright 2016
-+ *
-+ * This file is based on hifibery_dac driver by Florian Meier.
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/jack.h>
-+
-+enum adau1977_clk_id {
-+    ADAU1977_SYSCLK,
-+};
-+ 
-+enum adau1977_sysclk_src {
-+    ADAU1977_SYSCLK_SRC_MCLK,
-+    ADAU1977_SYSCLK_SRC_LRCLK,
-+};
-+
-+static int eval_adau1977_init(struct snd_soc_pcm_runtime *rtd)
-+{
-+      int ret;
-+      struct snd_soc_dai *codec_dai = rtd->codec_dai;
-+      
-+      ret = snd_soc_dai_set_tdm_slot(codec_dai, 0, 0, 0, 0);
-+      if (ret < 0)
-+              return ret;
-+
-+      return snd_soc_codec_set_sysclk(rtd->codec, ADAU1977_SYSCLK,
-+                      ADAU1977_SYSCLK_SRC_MCLK, 11289600, SND_SOC_CLOCK_IN);
-+}
-+ 
-+static struct snd_soc_dai_link snd_rpi_adau1977_dai[] = {
-+      {
-+      .name = "adau1977",
-+      .stream_name = "ADAU1977", 
-+      .cpu_dai_name = "bcm2708-i2s.0", 
-+      .codec_dai_name = "adau1977-hifi",
-+      .platform_name = "bcm2708-i2s.0",
-+      .codec_name = "adau1977.1-0011",
-+      .init = eval_adau1977_init,
-+      .dai_fmt = SND_SOC_DAIFMT_I2S |
-+              SND_SOC_DAIFMT_NB_NF |
-+              SND_SOC_DAIFMT_CBM_CFM,
-+      },
-+};
-+
-+/* audio machine driver */
-+static struct snd_soc_card snd_adau1977_adc = {
-+      .name         = "snd_rpi_adau1977_adc",
-+      .owner        = THIS_MODULE,
-+      .dai_link     = snd_rpi_adau1977_dai,
-+      .num_links    = ARRAY_SIZE(snd_rpi_adau1977_dai),
-+};
-+
-+static int snd_adau1977_adc_probe(struct platform_device *pdev)
-+{
-+      int ret = 0;
-+
-+      snd_adau1977_adc.dev = &pdev->dev;
-+      if (pdev->dev.of_node) {
-+          struct device_node *i2s_node;
-+          struct snd_soc_dai_link *dai = &snd_rpi_adau1977_dai[0];
-+          i2s_node = of_parse_phandle(pdev->dev.of_node,
-+                                      "i2s-controller", 0);
-+
-+          if (i2s_node) {
-+              dai->cpu_dai_name = NULL;
-+              dai->cpu_of_node = i2s_node;
-+              dai->platform_name = NULL;
-+              dai->platform_of_node = i2s_node;
-+          }
-+      }
-+
-+      ret = snd_soc_register_card(&snd_adau1977_adc);
-+      if (ret)
-+              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n", ret);
-+
-+      return ret;
-+}
-+
-+static int snd_adau1977_adc_remove(struct platform_device *pdev)
-+{
-+      return snd_soc_unregister_card(&snd_adau1977_adc);
-+}
-+
-+static const struct of_device_id snd_adau1977_adc_of_match[] = {
-+      { .compatible = "adi,adau1977-adc", },
-+      {},
-+};
-+
-+MODULE_DEVICE_TABLE(of, snd_adau1977_adc_of_match);
-+
-+static struct platform_driver snd_adau1977_adc_driver = {
-+        .driver = {
-+                .name   = "snd-adau1977-adc",
-+                .owner  = THIS_MODULE,
-+              .of_match_table = snd_adau1977_adc_of_match,
-+        },
-+        .probe          = snd_adau1977_adc_probe,
-+        .remove         = snd_adau1977_adc_remove,
-+};
-+
-+module_platform_driver(snd_adau1977_adc_driver);
-+
-+MODULE_AUTHOR("Andrey Grodzovsky <andrey2805@gmail.com>");
-+MODULE_DESCRIPTION("ASoC Driver for ADAU1977 ADC");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0323-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch b/target/linux/brcm2708/patches-4.4/0323-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch
new file mode 100644 (file)
index 0000000..3278745
--- /dev/null
@@ -0,0 +1,60 @@
+From 691922255a15630c6f726c4c871ce2475d4fec72 Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Fri, 6 May 2016 09:42:55 +0100
+Subject: [PATCH] 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
+codec "Digital" volume control should not be limited to 0dB gain,
+and if specified will allow the full 24dB gain.
+
+Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+---
+ arch/arm/boot/dts/overlays/README                  | 17 +++++++++++++++--
+ arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts |  6 +++++-
+ 2 files changed, 20 insertions(+), 3 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -490,8 +490,21 @@ Params: <None>
+ Name:   iqaudio-dac
+ Info:   Configures the IQaudio DAC audio card
+-Load:   dtoverlay=iqaudio-dac
+-Params: <None>
++Load:   dtoverlay=iqaudio-dac,<param>
++Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
++                                Digital volume control. Enable with
++                                "dtoverlay=iqaudio-dac,24db_digital_gain"
++                                (The default behaviour is that the Digital
++                                volume control is limited to a maximum of
++                                0dB. ie. it can attenuate but not provide
++                                gain. For most users, this will be desired
++                                as it will prevent clipping. By appending
++                                the 24db_digital_gain parameter, the Digital
++                                volume control will allow up to 24dB of
++                                gain. If this parameter is enabled, it is the
++                                responsibility of the user to ensure that
++                                the Digital volume control is set to a value
++                                that does not result in clipping/distortion!)
+ Name:   iqaudio-dacplus
+--- a/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts
++++ b/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts
+@@ -30,10 +30,14 @@
+       fragment@2 {
+               target = <&sound>;
+-              __overlay__ {
++              frag2: __overlay__ {
+                       compatible = "iqaudio,iqaudio-dac";
+                       i2s-controller = <&i2s>;
+                       status = "okay";
+               };
+       };
++
++      __overrides__ {
++              24db_digital_gain = <&frag2>,"iqaudio,24db_digital_gain?";
++      };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0324-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch b/target/linux/brcm2708/patches-4.4/0324-Allow-up-to-24dB-digital-gain-to-be-applied-when-usi.patch
deleted file mode 100644 (file)
index ad4d3b1..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-From d81de2a4a1223296b17dac8e652b0b31911f6dd1 Mon Sep 17 00:00:00 2001
-From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
-Date: Fri, 6 May 2016 09:42:55 +0100
-Subject: [PATCH 324/423] 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
-codec "Digital" volume control should not be limited to 0dB gain,
-and if specified will allow the full 24dB gain.
-
-Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
----
- arch/arm/boot/dts/overlays/README                  | 17 +++++++++++++++--
- arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts |  6 +++++-
- 2 files changed, 20 insertions(+), 3 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -490,8 +490,21 @@ Params: <None>
- Name:   iqaudio-dac
- Info:   Configures the IQaudio DAC audio card
--Load:   dtoverlay=iqaudio-dac
--Params: <None>
-+Load:   dtoverlay=iqaudio-dac,<param>
-+Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
-+                                Digital volume control. Enable with
-+                                "dtoverlay=iqaudio-dac,24db_digital_gain"
-+                                (The default behaviour is that the Digital
-+                                volume control is limited to a maximum of
-+                                0dB. ie. it can attenuate but not provide
-+                                gain. For most users, this will be desired
-+                                as it will prevent clipping. By appending
-+                                the 24db_digital_gain parameter, the Digital
-+                                volume control will allow up to 24dB of
-+                                gain. If this parameter is enabled, it is the
-+                                responsibility of the user to ensure that
-+                                the Digital volume control is set to a value
-+                                that does not result in clipping/distortion!)
- Name:   iqaudio-dacplus
---- a/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts
-@@ -30,10 +30,14 @@
-       fragment@2 {
-               target = <&sound>;
--              __overlay__ {
-+              frag2: __overlay__ {
-                       compatible = "iqaudio,iqaudio-dac";
-                       i2s-controller = <&i2s>;
-                       status = "okay";
-               };
-       };
-+
-+      __overrides__ {
-+              24db_digital_gain = <&frag2>,"iqaudio,24db_digital_gain?";
-+      };
- };
diff --git a/target/linux/brcm2708/patches-4.4/0324-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch b/target/linux/brcm2708/patches-4.4/0324-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch
new file mode 100644 (file)
index 0000000..bfb7bf6
--- /dev/null
@@ -0,0 +1,30 @@
+From e84d0b3f337b2ad8f8b7879fb64bcd48a87919c6 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 6 May 2016 12:40:37 +0100
+Subject: [PATCH] config: Add CONFIG_DRM_LOAD_EDID_FIRMWARE
+
+---
+ 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
+@@ -815,6 +815,7 @@ CONFIG_VIDEO_TW9906=m
+ CONFIG_VIDEO_OV7640=m
+ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
++CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -807,6 +807,7 @@ CONFIG_VIDEO_TW9906=m
+ CONFIG_VIDEO_OV7640=m
+ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
++CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
diff --git a/target/linux/brcm2708/patches-4.4/0325-BCM270X_DT-Move-vc4-node-contents-to-bcm2708_common..patch b/target/linux/brcm2708/patches-4.4/0325-BCM270X_DT-Move-vc4-node-contents-to-bcm2708_common..patch
new file mode 100644 (file)
index 0000000..ef74e1e
--- /dev/null
@@ -0,0 +1,324 @@
+From a2d2ac2146d46c29d9fd086c777ca7643eb699db Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 6 May 2016 11:48:35 -0700
+Subject: [PATCH] BCM270X_DT: Move vc4 node contents to bcm2708_common.dtsi.
+
+This should clarify what's going on with the overlay: The hardware is
+always present, we're just enabling the DT node so that the vc4 driver
+probes.
+
+The interrupts are left in the overlay, because the firmware doesn't
+check node status before masking out the vc4 interrupts.
+
+By having the nodes in the common file, we'll be able to correctly
+connect the HDMI HPD GPIO so that we can detect whether an HDMI
+monitor is connected.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi              |  51 +++++++
+ arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts | 160 ++++++++++-----------
+ 2 files changed, 129 insertions(+), 82 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -1,4 +1,7 @@
++#include "dt-bindings/clock/bcm2835.h"
+ #include <dt-bindings/clock/bcm2835-aux.h>
++#include "dt-bindings/power/raspberrypi-power.h"
++#include "dt-bindings/gpio/gpio.h"
+ #include "skeleton.dtsi"
+ / {
+@@ -170,6 +173,18 @@
+                       status = "disabled";
+               };
++              pixelvalve0: pixelvalve@7e206000 {
++                      compatible = "brcm,bcm2835-pixelvalve0";
++                      reg = <0x7e206000 0x100>;
++                      status = "disabled";
++              };
++
++              pixelvalve1: pixelvalve@7e207000 {
++                      compatible = "brcm,bcm2835-pixelvalve1";
++                      reg = <0x7e207000 0x100>;
++                      status = "disabled";
++              };
++
+               pwm: pwm@7e20c000 {
+                       compatible = "brcm,bcm2835-pwm";
+                       reg = <0x7e20c000 0x28>;
+@@ -227,6 +242,12 @@
+                       status = "disabled";
+               };
++              hvs: hvs@7e400000 {
++                      compatible = "brcm,bcm2835-hvs";
++                      reg = <0x7e400000 0x6000>;
++                      status = "disabled";
++              };
++
+               i2c1: i2c@7e804000 {
+                       compatible = "brcm,bcm2708-i2c";
+                       reg = <0x7e804000 0x1000>;
+@@ -261,6 +282,25 @@
+                       status = "disabled";
+               };
++              pixelvalve2: pixelvalve@7e807000 {
++                      compatible = "brcm,bcm2835-pixelvalve2";
++                      reg = <0x7e807000 0x100>;
++                      status = "disabled";
++              };
++
++              hdmi: hdmi@7e902000 {
++                      compatible = "brcm,bcm2835-hdmi";
++                      reg = <0x7e902000 0x600>,
++                            <0x7e808000 0x100>;
++                      ddc = <&i2c2>;
++                      hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
++                      clocks = <&cprman BCM2835_PLLH_PIX>,
++                               <&cprman BCM2835_CLOCK_HSM>;
++                      clock-names = "pixel", "hdmi";
++                      power-domains = <&power RPI_POWER_DOMAIN_HDMI>;
++                      status = "disabled";
++              };
++
+               usb: usb@7e980000 {
+                       compatible = "brcm,bcm2708-usb";
+                       reg = <0x7e980000 0x10000>,
+@@ -269,6 +309,12 @@
+                                    <1 9>;
+               };
++              v3d: v3d@7ec00000 {
++                      compatible = "brcm,vc4-v3d";
++                      reg = <0x7ec00000 0x1000>;
++                      status = "disabled";
++              };
++
+               firmware: firmware {
+                       compatible = "raspberrypi,bcm2835-firmware";
+                       mboxes = <&mailbox>;
+@@ -303,6 +349,11 @@
+                       firmware = <&firmware>;
+               };
++              gpu: gpu {
++                      compatible = "brcm,bcm2835-vc4";
++                      status = "disabled";
++              };
++
+               /* Onboard audio */
+               audio: audio {
+                       compatible = "brcm,bcm2835-audio";
+--- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
++++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
+@@ -5,129 +5,125 @@
+ /dts-v1/;
+ /plugin/;
+-#include "dt-bindings/clock/bcm2835.h"
+-#include "dt-bindings/power/raspberrypi-power.h"
+-#include "dt-bindings/gpio/gpio.h"
+-
+ / {
+       compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
+       fragment@0 {
++              target-path = "/chosen";
++              __overlay__ {
++                      bootargs = "cma=256M@256M";
++              };
++      };
++
++      fragment@1 {
++              target-path = "/chosen";
++              __dormant__ {
++                      bootargs = "cma=192M@256M";
++              };
++      };
++
++      fragment@2 {
++              target-path = "/chosen";
++              __dormant__ {
++                      bootargs = "cma=128M@128M";
++              };
++      };
++
++      fragment@3 {
++              target-path = "/chosen";
++              __dormant__ {
++                      bootargs = "cma=96M@128M";
++              };
++      };
++
++      fragment@4 {
++              target-path = "/chosen";
++              __dormant__ {
++                      bootargs = "cma=64M@64M";
++              };
++      };
++
++      fragment@5 {
+               target = <&i2c2>;
+               __overlay__  {
+                       status = "okay";
+               };
+       };
+-      fragment@1 {
++      fragment@6 {
+               target = <&cprman>;
+               __overlay__  {
+                       status = "okay";
+               };
+       };
+-      fragment@2 {
++      fragment@7 {
+               target = <&fb>;
+               __overlay__  {
+                       status = "disabled";
+               };
+       };
+-      fragment@3 {
+-              target = <&soc>;
++      fragment@8 {
++              target = <&pixelvalve0>;
+               __overlay__  {
+-                      #address-cells = <1>;
+-                      #size-cells = <1>;
++                      interrupts = <2 13>; /* pwa0 */
++                      status = "okay";
++              };
++      };
+-                      pixelvalve@7e206000 {
+-                              compatible = "brcm,bcm2835-pixelvalve0";
+-                              reg = <0x7e206000 0x100>;
+-                              interrupts = <2 13>; /* pwa0 */
+-                      };
+-
+-                      pixelvalve@7e207000 {
+-                              compatible = "brcm,bcm2835-pixelvalve1";
+-                              reg = <0x7e207000 0x100>;
+-                              interrupts = <2 14>; /* pwa1 */
+-                      };
+-
+-                      hvs@7e400000 {
+-                              compatible = "brcm,bcm2835-hvs";
+-                              reg = <0x7e400000 0x6000>;
+-                              interrupts = <2 1>;
+-                      };
+-
+-                      pixelvalve@7e807000 {
+-                              compatible = "brcm,bcm2835-pixelvalve2";
+-                              reg = <0x7e807000 0x100>;
+-                              interrupts = <2 10>; /* pixelvalve */
+-                      };
+-
+-                      hdmi@7e902000 {
+-                              compatible = "brcm,bcm2835-hdmi";
+-                              reg = <0x7e902000 0x600>,
+-                                    <0x7e808000 0x100>;
+-                              interrupts = <2 8>, <2 9>;
+-                              ddc = <&i2c2>;
+-                              hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
+-                              clocks = <&cprman BCM2835_PLLH_PIX>,
+-                                       <&cprman BCM2835_CLOCK_HSM>;
+-                              clock-names = "pixel", "hdmi";
+-                              power-domains = <&power RPI_POWER_DOMAIN_HDMI>;
+-                      };
+-
+-                      v3d@7ec00000 {
+-                              compatible = "brcm,vc4-v3d";
+-                              reg = <0x7ec00000 0x1000>;
+-                              interrupts = <1 10>;
+-                      };
+-
+-                      gpu@7e4c0000 {
+-                              compatible = "brcm,bcm2835-vc4";
+-                      };
++      fragment@9 {
++              target = <&pixelvalve1>;
++              __overlay__  {
++                      interrupts = <2 14>; /* pwa1 */
++                      status = "okay";
+               };
+       };
+-      fragment@4 {
+-              target-path = "/chosen";
+-              __overlay__ {
+-                      bootargs = "cma=256M@256M";
++      fragment@10 {
++              target = <&pixelvalve2>;
++              __overlay__  {
++                      interrupts = <2 10>; /* pixelvalve */
++                      status = "okay";
+               };
+       };
+-      fragment@5 {
+-              target-path = "/chosen";
+-              __dormant__ {
+-                      bootargs = "cma=192M@256M";
++      fragment@11 {
++              target = <&hvs>;
++              __overlay__  {
++                      interrupts = <2 1>;
++                      status = "okay";
+               };
+       };
+-      fragment@6 {
+-              target-path = "/chosen";
+-              __dormant__ {
+-                      bootargs = "cma=128M@128M";
++      fragment@12 {
++              target = <&hdmi>;
++              __overlay__  {
++                      interrupts = <2 8>, <2 9>;
++                      status = "okay";
+               };
+       };
+-      fragment@7 {
+-              target-path = "/chosen";
+-              __dormant__ {
+-                      bootargs = "cma=96M@128M";
++      fragment@13 {
++              target = <&v3d>;
++              __overlay__  {
++                      interrupts = <1 10>;
++                      status = "okay";
+               };
+       };
+-      fragment@8 {
+-              target-path = "/chosen";
+-              __dormant__ {
+-                      bootargs = "cma=64M@64M";
++      fragment@14 {
++              target = <&gpu>;
++              __overlay__  {
++                      status = "okay";
+               };
+       };
+       __overrides__ {
+-              cma-256 = <0>,"+4-5-6-7-8";
+-              cma-192 = <0>,"-4+5-6-7-8";
+-              cma-128 = <0>,"-4-5+6-7-8";
+-              cma-96  = <0>,"-4-5-6+7-8";
+-              cma-64  = <0>,"-4-5-6-7+8";
++              cma-256 = <0>,"+0-1-2-3-4";
++              cma-192 = <0>,"-0+1-2-3-4";
++              cma-128 = <0>,"-0-1+2-3-4";
++              cma-96  = <0>,"-0-1-2+3-4";
++              cma-64  = <0>,"-0-1-2-3+4";
+       };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0325-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch b/target/linux/brcm2708/patches-4.4/0325-config-Add-CONFIG_DRM_LOAD_EDID_FIRMWARE.patch
deleted file mode 100644 (file)
index 20cb9db..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From 65042bea86d4204f83acd09cb665a2d91b365105 Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Fri, 6 May 2016 12:40:37 +0100
-Subject: [PATCH 325/423] config: Add CONFIG_DRM_LOAD_EDID_FIRMWARE
-
----
- 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
-@@ -815,6 +815,7 @@ CONFIG_VIDEO_TW9906=m
- CONFIG_VIDEO_OV7640=m
- CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
-+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -807,6 +807,7 @@ CONFIG_VIDEO_TW9906=m
- CONFIG_VIDEO_OV7640=m
- CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
-+CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
diff --git a/target/linux/brcm2708/patches-4.4/0326-BCM270X_DT-Move-vc4-node-contents-to-bcm2708_common..patch b/target/linux/brcm2708/patches-4.4/0326-BCM270X_DT-Move-vc4-node-contents-to-bcm2708_common..patch
deleted file mode 100644 (file)
index 3dc05f6..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-From c571a3b93af54fb31cf6125d7a3dfba634b4f099 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 6 May 2016 11:48:35 -0700
-Subject: [PATCH 326/423] BCM270X_DT: Move vc4 node contents to
- bcm2708_common.dtsi.
-
-This should clarify what's going on with the overlay: The hardware is
-always present, we're just enabling the DT node so that the vc4 driver
-probes.
-
-The interrupts are left in the overlay, because the firmware doesn't
-check node status before masking out the vc4 interrupts.
-
-By having the nodes in the common file, we'll be able to correctly
-connect the HDMI HPD GPIO so that we can detect whether an HDMI
-monitor is connected.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- arch/arm/boot/dts/bcm2708_common.dtsi              |  51 +++++++
- arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts | 160 ++++++++++-----------
- 2 files changed, 129 insertions(+), 82 deletions(-)
-
---- a/arch/arm/boot/dts/bcm2708_common.dtsi
-+++ b/arch/arm/boot/dts/bcm2708_common.dtsi
-@@ -1,4 +1,7 @@
-+#include "dt-bindings/clock/bcm2835.h"
- #include <dt-bindings/clock/bcm2835-aux.h>
-+#include "dt-bindings/power/raspberrypi-power.h"
-+#include "dt-bindings/gpio/gpio.h"
- #include "skeleton.dtsi"
- / {
-@@ -170,6 +173,18 @@
-                       status = "disabled";
-               };
-+              pixelvalve0: pixelvalve@7e206000 {
-+                      compatible = "brcm,bcm2835-pixelvalve0";
-+                      reg = <0x7e206000 0x100>;
-+                      status = "disabled";
-+              };
-+
-+              pixelvalve1: pixelvalve@7e207000 {
-+                      compatible = "brcm,bcm2835-pixelvalve1";
-+                      reg = <0x7e207000 0x100>;
-+                      status = "disabled";
-+              };
-+
-               pwm: pwm@7e20c000 {
-                       compatible = "brcm,bcm2835-pwm";
-                       reg = <0x7e20c000 0x28>;
-@@ -227,6 +242,12 @@
-                       status = "disabled";
-               };
-+              hvs: hvs@7e400000 {
-+                      compatible = "brcm,bcm2835-hvs";
-+                      reg = <0x7e400000 0x6000>;
-+                      status = "disabled";
-+              };
-+
-               i2c1: i2c@7e804000 {
-                       compatible = "brcm,bcm2708-i2c";
-                       reg = <0x7e804000 0x1000>;
-@@ -261,6 +282,25 @@
-                       status = "disabled";
-               };
-+              pixelvalve2: pixelvalve@7e807000 {
-+                      compatible = "brcm,bcm2835-pixelvalve2";
-+                      reg = <0x7e807000 0x100>;
-+                      status = "disabled";
-+              };
-+
-+              hdmi: hdmi@7e902000 {
-+                      compatible = "brcm,bcm2835-hdmi";
-+                      reg = <0x7e902000 0x600>,
-+                            <0x7e808000 0x100>;
-+                      ddc = <&i2c2>;
-+                      hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
-+                      clocks = <&cprman BCM2835_PLLH_PIX>,
-+                               <&cprman BCM2835_CLOCK_HSM>;
-+                      clock-names = "pixel", "hdmi";
-+                      power-domains = <&power RPI_POWER_DOMAIN_HDMI>;
-+                      status = "disabled";
-+              };
-+
-               usb: usb@7e980000 {
-                       compatible = "brcm,bcm2708-usb";
-                       reg = <0x7e980000 0x10000>,
-@@ -269,6 +309,12 @@
-                                    <1 9>;
-               };
-+              v3d: v3d@7ec00000 {
-+                      compatible = "brcm,vc4-v3d";
-+                      reg = <0x7ec00000 0x1000>;
-+                      status = "disabled";
-+              };
-+
-               firmware: firmware {
-                       compatible = "raspberrypi,bcm2835-firmware";
-                       mboxes = <&mailbox>;
-@@ -303,6 +349,11 @@
-                       firmware = <&firmware>;
-               };
-+              gpu: gpu {
-+                      compatible = "brcm,bcm2835-vc4";
-+                      status = "disabled";
-+              };
-+
-               /* Onboard audio */
-               audio: audio {
-                       compatible = "brcm,bcm2835-audio";
---- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
-@@ -5,129 +5,125 @@
- /dts-v1/;
- /plugin/;
--#include "dt-bindings/clock/bcm2835.h"
--#include "dt-bindings/power/raspberrypi-power.h"
--#include "dt-bindings/gpio/gpio.h"
--
- / {
-       compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
-       fragment@0 {
-+              target-path = "/chosen";
-+              __overlay__ {
-+                      bootargs = "cma=256M@256M";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target-path = "/chosen";
-+              __dormant__ {
-+                      bootargs = "cma=192M@256M";
-+              };
-+      };
-+
-+      fragment@2 {
-+              target-path = "/chosen";
-+              __dormant__ {
-+                      bootargs = "cma=128M@128M";
-+              };
-+      };
-+
-+      fragment@3 {
-+              target-path = "/chosen";
-+              __dormant__ {
-+                      bootargs = "cma=96M@128M";
-+              };
-+      };
-+
-+      fragment@4 {
-+              target-path = "/chosen";
-+              __dormant__ {
-+                      bootargs = "cma=64M@64M";
-+              };
-+      };
-+
-+      fragment@5 {
-               target = <&i2c2>;
-               __overlay__  {
-                       status = "okay";
-               };
-       };
--      fragment@1 {
-+      fragment@6 {
-               target = <&cprman>;
-               __overlay__  {
-                       status = "okay";
-               };
-       };
--      fragment@2 {
-+      fragment@7 {
-               target = <&fb>;
-               __overlay__  {
-                       status = "disabled";
-               };
-       };
--      fragment@3 {
--              target = <&soc>;
-+      fragment@8 {
-+              target = <&pixelvalve0>;
-               __overlay__  {
--                      #address-cells = <1>;
--                      #size-cells = <1>;
-+                      interrupts = <2 13>; /* pwa0 */
-+                      status = "okay";
-+              };
-+      };
--                      pixelvalve@7e206000 {
--                              compatible = "brcm,bcm2835-pixelvalve0";
--                              reg = <0x7e206000 0x100>;
--                              interrupts = <2 13>; /* pwa0 */
--                      };
--
--                      pixelvalve@7e207000 {
--                              compatible = "brcm,bcm2835-pixelvalve1";
--                              reg = <0x7e207000 0x100>;
--                              interrupts = <2 14>; /* pwa1 */
--                      };
--
--                      hvs@7e400000 {
--                              compatible = "brcm,bcm2835-hvs";
--                              reg = <0x7e400000 0x6000>;
--                              interrupts = <2 1>;
--                      };
--
--                      pixelvalve@7e807000 {
--                              compatible = "brcm,bcm2835-pixelvalve2";
--                              reg = <0x7e807000 0x100>;
--                              interrupts = <2 10>; /* pixelvalve */
--                      };
--
--                      hdmi@7e902000 {
--                              compatible = "brcm,bcm2835-hdmi";
--                              reg = <0x7e902000 0x600>,
--                                    <0x7e808000 0x100>;
--                              interrupts = <2 8>, <2 9>;
--                              ddc = <&i2c2>;
--                              hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
--                              clocks = <&cprman BCM2835_PLLH_PIX>,
--                                       <&cprman BCM2835_CLOCK_HSM>;
--                              clock-names = "pixel", "hdmi";
--                              power-domains = <&power RPI_POWER_DOMAIN_HDMI>;
--                      };
--
--                      v3d@7ec00000 {
--                              compatible = "brcm,vc4-v3d";
--                              reg = <0x7ec00000 0x1000>;
--                              interrupts = <1 10>;
--                      };
--
--                      gpu@7e4c0000 {
--                              compatible = "brcm,bcm2835-vc4";
--                      };
-+      fragment@9 {
-+              target = <&pixelvalve1>;
-+              __overlay__  {
-+                      interrupts = <2 14>; /* pwa1 */
-+                      status = "okay";
-               };
-       };
--      fragment@4 {
--              target-path = "/chosen";
--              __overlay__ {
--                      bootargs = "cma=256M@256M";
-+      fragment@10 {
-+              target = <&pixelvalve2>;
-+              __overlay__  {
-+                      interrupts = <2 10>; /* pixelvalve */
-+                      status = "okay";
-               };
-       };
--      fragment@5 {
--              target-path = "/chosen";
--              __dormant__ {
--                      bootargs = "cma=192M@256M";
-+      fragment@11 {
-+              target = <&hvs>;
-+              __overlay__  {
-+                      interrupts = <2 1>;
-+                      status = "okay";
-               };
-       };
--      fragment@6 {
--              target-path = "/chosen";
--              __dormant__ {
--                      bootargs = "cma=128M@128M";
-+      fragment@12 {
-+              target = <&hdmi>;
-+              __overlay__  {
-+                      interrupts = <2 8>, <2 9>;
-+                      status = "okay";
-               };
-       };
--      fragment@7 {
--              target-path = "/chosen";
--              __dormant__ {
--                      bootargs = "cma=96M@128M";
-+      fragment@13 {
-+              target = <&v3d>;
-+              __overlay__  {
-+                      interrupts = <1 10>;
-+                      status = "okay";
-               };
-       };
--      fragment@8 {
--              target-path = "/chosen";
--              __dormant__ {
--                      bootargs = "cma=64M@64M";
-+      fragment@14 {
-+              target = <&gpu>;
-+              __overlay__  {
-+                      status = "okay";
-               };
-       };
-       __overrides__ {
--              cma-256 = <0>,"+4-5-6-7-8";
--              cma-192 = <0>,"-4+5-6-7-8";
--              cma-128 = <0>,"-4-5+6-7-8";
--              cma-96  = <0>,"-4-5-6+7-8";
--              cma-64  = <0>,"-4-5-6-7+8";
-+              cma-256 = <0>,"+0-1-2-3-4";
-+              cma-192 = <0>,"-0+1-2-3-4";
-+              cma-128 = <0>,"-0-1+2-3-4";
-+              cma-96  = <0>,"-0-1-2+3-4";
-+              cma-64  = <0>,"-0-1-2-3+4";
-       };
- };
diff --git a/target/linux/brcm2708/patches-4.4/0326-BCM270X_DT-Set-correct-HDMI-HPD-GPIO-levels-for-vari.patch b/target/linux/brcm2708/patches-4.4/0326-BCM270X_DT-Set-correct-HDMI-HPD-GPIO-levels-for-vari.patch
new file mode 100644 (file)
index 0000000..f29a4c9
--- /dev/null
@@ -0,0 +1,69 @@
+From f8d384eb825833f16db1b410dc7bdb62857bcf54 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 6 May 2016 12:42:26 -0700
+Subject: [PATCH] BCM270X_DT: Set correct HDMI HPD GPIO levels for various
+ boards.
+
+The CM is left out, because I haven't found a source for how the CM's
+HPD is connected.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 4 ++++
+ arch/arm/boot/dts/bcm2708-rpi-b.dts      | 4 ++++
+ arch/arm/boot/dts/bcm2709-rpi-2-b.dts    | 4 ++++
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts    | 4 ++++
+ 4 files changed, 16 insertions(+)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
+@@ -116,6 +116,10 @@
+       };
+ };
++&hdmi {
++      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
++};
++
+ / {
+       __overrides__ {
+               uart0 = <&uart0>,"status";
+--- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
+@@ -110,6 +110,10 @@
+       };
+ };
++&hdmi {
++      hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
++};
++
+ / {
+       __overrides__ {
+               uart0 = <&uart0>,"status";
+--- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
++++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
+@@ -116,6 +116,10 @@
+       };
+ };
++&hdmi {
++      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
++};
++
+ / {
+       __overrides__ {
+               uart0 = <&uart0>,"status";
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -161,6 +161,10 @@
+       };
+ };
++&hdmi {
++      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
++};
++
+ / {
+       chosen {
+               bootargs = "8250.nr_uarts=1";
diff --git a/target/linux/brcm2708/patches-4.4/0327-BCM270X_DT-Set-correct-HDMI-HPD-GPIO-levels-for-vari.patch b/target/linux/brcm2708/patches-4.4/0327-BCM270X_DT-Set-correct-HDMI-HPD-GPIO-levels-for-vari.patch
deleted file mode 100644 (file)
index e05da8d..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-From da8c5943777182ae813ae0e1332e45ffaec0b7fa Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 6 May 2016 12:42:26 -0700
-Subject: [PATCH 327/423] BCM270X_DT: Set correct HDMI HPD GPIO levels for
- various boards.
-
-The CM is left out, because I haven't found a source for how the CM's
-HPD is connected.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 4 ++++
- arch/arm/boot/dts/bcm2708-rpi-b.dts      | 4 ++++
- arch/arm/boot/dts/bcm2709-rpi-2-b.dts    | 4 ++++
- arch/arm/boot/dts/bcm2710-rpi-3-b.dts    | 4 ++++
- 4 files changed, 16 insertions(+)
-
---- a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
-+++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
-@@ -116,6 +116,10 @@
-       };
- };
-+&hdmi {
-+      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
-+};
-+
- / {
-       __overrides__ {
-               uart0 = <&uart0>,"status";
---- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
-+++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
-@@ -110,6 +110,10 @@
-       };
- };
-+&hdmi {
-+      hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
-+};
-+
- / {
-       __overrides__ {
-               uart0 = <&uart0>,"status";
---- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
-+++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
-@@ -116,6 +116,10 @@
-       };
- };
-+&hdmi {
-+      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
-+};
-+
- / {
-       __overrides__ {
-               uart0 = <&uart0>,"status";
---- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
-+++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
-@@ -161,6 +161,10 @@
-       };
- };
-+&hdmi {
-+      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
-+};
-+
- / {
-       chosen {
-               bootargs = "8250.nr_uarts=1";
diff --git a/target/linux/brcm2708/patches-4.4/0327-Revert-drm-vc4-Force-HDMI-to-connected.patch b/target/linux/brcm2708/patches-4.4/0327-Revert-drm-vc4-Force-HDMI-to-connected.patch
new file mode 100644 (file)
index 0000000..47b395f
--- /dev/null
@@ -0,0 +1,26 @@
+From bfde336df6d52984f6eef6ad5e4981fe18c0dfcc Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 6 May 2016 12:43:25 -0700
+Subject: [PATCH] Revert "drm/vc4: Force HDMI to connected."
+
+Now that we have the HDMI HPD GPIOs correctly identified in the DT, we
+should be able to successfully detect HDMI.
+
+This reverts commit fbec01e2d17b924d91850e17eeecf975e74c9ebf.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -166,8 +166,6 @@ vc4_hdmi_connector_detect(struct drm_con
+       struct drm_device *dev = connector->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+-      return connector_status_connected;
+-
+       if (vc4->hdmi->hpd_gpio) {
+               if (gpio_get_value_cansleep(vc4->hdmi->hpd_gpio) ^
+                   vc4->hdmi->hpd_active_low)
diff --git a/target/linux/brcm2708/patches-4.4/0328-BCM270X-Include-DRM_PANEL_SIMPLE-in-the-defconfigs.patch b/target/linux/brcm2708/patches-4.4/0328-BCM270X-Include-DRM_PANEL_SIMPLE-in-the-defconfigs.patch
new file mode 100644 (file)
index 0000000..f054521
--- /dev/null
@@ -0,0 +1,33 @@
+From a62182109337f799ee97d1e41fee09be5faa8975 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 6 May 2016 12:59:27 -0700
+Subject: [PATCH] BCM270X: Include DRM_PANEL_SIMPLE in the defconfigs.
+
+This is going to be required for the Adafruit DPI panel support.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ 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
+@@ -817,6 +817,7 @@ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
+ CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
++CONFIG_DRM_PANEL_SIMPLE=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+ CONFIG_FB_BCM2708=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -809,6 +809,7 @@ CONFIG_VIDEO_MT9V011=m
+ CONFIG_DRM=m
+ CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
++CONFIG_DRM_PANEL_SIMPLE=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+ CONFIG_FB_BCM2708=y
diff --git a/target/linux/brcm2708/patches-4.4/0328-Revert-drm-vc4-Force-HDMI-to-connected.patch b/target/linux/brcm2708/patches-4.4/0328-Revert-drm-vc4-Force-HDMI-to-connected.patch
deleted file mode 100644 (file)
index 14beb8a..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From 51ee0bd70a886329018e8d22fda1fe4f360a9ff3 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 6 May 2016 12:43:25 -0700
-Subject: [PATCH 328/423] Revert "drm/vc4: Force HDMI to connected."
-
-Now that we have the HDMI HPD GPIOs correctly identified in the DT, we
-should be able to successfully detect HDMI.
-
-This reverts commit fbec01e2d17b924d91850e17eeecf975e74c9ebf.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/gpu/drm/vc4/vc4_hdmi.c | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/drivers/gpu/drm/vc4/vc4_hdmi.c
-+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
-@@ -166,8 +166,6 @@ vc4_hdmi_connector_detect(struct drm_con
-       struct drm_device *dev = connector->dev;
-       struct vc4_dev *vc4 = to_vc4_dev(dev);
--      return connector_status_connected;
--
-       if (vc4->hdmi->hpd_gpio) {
-               if (gpio_get_value_cansleep(vc4->hdmi->hpd_gpio) ^
-                   vc4->hdmi->hpd_active_low)
diff --git a/target/linux/brcm2708/patches-4.4/0329-BCM270X-Include-DRM_PANEL_SIMPLE-in-the-defconfigs.patch b/target/linux/brcm2708/patches-4.4/0329-BCM270X-Include-DRM_PANEL_SIMPLE-in-the-defconfigs.patch
deleted file mode 100644 (file)
index cedb9b9..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From 9768eff7323ea9e3b663be5e2850fdf87ddfe13f Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 6 May 2016 12:59:27 -0700
-Subject: [PATCH 329/423] BCM270X: Include DRM_PANEL_SIMPLE in the defconfigs.
-
-This is going to be required for the Adafruit DPI panel support.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- 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
-@@ -817,6 +817,7 @@ CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
- CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
-+CONFIG_DRM_PANEL_SIMPLE=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
- CONFIG_FB_BCM2708=y
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -809,6 +809,7 @@ CONFIG_VIDEO_MT9V011=m
- CONFIG_DRM=m
- CONFIG_DRM_LOAD_EDID_FIRMWARE=y
- CONFIG_DRM_UDL=m
-+CONFIG_DRM_PANEL_SIMPLE=m
- CONFIG_DRM_VC4=m
- CONFIG_FB=y
- CONFIG_FB_BCM2708=y
diff --git a/target/linux/brcm2708/patches-4.4/0329-drm-Add-an-encoder-and-connector-type-enum-for-DPI.patch b/target/linux/brcm2708/patches-4.4/0329-drm-Add-an-encoder-and-connector-type-enum-for-DPI.patch
new file mode 100644 (file)
index 0000000..9e2da1d
--- /dev/null
@@ -0,0 +1,64 @@
+From 870639e585709adc65183d75619fc01e35adb774 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 18 Mar 2016 12:34:59 -0700
+Subject: [PATCH] drm: Add an encoder and connector type enum for DPI.
+
+Right now exynos is exposing DPI as a TMDS encoder and VGA connector,
+which seems rather misleading.  This isn't just an internal detail,
+since xrandr actually exposes "VGA" as the output name.  Define some
+new enums so that vc4's DPI can have a more informative name.
+
+I considered other names for the connector as well.  For VC4, the
+Adafruit DPI kippah takes the 28 GPIO pins and routes them to a
+standard-ish 40-pin FPC connector, but "40-pin FPC" doesn't uniquely
+identify an ordering of pins (apparently some other orderings exist),
+doesn't explain things as well for the user (who, if anything, knows
+their product is a DPI kippah/panel combo), and actually doesn't have
+to exist (one could connect the 28 GPIOs directly to something else).
+Simply "DPI" seems like a good compromise name to distinguish from the
+HDMI, DSI, and TV connectors .
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+(cherry picked from commit 0b27c02a7f1c697694f2ad6d6517e7dbf9ecfa39)
+---
+ drivers/gpu/drm/drm_crtc.c  | 2 ++
+ include/uapi/drm/drm_mode.h | 2 ++
+ 2 files changed, 4 insertions(+)
+
+--- a/drivers/gpu/drm/drm_crtc.c
++++ b/drivers/gpu/drm/drm_crtc.c
+@@ -168,6 +168,7 @@ static struct drm_conn_prop_enum_list dr
+       { DRM_MODE_CONNECTOR_eDP, "eDP" },
+       { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
+       { DRM_MODE_CONNECTOR_DSI, "DSI" },
++      { DRM_MODE_CONNECTOR_DPI, "DPI" },
+ };
+ static const struct drm_prop_enum_list drm_encoder_enum_list[] = {
+@@ -179,6 +180,7 @@ static const struct drm_prop_enum_list d
+       { DRM_MODE_ENCODER_VIRTUAL, "Virtual" },
+       { DRM_MODE_ENCODER_DSI, "DSI" },
+       { DRM_MODE_ENCODER_DPMST, "DP MST" },
++      { DRM_MODE_ENCODER_DPI, "DPI" },
+ };
+ static const struct drm_prop_enum_list drm_subpixel_enum_list[] = {
+--- a/include/uapi/drm/drm_mode.h
++++ b/include/uapi/drm/drm_mode.h
+@@ -202,6 +202,7 @@ struct drm_mode_get_plane_res {
+ #define DRM_MODE_ENCODER_VIRTUAL 5
+ #define DRM_MODE_ENCODER_DSI  6
+ #define DRM_MODE_ENCODER_DPMST        7
++#define DRM_MODE_ENCODER_DPI  8
+ struct drm_mode_get_encoder {
+       __u32 encoder_id;
+@@ -241,6 +242,7 @@ struct drm_mode_get_encoder {
+ #define DRM_MODE_CONNECTOR_eDP                14
+ #define DRM_MODE_CONNECTOR_VIRTUAL      15
+ #define DRM_MODE_CONNECTOR_DSI                16
++#define DRM_MODE_CONNECTOR_DPI                17
+ struct drm_mode_get_connector {
diff --git a/target/linux/brcm2708/patches-4.4/0330-drm-Add-an-encoder-and-connector-type-enum-for-DPI.patch b/target/linux/brcm2708/patches-4.4/0330-drm-Add-an-encoder-and-connector-type-enum-for-DPI.patch
deleted file mode 100644 (file)
index 3408097..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-From 72a4218cce198ffd0a920c98856f1dfecdfac9c9 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 18 Mar 2016 12:34:59 -0700
-Subject: [PATCH 330/423] drm: Add an encoder and connector type enum for DPI.
-
-Right now exynos is exposing DPI as a TMDS encoder and VGA connector,
-which seems rather misleading.  This isn't just an internal detail,
-since xrandr actually exposes "VGA" as the output name.  Define some
-new enums so that vc4's DPI can have a more informative name.
-
-I considered other names for the connector as well.  For VC4, the
-Adafruit DPI kippah takes the 28 GPIO pins and routes them to a
-standard-ish 40-pin FPC connector, but "40-pin FPC" doesn't uniquely
-identify an ordering of pins (apparently some other orderings exist),
-doesn't explain things as well for the user (who, if anything, knows
-their product is a DPI kippah/panel combo), and actually doesn't have
-to exist (one could connect the 28 GPIOs directly to something else).
-Simply "DPI" seems like a good compromise name to distinguish from the
-HDMI, DSI, and TV connectors .
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-(cherry picked from commit 0b27c02a7f1c697694f2ad6d6517e7dbf9ecfa39)
----
- drivers/gpu/drm/drm_crtc.c  | 2 ++
- include/uapi/drm/drm_mode.h | 2 ++
- 2 files changed, 4 insertions(+)
-
---- a/drivers/gpu/drm/drm_crtc.c
-+++ b/drivers/gpu/drm/drm_crtc.c
-@@ -168,6 +168,7 @@ static struct drm_conn_prop_enum_list dr
-       { DRM_MODE_CONNECTOR_eDP, "eDP" },
-       { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
-       { DRM_MODE_CONNECTOR_DSI, "DSI" },
-+      { DRM_MODE_CONNECTOR_DPI, "DPI" },
- };
- static const struct drm_prop_enum_list drm_encoder_enum_list[] = {
-@@ -179,6 +180,7 @@ static const struct drm_prop_enum_list d
-       { DRM_MODE_ENCODER_VIRTUAL, "Virtual" },
-       { DRM_MODE_ENCODER_DSI, "DSI" },
-       { DRM_MODE_ENCODER_DPMST, "DP MST" },
-+      { DRM_MODE_ENCODER_DPI, "DPI" },
- };
- static const struct drm_prop_enum_list drm_subpixel_enum_list[] = {
---- a/include/uapi/drm/drm_mode.h
-+++ b/include/uapi/drm/drm_mode.h
-@@ -202,6 +202,7 @@ struct drm_mode_get_plane_res {
- #define DRM_MODE_ENCODER_VIRTUAL 5
- #define DRM_MODE_ENCODER_DSI  6
- #define DRM_MODE_ENCODER_DPMST        7
-+#define DRM_MODE_ENCODER_DPI  8
- struct drm_mode_get_encoder {
-       __u32 encoder_id;
-@@ -241,6 +242,7 @@ struct drm_mode_get_encoder {
- #define DRM_MODE_CONNECTOR_eDP                14
- #define DRM_MODE_CONNECTOR_VIRTUAL      15
- #define DRM_MODE_CONNECTOR_DSI                16
-+#define DRM_MODE_CONNECTOR_DPI                17
- struct drm_mode_get_connector {
diff --git a/target/linux/brcm2708/patches-4.4/0330-dt-bindings-Add-binding-docs-for-V3D.patch b/target/linux/brcm2708/patches-4.4/0330-dt-bindings-Add-binding-docs-for-V3D.patch
new file mode 100644 (file)
index 0000000..cb1fae5
--- /dev/null
@@ -0,0 +1,42 @@
+From eb2044830badaa2cc277e21920c4d401dde554cd Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 4 Mar 2016 12:32:06 -0800
+Subject: [PATCH] dt-bindings: Add binding docs for V3D.
+
+This was missed in the upstreaming process.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Acked-by: Stephen Warren <swarren@wwwdotorg.org>
+(cherry picked from commit 4653f22e9ab08b2b7178b7262a9326eb777e0266)
+---
+ Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
++++ b/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
+@@ -35,6 +35,12 @@ Optional properties for HDMI:
+                 as an interrupt/status bit in the HDMI controller
+                 itself).  See bindings/pinctrl/brcm,bcm2835-gpio.txt
++Required properties for V3D:
++- compatible: Should be "brcm,bcm2835-v3d"
++- reg:                Physical base address and length of the V3D's registers
++- interrupts: The interrupt number
++                See bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
++
+ Example:
+ pixelvalve@7e807000 {
+       compatible = "brcm,bcm2835-pixelvalve2";
+@@ -60,6 +66,12 @@ hdmi: hdmi@7e902000 {
+       clock-names = "pixel", "hdmi";
+ };
++v3d: v3d@7ec00000 {
++      compatible = "brcm,bcm2835-v3d";
++      reg = <0x7ec00000 0x1000>;
++      interrupts = <1 10>;
++};
++
+ vc4: gpu {
+       compatible = "brcm,bcm2835-vc4";
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0331-drm-vc4-Add-DPI-driver.patch b/target/linux/brcm2708/patches-4.4/0331-drm-vc4-Add-DPI-driver.patch
new file mode 100644 (file)
index 0000000..671c9b2
--- /dev/null
@@ -0,0 +1,673 @@
+From fe826daeea975dcf3ce3fca6e8a0850e5761f602 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Wed, 10 Feb 2016 11:42:32 -0800
+Subject: [PATCH] drm/vc4: Add DPI driver
+
+The DPI interface involves taking a ton of our GPIOs to be used as
+outputs, and routing display signals over them in parallel.
+
+v2: Use display_info.bus_formats[] to replace our custom DT
+    properties.
+v3: Rebase on V3D documentation changes.
+v4: Fix rebase detritus from V3D documentation changes.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Acked-by: Rob Herring <robh@kernel.org>
+(cherry picked from commit 08302c35b59d306ff37b996e56fb2a488c1d2c2e)
+---
+ .../devicetree/bindings/display/brcm,bcm-vc4.txt   |  36 ++
+ drivers/gpu/drm/vc4/Kconfig                        |   1 +
+ drivers/gpu/drm/vc4/Makefile                       |   1 +
+ drivers/gpu/drm/vc4/vc4_debugfs.c                  |   1 +
+ drivers/gpu/drm/vc4/vc4_dpi.c                      | 520 +++++++++++++++++++++
+ drivers/gpu/drm/vc4/vc4_drv.c                      |   1 +
+ drivers/gpu/drm/vc4/vc4_drv.h                      |   5 +
+ 7 files changed, 565 insertions(+)
+ create mode 100644 drivers/gpu/drm/vc4/vc4_dpi.c
+
+--- a/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
++++ b/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
+@@ -35,12 +35,22 @@ Optional properties for HDMI:
+                 as an interrupt/status bit in the HDMI controller
+                 itself).  See bindings/pinctrl/brcm,bcm2835-gpio.txt
++Required properties for DPI:
++- compatible: Should be "brcm,bcm2835-dpi"
++- reg:                Physical base address and length of the registers
++- clocks:     a) core: The core clock the unit runs on
++              b) pixel: The pixel clock that feeds the pixelvalve
++- port:               Port node with a single endpoint connecting to the panel
++                device, as defined in [1]
++
+ Required properties for V3D:
+ - compatible: Should be "brcm,bcm2835-v3d"
+ - reg:                Physical base address and length of the V3D's registers
+ - interrupts: The interrupt number
+                 See bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
++[1] Documentation/devicetree/bindings/media/video-interfaces.txt
++
+ Example:
+ pixelvalve@7e807000 {
+       compatible = "brcm,bcm2835-pixelvalve2";
+@@ -66,6 +76,22 @@ hdmi: hdmi@7e902000 {
+       clock-names = "pixel", "hdmi";
+ };
++dpi: dpi@7e208000 {
++      compatible = "brcm,bcm2835-dpi";
++      reg = <0x7e208000 0x8c>;
++      clocks = <&clocks BCM2835_CLOCK_VPU>,
++               <&clocks BCM2835_CLOCK_DPI>;
++      clock-names = "core", "pixel";
++      #address-cells = <1>;
++      #size-cells = <0>;
++
++      port {
++              dpi_out: endpoint@0 {
++                      remote-endpoint = <&panel_in>;
++              };
++      };
++};
++
+ v3d: v3d@7ec00000 {
+       compatible = "brcm,bcm2835-v3d";
+       reg = <0x7ec00000 0x1000>;
+@@ -75,3 +101,13 @@ v3d: v3d@7ec00000 {
+ vc4: gpu {
+       compatible = "brcm,bcm2835-vc4";
+ };
++
++panel: panel {
++      compatible = "ontat,yx700wv03", "simple-panel";
++
++      port {
++              panel_in: endpoint {
++                      remote-endpoint = <&dpi_out>;
++              };
++      };
++};
+--- a/drivers/gpu/drm/vc4/Kconfig
++++ b/drivers/gpu/drm/vc4/Kconfig
+@@ -5,6 +5,7 @@ config DRM_VC4
+       select DRM_KMS_HELPER
+       select DRM_KMS_CMA_HELPER
+       select DRM_GEM_CMA_HELPER
++      select DRM_PANEL
+       help
+         Choose this option if you have a system that has a Broadcom
+         VC4 GPU, such as the Raspberry Pi or other BCM2708/BCM2835.
+--- a/drivers/gpu/drm/vc4/Makefile
++++ b/drivers/gpu/drm/vc4/Makefile
+@@ -7,6 +7,7 @@ vc4-y := \
+       vc4_bo.o \
+       vc4_crtc.o \
+       vc4_drv.o \
++      vc4_dpi.o \
+       vc4_kms.o \
+       vc4_gem.o \
+       vc4_hdmi.o \
+--- 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},
++      {"dpi_regs", vc4_dpi_debugfs_regs, 0},
+       {"gem_exec", vc4_gem_exec_debugfs, 0},
+       {"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
+       {"hvs_regs", vc4_hvs_debugfs_regs, 0},
+--- /dev/null
++++ b/drivers/gpu/drm/vc4/vc4_dpi.c
+@@ -0,0 +1,520 @@
++/*
++ * Copyright (C) 2016 Broadcom Limited
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published by
++ * the Free Software Foundation.
++ *
++ * 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/>.
++ */
++
++/**
++ * DOC: VC4 DPI module
++ *
++ * The VC4 DPI hardware supports MIPI DPI type 4 and Nokia ViSSI
++ * signals, which are routed out to GPIO0-27 with the ALT2 function.
++ */
++
++#include "drm_atomic_helper.h"
++#include "drm_crtc_helper.h"
++#include "drm_edid.h"
++#include "drm_panel.h"
++#include "linux/clk.h"
++#include "linux/component.h"
++#include "linux/of_graph.h"
++#include "linux/of_platform.h"
++#include "vc4_drv.h"
++#include "vc4_regs.h"
++
++#define DPI_C                 0x00
++# define DPI_OUTPUT_ENABLE_MODE               BIT(16)
++
++/* The order field takes the incoming 24 bit RGB from the pixel valve
++ * and shuffles the 3 channels.
++ */
++# define DPI_ORDER_MASK                       VC4_MASK(15, 14)
++# define DPI_ORDER_SHIFT              14
++# define DPI_ORDER_RGB                        0
++# define DPI_ORDER_BGR                        1
++# define DPI_ORDER_GRB                        2
++# define DPI_ORDER_BRG                        3
++
++/* The format field takes the ORDER-shuffled pixel valve data and
++ * formats it onto the output lines.
++ */
++# define DPI_FORMAT_MASK              VC4_MASK(13, 11)
++# define DPI_FORMAT_SHIFT             11
++/* This define is named in the hardware, but actually just outputs 0. */
++# define DPI_FORMAT_9BIT_666_RGB      0
++/* Outputs 00000000rrrrrggggggbbbbb */
++# define DPI_FORMAT_16BIT_565_RGB_1   1
++/* Outputs 000rrrrr00gggggg000bbbbb */
++# define DPI_FORMAT_16BIT_565_RGB_2   2
++/* Outputs 00rrrrr000gggggg00bbbbb0 */
++# define DPI_FORMAT_16BIT_565_RGB_3   3
++/* Outputs 000000rrrrrrggggggbbbbbb */
++# define DPI_FORMAT_18BIT_666_RGB_1   4
++/* Outputs 00rrrrrr00gggggg00bbbbbb */
++# define DPI_FORMAT_18BIT_666_RGB_2   5
++/* Outputs rrrrrrrrggggggggbbbbbbbb */
++# define DPI_FORMAT_24BIT_888_RGB     6
++
++/* Reverses the polarity of the corresponding signal */
++# define DPI_PIXEL_CLK_INVERT         BIT(10)
++# define DPI_HSYNC_INVERT             BIT(9)
++# define DPI_VSYNC_INVERT             BIT(8)
++# define DPI_OUTPUT_ENABLE_INVERT     BIT(7)
++
++/* Outputs the signal the falling clock edge instead of rising. */
++# define DPI_HSYNC_NEGATE             BIT(6)
++# define DPI_VSYNC_NEGATE             BIT(5)
++# define DPI_OUTPUT_ENABLE_NEGATE     BIT(4)
++
++/* Disables the signal */
++# define DPI_HSYNC_DISABLE            BIT(3)
++# define DPI_VSYNC_DISABLE            BIT(2)
++# define DPI_OUTPUT_ENABLE_DISABLE    BIT(1)
++
++/* Power gate to the device, full reset at 0 -> 1 transition */
++# define DPI_ENABLE                   BIT(0)
++
++/* All other registers besides DPI_C return the ID */
++#define DPI_ID                        0x04
++# define DPI_ID_VALUE         0x00647069
++
++/* General DPI hardware state. */
++struct vc4_dpi {
++      struct platform_device *pdev;
++
++      struct drm_encoder *encoder;
++      struct drm_connector *connector;
++      struct drm_panel *panel;
++
++      void __iomem *regs;
++
++      struct clk *pixel_clock;
++      struct clk *core_clock;
++};
++
++#define DPI_READ(offset) readl(dpi->regs + (offset))
++#define DPI_WRITE(offset, val) writel(val, dpi->regs + (offset))
++
++/* VC4 DPI encoder KMS struct */
++struct vc4_dpi_encoder {
++      struct vc4_encoder base;
++      struct vc4_dpi *dpi;
++};
++
++static inline struct vc4_dpi_encoder *
++to_vc4_dpi_encoder(struct drm_encoder *encoder)
++{
++      return container_of(encoder, struct vc4_dpi_encoder, base.base);
++}
++
++/* VC4 DPI connector KMS struct */
++struct vc4_dpi_connector {
++      struct drm_connector base;
++      struct vc4_dpi *dpi;
++
++      /* Since the connector is attached to just the one encoder,
++       * this is the reference to it so we can do the best_encoder()
++       * hook.
++       */
++      struct drm_encoder *encoder;
++};
++
++static inline struct vc4_dpi_connector *
++to_vc4_dpi_connector(struct drm_connector *connector)
++{
++      return container_of(connector, struct vc4_dpi_connector, base);
++}
++
++#define DPI_REG(reg) { reg, #reg }
++static const struct {
++      u32 reg;
++      const char *name;
++} dpi_regs[] = {
++      DPI_REG(DPI_C),
++      DPI_REG(DPI_ID),
++};
++
++static void vc4_dpi_dump_regs(struct vc4_dpi *dpi)
++{
++      int i;
++
++      for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
++              DRM_INFO("0x%04x (%s): 0x%08x\n",
++                       dpi_regs[i].reg, dpi_regs[i].name,
++                       DPI_READ(dpi_regs[i].reg));
++      }
++}
++
++#ifdef CONFIG_DEBUG_FS
++int vc4_dpi_debugfs_regs(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);
++      struct vc4_dpi *dpi = vc4->dpi;
++      int i;
++
++      if (!dpi)
++              return 0;
++
++      for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
++              seq_printf(m, "%s (0x%04x): 0x%08x\n",
++                         dpi_regs[i].name, dpi_regs[i].reg,
++                         DPI_READ(dpi_regs[i].reg));
++      }
++
++      return 0;
++}
++#endif
++
++static enum drm_connector_status
++vc4_dpi_connector_detect(struct drm_connector *connector, bool force)
++{
++      struct vc4_dpi_connector *vc4_connector =
++              to_vc4_dpi_connector(connector);
++      struct vc4_dpi *dpi = vc4_connector->dpi;
++
++      if (dpi->panel)
++              return connector_status_connected;
++      else
++              return connector_status_disconnected;
++}
++
++static void vc4_dpi_connector_destroy(struct drm_connector *connector)
++{
++      drm_connector_unregister(connector);
++      drm_connector_cleanup(connector);
++}
++
++static int vc4_dpi_connector_get_modes(struct drm_connector *connector)
++{
++      struct vc4_dpi_connector *vc4_connector =
++              to_vc4_dpi_connector(connector);
++      struct vc4_dpi *dpi = vc4_connector->dpi;
++
++      if (dpi->panel)
++              return drm_panel_get_modes(dpi->panel);
++
++      return 0;
++}
++
++static struct drm_encoder *
++vc4_dpi_connector_best_encoder(struct drm_connector *connector)
++{
++      struct vc4_dpi_connector *dpi_connector =
++              to_vc4_dpi_connector(connector);
++      return dpi_connector->encoder;
++}
++
++static const struct drm_connector_funcs vc4_dpi_connector_funcs = {
++      .dpms = drm_atomic_helper_connector_dpms,
++      .detect = vc4_dpi_connector_detect,
++      .fill_modes = drm_helper_probe_single_connector_modes,
++      .destroy = vc4_dpi_connector_destroy,
++      .reset = drm_atomic_helper_connector_reset,
++      .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
++      .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
++};
++
++static const struct drm_connector_helper_funcs vc4_dpi_connector_helper_funcs = {
++      .get_modes = vc4_dpi_connector_get_modes,
++      .best_encoder = vc4_dpi_connector_best_encoder,
++};
++
++static struct drm_connector *vc4_dpi_connector_init(struct drm_device *dev,
++                                                  struct vc4_dpi *dpi)
++{
++      struct drm_connector *connector = NULL;
++      struct vc4_dpi_connector *dpi_connector;
++      int ret = 0;
++
++      dpi_connector = devm_kzalloc(dev->dev, sizeof(*dpi_connector),
++                                   GFP_KERNEL);
++      if (!dpi_connector) {
++              ret = -ENOMEM;
++              goto fail;
++      }
++      connector = &dpi_connector->base;
++
++      dpi_connector->encoder = dpi->encoder;
++      dpi_connector->dpi = dpi;
++
++      drm_connector_init(dev, connector, &vc4_dpi_connector_funcs,
++                         DRM_MODE_CONNECTOR_DPI);
++      drm_connector_helper_add(connector, &vc4_dpi_connector_helper_funcs);
++
++      connector->polled = 0;
++      connector->interlace_allowed = 0;
++      connector->doublescan_allowed = 0;
++
++      drm_mode_connector_attach_encoder(connector, dpi->encoder);
++
++      return connector;
++
++ fail:
++      if (connector)
++              vc4_dpi_connector_destroy(connector);
++
++      return ERR_PTR(ret);
++}
++
++static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = {
++      .destroy = drm_encoder_cleanup,
++};
++
++static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)
++{
++      struct vc4_dpi_encoder *vc4_encoder = to_vc4_dpi_encoder(encoder);
++      struct vc4_dpi *dpi = vc4_encoder->dpi;
++
++      drm_panel_disable(dpi->panel);
++
++      clk_disable_unprepare(dpi->pixel_clock);
++
++      drm_panel_unprepare(dpi->panel);
++}
++
++static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)
++{
++      struct drm_display_mode *mode = &encoder->crtc->mode;
++      struct vc4_dpi_encoder *vc4_encoder = to_vc4_dpi_encoder(encoder);
++      struct vc4_dpi *dpi = vc4_encoder->dpi;
++      u32 dpi_c = DPI_ENABLE | DPI_OUTPUT_ENABLE_MODE;
++      int ret;
++
++      ret = drm_panel_prepare(dpi->panel);
++      if (ret) {
++              DRM_ERROR("Panel failed to prepare\n");
++              return;
++      }
++
++      if (dpi->connector->display_info.num_bus_formats) {
++              u32 bus_format = dpi->connector->display_info.bus_formats[0];
++
++              switch (bus_format) {
++              case MEDIA_BUS_FMT_RGB888_1X24:
++                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
++                                             DPI_FORMAT);
++                      break;
++              case MEDIA_BUS_FMT_BGR888_1X24:
++                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
++                                             DPI_FORMAT);
++                      dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
++                      break;
++              case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
++                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
++                                             DPI_FORMAT);
++                      break;
++              case MEDIA_BUS_FMT_RGB666_1X18:
++                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
++                                             DPI_FORMAT);
++                      break;
++              case MEDIA_BUS_FMT_RGB565_1X16:
++                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
++                                             DPI_FORMAT);
++                      break;
++              default:
++                      DRM_ERROR("Unknown media bus format %d\n", bus_format);
++                      break;
++              }
++      }
++
++      if (mode->flags & DRM_MODE_FLAG_NHSYNC)
++              dpi_c |= DPI_HSYNC_INVERT;
++      else if (!(mode->flags & DRM_MODE_FLAG_PHSYNC))
++              dpi_c |= DPI_HSYNC_DISABLE;
++
++      if (mode->flags & DRM_MODE_FLAG_NVSYNC)
++              dpi_c |= DPI_VSYNC_INVERT;
++      else if (!(mode->flags & DRM_MODE_FLAG_PVSYNC))
++              dpi_c |= DPI_VSYNC_DISABLE;
++
++      DPI_WRITE(DPI_C, dpi_c);
++
++      ret = clk_set_rate(dpi->pixel_clock, mode->clock * 1000);
++      if (ret)
++              DRM_ERROR("Failed to set clock rate: %d\n", ret);
++
++      ret = clk_prepare_enable(dpi->pixel_clock);
++      if (ret)
++              DRM_ERROR("Failed to set clock rate: %d\n", ret);
++
++      ret = drm_panel_enable(dpi->panel);
++      if (ret) {
++              DRM_ERROR("Panel failed to enable\n");
++              drm_panel_unprepare(dpi->panel);
++              return;
++      }
++}
++
++static const struct drm_encoder_helper_funcs vc4_dpi_encoder_helper_funcs = {
++      .disable = vc4_dpi_encoder_disable,
++      .enable = vc4_dpi_encoder_enable,
++};
++
++static const struct of_device_id vc4_dpi_dt_match[] = {
++      { .compatible = "brcm,bcm2835-dpi", .data = NULL },
++      {}
++};
++
++/* Walks the OF graph to find the panel node and then asks DRM to look
++ * up the panel.
++ */
++static struct drm_panel *vc4_dpi_get_panel(struct device *dev)
++{
++      struct device_node *endpoint, *panel_node;
++      struct device_node *np = dev->of_node;
++      struct drm_panel *panel;
++
++      endpoint = of_graph_get_next_endpoint(np, NULL);
++      if (!endpoint) {
++              dev_err(dev, "no endpoint to fetch DPI panel\n");
++              return NULL;
++      }
++
++      /* don't proceed if we have an endpoint but no panel_node tied to it */
++      panel_node = of_graph_get_remote_port_parent(endpoint);
++      of_node_put(endpoint);
++      if (!panel_node) {
++              dev_err(dev, "no valid panel node\n");
++              return NULL;
++      }
++
++      panel = of_drm_find_panel(panel_node);
++      of_node_put(panel_node);
++
++      return panel;
++}
++
++static int vc4_dpi_bind(struct device *dev, struct device *master, void *data)
++{
++      struct platform_device *pdev = to_platform_device(dev);
++      struct drm_device *drm = dev_get_drvdata(master);
++      struct vc4_dev *vc4 = to_vc4_dev(drm);
++      struct vc4_dpi *dpi;
++      struct vc4_dpi_encoder *vc4_dpi_encoder;
++      int ret;
++
++      dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL);
++      if (!dpi)
++              return -ENOMEM;
++
++      vc4_dpi_encoder = devm_kzalloc(dev, sizeof(*vc4_dpi_encoder),
++                                     GFP_KERNEL);
++      if (!vc4_dpi_encoder)
++              return -ENOMEM;
++      vc4_dpi_encoder->base.type = VC4_ENCODER_TYPE_DPI;
++      vc4_dpi_encoder->dpi = dpi;
++      dpi->encoder = &vc4_dpi_encoder->base.base;
++
++      dpi->pdev = pdev;
++      dpi->regs = vc4_ioremap_regs(pdev, 0);
++      if (IS_ERR(dpi->regs))
++              return PTR_ERR(dpi->regs);
++
++      vc4_dpi_dump_regs(dpi);
++
++      if (DPI_READ(DPI_ID) != DPI_ID_VALUE) {
++              dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n",
++                      DPI_READ(DPI_ID), DPI_ID_VALUE);
++              return -ENODEV;
++      }
++
++      dpi->core_clock = devm_clk_get(dev, "core");
++      if (IS_ERR(dpi->core_clock)) {
++              ret = PTR_ERR(dpi->core_clock);
++              if (ret != -EPROBE_DEFER)
++                      DRM_ERROR("Failed to get core clock: %d\n", ret);
++              return ret;
++      }
++      dpi->pixel_clock = devm_clk_get(dev, "pixel");
++      if (IS_ERR(dpi->pixel_clock)) {
++              ret = PTR_ERR(dpi->pixel_clock);
++              if (ret != -EPROBE_DEFER)
++                      DRM_ERROR("Failed to get pixel clock: %d\n", ret);
++              return ret;
++      }
++
++      ret = clk_prepare_enable(dpi->core_clock);
++      if (ret)
++              DRM_ERROR("Failed to turn on core clock: %d\n", ret);
++
++      dpi->panel = vc4_dpi_get_panel(dev);
++
++      drm_encoder_init(drm, dpi->encoder, &vc4_dpi_encoder_funcs,
++                       DRM_MODE_ENCODER_DPI);
++      drm_encoder_helper_add(dpi->encoder, &vc4_dpi_encoder_helper_funcs);
++
++      dpi->connector = vc4_dpi_connector_init(drm, dpi);
++      if (IS_ERR(dpi->connector)) {
++              ret = PTR_ERR(dpi->connector);
++              goto err_destroy_encoder;
++      }
++
++      if (dpi->panel)
++              drm_panel_attach(dpi->panel, dpi->connector);
++
++      dev_set_drvdata(dev, dpi);
++
++      vc4->dpi = dpi;
++
++      return 0;
++
++err_destroy_encoder:
++      drm_encoder_cleanup(dpi->encoder);
++      clk_disable_unprepare(dpi->core_clock);
++      return ret;
++}
++
++static void vc4_dpi_unbind(struct device *dev, struct device *master,
++                         void *data)
++{
++      struct drm_device *drm = dev_get_drvdata(master);
++      struct vc4_dev *vc4 = to_vc4_dev(drm);
++      struct vc4_dpi *dpi = dev_get_drvdata(dev);
++
++      if (dpi->panel)
++              drm_panel_detach(dpi->panel);
++
++      vc4_dpi_connector_destroy(dpi->connector);
++      drm_encoder_cleanup(dpi->encoder);
++
++      clk_disable_unprepare(dpi->core_clock);
++
++      vc4->dpi = NULL;
++}
++
++static const struct component_ops vc4_dpi_ops = {
++      .bind   = vc4_dpi_bind,
++      .unbind = vc4_dpi_unbind,
++};
++
++static int vc4_dpi_dev_probe(struct platform_device *pdev)
++{
++      return component_add(&pdev->dev, &vc4_dpi_ops);
++}
++
++static int vc4_dpi_dev_remove(struct platform_device *pdev)
++{
++      component_del(&pdev->dev, &vc4_dpi_ops);
++      return 0;
++}
++
++struct platform_driver vc4_dpi_driver = {
++      .probe = vc4_dpi_dev_probe,
++      .remove = vc4_dpi_dev_remove,
++      .driver = {
++              .name = "vc4_dpi",
++              .of_match_table = vc4_dpi_dt_match,
++      },
++};
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -259,6 +259,7 @@ static const struct component_master_ops
+ static struct platform_driver *const component_drivers[] = {
+       &vc4_hdmi_driver,
++      &vc4_dpi_driver,
+       &vc4_crtc_driver,
+       &vc4_hvs_driver,
+       &vc4_v3d_driver,
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -16,6 +16,7 @@ struct vc4_dev {
+       struct vc4_hvs *hvs;
+       struct vc4_crtc *crtc[3];
+       struct vc4_v3d *v3d;
++      struct vc4_dpi *dpi;
+       struct drm_fbdev_cma *fbdev;
+       struct rpi_firmware *firmware;
+@@ -418,6 +419,10 @@ void vc4_debugfs_cleanup(struct drm_mino
+ /* vc4_drv.c */
+ void __iomem *vc4_ioremap_regs(struct platform_device *dev, int index);
++/* vc4_dpi.c */
++extern struct platform_driver vc4_dpi_driver;
++int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused);
++
+ /* vc4_gem.c */
+ void vc4_gem_init(struct drm_device *dev);
+ void vc4_gem_destroy(struct drm_device *dev);
diff --git a/target/linux/brcm2708/patches-4.4/0331-dt-bindings-Add-binding-docs-for-V3D.patch b/target/linux/brcm2708/patches-4.4/0331-dt-bindings-Add-binding-docs-for-V3D.patch
deleted file mode 100644 (file)
index c46c843..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From f0be0cb1bc970ddc67e9194d4d6ca5a3a18cd903 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 4 Mar 2016 12:32:06 -0800
-Subject: [PATCH 331/423] dt-bindings: Add binding docs for V3D.
-
-This was missed in the upstreaming process.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Acked-by: Stephen Warren <swarren@wwwdotorg.org>
-(cherry picked from commit 4653f22e9ab08b2b7178b7262a9326eb777e0266)
----
- Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
-
---- a/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
-+++ b/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
-@@ -35,6 +35,12 @@ Optional properties for HDMI:
-                 as an interrupt/status bit in the HDMI controller
-                 itself).  See bindings/pinctrl/brcm,bcm2835-gpio.txt
-+Required properties for V3D:
-+- compatible: Should be "brcm,bcm2835-v3d"
-+- reg:                Physical base address and length of the V3D's registers
-+- interrupts: The interrupt number
-+                See bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
-+
- Example:
- pixelvalve@7e807000 {
-       compatible = "brcm,bcm2835-pixelvalve2";
-@@ -60,6 +66,12 @@ hdmi: hdmi@7e902000 {
-       clock-names = "pixel", "hdmi";
- };
-+v3d: v3d@7ec00000 {
-+      compatible = "brcm,bcm2835-v3d";
-+      reg = <0x7ec00000 0x1000>;
-+      interrupts = <1 10>;
-+};
-+
- vc4: gpu {
-       compatible = "brcm,bcm2835-vc4";
- };
diff --git a/target/linux/brcm2708/patches-4.4/0332-drm-vc4-Add-DPI-driver.patch b/target/linux/brcm2708/patches-4.4/0332-drm-vc4-Add-DPI-driver.patch
deleted file mode 100644 (file)
index d05c27e..0000000
+++ /dev/null
@@ -1,673 +0,0 @@
-From dca9cac2b454a88889adc7befac74090612576ef Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Wed, 10 Feb 2016 11:42:32 -0800
-Subject: [PATCH 332/423] drm/vc4: Add DPI driver
-
-The DPI interface involves taking a ton of our GPIOs to be used as
-outputs, and routing display signals over them in parallel.
-
-v2: Use display_info.bus_formats[] to replace our custom DT
-    properties.
-v3: Rebase on V3D documentation changes.
-v4: Fix rebase detritus from V3D documentation changes.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Acked-by: Rob Herring <robh@kernel.org>
-(cherry picked from commit 08302c35b59d306ff37b996e56fb2a488c1d2c2e)
----
- .../devicetree/bindings/display/brcm,bcm-vc4.txt   |  36 ++
- drivers/gpu/drm/vc4/Kconfig                        |   1 +
- drivers/gpu/drm/vc4/Makefile                       |   1 +
- drivers/gpu/drm/vc4/vc4_debugfs.c                  |   1 +
- drivers/gpu/drm/vc4/vc4_dpi.c                      | 520 +++++++++++++++++++++
- drivers/gpu/drm/vc4/vc4_drv.c                      |   1 +
- drivers/gpu/drm/vc4/vc4_drv.h                      |   5 +
- 7 files changed, 565 insertions(+)
- create mode 100644 drivers/gpu/drm/vc4/vc4_dpi.c
-
---- a/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
-+++ b/Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
-@@ -35,12 +35,22 @@ Optional properties for HDMI:
-                 as an interrupt/status bit in the HDMI controller
-                 itself).  See bindings/pinctrl/brcm,bcm2835-gpio.txt
-+Required properties for DPI:
-+- compatible: Should be "brcm,bcm2835-dpi"
-+- reg:                Physical base address and length of the registers
-+- clocks:     a) core: The core clock the unit runs on
-+              b) pixel: The pixel clock that feeds the pixelvalve
-+- port:               Port node with a single endpoint connecting to the panel
-+                device, as defined in [1]
-+
- Required properties for V3D:
- - compatible: Should be "brcm,bcm2835-v3d"
- - reg:                Physical base address and length of the V3D's registers
- - interrupts: The interrupt number
-                 See bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
-+[1] Documentation/devicetree/bindings/media/video-interfaces.txt
-+
- Example:
- pixelvalve@7e807000 {
-       compatible = "brcm,bcm2835-pixelvalve2";
-@@ -66,6 +76,22 @@ hdmi: hdmi@7e902000 {
-       clock-names = "pixel", "hdmi";
- };
-+dpi: dpi@7e208000 {
-+      compatible = "brcm,bcm2835-dpi";
-+      reg = <0x7e208000 0x8c>;
-+      clocks = <&clocks BCM2835_CLOCK_VPU>,
-+               <&clocks BCM2835_CLOCK_DPI>;
-+      clock-names = "core", "pixel";
-+      #address-cells = <1>;
-+      #size-cells = <0>;
-+
-+      port {
-+              dpi_out: endpoint@0 {
-+                      remote-endpoint = <&panel_in>;
-+              };
-+      };
-+};
-+
- v3d: v3d@7ec00000 {
-       compatible = "brcm,bcm2835-v3d";
-       reg = <0x7ec00000 0x1000>;
-@@ -75,3 +101,13 @@ v3d: v3d@7ec00000 {
- vc4: gpu {
-       compatible = "brcm,bcm2835-vc4";
- };
-+
-+panel: panel {
-+      compatible = "ontat,yx700wv03", "simple-panel";
-+
-+      port {
-+              panel_in: endpoint {
-+                      remote-endpoint = <&dpi_out>;
-+              };
-+      };
-+};
---- a/drivers/gpu/drm/vc4/Kconfig
-+++ b/drivers/gpu/drm/vc4/Kconfig
-@@ -5,6 +5,7 @@ config DRM_VC4
-       select DRM_KMS_HELPER
-       select DRM_KMS_CMA_HELPER
-       select DRM_GEM_CMA_HELPER
-+      select DRM_PANEL
-       help
-         Choose this option if you have a system that has a Broadcom
-         VC4 GPU, such as the Raspberry Pi or other BCM2708/BCM2835.
---- a/drivers/gpu/drm/vc4/Makefile
-+++ b/drivers/gpu/drm/vc4/Makefile
-@@ -7,6 +7,7 @@ vc4-y := \
-       vc4_bo.o \
-       vc4_crtc.o \
-       vc4_drv.o \
-+      vc4_dpi.o \
-       vc4_kms.o \
-       vc4_gem.o \
-       vc4_hdmi.o \
---- 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},
-+      {"dpi_regs", vc4_dpi_debugfs_regs, 0},
-       {"gem_exec", vc4_gem_exec_debugfs, 0},
-       {"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
-       {"hvs_regs", vc4_hvs_debugfs_regs, 0},
---- /dev/null
-+++ b/drivers/gpu/drm/vc4/vc4_dpi.c
-@@ -0,0 +1,520 @@
-+/*
-+ * Copyright (C) 2016 Broadcom Limited
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published by
-+ * the Free Software Foundation.
-+ *
-+ * 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/>.
-+ */
-+
-+/**
-+ * DOC: VC4 DPI module
-+ *
-+ * The VC4 DPI hardware supports MIPI DPI type 4 and Nokia ViSSI
-+ * signals, which are routed out to GPIO0-27 with the ALT2 function.
-+ */
-+
-+#include "drm_atomic_helper.h"
-+#include "drm_crtc_helper.h"
-+#include "drm_edid.h"
-+#include "drm_panel.h"
-+#include "linux/clk.h"
-+#include "linux/component.h"
-+#include "linux/of_graph.h"
-+#include "linux/of_platform.h"
-+#include "vc4_drv.h"
-+#include "vc4_regs.h"
-+
-+#define DPI_C                 0x00
-+# define DPI_OUTPUT_ENABLE_MODE               BIT(16)
-+
-+/* The order field takes the incoming 24 bit RGB from the pixel valve
-+ * and shuffles the 3 channels.
-+ */
-+# define DPI_ORDER_MASK                       VC4_MASK(15, 14)
-+# define DPI_ORDER_SHIFT              14
-+# define DPI_ORDER_RGB                        0
-+# define DPI_ORDER_BGR                        1
-+# define DPI_ORDER_GRB                        2
-+# define DPI_ORDER_BRG                        3
-+
-+/* The format field takes the ORDER-shuffled pixel valve data and
-+ * formats it onto the output lines.
-+ */
-+# define DPI_FORMAT_MASK              VC4_MASK(13, 11)
-+# define DPI_FORMAT_SHIFT             11
-+/* This define is named in the hardware, but actually just outputs 0. */
-+# define DPI_FORMAT_9BIT_666_RGB      0
-+/* Outputs 00000000rrrrrggggggbbbbb */
-+# define DPI_FORMAT_16BIT_565_RGB_1   1
-+/* Outputs 000rrrrr00gggggg000bbbbb */
-+# define DPI_FORMAT_16BIT_565_RGB_2   2
-+/* Outputs 00rrrrr000gggggg00bbbbb0 */
-+# define DPI_FORMAT_16BIT_565_RGB_3   3
-+/* Outputs 000000rrrrrrggggggbbbbbb */
-+# define DPI_FORMAT_18BIT_666_RGB_1   4
-+/* Outputs 00rrrrrr00gggggg00bbbbbb */
-+# define DPI_FORMAT_18BIT_666_RGB_2   5
-+/* Outputs rrrrrrrrggggggggbbbbbbbb */
-+# define DPI_FORMAT_24BIT_888_RGB     6
-+
-+/* Reverses the polarity of the corresponding signal */
-+# define DPI_PIXEL_CLK_INVERT         BIT(10)
-+# define DPI_HSYNC_INVERT             BIT(9)
-+# define DPI_VSYNC_INVERT             BIT(8)
-+# define DPI_OUTPUT_ENABLE_INVERT     BIT(7)
-+
-+/* Outputs the signal the falling clock edge instead of rising. */
-+# define DPI_HSYNC_NEGATE             BIT(6)
-+# define DPI_VSYNC_NEGATE             BIT(5)
-+# define DPI_OUTPUT_ENABLE_NEGATE     BIT(4)
-+
-+/* Disables the signal */
-+# define DPI_HSYNC_DISABLE            BIT(3)
-+# define DPI_VSYNC_DISABLE            BIT(2)
-+# define DPI_OUTPUT_ENABLE_DISABLE    BIT(1)
-+
-+/* Power gate to the device, full reset at 0 -> 1 transition */
-+# define DPI_ENABLE                   BIT(0)
-+
-+/* All other registers besides DPI_C return the ID */
-+#define DPI_ID                        0x04
-+# define DPI_ID_VALUE         0x00647069
-+
-+/* General DPI hardware state. */
-+struct vc4_dpi {
-+      struct platform_device *pdev;
-+
-+      struct drm_encoder *encoder;
-+      struct drm_connector *connector;
-+      struct drm_panel *panel;
-+
-+      void __iomem *regs;
-+
-+      struct clk *pixel_clock;
-+      struct clk *core_clock;
-+};
-+
-+#define DPI_READ(offset) readl(dpi->regs + (offset))
-+#define DPI_WRITE(offset, val) writel(val, dpi->regs + (offset))
-+
-+/* VC4 DPI encoder KMS struct */
-+struct vc4_dpi_encoder {
-+      struct vc4_encoder base;
-+      struct vc4_dpi *dpi;
-+};
-+
-+static inline struct vc4_dpi_encoder *
-+to_vc4_dpi_encoder(struct drm_encoder *encoder)
-+{
-+      return container_of(encoder, struct vc4_dpi_encoder, base.base);
-+}
-+
-+/* VC4 DPI connector KMS struct */
-+struct vc4_dpi_connector {
-+      struct drm_connector base;
-+      struct vc4_dpi *dpi;
-+
-+      /* Since the connector is attached to just the one encoder,
-+       * this is the reference to it so we can do the best_encoder()
-+       * hook.
-+       */
-+      struct drm_encoder *encoder;
-+};
-+
-+static inline struct vc4_dpi_connector *
-+to_vc4_dpi_connector(struct drm_connector *connector)
-+{
-+      return container_of(connector, struct vc4_dpi_connector, base);
-+}
-+
-+#define DPI_REG(reg) { reg, #reg }
-+static const struct {
-+      u32 reg;
-+      const char *name;
-+} dpi_regs[] = {
-+      DPI_REG(DPI_C),
-+      DPI_REG(DPI_ID),
-+};
-+
-+static void vc4_dpi_dump_regs(struct vc4_dpi *dpi)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
-+              DRM_INFO("0x%04x (%s): 0x%08x\n",
-+                       dpi_regs[i].reg, dpi_regs[i].name,
-+                       DPI_READ(dpi_regs[i].reg));
-+      }
-+}
-+
-+#ifdef CONFIG_DEBUG_FS
-+int vc4_dpi_debugfs_regs(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);
-+      struct vc4_dpi *dpi = vc4->dpi;
-+      int i;
-+
-+      if (!dpi)
-+              return 0;
-+
-+      for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
-+              seq_printf(m, "%s (0x%04x): 0x%08x\n",
-+                         dpi_regs[i].name, dpi_regs[i].reg,
-+                         DPI_READ(dpi_regs[i].reg));
-+      }
-+
-+      return 0;
-+}
-+#endif
-+
-+static enum drm_connector_status
-+vc4_dpi_connector_detect(struct drm_connector *connector, bool force)
-+{
-+      struct vc4_dpi_connector *vc4_connector =
-+              to_vc4_dpi_connector(connector);
-+      struct vc4_dpi *dpi = vc4_connector->dpi;
-+
-+      if (dpi->panel)
-+              return connector_status_connected;
-+      else
-+              return connector_status_disconnected;
-+}
-+
-+static void vc4_dpi_connector_destroy(struct drm_connector *connector)
-+{
-+      drm_connector_unregister(connector);
-+      drm_connector_cleanup(connector);
-+}
-+
-+static int vc4_dpi_connector_get_modes(struct drm_connector *connector)
-+{
-+      struct vc4_dpi_connector *vc4_connector =
-+              to_vc4_dpi_connector(connector);
-+      struct vc4_dpi *dpi = vc4_connector->dpi;
-+
-+      if (dpi->panel)
-+              return drm_panel_get_modes(dpi->panel);
-+
-+      return 0;
-+}
-+
-+static struct drm_encoder *
-+vc4_dpi_connector_best_encoder(struct drm_connector *connector)
-+{
-+      struct vc4_dpi_connector *dpi_connector =
-+              to_vc4_dpi_connector(connector);
-+      return dpi_connector->encoder;
-+}
-+
-+static const struct drm_connector_funcs vc4_dpi_connector_funcs = {
-+      .dpms = drm_atomic_helper_connector_dpms,
-+      .detect = vc4_dpi_connector_detect,
-+      .fill_modes = drm_helper_probe_single_connector_modes,
-+      .destroy = vc4_dpi_connector_destroy,
-+      .reset = drm_atomic_helper_connector_reset,
-+      .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-+      .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-+};
-+
-+static const struct drm_connector_helper_funcs vc4_dpi_connector_helper_funcs = {
-+      .get_modes = vc4_dpi_connector_get_modes,
-+      .best_encoder = vc4_dpi_connector_best_encoder,
-+};
-+
-+static struct drm_connector *vc4_dpi_connector_init(struct drm_device *dev,
-+                                                  struct vc4_dpi *dpi)
-+{
-+      struct drm_connector *connector = NULL;
-+      struct vc4_dpi_connector *dpi_connector;
-+      int ret = 0;
-+
-+      dpi_connector = devm_kzalloc(dev->dev, sizeof(*dpi_connector),
-+                                   GFP_KERNEL);
-+      if (!dpi_connector) {
-+              ret = -ENOMEM;
-+              goto fail;
-+      }
-+      connector = &dpi_connector->base;
-+
-+      dpi_connector->encoder = dpi->encoder;
-+      dpi_connector->dpi = dpi;
-+
-+      drm_connector_init(dev, connector, &vc4_dpi_connector_funcs,
-+                         DRM_MODE_CONNECTOR_DPI);
-+      drm_connector_helper_add(connector, &vc4_dpi_connector_helper_funcs);
-+
-+      connector->polled = 0;
-+      connector->interlace_allowed = 0;
-+      connector->doublescan_allowed = 0;
-+
-+      drm_mode_connector_attach_encoder(connector, dpi->encoder);
-+
-+      return connector;
-+
-+ fail:
-+      if (connector)
-+              vc4_dpi_connector_destroy(connector);
-+
-+      return ERR_PTR(ret);
-+}
-+
-+static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = {
-+      .destroy = drm_encoder_cleanup,
-+};
-+
-+static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)
-+{
-+      struct vc4_dpi_encoder *vc4_encoder = to_vc4_dpi_encoder(encoder);
-+      struct vc4_dpi *dpi = vc4_encoder->dpi;
-+
-+      drm_panel_disable(dpi->panel);
-+
-+      clk_disable_unprepare(dpi->pixel_clock);
-+
-+      drm_panel_unprepare(dpi->panel);
-+}
-+
-+static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)
-+{
-+      struct drm_display_mode *mode = &encoder->crtc->mode;
-+      struct vc4_dpi_encoder *vc4_encoder = to_vc4_dpi_encoder(encoder);
-+      struct vc4_dpi *dpi = vc4_encoder->dpi;
-+      u32 dpi_c = DPI_ENABLE | DPI_OUTPUT_ENABLE_MODE;
-+      int ret;
-+
-+      ret = drm_panel_prepare(dpi->panel);
-+      if (ret) {
-+              DRM_ERROR("Panel failed to prepare\n");
-+              return;
-+      }
-+
-+      if (dpi->connector->display_info.num_bus_formats) {
-+              u32 bus_format = dpi->connector->display_info.bus_formats[0];
-+
-+              switch (bus_format) {
-+              case MEDIA_BUS_FMT_RGB888_1X24:
-+                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
-+                                             DPI_FORMAT);
-+                      break;
-+              case MEDIA_BUS_FMT_BGR888_1X24:
-+                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
-+                                             DPI_FORMAT);
-+                      dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
-+                      break;
-+              case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
-+                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
-+                                             DPI_FORMAT);
-+                      break;
-+              case MEDIA_BUS_FMT_RGB666_1X18:
-+                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
-+                                             DPI_FORMAT);
-+                      break;
-+              case MEDIA_BUS_FMT_RGB565_1X16:
-+                      dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
-+                                             DPI_FORMAT);
-+                      break;
-+              default:
-+                      DRM_ERROR("Unknown media bus format %d\n", bus_format);
-+                      break;
-+              }
-+      }
-+
-+      if (mode->flags & DRM_MODE_FLAG_NHSYNC)
-+              dpi_c |= DPI_HSYNC_INVERT;
-+      else if (!(mode->flags & DRM_MODE_FLAG_PHSYNC))
-+              dpi_c |= DPI_HSYNC_DISABLE;
-+
-+      if (mode->flags & DRM_MODE_FLAG_NVSYNC)
-+              dpi_c |= DPI_VSYNC_INVERT;
-+      else if (!(mode->flags & DRM_MODE_FLAG_PVSYNC))
-+              dpi_c |= DPI_VSYNC_DISABLE;
-+
-+      DPI_WRITE(DPI_C, dpi_c);
-+
-+      ret = clk_set_rate(dpi->pixel_clock, mode->clock * 1000);
-+      if (ret)
-+              DRM_ERROR("Failed to set clock rate: %d\n", ret);
-+
-+      ret = clk_prepare_enable(dpi->pixel_clock);
-+      if (ret)
-+              DRM_ERROR("Failed to set clock rate: %d\n", ret);
-+
-+      ret = drm_panel_enable(dpi->panel);
-+      if (ret) {
-+              DRM_ERROR("Panel failed to enable\n");
-+              drm_panel_unprepare(dpi->panel);
-+              return;
-+      }
-+}
-+
-+static const struct drm_encoder_helper_funcs vc4_dpi_encoder_helper_funcs = {
-+      .disable = vc4_dpi_encoder_disable,
-+      .enable = vc4_dpi_encoder_enable,
-+};
-+
-+static const struct of_device_id vc4_dpi_dt_match[] = {
-+      { .compatible = "brcm,bcm2835-dpi", .data = NULL },
-+      {}
-+};
-+
-+/* Walks the OF graph to find the panel node and then asks DRM to look
-+ * up the panel.
-+ */
-+static struct drm_panel *vc4_dpi_get_panel(struct device *dev)
-+{
-+      struct device_node *endpoint, *panel_node;
-+      struct device_node *np = dev->of_node;
-+      struct drm_panel *panel;
-+
-+      endpoint = of_graph_get_next_endpoint(np, NULL);
-+      if (!endpoint) {
-+              dev_err(dev, "no endpoint to fetch DPI panel\n");
-+              return NULL;
-+      }
-+
-+      /* don't proceed if we have an endpoint but no panel_node tied to it */
-+      panel_node = of_graph_get_remote_port_parent(endpoint);
-+      of_node_put(endpoint);
-+      if (!panel_node) {
-+              dev_err(dev, "no valid panel node\n");
-+              return NULL;
-+      }
-+
-+      panel = of_drm_find_panel(panel_node);
-+      of_node_put(panel_node);
-+
-+      return panel;
-+}
-+
-+static int vc4_dpi_bind(struct device *dev, struct device *master, void *data)
-+{
-+      struct platform_device *pdev = to_platform_device(dev);
-+      struct drm_device *drm = dev_get_drvdata(master);
-+      struct vc4_dev *vc4 = to_vc4_dev(drm);
-+      struct vc4_dpi *dpi;
-+      struct vc4_dpi_encoder *vc4_dpi_encoder;
-+      int ret;
-+
-+      dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL);
-+      if (!dpi)
-+              return -ENOMEM;
-+
-+      vc4_dpi_encoder = devm_kzalloc(dev, sizeof(*vc4_dpi_encoder),
-+                                     GFP_KERNEL);
-+      if (!vc4_dpi_encoder)
-+              return -ENOMEM;
-+      vc4_dpi_encoder->base.type = VC4_ENCODER_TYPE_DPI;
-+      vc4_dpi_encoder->dpi = dpi;
-+      dpi->encoder = &vc4_dpi_encoder->base.base;
-+
-+      dpi->pdev = pdev;
-+      dpi->regs = vc4_ioremap_regs(pdev, 0);
-+      if (IS_ERR(dpi->regs))
-+              return PTR_ERR(dpi->regs);
-+
-+      vc4_dpi_dump_regs(dpi);
-+
-+      if (DPI_READ(DPI_ID) != DPI_ID_VALUE) {
-+              dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n",
-+                      DPI_READ(DPI_ID), DPI_ID_VALUE);
-+              return -ENODEV;
-+      }
-+
-+      dpi->core_clock = devm_clk_get(dev, "core");
-+      if (IS_ERR(dpi->core_clock)) {
-+              ret = PTR_ERR(dpi->core_clock);
-+              if (ret != -EPROBE_DEFER)
-+                      DRM_ERROR("Failed to get core clock: %d\n", ret);
-+              return ret;
-+      }
-+      dpi->pixel_clock = devm_clk_get(dev, "pixel");
-+      if (IS_ERR(dpi->pixel_clock)) {
-+              ret = PTR_ERR(dpi->pixel_clock);
-+              if (ret != -EPROBE_DEFER)
-+                      DRM_ERROR("Failed to get pixel clock: %d\n", ret);
-+              return ret;
-+      }
-+
-+      ret = clk_prepare_enable(dpi->core_clock);
-+      if (ret)
-+              DRM_ERROR("Failed to turn on core clock: %d\n", ret);
-+
-+      dpi->panel = vc4_dpi_get_panel(dev);
-+
-+      drm_encoder_init(drm, dpi->encoder, &vc4_dpi_encoder_funcs,
-+                       DRM_MODE_ENCODER_DPI);
-+      drm_encoder_helper_add(dpi->encoder, &vc4_dpi_encoder_helper_funcs);
-+
-+      dpi->connector = vc4_dpi_connector_init(drm, dpi);
-+      if (IS_ERR(dpi->connector)) {
-+              ret = PTR_ERR(dpi->connector);
-+              goto err_destroy_encoder;
-+      }
-+
-+      if (dpi->panel)
-+              drm_panel_attach(dpi->panel, dpi->connector);
-+
-+      dev_set_drvdata(dev, dpi);
-+
-+      vc4->dpi = dpi;
-+
-+      return 0;
-+
-+err_destroy_encoder:
-+      drm_encoder_cleanup(dpi->encoder);
-+      clk_disable_unprepare(dpi->core_clock);
-+      return ret;
-+}
-+
-+static void vc4_dpi_unbind(struct device *dev, struct device *master,
-+                         void *data)
-+{
-+      struct drm_device *drm = dev_get_drvdata(master);
-+      struct vc4_dev *vc4 = to_vc4_dev(drm);
-+      struct vc4_dpi *dpi = dev_get_drvdata(dev);
-+
-+      if (dpi->panel)
-+              drm_panel_detach(dpi->panel);
-+
-+      vc4_dpi_connector_destroy(dpi->connector);
-+      drm_encoder_cleanup(dpi->encoder);
-+
-+      clk_disable_unprepare(dpi->core_clock);
-+
-+      vc4->dpi = NULL;
-+}
-+
-+static const struct component_ops vc4_dpi_ops = {
-+      .bind   = vc4_dpi_bind,
-+      .unbind = vc4_dpi_unbind,
-+};
-+
-+static int vc4_dpi_dev_probe(struct platform_device *pdev)
-+{
-+      return component_add(&pdev->dev, &vc4_dpi_ops);
-+}
-+
-+static int vc4_dpi_dev_remove(struct platform_device *pdev)
-+{
-+      component_del(&pdev->dev, &vc4_dpi_ops);
-+      return 0;
-+}
-+
-+struct platform_driver vc4_dpi_driver = {
-+      .probe = vc4_dpi_dev_probe,
-+      .remove = vc4_dpi_dev_remove,
-+      .driver = {
-+              .name = "vc4_dpi",
-+              .of_match_table = vc4_dpi_dt_match,
-+      },
-+};
---- a/drivers/gpu/drm/vc4/vc4_drv.c
-+++ b/drivers/gpu/drm/vc4/vc4_drv.c
-@@ -259,6 +259,7 @@ static const struct component_master_ops
- static struct platform_driver *const component_drivers[] = {
-       &vc4_hdmi_driver,
-+      &vc4_dpi_driver,
-       &vc4_crtc_driver,
-       &vc4_hvs_driver,
-       &vc4_v3d_driver,
---- a/drivers/gpu/drm/vc4/vc4_drv.h
-+++ b/drivers/gpu/drm/vc4/vc4_drv.h
-@@ -16,6 +16,7 @@ struct vc4_dev {
-       struct vc4_hvs *hvs;
-       struct vc4_crtc *crtc[3];
-       struct vc4_v3d *v3d;
-+      struct vc4_dpi *dpi;
-       struct drm_fbdev_cma *fbdev;
-       struct rpi_firmware *firmware;
-@@ -418,6 +419,10 @@ void vc4_debugfs_cleanup(struct drm_mino
- /* vc4_drv.c */
- void __iomem *vc4_ioremap_regs(struct platform_device *dev, int index);
-+/* vc4_dpi.c */
-+extern struct platform_driver vc4_dpi_driver;
-+int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused);
-+
- /* vc4_gem.c */
- void vc4_gem_init(struct drm_device *dev);
- void vc4_gem_destroy(struct drm_device *dev);
diff --git a/target/linux/brcm2708/patches-4.4/0332-drm-vc4-Fix-NULL-deref-in-HDMI-init-error-path.patch b/target/linux/brcm2708/patches-4.4/0332-drm-vc4-Fix-NULL-deref-in-HDMI-init-error-path.patch
new file mode 100644 (file)
index 0000000..e702146
--- /dev/null
@@ -0,0 +1,25 @@
+From 69def03fa1b25514d142397748522e1f88b325cb Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 4 Apr 2016 14:25:59 -0700
+Subject: [PATCH] drm/vc4: Fix NULL deref in HDMI init error path
+
+If you make it here other than through err_destroy_encoder, vc4->hdmi
+is still NULL.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 5883980313af70aec0ceebaef6ef0709726e5e63)
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -573,7 +573,7 @@ err_unprepare_hsm:
+ err_unprepare_pix:
+       clk_disable_unprepare(hdmi->pixel_clock);
+ err_put_i2c:
+-      put_device(&vc4->hdmi->ddc->dev);
++      put_device(&hdmi->ddc->dev);
+       return ret;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0333-drm-vc4-Fix-NULL-deref-in-HDMI-init-error-path.patch b/target/linux/brcm2708/patches-4.4/0333-drm-vc4-Fix-NULL-deref-in-HDMI-init-error-path.patch
deleted file mode 100644 (file)
index cf7a647..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From 1d72ad4fa3c57879ab677f66ce957a093eeb577c Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Mon, 4 Apr 2016 14:25:59 -0700
-Subject: [PATCH 333/423] drm/vc4: Fix NULL deref in HDMI init error path
-
-If you make it here other than through err_destroy_encoder, vc4->hdmi
-is still NULL.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-(cherry picked from commit 5883980313af70aec0ceebaef6ef0709726e5e63)
----
- drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/gpu/drm/vc4/vc4_hdmi.c
-+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
-@@ -573,7 +573,7 @@ err_unprepare_hsm:
- err_unprepare_pix:
-       clk_disable_unprepare(hdmi->pixel_clock);
- err_put_i2c:
--      put_device(&vc4->hdmi->ddc->dev);
-+      put_device(&hdmi->ddc->dev);
-       return ret;
- }
diff --git a/target/linux/brcm2708/patches-4.4/0333-drm-vc4-Kick-out-the-simplefb-framebuffer-before-we-.patch b/target/linux/brcm2708/patches-4.4/0333-drm-vc4-Kick-out-the-simplefb-framebuffer-before-we-.patch
new file mode 100644 (file)
index 0000000..8347338
--- /dev/null
@@ -0,0 +1,53 @@
+From 8fde5a249d84674a92b4732def88cbc47f2bb530 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 19 Apr 2016 13:24:14 -0700
+Subject: [PATCH] drm/vc4: Kick out the simplefb framebuffer before we set up
+ KMS.
+
+If we don't, then simplefb stays loaded on /dev/fb0 even though
+scanout isn't happening from simplefb's memory area any more, and you
+end up with no console.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Acked-by: Dave Airlie <airlied@redhat.com>
+(cherry picked from commit b3a15f6d55fb584dd4d8baac5d1b6a398720620c)
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -164,6 +164,24 @@ static void vc4_match_add_drivers(struct
+       }
+ }
++static void vc4_kick_out_firmware_fb(void)
++{
++      struct apertures_struct *ap;
++
++      ap = alloc_apertures(1);
++      if (!ap)
++              return;
++
++      /* Since VC4 is a UMA device, the simplefb node may have been
++       * located anywhere in memory.
++       */
++      ap->ranges[0].base = 0;
++      ap->ranges[0].size = ~0;
++
++      remove_conflicting_framebuffers(ap, "vc4drmfb", false);
++      kfree(ap);
++}
++
+ static int vc4_drm_bind(struct device *dev)
+ {
+       struct platform_device *pdev = to_platform_device(dev);
+@@ -208,6 +226,8 @@ static int vc4_drm_bind(struct device *d
+       if (ret)
+               goto gem_destroy;
++      vc4_kick_out_firmware_fb();
++
+       ret = drm_dev_register(drm, 0);
+       if (ret < 0)
+               goto unbind_all;
diff --git a/target/linux/brcm2708/patches-4.4/0334-drm-vc4-Kick-out-the-simplefb-framebuffer-before-we-.patch b/target/linux/brcm2708/patches-4.4/0334-drm-vc4-Kick-out-the-simplefb-framebuffer-before-we-.patch
deleted file mode 100644 (file)
index f42eb5b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-From d8bb97aba2a3d6c946b7c176370a71d117dee52c Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Tue, 19 Apr 2016 13:24:14 -0700
-Subject: [PATCH 334/423] drm/vc4: Kick out the simplefb framebuffer before we
- set up KMS.
-
-If we don't, then simplefb stays loaded on /dev/fb0 even though
-scanout isn't happening from simplefb's memory area any more, and you
-end up with no console.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Acked-by: Dave Airlie <airlied@redhat.com>
-(cherry picked from commit b3a15f6d55fb584dd4d8baac5d1b6a398720620c)
----
- drivers/gpu/drm/vc4/vc4_drv.c | 20 ++++++++++++++++++++
- 1 file changed, 20 insertions(+)
-
---- a/drivers/gpu/drm/vc4/vc4_drv.c
-+++ b/drivers/gpu/drm/vc4/vc4_drv.c
-@@ -164,6 +164,24 @@ static void vc4_match_add_drivers(struct
-       }
- }
-+static void vc4_kick_out_firmware_fb(void)
-+{
-+      struct apertures_struct *ap;
-+
-+      ap = alloc_apertures(1);
-+      if (!ap)
-+              return;
-+
-+      /* Since VC4 is a UMA device, the simplefb node may have been
-+       * located anywhere in memory.
-+       */
-+      ap->ranges[0].base = 0;
-+      ap->ranges[0].size = ~0;
-+
-+      remove_conflicting_framebuffers(ap, "vc4drmfb", false);
-+      kfree(ap);
-+}
-+
- static int vc4_drm_bind(struct device *dev)
- {
-       struct platform_device *pdev = to_platform_device(dev);
-@@ -208,6 +226,8 @@ static int vc4_drm_bind(struct device *d
-       if (ret)
-               goto gem_destroy;
-+      vc4_kick_out_firmware_fb();
-+
-       ret = drm_dev_register(drm, 0);
-       if (ret < 0)
-               goto unbind_all;
diff --git a/target/linux/brcm2708/patches-4.4/0334-drm-vc4-Rename-async-to-nonblock.patch b/target/linux/brcm2708/patches-4.4/0334-drm-vc4-Rename-async-to-nonblock.patch
new file mode 100644 (file)
index 0000000..698dd34
--- /dev/null
@@ -0,0 +1,45 @@
+From db48b84381e9cc7c4cc559bad3e5210db3b13c4e Mon Sep 17 00:00:00 2001
+From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
+Date: Tue, 26 Apr 2016 16:11:44 +0200
+Subject: [PATCH] drm/vc4: Rename async to nonblock.
+
+The async name is deprecated and should be changed to nonblocking.
+
+Cc: Eric Anholt <eric@anholt.net>
+Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Link: http://patchwork.freedesktop.org/patch/msgid/1461679905-30177-12-git-send-email-maarten.lankhorst@linux.intel.com
+(cherry picked from commit eb63961ba52ba545f5b7ebeeeefe1c98704e1a79)
+---
+ drivers/gpu/drm/vc4/vc4_kms.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_kms.c
++++ b/drivers/gpu/drm/vc4/vc4_kms.c
+@@ -93,7 +93,7 @@ static struct vc4_commit *commit_init(st
+  * vc4_atomic_commit - commit validated state object
+  * @dev: DRM device
+  * @state: the driver state object
+- * @async: asynchronous commit
++ * @nonblock: nonblocking commit
+  *
+  * This function commits a with drm_atomic_helper_check() pre-validated state
+  * object. This can still fail when e.g. the framebuffer reservation fails. For
+@@ -104,7 +104,7 @@ static struct vc4_commit *commit_init(st
+  */
+ static int vc4_atomic_commit(struct drm_device *dev,
+                            struct drm_atomic_state *state,
+-                           bool async)
++                           bool nonblock)
+ {
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       int ret;
+@@ -170,7 +170,7 @@ static int vc4_atomic_commit(struct drm_
+        * current layout.
+        */
+-      if (async) {
++      if (nonblock) {
+               vc4_queue_seqno_cb(dev, &c->cb, wait_seqno,
+                                  vc4_atomic_complete_commit_seqno_cb);
+       } else {
diff --git a/target/linux/brcm2708/patches-4.4/0335-drm-vc4-Add-support-for-gamma-ramps.patch b/target/linux/brcm2708/patches-4.4/0335-drm-vc4-Add-support-for-gamma-ramps.patch
new file mode 100644 (file)
index 0000000..9168f20
--- /dev/null
@@ -0,0 +1,137 @@
+From 16c6164e2046f7b7bce7c1e028a2f938545f5401 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 31 Mar 2016 18:38:20 -0700
+Subject: [PATCH] drm/vc4: Add support for gamma ramps.
+
+We could possibly save a bit of power by not requesting gamma
+conversion when the ramp happens to be 1:1, but at least if all the
+CRTCs are off the SRAM will be disabled.
+
+This should fix brightness sliders in a lot of fullscreen games.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit e582b6c7e7f9d0b1e30e8017e4082d3a9ede3310)
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 58 ++++++++++++++++++++++++++++++++++++++++++
+ drivers/gpu/drm/vc4/vc4_regs.h |  6 +++++
+ 2 files changed, 64 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -49,6 +49,10 @@ struct vc4_crtc {
+       /* Which HVS channel we're using for our CRTC. */
+       int channel;
++      u8 lut_r[256];
++      u8 lut_g[256];
++      u8 lut_b[256];
++
+       struct drm_pending_vblank_event *event;
+ };
+@@ -147,6 +151,46 @@ static void vc4_crtc_destroy(struct drm_
+       drm_crtc_cleanup(crtc);
+ }
++static void
++vc4_crtc_lut_load(struct drm_crtc *crtc)
++{
++      struct drm_device *dev = crtc->dev;
++      struct vc4_dev *vc4 = to_vc4_dev(dev);
++      struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
++      u32 i;
++
++      /* The LUT memory is laid out with each HVS channel in order,
++       * each of which takes 256 writes for R, 256 for G, then 256
++       * for B.
++       */
++      HVS_WRITE(SCALER_GAMADDR,
++                SCALER_GAMADDR_AUTOINC |
++                (vc4_crtc->channel * 3 * crtc->gamma_size));
++
++      for (i = 0; i < crtc->gamma_size; i++)
++              HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_r[i]);
++      for (i = 0; i < crtc->gamma_size; i++)
++              HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_g[i]);
++      for (i = 0; i < crtc->gamma_size; i++)
++              HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_b[i]);
++}
++
++static void
++vc4_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
++                 uint32_t start, uint32_t size)
++{
++      struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
++      u32 i;
++
++      for (i = start; i < start + size; i++) {
++              vc4_crtc->lut_r[i] = r[i] >> 8;
++              vc4_crtc->lut_g[i] = g[i] >> 8;
++              vc4_crtc->lut_b[i] = b[i] >> 8;
++      }
++
++      vc4_crtc_lut_load(crtc);
++}
++
+ static u32 vc4_get_fifo_full_level(u32 format)
+ {
+       static const u32 fifo_len_bytes = 64;
+@@ -260,8 +304,14 @@ static void vc4_crtc_mode_set_nofb(struc
+       HVS_WRITE(SCALER_DISPBKGNDX(vc4_crtc->channel),
+                 SCALER_DISPBKGND_AUTOHS |
++                SCALER_DISPBKGND_GAMMA |
+                 (interlace ? SCALER_DISPBKGND_INTERLACE : 0));
++      /* Reload the LUT, since the SRAMs would have been disabled if
++       * all CRTCs had SCALER_DISPBKGND_GAMMA unset at once.
++       */
++      vc4_crtc_lut_load(crtc);
++
+       if (debug_dump_regs) {
+               DRM_INFO("CRTC %d regs after:\n", drm_crtc_index(crtc));
+               vc4_crtc_dump_regs(vc4_crtc);
+@@ -613,6 +663,7 @@ static const struct drm_crtc_funcs vc4_c
+       .reset = drm_atomic_helper_crtc_reset,
+       .atomic_duplicate_state = vc4_crtc_duplicate_state,
+       .atomic_destroy_state = vc4_crtc_destroy_state,
++      .gamma_set = vc4_crtc_gamma_set,
+ };
+ static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
+@@ -731,6 +782,7 @@ static int vc4_crtc_bind(struct device *
+       primary_plane->crtc = crtc;
+       vc4->crtc[drm_crtc_index(crtc)] = vc4_crtc;
+       vc4_crtc->channel = vc4_crtc->data->hvs_channel;
++      drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r));
+       /* Set up some arbitrary number of planes.  We're not limited
+        * by a set number of physical registers, just the space in
+@@ -771,6 +823,12 @@ static int vc4_crtc_bind(struct device *
+       vc4_set_crtc_possible_masks(drm, crtc);
++      for (i = 0; i < crtc->gamma_size; i++) {
++              vc4_crtc->lut_r[i] = i;
++              vc4_crtc->lut_g[i] = i;
++              vc4_crtc->lut_b[i] = i;
++      }
++
+       platform_set_drvdata(pdev, vc4_crtc);
+       return 0;
+--- a/drivers/gpu/drm/vc4/vc4_regs.h
++++ b/drivers/gpu/drm/vc4/vc4_regs.h
+@@ -390,6 +390,12 @@
+ #define SCALER_DISPBASE2                        0x0000006c
+ #define SCALER_DISPALPHA2                       0x00000070
+ #define SCALER_GAMADDR                          0x00000078
++# define SCALER_GAMADDR_AUTOINC                       BIT(31)
++/* Enables all gamma ramp SRAMs, not just those of CRTCs with gamma
++ * enabled.
++ */
++# define SCALER_GAMADDR_SRAMENB                       BIT(30)
++
+ #define SCALER_GAMDATA                          0x000000e0
+ #define SCALER_DLIST_START                      0x00002000
+ #define SCALER_DLIST_SIZE                       0x00004000
diff --git a/target/linux/brcm2708/patches-4.4/0335-drm-vc4-Rename-async-to-nonblock.patch b/target/linux/brcm2708/patches-4.4/0335-drm-vc4-Rename-async-to-nonblock.patch
deleted file mode 100644 (file)
index 572a5b3..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-From fadf429b758f5a3b6122d73fd1f8551a5f21cf3c Mon Sep 17 00:00:00 2001
-From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
-Date: Tue, 26 Apr 2016 16:11:44 +0200
-Subject: [PATCH 335/423] drm/vc4: Rename async to nonblock.
-
-The async name is deprecated and should be changed to nonblocking.
-
-Cc: Eric Anholt <eric@anholt.net>
-Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
-Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-Link: http://patchwork.freedesktop.org/patch/msgid/1461679905-30177-12-git-send-email-maarten.lankhorst@linux.intel.com
-(cherry picked from commit eb63961ba52ba545f5b7ebeeeefe1c98704e1a79)
----
- drivers/gpu/drm/vc4/vc4_kms.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/gpu/drm/vc4/vc4_kms.c
-+++ b/drivers/gpu/drm/vc4/vc4_kms.c
-@@ -93,7 +93,7 @@ static struct vc4_commit *commit_init(st
-  * vc4_atomic_commit - commit validated state object
-  * @dev: DRM device
-  * @state: the driver state object
-- * @async: asynchronous commit
-+ * @nonblock: nonblocking commit
-  *
-  * This function commits a with drm_atomic_helper_check() pre-validated state
-  * object. This can still fail when e.g. the framebuffer reservation fails. For
-@@ -104,7 +104,7 @@ static struct vc4_commit *commit_init(st
-  */
- static int vc4_atomic_commit(struct drm_device *dev,
-                            struct drm_atomic_state *state,
--                           bool async)
-+                           bool nonblock)
- {
-       struct vc4_dev *vc4 = to_vc4_dev(dev);
-       int ret;
-@@ -170,7 +170,7 @@ static int vc4_atomic_commit(struct drm_
-        * current layout.
-        */
--      if (async) {
-+      if (nonblock) {
-               vc4_queue_seqno_cb(dev, &c->cb, wait_seqno,
-                                  vc4_atomic_complete_commit_seqno_cb);
-       } else {
diff --git a/target/linux/brcm2708/patches-4.4/0336-drm-vc4-Add-missing-render-node-support.patch b/target/linux/brcm2708/patches-4.4/0336-drm-vc4-Add-missing-render-node-support.patch
new file mode 100644 (file)
index 0000000..e5dd1ae
--- /dev/null
@@ -0,0 +1,26 @@
+From cb3e6f502adebcbddfe15a3479c3e48305717f46 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 14 Apr 2016 23:16:05 -0700
+Subject: [PATCH] drm/vc4: Add missing render node support
+
+There shouldn't be any other driver support necessary, since none of
+the driver-specific ioctls ever required auth, and none of them deal
+with modesetting.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+(cherry picked from commit 0cd3e27476620176c19e346f82576c6e139b85a9)
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -90,6 +90,7 @@ static struct drm_driver vc4_drm_driver
+                           DRIVER_ATOMIC |
+                           DRIVER_GEM |
+                           DRIVER_HAVE_IRQ |
++                          DRIVER_RENDER |
+                           DRIVER_PRIME),
+       .lastclose = vc4_lastclose,
+       .preclose = vc4_drm_preclose,
diff --git a/target/linux/brcm2708/patches-4.4/0336-drm-vc4-Add-support-for-gamma-ramps.patch b/target/linux/brcm2708/patches-4.4/0336-drm-vc4-Add-support-for-gamma-ramps.patch
deleted file mode 100644 (file)
index fe0567c..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-From ad9de9ffedcbcc35c4fe13cddabda66abc98e3ef Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Thu, 31 Mar 2016 18:38:20 -0700
-Subject: [PATCH 336/423] drm/vc4: Add support for gamma ramps.
-
-We could possibly save a bit of power by not requesting gamma
-conversion when the ramp happens to be 1:1, but at least if all the
-CRTCs are off the SRAM will be disabled.
-
-This should fix brightness sliders in a lot of fullscreen games.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-(cherry picked from commit e582b6c7e7f9d0b1e30e8017e4082d3a9ede3310)
----
- drivers/gpu/drm/vc4/vc4_crtc.c | 58 ++++++++++++++++++++++++++++++++++++++++++
- drivers/gpu/drm/vc4/vc4_regs.h |  6 +++++
- 2 files changed, 64 insertions(+)
-
---- a/drivers/gpu/drm/vc4/vc4_crtc.c
-+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
-@@ -49,6 +49,10 @@ struct vc4_crtc {
-       /* Which HVS channel we're using for our CRTC. */
-       int channel;
-+      u8 lut_r[256];
-+      u8 lut_g[256];
-+      u8 lut_b[256];
-+
-       struct drm_pending_vblank_event *event;
- };
-@@ -147,6 +151,46 @@ static void vc4_crtc_destroy(struct drm_
-       drm_crtc_cleanup(crtc);
- }
-+static void
-+vc4_crtc_lut_load(struct drm_crtc *crtc)
-+{
-+      struct drm_device *dev = crtc->dev;
-+      struct vc4_dev *vc4 = to_vc4_dev(dev);
-+      struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
-+      u32 i;
-+
-+      /* The LUT memory is laid out with each HVS channel in order,
-+       * each of which takes 256 writes for R, 256 for G, then 256
-+       * for B.
-+       */
-+      HVS_WRITE(SCALER_GAMADDR,
-+                SCALER_GAMADDR_AUTOINC |
-+                (vc4_crtc->channel * 3 * crtc->gamma_size));
-+
-+      for (i = 0; i < crtc->gamma_size; i++)
-+              HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_r[i]);
-+      for (i = 0; i < crtc->gamma_size; i++)
-+              HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_g[i]);
-+      for (i = 0; i < crtc->gamma_size; i++)
-+              HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_b[i]);
-+}
-+
-+static void
-+vc4_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
-+                 uint32_t start, uint32_t size)
-+{
-+      struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
-+      u32 i;
-+
-+      for (i = start; i < start + size; i++) {
-+              vc4_crtc->lut_r[i] = r[i] >> 8;
-+              vc4_crtc->lut_g[i] = g[i] >> 8;
-+              vc4_crtc->lut_b[i] = b[i] >> 8;
-+      }
-+
-+      vc4_crtc_lut_load(crtc);
-+}
-+
- static u32 vc4_get_fifo_full_level(u32 format)
- {
-       static const u32 fifo_len_bytes = 64;
-@@ -260,8 +304,14 @@ static void vc4_crtc_mode_set_nofb(struc
-       HVS_WRITE(SCALER_DISPBKGNDX(vc4_crtc->channel),
-                 SCALER_DISPBKGND_AUTOHS |
-+                SCALER_DISPBKGND_GAMMA |
-                 (interlace ? SCALER_DISPBKGND_INTERLACE : 0));
-+      /* Reload the LUT, since the SRAMs would have been disabled if
-+       * all CRTCs had SCALER_DISPBKGND_GAMMA unset at once.
-+       */
-+      vc4_crtc_lut_load(crtc);
-+
-       if (debug_dump_regs) {
-               DRM_INFO("CRTC %d regs after:\n", drm_crtc_index(crtc));
-               vc4_crtc_dump_regs(vc4_crtc);
-@@ -613,6 +663,7 @@ static const struct drm_crtc_funcs vc4_c
-       .reset = drm_atomic_helper_crtc_reset,
-       .atomic_duplicate_state = vc4_crtc_duplicate_state,
-       .atomic_destroy_state = vc4_crtc_destroy_state,
-+      .gamma_set = vc4_crtc_gamma_set,
- };
- static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
-@@ -731,6 +782,7 @@ static int vc4_crtc_bind(struct device *
-       primary_plane->crtc = crtc;
-       vc4->crtc[drm_crtc_index(crtc)] = vc4_crtc;
-       vc4_crtc->channel = vc4_crtc->data->hvs_channel;
-+      drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r));
-       /* Set up some arbitrary number of planes.  We're not limited
-        * by a set number of physical registers, just the space in
-@@ -771,6 +823,12 @@ static int vc4_crtc_bind(struct device *
-       vc4_set_crtc_possible_masks(drm, crtc);
-+      for (i = 0; i < crtc->gamma_size; i++) {
-+              vc4_crtc->lut_r[i] = i;
-+              vc4_crtc->lut_g[i] = i;
-+              vc4_crtc->lut_b[i] = i;
-+      }
-+
-       platform_set_drvdata(pdev, vc4_crtc);
-       return 0;
---- a/drivers/gpu/drm/vc4/vc4_regs.h
-+++ b/drivers/gpu/drm/vc4/vc4_regs.h
-@@ -390,6 +390,12 @@
- #define SCALER_DISPBASE2                        0x0000006c
- #define SCALER_DISPALPHA2                       0x00000070
- #define SCALER_GAMADDR                          0x00000078
-+# define SCALER_GAMADDR_AUTOINC                       BIT(31)
-+/* Enables all gamma ramp SRAMs, not just those of CRTCs with gamma
-+ * enabled.
-+ */
-+# define SCALER_GAMADDR_SRAMENB                       BIT(30)
-+
- #define SCALER_GAMDATA                          0x000000e0
- #define SCALER_DLIST_START                      0x00002000
- #define SCALER_DLIST_SIZE                       0x00004000
diff --git a/target/linux/brcm2708/patches-4.4/0337-drm-panel-simple-Add-the-7-DPI-panel-from-Adafruit.patch b/target/linux/brcm2708/patches-4.4/0337-drm-panel-simple-Add-the-7-DPI-panel-from-Adafruit.patch
new file mode 100644 (file)
index 0000000..c62a621
--- /dev/null
@@ -0,0 +1,86 @@
+From 59c699fe982aa0df961465654c4d87d109b127e6 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 24 Mar 2016 17:23:48 -0700
+Subject: [PATCH] drm/panel: simple: Add the 7" DPI panel from Adafruit
+
+This is a basic TFT panel with a 40-pin FPC connector on it.  The
+specification doesn't define timings, but the Adafruit instructions
+were setting up 800x480 CVT.
+
+v2: Add .bus_format and vsync/hsync flags.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Acked-by: Rob Herring <robh@kernel.org>
+[treding@nvidia.com: keep entries properly sorted]
+Signed-off-by: Thierry Reding <treding@nvidia.com>
+
+(cherry picked from commit 8070fdbd024727c752f815b18e5339c681a01bbe)
+---
+ .../bindings/display/panel/ontat,yx700wv03.txt     |  7 ++++
+ drivers/gpu/drm/panel/panel-simple.c               | 37 ++++++++++++++++++++++
+ 2 files changed, 44 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt
+@@ -0,0 +1,7 @@
++On Tat Industrial Company 7" DPI TFT panel.
++
++Required properties:
++- compatible: should be "ontat,yx700wv03"
++
++This binding is compatible with the simple-panel binding, which is specified
++in simple-panel.txt in this directory.
+--- a/drivers/gpu/drm/panel/panel-simple.c
++++ b/drivers/gpu/drm/panel/panel-simple.c
+@@ -1003,6 +1003,40 @@ static const struct panel_desc okaya_rs8
+       .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
+ };
++/*
++ * 800x480 CVT. The panel appears to be quite accepting, at least as far as
++ * pixel clocks, but this is the timing that was being used in the Adafruit
++ * installation instructions.
++ */
++static const struct drm_display_mode ontat_yx700wv03_mode = {
++      .clock = 29500,
++      .hdisplay = 800,
++      .hsync_start = 824,
++      .hsync_end = 896,
++      .htotal = 992,
++      .vdisplay = 480,
++      .vsync_start = 483,
++      .vsync_end = 493,
++      .vtotal = 500,
++      .vrefresh = 60,
++      .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
++};
++
++/*
++ * Specification at:
++ * https://www.adafruit.com/images/product-files/2406/c3163.pdf
++ */
++static const struct panel_desc ontat_yx700wv03 = {
++      .modes = &ontat_yx700wv03_mode,
++      .num_modes = 1,
++      .bpc = 8,
++      .size = {
++              .width = 154,
++              .height = 83,
++      },
++      .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
++};
++
+ static const struct drm_display_mode ortustech_com43h4m85ulc_mode  = {
+       .clock = 25000,
+       .hdisplay = 480,
+@@ -1179,6 +1213,9 @@ static const struct of_device_id platfor
+               .compatible = "okaya,rs800480t-7x0gp",
+               .data = &okaya_rs800480t_7x0gp,
+       }, {
++              .compatible = "ontat,yx700wv03",
++              .data = &ontat_yx700wv03,
++      }, {
+               .compatible = "ortustech,com43h4m85ulc",
+               .data = &ortustech_com43h4m85ulc,
+       }, {
diff --git a/target/linux/brcm2708/patches-4.4/0337-drm-vc4-Add-missing-render-node-support.patch b/target/linux/brcm2708/patches-4.4/0337-drm-vc4-Add-missing-render-node-support.patch
deleted file mode 100644 (file)
index a33df8f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From 889865acbf4ea68d241448cf413d8667b8abf312 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Thu, 14 Apr 2016 23:16:05 -0700
-Subject: [PATCH 337/423] drm/vc4: Add missing render node support
-
-There shouldn't be any other driver support necessary, since none of
-the driver-specific ioctls ever required auth, and none of them deal
-with modesetting.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-(cherry picked from commit 0cd3e27476620176c19e346f82576c6e139b85a9)
----
- drivers/gpu/drm/vc4/vc4_drv.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/gpu/drm/vc4/vc4_drv.c
-+++ b/drivers/gpu/drm/vc4/vc4_drv.c
-@@ -90,6 +90,7 @@ static struct drm_driver vc4_drm_driver
-                           DRIVER_ATOMIC |
-                           DRIVER_GEM |
-                           DRIVER_HAVE_IRQ |
-+                          DRIVER_RENDER |
-                           DRIVER_PRIME),
-       .lastclose = vc4_lastclose,
-       .preclose = vc4_drm_preclose,
diff --git a/target/linux/brcm2708/patches-4.4/0338-BCM270X_DT-Add-the-disabled-by-default-DPI-device-no.patch b/target/linux/brcm2708/patches-4.4/0338-BCM270X_DT-Add-the-disabled-by-default-DPI-device-no.patch
new file mode 100644 (file)
index 0000000..fdb3f31
--- /dev/null
@@ -0,0 +1,33 @@
+From 55387e0dc0e0982f62b1131e79a86e655dcfb3f4 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 6 May 2016 13:18:09 -0700
+Subject: [PATCH] BCM270X_DT: Add the disabled-by-default DPI device node.
+
+This will be enabled and connected to a particular panel by DT
+overlays.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -179,6 +179,17 @@
+                       status = "disabled";
+               };
++              dpi: dpi@7e208000 {
++                      compatible = "brcm,bcm2835-dpi";
++                      reg = <0x7e208000 0x8c>;
++                      clocks = <&cprman BCM2835_CLOCK_VPU>,
++                               <&cprman BCM2835_CLOCK_DPI>;
++                      clock-names = "core", "pixel";
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "disabled";
++              };
++
+               pixelvalve1: pixelvalve@7e207000 {
+                       compatible = "brcm,bcm2835-pixelvalve1";
+                       reg = <0x7e207000 0x100>;
diff --git a/target/linux/brcm2708/patches-4.4/0338-drm-panel-simple-Add-the-7-DPI-panel-from-Adafruit.patch b/target/linux/brcm2708/patches-4.4/0338-drm-panel-simple-Add-the-7-DPI-panel-from-Adafruit.patch
deleted file mode 100644 (file)
index 0b836da..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-From 0445e26913d81b7e6cde6202d969e59f25d08fd2 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Thu, 24 Mar 2016 17:23:48 -0700
-Subject: [PATCH 338/423] drm/panel: simple: Add the 7" DPI panel from Adafruit
-
-This is a basic TFT panel with a 40-pin FPC connector on it.  The
-specification doesn't define timings, but the Adafruit instructions
-were setting up 800x480 CVT.
-
-v2: Add .bus_format and vsync/hsync flags.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Acked-by: Rob Herring <robh@kernel.org>
-[treding@nvidia.com: keep entries properly sorted]
-Signed-off-by: Thierry Reding <treding@nvidia.com>
-
-(cherry picked from commit 8070fdbd024727c752f815b18e5339c681a01bbe)
----
- .../bindings/display/panel/ontat,yx700wv03.txt     |  7 ++++
- drivers/gpu/drm/panel/panel-simple.c               | 37 ++++++++++++++++++++++
- 2 files changed, 44 insertions(+)
- create mode 100644 Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt
-
---- /dev/null
-+++ b/Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt
-@@ -0,0 +1,7 @@
-+On Tat Industrial Company 7" DPI TFT panel.
-+
-+Required properties:
-+- compatible: should be "ontat,yx700wv03"
-+
-+This binding is compatible with the simple-panel binding, which is specified
-+in simple-panel.txt in this directory.
---- a/drivers/gpu/drm/panel/panel-simple.c
-+++ b/drivers/gpu/drm/panel/panel-simple.c
-@@ -1003,6 +1003,40 @@ static const struct panel_desc okaya_rs8
-       .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
- };
-+/*
-+ * 800x480 CVT. The panel appears to be quite accepting, at least as far as
-+ * pixel clocks, but this is the timing that was being used in the Adafruit
-+ * installation instructions.
-+ */
-+static const struct drm_display_mode ontat_yx700wv03_mode = {
-+      .clock = 29500,
-+      .hdisplay = 800,
-+      .hsync_start = 824,
-+      .hsync_end = 896,
-+      .htotal = 992,
-+      .vdisplay = 480,
-+      .vsync_start = 483,
-+      .vsync_end = 493,
-+      .vtotal = 500,
-+      .vrefresh = 60,
-+      .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
-+};
-+
-+/*
-+ * Specification at:
-+ * https://www.adafruit.com/images/product-files/2406/c3163.pdf
-+ */
-+static const struct panel_desc ontat_yx700wv03 = {
-+      .modes = &ontat_yx700wv03_mode,
-+      .num_modes = 1,
-+      .bpc = 8,
-+      .size = {
-+              .width = 154,
-+              .height = 83,
-+      },
-+      .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
-+};
-+
- static const struct drm_display_mode ortustech_com43h4m85ulc_mode  = {
-       .clock = 25000,
-       .hdisplay = 480,
-@@ -1179,6 +1213,9 @@ static const struct of_device_id platfor
-               .compatible = "okaya,rs800480t-7x0gp",
-               .data = &okaya_rs800480t_7x0gp,
-       }, {
-+              .compatible = "ontat,yx700wv03",
-+              .data = &ontat_yx700wv03,
-+      }, {
-               .compatible = "ortustech,com43h4m85ulc",
-               .data = &ortustech_com43h4m85ulc,
-       }, {
diff --git a/target/linux/brcm2708/patches-4.4/0339-BCM270X_DT-Add-the-disabled-by-default-DPI-device-no.patch b/target/linux/brcm2708/patches-4.4/0339-BCM270X_DT-Add-the-disabled-by-default-DPI-device-no.patch
deleted file mode 100644 (file)
index 6552186..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From 2f2c9d21a772c179638bdcf660ca4559d189c3f4 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 6 May 2016 13:18:09 -0700
-Subject: [PATCH 339/423] BCM270X_DT: Add the disabled-by-default DPI device
- node.
-
-This will be enabled and connected to a particular panel by DT
-overlays.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- arch/arm/boot/dts/bcm2708_common.dtsi | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
---- a/arch/arm/boot/dts/bcm2708_common.dtsi
-+++ b/arch/arm/boot/dts/bcm2708_common.dtsi
-@@ -179,6 +179,17 @@
-                       status = "disabled";
-               };
-+              dpi: dpi@7e208000 {
-+                      compatible = "brcm,bcm2835-dpi";
-+                      reg = <0x7e208000 0x8c>;
-+                      clocks = <&cprman BCM2835_CLOCK_VPU>,
-+                               <&cprman BCM2835_CLOCK_DPI>;
-+                      clock-names = "core", "pixel";
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "disabled";
-+              };
-+
-               pixelvalve1: pixelvalve@7e207000 {
-                       compatible = "brcm,bcm2835-pixelvalve1";
-                       reg = <0x7e207000 0x100>;
diff --git a/target/linux/brcm2708/patches-4.4/0339-drm-vc4-Fix-get_vblank_counter-with-proper-no-op-for.patch b/target/linux/brcm2708/patches-4.4/0339-drm-vc4-Fix-get_vblank_counter-with-proper-no-op-for.patch
new file mode 100644 (file)
index 0000000..031c328
--- /dev/null
@@ -0,0 +1,31 @@
+From 9684d1176621e7edee8475dbd3ad186591898b21 Mon Sep 17 00:00:00 2001
+From: Mario Kleiner <mario.kleiner.de@gmail.com>
+Date: Fri, 6 May 2016 19:26:05 +0200
+Subject: [PATCH] drm/vc4: Fix get_vblank_counter with proper no-op for Linux
+ 4.4+
+
+get_vblank_counter hooked up to drm_vblank_count() which alway was
+non-sensical but didn't hurt in the past. Since Linux 4.4 it
+triggers a WARN_ON_ONCE in drm_update_vblank_count on first vblank
+irq disable, so fix it by hooking to drm_vblank_no_hw_counter().
+
+Tested against Raspian kernel 4.4.8 tree on RPi 2B.
+
+Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
+Cc: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -102,7 +102,7 @@ static struct drm_driver vc4_drm_driver
+       .enable_vblank = vc4_enable_vblank,
+       .disable_vblank = vc4_disable_vblank,
+-      .get_vblank_counter = drm_vblank_count,
++      .get_vblank_counter = drm_vblank_no_hw_counter,
+ #if defined(CONFIG_DEBUG_FS)
+       .debugfs_init = vc4_debugfs_init,
diff --git a/target/linux/brcm2708/patches-4.4/0340-drm-vc4-Fix-drm_vblank_put-get-imbalance-in-page-fli.patch b/target/linux/brcm2708/patches-4.4/0340-drm-vc4-Fix-drm_vblank_put-get-imbalance-in-page-fli.patch
new file mode 100644 (file)
index 0000000..616ff43
--- /dev/null
@@ -0,0 +1,47 @@
+From bd3aef6d9474fbb9fe063a2f409f920263c28ff1 Mon Sep 17 00:00:00 2001
+From: Mario Kleiner <mario.kleiner.de@gmail.com>
+Date: Fri, 6 May 2016 19:26:06 +0200
+Subject: [PATCH] drm/vc4: Fix drm_vblank_put/get imbalance in page flip path.
+
+The async page flip path was missing drm_crtc_vblank_get/put
+completely. The sync flip path was missing a vblank put, so async
+flips only reported proper pageflip completion events by chance,
+and vblank irq's never turned off after a first vsync'ed page flip
+until system reboot.
+
+Tested against Raspian kernel 4.4.8 tree on RPi 2B.
+
+Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
+Cc: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -506,6 +506,7 @@ static void vc4_crtc_handle_page_flip(st
+       if (vc4_crtc->event) {
+               drm_crtc_send_vblank_event(crtc, vc4_crtc->event);
+               vc4_crtc->event = NULL;
++              drm_crtc_vblank_put(crtc);
+       }
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+ }
+@@ -556,6 +557,7 @@ vc4_async_page_flip_complete(struct vc4_
+               spin_unlock_irqrestore(&dev->event_lock, flags);
+       }
++      drm_crtc_vblank_put(crtc);
+       drm_framebuffer_unreference(flip_state->fb);
+       kfree(flip_state);
+@@ -598,6 +600,8 @@ static int vc4_async_page_flip(struct dr
+               return ret;
+       }
++      WARN_ON(drm_crtc_vblank_get(crtc) != 0);
++
+       /* Immediately update the plane's legacy fb pointer, so that later
+        * modeset prep sees the state that will be present when the semaphore
+        * is released.
diff --git a/target/linux/brcm2708/patches-4.4/0340-drm-vc4-Fix-get_vblank_counter-with-proper-no-op-for.patch b/target/linux/brcm2708/patches-4.4/0340-drm-vc4-Fix-get_vblank_counter-with-proper-no-op-for.patch
deleted file mode 100644 (file)
index ec172d0..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From 41a242de6e06a106399d2c713dc4114da3532d22 Mon Sep 17 00:00:00 2001
-From: Mario Kleiner <mario.kleiner.de@gmail.com>
-Date: Fri, 6 May 2016 19:26:05 +0200
-Subject: [PATCH 340/423] drm/vc4: Fix get_vblank_counter with proper no-op for
- Linux 4.4+
-
-get_vblank_counter hooked up to drm_vblank_count() which alway was
-non-sensical but didn't hurt in the past. Since Linux 4.4 it
-triggers a WARN_ON_ONCE in drm_update_vblank_count on first vblank
-irq disable, so fix it by hooking to drm_vblank_no_hw_counter().
-
-Tested against Raspian kernel 4.4.8 tree on RPi 2B.
-
-Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
-Cc: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/gpu/drm/vc4/vc4_drv.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/gpu/drm/vc4/vc4_drv.c
-+++ b/drivers/gpu/drm/vc4/vc4_drv.c
-@@ -102,7 +102,7 @@ static struct drm_driver vc4_drm_driver
-       .enable_vblank = vc4_enable_vblank,
-       .disable_vblank = vc4_disable_vblank,
--      .get_vblank_counter = drm_vblank_count,
-+      .get_vblank_counter = drm_vblank_no_hw_counter,
- #if defined(CONFIG_DEBUG_FS)
-       .debugfs_init = vc4_debugfs_init,
diff --git a/target/linux/brcm2708/patches-4.4/0341-BCM270X_DT-Add-umbrella-I2C-Mux-overlay-i2c-mux.patch b/target/linux/brcm2708/patches-4.4/0341-BCM270X_DT-Add-umbrella-I2C-Mux-overlay-i2c-mux.patch
new file mode 100644 (file)
index 0000000..363f0c8
--- /dev/null
@@ -0,0 +1,269 @@
+From ee32bb475a3986f961466e00f5ed0bc1fb708699 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 11 May 2016 15:38:04 +0100
+Subject: [PATCH] BCM270X_DT: Add umbrella I2C Mux overlay i2c-mux
+
+This overlay supports a range of I2C multiplexers - PCA9542 (2 ports),
+PCA9545 (4 ports) and PCA9548 (8 ports).
+
+Also remove the dedicated i2c-mux-9548a overlays since it is no longer
+needed.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/Makefile                |   2 +-
+ arch/arm/boot/dts/overlays/README                  |  17 ++-
+ arch/arm/boot/dts/overlays/i2c-mux-overlay.dts     | 138 +++++++++++++++++++++
+ .../boot/dts/overlays/i2c-mux-pca9548a-overlay.dts |  67 ----------
+ 4 files changed, 152 insertions(+), 72 deletions(-)
+ create mode 100644 arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
+ delete 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
+@@ -34,7 +34,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) += i2c-mux.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c-pwm-pca9685a.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c0-bcm2708.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c1-bcm2708.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -421,10 +421,19 @@ 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-mux
++Info:   Adds support for a number of I2C bus multiplexers on i2c_arm
++Load:   dtoverlay=i2c-mux,<param>=<val>
++Params: pca9542                 Select the NXP PCA9542 device
++
++        pca9545                 Select the NXP PCA9545 device
++
++        pca9548                 Select the NXP PCA9548 device
++
++        addr                    Change I2C address of the device (default 0x70)
++
++
++[ The i2c-mux-pca9548a overlay has been deleted. See i2c-mux. ]
+ Name:   i2c-pwm-pca9685a
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
+@@ -0,0 +1,138 @@
++// Umbrella I2C Mux overlay
++
++/dts-v1/;
++/plugin/;
++
++/{
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2c_arm>;
++              __dormant__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      pca9542: mux@70 {
++                              compatible = "nxp,pca9542";
++                              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>;
++                              };
++                      };
++              };
++      };
++
++      fragment@1 {
++              target = <&i2c_arm>;
++              __dormant__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      pca9545: mux@70 {
++                              compatible = "nxp,pca9545";
++                              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>;
++                              };
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&i2c_arm>;
++              __dormant__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      pca9548: 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__ {
++              pca9542 = <0>, "+0";
++              pca9545 = <0>, "+1";
++              pca9548 = <0>, "+2";
++
++              addr =  <&pca9545>,"reg:0",
++                      <&pca9548>,"reg:0";
++      };
++};
+--- a/arch/arm/boot/dts/overlays/i2c-mux-pca9548a-overlay.dts
++++ /dev/null
+@@ -1,67 +0,0 @@
+-// 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";
+-      };
+-};
diff --git a/target/linux/brcm2708/patches-4.4/0341-drm-vc4-Fix-drm_vblank_put-get-imbalance-in-page-fli.patch b/target/linux/brcm2708/patches-4.4/0341-drm-vc4-Fix-drm_vblank_put-get-imbalance-in-page-fli.patch
deleted file mode 100644 (file)
index 77a8f07..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-From 4f9f74feec3951986a22aff184d0fa6fb7a47b93 Mon Sep 17 00:00:00 2001
-From: Mario Kleiner <mario.kleiner.de@gmail.com>
-Date: Fri, 6 May 2016 19:26:06 +0200
-Subject: [PATCH 341/423] drm/vc4: Fix drm_vblank_put/get imbalance in page
- flip path.
-
-The async page flip path was missing drm_crtc_vblank_get/put
-completely. The sync flip path was missing a vblank put, so async
-flips only reported proper pageflip completion events by chance,
-and vblank irq's never turned off after a first vsync'ed page flip
-until system reboot.
-
-Tested against Raspian kernel 4.4.8 tree on RPi 2B.
-
-Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
-Cc: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/gpu/drm/vc4/vc4_crtc.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/drivers/gpu/drm/vc4/vc4_crtc.c
-+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
-@@ -506,6 +506,7 @@ static void vc4_crtc_handle_page_flip(st
-       if (vc4_crtc->event) {
-               drm_crtc_send_vblank_event(crtc, vc4_crtc->event);
-               vc4_crtc->event = NULL;
-+              drm_crtc_vblank_put(crtc);
-       }
-       spin_unlock_irqrestore(&dev->event_lock, flags);
- }
-@@ -556,6 +557,7 @@ vc4_async_page_flip_complete(struct vc4_
-               spin_unlock_irqrestore(&dev->event_lock, flags);
-       }
-+      drm_crtc_vblank_put(crtc);
-       drm_framebuffer_unreference(flip_state->fb);
-       kfree(flip_state);
-@@ -598,6 +600,8 @@ static int vc4_async_page_flip(struct dr
-               return ret;
-       }
-+      WARN_ON(drm_crtc_vblank_get(crtc) != 0);
-+
-       /* Immediately update the plane's legacy fb pointer, so that later
-        * modeset prep sees the state that will be present when the semaphore
-        * is released.
diff --git a/target/linux/brcm2708/patches-4.4/0342-BCM270X_DT-Add-umbrella-I2C-Mux-overlay-i2c-mux.patch b/target/linux/brcm2708/patches-4.4/0342-BCM270X_DT-Add-umbrella-I2C-Mux-overlay-i2c-mux.patch
deleted file mode 100644 (file)
index ce65c6c..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-From 347b13e71792301011d09442c6150d6aec8d89e0 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 11 May 2016 15:38:04 +0100
-Subject: [PATCH 342/423] BCM270X_DT: Add umbrella I2C Mux overlay i2c-mux
-
-This overlay supports a range of I2C multiplexers - PCA9542 (2 ports),
-PCA9545 (4 ports) and PCA9548 (8 ports).
-
-Also remove the dedicated i2c-mux-9548a overlays since it is no longer
-needed.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/Makefile                |   2 +-
- arch/arm/boot/dts/overlays/README                  |  17 ++-
- arch/arm/boot/dts/overlays/i2c-mux-overlay.dts     | 138 +++++++++++++++++++++
- .../boot/dts/overlays/i2c-mux-pca9548a-overlay.dts |  67 ----------
- 4 files changed, 152 insertions(+), 72 deletions(-)
- create mode 100644 arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
- delete 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
-@@ -34,7 +34,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) += i2c-mux.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2c-pwm-pca9685a.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2c0-bcm2708.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2c1-bcm2708.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -421,10 +421,19 @@ 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-mux
-+Info:   Adds support for a number of I2C bus multiplexers on i2c_arm
-+Load:   dtoverlay=i2c-mux,<param>=<val>
-+Params: pca9542                 Select the NXP PCA9542 device
-+
-+        pca9545                 Select the NXP PCA9545 device
-+
-+        pca9548                 Select the NXP PCA9548 device
-+
-+        addr                    Change I2C address of the device (default 0x70)
-+
-+
-+[ The i2c-mux-pca9548a overlay has been deleted. See i2c-mux. ]
- Name:   i2c-pwm-pca9685a
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
-@@ -0,0 +1,138 @@
-+// Umbrella I2C Mux overlay
-+
-+/dts-v1/;
-+/plugin/;
-+
-+/{
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&i2c_arm>;
-+              __dormant__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      pca9542: mux@70 {
-+                              compatible = "nxp,pca9542";
-+                              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>;
-+                              };
-+                      };
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&i2c_arm>;
-+              __dormant__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      pca9545: mux@70 {
-+                              compatible = "nxp,pca9545";
-+                              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>;
-+                              };
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&i2c_arm>;
-+              __dormant__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      pca9548: 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__ {
-+              pca9542 = <0>, "+0";
-+              pca9545 = <0>, "+1";
-+              pca9548 = <0>, "+2";
-+
-+              addr =  <&pca9545>,"reg:0",
-+                      <&pca9548>,"reg:0";
-+      };
-+};
---- a/arch/arm/boot/dts/overlays/i2c-mux-pca9548a-overlay.dts
-+++ /dev/null
-@@ -1,67 +0,0 @@
--// 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";
--      };
--};
diff --git a/target/linux/brcm2708/patches-4.4/0342-BCM270X_DT-Include-address-override-for-pca9542.patch b/target/linux/brcm2708/patches-4.4/0342-BCM270X_DT-Include-address-override-for-pca9542.patch
new file mode 100644 (file)
index 0000000..877d347
--- /dev/null
@@ -0,0 +1,24 @@
+From 4ba99a9cdd73c1e8f24ac981a7d7af3f440de4f6 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 12 May 2016 08:52:06 +0100
+Subject: [PATCH] BCM270X_DT: Include address override for pca9542
+
+Omitted from "BCM270X_DT: Add umbrella I2C Mux overlay i2c-mux".
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/i2c-mux-overlay.dts | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
+@@ -132,7 +132,8 @@
+               pca9545 = <0>, "+1";
+               pca9548 = <0>, "+2";
+-              addr =  <&pca9545>,"reg:0",
++              addr =  <&pca9542>,"reg:0",
++                      <&pca9545>,"reg:0",
+                       <&pca9548>,"reg:0";
+       };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0343-BCM270X_DT-Fix-the-tinylcd35-overlay-RTC-support.patch b/target/linux/brcm2708/patches-4.4/0343-BCM270X_DT-Fix-the-tinylcd35-overlay-RTC-support.patch
new file mode 100644 (file)
index 0000000..cb6f460
--- /dev/null
@@ -0,0 +1,68 @@
+From f2bdc9fa776b22616cb5ec64ae1d027b8c4ca721 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 12 May 2016 09:04:20 +0100
+Subject: [PATCH] BCM270X_DT: Fix the tinylcd35 overlay RTC support
+
+Now that overlay parameters are applied before the merge (a requirement
+for kernel runtime overlays) it is illegal for parameters/overrides to
+target nodes in the base DTB. Solve the problem of only enabling I2C
+when an RTC option is used by making the RTC fragments conditional,
+and including the required status="okay" within the fragments.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/tinylcd35-overlay.dts | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts
++++ b/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts
+@@ -132,28 +132,32 @@
+       fragment@5 {
+               target = <&i2c1>;
+-              __overlay__ {
++              __dormant__ {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
++                      status = "okay";
++
+                       pcf8563: pcf8563@51 {
+                               compatible = "nxp,pcf8563";
+                               reg = <0x51>;
+-                              status = "disabled";
++                              status = "okay";
+                       };
+               };
+       };
+       fragment@6 {
+               target = <&i2c1>;
+-              __overlay__ {
++              __dormant__ {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
++                      status = "okay";
++
+                       ds1307: ds1307@68 {
+                               compatible = "maxim,ds1307";
+                               reg = <0x68>;
+-                              status = "disabled";
++                              status = "okay";
+                       };
+               };
+       };
+@@ -213,10 +217,8 @@
+                            <&tinylcd35_ts>,"interrupts:0",
+                            <&tinylcd35_ts>,"pendown-gpio:4";
+               xohms =      <&tinylcd35_ts>,"ti,x-plate-ohms;0";
+-              rtc-pcf =    <&i2c1>,"status",
+-                           <&pcf8563>,"status";
+-              rtc-ds =     <&i2c1>,"status",
+-                           <&ds1307>,"status";
++              rtc-pcf =    <0>,"=5";
++              rtc-ds =     <0>,"=6";
+               keypad =     <&keypad>,"status";
+       };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0343-BCM270X_DT-Include-address-override-for-pca9542.patch b/target/linux/brcm2708/patches-4.4/0343-BCM270X_DT-Include-address-override-for-pca9542.patch
deleted file mode 100644 (file)
index c5b7d1a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-From d800efe9cfbd2da1f1ee88196a34447ff7fa7461 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Thu, 12 May 2016 08:52:06 +0100
-Subject: [PATCH 343/423] BCM270X_DT: Include address override for pca9542
-
-Omitted from "BCM270X_DT: Add umbrella I2C Mux overlay i2c-mux".
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/i2c-mux-overlay.dts | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts
-@@ -132,7 +132,8 @@
-               pca9545 = <0>, "+1";
-               pca9548 = <0>, "+2";
--              addr =  <&pca9545>,"reg:0",
-+              addr =  <&pca9542>,"reg:0",
-+                      <&pca9545>,"reg:0",
-                       <&pca9548>,"reg:0";
-       };
- };
diff --git a/target/linux/brcm2708/patches-4.4/0344-BCM270X_DT-Fix-the-tinylcd35-overlay-RTC-support.patch b/target/linux/brcm2708/patches-4.4/0344-BCM270X_DT-Fix-the-tinylcd35-overlay-RTC-support.patch
deleted file mode 100644 (file)
index 6127769..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-From 9812988c5073448717f74b5bf9aae9da029fb530 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Thu, 12 May 2016 09:04:20 +0100
-Subject: [PATCH 344/423] BCM270X_DT: Fix the tinylcd35 overlay RTC support
-
-Now that overlay parameters are applied before the merge (a requirement
-for kernel runtime overlays) it is illegal for parameters/overrides to
-target nodes in the base DTB. Solve the problem of only enabling I2C
-when an RTC option is used by making the RTC fragments conditional,
-and including the required status="okay" within the fragments.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/tinylcd35-overlay.dts | 18 ++++++++++--------
- 1 file changed, 10 insertions(+), 8 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts
-@@ -132,28 +132,32 @@
-       fragment@5 {
-               target = <&i2c1>;
--              __overlay__ {
-+              __dormant__ {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      status = "okay";
-+
-                       pcf8563: pcf8563@51 {
-                               compatible = "nxp,pcf8563";
-                               reg = <0x51>;
--                              status = "disabled";
-+                              status = "okay";
-                       };
-               };
-       };
-       fragment@6 {
-               target = <&i2c1>;
--              __overlay__ {
-+              __dormant__ {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-+                      status = "okay";
-+
-                       ds1307: ds1307@68 {
-                               compatible = "maxim,ds1307";
-                               reg = <0x68>;
--                              status = "disabled";
-+                              status = "okay";
-                       };
-               };
-       };
-@@ -213,10 +217,8 @@
-                            <&tinylcd35_ts>,"interrupts:0",
-                            <&tinylcd35_ts>,"pendown-gpio:4";
-               xohms =      <&tinylcd35_ts>,"ti,x-plate-ohms;0";
--              rtc-pcf =    <&i2c1>,"status",
--                           <&pcf8563>,"status";
--              rtc-ds =     <&i2c1>,"status",
--                           <&ds1307>,"status";
-+              rtc-pcf =    <0>,"=5";
-+              rtc-ds =     <0>,"=6";
-               keypad =     <&keypad>,"status";
-       };
- };
diff --git a/target/linux/brcm2708/patches-4.4/0344-clk-Allow-clocks-to-be-marked-as-CRITICAL.patch b/target/linux/brcm2708/patches-4.4/0344-clk-Allow-clocks-to-be-marked-as-CRITICAL.patch
new file mode 100644 (file)
index 0000000..ca69a6d
--- /dev/null
@@ -0,0 +1,43 @@
+From f782ae472861f096fb8b349c3775fbce6316826e Mon Sep 17 00:00:00 2001
+From: Lee Jones <lee.jones@linaro.org>
+Date: Thu, 11 Feb 2016 13:19:09 -0800
+Subject: [PATCH] clk: Allow clocks to be marked as CRITICAL
+
+Critical clocks are those which must not be gated, else undefined
+or catastrophic failure would occur.  Here we have chosen to
+ensure the prepare/enable counts are correctly incremented, so as
+not to confuse users with enabled clocks with no visible users.
+
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Michael Turquette <mturquette@baylibre.com>
+Link: lkml.kernel.org/r/1455225554-13267-2-git-send-email-mturquette@baylibre.com
+(cherry picked from commit 32b9b10961860860268961d9aad0c56a73018c37)
+---
+ drivers/clk/clk.c            | 5 +++++
+ include/linux/clk-provider.h | 1 +
+ 2 files changed, 6 insertions(+)
+
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -2466,6 +2466,11 @@ static int __clk_init(struct device *dev
+       if (core->ops->init)
+               core->ops->init(core->hw);
++      if (core->flags & CLK_IS_CRITICAL) {
++              clk_core_prepare(core);
++              clk_core_enable(core);
++      }
++
+       kref_init(&core->ref);
+ out:
+       clk_prepare_unlock();
+--- a/include/linux/clk-provider.h
++++ b/include/linux/clk-provider.h
+@@ -31,6 +31,7 @@
+ #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
+ #define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */
+ #define CLK_RECALC_NEW_RATES  BIT(9) /* recalc rates after notifications */
++#define CLK_IS_CRITICAL               BIT(11) /* do not gate, ever */
+ struct clk;
+ struct clk_hw;
diff --git a/target/linux/brcm2708/patches-4.4/0345-clk-Allow-clocks-to-be-marked-as-CRITICAL.patch b/target/linux/brcm2708/patches-4.4/0345-clk-Allow-clocks-to-be-marked-as-CRITICAL.patch
deleted file mode 100644 (file)
index 04ccb70..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-From 3832bdcd51bcc95305c6ee0b381ae664d0516ce5 Mon Sep 17 00:00:00 2001
-From: Lee Jones <lee.jones@linaro.org>
-Date: Thu, 11 Feb 2016 13:19:09 -0800
-Subject: [PATCH 345/423] clk: Allow clocks to be marked as CRITICAL
-
-Critical clocks are those which must not be gated, else undefined
-or catastrophic failure would occur.  Here we have chosen to
-ensure the prepare/enable counts are correctly incremented, so as
-not to confuse users with enabled clocks with no visible users.
-
-Signed-off-by: Lee Jones <lee.jones@linaro.org>
-Signed-off-by: Michael Turquette <mturquette@baylibre.com>
-Link: lkml.kernel.org/r/1455225554-13267-2-git-send-email-mturquette@baylibre.com
-(cherry picked from commit 32b9b10961860860268961d9aad0c56a73018c37)
----
- drivers/clk/clk.c            | 5 +++++
- include/linux/clk-provider.h | 1 +
- 2 files changed, 6 insertions(+)
-
---- a/drivers/clk/clk.c
-+++ b/drivers/clk/clk.c
-@@ -2466,6 +2466,11 @@ static int __clk_init(struct device *dev
-       if (core->ops->init)
-               core->ops->init(core->hw);
-+      if (core->flags & CLK_IS_CRITICAL) {
-+              clk_core_prepare(core);
-+              clk_core_enable(core);
-+      }
-+
-       kref_init(&core->ref);
- out:
-       clk_prepare_unlock();
---- a/include/linux/clk-provider.h
-+++ b/include/linux/clk-provider.h
-@@ -31,6 +31,7 @@
- #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
- #define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */
- #define CLK_RECALC_NEW_RATES  BIT(9) /* recalc rates after notifications */
-+#define CLK_IS_CRITICAL               BIT(11) /* do not gate, ever */
- struct clk;
- struct clk_hw;
diff --git a/target/linux/brcm2708/patches-4.4/0345-clk-bcm2835-Mark-the-VPU-clock-as-critical.patch b/target/linux/brcm2708/patches-4.4/0345-clk-bcm2835-Mark-the-VPU-clock-as-critical.patch
new file mode 100644 (file)
index 0000000..92b9501
--- /dev/null
@@ -0,0 +1,46 @@
+From 9f73459ac27903bb52d831db29cb70a95189fdba Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 26 Apr 2016 11:44:59 -0700
+Subject: [PATCH] clk: bcm2835: Mark the VPU clock as critical
+
+The VPU clock is also the clock for our AXI bus, so we really can't
+disable it.  This might have happened during boot if, for example,
+uart1 (aux_uart clock) probed and was then disabled before the other
+consumers of the VPU clock had probed.
+
+v2: Rewrite to use a .flags in bcm2835_clock_data, since other clocks
+    will need this too.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/clk/bcm/clk-bcm2835.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -446,6 +446,8 @@ struct bcm2835_clock_data {
+       /* Number of fractional bits in the divider */
+       u32 frac_bits;
++      u32 flags;
++
+       bool is_vpu_clock;
+       bool is_mash_clock;
+ };
+@@ -1242,7 +1244,7 @@ static struct clk *bcm2835_register_cloc
+       init.parent_names = parents;
+       init.num_parents = data->num_mux_parents;
+       init.name = data->name;
+-      init.flags = CLK_IGNORE_UNUSED;
++      init.flags = data->flags | CLK_IGNORE_UNUSED;
+       if (data->is_vpu_clock) {
+               init.ops = &bcm2835_vpu_clock_clk_ops;
+@@ -1661,6 +1663,7 @@ static const struct bcm2835_clk_desc clk
+               .div_reg = CM_VPUDIV,
+               .int_bits = 12,
+               .frac_bits = 8,
++              .flags = CLK_IS_CRITICAL,
+               .is_vpu_clock = true),
+       /* clocks with per parent mux */
diff --git a/target/linux/brcm2708/patches-4.4/0346-clk-bcm2835-Mark-GPIO-clocks-enabled-at-boot-as-crit.patch b/target/linux/brcm2708/patches-4.4/0346-clk-bcm2835-Mark-GPIO-clocks-enabled-at-boot-as-crit.patch
new file mode 100644 (file)
index 0000000..60e4dd9
--- /dev/null
@@ -0,0 +1,54 @@
+From 832d2f1df231073ac72474743e3d3adbf0540030 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 9 May 2016 17:28:18 -0700
+Subject: [PATCH] clk: bcm2835: Mark GPIO clocks enabled at boot as critical.
+
+These divide off of PLLD_PER and are used for the ethernet and wifi
+PHYs source PLLs.  Neither of them is currently represented by a phy
+device that would grab the clock for us.
+
+This keeps other drivers from killing the networking PHYs when they
+disable their own clocks and trigger PLLD_PER's refcount going to 0.
+
+v2: Skip marking as critical if they aren't on at boot.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/clk/bcm/clk-bcm2835.c | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -1246,6 +1246,15 @@ static struct clk *bcm2835_register_cloc
+       init.name = data->name;
+       init.flags = data->flags | CLK_IGNORE_UNUSED;
++      /*
++       * Some GPIO clocks for ethernet/wifi PLLs are marked as
++       * critical (since some platforms use them), but if the
++       * firmware didn't have them turned on then they clearly
++       * aren't actually critical.
++       */
++      if ((cprman_read(cprman, data->ctl_reg) & CM_ENABLE) == 0)
++              init.flags &= ~CLK_IS_CRITICAL;
++
+       if (data->is_vpu_clock) {
+               init.ops = &bcm2835_vpu_clock_clk_ops;
+       } else {
+@@ -1720,13 +1729,15 @@ static const struct bcm2835_clk_desc clk
+               .div_reg = CM_GP1DIV,
+               .int_bits = 12,
+               .frac_bits = 12,
++              .flags = CLK_IS_CRITICAL,
+               .is_mash_clock = true),
+       [BCM2835_CLOCK_GP2]     = REGISTER_PER_CLK(
+               .name = "gp2",
+               .ctl_reg = CM_GP2CTL,
+               .div_reg = CM_GP2DIV,
+               .int_bits = 12,
+-              .frac_bits = 12),
++              .frac_bits = 12,
++              .flags = CLK_IS_CRITICAL),
+       /* HDMI state machine */
+       [BCM2835_CLOCK_HSM]     = REGISTER_PER_CLK(
diff --git a/target/linux/brcm2708/patches-4.4/0346-clk-bcm2835-Mark-the-VPU-clock-as-critical.patch b/target/linux/brcm2708/patches-4.4/0346-clk-bcm2835-Mark-the-VPU-clock-as-critical.patch
deleted file mode 100644 (file)
index 5e5c028..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From 644a5704bc14bbdea57fabeed0a5f2eb4e8f7251 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Tue, 26 Apr 2016 11:44:59 -0700
-Subject: [PATCH 346/423] clk: bcm2835: Mark the VPU clock as critical
-
-The VPU clock is also the clock for our AXI bus, so we really can't
-disable it.  This might have happened during boot if, for example,
-uart1 (aux_uart clock) probed and was then disabled before the other
-consumers of the VPU clock had probed.
-
-v2: Rewrite to use a .flags in bcm2835_clock_data, since other clocks
-    will need this too.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/clk/bcm/clk-bcm2835.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/drivers/clk/bcm/clk-bcm2835.c
-+++ b/drivers/clk/bcm/clk-bcm2835.c
-@@ -446,6 +446,8 @@ struct bcm2835_clock_data {
-       /* Number of fractional bits in the divider */
-       u32 frac_bits;
-+      u32 flags;
-+
-       bool is_vpu_clock;
-       bool is_mash_clock;
- };
-@@ -1242,7 +1244,7 @@ static struct clk *bcm2835_register_cloc
-       init.parent_names = parents;
-       init.num_parents = data->num_mux_parents;
-       init.name = data->name;
--      init.flags = CLK_IGNORE_UNUSED;
-+      init.flags = data->flags | CLK_IGNORE_UNUSED;
-       if (data->is_vpu_clock) {
-               init.ops = &bcm2835_vpu_clock_clk_ops;
-@@ -1661,6 +1663,7 @@ static const struct bcm2835_clk_desc clk
-               .div_reg = CM_VPUDIV,
-               .int_bits = 12,
-               .frac_bits = 8,
-+              .flags = CLK_IS_CRITICAL,
-               .is_vpu_clock = true),
-       /* clocks with per parent mux */
diff --git a/target/linux/brcm2708/patches-4.4/0347-clk-bcm2835-Mark-GPIO-clocks-enabled-at-boot-as-crit.patch b/target/linux/brcm2708/patches-4.4/0347-clk-bcm2835-Mark-GPIO-clocks-enabled-at-boot-as-crit.patch
deleted file mode 100644 (file)
index 16e753e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-From 9a5319c6915364018e9422b6cef7e63a011b8b57 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Mon, 9 May 2016 17:28:18 -0700
-Subject: [PATCH 347/423] clk: bcm2835: Mark GPIO clocks enabled at boot as
- critical.
-
-These divide off of PLLD_PER and are used for the ethernet and wifi
-PHYs source PLLs.  Neither of them is currently represented by a phy
-device that would grab the clock for us.
-
-This keeps other drivers from killing the networking PHYs when they
-disable their own clocks and trigger PLLD_PER's refcount going to 0.
-
-v2: Skip marking as critical if they aren't on at boot.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/clk/bcm/clk-bcm2835.c | 13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
---- a/drivers/clk/bcm/clk-bcm2835.c
-+++ b/drivers/clk/bcm/clk-bcm2835.c
-@@ -1246,6 +1246,15 @@ static struct clk *bcm2835_register_cloc
-       init.name = data->name;
-       init.flags = data->flags | CLK_IGNORE_UNUSED;
-+      /*
-+       * Some GPIO clocks for ethernet/wifi PLLs are marked as
-+       * critical (since some platforms use them), but if the
-+       * firmware didn't have them turned on then they clearly
-+       * aren't actually critical.
-+       */
-+      if ((cprman_read(cprman, data->ctl_reg) & CM_ENABLE) == 0)
-+              init.flags &= ~CLK_IS_CRITICAL;
-+
-       if (data->is_vpu_clock) {
-               init.ops = &bcm2835_vpu_clock_clk_ops;
-       } else {
-@@ -1720,13 +1729,15 @@ static const struct bcm2835_clk_desc clk
-               .div_reg = CM_GP1DIV,
-               .int_bits = 12,
-               .frac_bits = 12,
-+              .flags = CLK_IS_CRITICAL,
-               .is_mash_clock = true),
-       [BCM2835_CLOCK_GP2]     = REGISTER_PER_CLK(
-               .name = "gp2",
-               .ctl_reg = CM_GP2CTL,
-               .div_reg = CM_GP2DIV,
-               .int_bits = 12,
--              .frac_bits = 12),
-+              .frac_bits = 12,
-+              .flags = CLK_IS_CRITICAL),
-       /* HDMI state machine */
-       [BCM2835_CLOCK_HSM]     = REGISTER_PER_CLK(
diff --git a/target/linux/brcm2708/patches-4.4/0347-clk-bcm2835-Skip-PLLC-clocks-when-deciding-on-a-new-.patch b/target/linux/brcm2708/patches-4.4/0347-clk-bcm2835-Skip-PLLC-clocks-when-deciding-on-a-new-.patch
new file mode 100644 (file)
index 0000000..cc90841
--- /dev/null
@@ -0,0 +1,71 @@
+From 960587a39d7ca3d5279841218b42e008df7194aa Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 26 Apr 2016 12:39:45 -0700
+Subject: [PATCH] clk: bcm2835: Skip PLLC clocks when deciding on a new clock
+ parent
+
+If the firmware had set up a clock to source from PLLC, go along with
+it.  But if we're looking for a new parent, we don't want to switch it
+to PLLC because the firmware will force PLLC (and thus the AXI bus
+clock) to different frequencies during over-temp/under-voltage,
+without notification to Linux.
+
+On my system, this moves the Linux-enabled HDMI state machine and DSI1
+escape clock over to plld_per from pllc_per.  EMMC still ends up on
+pllc_per, because the firmware had set it up to use that.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks")
+---
+ drivers/clk/bcm/clk-bcm2835.c | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -1020,16 +1020,28 @@ static int bcm2835_clock_set_rate(struct
+       return 0;
+ }
++static bool
++bcm2835_clk_is_pllc(struct clk_hw *hw)
++{
++      if (!hw)
++              return false;
++
++      return strncmp(clk_hw_get_name(hw), "pllc", 4) == 0;
++}
++
+ static int bcm2835_clock_determine_rate(struct clk_hw *hw,
+                                       struct clk_rate_request *req)
+ {
+       struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
+       struct clk_hw *parent, *best_parent = NULL;
++      bool current_parent_is_pllc;
+       unsigned long rate, best_rate = 0;
+       unsigned long prate, best_prate = 0;
+       size_t i;
+       u32 div;
++      current_parent_is_pllc = bcm2835_clk_is_pllc(clk_hw_get_parent(hw));
++
+       /*
+        * Select parent clock that results in the closest but lower rate
+        */
+@@ -1037,6 +1049,17 @@ static int bcm2835_clock_determine_rate(
+               parent = clk_hw_get_parent_by_index(hw, i);
+               if (!parent)
+                       continue;
++
++              /*
++               * Don't choose a PLLC-derived clock as our parent
++               * unless it had been manually set that way.  PLLC's
++               * frequency gets adjusted by the firmware due to
++               * over-temp or under-voltage conditions, without
++               * prior notification to our clock consumer.
++               */
++              if (bcm2835_clk_is_pllc(parent) && !current_parent_is_pllc)
++                      continue;
++
+               prate = clk_hw_get_rate(parent);
+               div = bcm2835_clock_choose_div(hw, req->rate, prate, true);
+               rate = bcm2835_clock_rate_from_divisor(clock, prate, div);
diff --git a/target/linux/brcm2708/patches-4.4/0348-clk-bcm2835-Skip-PLLC-clocks-when-deciding-on-a-new-.patch b/target/linux/brcm2708/patches-4.4/0348-clk-bcm2835-Skip-PLLC-clocks-when-deciding-on-a-new-.patch
deleted file mode 100644 (file)
index f9b84cc..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-From 58d35c928d3fad63627f4bd84126746a08e6ff6c Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Tue, 26 Apr 2016 12:39:45 -0700
-Subject: [PATCH 348/423] clk: bcm2835: Skip PLLC clocks when deciding on a new
- clock parent
-
-If the firmware had set up a clock to source from PLLC, go along with
-it.  But if we're looking for a new parent, we don't want to switch it
-to PLLC because the firmware will force PLLC (and thus the AXI bus
-clock) to different frequencies during over-temp/under-voltage,
-without notification to Linux.
-
-On my system, this moves the Linux-enabled HDMI state machine and DSI1
-escape clock over to plld_per from pllc_per.  EMMC still ends up on
-pllc_per, because the firmware had set it up to use that.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks")
----
- drivers/clk/bcm/clk-bcm2835.c | 23 +++++++++++++++++++++++
- 1 file changed, 23 insertions(+)
-
---- a/drivers/clk/bcm/clk-bcm2835.c
-+++ b/drivers/clk/bcm/clk-bcm2835.c
-@@ -1020,16 +1020,28 @@ static int bcm2835_clock_set_rate(struct
-       return 0;
- }
-+static bool
-+bcm2835_clk_is_pllc(struct clk_hw *hw)
-+{
-+      if (!hw)
-+              return false;
-+
-+      return strncmp(clk_hw_get_name(hw), "pllc", 4) == 0;
-+}
-+
- static int bcm2835_clock_determine_rate(struct clk_hw *hw,
-                                       struct clk_rate_request *req)
- {
-       struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
-       struct clk_hw *parent, *best_parent = NULL;
-+      bool current_parent_is_pllc;
-       unsigned long rate, best_rate = 0;
-       unsigned long prate, best_prate = 0;
-       size_t i;
-       u32 div;
-+      current_parent_is_pllc = bcm2835_clk_is_pllc(clk_hw_get_parent(hw));
-+
-       /*
-        * Select parent clock that results in the closest but lower rate
-        */
-@@ -1037,6 +1049,17 @@ static int bcm2835_clock_determine_rate(
-               parent = clk_hw_get_parent_by_index(hw, i);
-               if (!parent)
-                       continue;
-+
-+              /*
-+               * Don't choose a PLLC-derived clock as our parent
-+               * unless it had been manually set that way.  PLLC's
-+               * frequency gets adjusted by the firmware due to
-+               * over-temp or under-voltage conditions, without
-+               * prior notification to our clock consumer.
-+               */
-+              if (bcm2835_clk_is_pllc(parent) && !current_parent_is_pllc)
-+                      continue;
-+
-               prate = clk_hw_get_rate(parent);
-               div = bcm2835_clock_choose_div(hw, req->rate, prate, true);
-               rate = bcm2835_clock_rate_from_divisor(clock, prate, div);
diff --git a/target/linux/brcm2708/patches-4.4/0348-mmc-Add-MMC_QUIRK_ERASE_BROKEN-for-some-cards.patch b/target/linux/brcm2708/patches-4.4/0348-mmc-Add-MMC_QUIRK_ERASE_BROKEN-for-some-cards.patch
new file mode 100644 (file)
index 0000000..852f47b
--- /dev/null
@@ -0,0 +1,56 @@
+From 8b01bab8c89fd4930ad304b5a7b3c1f6016c3743 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 11 May 2016 12:50:33 +0100
+Subject: [PATCH] mmc: Add MMC_QUIRK_ERASE_BROKEN for some cards
+
+Some SD cards have been found that corrupt data when small blocks
+are erased. Add a quirk to indicate that ERASE should not be used,
+and set it for cards of that type.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/card/block.c | 7 +++++++
+ drivers/mmc/core/core.c  | 3 ++-
+ include/linux/mmc/card.h | 3 +++
+ 3 files changed, 12 insertions(+), 1 deletion(-)
+
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -2552,6 +2552,13 @@ static const struct mmc_fixup blk_fixups
+       MMC_FIXUP("V10016", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_TRIM_BROKEN),
++      /*
++       *  On some Kingston SD cards, multiple erases of less than 64
++       *  sectors can cause corruption.
++       */
++      MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
++                MMC_QUIRK_ERASE_BROKEN),
++
+       END_FIXUP
+ };
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -2253,7 +2253,8 @@ EXPORT_SYMBOL(mmc_erase);
+ int mmc_can_erase(struct mmc_card *card)
+ {
+       if ((card->host->caps & MMC_CAP_ERASE) &&
+-          (card->csd.cmdclass & CCC_ERASE) && card->erase_size)
++          (card->csd.cmdclass & CCC_ERASE) && card->erase_size &&
++          !(card->quirks & MMC_QUIRK_ERASE_BROKEN))
+               return 1;
+       return 0;
+ }
+--- a/include/linux/mmc/card.h
++++ b/include/linux/mmc/card.h
+@@ -281,6 +281,9 @@ struct mmc_card {
+ #define MMC_QUIRK_TRIM_BROKEN (1<<12)         /* Skip trim */
++#define MMC_QUIRK_ERASE_BROKEN        (1<<31)         /* Skip erase */
++
++
+       unsigned int            erase_size;     /* erase size in sectors */
+       unsigned int            erase_shift;    /* if erase unit is power 2 */
+       unsigned int            pref_erase;     /* in sectors */
diff --git a/target/linux/brcm2708/patches-4.4/0349-New-AudioInjector.net-Pi-soundcard-with-low-jitter-a.patch b/target/linux/brcm2708/patches-4.4/0349-New-AudioInjector.net-Pi-soundcard-with-low-jitter-a.patch
new file mode 100644 (file)
index 0000000..c29bd86
--- /dev/null
@@ -0,0 +1,284 @@
+From ae776ef7eb34d99945aadbaa607e1aec66fd04d0 Mon Sep 17 00:00:00 2001
+From: Matt Flax <flatmax@flatmax.org>
+Date: Mon, 16 May 2016 21:36:31 +1000
+Subject: [PATCH] New AudioInjector.net Pi soundcard with low jitter audio in
+ and out.
+
+Contains the sound/soc/bcm ALSA machine driver and necessary alterations to the Kconfig and Makefile.
+Adds the dts overlay and updates the Makefile and README.
+Updates the relevant defconfig files to enable building for the Raspberry Pi.
+Thanks to Phil Elwell (pelwell) for the review, simple-card concepts and discussion. Thanks to Clive Messer for overlay naming suggestions.
+---
+ arch/arm/boot/dts/overlays/Makefile                |   1 +
+ arch/arm/boot/dts/overlays/README                  |   6 +
+ .../audioinjector-wm8731-audio-overlay.dts         |  39 ++++++
+ arch/arm/configs/bcm2709_defconfig                 |   1 +
+ arch/arm/configs/bcmrpi_defconfig                  |   1 +
+ sound/soc/bcm/Kconfig                              |   7 +
+ sound/soc/bcm/Makefile                             |   3 +
+ sound/soc/bcm/audioinjector-pi-soundcard.c         | 142 +++++++++++++++++++++
+ 8 files changed, 200 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts
+ create mode 100644 sound/soc/bcm/audioinjector-pi-soundcard.c
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -16,6 +16,7 @@ dtbo-$(RPI_DT_OVERLAYS) += adau1977-adc.
+ dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += boomberry-dac.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += boomberry-digi.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -225,6 +225,12 @@ Params: interrupt               GPIO use
+                                 arrays (0=+0pF, 15=+4.5pF, default 15)
++Name:   audioinjector-wm8731-audio
++Info:   Configures the audioinjector.net audio add on soundcard
++Load:   dtoverlay=audioinjector-wm8731-audio
++Params: <None>
++
++
+ Name:   bmp085_i2c-sensor
+ Info:   Configures the BMP085/BMP180 digital barometric pressure and temperature
+         sensors from Bosch Sensortec
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts
+@@ -0,0 +1,39 @@
++// Definitions for audioinjector.net audio add on soundcard
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      wm8731@1a {
++                              #sound-dai-cells = <0>;
++                              compatible = "wlf,wm8731";
++                              reg = <0x1a>;
++                              status = "okay";
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&sound>;
++              __overlay__ {
++                      compatible = "ai,audioinjector-pi-soundcard";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -863,6 +863,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
+ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
++CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -855,6 +855,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
+ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
++CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -85,3 +85,10 @@ config SND_BCM2708_SOC_ADAU1977_ADC
+       select SND_SOC_ADAU1977_I2C
+       help
+         Say Y or M if you want to add support for ADAU1977 ADC.
++
++config SND_AUDIOINJECTOR_PI_SOUNDCARD
++      tristate "Support for audioinjector.net Pi add on soundcard"
++      depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
++      select SND_SOC_WM8731
++      help
++        Say Y or M if you want to add support for audioinjector.net Pi Hat
+--- a/sound/soc/bcm/Makefile
++++ b/sound/soc/bcm/Makefile
+@@ -15,6 +15,7 @@ snd-soc-rpi-dac-objs := rpi-dac.o
+ snd-soc-rpi-proto-objs := rpi-proto.o
+ snd-soc-iqaudio-dac-objs := iqaudio-dac.o
+ snd-soc-raspidac3-objs := raspidac3.o
++snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
+ obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
+@@ -27,3 +28,5 @@ obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) +=
+ obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
+ obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
+ obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
++obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
++
+--- /dev/null
++++ b/sound/soc/bcm/audioinjector-pi-soundcard.c
+@@ -0,0 +1,142 @@
++/*
++ * ASoC Driver for AudioInjector Pi add on soundcard
++ *
++ *  Created on: 13-May-2016
++ *      Author: flatmax@flatmax.org
++ *              based on code by  Cliff Cai <Cliff.Cai@analog.com> for the ssm2602 machine blackfin.
++ *              with help from Lars-Peter Clausen for simplifying the original code to use the dai_fmt field.
++ *            i2s_node code taken from the other sound/soc/bcm machine drivers.
++ *
++ * Copyright (C) 2016 Flatmax Pty. Ltd.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/types.h>
++
++#include <sound/core.h>
++#include <sound/soc.h>
++#include <sound/pcm_params.h>
++#include <sound/control.h>
++
++#include "../codecs/wm8731.h"
++
++static int audioinjector_pi_soundcard_dai_init(struct snd_soc_pcm_runtime *rtd)
++{
++      struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
++
++      // not connected
++      snd_soc_dapm_nc_pin(dapm, "Mic Bias");
++      snd_soc_dapm_nc_pin(dapm, "MICIN");
++      snd_soc_dapm_nc_pin(dapm, "RHPOUT");
++      snd_soc_dapm_nc_pin(dapm, "LHPOUT");
++
++      return snd_soc_dai_set_sysclk(rtd->codec_dai, WM8731_SYSCLK_XTAL, 12000000, SND_SOC_CLOCK_IN);
++}
++
++static struct snd_soc_dai_link audioinjector_pi_soundcard_dai[] = {
++      {
++              .name = "AudioInjector audio",
++              .stream_name = "AudioInjector audio",
++              .cpu_dai_name   = "bcm2708-i2s.0",
++              .codec_dai_name = "wm8731-hifi",
++              .platform_name  = "bcm2835-i2s.0",
++              .codec_name = "wm8731.1-001a",
++              .init = audioinjector_pi_soundcard_dai_init,
++              .dai_fmt = SND_SOC_DAIFMT_CBM_CFM|SND_SOC_DAIFMT_I2S|SND_SOC_DAIFMT_NB_NF,
++      },
++};
++
++static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
++      SND_SOC_DAPM_SPK("Ext Spk", NULL),
++      SND_SOC_DAPM_LINE("Line In Jacks", NULL),
++};
++
++/* Corgi machine connections to the codec pins */
++static const struct snd_soc_dapm_route audioinjector_audio_map[] = {
++      /* speaker connected to LOUT, ROUT */
++      {"Ext Spk", NULL, "ROUT"},
++      {"Ext Spk", NULL, "LOUT"},
++
++      /* line inputs */
++      {"Line In Jacks", NULL, "Line Input"},
++};
++
++static struct snd_soc_card snd_soc_audioinjector = {
++      .name = "audioinjector-pi-soundcard",
++      .dai_link = audioinjector_pi_soundcard_dai,
++      .num_links = 1,
++
++      .dapm_widgets = wm8731_dapm_widgets,
++      .num_dapm_widgets = ARRAY_SIZE(wm8731_dapm_widgets),
++      .dapm_routes = audioinjector_audio_map,
++      .num_dapm_routes = ARRAY_SIZE(audioinjector_audio_map),
++};
++
++static int audioinjector_pi_soundcard_probe(struct platform_device *pdev)
++{
++      struct snd_soc_card *card = &snd_soc_audioinjector;
++      int ret;
++      
++      card->dev = &pdev->dev;
++
++      if (pdev->dev.of_node) {
++              struct snd_soc_dai_link *dai = &audioinjector_pi_soundcard_dai[0];
++              struct device_node *i2s_node = of_parse_phandle(pdev->dev.of_node,
++                                                              "i2s-controller", 0);
++
++              if (i2s_node) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_node;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_node;
++              } else
++                      if (!dai->cpu_of_node) {
++                              dev_err(&pdev->dev, "Property 'i2s-controller' missing or invalid\n");
++                              return -EINVAL;
++                      }
++      }
++
++      if ((ret = snd_soc_register_card(card))) {
++              dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret);
++      }
++      return ret;
++}
++
++static int audioinjector_pi_soundcard_remove(struct platform_device *pdev)
++{
++      struct snd_soc_card *card = platform_get_drvdata(pdev);
++      return snd_soc_unregister_card(card);
++
++}
++
++static const struct of_device_id audioinjector_pi_soundcard_of_match[] = {
++      { .compatible = "ai,audioinjector-pi-soundcard", },
++      {},
++};
++MODULE_DEVICE_TABLE(of, audioinjector_pi_soundcard_of_match);
++
++static struct platform_driver audioinjector_pi_soundcard_driver = {
++       .driver         = {
++              .name   = "audioinjector-audio",
++              .owner  = THIS_MODULE,
++              .of_match_table = audioinjector_pi_soundcard_of_match,
++       },
++       .probe          = audioinjector_pi_soundcard_probe,
++       .remove         = audioinjector_pi_soundcard_remove,
++};
++
++module_platform_driver(audioinjector_pi_soundcard_driver);
++MODULE_AUTHOR("Matt Flax <flatmax@flatmax.org>");
++MODULE_DESCRIPTION("AudioInjector.net Pi Soundcard");
++MODULE_LICENSE("GPL v2");
++MODULE_ALIAS("platform:audioinjector-pi-soundcard");
++
diff --git a/target/linux/brcm2708/patches-4.4/0349-mmc-Add-MMC_QUIRK_ERASE_BROKEN-for-some-cards.patch b/target/linux/brcm2708/patches-4.4/0349-mmc-Add-MMC_QUIRK_ERASE_BROKEN-for-some-cards.patch
deleted file mode 100644 (file)
index 0058e8a..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-From efba060602bfb54eb1106972360df001bb88ae3b Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 11 May 2016 12:50:33 +0100
-Subject: [PATCH 349/423] mmc: Add MMC_QUIRK_ERASE_BROKEN for some cards
-
-Some SD cards have been found that corrupt data when small blocks
-are erased. Add a quirk to indicate that ERASE should not be used,
-and set it for cards of that type.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/mmc/card/block.c | 7 +++++++
- drivers/mmc/core/core.c  | 3 ++-
- include/linux/mmc/card.h | 3 +++
- 3 files changed, 12 insertions(+), 1 deletion(-)
-
---- a/drivers/mmc/card/block.c
-+++ b/drivers/mmc/card/block.c
-@@ -2552,6 +2552,13 @@ static const struct mmc_fixup blk_fixups
-       MMC_FIXUP("V10016", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
-                 MMC_QUIRK_TRIM_BROKEN),
-+      /*
-+       *  On some Kingston SD cards, multiple erases of less than 64
-+       *  sectors can cause corruption.
-+       */
-+      MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
-+                MMC_QUIRK_ERASE_BROKEN),
-+
-       END_FIXUP
- };
---- a/drivers/mmc/core/core.c
-+++ b/drivers/mmc/core/core.c
-@@ -2253,7 +2253,8 @@ EXPORT_SYMBOL(mmc_erase);
- int mmc_can_erase(struct mmc_card *card)
- {
-       if ((card->host->caps & MMC_CAP_ERASE) &&
--          (card->csd.cmdclass & CCC_ERASE) && card->erase_size)
-+          (card->csd.cmdclass & CCC_ERASE) && card->erase_size &&
-+          !(card->quirks & MMC_QUIRK_ERASE_BROKEN))
-               return 1;
-       return 0;
- }
---- a/include/linux/mmc/card.h
-+++ b/include/linux/mmc/card.h
-@@ -281,6 +281,9 @@ struct mmc_card {
- #define MMC_QUIRK_TRIM_BROKEN (1<<12)         /* Skip trim */
-+#define MMC_QUIRK_ERASE_BROKEN        (1<<31)         /* Skip erase */
-+
-+
-       unsigned int            erase_size;     /* erase size in sectors */
-       unsigned int            erase_shift;    /* if erase unit is power 2 */
-       unsigned int            pref_erase;     /* in sectors */
diff --git a/target/linux/brcm2708/patches-4.4/0350-New-AudioInjector.net-Pi-soundcard-with-low-jitter-a.patch b/target/linux/brcm2708/patches-4.4/0350-New-AudioInjector.net-Pi-soundcard-with-low-jitter-a.patch
deleted file mode 100644 (file)
index f9f0600..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-From ea3e9f892437a7afc78ac04e899fa35c155f198e Mon Sep 17 00:00:00 2001
-From: Matt Flax <flatmax@flatmax.org>
-Date: Mon, 16 May 2016 21:36:31 +1000
-Subject: [PATCH 350/423] New AudioInjector.net Pi soundcard with low jitter
- audio in and out.
-
-Contains the sound/soc/bcm ALSA machine driver and necessary alterations to the Kconfig and Makefile.
-Adds the dts overlay and updates the Makefile and README.
-Updates the relevant defconfig files to enable building for the Raspberry Pi.
-Thanks to Phil Elwell (pelwell) for the review, simple-card concepts and discussion. Thanks to Clive Messer for overlay naming suggestions.
----
- arch/arm/boot/dts/overlays/Makefile                |   1 +
- arch/arm/boot/dts/overlays/README                  |   6 +
- .../audioinjector-wm8731-audio-overlay.dts         |  39 ++++++
- arch/arm/configs/bcm2709_defconfig                 |   1 +
- arch/arm/configs/bcmrpi_defconfig                  |   1 +
- sound/soc/bcm/Kconfig                              |   7 +
- sound/soc/bcm/Makefile                             |   3 +
- sound/soc/bcm/audioinjector-pi-soundcard.c         | 142 +++++++++++++++++++++
- 8 files changed, 200 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts
- create mode 100644 sound/soc/bcm/audioinjector-pi-soundcard.c
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -16,6 +16,7 @@ dtbo-$(RPI_DT_OVERLAYS) += adau1977-adc.
- dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += boomberry-dac.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += boomberry-digi.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -225,6 +225,12 @@ Params: interrupt               GPIO use
-                                 arrays (0=+0pF, 15=+4.5pF, default 15)
-+Name:   audioinjector-wm8731-audio
-+Info:   Configures the audioinjector.net audio add on soundcard
-+Load:   dtoverlay=audioinjector-wm8731-audio
-+Params: <None>
-+
-+
- Name:   bmp085_i2c-sensor
- Info:   Configures the BMP085/BMP180 digital barometric pressure and temperature
-         sensors from Bosch Sensortec
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts
-@@ -0,0 +1,39 @@
-+// Definitions for audioinjector.net audio add on soundcard
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      wm8731@1a {
-+                              #sound-dai-cells = <0>;
-+                              compatible = "wlf,wm8731";
-+                              reg = <0x1a>;
-+                              status = "okay";
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&sound>;
-+              __overlay__ {
-+                      compatible = "ai,audioinjector-pi-soundcard";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+};
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -863,6 +863,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
- CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
-+CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
- CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -855,6 +855,7 @@ CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
- CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
-+CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
- CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
---- a/sound/soc/bcm/Kconfig
-+++ b/sound/soc/bcm/Kconfig
-@@ -85,3 +85,10 @@ config SND_BCM2708_SOC_ADAU1977_ADC
-       select SND_SOC_ADAU1977_I2C
-       help
-         Say Y or M if you want to add support for ADAU1977 ADC.
-+
-+config SND_AUDIOINJECTOR_PI_SOUNDCARD
-+      tristate "Support for audioinjector.net Pi add on soundcard"
-+      depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-+      select SND_SOC_WM8731
-+      help
-+        Say Y or M if you want to add support for audioinjector.net Pi Hat
---- a/sound/soc/bcm/Makefile
-+++ b/sound/soc/bcm/Makefile
-@@ -15,6 +15,7 @@ snd-soc-rpi-dac-objs := rpi-dac.o
- snd-soc-rpi-proto-objs := rpi-proto.o
- snd-soc-iqaudio-dac-objs := iqaudio-dac.o
- snd-soc-raspidac3-objs := raspidac3.o
-+snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
- obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
-@@ -27,3 +28,5 @@ obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) +=
- obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
- obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
- obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
-+obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
-+
---- /dev/null
-+++ b/sound/soc/bcm/audioinjector-pi-soundcard.c
-@@ -0,0 +1,142 @@
-+/*
-+ * ASoC Driver for AudioInjector Pi add on soundcard
-+ *
-+ *  Created on: 13-May-2016
-+ *      Author: flatmax@flatmax.org
-+ *              based on code by  Cliff Cai <Cliff.Cai@analog.com> for the ssm2602 machine blackfin.
-+ *              with help from Lars-Peter Clausen for simplifying the original code to use the dai_fmt field.
-+ *            i2s_node code taken from the other sound/soc/bcm machine drivers.
-+ *
-+ * Copyright (C) 2016 Flatmax Pty. Ltd.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+
-+#include <sound/core.h>
-+#include <sound/soc.h>
-+#include <sound/pcm_params.h>
-+#include <sound/control.h>
-+
-+#include "../codecs/wm8731.h"
-+
-+static int audioinjector_pi_soundcard_dai_init(struct snd_soc_pcm_runtime *rtd)
-+{
-+      struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
-+
-+      // not connected
-+      snd_soc_dapm_nc_pin(dapm, "Mic Bias");
-+      snd_soc_dapm_nc_pin(dapm, "MICIN");
-+      snd_soc_dapm_nc_pin(dapm, "RHPOUT");
-+      snd_soc_dapm_nc_pin(dapm, "LHPOUT");
-+
-+      return snd_soc_dai_set_sysclk(rtd->codec_dai, WM8731_SYSCLK_XTAL, 12000000, SND_SOC_CLOCK_IN);
-+}
-+
-+static struct snd_soc_dai_link audioinjector_pi_soundcard_dai[] = {
-+      {
-+              .name = "AudioInjector audio",
-+              .stream_name = "AudioInjector audio",
-+              .cpu_dai_name   = "bcm2708-i2s.0",
-+              .codec_dai_name = "wm8731-hifi",
-+              .platform_name  = "bcm2835-i2s.0",
-+              .codec_name = "wm8731.1-001a",
-+              .init = audioinjector_pi_soundcard_dai_init,
-+              .dai_fmt = SND_SOC_DAIFMT_CBM_CFM|SND_SOC_DAIFMT_I2S|SND_SOC_DAIFMT_NB_NF,
-+      },
-+};
-+
-+static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
-+      SND_SOC_DAPM_SPK("Ext Spk", NULL),
-+      SND_SOC_DAPM_LINE("Line In Jacks", NULL),
-+};
-+
-+/* Corgi machine connections to the codec pins */
-+static const struct snd_soc_dapm_route audioinjector_audio_map[] = {
-+      /* speaker connected to LOUT, ROUT */
-+      {"Ext Spk", NULL, "ROUT"},
-+      {"Ext Spk", NULL, "LOUT"},
-+
-+      /* line inputs */
-+      {"Line In Jacks", NULL, "Line Input"},
-+};
-+
-+static struct snd_soc_card snd_soc_audioinjector = {
-+      .name = "audioinjector-pi-soundcard",
-+      .dai_link = audioinjector_pi_soundcard_dai,
-+      .num_links = 1,
-+
-+      .dapm_widgets = wm8731_dapm_widgets,
-+      .num_dapm_widgets = ARRAY_SIZE(wm8731_dapm_widgets),
-+      .dapm_routes = audioinjector_audio_map,
-+      .num_dapm_routes = ARRAY_SIZE(audioinjector_audio_map),
-+};
-+
-+static int audioinjector_pi_soundcard_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_card *card = &snd_soc_audioinjector;
-+      int ret;
-+      
-+      card->dev = &pdev->dev;
-+
-+      if (pdev->dev.of_node) {
-+              struct snd_soc_dai_link *dai = &audioinjector_pi_soundcard_dai[0];
-+              struct device_node *i2s_node = of_parse_phandle(pdev->dev.of_node,
-+                                                              "i2s-controller", 0);
-+
-+              if (i2s_node) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_node;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_node;
-+              } else
-+                      if (!dai->cpu_of_node) {
-+                              dev_err(&pdev->dev, "Property 'i2s-controller' missing or invalid\n");
-+                              return -EINVAL;
-+                      }
-+      }
-+
-+      if ((ret = snd_soc_register_card(card))) {
-+              dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret);
-+      }
-+      return ret;
-+}
-+
-+static int audioinjector_pi_soundcard_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_card *card = platform_get_drvdata(pdev);
-+      return snd_soc_unregister_card(card);
-+
-+}
-+
-+static const struct of_device_id audioinjector_pi_soundcard_of_match[] = {
-+      { .compatible = "ai,audioinjector-pi-soundcard", },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, audioinjector_pi_soundcard_of_match);
-+
-+static struct platform_driver audioinjector_pi_soundcard_driver = {
-+       .driver         = {
-+              .name   = "audioinjector-audio",
-+              .owner  = THIS_MODULE,
-+              .of_match_table = audioinjector_pi_soundcard_of_match,
-+       },
-+       .probe          = audioinjector_pi_soundcard_probe,
-+       .remove         = audioinjector_pi_soundcard_remove,
-+};
-+
-+module_platform_driver(audioinjector_pi_soundcard_driver);
-+MODULE_AUTHOR("Matt Flax <flatmax@flatmax.org>");
-+MODULE_DESCRIPTION("AudioInjector.net Pi Soundcard");
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS("platform:audioinjector-pi-soundcard");
-+
diff --git a/target/linux/brcm2708/patches-4.4/0350-mmc-Apply-QUIRK_BROKEN_ERASE-to-other-capacities.patch b/target/linux/brcm2708/patches-4.4/0350-mmc-Apply-QUIRK_BROKEN_ERASE-to-other-capacities.patch
new file mode 100644 (file)
index 0000000..c75fca6
--- /dev/null
@@ -0,0 +1,23 @@
+From 2aa9602cca746c3bd2fe664574234adb147e4ba7 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 19 May 2016 14:40:28 +0100
+Subject: [PATCH] mmc: Apply QUIRK_BROKEN_ERASE to other capacities
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/card/block.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -2558,6 +2558,10 @@ static const struct mmc_fixup blk_fixups
+        */
+       MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
+                 MMC_QUIRK_ERASE_BROKEN),
++      MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk_mmc,
++                MMC_QUIRK_ERASE_BROKEN),
++      MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk_mmc,
++                MMC_QUIRK_ERASE_BROKEN),
+       END_FIXUP
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0351-mmc-Apply-QUIRK_BROKEN_ERASE-to-other-capacities.patch b/target/linux/brcm2708/patches-4.4/0351-mmc-Apply-QUIRK_BROKEN_ERASE-to-other-capacities.patch
deleted file mode 100644 (file)
index 299fdf5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From 4742aa31f93ae7d222d2564b2258a16fd297659e Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Thu, 19 May 2016 14:40:28 +0100
-Subject: [PATCH 351/423] mmc: Apply QUIRK_BROKEN_ERASE to other capacities
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/mmc/card/block.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
---- a/drivers/mmc/card/block.c
-+++ b/drivers/mmc/card/block.c
-@@ -2558,6 +2558,10 @@ static const struct mmc_fixup blk_fixups
-        */
-       MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
-                 MMC_QUIRK_ERASE_BROKEN),
-+      MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk_mmc,
-+                MMC_QUIRK_ERASE_BROKEN),
-+      MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk_mmc,
-+                MMC_QUIRK_ERASE_BROKEN),
-       END_FIXUP
- };
diff --git a/target/linux/brcm2708/patches-4.4/0352-mmc-Add-card_quirks-module-parameter-log-quirks.patch b/target/linux/brcm2708/patches-4.4/0352-mmc-Add-card_quirks-module-parameter-log-quirks.patch
new file mode 100644 (file)
index 0000000..97fe268
--- /dev/null
@@ -0,0 +1,76 @@
+From 2b859a1735c3113756c172ab8113f3f764c49c38 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 20 May 2016 10:11:43 +0100
+Subject: [PATCH] mmc: Add card_quirks module parameter, log quirks
+
+Use mmc_block.card_quirks to override the quirks for all SD or MMC
+cards. The value is a bitfield using the bit positions defined in
+include/linux/mmc/card.h. If the module parameter is placed in the
+kernel command line (or bootargs) stored on the card then, assuming the
+device only has one SD card interface, the override effectively becomes
+card-specific.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/card/block.c | 28 +++++++++++++++++++++++++---
+ 1 file changed, 25 insertions(+), 3 deletions(-)
+
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -137,6 +137,13 @@ enum {
+ module_param(perdev_minors, int, 0444);
+ MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
++/*
++ * Allow quirks to be overridden for the current card
++ */
++static char *card_quirks;
++module_param(card_quirks, charp, 0644);
++MODULE_PARM_DESC(card_quirks, "Force the use of the indicated quirks (a bitfield)");
++
+ static inline int mmc_blk_part_switch(struct mmc_card *card,
+                                     struct mmc_blk_data *md);
+ static int get_card_status(struct mmc_card *card, u32 *status, int retries);
+@@ -2570,6 +2577,7 @@ static int mmc_blk_probe(struct mmc_card
+ {
+       struct mmc_blk_data *md, *part_md;
+       char cap_str[10];
++      char quirk_str[24];
+       /*
+        * Check that the card supports the command class(es) we need.
+@@ -2577,7 +2585,16 @@ static int mmc_blk_probe(struct mmc_card
+       if (!(card->csd.cmdclass & CCC_BLOCK_READ))
+               return -ENODEV;
+-      mmc_fixup_device(card, blk_fixups);
++      if (card_quirks) {
++              unsigned long quirks;
++              if (kstrtoul(card_quirks, 0, &quirks) == 0)
++                      card->quirks = (unsigned int)quirks;
++              else
++                      pr_err("mmc_block: Invalid card_quirks parameter '%s'\n",
++                             card_quirks);
++      }
++      else
++              mmc_fixup_device(card, blk_fixups);
+       md = mmc_blk_alloc(card);
+       if (IS_ERR(md))
+@@ -2585,9 +2602,14 @@ static int mmc_blk_probe(struct mmc_card
+       string_get_size((u64)get_capacity(md->disk), 512, STRING_UNITS_2,
+                       cap_str, sizeof(cap_str));
+-      pr_info("%s: %s %s %s %s\n",
++      if (card->quirks)
++              snprintf(quirk_str, sizeof(quirk_str),
++                       " (quirks 0x%08x)", card->quirks);
++      else
++              quirk_str[0] = '\0';
++      pr_info("%s: %s %s %s%s%s\n",
+               md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
+-              cap_str, md->read_only ? "(ro)" : "");
++              cap_str, md->read_only ? " (ro)" : "", quirk_str);
+       if (mmc_blk_alloc_parts(card, md))
+               goto out;
diff --git a/target/linux/brcm2708/patches-4.4/0353-mmc-Add-card_quirks-module-parameter-log-quirks.patch b/target/linux/brcm2708/patches-4.4/0353-mmc-Add-card_quirks-module-parameter-log-quirks.patch
deleted file mode 100644 (file)
index 4a9a51a..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-From 2c0da5702844c4ec246243634778bd3448100570 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 20 May 2016 10:11:43 +0100
-Subject: [PATCH 353/423] mmc: Add card_quirks module parameter, log quirks
-
-Use mmc_block.card_quirks to override the quirks for all SD or MMC
-cards. The value is a bitfield using the bit positions defined in
-include/linux/mmc/card.h. If the module parameter is placed in the
-kernel command line (or bootargs) stored on the card then, assuming the
-device only has one SD card interface, the override effectively becomes
-card-specific.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/mmc/card/block.c | 28 +++++++++++++++++++++++++---
- 1 file changed, 25 insertions(+), 3 deletions(-)
-
---- a/drivers/mmc/card/block.c
-+++ b/drivers/mmc/card/block.c
-@@ -137,6 +137,13 @@ enum {
- module_param(perdev_minors, int, 0444);
- MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
-+/*
-+ * Allow quirks to be overridden for the current card
-+ */
-+static char *card_quirks;
-+module_param(card_quirks, charp, 0644);
-+MODULE_PARM_DESC(card_quirks, "Force the use of the indicated quirks (a bitfield)");
-+
- static inline int mmc_blk_part_switch(struct mmc_card *card,
-                                     struct mmc_blk_data *md);
- static int get_card_status(struct mmc_card *card, u32 *status, int retries);
-@@ -2570,6 +2577,7 @@ static int mmc_blk_probe(struct mmc_card
- {
-       struct mmc_blk_data *md, *part_md;
-       char cap_str[10];
-+      char quirk_str[24];
-       /*
-        * Check that the card supports the command class(es) we need.
-@@ -2577,7 +2585,16 @@ static int mmc_blk_probe(struct mmc_card
-       if (!(card->csd.cmdclass & CCC_BLOCK_READ))
-               return -ENODEV;
--      mmc_fixup_device(card, blk_fixups);
-+      if (card_quirks) {
-+              unsigned long quirks;
-+              if (kstrtoul(card_quirks, 0, &quirks) == 0)
-+                      card->quirks = (unsigned int)quirks;
-+              else
-+                      pr_err("mmc_block: Invalid card_quirks parameter '%s'\n",
-+                             card_quirks);
-+      }
-+      else
-+              mmc_fixup_device(card, blk_fixups);
-       md = mmc_blk_alloc(card);
-       if (IS_ERR(md))
-@@ -2585,9 +2602,14 @@ static int mmc_blk_probe(struct mmc_card
-       string_get_size((u64)get_capacity(md->disk), 512, STRING_UNITS_2,
-                       cap_str, sizeof(cap_str));
--      pr_info("%s: %s %s %s %s\n",
-+      if (card->quirks)
-+              snprintf(quirk_str, sizeof(quirk_str),
-+                       " (quirks 0x%08x)", card->quirks);
-+      else
-+              quirk_str[0] = '\0';
-+      pr_info("%s: %s %s %s%s%s\n",
-               md->disk->disk_name, mmc_card_id(card), mmc_card_name(card),
--              cap_str, md->read_only ? "(ro)" : "");
-+              cap_str, md->read_only ? " (ro)" : "", quirk_str);
-       if (mmc_blk_alloc_parts(card, md))
-               goto out;
diff --git a/target/linux/brcm2708/patches-4.4/0353-rtc-ds1307-ensure-that-any-pending-alarm-is-cleared-.patch b/target/linux/brcm2708/patches-4.4/0353-rtc-ds1307-ensure-that-any-pending-alarm-is-cleared-.patch
new file mode 100644 (file)
index 0000000..1c6c5c9
--- /dev/null
@@ -0,0 +1,58 @@
+From dab463aa0dbd5ac45403dade2723046eba214359 Mon Sep 17 00:00:00 2001
+From: Nicolas Boullis <nboullis@debian.org>
+Date: Sun, 10 Apr 2016 13:23:05 +0200
+Subject: [PATCH] rtc: ds1307: ensure that any pending alarm is cleared before
+ a new alarm is enabled
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+If a previously-set alarm was disabled and then triggered, it may still
+be pending when a new alarm is configured.
+
+Then, if the alarm is enabled before the pending alarm is cleared, then
+an interrupt is immediately raised.
+
+Unfortunately, when the alarm is cleared and enabled during the same I²C
+block write, the chip (at least the DS1339 I have) considers that the
+alarm is enabled before it is cleared, and raises an interrupt.
+
+This patch ensures that the pending alarm is cleared before the alarm is
+enabled.
+
+Signed-off-by: Nicolas Boullis <nboullis@debian.org>
+Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
+---
+ drivers/rtc/rtc-ds1307.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+--- a/drivers/rtc/rtc-ds1307.c
++++ b/drivers/rtc/rtc-ds1307.c
+@@ -540,12 +540,8 @@ static int ds1337_set_alarm(struct devic
+       buf[5] = 0;
+       buf[6] = 0;
+-      /* optionally enable ALARM1 */
++      /* disable alarms */
+       buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
+-      if (t->enabled) {
+-              dev_dbg(dev, "alarm IRQ armed\n");
+-              buf[7] |= DS1337_BIT_A1IE;      /* only ALARM1 is used */
+-      }
+       buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
+       ret = ds1307->write_block_data(client,
+@@ -555,6 +551,13 @@ static int ds1337_set_alarm(struct devic
+               return ret;
+       }
++      /* optionally enable ALARM1 */
++      if (t->enabled) {
++              dev_dbg(dev, "alarm IRQ armed\n");
++              buf[7] |= DS1337_BIT_A1IE;      /* only ALARM1 is used */
++              i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, buf[7]);
++      }
++
+       return 0;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0354-Revert-Revert-drm-vc4-Force-HDMI-to-connected.patch b/target/linux/brcm2708/patches-4.4/0354-Revert-Revert-drm-vc4-Force-HDMI-to-connected.patch
new file mode 100644 (file)
index 0000000..6770f91
--- /dev/null
@@ -0,0 +1,27 @@
+From 01f818eabe959b1d58ad3ef41310e1210b04a9b0 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Mon, 23 May 2016 17:06:08 +0100
+Subject: [PATCH] Revert "Revert "drm/vc4: Force HDMI to connected.""
+
+This reverts commit 7da44d06540b4a191ecc74e943f3203577fce0df.
+
+This breaks the driver on Pi3 as hotplug is implemented through a
+gpio expander owned by the GPU.
+
+We need to extend the virtual gpio driver to support this, but for
+now assume hotplug is always enabled.
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -166,6 +166,8 @@ vc4_hdmi_connector_detect(struct drm_con
+       struct drm_device *dev = connector->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
++      return connector_status_connected;
++
+       if (vc4->hdmi->hpd_gpio) {
+               if (gpio_get_value_cansleep(vc4->hdmi->hpd_gpio) ^
+                   vc4->hdmi->hpd_active_low)
diff --git a/target/linux/brcm2708/patches-4.4/0354-rtc-ds1307-ensure-that-any-pending-alarm-is-cleared-.patch b/target/linux/brcm2708/patches-4.4/0354-rtc-ds1307-ensure-that-any-pending-alarm-is-cleared-.patch
deleted file mode 100644 (file)
index 49d7b33..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-From 82be650e97522260a9694ae56dc3475f40c4240e Mon Sep 17 00:00:00 2001
-From: Nicolas Boullis <nboullis@debian.org>
-Date: Sun, 10 Apr 2016 13:23:05 +0200
-Subject: [PATCH 354/423] rtc: ds1307: ensure that any pending alarm is cleared
- before a new alarm is enabled
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-If a previously-set alarm was disabled and then triggered, it may still
-be pending when a new alarm is configured.
-
-Then, if the alarm is enabled before the pending alarm is cleared, then
-an interrupt is immediately raised.
-
-Unfortunately, when the alarm is cleared and enabled during the same I²C
-block write, the chip (at least the DS1339 I have) considers that the
-alarm is enabled before it is cleared, and raises an interrupt.
-
-This patch ensures that the pending alarm is cleared before the alarm is
-enabled.
-
-Signed-off-by: Nicolas Boullis <nboullis@debian.org>
-Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
----
- drivers/rtc/rtc-ds1307.c | 13 ++++++++-----
- 1 file changed, 8 insertions(+), 5 deletions(-)
-
---- a/drivers/rtc/rtc-ds1307.c
-+++ b/drivers/rtc/rtc-ds1307.c
-@@ -540,12 +540,8 @@ static int ds1337_set_alarm(struct devic
-       buf[5] = 0;
-       buf[6] = 0;
--      /* optionally enable ALARM1 */
-+      /* disable alarms */
-       buf[7] = control & ~(DS1337_BIT_A1IE | DS1337_BIT_A2IE);
--      if (t->enabled) {
--              dev_dbg(dev, "alarm IRQ armed\n");
--              buf[7] |= DS1337_BIT_A1IE;      /* only ALARM1 is used */
--      }
-       buf[8] = status & ~(DS1337_BIT_A1I | DS1337_BIT_A2I);
-       ret = ds1307->write_block_data(client,
-@@ -555,6 +551,13 @@ static int ds1337_set_alarm(struct devic
-               return ret;
-       }
-+      /* optionally enable ALARM1 */
-+      if (t->enabled) {
-+              dev_dbg(dev, "alarm IRQ armed\n");
-+              buf[7] |= DS1337_BIT_A1IE;      /* only ALARM1 is used */
-+              i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, buf[7]);
-+      }
-+
-       return 0;
- }
diff --git a/target/linux/brcm2708/patches-4.4/0355-Revert-Revert-drm-vc4-Force-HDMI-to-connected.patch b/target/linux/brcm2708/patches-4.4/0355-Revert-Revert-drm-vc4-Force-HDMI-to-connected.patch
deleted file mode 100644 (file)
index 3d2f489..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-From e1240073ba4bb5f845edc69437d2b638678332f9 Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Mon, 23 May 2016 17:06:08 +0100
-Subject: [PATCH 355/423] Revert "Revert "drm/vc4: Force HDMI to connected.""
-
-This reverts commit 7da44d06540b4a191ecc74e943f3203577fce0df.
-
-This breaks the driver on Pi3 as hotplug is implemented through a
-gpio expander owned by the GPU.
-
-We need to extend the virtual gpio driver to support this, but for
-now assume hotplug is always enabled.
----
- drivers/gpu/drm/vc4/vc4_hdmi.c | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/gpu/drm/vc4/vc4_hdmi.c
-+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
-@@ -166,6 +166,8 @@ vc4_hdmi_connector_detect(struct drm_con
-       struct drm_device *dev = connector->dev;
-       struct vc4_dev *vc4 = to_vc4_dev(dev);
-+      return connector_status_connected;
-+
-       if (vc4->hdmi->hpd_gpio) {
-               if (gpio_get_value_cansleep(vc4->hdmi->hpd_gpio) ^
-                   vc4->hdmi->hpd_active_low)
diff --git a/target/linux/brcm2708/patches-4.4/0355-config-Add-NF_MATCH_RPFILTER.patch b/target/linux/brcm2708/patches-4.4/0355-config-Add-NF_MATCH_RPFILTER.patch
new file mode 100644 (file)
index 0000000..530ad49
--- /dev/null
@@ -0,0 +1,46 @@
+From 42af2a4e065f71af6505ba6159073a2da28bcc2f Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Mon, 23 May 2016 18:22:52 +0100
+Subject: [PATCH] config: Add NF_MATCH_RPFILTER
+
+---
+ arch/arm/configs/bcm2709_defconfig | 2 ++
+ arch/arm/configs/bcmrpi_defconfig  | 2 ++
+ 2 files changed, 4 insertions(+)
+
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -223,6 +223,7 @@ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_IP_NF_IPTABLES=m
+ CONFIG_IP_NF_MATCH_AH=m
+ CONFIG_IP_NF_MATCH_ECN=m
++CONFIG_IP_NF_MATCH_RPFILTER=m
+ CONFIG_IP_NF_MATCH_TTL=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+@@ -247,6 +248,7 @@ CONFIG_IP6_NF_MATCH_OPTS=m
+ CONFIG_IP6_NF_MATCH_HL=m
+ CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+ CONFIG_IP6_NF_MATCH_MH=m
++CONFIG_IP6_NF_MATCH_RPFILTER=m
+ CONFIG_IP6_NF_MATCH_RT=m
+ CONFIG_IP6_NF_TARGET_HL=m
+ CONFIG_IP6_NF_FILTER=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -216,6 +216,7 @@ CONFIG_NF_CONNTRACK_IPV4=m
+ CONFIG_IP_NF_IPTABLES=m
+ CONFIG_IP_NF_MATCH_AH=m
+ CONFIG_IP_NF_MATCH_ECN=m
++CONFIG_IP_NF_MATCH_RPFILTER=m
+ CONFIG_IP_NF_MATCH_TTL=m
+ CONFIG_IP_NF_FILTER=m
+ CONFIG_IP_NF_TARGET_REJECT=m
+@@ -240,6 +241,7 @@ CONFIG_IP6_NF_MATCH_OPTS=m
+ CONFIG_IP6_NF_MATCH_HL=m
+ CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+ CONFIG_IP6_NF_MATCH_MH=m
++CONFIG_IP6_NF_MATCH_RPFILTER=m
+ CONFIG_IP6_NF_MATCH_RT=m
+ CONFIG_IP6_NF_TARGET_HL=m
+ CONFIG_IP6_NF_FILTER=m
diff --git a/target/linux/brcm2708/patches-4.4/0356-Added-Overlay-for-Microchip-MCP23017-I2C-gpio-expand.patch b/target/linux/brcm2708/patches-4.4/0356-Added-Overlay-for-Microchip-MCP23017-I2C-gpio-expand.patch
new file mode 100644 (file)
index 0000000..1221839
--- /dev/null
@@ -0,0 +1,86 @@
+From 40609ec9a60194b9f04cf5ee4fbc4ee5a011a7ea Mon Sep 17 00:00:00 2001
+From: Michael Kaplan <m.kaplan@evva.com>
+Date: Tue, 24 May 2016 10:19:08 +0200
+Subject: [PATCH] Added Overlay for Microchip MCP23017 I2C gpio expander
+
+---
+ arch/arm/boot/dts/overlays/README               |  9 +++++
+ arch/arm/boot/dts/overlays/mcp23017-overlay.dts | 54 +++++++++++++++++++++++++
+ 2 files changed, 63 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/mcp23017-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -567,6 +567,15 @@ Params: gpio_out_pin            GPIO for
+                                 (default "off")
++Name:   mcp23017
++Info:   Configures the MCP23017 I2C port expander
++Load:   dtoverlay=mcp23017,<param>=<val>
++Params: gpiopin                 Gpio pin connected to the INTA output of the
++                                MCP23017 (default: 4)
++
++        addr                    I2C address of the MCP23017 (default: 0x20)
++
++
+ Name:   mcp2515-can0
+ Info:   Configures the MCP2515 CAN controller on spi0.0
+ Load:   dtoverlay=mcp2515-can0,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/mcp23017-overlay.dts
+@@ -0,0 +1,54 @@
++// Definitions for MCP23017 Gpio Extender from Microchip Semiconductor
++
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++      fragment@0 {
++              target = <&i2c1>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&gpio>;
++              __overlay__ {
++                      mcp23017_pins: mcp23017_pins {
++                              brcm,pins = <4>;
++                              brcm,function = <0>;
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++
++                      mcp23017: mcp@20 {
++                              compatible = "microchip,mcp23017";
++                              reg = <0x20>;
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              #interrupt-cells=<2>;
++                              interrupt-parent = <&gpio>;
++                              interrupts = <4 2>;
++                              interrupt-controller;
++                              microchip,irq-mirror;
++
++                              status = "okay";
++                      };
++              };
++      };
++      
++      __overrides__ {
++              gpiopin = <&mcp23017_pins>,"brcm,pins:0",
++                              <&mcp23017>,"interrupts:0";
++              addr = <&mcp23017>,"reg:0";
++      };
++};
++
diff --git a/target/linux/brcm2708/patches-4.4/0356-config-Add-NF_MATCH_RPFILTER.patch b/target/linux/brcm2708/patches-4.4/0356-config-Add-NF_MATCH_RPFILTER.patch
deleted file mode 100644 (file)
index 1bc3d85..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From 7c64de28d0552c8240cf79b934b069dd9af24b14 Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Mon, 23 May 2016 18:22:52 +0100
-Subject: [PATCH 356/423] config: Add NF_MATCH_RPFILTER
-
----
- arch/arm/configs/bcm2709_defconfig | 2 ++
- arch/arm/configs/bcmrpi_defconfig  | 2 ++
- 2 files changed, 4 insertions(+)
-
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -223,6 +223,7 @@ CONFIG_NF_CONNTRACK_IPV4=m
- CONFIG_IP_NF_IPTABLES=m
- CONFIG_IP_NF_MATCH_AH=m
- CONFIG_IP_NF_MATCH_ECN=m
-+CONFIG_IP_NF_MATCH_RPFILTER=m
- CONFIG_IP_NF_MATCH_TTL=m
- CONFIG_IP_NF_FILTER=m
- CONFIG_IP_NF_TARGET_REJECT=m
-@@ -247,6 +248,7 @@ CONFIG_IP6_NF_MATCH_OPTS=m
- CONFIG_IP6_NF_MATCH_HL=m
- CONFIG_IP6_NF_MATCH_IPV6HEADER=m
- CONFIG_IP6_NF_MATCH_MH=m
-+CONFIG_IP6_NF_MATCH_RPFILTER=m
- CONFIG_IP6_NF_MATCH_RT=m
- CONFIG_IP6_NF_TARGET_HL=m
- CONFIG_IP6_NF_FILTER=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -216,6 +216,7 @@ CONFIG_NF_CONNTRACK_IPV4=m
- CONFIG_IP_NF_IPTABLES=m
- CONFIG_IP_NF_MATCH_AH=m
- CONFIG_IP_NF_MATCH_ECN=m
-+CONFIG_IP_NF_MATCH_RPFILTER=m
- CONFIG_IP_NF_MATCH_TTL=m
- CONFIG_IP_NF_FILTER=m
- CONFIG_IP_NF_TARGET_REJECT=m
-@@ -240,6 +241,7 @@ CONFIG_IP6_NF_MATCH_OPTS=m
- CONFIG_IP6_NF_MATCH_HL=m
- CONFIG_IP6_NF_MATCH_IPV6HEADER=m
- CONFIG_IP6_NF_MATCH_MH=m
-+CONFIG_IP6_NF_MATCH_RPFILTER=m
- CONFIG_IP6_NF_MATCH_RT=m
- CONFIG_IP6_NF_TARGET_HL=m
- CONFIG_IP6_NF_FILTER=m
diff --git a/target/linux/brcm2708/patches-4.4/0357-Added-Overlay-for-Microchip-MCP23017-I2C-gpio-expand.patch b/target/linux/brcm2708/patches-4.4/0357-Added-Overlay-for-Microchip-MCP23017-I2C-gpio-expand.patch
deleted file mode 100644 (file)
index 35eb321..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-From d4011a19f3e6a9c6696f0d5498df9c17a1ba2fb3 Mon Sep 17 00:00:00 2001
-From: Michael Kaplan <m.kaplan@evva.com>
-Date: Tue, 24 May 2016 10:19:08 +0200
-Subject: [PATCH 357/423] Added Overlay for Microchip MCP23017 I2C gpio
- expander
-
----
- arch/arm/boot/dts/overlays/README               |  9 +++++
- arch/arm/boot/dts/overlays/mcp23017-overlay.dts | 54 +++++++++++++++++++++++++
- 2 files changed, 63 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/mcp23017-overlay.dts
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -567,6 +567,15 @@ Params: gpio_out_pin            GPIO for
-                                 (default "off")
-+Name:   mcp23017
-+Info:   Configures the MCP23017 I2C port expander
-+Load:   dtoverlay=mcp23017,<param>=<val>
-+Params: gpiopin                 Gpio pin connected to the INTA output of the
-+                                MCP23017 (default: 4)
-+
-+        addr                    I2C address of the MCP23017 (default: 0x20)
-+
-+
- Name:   mcp2515-can0
- Info:   Configures the MCP2515 CAN controller on spi0.0
- Load:   dtoverlay=mcp2515-can0,<param>=<val>
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/mcp23017-overlay.dts
-@@ -0,0 +1,54 @@
-+// Definitions for MCP23017 Gpio Extender from Microchip Semiconductor
-+
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
-+
-+      fragment@0 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&gpio>;
-+              __overlay__ {
-+                      mcp23017_pins: mcp23017_pins {
-+                              brcm,pins = <4>;
-+                              brcm,function = <0>;
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+
-+                      mcp23017: mcp@20 {
-+                              compatible = "microchip,mcp23017";
-+                              reg = <0x20>;
-+                              gpio-controller;
-+                              #gpio-cells = <2>;
-+                              #interrupt-cells=<2>;
-+                              interrupt-parent = <&gpio>;
-+                              interrupts = <4 2>;
-+                              interrupt-controller;
-+                              microchip,irq-mirror;
-+
-+                              status = "okay";
-+                      };
-+              };
-+      };
-+      
-+      __overrides__ {
-+              gpiopin = <&mcp23017_pins>,"brcm,pins:0",
-+                              <&mcp23017>,"interrupts:0";
-+              addr = <&mcp23017>,"reg:0";
-+      };
-+};
-+
diff --git a/target/linux/brcm2708/patches-4.4/0363-bcm2835-camera-Fix-max-min-error-when-looping-over-c.patch b/target/linux/brcm2708/patches-4.4/0363-bcm2835-camera-Fix-max-min-error-when-looping-over-c.patch
new file mode 100644 (file)
index 0000000..df6fd7e
--- /dev/null
@@ -0,0 +1,24 @@
+From bc431816b3277e61807a3c279ae8fe11b1599f67 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Tue, 24 May 2016 16:20:09 +0100
+Subject: [PATCH] bcm2835-camera: Fix max/min error when looping over
+ cameras/resolutions
+
+See: https://github.com/raspberrypi/linux/issues/1447#issuecomment-221303506
+---
+ drivers/media/platform/bcm2835/bcm2835-camera.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/media/platform/bcm2835/bcm2835-camera.c
++++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
+@@ -1530,8 +1530,8 @@ static int get_num_cameras(struct vchiq_
+       }
+       for (i = 0;
+            i < (cam_info.num_cameras > num_resolutions ?
+-                      cam_info.num_cameras :
+-                      num_resolutions);
++                      num_resolutions :
++                      cam_info.num_cameras);
+            i++) {
+               resolutions[i][0] = cam_info.cameras[i].max_width;
+               resolutions[i][1] = cam_info.cameras[i].max_height;
diff --git a/target/linux/brcm2708/patches-4.4/0364-Change-BoomBerry-name-to-JustBoom-in-all-locations-d.patch b/target/linux/brcm2708/patches-4.4/0364-Change-BoomBerry-name-to-JustBoom-in-all-locations-d.patch
new file mode 100644 (file)
index 0000000..7593544
--- /dev/null
@@ -0,0 +1,1139 @@
+From 027817e4c01f900824dde9932e1e3fb32575bc9f Mon Sep 17 00:00:00 2001
+From: Aaron Shaw <shawaj@gmail.com>
+Date: Thu, 26 May 2016 23:37:11 +0100
+Subject: [PATCH] Change BoomBerry name to JustBoom in all locations due to
+ legal challenge
+
+---
+ arch/arm/boot/dts/overlays/Makefile                |   4 +-
+ arch/arm/boot/dts/overlays/README                  |  52 ++---
+ .../boot/dts/overlays/boomberry-dac-overlay.dts    |  43 -----
+ .../boot/dts/overlays/boomberry-digi-overlay.dts   |  39 ----
+ .../arm/boot/dts/overlays/justboom-dac-overlay.dts |  43 +++++
+ .../boot/dts/overlays/justboom-digi-overlay.dts    |  39 ++++
+ arch/arm/configs/bcm2709_defconfig                 |   4 +-
+ arch/arm/configs/bcmrpi_defconfig                  |   4 +-
+ sound/soc/bcm/Kconfig                              |  12 +-
+ sound/soc/bcm/Makefile                             |   8 +-
+ sound/soc/bcm/boomberry-dac.c                      | 162 ----------------
+ sound/soc/bcm/boomberry-digi.c                     | 215 ---------------------
+ sound/soc/bcm/justboom-dac.c                       | 162 ++++++++++++++++
+ sound/soc/bcm/justboom-digi.c                      | 215 +++++++++++++++++++++
+ 14 files changed, 501 insertions(+), 501 deletions(-)
+ delete mode 100644 arch/arm/boot/dts/overlays/boomberry-dac-overlay.dts
+ delete mode 100644 arch/arm/boot/dts/overlays/boomberry-digi-overlay.dts
+ create mode 100644 arch/arm/boot/dts/overlays/justboom-dac-overlay.dts
+ create mode 100644 arch/arm/boot/dts/overlays/justboom-digi-overlay.dts
+ delete mode 100644 sound/soc/bcm/boomberry-dac.c
+ delete mode 100644 sound/soc/bcm/boomberry-digi.c
+ create mode 100644 sound/soc/bcm/justboom-dac.c
+ create mode 100644 sound/soc/bcm/justboom-digi.c
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -18,8 +18,6 @@ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqd
+ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
+-dtbo-$(RPI_DT_OVERLAYS) += boomberry-dac.dtbo
+-dtbo-$(RPI_DT_OVERLAYS) += boomberry-digi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dpi24.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
+@@ -43,6 +41,8 @@ dtbo-$(RPI_DT_OVERLAYS) += i2s-gpio28-31
+ 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) += justboom-dac.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -238,32 +238,6 @@ Load:   dtoverlay=bmp085_i2c-sensor
+ Params: <None>
+-Name:   boomberry-dac
+-Info:   Configures the BoomBerry DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
+-        cards
+-Load:   dtoverlay=boomberry-dac,<param>=<val>
+-Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
+-                                Digital volume control. Enable with
+-                                "dtoverlay=boomberry-dac,24db_digital_gain"
+-                                (The default behaviour is that the Digital
+-                                volume control is limited to a maximum of
+-                                0dB. ie. it can attenuate but not provide
+-                                gain. For most users, this will be desired
+-                                as it will prevent clipping. By appending
+-                                the 24dB_digital_gain parameter, the Digital
+-                                volume control will allow up to 24dB of
+-                                gain. If this parameter is enabled, it is the
+-                                responsibility of the user to ensure that
+-                                the Digital volume control is set to a value
+-                                that does not result in clipping/distortion!)
+-
+-
+-Name:   boomberry-digi
+-Info:   Configures the BoomBerry Digi HAT and Digi Zero audio cards
+-Load:   dtoverlay=boomberry-digi
+-Params: <None>
+-
+-
+ Name:   dht11
+ Info:   Overlay for the DHT11/DHT21/DHT22 humidity/temperature sensors
+         Also sometimes found with the part number(s) AM230x.
+@@ -541,6 +515,32 @@ Params: 24db_digital_gain       Allow ga
+                                 that does not result in clipping/distortion!)
++Name:   justboom-dac
++Info:   Configures the JustBoom DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
++        cards
++Load:   dtoverlay=justboom-dac,<param>=<val>
++Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
++                                Digital volume control. Enable with
++                                "dtoverlay=justboom-dac,24db_digital_gain"
++                                (The default behaviour is that the Digital
++                                volume control is limited to a maximum of
++                                0dB. ie. it can attenuate but not provide
++                                gain. For most users, this will be desired
++                                as it will prevent clipping. By appending
++                                the 24dB_digital_gain parameter, the Digital
++                                volume control will allow up to 24dB of
++                                gain. If this parameter is enabled, it is the
++                                responsibility of the user to ensure that
++                                the Digital volume control is set to a value
++                                that does not result in clipping/distortion!)
++
++
++Name:   justboom-digi
++Info:   Configures the JustBoom Digi HAT and Digi Zero audio cards
++Load:   dtoverlay=justboom-digi
++Params: <None>
++
++
+ Name:   lirc-rpi
+ Info:   Configures lirc-rpi (Linux Infrared Remote Control for Raspberry Pi)
+         Consult the module documentation for more details.
+--- a/arch/arm/boot/dts/overlays/boomberry-dac-overlay.dts
++++ /dev/null
+@@ -1,43 +0,0 @@
+-// Definitions for BoomBerry DAC
+-/dts-v1/;
+-/plugin/;
+-
+-/ {
+-      compatible = "brcm,bcm2708";
+-
+-      fragment@0 {
+-              target = <&i2s>;
+-              __overlay__ {
+-                      status = "okay";
+-              };
+-      };
+-
+-      fragment@1 {
+-              target = <&i2c1>;
+-              __overlay__ {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+-                      status = "okay";
+-
+-                      pcm5122@4d {
+-                              #sound-dai-cells = <0>;
+-                              compatible = "ti,pcm5122";
+-                              reg = <0x4d>;
+-                              status = "okay";
+-                      };
+-              };
+-      };
+-
+-      fragment@2 {
+-              target = <&sound>;
+-              frag2: __overlay__ {
+-                      compatible = "boomberry,boomberry-dac";
+-                      i2s-controller = <&i2s>;
+-                      status = "okay";
+-              };
+-      };
+-
+-      __overrides__ {
+-              24db_digital_gain = <&frag2>,"boomberry,24db_digital_gain?";
+-      };
+-};
+--- a/arch/arm/boot/dts/overlays/boomberry-digi-overlay.dts
++++ /dev/null
+@@ -1,39 +0,0 @@
+-// Definitions for BoomBerry Digi
+-/dts-v1/;
+-/plugin/;
+-
+-/ {
+-      compatible = "brcm,bcm2708";
+-
+-      fragment@0 {
+-              target = <&i2s>;
+-              __overlay__ {
+-                      status = "okay";
+-              };
+-      };
+-
+-      fragment@1 {
+-              target = <&i2c1>;
+-              __overlay__ {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+-                      status = "okay";
+-
+-                      wm8804@3b {
+-                              #sound-dai-cells = <0>;
+-                              compatible = "wlf,wm8804";
+-                              reg = <0x3b>;
+-                              status = "okay";
+-                      };
+-              };
+-      };
+-
+-      fragment@2 {
+-              target = <&sound>;
+-              __overlay__ {
+-                      compatible = "boomberry,boomberry-digi";
+-                      i2s-controller = <&i2s>;
+-                      status = "okay";
+-              };
+-      };
+-};
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/justboom-dac-overlay.dts
+@@ -0,0 +1,43 @@
++// Definitions for JustBoom DAC
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      pcm5122@4d {
++                              #sound-dai-cells = <0>;
++                              compatible = "ti,pcm5122";
++                              reg = <0x4d>;
++                              status = "okay";
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&sound>;
++              frag2: __overlay__ {
++                      compatible = "justboom,justboom-dac";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++
++      __overrides__ {
++              24db_digital_gain = <&frag2>,"justboom,24db_digital_gain?";
++      };
++};
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/justboom-digi-overlay.dts
+@@ -0,0 +1,39 @@
++// Definitions for JustBoom Digi
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      wm8804@3b {
++                              #sound-dai-cells = <0>;
++                              compatible = "wlf,wm8804";
++                              reg = <0x3b>;
++                              status = "okay";
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&sound>;
++              __overlay__ {
++                      compatible = "justboom,justboom-digi";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -861,8 +861,8 @@ CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m
+ CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m
+ CONFIG_SND_BCM2708_SOC_RPI_DAC=m
+ CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
+-CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
+-CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
++CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
++CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -853,8 +853,8 @@ CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m
+ CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m
+ CONFIG_SND_BCM2708_SOC_RPI_DAC=m
+ CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
+-CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
+-CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
++CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
++CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -50,19 +50,19 @@ config SND_BCM2708_SOC_RPI_PROTO
+       help
+         Say Y or M if you want to add support for Audio Codec Board PROTO (WM8731).
+-config SND_BCM2708_SOC_BOOMBERRY_DAC
+-      tristate "Support for BoomBerry DAC"
++config SND_BCM2708_SOC_JUSTBOOM_DAC
++      tristate "Support for JustBoom DAC"
+       depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
+       select SND_SOC_PCM512x
+       help
+-        Say Y or M if you want to add support for BoomBerry DAC.
++        Say Y or M if you want to add support for JustBoom DAC.
+-config SND_BCM2708_SOC_BOOMBERRY_DIGI
+-      tristate "Support for BoomBerry Digi"
++config SND_BCM2708_SOC_JUSTBOOM_DIGI
++      tristate "Support for JustBoom Digi"
+       depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
+       select SND_SOC_WM8804
+       help
+-        Say Y or M if you want to add support for BoomBerry Digi.
++        Say Y or M if you want to add support for JustBoom Digi.
+ config SND_BCM2708_SOC_IQAUDIO_DAC
+       tristate "Support for IQaudIO-DAC"
+--- a/sound/soc/bcm/Makefile
++++ b/sound/soc/bcm/Makefile
+@@ -9,8 +9,8 @@ snd-soc-hifiberry-dac-objs := hifiberry_
+ snd-soc-hifiberry-dacplus-objs := hifiberry_dacplus.o
+ snd-soc-hifiberry-digi-objs := hifiberry_digi.o
+ snd-soc-hifiberry-amp-objs := hifiberry_amp.o
+-snd-soc-boomberry-dac-objs := boomberry-dac.o
+-snd-soc-boomberry-digi-objs := boomberry-digi.o
++snd-soc-justboom-dac-objs := justboom-dac.o
++snd-soc-justboom-digi-objs := justboom-digi.o
+ snd-soc-rpi-dac-objs := rpi-dac.o
+ snd-soc-rpi-proto-objs := rpi-proto.o
+ snd-soc-iqaudio-dac-objs := iqaudio-dac.o
+@@ -22,8 +22,8 @@ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_D
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS) += snd-soc-hifiberry-dacplus.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI) += snd-soc-hifiberry-digi.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP) += snd-soc-hifiberry-amp.o
+-obj-$(CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC) += snd-soc-boomberry-dac.o
+-obj-$(CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI) += snd-soc-boomberry-digi.o
++obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC) += snd-soc-justboom-dac.o
++obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI) += snd-soc-justboom-digi.o
+ obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o
+ obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
+ obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
+--- a/sound/soc/bcm/boomberry-dac.c
++++ /dev/null
+@@ -1,162 +0,0 @@
+-/*
+- * ASoC Driver for BoomBerry DAC Raspberry Pi HAT Sound Card
+- *
+- * Author:    Milan Neskovic
+- *            Copyright 2016
+- *            based on code by Daniel Matuschek <info@crazy-audio.com>
+- *            based on code by Florian Meier <florian.meier@koalo.de>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License
+- * version 2 as published by the Free Software Foundation.
+- *
+- * This program is distributed in the hope that it will be useful, but
+- * WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+- * General Public License for more details.
+- */
+-
+-#include <linux/module.h>
+-#include <linux/platform_device.h>
+-
+-#include <sound/core.h>
+-#include <sound/pcm.h>
+-#include <sound/pcm_params.h>
+-#include <sound/soc.h>
+-#include <sound/jack.h>
+-
+-#include "../codecs/pcm512x.h"
+-
+-static bool digital_gain_0db_limit = true;
+-
+-static int snd_rpi_boomberry_dac_init(struct snd_soc_pcm_runtime *rtd)
+-{
+-      struct snd_soc_codec *codec = rtd->codec;
+-      snd_soc_update_bits(codec, PCM512x_GPIO_EN, 0x08, 0x08);
+-      snd_soc_update_bits(codec, PCM512x_GPIO_OUTPUT_4, 0xf, 0x02);
+-      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
+-
+-      if (digital_gain_0db_limit)
+-      {
+-              int ret;
+-              struct snd_soc_card *card = rtd->card;
+-
+-              ret = snd_soc_limit_volume(card, "Digital Playback Volume", 207);
+-              if (ret < 0)
+-                      dev_warn(card->dev, "Failed to set volume limit: %d\n", ret);
+-      }
+-
+-      return 0;
+-}
+-
+-static int snd_rpi_boomberry_dac_hw_params(struct snd_pcm_substream *substream,
+-                                     struct snd_pcm_hw_params *params)
+-{
+-      struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+-      /*return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);*/
+-      unsigned int sample_bits =
+-              snd_pcm_format_physical_width(params_format(params));
+-      return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
+-}
+-
+-static int snd_rpi_boomberry_dac_startup(struct snd_pcm_substream *substream) {
+-      struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-      struct snd_soc_codec *codec = rtd->codec;
+-      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
+-      return 0;
+-}
+-
+-static void snd_rpi_boomberry_dac_shutdown(struct snd_pcm_substream *substream) {
+-      struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-      struct snd_soc_codec *codec = rtd->codec;
+-      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x00);
+-}
+-
+-/* machine stream operations */
+-static struct snd_soc_ops snd_rpi_boomberry_dac_ops = {
+-      .hw_params = snd_rpi_boomberry_dac_hw_params,
+-      .startup = snd_rpi_boomberry_dac_startup,
+-      .shutdown = snd_rpi_boomberry_dac_shutdown,
+-};
+-
+-static struct snd_soc_dai_link snd_rpi_boomberry_dac_dai[] = {
+-{
+-      .name           = "BoomBerry DAC",
+-      .stream_name    = "BoomBerry DAC HiFi",
+-      .cpu_dai_name   = "bcm2708-i2s.0",
+-      .codec_dai_name = "pcm512x-hifi",
+-      .platform_name  = "bcm2708-i2s.0",
+-      .codec_name     = "pcm512x.1-004d",
+-      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+-                              SND_SOC_DAIFMT_CBS_CFS,
+-      .ops            = &snd_rpi_boomberry_dac_ops,
+-      .init           = snd_rpi_boomberry_dac_init,
+-},
+-};
+-
+-/* audio machine driver */
+-static struct snd_soc_card snd_rpi_boomberry_dac = {
+-      .name         = "snd_rpi_boomberry_dac",
+-      .owner        = THIS_MODULE,
+-      .dai_link     = snd_rpi_boomberry_dac_dai,
+-      .num_links    = ARRAY_SIZE(snd_rpi_boomberry_dac_dai),
+-};
+-
+-static int snd_rpi_boomberry_dac_probe(struct platform_device *pdev)
+-{
+-      int ret = 0;
+-
+-      snd_rpi_boomberry_dac.dev = &pdev->dev;
+-
+-      if (pdev->dev.of_node) {
+-          struct device_node *i2s_node;
+-          struct snd_soc_dai_link *dai = &snd_rpi_boomberry_dac_dai[0];
+-          i2s_node = of_parse_phandle(pdev->dev.of_node,
+-                                      "i2s-controller", 0);
+-
+-          if (i2s_node) {
+-                      dai->cpu_dai_name = NULL;
+-                      dai->cpu_of_node = i2s_node;
+-                      dai->platform_name = NULL;
+-                      dai->platform_of_node = i2s_node;
+-          }
+-
+-          digital_gain_0db_limit = !of_property_read_bool(
+-                      pdev->dev.of_node, "boomberry,24db_digital_gain");
+-      }
+-
+-      ret = snd_soc_register_card(&snd_rpi_boomberry_dac);
+-      if (ret)
+-              dev_err(&pdev->dev,
+-                      "snd_soc_register_card() failed: %d\n", ret);
+-
+-      return ret;
+-}
+-
+-static int snd_rpi_boomberry_dac_remove(struct platform_device *pdev)
+-{
+-      return snd_soc_unregister_card(&snd_rpi_boomberry_dac);
+-}
+-
+-static const struct of_device_id snd_rpi_boomberry_dac_of_match[] = {
+-      { .compatible = "boomberry,boomberry-dac", },
+-      {},
+-};
+-MODULE_DEVICE_TABLE(of, snd_rpi_boomberry_dac_of_match);
+-
+-static struct platform_driver snd_rpi_boomberry_dac_driver = {
+-      .driver = {
+-              .name   = "snd-rpi-boomberry-dac",
+-              .owner  = THIS_MODULE,
+-              .of_match_table = snd_rpi_boomberry_dac_of_match,
+-      },
+-      .probe          = snd_rpi_boomberry_dac_probe,
+-      .remove         = snd_rpi_boomberry_dac_remove,
+-};
+-
+-module_platform_driver(snd_rpi_boomberry_dac_driver);
+-
+-MODULE_AUTHOR("Milan Neskovic <info@boomberry.co>");
+-MODULE_DESCRIPTION("ASoC Driver for BoomBerry PI DAC HAT Sound Card");
+-MODULE_LICENSE("GPL v2");
+--- a/sound/soc/bcm/boomberry-digi.c
++++ /dev/null
+@@ -1,215 +0,0 @@
+-/*
+- * ASoC Driver for BoomBerry Raspberry Pi Digi HAT Sound Card
+- *
+- * Author:    Milan Neskovic
+- *            Copyright 2016
+- *            based on code by Daniel Matuschek <info@crazy-audio.com>
+- *            based on code by Florian Meier <florian.meier@koalo.de>
+- *
+- * This program is free software; you can redistribute it and/or
+- * modify it under the terms of the GNU General Public License
+- * version 2 as published by the Free Software Foundation.
+- *
+- * This program is distributed in the hope that it will be useful, but
+- * WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+- * General Public License for more details.
+- */
+-
+-#include <linux/module.h>
+-#include <linux/platform_device.h>
+-
+-#include <sound/core.h>
+-#include <sound/pcm.h>
+-#include <sound/pcm_params.h>
+-#include <sound/soc.h>
+-#include <sound/jack.h>
+-
+-#include "../codecs/wm8804.h"
+-
+-static int snd_rpi_boomberry_digi_init(struct snd_soc_pcm_runtime *rtd)
+-{
+-      struct snd_soc_codec *codec = rtd->codec;
+-
+-      /* enable TX output */
+-      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
+-
+-      return 0;
+-}
+-
+-static int snd_rpi_boomberry_digi_startup(struct snd_pcm_substream *substream) {
+-      /* turn on digital output */
+-      struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-      struct snd_soc_codec *codec = rtd->codec;
+-      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
+-      return 0;
+-}
+-
+-static void snd_rpi_boomberry_digi_shutdown(struct snd_pcm_substream *substream) {
+-      /* turn off output */
+-      struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-      struct snd_soc_codec *codec = rtd->codec;
+-      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
+-}
+-
+-static int snd_rpi_boomberry_digi_hw_params(struct snd_pcm_substream *substream,
+-                                     struct snd_pcm_hw_params *params)
+-{
+-      struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-      struct snd_soc_dai *codec_dai = rtd->codec_dai;
+-      struct snd_soc_codec *codec = rtd->codec;
+-      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+-
+-      int sysclk = 27000000; /* This is fixed on this board */
+-
+-      long mclk_freq=0;
+-      int mclk_div=1;
+-      int sampling_freq=1;
+-
+-      int ret;
+-
+-      int samplerate = params_rate(params);
+-
+-      if (samplerate<=96000) {
+-              mclk_freq=samplerate*256;
+-              mclk_div=WM8804_MCLKDIV_256FS;
+-      } else {
+-              mclk_freq=samplerate*128;
+-              mclk_div=WM8804_MCLKDIV_128FS;
+-      }
+-
+-      switch (samplerate) {
+-              case 32000:
+-                      sampling_freq=0x03;
+-                      break;
+-              case 44100:
+-                      sampling_freq=0x00;
+-                      break;
+-              case 48000:
+-                      sampling_freq=0x02;
+-                      break;
+-              case 88200:
+-                      sampling_freq=0x08;
+-                      break;
+-              case 96000:
+-                      sampling_freq=0x0a;
+-                      break;
+-              case 176400:
+-                      sampling_freq=0x0c;
+-                      break;
+-              case 192000:
+-                      sampling_freq=0x0e;
+-                      break;
+-              default:
+-                      dev_err(codec->dev,
+-                      "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
+-                      samplerate);
+-      }
+-
+-      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
+-      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
+-
+-      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
+-                                      sysclk, SND_SOC_CLOCK_OUT);
+-      if (ret < 0) {
+-              dev_err(codec->dev,
+-              "Failed to set WM8804 SYSCLK: %d\n", ret);
+-              return ret;
+-      }
+-
+-      /* Enable TX output */
+-      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
+-
+-      /* Power on */
+-      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
+-
+-      /* set sampling frequency status bits */
+-      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
+-
+-      return snd_soc_dai_set_bclk_ratio(cpu_dai,64);
+-}
+-
+-/* machine stream operations */
+-static struct snd_soc_ops snd_rpi_boomberry_digi_ops = {
+-      .hw_params = snd_rpi_boomberry_digi_hw_params,
+-        .startup = snd_rpi_boomberry_digi_startup,
+-        .shutdown = snd_rpi_boomberry_digi_shutdown,
+-};
+-
+-static struct snd_soc_dai_link snd_rpi_boomberry_digi_dai[] = {
+-{
+-      .name           = "BoomBerry Digi",
+-      .stream_name    = "BoomBerry Digi HiFi",
+-      .cpu_dai_name   = "bcm2708-i2s.0",
+-      .codec_dai_name = "wm8804-spdif",
+-      .platform_name  = "bcm2708-i2s.0",
+-      .codec_name     = "wm8804.1-003b",
+-      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+-                              SND_SOC_DAIFMT_CBM_CFM,
+-      .ops            = &snd_rpi_boomberry_digi_ops,
+-      .init           = snd_rpi_boomberry_digi_init,
+-},
+-};
+-
+-/* audio machine driver */
+-static struct snd_soc_card snd_rpi_boomberry_digi = {
+-      .name         = "snd_rpi_boomberry_digi",
+-      .owner        = THIS_MODULE,
+-      .dai_link     = snd_rpi_boomberry_digi_dai,
+-      .num_links    = ARRAY_SIZE(snd_rpi_boomberry_digi_dai),
+-};
+-
+-static int snd_rpi_boomberry_digi_probe(struct platform_device *pdev)
+-{
+-      int ret = 0;
+-
+-      snd_rpi_boomberry_digi.dev = &pdev->dev;
+-
+-      if (pdev->dev.of_node) {
+-          struct device_node *i2s_node;
+-          struct snd_soc_dai_link *dai = &snd_rpi_boomberry_digi_dai[0];
+-          i2s_node = of_parse_phandle(pdev->dev.of_node,
+-                                      "i2s-controller", 0);
+-
+-          if (i2s_node) {
+-                      dai->cpu_dai_name = NULL;
+-                      dai->cpu_of_node = i2s_node;
+-                      dai->platform_name = NULL;
+-                      dai->platform_of_node = i2s_node;
+-          }
+-      }
+-
+-      ret = snd_soc_register_card(&snd_rpi_boomberry_digi);
+-      if (ret)
+-              dev_err(&pdev->dev,
+-                      "snd_soc_register_card() failed: %d\n", ret);
+-
+-      return ret;
+-}
+-
+-static int snd_rpi_boomberry_digi_remove(struct platform_device *pdev)
+-{
+-      return snd_soc_unregister_card(&snd_rpi_boomberry_digi);
+-}
+-
+-static const struct of_device_id snd_rpi_boomberry_digi_of_match[] = {
+-      { .compatible = "boomberry,boomberry-digi", },
+-      {},
+-};
+-MODULE_DEVICE_TABLE(of, snd_rpi_boomberry_digi_of_match);
+-
+-static struct platform_driver snd_rpi_boomberry_digi_driver = {
+-      .driver = {
+-              .name   = "snd-rpi-boomberry-digi",
+-              .owner  = THIS_MODULE,
+-              .of_match_table = snd_rpi_boomberry_digi_of_match,
+-      },
+-      .probe          = snd_rpi_boomberry_digi_probe,
+-      .remove         = snd_rpi_boomberry_digi_remove,
+-};
+-
+-module_platform_driver(snd_rpi_boomberry_digi_driver);
+-
+-MODULE_AUTHOR("Milan Neskovic <info@boomberry.co>");
+-MODULE_DESCRIPTION("ASoC Driver for BoomBerry PI Digi HAT Sound Card");
+-MODULE_LICENSE("GPL v2");
+--- /dev/null
++++ b/sound/soc/bcm/justboom-dac.c
+@@ -0,0 +1,162 @@
++/*
++ * ASoC Driver for JustBoom DAC Raspberry Pi HAT Sound Card
++ *
++ * Author:    Milan Neskovic
++ *            Copyright 2016
++ *            based on code by Daniel Matuschek <info@crazy-audio.com>
++ *            based on code by Florian Meier <florian.meier@koalo.de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/jack.h>
++
++#include "../codecs/pcm512x.h"
++
++static bool digital_gain_0db_limit = true;
++
++static int snd_rpi_justboom_dac_init(struct snd_soc_pcm_runtime *rtd)
++{
++      struct snd_soc_codec *codec = rtd->codec;
++      snd_soc_update_bits(codec, PCM512x_GPIO_EN, 0x08, 0x08);
++      snd_soc_update_bits(codec, PCM512x_GPIO_OUTPUT_4, 0xf, 0x02);
++      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
++
++      if (digital_gain_0db_limit)
++      {
++              int ret;
++              struct snd_soc_card *card = rtd->card;
++
++              ret = snd_soc_limit_volume(card, "Digital Playback Volume", 207);
++              if (ret < 0)
++                      dev_warn(card->dev, "Failed to set volume limit: %d\n", ret);
++      }
++
++      return 0;
++}
++
++static int snd_rpi_justboom_dac_hw_params(struct snd_pcm_substream *substream,
++                                     struct snd_pcm_hw_params *params)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
++      /*return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);*/
++      unsigned int sample_bits =
++              snd_pcm_format_physical_width(params_format(params));
++      return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
++}
++
++static int snd_rpi_justboom_dac_startup(struct snd_pcm_substream *substream) {
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
++      return 0;
++}
++
++static void snd_rpi_justboom_dac_shutdown(struct snd_pcm_substream *substream) {
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x00);
++}
++
++/* machine stream operations */
++static struct snd_soc_ops snd_rpi_justboom_dac_ops = {
++      .hw_params = snd_rpi_justboom_dac_hw_params,
++      .startup = snd_rpi_justboom_dac_startup,
++      .shutdown = snd_rpi_justboom_dac_shutdown,
++};
++
++static struct snd_soc_dai_link snd_rpi_justboom_dac_dai[] = {
++{
++      .name           = "JustBoom DAC",
++      .stream_name    = "JustBoom DAC HiFi",
++      .cpu_dai_name   = "bcm2708-i2s.0",
++      .codec_dai_name = "pcm512x-hifi",
++      .platform_name  = "bcm2708-i2s.0",
++      .codec_name     = "pcm512x.1-004d",
++      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
++                              SND_SOC_DAIFMT_CBS_CFS,
++      .ops            = &snd_rpi_justboom_dac_ops,
++      .init           = snd_rpi_justboom_dac_init,
++},
++};
++
++/* audio machine driver */
++static struct snd_soc_card snd_rpi_justboom_dac = {
++      .name         = "snd_rpi_justboom_dac",
++      .owner        = THIS_MODULE,
++      .dai_link     = snd_rpi_justboom_dac_dai,
++      .num_links    = ARRAY_SIZE(snd_rpi_justboom_dac_dai),
++};
++
++static int snd_rpi_justboom_dac_probe(struct platform_device *pdev)
++{
++      int ret = 0;
++
++      snd_rpi_justboom_dac.dev = &pdev->dev;
++
++      if (pdev->dev.of_node) {
++          struct device_node *i2s_node;
++          struct snd_soc_dai_link *dai = &snd_rpi_justboom_dac_dai[0];
++          i2s_node = of_parse_phandle(pdev->dev.of_node,
++                                      "i2s-controller", 0);
++
++          if (i2s_node) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_node;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_node;
++          }
++
++          digital_gain_0db_limit = !of_property_read_bool(
++                      pdev->dev.of_node, "justboom,24db_digital_gain");
++      }
++
++      ret = snd_soc_register_card(&snd_rpi_justboom_dac);
++      if (ret)
++              dev_err(&pdev->dev,
++                      "snd_soc_register_card() failed: %d\n", ret);
++
++      return ret;
++}
++
++static int snd_rpi_justboom_dac_remove(struct platform_device *pdev)
++{
++      return snd_soc_unregister_card(&snd_rpi_justboom_dac);
++}
++
++static const struct of_device_id snd_rpi_justboom_dac_of_match[] = {
++      { .compatible = "justboom,justboom-dac", },
++      {},
++};
++MODULE_DEVICE_TABLE(of, snd_rpi_justboom_dac_of_match);
++
++static struct platform_driver snd_rpi_justboom_dac_driver = {
++      .driver = {
++              .name   = "snd-rpi-justboom-dac",
++              .owner  = THIS_MODULE,
++              .of_match_table = snd_rpi_justboom_dac_of_match,
++      },
++      .probe          = snd_rpi_justboom_dac_probe,
++      .remove         = snd_rpi_justboom_dac_remove,
++};
++
++module_platform_driver(snd_rpi_justboom_dac_driver);
++
++MODULE_AUTHOR("Milan Neskovic <info@justboom.co>");
++MODULE_DESCRIPTION("ASoC Driver for JustBoom PI DAC HAT Sound Card");
++MODULE_LICENSE("GPL v2");
+--- /dev/null
++++ b/sound/soc/bcm/justboom-digi.c
+@@ -0,0 +1,215 @@
++/*
++ * ASoC Driver for JustBoom Raspberry Pi Digi HAT Sound Card
++ *
++ * Author:    Milan Neskovic
++ *            Copyright 2016
++ *            based on code by Daniel Matuschek <info@crazy-audio.com>
++ *            based on code by Florian Meier <florian.meier@koalo.de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/jack.h>
++
++#include "../codecs/wm8804.h"
++
++static int snd_rpi_justboom_digi_init(struct snd_soc_pcm_runtime *rtd)
++{
++      struct snd_soc_codec *codec = rtd->codec;
++
++      /* enable TX output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++
++      return 0;
++}
++
++static int snd_rpi_justboom_digi_startup(struct snd_pcm_substream *substream) {
++      /* turn on digital output */
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
++      return 0;
++}
++
++static void snd_rpi_justboom_digi_shutdown(struct snd_pcm_substream *substream) {
++      /* turn off output */
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
++}
++
++static int snd_rpi_justboom_digi_hw_params(struct snd_pcm_substream *substream,
++                                     struct snd_pcm_hw_params *params)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_dai *codec_dai = rtd->codec_dai;
++      struct snd_soc_codec *codec = rtd->codec;
++      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
++
++      int sysclk = 27000000; /* This is fixed on this board */
++
++      long mclk_freq=0;
++      int mclk_div=1;
++      int sampling_freq=1;
++
++      int ret;
++
++      int samplerate = params_rate(params);
++
++      if (samplerate<=96000) {
++              mclk_freq=samplerate*256;
++              mclk_div=WM8804_MCLKDIV_256FS;
++      } else {
++              mclk_freq=samplerate*128;
++              mclk_div=WM8804_MCLKDIV_128FS;
++      }
++
++      switch (samplerate) {
++              case 32000:
++                      sampling_freq=0x03;
++                      break;
++              case 44100:
++                      sampling_freq=0x00;
++                      break;
++              case 48000:
++                      sampling_freq=0x02;
++                      break;
++              case 88200:
++                      sampling_freq=0x08;
++                      break;
++              case 96000:
++                      sampling_freq=0x0a;
++                      break;
++              case 176400:
++                      sampling_freq=0x0c;
++                      break;
++              case 192000:
++                      sampling_freq=0x0e;
++                      break;
++              default:
++                      dev_err(codec->dev,
++                      "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
++                      samplerate);
++      }
++
++      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
++      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
++
++      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
++                                      sysclk, SND_SOC_CLOCK_OUT);
++      if (ret < 0) {
++              dev_err(codec->dev,
++              "Failed to set WM8804 SYSCLK: %d\n", ret);
++              return ret;
++      }
++
++      /* Enable TX output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++
++      /* Power on */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
++
++      /* set sampling frequency status bits */
++      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
++
++      return snd_soc_dai_set_bclk_ratio(cpu_dai,64);
++}
++
++/* machine stream operations */
++static struct snd_soc_ops snd_rpi_justboom_digi_ops = {
++      .hw_params = snd_rpi_justboom_digi_hw_params,
++        .startup = snd_rpi_justboom_digi_startup,
++        .shutdown = snd_rpi_justboom_digi_shutdown,
++};
++
++static struct snd_soc_dai_link snd_rpi_justboom_digi_dai[] = {
++{
++      .name           = "JustBoom Digi",
++      .stream_name    = "JustBoom Digi HiFi",
++      .cpu_dai_name   = "bcm2708-i2s.0",
++      .codec_dai_name = "wm8804-spdif",
++      .platform_name  = "bcm2708-i2s.0",
++      .codec_name     = "wm8804.1-003b",
++      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
++                              SND_SOC_DAIFMT_CBM_CFM,
++      .ops            = &snd_rpi_justboom_digi_ops,
++      .init           = snd_rpi_justboom_digi_init,
++},
++};
++
++/* audio machine driver */
++static struct snd_soc_card snd_rpi_justboom_digi = {
++      .name         = "snd_rpi_justboom_digi",
++      .owner        = THIS_MODULE,
++      .dai_link     = snd_rpi_justboom_digi_dai,
++      .num_links    = ARRAY_SIZE(snd_rpi_justboom_digi_dai),
++};
++
++static int snd_rpi_justboom_digi_probe(struct platform_device *pdev)
++{
++      int ret = 0;
++
++      snd_rpi_justboom_digi.dev = &pdev->dev;
++
++      if (pdev->dev.of_node) {
++          struct device_node *i2s_node;
++          struct snd_soc_dai_link *dai = &snd_rpi_justboom_digi_dai[0];
++          i2s_node = of_parse_phandle(pdev->dev.of_node,
++                                      "i2s-controller", 0);
++
++          if (i2s_node) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_node;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_node;
++          }
++      }
++
++      ret = snd_soc_register_card(&snd_rpi_justboom_digi);
++      if (ret)
++              dev_err(&pdev->dev,
++                      "snd_soc_register_card() failed: %d\n", ret);
++
++      return ret;
++}
++
++static int snd_rpi_justboom_digi_remove(struct platform_device *pdev)
++{
++      return snd_soc_unregister_card(&snd_rpi_justboom_digi);
++}
++
++static const struct of_device_id snd_rpi_justboom_digi_of_match[] = {
++      { .compatible = "justboom,justboom-digi", },
++      {},
++};
++MODULE_DEVICE_TABLE(of, snd_rpi_justboom_digi_of_match);
++
++static struct platform_driver snd_rpi_justboom_digi_driver = {
++      .driver = {
++              .name   = "snd-rpi-justboom-digi",
++              .owner  = THIS_MODULE,
++              .of_match_table = snd_rpi_justboom_digi_of_match,
++      },
++      .probe          = snd_rpi_justboom_digi_probe,
++      .remove         = snd_rpi_justboom_digi_remove,
++};
++
++module_platform_driver(snd_rpi_justboom_digi_driver);
++
++MODULE_AUTHOR("Milan Neskovic <info@justboom.co>");
++MODULE_DESCRIPTION("ASoC Driver for JustBoom PI Digi HAT Sound Card");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0364-bcm2835-camera-Fix-max-min-error-when-looping-over-c.patch b/target/linux/brcm2708/patches-4.4/0364-bcm2835-camera-Fix-max-min-error-when-looping-over-c.patch
deleted file mode 100644 (file)
index ba29be2..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-From d832db5de5893d3d6020a9d3e32aa4cd80490cc9 Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Tue, 24 May 2016 16:20:09 +0100
-Subject: [PATCH 364/423] bcm2835-camera: Fix max/min error when looping over
- cameras/resolutions
-
-See: https://github.com/raspberrypi/linux/issues/1447#issuecomment-221303506
----
- drivers/media/platform/bcm2835/bcm2835-camera.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/media/platform/bcm2835/bcm2835-camera.c
-+++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
-@@ -1530,8 +1530,8 @@ static int get_num_cameras(struct vchiq_
-       }
-       for (i = 0;
-            i < (cam_info.num_cameras > num_resolutions ?
--                      cam_info.num_cameras :
--                      num_resolutions);
-+                      num_resolutions :
-+                      cam_info.num_cameras);
-            i++) {
-               resolutions[i][0] = cam_info.cameras[i].max_width;
-               resolutions[i][1] = cam_info.cameras[i].max_height;
diff --git a/target/linux/brcm2708/patches-4.4/0365-Change-BoomBerry-name-to-JustBoom-in-all-locations-d.patch b/target/linux/brcm2708/patches-4.4/0365-Change-BoomBerry-name-to-JustBoom-in-all-locations-d.patch
deleted file mode 100644 (file)
index faf982f..0000000
+++ /dev/null
@@ -1,1139 +0,0 @@
-From 648226e081795be9ebaad2dc14bf768ba785f277 Mon Sep 17 00:00:00 2001
-From: Aaron Shaw <shawaj@gmail.com>
-Date: Thu, 26 May 2016 23:37:11 +0100
-Subject: [PATCH 365/423] Change BoomBerry name to JustBoom in all locations
- due to legal challenge
-
----
- arch/arm/boot/dts/overlays/Makefile                |   4 +-
- arch/arm/boot/dts/overlays/README                  |  52 ++---
- .../boot/dts/overlays/boomberry-dac-overlay.dts    |  43 -----
- .../boot/dts/overlays/boomberry-digi-overlay.dts   |  39 ----
- .../arm/boot/dts/overlays/justboom-dac-overlay.dts |  43 +++++
- .../boot/dts/overlays/justboom-digi-overlay.dts    |  39 ++++
- arch/arm/configs/bcm2709_defconfig                 |   4 +-
- arch/arm/configs/bcmrpi_defconfig                  |   4 +-
- sound/soc/bcm/Kconfig                              |  12 +-
- sound/soc/bcm/Makefile                             |   8 +-
- sound/soc/bcm/boomberry-dac.c                      | 162 ----------------
- sound/soc/bcm/boomberry-digi.c                     | 215 ---------------------
- sound/soc/bcm/justboom-dac.c                       | 162 ++++++++++++++++
- sound/soc/bcm/justboom-digi.c                      | 215 +++++++++++++++++++++
- 14 files changed, 501 insertions(+), 501 deletions(-)
- delete mode 100644 arch/arm/boot/dts/overlays/boomberry-dac-overlay.dts
- delete mode 100644 arch/arm/boot/dts/overlays/boomberry-digi-overlay.dts
- create mode 100644 arch/arm/boot/dts/overlays/justboom-dac-overlay.dts
- create mode 100644 arch/arm/boot/dts/overlays/justboom-digi-overlay.dts
- delete mode 100644 sound/soc/bcm/boomberry-dac.c
- delete mode 100644 sound/soc/bcm/boomberry-digi.c
- create mode 100644 sound/soc/bcm/justboom-dac.c
- create mode 100644 sound/soc/bcm/justboom-digi.c
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -18,8 +18,6 @@ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqd
- dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
--dtbo-$(RPI_DT_OVERLAYS) += boomberry-dac.dtbo
--dtbo-$(RPI_DT_OVERLAYS) += boomberry-digi.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dpi24.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
-@@ -43,6 +41,8 @@ dtbo-$(RPI_DT_OVERLAYS) += i2s-gpio28-31
- 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) += justboom-dac.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -238,32 +238,6 @@ Load:   dtoverlay=bmp085_i2c-sensor
- Params: <None>
--Name:   boomberry-dac
--Info:   Configures the BoomBerry DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
--        cards
--Load:   dtoverlay=boomberry-dac,<param>=<val>
--Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
--                                Digital volume control. Enable with
--                                "dtoverlay=boomberry-dac,24db_digital_gain"
--                                (The default behaviour is that the Digital
--                                volume control is limited to a maximum of
--                                0dB. ie. it can attenuate but not provide
--                                gain. For most users, this will be desired
--                                as it will prevent clipping. By appending
--                                the 24dB_digital_gain parameter, the Digital
--                                volume control will allow up to 24dB of
--                                gain. If this parameter is enabled, it is the
--                                responsibility of the user to ensure that
--                                the Digital volume control is set to a value
--                                that does not result in clipping/distortion!)
--
--
--Name:   boomberry-digi
--Info:   Configures the BoomBerry Digi HAT and Digi Zero audio cards
--Load:   dtoverlay=boomberry-digi
--Params: <None>
--
--
- Name:   dht11
- Info:   Overlay for the DHT11/DHT21/DHT22 humidity/temperature sensors
-         Also sometimes found with the part number(s) AM230x.
-@@ -541,6 +515,32 @@ Params: 24db_digital_gain       Allow ga
-                                 that does not result in clipping/distortion!)
-+Name:   justboom-dac
-+Info:   Configures the JustBoom DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
-+        cards
-+Load:   dtoverlay=justboom-dac,<param>=<val>
-+Params: 24db_digital_gain       Allow gain to be applied via the PCM512x codec
-+                                Digital volume control. Enable with
-+                                "dtoverlay=justboom-dac,24db_digital_gain"
-+                                (The default behaviour is that the Digital
-+                                volume control is limited to a maximum of
-+                                0dB. ie. it can attenuate but not provide
-+                                gain. For most users, this will be desired
-+                                as it will prevent clipping. By appending
-+                                the 24dB_digital_gain parameter, the Digital
-+                                volume control will allow up to 24dB of
-+                                gain. If this parameter is enabled, it is the
-+                                responsibility of the user to ensure that
-+                                the Digital volume control is set to a value
-+                                that does not result in clipping/distortion!)
-+
-+
-+Name:   justboom-digi
-+Info:   Configures the JustBoom Digi HAT and Digi Zero audio cards
-+Load:   dtoverlay=justboom-digi
-+Params: <None>
-+
-+
- Name:   lirc-rpi
- Info:   Configures lirc-rpi (Linux Infrared Remote Control for Raspberry Pi)
-         Consult the module documentation for more details.
---- a/arch/arm/boot/dts/overlays/boomberry-dac-overlay.dts
-+++ /dev/null
-@@ -1,43 +0,0 @@
--// Definitions for BoomBerry DAC
--/dts-v1/;
--/plugin/;
--
--/ {
--      compatible = "brcm,bcm2708";
--
--      fragment@0 {
--              target = <&i2s>;
--              __overlay__ {
--                      status = "okay";
--              };
--      };
--
--      fragment@1 {
--              target = <&i2c1>;
--              __overlay__ {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
--                      status = "okay";
--
--                      pcm5122@4d {
--                              #sound-dai-cells = <0>;
--                              compatible = "ti,pcm5122";
--                              reg = <0x4d>;
--                              status = "okay";
--                      };
--              };
--      };
--
--      fragment@2 {
--              target = <&sound>;
--              frag2: __overlay__ {
--                      compatible = "boomberry,boomberry-dac";
--                      i2s-controller = <&i2s>;
--                      status = "okay";
--              };
--      };
--
--      __overrides__ {
--              24db_digital_gain = <&frag2>,"boomberry,24db_digital_gain?";
--      };
--};
---- a/arch/arm/boot/dts/overlays/boomberry-digi-overlay.dts
-+++ /dev/null
-@@ -1,39 +0,0 @@
--// Definitions for BoomBerry Digi
--/dts-v1/;
--/plugin/;
--
--/ {
--      compatible = "brcm,bcm2708";
--
--      fragment@0 {
--              target = <&i2s>;
--              __overlay__ {
--                      status = "okay";
--              };
--      };
--
--      fragment@1 {
--              target = <&i2c1>;
--              __overlay__ {
--                      #address-cells = <1>;
--                      #size-cells = <0>;
--                      status = "okay";
--
--                      wm8804@3b {
--                              #sound-dai-cells = <0>;
--                              compatible = "wlf,wm8804";
--                              reg = <0x3b>;
--                              status = "okay";
--                      };
--              };
--      };
--
--      fragment@2 {
--              target = <&sound>;
--              __overlay__ {
--                      compatible = "boomberry,boomberry-digi";
--                      i2s-controller = <&i2s>;
--                      status = "okay";
--              };
--      };
--};
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/justboom-dac-overlay.dts
-@@ -0,0 +1,43 @@
-+// Definitions for JustBoom DAC
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      pcm5122@4d {
-+                              #sound-dai-cells = <0>;
-+                              compatible = "ti,pcm5122";
-+                              reg = <0x4d>;
-+                              status = "okay";
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&sound>;
-+              frag2: __overlay__ {
-+                      compatible = "justboom,justboom-dac";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+
-+      __overrides__ {
-+              24db_digital_gain = <&frag2>,"justboom,24db_digital_gain?";
-+      };
-+};
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/justboom-digi-overlay.dts
-@@ -0,0 +1,39 @@
-+// Definitions for JustBoom Digi
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      wm8804@3b {
-+                              #sound-dai-cells = <0>;
-+                              compatible = "wlf,wm8804";
-+                              reg = <0x3b>;
-+                              status = "okay";
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&sound>;
-+              __overlay__ {
-+                      compatible = "justboom,justboom-digi";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+};
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -861,8 +861,8 @@ CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m
- CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m
- CONFIG_SND_BCM2708_SOC_RPI_DAC=m
- CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
--CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
--CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
-+CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
-+CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -853,8 +853,8 @@ CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m
- CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m
- CONFIG_SND_BCM2708_SOC_RPI_DAC=m
- CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
--CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC=m
--CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI=m
-+CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
-+CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
---- a/sound/soc/bcm/Kconfig
-+++ b/sound/soc/bcm/Kconfig
-@@ -50,19 +50,19 @@ config SND_BCM2708_SOC_RPI_PROTO
-       help
-         Say Y or M if you want to add support for Audio Codec Board PROTO (WM8731).
--config SND_BCM2708_SOC_BOOMBERRY_DAC
--      tristate "Support for BoomBerry DAC"
-+config SND_BCM2708_SOC_JUSTBOOM_DAC
-+      tristate "Support for JustBoom DAC"
-       depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-       select SND_SOC_PCM512x
-       help
--        Say Y or M if you want to add support for BoomBerry DAC.
-+        Say Y or M if you want to add support for JustBoom DAC.
--config SND_BCM2708_SOC_BOOMBERRY_DIGI
--      tristate "Support for BoomBerry Digi"
-+config SND_BCM2708_SOC_JUSTBOOM_DIGI
-+      tristate "Support for JustBoom Digi"
-       depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-       select SND_SOC_WM8804
-       help
--        Say Y or M if you want to add support for BoomBerry Digi.
-+        Say Y or M if you want to add support for JustBoom Digi.
- config SND_BCM2708_SOC_IQAUDIO_DAC
-       tristate "Support for IQaudIO-DAC"
---- a/sound/soc/bcm/Makefile
-+++ b/sound/soc/bcm/Makefile
-@@ -9,8 +9,8 @@ snd-soc-hifiberry-dac-objs := hifiberry_
- snd-soc-hifiberry-dacplus-objs := hifiberry_dacplus.o
- snd-soc-hifiberry-digi-objs := hifiberry_digi.o
- snd-soc-hifiberry-amp-objs := hifiberry_amp.o
--snd-soc-boomberry-dac-objs := boomberry-dac.o
--snd-soc-boomberry-digi-objs := boomberry-digi.o
-+snd-soc-justboom-dac-objs := justboom-dac.o
-+snd-soc-justboom-digi-objs := justboom-digi.o
- snd-soc-rpi-dac-objs := rpi-dac.o
- snd-soc-rpi-proto-objs := rpi-proto.o
- snd-soc-iqaudio-dac-objs := iqaudio-dac.o
-@@ -22,8 +22,8 @@ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_D
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS) += snd-soc-hifiberry-dacplus.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI) += snd-soc-hifiberry-digi.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP) += snd-soc-hifiberry-amp.o
--obj-$(CONFIG_SND_BCM2708_SOC_BOOMBERRY_DAC) += snd-soc-boomberry-dac.o
--obj-$(CONFIG_SND_BCM2708_SOC_BOOMBERRY_DIGI) += snd-soc-boomberry-digi.o
-+obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC) += snd-soc-justboom-dac.o
-+obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI) += snd-soc-justboom-digi.o
- obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o
- obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
- obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
---- a/sound/soc/bcm/boomberry-dac.c
-+++ /dev/null
-@@ -1,162 +0,0 @@
--/*
-- * ASoC Driver for BoomBerry DAC Raspberry Pi HAT Sound Card
-- *
-- * Author:    Milan Neskovic
-- *            Copyright 2016
-- *            based on code by Daniel Matuschek <info@crazy-audio.com>
-- *            based on code by Florian Meier <florian.meier@koalo.de>
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * version 2 as published by the Free Software Foundation.
-- *
-- * This program is distributed in the hope that it will be useful, but
-- * WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-- * General Public License for more details.
-- */
--
--#include <linux/module.h>
--#include <linux/platform_device.h>
--
--#include <sound/core.h>
--#include <sound/pcm.h>
--#include <sound/pcm_params.h>
--#include <sound/soc.h>
--#include <sound/jack.h>
--
--#include "../codecs/pcm512x.h"
--
--static bool digital_gain_0db_limit = true;
--
--static int snd_rpi_boomberry_dac_init(struct snd_soc_pcm_runtime *rtd)
--{
--      struct snd_soc_codec *codec = rtd->codec;
--      snd_soc_update_bits(codec, PCM512x_GPIO_EN, 0x08, 0x08);
--      snd_soc_update_bits(codec, PCM512x_GPIO_OUTPUT_4, 0xf, 0x02);
--      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
--
--      if (digital_gain_0db_limit)
--      {
--              int ret;
--              struct snd_soc_card *card = rtd->card;
--
--              ret = snd_soc_limit_volume(card, "Digital Playback Volume", 207);
--              if (ret < 0)
--                      dev_warn(card->dev, "Failed to set volume limit: %d\n", ret);
--      }
--
--      return 0;
--}
--
--static int snd_rpi_boomberry_dac_hw_params(struct snd_pcm_substream *substream,
--                                     struct snd_pcm_hw_params *params)
--{
--      struct snd_soc_pcm_runtime *rtd = substream->private_data;
--      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
--      /*return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);*/
--      unsigned int sample_bits =
--              snd_pcm_format_physical_width(params_format(params));
--      return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
--}
--
--static int snd_rpi_boomberry_dac_startup(struct snd_pcm_substream *substream) {
--      struct snd_soc_pcm_runtime *rtd = substream->private_data;
--      struct snd_soc_codec *codec = rtd->codec;
--      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
--      return 0;
--}
--
--static void snd_rpi_boomberry_dac_shutdown(struct snd_pcm_substream *substream) {
--      struct snd_soc_pcm_runtime *rtd = substream->private_data;
--      struct snd_soc_codec *codec = rtd->codec;
--      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x00);
--}
--
--/* machine stream operations */
--static struct snd_soc_ops snd_rpi_boomberry_dac_ops = {
--      .hw_params = snd_rpi_boomberry_dac_hw_params,
--      .startup = snd_rpi_boomberry_dac_startup,
--      .shutdown = snd_rpi_boomberry_dac_shutdown,
--};
--
--static struct snd_soc_dai_link snd_rpi_boomberry_dac_dai[] = {
--{
--      .name           = "BoomBerry DAC",
--      .stream_name    = "BoomBerry DAC HiFi",
--      .cpu_dai_name   = "bcm2708-i2s.0",
--      .codec_dai_name = "pcm512x-hifi",
--      .platform_name  = "bcm2708-i2s.0",
--      .codec_name     = "pcm512x.1-004d",
--      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
--                              SND_SOC_DAIFMT_CBS_CFS,
--      .ops            = &snd_rpi_boomberry_dac_ops,
--      .init           = snd_rpi_boomberry_dac_init,
--},
--};
--
--/* audio machine driver */
--static struct snd_soc_card snd_rpi_boomberry_dac = {
--      .name         = "snd_rpi_boomberry_dac",
--      .owner        = THIS_MODULE,
--      .dai_link     = snd_rpi_boomberry_dac_dai,
--      .num_links    = ARRAY_SIZE(snd_rpi_boomberry_dac_dai),
--};
--
--static int snd_rpi_boomberry_dac_probe(struct platform_device *pdev)
--{
--      int ret = 0;
--
--      snd_rpi_boomberry_dac.dev = &pdev->dev;
--
--      if (pdev->dev.of_node) {
--          struct device_node *i2s_node;
--          struct snd_soc_dai_link *dai = &snd_rpi_boomberry_dac_dai[0];
--          i2s_node = of_parse_phandle(pdev->dev.of_node,
--                                      "i2s-controller", 0);
--
--          if (i2s_node) {
--                      dai->cpu_dai_name = NULL;
--                      dai->cpu_of_node = i2s_node;
--                      dai->platform_name = NULL;
--                      dai->platform_of_node = i2s_node;
--          }
--
--          digital_gain_0db_limit = !of_property_read_bool(
--                      pdev->dev.of_node, "boomberry,24db_digital_gain");
--      }
--
--      ret = snd_soc_register_card(&snd_rpi_boomberry_dac);
--      if (ret)
--              dev_err(&pdev->dev,
--                      "snd_soc_register_card() failed: %d\n", ret);
--
--      return ret;
--}
--
--static int snd_rpi_boomberry_dac_remove(struct platform_device *pdev)
--{
--      return snd_soc_unregister_card(&snd_rpi_boomberry_dac);
--}
--
--static const struct of_device_id snd_rpi_boomberry_dac_of_match[] = {
--      { .compatible = "boomberry,boomberry-dac", },
--      {},
--};
--MODULE_DEVICE_TABLE(of, snd_rpi_boomberry_dac_of_match);
--
--static struct platform_driver snd_rpi_boomberry_dac_driver = {
--      .driver = {
--              .name   = "snd-rpi-boomberry-dac",
--              .owner  = THIS_MODULE,
--              .of_match_table = snd_rpi_boomberry_dac_of_match,
--      },
--      .probe          = snd_rpi_boomberry_dac_probe,
--      .remove         = snd_rpi_boomberry_dac_remove,
--};
--
--module_platform_driver(snd_rpi_boomberry_dac_driver);
--
--MODULE_AUTHOR("Milan Neskovic <info@boomberry.co>");
--MODULE_DESCRIPTION("ASoC Driver for BoomBerry PI DAC HAT Sound Card");
--MODULE_LICENSE("GPL v2");
---- a/sound/soc/bcm/boomberry-digi.c
-+++ /dev/null
-@@ -1,215 +0,0 @@
--/*
-- * ASoC Driver for BoomBerry Raspberry Pi Digi HAT Sound Card
-- *
-- * Author:    Milan Neskovic
-- *            Copyright 2016
-- *            based on code by Daniel Matuschek <info@crazy-audio.com>
-- *            based on code by Florian Meier <florian.meier@koalo.de>
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * version 2 as published by the Free Software Foundation.
-- *
-- * This program is distributed in the hope that it will be useful, but
-- * WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-- * General Public License for more details.
-- */
--
--#include <linux/module.h>
--#include <linux/platform_device.h>
--
--#include <sound/core.h>
--#include <sound/pcm.h>
--#include <sound/pcm_params.h>
--#include <sound/soc.h>
--#include <sound/jack.h>
--
--#include "../codecs/wm8804.h"
--
--static int snd_rpi_boomberry_digi_init(struct snd_soc_pcm_runtime *rtd)
--{
--      struct snd_soc_codec *codec = rtd->codec;
--
--      /* enable TX output */
--      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
--
--      return 0;
--}
--
--static int snd_rpi_boomberry_digi_startup(struct snd_pcm_substream *substream) {
--      /* turn on digital output */
--      struct snd_soc_pcm_runtime *rtd = substream->private_data;
--      struct snd_soc_codec *codec = rtd->codec;
--      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
--      return 0;
--}
--
--static void snd_rpi_boomberry_digi_shutdown(struct snd_pcm_substream *substream) {
--      /* turn off output */
--      struct snd_soc_pcm_runtime *rtd = substream->private_data;
--      struct snd_soc_codec *codec = rtd->codec;
--      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
--}
--
--static int snd_rpi_boomberry_digi_hw_params(struct snd_pcm_substream *substream,
--                                     struct snd_pcm_hw_params *params)
--{
--      struct snd_soc_pcm_runtime *rtd = substream->private_data;
--      struct snd_soc_dai *codec_dai = rtd->codec_dai;
--      struct snd_soc_codec *codec = rtd->codec;
--      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
--
--      int sysclk = 27000000; /* This is fixed on this board */
--
--      long mclk_freq=0;
--      int mclk_div=1;
--      int sampling_freq=1;
--
--      int ret;
--
--      int samplerate = params_rate(params);
--
--      if (samplerate<=96000) {
--              mclk_freq=samplerate*256;
--              mclk_div=WM8804_MCLKDIV_256FS;
--      } else {
--              mclk_freq=samplerate*128;
--              mclk_div=WM8804_MCLKDIV_128FS;
--      }
--
--      switch (samplerate) {
--              case 32000:
--                      sampling_freq=0x03;
--                      break;
--              case 44100:
--                      sampling_freq=0x00;
--                      break;
--              case 48000:
--                      sampling_freq=0x02;
--                      break;
--              case 88200:
--                      sampling_freq=0x08;
--                      break;
--              case 96000:
--                      sampling_freq=0x0a;
--                      break;
--              case 176400:
--                      sampling_freq=0x0c;
--                      break;
--              case 192000:
--                      sampling_freq=0x0e;
--                      break;
--              default:
--                      dev_err(codec->dev,
--                      "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
--                      samplerate);
--      }
--
--      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
--      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
--
--      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
--                                      sysclk, SND_SOC_CLOCK_OUT);
--      if (ret < 0) {
--              dev_err(codec->dev,
--              "Failed to set WM8804 SYSCLK: %d\n", ret);
--              return ret;
--      }
--
--      /* Enable TX output */
--      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
--
--      /* Power on */
--      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
--
--      /* set sampling frequency status bits */
--      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
--
--      return snd_soc_dai_set_bclk_ratio(cpu_dai,64);
--}
--
--/* machine stream operations */
--static struct snd_soc_ops snd_rpi_boomberry_digi_ops = {
--      .hw_params = snd_rpi_boomberry_digi_hw_params,
--        .startup = snd_rpi_boomberry_digi_startup,
--        .shutdown = snd_rpi_boomberry_digi_shutdown,
--};
--
--static struct snd_soc_dai_link snd_rpi_boomberry_digi_dai[] = {
--{
--      .name           = "BoomBerry Digi",
--      .stream_name    = "BoomBerry Digi HiFi",
--      .cpu_dai_name   = "bcm2708-i2s.0",
--      .codec_dai_name = "wm8804-spdif",
--      .platform_name  = "bcm2708-i2s.0",
--      .codec_name     = "wm8804.1-003b",
--      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
--                              SND_SOC_DAIFMT_CBM_CFM,
--      .ops            = &snd_rpi_boomberry_digi_ops,
--      .init           = snd_rpi_boomberry_digi_init,
--},
--};
--
--/* audio machine driver */
--static struct snd_soc_card snd_rpi_boomberry_digi = {
--      .name         = "snd_rpi_boomberry_digi",
--      .owner        = THIS_MODULE,
--      .dai_link     = snd_rpi_boomberry_digi_dai,
--      .num_links    = ARRAY_SIZE(snd_rpi_boomberry_digi_dai),
--};
--
--static int snd_rpi_boomberry_digi_probe(struct platform_device *pdev)
--{
--      int ret = 0;
--
--      snd_rpi_boomberry_digi.dev = &pdev->dev;
--
--      if (pdev->dev.of_node) {
--          struct device_node *i2s_node;
--          struct snd_soc_dai_link *dai = &snd_rpi_boomberry_digi_dai[0];
--          i2s_node = of_parse_phandle(pdev->dev.of_node,
--                                      "i2s-controller", 0);
--
--          if (i2s_node) {
--                      dai->cpu_dai_name = NULL;
--                      dai->cpu_of_node = i2s_node;
--                      dai->platform_name = NULL;
--                      dai->platform_of_node = i2s_node;
--          }
--      }
--
--      ret = snd_soc_register_card(&snd_rpi_boomberry_digi);
--      if (ret)
--              dev_err(&pdev->dev,
--                      "snd_soc_register_card() failed: %d\n", ret);
--
--      return ret;
--}
--
--static int snd_rpi_boomberry_digi_remove(struct platform_device *pdev)
--{
--      return snd_soc_unregister_card(&snd_rpi_boomberry_digi);
--}
--
--static const struct of_device_id snd_rpi_boomberry_digi_of_match[] = {
--      { .compatible = "boomberry,boomberry-digi", },
--      {},
--};
--MODULE_DEVICE_TABLE(of, snd_rpi_boomberry_digi_of_match);
--
--static struct platform_driver snd_rpi_boomberry_digi_driver = {
--      .driver = {
--              .name   = "snd-rpi-boomberry-digi",
--              .owner  = THIS_MODULE,
--              .of_match_table = snd_rpi_boomberry_digi_of_match,
--      },
--      .probe          = snd_rpi_boomberry_digi_probe,
--      .remove         = snd_rpi_boomberry_digi_remove,
--};
--
--module_platform_driver(snd_rpi_boomberry_digi_driver);
--
--MODULE_AUTHOR("Milan Neskovic <info@boomberry.co>");
--MODULE_DESCRIPTION("ASoC Driver for BoomBerry PI Digi HAT Sound Card");
--MODULE_LICENSE("GPL v2");
---- /dev/null
-+++ b/sound/soc/bcm/justboom-dac.c
-@@ -0,0 +1,162 @@
-+/*
-+ * ASoC Driver for JustBoom DAC Raspberry Pi HAT Sound Card
-+ *
-+ * Author:    Milan Neskovic
-+ *            Copyright 2016
-+ *            based on code by Daniel Matuschek <info@crazy-audio.com>
-+ *            based on code by Florian Meier <florian.meier@koalo.de>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/jack.h>
-+
-+#include "../codecs/pcm512x.h"
-+
-+static bool digital_gain_0db_limit = true;
-+
-+static int snd_rpi_justboom_dac_init(struct snd_soc_pcm_runtime *rtd)
-+{
-+      struct snd_soc_codec *codec = rtd->codec;
-+      snd_soc_update_bits(codec, PCM512x_GPIO_EN, 0x08, 0x08);
-+      snd_soc_update_bits(codec, PCM512x_GPIO_OUTPUT_4, 0xf, 0x02);
-+      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
-+
-+      if (digital_gain_0db_limit)
-+      {
-+              int ret;
-+              struct snd_soc_card *card = rtd->card;
-+
-+              ret = snd_soc_limit_volume(card, "Digital Playback Volume", 207);
-+              if (ret < 0)
-+                      dev_warn(card->dev, "Failed to set volume limit: %d\n", ret);
-+      }
-+
-+      return 0;
-+}
-+
-+static int snd_rpi_justboom_dac_hw_params(struct snd_pcm_substream *substream,
-+                                     struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-+      /*return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);*/
-+      unsigned int sample_bits =
-+              snd_pcm_format_physical_width(params_format(params));
-+      return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
-+}
-+
-+static int snd_rpi_justboom_dac_startup(struct snd_pcm_substream *substream) {
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x08);
-+      return 0;
-+}
-+
-+static void snd_rpi_justboom_dac_shutdown(struct snd_pcm_substream *substream) {
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      snd_soc_update_bits(codec, PCM512x_GPIO_CONTROL_1, 0x08,0x00);
-+}
-+
-+/* machine stream operations */
-+static struct snd_soc_ops snd_rpi_justboom_dac_ops = {
-+      .hw_params = snd_rpi_justboom_dac_hw_params,
-+      .startup = snd_rpi_justboom_dac_startup,
-+      .shutdown = snd_rpi_justboom_dac_shutdown,
-+};
-+
-+static struct snd_soc_dai_link snd_rpi_justboom_dac_dai[] = {
-+{
-+      .name           = "JustBoom DAC",
-+      .stream_name    = "JustBoom DAC HiFi",
-+      .cpu_dai_name   = "bcm2708-i2s.0",
-+      .codec_dai_name = "pcm512x-hifi",
-+      .platform_name  = "bcm2708-i2s.0",
-+      .codec_name     = "pcm512x.1-004d",
-+      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
-+                              SND_SOC_DAIFMT_CBS_CFS,
-+      .ops            = &snd_rpi_justboom_dac_ops,
-+      .init           = snd_rpi_justboom_dac_init,
-+},
-+};
-+
-+/* audio machine driver */
-+static struct snd_soc_card snd_rpi_justboom_dac = {
-+      .name         = "snd_rpi_justboom_dac",
-+      .owner        = THIS_MODULE,
-+      .dai_link     = snd_rpi_justboom_dac_dai,
-+      .num_links    = ARRAY_SIZE(snd_rpi_justboom_dac_dai),
-+};
-+
-+static int snd_rpi_justboom_dac_probe(struct platform_device *pdev)
-+{
-+      int ret = 0;
-+
-+      snd_rpi_justboom_dac.dev = &pdev->dev;
-+
-+      if (pdev->dev.of_node) {
-+          struct device_node *i2s_node;
-+          struct snd_soc_dai_link *dai = &snd_rpi_justboom_dac_dai[0];
-+          i2s_node = of_parse_phandle(pdev->dev.of_node,
-+                                      "i2s-controller", 0);
-+
-+          if (i2s_node) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_node;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_node;
-+          }
-+
-+          digital_gain_0db_limit = !of_property_read_bool(
-+                      pdev->dev.of_node, "justboom,24db_digital_gain");
-+      }
-+
-+      ret = snd_soc_register_card(&snd_rpi_justboom_dac);
-+      if (ret)
-+              dev_err(&pdev->dev,
-+                      "snd_soc_register_card() failed: %d\n", ret);
-+
-+      return ret;
-+}
-+
-+static int snd_rpi_justboom_dac_remove(struct platform_device *pdev)
-+{
-+      return snd_soc_unregister_card(&snd_rpi_justboom_dac);
-+}
-+
-+static const struct of_device_id snd_rpi_justboom_dac_of_match[] = {
-+      { .compatible = "justboom,justboom-dac", },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, snd_rpi_justboom_dac_of_match);
-+
-+static struct platform_driver snd_rpi_justboom_dac_driver = {
-+      .driver = {
-+              .name   = "snd-rpi-justboom-dac",
-+              .owner  = THIS_MODULE,
-+              .of_match_table = snd_rpi_justboom_dac_of_match,
-+      },
-+      .probe          = snd_rpi_justboom_dac_probe,
-+      .remove         = snd_rpi_justboom_dac_remove,
-+};
-+
-+module_platform_driver(snd_rpi_justboom_dac_driver);
-+
-+MODULE_AUTHOR("Milan Neskovic <info@justboom.co>");
-+MODULE_DESCRIPTION("ASoC Driver for JustBoom PI DAC HAT Sound Card");
-+MODULE_LICENSE("GPL v2");
---- /dev/null
-+++ b/sound/soc/bcm/justboom-digi.c
-@@ -0,0 +1,215 @@
-+/*
-+ * ASoC Driver for JustBoom Raspberry Pi Digi HAT Sound Card
-+ *
-+ * Author:    Milan Neskovic
-+ *            Copyright 2016
-+ *            based on code by Daniel Matuschek <info@crazy-audio.com>
-+ *            based on code by Florian Meier <florian.meier@koalo.de>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/jack.h>
-+
-+#include "../codecs/wm8804.h"
-+
-+static int snd_rpi_justboom_digi_init(struct snd_soc_pcm_runtime *rtd)
-+{
-+      struct snd_soc_codec *codec = rtd->codec;
-+
-+      /* enable TX output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
-+
-+      return 0;
-+}
-+
-+static int snd_rpi_justboom_digi_startup(struct snd_pcm_substream *substream) {
-+      /* turn on digital output */
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
-+      return 0;
-+}
-+
-+static void snd_rpi_justboom_digi_shutdown(struct snd_pcm_substream *substream) {
-+      /* turn off output */
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
-+}
-+
-+static int snd_rpi_justboom_digi_hw_params(struct snd_pcm_substream *substream,
-+                                     struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai *codec_dai = rtd->codec_dai;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-+
-+      int sysclk = 27000000; /* This is fixed on this board */
-+
-+      long mclk_freq=0;
-+      int mclk_div=1;
-+      int sampling_freq=1;
-+
-+      int ret;
-+
-+      int samplerate = params_rate(params);
-+
-+      if (samplerate<=96000) {
-+              mclk_freq=samplerate*256;
-+              mclk_div=WM8804_MCLKDIV_256FS;
-+      } else {
-+              mclk_freq=samplerate*128;
-+              mclk_div=WM8804_MCLKDIV_128FS;
-+      }
-+
-+      switch (samplerate) {
-+              case 32000:
-+                      sampling_freq=0x03;
-+                      break;
-+              case 44100:
-+                      sampling_freq=0x00;
-+                      break;
-+              case 48000:
-+                      sampling_freq=0x02;
-+                      break;
-+              case 88200:
-+                      sampling_freq=0x08;
-+                      break;
-+              case 96000:
-+                      sampling_freq=0x0a;
-+                      break;
-+              case 176400:
-+                      sampling_freq=0x0c;
-+                      break;
-+              case 192000:
-+                      sampling_freq=0x0e;
-+                      break;
-+              default:
-+                      dev_err(codec->dev,
-+                      "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
-+                      samplerate);
-+      }
-+
-+      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
-+      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
-+
-+      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
-+                                      sysclk, SND_SOC_CLOCK_OUT);
-+      if (ret < 0) {
-+              dev_err(codec->dev,
-+              "Failed to set WM8804 SYSCLK: %d\n", ret);
-+              return ret;
-+      }
-+
-+      /* Enable TX output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
-+
-+      /* Power on */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
-+
-+      /* set sampling frequency status bits */
-+      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
-+
-+      return snd_soc_dai_set_bclk_ratio(cpu_dai,64);
-+}
-+
-+/* machine stream operations */
-+static struct snd_soc_ops snd_rpi_justboom_digi_ops = {
-+      .hw_params = snd_rpi_justboom_digi_hw_params,
-+        .startup = snd_rpi_justboom_digi_startup,
-+        .shutdown = snd_rpi_justboom_digi_shutdown,
-+};
-+
-+static struct snd_soc_dai_link snd_rpi_justboom_digi_dai[] = {
-+{
-+      .name           = "JustBoom Digi",
-+      .stream_name    = "JustBoom Digi HiFi",
-+      .cpu_dai_name   = "bcm2708-i2s.0",
-+      .codec_dai_name = "wm8804-spdif",
-+      .platform_name  = "bcm2708-i2s.0",
-+      .codec_name     = "wm8804.1-003b",
-+      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
-+                              SND_SOC_DAIFMT_CBM_CFM,
-+      .ops            = &snd_rpi_justboom_digi_ops,
-+      .init           = snd_rpi_justboom_digi_init,
-+},
-+};
-+
-+/* audio machine driver */
-+static struct snd_soc_card snd_rpi_justboom_digi = {
-+      .name         = "snd_rpi_justboom_digi",
-+      .owner        = THIS_MODULE,
-+      .dai_link     = snd_rpi_justboom_digi_dai,
-+      .num_links    = ARRAY_SIZE(snd_rpi_justboom_digi_dai),
-+};
-+
-+static int snd_rpi_justboom_digi_probe(struct platform_device *pdev)
-+{
-+      int ret = 0;
-+
-+      snd_rpi_justboom_digi.dev = &pdev->dev;
-+
-+      if (pdev->dev.of_node) {
-+          struct device_node *i2s_node;
-+          struct snd_soc_dai_link *dai = &snd_rpi_justboom_digi_dai[0];
-+          i2s_node = of_parse_phandle(pdev->dev.of_node,
-+                                      "i2s-controller", 0);
-+
-+          if (i2s_node) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_node;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_node;
-+          }
-+      }
-+
-+      ret = snd_soc_register_card(&snd_rpi_justboom_digi);
-+      if (ret)
-+              dev_err(&pdev->dev,
-+                      "snd_soc_register_card() failed: %d\n", ret);
-+
-+      return ret;
-+}
-+
-+static int snd_rpi_justboom_digi_remove(struct platform_device *pdev)
-+{
-+      return snd_soc_unregister_card(&snd_rpi_justboom_digi);
-+}
-+
-+static const struct of_device_id snd_rpi_justboom_digi_of_match[] = {
-+      { .compatible = "justboom,justboom-digi", },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, snd_rpi_justboom_digi_of_match);
-+
-+static struct platform_driver snd_rpi_justboom_digi_driver = {
-+      .driver = {
-+              .name   = "snd-rpi-justboom-digi",
-+              .owner  = THIS_MODULE,
-+              .of_match_table = snd_rpi_justboom_digi_of_match,
-+      },
-+      .probe          = snd_rpi_justboom_digi_probe,
-+      .remove         = snd_rpi_justboom_digi_remove,
-+};
-+
-+module_platform_driver(snd_rpi_justboom_digi_driver);
-+
-+MODULE_AUTHOR("Milan Neskovic <info@justboom.co>");
-+MODULE_DESCRIPTION("ASoC Driver for JustBoom PI Digi HAT Sound Card");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0368-Add-dt-param-to-force-HiFiBerry-DAC-Pro-into-slave-m.patch b/target/linux/brcm2708/patches-4.4/0368-Add-dt-param-to-force-HiFiBerry-DAC-Pro-into-slave-m.patch
new file mode 100644 (file)
index 0000000..11019f2
--- /dev/null
@@ -0,0 +1,82 @@
+From 23a2a66f68d9cef1664e904b741e074dab5b82d6 Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Sun, 29 May 2016 05:22:29 +0100
+Subject: [PATCH] Add dt param to force HiFiBerry DAC+ Pro into slave mode
+
+"dtoverlay=hifiberry-dacplus,slave"
+
+Add 'slave' param to use HiFiBerry DAC+ Pro in slave mode,
+with Pi as master for bit and frame clock.
+
+Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+---
+ arch/arm/boot/dts/overlays/README                        |  2 ++
+ arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts |  6 ++++--
+ sound/soc/bcm/hifiberry_dacplus.c                        | 10 ++++++++--
+ 3 files changed, 14 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -344,6 +344,8 @@ Params: 24db_digital_gain       Allow ga
+                                 responsibility of the user to ensure that
+                                 the Digital volume control is set to a value
+                                 that does not result in clipping/distortion!)
++        slave                   Force DAC+ Pro into slave mode, using Pi as
++                                master for bit clock and frame clock.
+ Name:   hifiberry-digi
+--- a/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts
++++ b/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts
+@@ -41,7 +41,7 @@
+       fragment@3 {
+               target = <&sound>;
+-              frag3: __overlay__ {
++              hifiberry_dacplus: __overlay__ {
+                       compatible = "hifiberry,hifiberry-dacplus";
+                       i2s-controller = <&i2s>;
+                       status = "okay";
+@@ -49,6 +49,8 @@
+       };
+       __overrides__ {
+-              24db_digital_gain = <&frag3>,"hifiberry,24db_digital_gain?";
++              24db_digital_gain =
++                      <&hifiberry_dacplus>,"hifiberry,24db_digital_gain?";
++              slave = <&hifiberry_dacplus>,"hifiberry-dacplus,slave?";
+       };
+ };
+--- a/sound/soc/bcm/hifiberry_dacplus.c
++++ b/sound/soc/bcm/hifiberry_dacplus.c
+@@ -47,6 +47,7 @@ struct pcm512x_priv {
+ /* Clock rate of CLK48EN attached to GPIO3 pin */
+ #define CLK_48EN_RATE 24576000UL
++static bool slave;
+ static bool snd_rpi_hifiberry_is_dacpro;
+ static bool digital_gain_0db_limit = true;
+@@ -145,8 +146,11 @@ static int snd_rpi_hifiberry_dacplus_ini
+       struct snd_soc_codec *codec = rtd->codec;
+       struct pcm512x_priv *priv;
+-      snd_rpi_hifiberry_is_dacpro
+-              = snd_rpi_hifiberry_dacplus_is_pro_card(codec);
++      if (slave)
++              snd_rpi_hifiberry_is_dacpro = false;
++      else
++              snd_rpi_hifiberry_is_dacpro =
++                              snd_rpi_hifiberry_dacplus_is_pro_card(codec);
+       if (snd_rpi_hifiberry_is_dacpro) {
+               struct snd_soc_dai_link *dai = rtd->dai_link;
+@@ -314,6 +318,8 @@ static int snd_rpi_hifiberry_dacplus_pro
+               digital_gain_0db_limit = !of_property_read_bool(
+                       pdev->dev.of_node, "hifiberry,24db_digital_gain");
++              slave = of_property_read_bool(pdev->dev.of_node,
++                                              "hifiberry-dacplus,slave");
+       }
+       ret = snd_soc_register_card(&snd_rpi_hifiberry_dacplus);
diff --git a/target/linux/brcm2708/patches-4.4/0369-Add-dt-param-to-force-HiFiBerry-DAC-Pro-into-slave-m.patch b/target/linux/brcm2708/patches-4.4/0369-Add-dt-param-to-force-HiFiBerry-DAC-Pro-into-slave-m.patch
deleted file mode 100644 (file)
index 920199f..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-From e4183dfba92b3adf88a9be7e073cf80c5bda2c69 Mon Sep 17 00:00:00 2001
-From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
-Date: Sun, 29 May 2016 05:22:29 +0100
-Subject: [PATCH 369/423] Add dt param to force HiFiBerry DAC+ Pro into slave
- mode
-
-"dtoverlay=hifiberry-dacplus,slave"
-
-Add 'slave' param to use HiFiBerry DAC+ Pro in slave mode,
-with Pi as master for bit and frame clock.
-
-Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
----
- arch/arm/boot/dts/overlays/README                        |  2 ++
- arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts |  6 ++++--
- sound/soc/bcm/hifiberry_dacplus.c                        | 10 ++++++++--
- 3 files changed, 14 insertions(+), 4 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -344,6 +344,8 @@ Params: 24db_digital_gain       Allow ga
-                                 responsibility of the user to ensure that
-                                 the Digital volume control is set to a value
-                                 that does not result in clipping/distortion!)
-+        slave                   Force DAC+ Pro into slave mode, using Pi as
-+                                master for bit clock and frame clock.
- Name:   hifiberry-digi
---- a/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts
-@@ -41,7 +41,7 @@
-       fragment@3 {
-               target = <&sound>;
--              frag3: __overlay__ {
-+              hifiberry_dacplus: __overlay__ {
-                       compatible = "hifiberry,hifiberry-dacplus";
-                       i2s-controller = <&i2s>;
-                       status = "okay";
-@@ -49,6 +49,8 @@
-       };
-       __overrides__ {
--              24db_digital_gain = <&frag3>,"hifiberry,24db_digital_gain?";
-+              24db_digital_gain =
-+                      <&hifiberry_dacplus>,"hifiberry,24db_digital_gain?";
-+              slave = <&hifiberry_dacplus>,"hifiberry-dacplus,slave?";
-       };
- };
---- a/sound/soc/bcm/hifiberry_dacplus.c
-+++ b/sound/soc/bcm/hifiberry_dacplus.c
-@@ -47,6 +47,7 @@ struct pcm512x_priv {
- /* Clock rate of CLK48EN attached to GPIO3 pin */
- #define CLK_48EN_RATE 24576000UL
-+static bool slave;
- static bool snd_rpi_hifiberry_is_dacpro;
- static bool digital_gain_0db_limit = true;
-@@ -145,8 +146,11 @@ static int snd_rpi_hifiberry_dacplus_ini
-       struct snd_soc_codec *codec = rtd->codec;
-       struct pcm512x_priv *priv;
--      snd_rpi_hifiberry_is_dacpro
--              = snd_rpi_hifiberry_dacplus_is_pro_card(codec);
-+      if (slave)
-+              snd_rpi_hifiberry_is_dacpro = false;
-+      else
-+              snd_rpi_hifiberry_is_dacpro =
-+                              snd_rpi_hifiberry_dacplus_is_pro_card(codec);
-       if (snd_rpi_hifiberry_is_dacpro) {
-               struct snd_soc_dai_link *dai = rtd->dai_link;
-@@ -314,6 +318,8 @@ static int snd_rpi_hifiberry_dacplus_pro
-               digital_gain_0db_limit = !of_property_read_bool(
-                       pdev->dev.of_node, "hifiberry,24db_digital_gain");
-+              slave = of_property_read_bool(pdev->dev.of_node,
-+                                              "hifiberry-dacplus,slave");
-       }
-       ret = snd_soc_register_card(&snd_rpi_hifiberry_dacplus);
diff --git a/target/linux/brcm2708/patches-4.4/0369-simple-add-sound-dai-cells-to-I2S-def.patch b/target/linux/brcm2708/patches-4.4/0369-simple-add-sound-dai-cells-to-I2S-def.patch
new file mode 100644 (file)
index 0000000..464bd2c
--- /dev/null
@@ -0,0 +1,33 @@
+From 488b8934b1f8c36a86570c6d6215404a2508cf5d Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Thu, 19 May 2016 00:00:00 +0100
+Subject: [PATCH] simple: add sound-dai-cells to I2S def
+
+Add '#sound-dai-cells = <0>;' to the I2S definition in
+bcm2708_common.dtsi
+
+Not having it specified, whilst not causing an issue right now with
+rpi-4.4.y, is going to cause an issue going forward with the use of
+simple-card driver. So it doesn't fall through the cracks, patch it
+in now.
+
+Hopefully Martin has taken care of getting a patch submitted for the
+upstream Pi dts, as it was he who first run into the issue with the
+current upstream kernel....
+https://github.com/msperl/linux-rpi/issues/3#issue-154916615
+
+Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -137,6 +137,7 @@
+               i2s: i2s@7e203000 {
+                       compatible = "brcm,bcm2835-i2s";
++                      #sound-dai-cells = <0>;
+                       reg = <0x7e203000 0x24>,
+                             <0x7e101098 0x08>;
diff --git a/target/linux/brcm2708/patches-4.4/0370-BCM2835-V4L2-Increase-minimum-resolution-to-32x32.patch b/target/linux/brcm2708/patches-4.4/0370-BCM2835-V4L2-Increase-minimum-resolution-to-32x32.patch
new file mode 100644 (file)
index 0000000..02df95d
--- /dev/null
@@ -0,0 +1,31 @@
+From 23573e4540b9de3c8506fa26956815fc0d71fb75 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <6by9@users.noreply.github.com>
+Date: Tue, 31 May 2016 10:38:31 +0100
+Subject: [PATCH] BCM2835-V4L2: Increase minimum resolution to 32x32
+
+https://github.com/raspberrypi/linux/issues/1498 showed
+up that 16x16 is failing to work on the GPU for some reason.
+
+GPU bug being tracked on
+https://github.com/raspberrypi/firmware/issues/607
+Workaround here by increasing minimum resolution via V4L2
+to 32x32.
+
+Signed-off-by: Dave Stevenson <6by9@users.noreply.github.com>
+---
+ drivers/media/platform/bcm2835/bcm2835-camera.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/media/platform/bcm2835/bcm2835-camera.c
++++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
+@@ -36,8 +36,8 @@
+ #define BM2835_MMAL_VERSION "0.0.2"
+ #define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2"
+-#define MIN_WIDTH 16
+-#define MIN_HEIGHT 16
++#define MIN_WIDTH 32
++#define MIN_HEIGHT 32
+ #define MIN_BUFFER_SIZE (80*1024)
+ #define MAX_VIDEO_MODE_WIDTH 1280
diff --git a/target/linux/brcm2708/patches-4.4/0370-simple-add-sound-dai-cells-to-I2S-def.patch b/target/linux/brcm2708/patches-4.4/0370-simple-add-sound-dai-cells-to-I2S-def.patch
deleted file mode 100644 (file)
index f84b7b8..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From b035bb68499b1b100f3f06c76fc1ad7f10953f19 Mon Sep 17 00:00:00 2001
-From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
-Date: Thu, 19 May 2016 00:00:00 +0100
-Subject: [PATCH 370/423] simple: add sound-dai-cells to I2S def
-
-Add '#sound-dai-cells = <0>;' to the I2S definition in
-bcm2708_common.dtsi
-
-Not having it specified, whilst not causing an issue right now with
-rpi-4.4.y, is going to cause an issue going forward with the use of
-simple-card driver. So it doesn't fall through the cracks, patch it
-in now.
-
-Hopefully Martin has taken care of getting a patch submitted for the
-upstream Pi dts, as it was he who first run into the issue with the
-current upstream kernel....
-https://github.com/msperl/linux-rpi/issues/3#issue-154916615
-
-Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
----
- arch/arm/boot/dts/bcm2708_common.dtsi | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/boot/dts/bcm2708_common.dtsi
-+++ b/arch/arm/boot/dts/bcm2708_common.dtsi
-@@ -137,6 +137,7 @@
-               i2s: i2s@7e203000 {
-                       compatible = "brcm,bcm2835-i2s";
-+                      #sound-dai-cells = <0>;
-                       reg = <0x7e203000 0x24>,
-                             <0x7e101098 0x08>;
diff --git a/target/linux/brcm2708/patches-4.4/0371-BCM2835-V4L2-Increase-minimum-resolution-to-32x32.patch b/target/linux/brcm2708/patches-4.4/0371-BCM2835-V4L2-Increase-minimum-resolution-to-32x32.patch
deleted file mode 100644 (file)
index 3dfe037..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From 85e7cbd400714fff019db2d1ec7eb500a6bbc0ba Mon Sep 17 00:00:00 2001
-From: Dave Stevenson <6by9@users.noreply.github.com>
-Date: Tue, 31 May 2016 10:38:31 +0100
-Subject: [PATCH 371/423] BCM2835-V4L2: Increase minimum resolution to 32x32
-
-https://github.com/raspberrypi/linux/issues/1498 showed
-up that 16x16 is failing to work on the GPU for some reason.
-
-GPU bug being tracked on
-https://github.com/raspberrypi/firmware/issues/607
-Workaround here by increasing minimum resolution via V4L2
-to 32x32.
-
-Signed-off-by: Dave Stevenson <6by9@users.noreply.github.com>
----
- drivers/media/platform/bcm2835/bcm2835-camera.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/media/platform/bcm2835/bcm2835-camera.c
-+++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
-@@ -36,8 +36,8 @@
- #define BM2835_MMAL_VERSION "0.0.2"
- #define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2"
--#define MIN_WIDTH 16
--#define MIN_HEIGHT 16
-+#define MIN_WIDTH 32
-+#define MIN_HEIGHT 32
- #define MIN_BUFFER_SIZE (80*1024)
- #define MAX_VIDEO_MODE_WIDTH 1280
diff --git a/target/linux/brcm2708/patches-4.4/0371-config-Add-support-for-Logitech-Rumblepad.patch b/target/linux/brcm2708/patches-4.4/0371-config-Add-support-for-Logitech-Rumblepad.patch
new file mode 100644 (file)
index 0000000..3aa98a4
--- /dev/null
@@ -0,0 +1,36 @@
+From 339b9cfaae888619c7c84c18c148a48baadddc2d Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 27 May 2016 18:23:51 +0100
+Subject: [PATCH] config: Add support for Logitech Rumblepad
+
+---
+ arch/arm/configs/bcm2709_defconfig | 4 ++++
+ arch/arm/configs/bcmrpi_defconfig  | 4 ++++
+ 2 files changed, 8 insertions(+)
+
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -896,6 +896,10 @@ CONFIG_HID_TWINHAN=m
+ CONFIG_HID_KENSINGTON=m
+ CONFIG_HID_LCPOWER=m
+ CONFIG_HID_LOGITECH=m
++CONFIG_HID_LOGITECH_DJ=m
++CONFIG_LOGITECH_FF=y
++CONFIG_LOGIRUMBLEPAD2_FF=y
++CONFIG_LOGIG940_FF=y
+ CONFIG_HID_MAGICMOUSE=m
+ CONFIG_HID_MICROSOFT=m
+ CONFIG_HID_MONTEREY=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -888,6 +888,10 @@ CONFIG_HID_TWINHAN=m
+ CONFIG_HID_KENSINGTON=m
+ CONFIG_HID_LCPOWER=m
+ CONFIG_HID_LOGITECH=m
++CONFIG_HID_LOGITECH_DJ=m
++CONFIG_LOGITECH_FF=y
++CONFIG_LOGIRUMBLEPAD2_FF=y
++CONFIG_LOGIG940_FF=y
+ CONFIG_HID_MAGICMOUSE=m
+ CONFIG_HID_MICROSOFT=m
+ CONFIG_HID_MONTEREY=m
diff --git a/target/linux/brcm2708/patches-4.4/0372-New-driver-for-RRA-DigiDAC1-soundcard-using-WM8741-W.patch b/target/linux/brcm2708/patches-4.4/0372-New-driver-for-RRA-DigiDAC1-soundcard-using-WM8741-W.patch
new file mode 100644 (file)
index 0000000..303d45d
--- /dev/null
@@ -0,0 +1,602 @@
+From bcba10e5c5da279fa57920ee1c08ee1dea84a4f6 Mon Sep 17 00:00:00 2001
+From: escalator2015 <jmtasende@gmail.com>
+Date: Tue, 24 May 2016 16:20:09 +0100
+Subject: [PATCH] New driver for RRA DigiDAC1 soundcard using WM8741 + WM8804
+
+---
+ arch/arm/boot/dts/overlays/Makefile                |   1 +
+ arch/arm/boot/dts/overlays/README                  |   6 +
+ .../overlays/rra-digidac1-wm8741-audio-overlay.dts |  81 ++++
+ arch/arm/configs/bcm2709_defconfig                 |   1 +
+ arch/arm/configs/bcmrpi_defconfig                  |   1 +
+ sound/soc/bcm/Kconfig                              |   8 +
+ sound/soc/bcm/Makefile                             |   2 +
+ sound/soc/bcm/digidac1-soundcard.c                 | 422 +++++++++++++++++++++
+ 8 files changed, 522 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts
+ create mode 100644 sound/soc/bcm/digidac1-soundcard.c
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -67,6 +67,7 @@ dtbo-$(RPI_DT_OVERLAYS) += rpi-display.d
+ 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) += rra-digidac1-wm8741-audio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio-1bit.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -842,6 +842,12 @@ Load:   dtoverlay=rpi-sense
+ Params: <None>
++Name:   rra-digidac1-wm8741-audio
++Info:   Configures the Red Rocks Audio DigiDAC1 soundcard
++Load:   dtoverlay=rra-digidac1-wm8741-audio
++Params: <None>
++
++
+ Name:   sdhost
+ Info:   Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock.
+         N.B. This overlay is designed for situations where the mmc driver is
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts
+@@ -0,0 +1,81 @@
++// Definitions for RRA DigiDAC1 Audio card
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target-path = "/";
++              __overlay__ {
++                      aliases {
++                              ldo0 = &ldo0;
++                              ldo1 = &ldo1;
++                      };
++              };
++      };
++
++      fragment@1 {
++              target-path = "/soc";
++              __overlay__ {
++
++                      ldo1: ldo1 {
++                              compatible = "regulator-fixed";
++                              regulator-name = "DC_5V";
++                              regulator-min-microvolt = <5000000>;
++                              regulator-max-microvolt = <5000000>;
++                              regulator-always-on;
++                      };
++
++                      ldo0: ldo0 {
++                              compatible = "regulator-fixed";
++                              regulator-name = "DC_3V3";
++                              regulator-min-microvolt = <3300000>;
++                              regulator-max-microvolt = <3300000>;
++                              regulator-always-on;
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@3 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      wm8804@3b {
++                              #sound-dai-cells = <0>;
++                              compatible = "wlf,wm8804";
++                              reg = <0x3b>;
++                              status = "okay";
++                              PVDD-supply = <&ldo0>;
++                              DVDD-supply = <&ldo0>;
++                      };
++
++                      wm8742: wm8741@1a {
++                              compatible = "wlf,wm8741";
++                              reg = <0x1a>;
++                              status = "okay";
++                              AVDD-supply = <&ldo1>;
++                              DVDD-supply = <&ldo0>;
++                      };
++              };
++      };
++
++      fragment@4 {
++              target = <&sound>;
++              __overlay__ {
++                      compatible = "rra,digidac1-soundcard";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -866,6 +866,7 @@ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
++CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+ CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -858,6 +858,7 @@ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
++CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+ CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -92,3 +92,11 @@ config SND_AUDIOINJECTOR_PI_SOUNDCARD
+       select SND_SOC_WM8731
+       help
+         Say Y or M if you want to add support for audioinjector.net Pi Hat
++
++config SND_DIGIDAC1_SOUNDCARD
++        tristate "Support for Red Rocks Audio DigiDAC1"
++        depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
++        select SND_SOC_WM8804
++        select SND_SOC_WM8741
++        help
++         Say Y or M if you want to add support for Red Rocks Audio DigiDAC1 board.
+--- a/sound/soc/bcm/Makefile
++++ b/sound/soc/bcm/Makefile
+@@ -16,6 +16,7 @@ snd-soc-rpi-proto-objs := rpi-proto.o
+ snd-soc-iqaudio-dac-objs := iqaudio-dac.o
+ snd-soc-raspidac3-objs := raspidac3.o
+ snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
++snd-soc-digidac1-soundcard-objs := digidac1-soundcard.o
+ obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
+@@ -29,4 +30,5 @@ obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO)
+ obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
+ obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
+ obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
++obj-$(CONFIG_SND_DIGIDAC1_SOUNDCARD) += snd-soc-digidac1-soundcard.o
+--- /dev/null
++++ b/sound/soc/bcm/digidac1-soundcard.c
+@@ -0,0 +1,422 @@
++/*
++ * ASoC Driver for RRA DigiDAC1
++ * Copyright 2016
++ * Author: José M. Tasende <vintage@redrocksaudio.es>
++ * based on the HifiBerry DAC driver by Florian Meier <florian.meier@koalo.de>
++ * and the Wolfson card driver by Nikesh Oswal, <Nikesh.Oswal@wolfsonmicro.com>
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/i2c.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/jack.h>
++#include <sound/soc-dapm.h>
++#include <sound/tlv.h>
++#include <linux/regulator/consumer.h>
++
++#include "../codecs/wm8804.h"
++#include "../codecs/wm8741.h"
++
++#define WM8741_NUM_SUPPLIES 2
++
++/* codec private data */
++struct wm8741_priv {
++      struct wm8741_platform_data pdata;
++      struct regmap *regmap;
++      struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES];
++      unsigned int sysclk;
++      const struct snd_pcm_hw_constraint_list *sysclk_constraints;
++};
++
++static int samplerate = 44100;
++
++/* New Alsa Controls not exposed by original wm8741 codec driver      */
++/* in actual driver the att. adjustment is wrong because              */
++/* this DAC has a coarse attenuation register with 4dB steps          */
++/* and a fine level register with 0.125dB steps                               */
++/* each register has 32 steps so combining both we have       1024 steps      */
++/* of 0.125 dB.                                                               */
++/* The original level controls from driver are removed at startup     */
++/* and replaced by the corrected ones.                                        */
++/* The same wm8741 driver can be used for wm8741 and wm8742 devices   */
++
++static const DECLARE_TLV_DB_SCALE(dac_tlv_fine, 0, 13, 0);
++static const DECLARE_TLV_DB_SCALE(dac_tlv_coarse, -12700, 400, 1);
++static const char *w8741_dither[4] = {"Off", "RPDF", "TPDF", "HPDF"};
++static const char *w8741_filter[5] = {
++              "Type 1", "Type 2", "Type 3", "Type 4", "Type 5"};
++static const char *w8741_switch[2] = {"Off", "On"};
++static const struct soc_enum w8741_enum[] = {
++SOC_ENUM_SINGLE(WM8741_MODE_CONTROL_2, 0, 4, w8741_dither),/* dithering type */
++SOC_ENUM_SINGLE(WM8741_FILTER_CONTROL, 0, 5, w8741_filter),/* filter type */
++SOC_ENUM_SINGLE(WM8741_FORMAT_CONTROL, 6, 2, w8741_switch),/* phase invert */
++SOC_ENUM_SINGLE(WM8741_VOLUME_CONTROL, 0, 2, w8741_switch),/* volume ramp */
++SOC_ENUM_SINGLE(WM8741_VOLUME_CONTROL, 3, 2, w8741_switch),/* soft mute */
++};
++
++static const struct snd_kcontrol_new w8741_snd_controls_stereo[] = {
++SOC_DOUBLE_R_TLV("DAC Fine Playback Volume", WM8741_DACLLSB_ATTENUATION,
++              WM8741_DACRLSB_ATTENUATION, 0, 31, 1, dac_tlv_fine),
++SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8741_DACLMSB_ATTENUATION,
++              WM8741_DACRMSB_ATTENUATION, 0, 31, 1, dac_tlv_coarse),
++SOC_ENUM("DAC Dither", w8741_enum[0]),
++SOC_ENUM("DAC Digital Filter", w8741_enum[1]),
++SOC_ENUM("DAC Phase Invert", w8741_enum[2]),
++SOC_ENUM("DAC Volume Ramp", w8741_enum[3]),
++SOC_ENUM("DAC Soft Mute", w8741_enum[4]),
++};
++
++static const struct snd_kcontrol_new w8741_snd_controls_mono_left[] = {
++SOC_SINGLE_TLV("DAC Fine Playback Volume", WM8741_DACLLSB_ATTENUATION,
++              0, 31, 0, dac_tlv_fine),
++SOC_SINGLE_TLV("Digital Playback Volume", WM8741_DACLMSB_ATTENUATION,
++              0, 31, 1, dac_tlv_coarse),
++SOC_ENUM("DAC Dither", w8741_enum[0]),
++SOC_ENUM("DAC Digital Filter", w8741_enum[1]),
++SOC_ENUM("DAC Phase Invert", w8741_enum[2]),
++SOC_ENUM("DAC Volume Ramp", w8741_enum[3]),
++SOC_ENUM("DAC Soft Mute", w8741_enum[4]),
++};
++
++static const struct snd_kcontrol_new w8741_snd_controls_mono_right[] = {
++SOC_SINGLE_TLV("DAC Fine Playback Volume", WM8741_DACRLSB_ATTENUATION,
++      0, 31, 0, dac_tlv_fine),
++SOC_SINGLE_TLV("Digital Playback Volume", WM8741_DACRMSB_ATTENUATION,
++      0, 31, 1, dac_tlv_coarse),
++SOC_ENUM("DAC Dither", w8741_enum[0]),
++SOC_ENUM("DAC Digital Filter", w8741_enum[1]),
++SOC_ENUM("DAC Phase Invert", w8741_enum[2]),
++SOC_ENUM("DAC Volume Ramp", w8741_enum[3]),
++SOC_ENUM("DAC Soft Mute", w8741_enum[4]),
++};
++
++static int w8741_add_controls(struct snd_soc_codec *codec)
++{
++      struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
++
++      switch (wm8741->pdata.diff_mode) {
++      case WM8741_DIFF_MODE_STEREO:
++      case WM8741_DIFF_MODE_STEREO_REVERSED:
++              snd_soc_add_codec_controls(codec,
++                              w8741_snd_controls_stereo,
++                              ARRAY_SIZE(w8741_snd_controls_stereo));
++              break;
++      case WM8741_DIFF_MODE_MONO_LEFT:
++              snd_soc_add_codec_controls(codec,
++                              w8741_snd_controls_mono_left,
++                              ARRAY_SIZE(w8741_snd_controls_mono_left));
++              break;
++      case WM8741_DIFF_MODE_MONO_RIGHT:
++              snd_soc_add_codec_controls(codec,
++                              w8741_snd_controls_mono_right,
++                              ARRAY_SIZE(w8741_snd_controls_mono_right));
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      return 0;
++}
++
++static int digidac1_soundcard_init(struct snd_soc_pcm_runtime *rtd)
++{
++      struct snd_soc_codec *codec = rtd->codec;
++      struct snd_soc_card *card = rtd->card;
++      struct snd_soc_pcm_runtime *wm8741_rtd;
++      struct snd_soc_codec *wm8741_codec;
++      struct snd_card *sound_card = card->snd_card;
++      struct snd_kcontrol *kctl;
++      int ret;
++
++      wm8741_rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
++      if (!wm8741_rtd) {
++              dev_warn(card->dev, "digidac1_soundcard_init: couldn't get wm8741 rtd\n");
++              return -EFAULT;
++      }
++      wm8741_codec = wm8741_rtd->codec;
++      ret = w8741_add_controls(wm8741_codec);
++      if (ret < 0)
++              dev_warn(card->dev, "Failed to add new wm8741 controls: %d\n",
++              ret);
++
++      /* enable TX output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++
++      kctl = snd_soc_card_get_kcontrol(card,
++              "Playback Volume");
++      if (kctl) {
++              kctl->vd[0].access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
++              snd_ctl_remove(sound_card, kctl);
++              }
++      kctl = snd_soc_card_get_kcontrol(card,
++              "Fine Playback Volume");
++      if (kctl) {
++              kctl->vd[0].access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
++              snd_ctl_remove(sound_card, kctl);
++              }
++      return 0;
++}
++
++static int digidac1_soundcard_startup(struct snd_pcm_substream *substream)
++{
++      /* turn on wm8804 digital output */
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++      struct snd_soc_card *card = rtd->card;
++      struct snd_soc_pcm_runtime *wm8741_rtd;
++      struct snd_soc_codec *wm8741_codec;
++
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
++      wm8741_rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
++      if (!wm8741_rtd) {
++              dev_warn(card->dev, "digidac1_soundcard_startup: couldn't get WM8741 rtd\n");
++              return -EFAULT;
++      }
++      wm8741_codec = wm8741_rtd->codec;
++
++      /* latch wm8741 level */
++      snd_soc_update_bits(wm8741_codec, WM8741_DACLLSB_ATTENUATION,
++              WM8741_UPDATELL, WM8741_UPDATELL);
++      snd_soc_update_bits(wm8741_codec, WM8741_DACLMSB_ATTENUATION,
++              WM8741_UPDATELM, WM8741_UPDATELM);
++      snd_soc_update_bits(wm8741_codec, WM8741_DACRLSB_ATTENUATION,
++              WM8741_UPDATERL, WM8741_UPDATERL);
++      snd_soc_update_bits(wm8741_codec, WM8741_DACRMSB_ATTENUATION,
++              WM8741_UPDATERM, WM8741_UPDATERM);
++
++      return 0;
++}
++
++static void digidac1_soundcard_shutdown(struct snd_pcm_substream *substream)
++{
++      /* turn off wm8804 digital output */
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
++}
++
++static int digidac1_soundcard_hw_params(struct snd_pcm_substream *substream,
++                                     struct snd_pcm_hw_params *params)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_dai *codec_dai = rtd->codec_dai;
++      struct snd_soc_codec *codec = rtd->codec;
++      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
++      struct snd_soc_card *card = rtd->card;
++      struct snd_soc_pcm_runtime *wm8741_rtd;
++      struct snd_soc_codec *wm8741_codec;
++
++      int sysclk = 27000000;
++      long mclk_freq = 0;
++      int mclk_div = 1;
++      int sampling_freq = 1;
++      int ret;
++
++      wm8741_rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
++      if (!wm8741_rtd) {
++              dev_warn(card->dev, "digidac1_soundcard_hw_params: couldn't get WM8741 rtd\n");
++              return -EFAULT;
++      }
++      wm8741_codec = wm8741_rtd->codec;
++      samplerate = params_rate(params);
++
++      if (samplerate <= 96000) {
++              mclk_freq = samplerate*256;
++              mclk_div = WM8804_MCLKDIV_256FS;
++      } else {
++              mclk_freq = samplerate*128;
++              mclk_div = WM8804_MCLKDIV_128FS;
++              }
++
++      switch (samplerate) {
++      case 32000:
++              sampling_freq = 0x03;
++              break;
++      case 44100:
++              sampling_freq = 0x00;
++              break;
++      case 48000:
++              sampling_freq = 0x02;
++              break;
++      case 88200:
++              sampling_freq = 0x08;
++              break;
++      case 96000:
++              sampling_freq = 0x0a;
++              break;
++      case 176400:
++              sampling_freq = 0x0c;
++              break;
++      case 192000:
++              sampling_freq = 0x0e;
++              break;
++      default:
++              dev_err(codec->dev,
++              "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
++              samplerate);
++      }
++
++      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
++      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
++
++      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
++              sysclk, SND_SOC_CLOCK_OUT);
++      if (ret < 0) {
++              dev_err(codec->dev,
++              "Failed to set WM8804 SYSCLK: %d\n", ret);
++              return ret;
++      }
++      /* Enable wm8804 TX output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++
++      /* wm8804 Power on */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
++
++      /* wm8804 set sampling frequency status bits */
++      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
++
++      /* Now update wm8741 registers for the correct oversampling */
++      if (samplerate <= 48000)
++              snd_soc_update_bits(wm8741_codec, WM8741_MODE_CONTROL_1,
++               WM8741_OSR_MASK, 0x00);
++      else if (samplerate <= 96000)
++              snd_soc_update_bits(wm8741_codec, WM8741_MODE_CONTROL_1,
++               WM8741_OSR_MASK, 0x20);
++      else
++              snd_soc_update_bits(wm8741_codec, WM8741_MODE_CONTROL_1,
++               WM8741_OSR_MASK, 0x40);
++
++      /* wm8741 bit size */
++      switch (params_width(params)) {
++      case 16:
++              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
++               WM8741_IWL_MASK, 0x00);
++              break;
++      case 20:
++              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
++               WM8741_IWL_MASK, 0x01);
++              break;
++      case 24:
++              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
++               WM8741_IWL_MASK, 0x02);
++              break;
++      case 32:
++              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
++               WM8741_IWL_MASK, 0x03);
++              break;
++      default:
++              dev_dbg(codec->dev, "wm8741_hw_params:    Unsupported bit size param = %d",
++                      params_width(params));
++              return -EINVAL;
++      }
++
++      return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);
++}
++/* machine stream operations */
++static struct snd_soc_ops digidac1_soundcard_ops = {
++      .hw_params      = digidac1_soundcard_hw_params,
++      .startup        = digidac1_soundcard_startup,
++      .shutdown       = digidac1_soundcard_shutdown,
++};
++
++static struct snd_soc_dai_link digidac1_soundcard_dai[] = {
++      {
++      .name           = "RRA DigiDAC1",
++      .stream_name    = "RRA DigiDAC1 HiFi",
++      .cpu_dai_name   = "bcm2708-i2s.0",
++      .codec_dai_name = "wm8804-spdif",
++      .platform_name  = "bcm2708-i2s.0",
++      .codec_name     = "wm8804.1-003b",
++      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
++                              SND_SOC_DAIFMT_CBM_CFM,
++      .ops            = &digidac1_soundcard_ops,
++      .init           = digidac1_soundcard_init,
++      },
++      {
++      .name           = "RRA DigiDAC11",
++      .stream_name    = "RRA DigiDAC11 HiFi",
++      .cpu_dai_name   = "wm8804-spdif",
++      .codec_dai_name = "wm8741",
++      .codec_name     = "wm8741.1-001a",
++      .dai_fmt        = SND_SOC_DAIFMT_I2S
++                      | SND_SOC_DAIFMT_NB_NF
++                      | SND_SOC_DAIFMT_CBS_CFS,
++      },
++};
++
++/* audio machine driver */
++static struct snd_soc_card digidac1_soundcard = {
++      .name           = "digidac1-soundcard",
++      .owner          = THIS_MODULE,
++      .dai_link       = digidac1_soundcard_dai,
++      .num_links      = ARRAY_SIZE(digidac1_soundcard_dai),
++};
++
++static int digidac1_soundcard_probe(struct platform_device *pdev)
++{
++      int ret = 0;
++
++      digidac1_soundcard.dev = &pdev->dev;
++
++      if (pdev->dev.of_node) {
++              struct device_node *i2s_node;
++              struct snd_soc_dai_link *dai = &digidac1_soundcard_dai[0];
++
++              i2s_node = of_parse_phandle(pdev->dev.of_node,
++                                      "i2s-controller", 0);
++
++              if (i2s_node) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_node;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_node;
++              }
++      }
++
++      ret = snd_soc_register_card(&digidac1_soundcard);
++      if (ret)
++              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
++               ret);
++
++      return ret;
++}
++
++static int digidac1_soundcard_remove(struct platform_device *pdev)
++{
++      return snd_soc_unregister_card(&digidac1_soundcard);
++}
++
++static const struct of_device_id digidac1_soundcard_of_match[] = {
++      { .compatible = "rra,digidac1-soundcard", },
++      {},
++};
++MODULE_DEVICE_TABLE(of, digidac1_soundcard_of_match);
++
++static struct platform_driver digidac1_soundcard_driver = {
++      .driver = {
++                      .name           = "digidac1-audio",
++                      .owner          = THIS_MODULE,
++                      .of_match_table = digidac1_soundcard_of_match,
++      },
++      .probe          = digidac1_soundcard_probe,
++      .remove         = digidac1_soundcard_remove,
++};
++
++module_platform_driver(digidac1_soundcard_driver);
++
++MODULE_AUTHOR("José M. Tasende <vintage@redrocksaudio.es>");
++MODULE_DESCRIPTION("ASoC Driver for RRA DigiDAC1");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0372-config-Add-support-for-Logitech-Rumblepad.patch b/target/linux/brcm2708/patches-4.4/0372-config-Add-support-for-Logitech-Rumblepad.patch
deleted file mode 100644 (file)
index eebb627..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-From f141b0d59a1cc6783462e3b0656527a12e63be4a Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Fri, 27 May 2016 18:23:51 +0100
-Subject: [PATCH 372/423] config: Add support for Logitech Rumblepad
-
----
- arch/arm/configs/bcm2709_defconfig | 4 ++++
- arch/arm/configs/bcmrpi_defconfig  | 4 ++++
- 2 files changed, 8 insertions(+)
-
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -896,6 +896,10 @@ CONFIG_HID_TWINHAN=m
- CONFIG_HID_KENSINGTON=m
- CONFIG_HID_LCPOWER=m
- CONFIG_HID_LOGITECH=m
-+CONFIG_HID_LOGITECH_DJ=m
-+CONFIG_LOGITECH_FF=y
-+CONFIG_LOGIRUMBLEPAD2_FF=y
-+CONFIG_LOGIG940_FF=y
- CONFIG_HID_MAGICMOUSE=m
- CONFIG_HID_MICROSOFT=m
- CONFIG_HID_MONTEREY=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -888,6 +888,10 @@ CONFIG_HID_TWINHAN=m
- CONFIG_HID_KENSINGTON=m
- CONFIG_HID_LCPOWER=m
- CONFIG_HID_LOGITECH=m
-+CONFIG_HID_LOGITECH_DJ=m
-+CONFIG_LOGITECH_FF=y
-+CONFIG_LOGIRUMBLEPAD2_FF=y
-+CONFIG_LOGIG940_FF=y
- CONFIG_HID_MAGICMOUSE=m
- CONFIG_HID_MICROSOFT=m
- CONFIG_HID_MONTEREY=m
diff --git a/target/linux/brcm2708/patches-4.4/0373-New-driver-for-RRA-DigiDAC1-soundcard-using-WM8741-W.patch b/target/linux/brcm2708/patches-4.4/0373-New-driver-for-RRA-DigiDAC1-soundcard-using-WM8741-W.patch
deleted file mode 100644 (file)
index 15b6888..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-From 4e543fbd917ecbc07317afa418341bde1c0569b6 Mon Sep 17 00:00:00 2001
-From: escalator2015 <jmtasende@gmail.com>
-Date: Tue, 24 May 2016 16:20:09 +0100
-Subject: [PATCH 373/423] New driver for RRA DigiDAC1 soundcard using WM8741 +
- WM8804
-
----
- arch/arm/boot/dts/overlays/Makefile                |   1 +
- arch/arm/boot/dts/overlays/README                  |   6 +
- .../overlays/rra-digidac1-wm8741-audio-overlay.dts |  81 ++++
- arch/arm/configs/bcm2709_defconfig                 |   1 +
- arch/arm/configs/bcmrpi_defconfig                  |   1 +
- sound/soc/bcm/Kconfig                              |   8 +
- sound/soc/bcm/Makefile                             |   2 +
- sound/soc/bcm/digidac1-soundcard.c                 | 422 +++++++++++++++++++++
- 8 files changed, 522 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts
- create mode 100644 sound/soc/bcm/digidac1-soundcard.c
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -67,6 +67,7 @@ dtbo-$(RPI_DT_OVERLAYS) += rpi-display.d
- 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) += rra-digidac1-wm8741-audio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdio-1bit.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -842,6 +842,12 @@ Load:   dtoverlay=rpi-sense
- Params: <None>
-+Name:   rra-digidac1-wm8741-audio
-+Info:   Configures the Red Rocks Audio DigiDAC1 soundcard
-+Load:   dtoverlay=rra-digidac1-wm8741-audio
-+Params: <None>
-+
-+
- Name:   sdhost
- Info:   Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock.
-         N.B. This overlay is designed for situations where the mmc driver is
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts
-@@ -0,0 +1,81 @@
-+// Definitions for RRA DigiDAC1 Audio card
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target-path = "/";
-+              __overlay__ {
-+                      aliases {
-+                              ldo0 = &ldo0;
-+                              ldo1 = &ldo1;
-+                      };
-+              };
-+      };
-+
-+      fragment@1 {
-+              target-path = "/soc";
-+              __overlay__ {
-+
-+                      ldo1: ldo1 {
-+                              compatible = "regulator-fixed";
-+                              regulator-name = "DC_5V";
-+                              regulator-min-microvolt = <5000000>;
-+                              regulator-max-microvolt = <5000000>;
-+                              regulator-always-on;
-+                      };
-+
-+                      ldo0: ldo0 {
-+                              compatible = "regulator-fixed";
-+                              regulator-name = "DC_3V3";
-+                              regulator-min-microvolt = <3300000>;
-+                              regulator-max-microvolt = <3300000>;
-+                              regulator-always-on;
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@3 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      wm8804@3b {
-+                              #sound-dai-cells = <0>;
-+                              compatible = "wlf,wm8804";
-+                              reg = <0x3b>;
-+                              status = "okay";
-+                              PVDD-supply = <&ldo0>;
-+                              DVDD-supply = <&ldo0>;
-+                      };
-+
-+                      wm8742: wm8741@1a {
-+                              compatible = "wlf,wm8741";
-+                              reg = <0x1a>;
-+                              status = "okay";
-+                              AVDD-supply = <&ldo1>;
-+                              DVDD-supply = <&ldo0>;
-+                      };
-+              };
-+      };
-+
-+      fragment@4 {
-+              target = <&sound>;
-+              __overlay__ {
-+                      compatible = "rra,digidac1-soundcard";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+};
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -866,6 +866,7 @@ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
-+CONFIG_SND_DIGIDAC1_SOUNDCARD=m
- CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -858,6 +858,7 @@ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
-+CONFIG_SND_DIGIDAC1_SOUNDCARD=m
- CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
---- a/sound/soc/bcm/Kconfig
-+++ b/sound/soc/bcm/Kconfig
-@@ -92,3 +92,11 @@ config SND_AUDIOINJECTOR_PI_SOUNDCARD
-       select SND_SOC_WM8731
-       help
-         Say Y or M if you want to add support for audioinjector.net Pi Hat
-+
-+config SND_DIGIDAC1_SOUNDCARD
-+        tristate "Support for Red Rocks Audio DigiDAC1"
-+        depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-+        select SND_SOC_WM8804
-+        select SND_SOC_WM8741
-+        help
-+         Say Y or M if you want to add support for Red Rocks Audio DigiDAC1 board.
---- a/sound/soc/bcm/Makefile
-+++ b/sound/soc/bcm/Makefile
-@@ -16,6 +16,7 @@ snd-soc-rpi-proto-objs := rpi-proto.o
- snd-soc-iqaudio-dac-objs := iqaudio-dac.o
- snd-soc-raspidac3-objs := raspidac3.o
- snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
-+snd-soc-digidac1-soundcard-objs := digidac1-soundcard.o
- obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
-@@ -29,4 +30,5 @@ obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO)
- obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
- obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
- obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
-+obj-$(CONFIG_SND_DIGIDAC1_SOUNDCARD) += snd-soc-digidac1-soundcard.o
---- /dev/null
-+++ b/sound/soc/bcm/digidac1-soundcard.c
-@@ -0,0 +1,422 @@
-+/*
-+ * ASoC Driver for RRA DigiDAC1
-+ * Copyright 2016
-+ * Author: José M. Tasende <vintage@redrocksaudio.es>
-+ * based on the HifiBerry DAC driver by Florian Meier <florian.meier@koalo.de>
-+ * and the Wolfson card driver by Nikesh Oswal, <Nikesh.Oswal@wolfsonmicro.com>
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/i2c.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/jack.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/tlv.h>
-+#include <linux/regulator/consumer.h>
-+
-+#include "../codecs/wm8804.h"
-+#include "../codecs/wm8741.h"
-+
-+#define WM8741_NUM_SUPPLIES 2
-+
-+/* codec private data */
-+struct wm8741_priv {
-+      struct wm8741_platform_data pdata;
-+      struct regmap *regmap;
-+      struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES];
-+      unsigned int sysclk;
-+      const struct snd_pcm_hw_constraint_list *sysclk_constraints;
-+};
-+
-+static int samplerate = 44100;
-+
-+/* New Alsa Controls not exposed by original wm8741 codec driver      */
-+/* in actual driver the att. adjustment is wrong because              */
-+/* this DAC has a coarse attenuation register with 4dB steps          */
-+/* and a fine level register with 0.125dB steps                               */
-+/* each register has 32 steps so combining both we have       1024 steps      */
-+/* of 0.125 dB.                                                               */
-+/* The original level controls from driver are removed at startup     */
-+/* and replaced by the corrected ones.                                        */
-+/* The same wm8741 driver can be used for wm8741 and wm8742 devices   */
-+
-+static const DECLARE_TLV_DB_SCALE(dac_tlv_fine, 0, 13, 0);
-+static const DECLARE_TLV_DB_SCALE(dac_tlv_coarse, -12700, 400, 1);
-+static const char *w8741_dither[4] = {"Off", "RPDF", "TPDF", "HPDF"};
-+static const char *w8741_filter[5] = {
-+              "Type 1", "Type 2", "Type 3", "Type 4", "Type 5"};
-+static const char *w8741_switch[2] = {"Off", "On"};
-+static const struct soc_enum w8741_enum[] = {
-+SOC_ENUM_SINGLE(WM8741_MODE_CONTROL_2, 0, 4, w8741_dither),/* dithering type */
-+SOC_ENUM_SINGLE(WM8741_FILTER_CONTROL, 0, 5, w8741_filter),/* filter type */
-+SOC_ENUM_SINGLE(WM8741_FORMAT_CONTROL, 6, 2, w8741_switch),/* phase invert */
-+SOC_ENUM_SINGLE(WM8741_VOLUME_CONTROL, 0, 2, w8741_switch),/* volume ramp */
-+SOC_ENUM_SINGLE(WM8741_VOLUME_CONTROL, 3, 2, w8741_switch),/* soft mute */
-+};
-+
-+static const struct snd_kcontrol_new w8741_snd_controls_stereo[] = {
-+SOC_DOUBLE_R_TLV("DAC Fine Playback Volume", WM8741_DACLLSB_ATTENUATION,
-+              WM8741_DACRLSB_ATTENUATION, 0, 31, 1, dac_tlv_fine),
-+SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8741_DACLMSB_ATTENUATION,
-+              WM8741_DACRMSB_ATTENUATION, 0, 31, 1, dac_tlv_coarse),
-+SOC_ENUM("DAC Dither", w8741_enum[0]),
-+SOC_ENUM("DAC Digital Filter", w8741_enum[1]),
-+SOC_ENUM("DAC Phase Invert", w8741_enum[2]),
-+SOC_ENUM("DAC Volume Ramp", w8741_enum[3]),
-+SOC_ENUM("DAC Soft Mute", w8741_enum[4]),
-+};
-+
-+static const struct snd_kcontrol_new w8741_snd_controls_mono_left[] = {
-+SOC_SINGLE_TLV("DAC Fine Playback Volume", WM8741_DACLLSB_ATTENUATION,
-+              0, 31, 0, dac_tlv_fine),
-+SOC_SINGLE_TLV("Digital Playback Volume", WM8741_DACLMSB_ATTENUATION,
-+              0, 31, 1, dac_tlv_coarse),
-+SOC_ENUM("DAC Dither", w8741_enum[0]),
-+SOC_ENUM("DAC Digital Filter", w8741_enum[1]),
-+SOC_ENUM("DAC Phase Invert", w8741_enum[2]),
-+SOC_ENUM("DAC Volume Ramp", w8741_enum[3]),
-+SOC_ENUM("DAC Soft Mute", w8741_enum[4]),
-+};
-+
-+static const struct snd_kcontrol_new w8741_snd_controls_mono_right[] = {
-+SOC_SINGLE_TLV("DAC Fine Playback Volume", WM8741_DACRLSB_ATTENUATION,
-+      0, 31, 0, dac_tlv_fine),
-+SOC_SINGLE_TLV("Digital Playback Volume", WM8741_DACRMSB_ATTENUATION,
-+      0, 31, 1, dac_tlv_coarse),
-+SOC_ENUM("DAC Dither", w8741_enum[0]),
-+SOC_ENUM("DAC Digital Filter", w8741_enum[1]),
-+SOC_ENUM("DAC Phase Invert", w8741_enum[2]),
-+SOC_ENUM("DAC Volume Ramp", w8741_enum[3]),
-+SOC_ENUM("DAC Soft Mute", w8741_enum[4]),
-+};
-+
-+static int w8741_add_controls(struct snd_soc_codec *codec)
-+{
-+      struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec);
-+
-+      switch (wm8741->pdata.diff_mode) {
-+      case WM8741_DIFF_MODE_STEREO:
-+      case WM8741_DIFF_MODE_STEREO_REVERSED:
-+              snd_soc_add_codec_controls(codec,
-+                              w8741_snd_controls_stereo,
-+                              ARRAY_SIZE(w8741_snd_controls_stereo));
-+              break;
-+      case WM8741_DIFF_MODE_MONO_LEFT:
-+              snd_soc_add_codec_controls(codec,
-+                              w8741_snd_controls_mono_left,
-+                              ARRAY_SIZE(w8741_snd_controls_mono_left));
-+              break;
-+      case WM8741_DIFF_MODE_MONO_RIGHT:
-+              snd_soc_add_codec_controls(codec,
-+                              w8741_snd_controls_mono_right,
-+                              ARRAY_SIZE(w8741_snd_controls_mono_right));
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+static int digidac1_soundcard_init(struct snd_soc_pcm_runtime *rtd)
-+{
-+      struct snd_soc_codec *codec = rtd->codec;
-+      struct snd_soc_card *card = rtd->card;
-+      struct snd_soc_pcm_runtime *wm8741_rtd;
-+      struct snd_soc_codec *wm8741_codec;
-+      struct snd_card *sound_card = card->snd_card;
-+      struct snd_kcontrol *kctl;
-+      int ret;
-+
-+      wm8741_rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
-+      if (!wm8741_rtd) {
-+              dev_warn(card->dev, "digidac1_soundcard_init: couldn't get wm8741 rtd\n");
-+              return -EFAULT;
-+      }
-+      wm8741_codec = wm8741_rtd->codec;
-+      ret = w8741_add_controls(wm8741_codec);
-+      if (ret < 0)
-+              dev_warn(card->dev, "Failed to add new wm8741 controls: %d\n",
-+              ret);
-+
-+      /* enable TX output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
-+
-+      kctl = snd_soc_card_get_kcontrol(card,
-+              "Playback Volume");
-+      if (kctl) {
-+              kctl->vd[0].access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
-+              snd_ctl_remove(sound_card, kctl);
-+              }
-+      kctl = snd_soc_card_get_kcontrol(card,
-+              "Fine Playback Volume");
-+      if (kctl) {
-+              kctl->vd[0].access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
-+              snd_ctl_remove(sound_card, kctl);
-+              }
-+      return 0;
-+}
-+
-+static int digidac1_soundcard_startup(struct snd_pcm_substream *substream)
-+{
-+      /* turn on wm8804 digital output */
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      struct snd_soc_card *card = rtd->card;
-+      struct snd_soc_pcm_runtime *wm8741_rtd;
-+      struct snd_soc_codec *wm8741_codec;
-+
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
-+      wm8741_rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
-+      if (!wm8741_rtd) {
-+              dev_warn(card->dev, "digidac1_soundcard_startup: couldn't get WM8741 rtd\n");
-+              return -EFAULT;
-+      }
-+      wm8741_codec = wm8741_rtd->codec;
-+
-+      /* latch wm8741 level */
-+      snd_soc_update_bits(wm8741_codec, WM8741_DACLLSB_ATTENUATION,
-+              WM8741_UPDATELL, WM8741_UPDATELL);
-+      snd_soc_update_bits(wm8741_codec, WM8741_DACLMSB_ATTENUATION,
-+              WM8741_UPDATELM, WM8741_UPDATELM);
-+      snd_soc_update_bits(wm8741_codec, WM8741_DACRLSB_ATTENUATION,
-+              WM8741_UPDATERL, WM8741_UPDATERL);
-+      snd_soc_update_bits(wm8741_codec, WM8741_DACRMSB_ATTENUATION,
-+              WM8741_UPDATERM, WM8741_UPDATERM);
-+
-+      return 0;
-+}
-+
-+static void digidac1_soundcard_shutdown(struct snd_pcm_substream *substream)
-+{
-+      /* turn off wm8804 digital output */
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
-+}
-+
-+static int digidac1_soundcard_hw_params(struct snd_pcm_substream *substream,
-+                                     struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai *codec_dai = rtd->codec_dai;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-+      struct snd_soc_card *card = rtd->card;
-+      struct snd_soc_pcm_runtime *wm8741_rtd;
-+      struct snd_soc_codec *wm8741_codec;
-+
-+      int sysclk = 27000000;
-+      long mclk_freq = 0;
-+      int mclk_div = 1;
-+      int sampling_freq = 1;
-+      int ret;
-+
-+      wm8741_rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
-+      if (!wm8741_rtd) {
-+              dev_warn(card->dev, "digidac1_soundcard_hw_params: couldn't get WM8741 rtd\n");
-+              return -EFAULT;
-+      }
-+      wm8741_codec = wm8741_rtd->codec;
-+      samplerate = params_rate(params);
-+
-+      if (samplerate <= 96000) {
-+              mclk_freq = samplerate*256;
-+              mclk_div = WM8804_MCLKDIV_256FS;
-+      } else {
-+              mclk_freq = samplerate*128;
-+              mclk_div = WM8804_MCLKDIV_128FS;
-+              }
-+
-+      switch (samplerate) {
-+      case 32000:
-+              sampling_freq = 0x03;
-+              break;
-+      case 44100:
-+              sampling_freq = 0x00;
-+              break;
-+      case 48000:
-+              sampling_freq = 0x02;
-+              break;
-+      case 88200:
-+              sampling_freq = 0x08;
-+              break;
-+      case 96000:
-+              sampling_freq = 0x0a;
-+              break;
-+      case 176400:
-+              sampling_freq = 0x0c;
-+              break;
-+      case 192000:
-+              sampling_freq = 0x0e;
-+              break;
-+      default:
-+              dev_err(codec->dev,
-+              "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
-+              samplerate);
-+      }
-+
-+      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
-+      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
-+
-+      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
-+              sysclk, SND_SOC_CLOCK_OUT);
-+      if (ret < 0) {
-+              dev_err(codec->dev,
-+              "Failed to set WM8804 SYSCLK: %d\n", ret);
-+              return ret;
-+      }
-+      /* Enable wm8804 TX output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
-+
-+      /* wm8804 Power on */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
-+
-+      /* wm8804 set sampling frequency status bits */
-+      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
-+
-+      /* Now update wm8741 registers for the correct oversampling */
-+      if (samplerate <= 48000)
-+              snd_soc_update_bits(wm8741_codec, WM8741_MODE_CONTROL_1,
-+               WM8741_OSR_MASK, 0x00);
-+      else if (samplerate <= 96000)
-+              snd_soc_update_bits(wm8741_codec, WM8741_MODE_CONTROL_1,
-+               WM8741_OSR_MASK, 0x20);
-+      else
-+              snd_soc_update_bits(wm8741_codec, WM8741_MODE_CONTROL_1,
-+               WM8741_OSR_MASK, 0x40);
-+
-+      /* wm8741 bit size */
-+      switch (params_width(params)) {
-+      case 16:
-+              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
-+               WM8741_IWL_MASK, 0x00);
-+              break;
-+      case 20:
-+              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
-+               WM8741_IWL_MASK, 0x01);
-+              break;
-+      case 24:
-+              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
-+               WM8741_IWL_MASK, 0x02);
-+              break;
-+      case 32:
-+              snd_soc_update_bits(wm8741_codec, WM8741_FORMAT_CONTROL,
-+               WM8741_IWL_MASK, 0x03);
-+              break;
-+      default:
-+              dev_dbg(codec->dev, "wm8741_hw_params:    Unsupported bit size param = %d",
-+                      params_width(params));
-+              return -EINVAL;
-+      }
-+
-+      return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);
-+}
-+/* machine stream operations */
-+static struct snd_soc_ops digidac1_soundcard_ops = {
-+      .hw_params      = digidac1_soundcard_hw_params,
-+      .startup        = digidac1_soundcard_startup,
-+      .shutdown       = digidac1_soundcard_shutdown,
-+};
-+
-+static struct snd_soc_dai_link digidac1_soundcard_dai[] = {
-+      {
-+      .name           = "RRA DigiDAC1",
-+      .stream_name    = "RRA DigiDAC1 HiFi",
-+      .cpu_dai_name   = "bcm2708-i2s.0",
-+      .codec_dai_name = "wm8804-spdif",
-+      .platform_name  = "bcm2708-i2s.0",
-+      .codec_name     = "wm8804.1-003b",
-+      .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
-+                              SND_SOC_DAIFMT_CBM_CFM,
-+      .ops            = &digidac1_soundcard_ops,
-+      .init           = digidac1_soundcard_init,
-+      },
-+      {
-+      .name           = "RRA DigiDAC11",
-+      .stream_name    = "RRA DigiDAC11 HiFi",
-+      .cpu_dai_name   = "wm8804-spdif",
-+      .codec_dai_name = "wm8741",
-+      .codec_name     = "wm8741.1-001a",
-+      .dai_fmt        = SND_SOC_DAIFMT_I2S
-+                      | SND_SOC_DAIFMT_NB_NF
-+                      | SND_SOC_DAIFMT_CBS_CFS,
-+      },
-+};
-+
-+/* audio machine driver */
-+static struct snd_soc_card digidac1_soundcard = {
-+      .name           = "digidac1-soundcard",
-+      .owner          = THIS_MODULE,
-+      .dai_link       = digidac1_soundcard_dai,
-+      .num_links      = ARRAY_SIZE(digidac1_soundcard_dai),
-+};
-+
-+static int digidac1_soundcard_probe(struct platform_device *pdev)
-+{
-+      int ret = 0;
-+
-+      digidac1_soundcard.dev = &pdev->dev;
-+
-+      if (pdev->dev.of_node) {
-+              struct device_node *i2s_node;
-+              struct snd_soc_dai_link *dai = &digidac1_soundcard_dai[0];
-+
-+              i2s_node = of_parse_phandle(pdev->dev.of_node,
-+                                      "i2s-controller", 0);
-+
-+              if (i2s_node) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_node;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_node;
-+              }
-+      }
-+
-+      ret = snd_soc_register_card(&digidac1_soundcard);
-+      if (ret)
-+              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
-+               ret);
-+
-+      return ret;
-+}
-+
-+static int digidac1_soundcard_remove(struct platform_device *pdev)
-+{
-+      return snd_soc_unregister_card(&digidac1_soundcard);
-+}
-+
-+static const struct of_device_id digidac1_soundcard_of_match[] = {
-+      { .compatible = "rra,digidac1-soundcard", },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, digidac1_soundcard_of_match);
-+
-+static struct platform_driver digidac1_soundcard_driver = {
-+      .driver = {
-+                      .name           = "digidac1-audio",
-+                      .owner          = THIS_MODULE,
-+                      .of_match_table = digidac1_soundcard_of_match,
-+      },
-+      .probe          = digidac1_soundcard_probe,
-+      .remove         = digidac1_soundcard_remove,
-+};
-+
-+module_platform_driver(digidac1_soundcard_driver);
-+
-+MODULE_AUTHOR("José M. Tasende <vintage@redrocksaudio.es>");
-+MODULE_DESCRIPTION("ASoC Driver for RRA DigiDAC1");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0374-BCM2835-V4L2-Correct-handling-for-BGR24-vs-RGB24.patch b/target/linux/brcm2708/patches-4.4/0374-BCM2835-V4L2-Correct-handling-for-BGR24-vs-RGB24.patch
new file mode 100644 (file)
index 0000000..2b262f2
--- /dev/null
@@ -0,0 +1,170 @@
+From 1fa221e0909bc0052bdc8b458fb31e8a088e7723 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <6by9@users.noreply.github.com>
+Date: Wed, 25 May 2016 23:25:36 +0100
+Subject: [PATCH] BCM2835-V4L2: Correct handling for BGR24 vs RGB24.
+
+There was a bug in the GPU firmware that had reversed these
+two formats.
+Detect the old firmware, and reverse the formats if necessary.
+
+Signed-off-by: Dave Stevenson <6by9@users.noreply.github.com>
+---
+ drivers/media/platform/bcm2835/bcm2835-camera.c | 69 ++++++++++++++++++-------
+ drivers/media/platform/bcm2835/bcm2835-camera.h |  1 +
+ 2 files changed, 52 insertions(+), 18 deletions(-)
+
+--- a/drivers/media/platform/bcm2835/bcm2835-camera.c
++++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
+@@ -115,7 +115,7 @@ static struct mmal_fmt formats[] = {
+        .name = "RGB24 (LE)",
+        .fourcc = V4L2_PIX_FMT_RGB24,
+        .flags = 0,
+-       .mmal = MMAL_ENCODING_BGR24,
++       .mmal = MMAL_ENCODING_RGB24,
+        .depth = 24,
+        .mmal_component = MMAL_COMPONENT_CAMERA,
+        .ybbp = 3,
+@@ -187,7 +187,7 @@ static struct mmal_fmt formats[] = {
+        .name = "RGB24 (BE)",
+        .fourcc = V4L2_PIX_FMT_BGR24,
+        .flags = 0,
+-       .mmal = MMAL_ENCODING_RGB24,
++       .mmal = MMAL_ENCODING_BGR24,
+        .depth = 24,
+        .mmal_component = MMAL_COMPONENT_CAMERA,
+        .ybbp = 3,
+@@ -1059,6 +1059,13 @@ static int mmal_setup_components(struct
+       else
+               camera_port->format.encoding = mfmt->mmal;
++      if (dev->rgb_bgr_swapped) {
++              if (camera_port->format.encoding == MMAL_ENCODING_RGB24)
++                      camera_port->format.encoding = MMAL_ENCODING_BGR24;
++              else if (camera_port->format.encoding == MMAL_ENCODING_BGR24)
++                      camera_port->format.encoding = MMAL_ENCODING_RGB24;
++      }
++
+       camera_port->format.encoding_variant = 0;
+       camera_port->es.video.width = f->fmt.pix.width;
+       camera_port->es.video.height = f->fmt.pix.height;
+@@ -1569,12 +1576,17 @@ static int set_camera_parameters(struct
+       return ret;
+ }
++#define MAX_SUPPORTED_ENCODINGS 20
++
+ /* MMAL instance and component init */
+ static int __init mmal_init(struct bm2835_mmal_dev *dev)
+ {
+       int ret;
+       struct mmal_es_format *format;
+       u32 bool_true = 1;
++      u32 supported_encodings[MAX_SUPPORTED_ENCODINGS];
++      int param_size;
++      struct vchiq_mmal_component  *camera;
+       ret = vchiq_mmal_init(&dev->instance);
+       if (ret < 0)
+@@ -1586,21 +1598,48 @@ static int __init mmal_init(struct bm283
+       if (ret < 0)
+               goto unreg_mmal;
+-      if (dev->component[MMAL_COMPONENT_CAMERA]->outputs <
+-          MMAL_CAMERA_PORT_COUNT) {
++      camera = dev->component[MMAL_COMPONENT_CAMERA];
++      if (camera->outputs <  MMAL_CAMERA_PORT_COUNT) {
+               ret = -EINVAL;
+               goto unreg_camera;
+       }
+       ret = set_camera_parameters(dev->instance,
+-                                  dev->component[MMAL_COMPONENT_CAMERA],
++                                  camera,
+                                   dev);
+       if (ret < 0)
+               goto unreg_camera;
+-      format =
+-          &dev->component[MMAL_COMPONENT_CAMERA]->
+-          output[MMAL_CAMERA_PORT_PREVIEW].format;
++      /* There was an error in the firmware that meant the camera component
++       * produced BGR instead of RGB.
++       * This is now fixed, but in order to support the old firmwares, we
++       * have to check.
++       */
++      dev->rgb_bgr_swapped = true;
++      param_size = sizeof(supported_encodings);
++      ret = vchiq_mmal_port_parameter_get(dev->instance,
++              &camera->output[MMAL_CAMERA_PORT_CAPTURE],
++              MMAL_PARAMETER_SUPPORTED_ENCODINGS,
++              &supported_encodings,
++              &param_size);
++      if (ret == 0) {
++              int i;
++
++              for (i = 0; i < param_size/sizeof(u32); i++) {
++                      if (supported_encodings[i] == MMAL_ENCODING_BGR24) {
++                              /* Found BGR24 first - old firmware. */
++                              break;
++                      }
++                      if (supported_encodings[i] == MMAL_ENCODING_RGB24) {
++                              /* Found RGB24 first
++                               * new firmware, so use RGB24.
++                               */
++                              dev->rgb_bgr_swapped = false;
++                      break;
++                      }
++              }
++      }
++      format = &camera->output[MMAL_CAMERA_PORT_PREVIEW].format;
+       format->encoding = MMAL_ENCODING_OPAQUE;
+       format->encoding_variant = MMAL_ENCODING_I420;
+@@ -1614,9 +1653,7 @@ static int __init mmal_init(struct bm283
+       format->es->video.frame_rate.num = 0; /* Rely on fps_range */
+       format->es->video.frame_rate.den = 1;
+-      format =
+-          &dev->component[MMAL_COMPONENT_CAMERA]->
+-          output[MMAL_CAMERA_PORT_VIDEO].format;
++      format = &camera->output[MMAL_CAMERA_PORT_VIDEO].format;
+       format->encoding = MMAL_ENCODING_OPAQUE;
+       format->encoding_variant = MMAL_ENCODING_I420;
+@@ -1631,14 +1668,11 @@ static int __init mmal_init(struct bm283
+       format->es->video.frame_rate.den = 1;
+       vchiq_mmal_port_parameter_set(dev->instance,
+-              &dev->component[MMAL_COMPONENT_CAMERA]->
+-                              output[MMAL_CAMERA_PORT_VIDEO],
++              &camera->output[MMAL_CAMERA_PORT_VIDEO],
+               MMAL_PARAMETER_NO_IMAGE_PADDING,
+               &bool_true, sizeof(bool_true));
+-      format =
+-          &dev->component[MMAL_COMPONENT_CAMERA]->
+-          output[MMAL_CAMERA_PORT_CAPTURE].format;
++      format = &camera->output[MMAL_CAMERA_PORT_CAPTURE].format;
+       format->encoding = MMAL_ENCODING_OPAQUE;
+@@ -1660,8 +1694,7 @@ static int __init mmal_init(struct bm283
+       dev->capture.enc_level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
+       vchiq_mmal_port_parameter_set(dev->instance,
+-              &dev->component[MMAL_COMPONENT_CAMERA]->
+-                      output[MMAL_CAMERA_PORT_CAPTURE],
++              &camera->output[MMAL_CAMERA_PORT_CAPTURE],
+               MMAL_PARAMETER_NO_IMAGE_PADDING,
+               &bool_true, sizeof(bool_true));
+--- a/drivers/media/platform/bcm2835/bcm2835-camera.h
++++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
+@@ -109,6 +109,7 @@ struct bm2835_mmal_dev {
+       unsigned int camera_num;
+       unsigned int max_width;
+       unsigned int max_height;
++      unsigned int rgb_bgr_swapped;
+ };
+ int bm2835_mmal_init_controls(
diff --git a/target/linux/brcm2708/patches-4.4/0375-BCM270X_DT-Add-mcp23017-to-the-overlay-Makefile.patch b/target/linux/brcm2708/patches-4.4/0375-BCM270X_DT-Add-mcp23017-to-the-overlay-Makefile.patch
new file mode 100644 (file)
index 0000000..40dc096
--- /dev/null
@@ -0,0 +1,20 @@
+From b7cd83145ba0f51721715034135a6c396dff9522 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 3 Jun 2016 22:21:47 +0100
+Subject: [PATCH] BCM270X_DT: Add mcp23017 to the overlay Makefile
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/Makefile | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -44,6 +44,7 @@ dtbo-$(RPI_DT_OVERLAYS) += iqaudio-dacpl
+ dtbo-$(RPI_DT_OVERLAYS) += justboom-dac.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += mcp23017.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mmc.dtbo
diff --git a/target/linux/brcm2708/patches-4.4/0375-BCM2835-V4L2-Correct-handling-for-BGR24-vs-RGB24.patch b/target/linux/brcm2708/patches-4.4/0375-BCM2835-V4L2-Correct-handling-for-BGR24-vs-RGB24.patch
deleted file mode 100644 (file)
index 8e6f2fe..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-From e773144578da8e21392ce8b6e99cfcd313779da9 Mon Sep 17 00:00:00 2001
-From: Dave Stevenson <6by9@users.noreply.github.com>
-Date: Wed, 25 May 2016 23:25:36 +0100
-Subject: [PATCH 375/423] BCM2835-V4L2: Correct handling for BGR24 vs RGB24.
-
-There was a bug in the GPU firmware that had reversed these
-two formats.
-Detect the old firmware, and reverse the formats if necessary.
-
-Signed-off-by: Dave Stevenson <6by9@users.noreply.github.com>
----
- drivers/media/platform/bcm2835/bcm2835-camera.c | 69 ++++++++++++++++++-------
- drivers/media/platform/bcm2835/bcm2835-camera.h |  1 +
- 2 files changed, 52 insertions(+), 18 deletions(-)
-
---- a/drivers/media/platform/bcm2835/bcm2835-camera.c
-+++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
-@@ -115,7 +115,7 @@ static struct mmal_fmt formats[] = {
-        .name = "RGB24 (LE)",
-        .fourcc = V4L2_PIX_FMT_RGB24,
-        .flags = 0,
--       .mmal = MMAL_ENCODING_BGR24,
-+       .mmal = MMAL_ENCODING_RGB24,
-        .depth = 24,
-        .mmal_component = MMAL_COMPONENT_CAMERA,
-        .ybbp = 3,
-@@ -187,7 +187,7 @@ static struct mmal_fmt formats[] = {
-        .name = "RGB24 (BE)",
-        .fourcc = V4L2_PIX_FMT_BGR24,
-        .flags = 0,
--       .mmal = MMAL_ENCODING_RGB24,
-+       .mmal = MMAL_ENCODING_BGR24,
-        .depth = 24,
-        .mmal_component = MMAL_COMPONENT_CAMERA,
-        .ybbp = 3,
-@@ -1059,6 +1059,13 @@ static int mmal_setup_components(struct
-       else
-               camera_port->format.encoding = mfmt->mmal;
-+      if (dev->rgb_bgr_swapped) {
-+              if (camera_port->format.encoding == MMAL_ENCODING_RGB24)
-+                      camera_port->format.encoding = MMAL_ENCODING_BGR24;
-+              else if (camera_port->format.encoding == MMAL_ENCODING_BGR24)
-+                      camera_port->format.encoding = MMAL_ENCODING_RGB24;
-+      }
-+
-       camera_port->format.encoding_variant = 0;
-       camera_port->es.video.width = f->fmt.pix.width;
-       camera_port->es.video.height = f->fmt.pix.height;
-@@ -1569,12 +1576,17 @@ static int set_camera_parameters(struct
-       return ret;
- }
-+#define MAX_SUPPORTED_ENCODINGS 20
-+
- /* MMAL instance and component init */
- static int __init mmal_init(struct bm2835_mmal_dev *dev)
- {
-       int ret;
-       struct mmal_es_format *format;
-       u32 bool_true = 1;
-+      u32 supported_encodings[MAX_SUPPORTED_ENCODINGS];
-+      int param_size;
-+      struct vchiq_mmal_component  *camera;
-       ret = vchiq_mmal_init(&dev->instance);
-       if (ret < 0)
-@@ -1586,21 +1598,48 @@ static int __init mmal_init(struct bm283
-       if (ret < 0)
-               goto unreg_mmal;
--      if (dev->component[MMAL_COMPONENT_CAMERA]->outputs <
--          MMAL_CAMERA_PORT_COUNT) {
-+      camera = dev->component[MMAL_COMPONENT_CAMERA];
-+      if (camera->outputs <  MMAL_CAMERA_PORT_COUNT) {
-               ret = -EINVAL;
-               goto unreg_camera;
-       }
-       ret = set_camera_parameters(dev->instance,
--                                  dev->component[MMAL_COMPONENT_CAMERA],
-+                                  camera,
-                                   dev);
-       if (ret < 0)
-               goto unreg_camera;
--      format =
--          &dev->component[MMAL_COMPONENT_CAMERA]->
--          output[MMAL_CAMERA_PORT_PREVIEW].format;
-+      /* There was an error in the firmware that meant the camera component
-+       * produced BGR instead of RGB.
-+       * This is now fixed, but in order to support the old firmwares, we
-+       * have to check.
-+       */
-+      dev->rgb_bgr_swapped = true;
-+      param_size = sizeof(supported_encodings);
-+      ret = vchiq_mmal_port_parameter_get(dev->instance,
-+              &camera->output[MMAL_CAMERA_PORT_CAPTURE],
-+              MMAL_PARAMETER_SUPPORTED_ENCODINGS,
-+              &supported_encodings,
-+              &param_size);
-+      if (ret == 0) {
-+              int i;
-+
-+              for (i = 0; i < param_size/sizeof(u32); i++) {
-+                      if (supported_encodings[i] == MMAL_ENCODING_BGR24) {
-+                              /* Found BGR24 first - old firmware. */
-+                              break;
-+                      }
-+                      if (supported_encodings[i] == MMAL_ENCODING_RGB24) {
-+                              /* Found RGB24 first
-+                               * new firmware, so use RGB24.
-+                               */
-+                              dev->rgb_bgr_swapped = false;
-+                      break;
-+                      }
-+              }
-+      }
-+      format = &camera->output[MMAL_CAMERA_PORT_PREVIEW].format;
-       format->encoding = MMAL_ENCODING_OPAQUE;
-       format->encoding_variant = MMAL_ENCODING_I420;
-@@ -1614,9 +1653,7 @@ static int __init mmal_init(struct bm283
-       format->es->video.frame_rate.num = 0; /* Rely on fps_range */
-       format->es->video.frame_rate.den = 1;
--      format =
--          &dev->component[MMAL_COMPONENT_CAMERA]->
--          output[MMAL_CAMERA_PORT_VIDEO].format;
-+      format = &camera->output[MMAL_CAMERA_PORT_VIDEO].format;
-       format->encoding = MMAL_ENCODING_OPAQUE;
-       format->encoding_variant = MMAL_ENCODING_I420;
-@@ -1631,14 +1668,11 @@ static int __init mmal_init(struct bm283
-       format->es->video.frame_rate.den = 1;
-       vchiq_mmal_port_parameter_set(dev->instance,
--              &dev->component[MMAL_COMPONENT_CAMERA]->
--                              output[MMAL_CAMERA_PORT_VIDEO],
-+              &camera->output[MMAL_CAMERA_PORT_VIDEO],
-               MMAL_PARAMETER_NO_IMAGE_PADDING,
-               &bool_true, sizeof(bool_true));
--      format =
--          &dev->component[MMAL_COMPONENT_CAMERA]->
--          output[MMAL_CAMERA_PORT_CAPTURE].format;
-+      format = &camera->output[MMAL_CAMERA_PORT_CAPTURE].format;
-       format->encoding = MMAL_ENCODING_OPAQUE;
-@@ -1660,8 +1694,7 @@ static int __init mmal_init(struct bm283
-       dev->capture.enc_level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
-       vchiq_mmal_port_parameter_set(dev->instance,
--              &dev->component[MMAL_COMPONENT_CAMERA]->
--                      output[MMAL_CAMERA_PORT_CAPTURE],
-+              &camera->output[MMAL_CAMERA_PORT_CAPTURE],
-               MMAL_PARAMETER_NO_IMAGE_PADDING,
-               &bool_true, sizeof(bool_true));
---- a/drivers/media/platform/bcm2835/bcm2835-camera.h
-+++ b/drivers/media/platform/bcm2835/bcm2835-camera.h
-@@ -109,6 +109,7 @@ struct bm2835_mmal_dev {
-       unsigned int camera_num;
-       unsigned int max_width;
-       unsigned int max_height;
-+      unsigned int rgb_bgr_swapped;
- };
- int bm2835_mmal_init_controls(
diff --git a/target/linux/brcm2708/patches-4.4/0376-BCM270X_DT-Add-mcp23017-to-the-overlay-Makefile.patch b/target/linux/brcm2708/patches-4.4/0376-BCM270X_DT-Add-mcp23017-to-the-overlay-Makefile.patch
deleted file mode 100644 (file)
index 34698ab..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-From 9bfe3611959168e5d1035bafc8917340bc1e9791 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 3 Jun 2016 22:21:47 +0100
-Subject: [PATCH 376/423] BCM270X_DT: Add mcp23017 to the overlay Makefile
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/Makefile | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -44,6 +44,7 @@ dtbo-$(RPI_DT_OVERLAYS) += iqaudio-dacpl
- dtbo-$(RPI_DT_OVERLAYS) += justboom-dac.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += mcp23017.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += mmc.dtbo
diff --git a/target/linux/brcm2708/patches-4.4/0376-BCM270X_DT-Sort-entries-to-placate-check-script.patch b/target/linux/brcm2708/patches-4.4/0376-BCM270X_DT-Sort-entries-to-placate-check-script.patch
new file mode 100644 (file)
index 0000000..3614b93
--- /dev/null
@@ -0,0 +1,56 @@
+From 847d6f110dcd6b95120fc224cd71151464990f56 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 3 Jun 2016 23:01:01 +0100
+Subject: [PATCH] BCM270X_DT: Sort entries to placate check script
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/Makefile | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -18,10 +18,10 @@ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqd
+ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dpi24.dtbo
+-dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
+-dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += enc28j60.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += gpio-ir.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += gpio-poweroff.dtbo
+@@ -31,10 +31,10 @@ dtbo-$(RPI_DT_OVERLAYS) += hifiberry-dac
+ 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) += i2c-mux.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c-pwm-pca9685a.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += i2c-rtc.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c0-bcm2708.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c1-bcm2708.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2s-gpio28-31.dtbo
+@@ -73,16 +73,16 @@ dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio-1bit.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdtweak.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += smi.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) += spi-gpio35-39.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
diff --git a/target/linux/brcm2708/patches-4.4/0377-BCM270X_DT-Sort-entries-to-placate-check-script.patch b/target/linux/brcm2708/patches-4.4/0377-BCM270X_DT-Sort-entries-to-placate-check-script.patch
deleted file mode 100644 (file)
index d403289..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-From e5dfd4f6544c0bc78d3d5b4158ad0f3660a244d4 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 3 Jun 2016 23:01:01 +0100
-Subject: [PATCH 377/423] BCM270X_DT: Sort entries to placate check script
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/Makefile | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -18,10 +18,10 @@ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqd
- dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dpi24.dtbo
--dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
--dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += enc28j60.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += gpio-ir.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += gpio-poweroff.dtbo
-@@ -31,10 +31,10 @@ dtbo-$(RPI_DT_OVERLAYS) += hifiberry-dac
- 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) += i2c-mux.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2c-pwm-pca9685a.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += i2c-rtc.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2c0-bcm2708.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2c1-bcm2708.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += i2s-gpio28-31.dtbo
-@@ -73,16 +73,16 @@ dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdio-1bit.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdtweak.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += smi.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) += spi-gpio35-39.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
diff --git a/target/linux/brcm2708/patches-4.4/0377-gpio-ir-overlay-gpio_pin-shouldn-t-change-pull-setti.patch b/target/linux/brcm2708/patches-4.4/0377-gpio-ir-overlay-gpio_pin-shouldn-t-change-pull-setti.patch
new file mode 100644 (file)
index 0000000..1d8ec84
--- /dev/null
@@ -0,0 +1,22 @@
+From 61702c8c68510797341356d03cf63380190afea9 Mon Sep 17 00:00:00 2001
+From: Matthias Reichl <hias@horus.com>
+Date: Sat, 4 Jun 2016 11:30:48 +0200
+Subject: [PATCH] gpio-ir overlay: gpio_pin shouldn't change pull setting
+
+Signed-off-by: Matthias Reichl <hias@horus.com>
+---
+ arch/arm/boot/dts/overlays/gpio-ir-overlay.dts | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts
++++ b/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts
+@@ -36,8 +36,7 @@
+         __overrides__ {
+                 // parameters
+                 gpio_pin =      <&gpio_ir>,"gpios:4",
+-                                        <&gpio_ir_pins>,"brcm,pins:0",
+-                                        <&gpio_ir_pins>,"brcm,pull:0";  // pin number
++                                        <&gpio_ir_pins>,"brcm,pins:0";  // pin number
+                 gpio_pull = <&gpio_ir_pins>,"brcm,pull:0";              // pull-up/down state
+                 rc-map-name = <&gpio_ir>,"linux,rc-map-name";           // default rc map
diff --git a/target/linux/brcm2708/patches-4.4/0378-gpio-ir-overlay-gpio_pin-shouldn-t-change-pull-setti.patch b/target/linux/brcm2708/patches-4.4/0378-gpio-ir-overlay-gpio_pin-shouldn-t-change-pull-setti.patch
deleted file mode 100644 (file)
index 2b7368f..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From 5ae23709f303503c983cc3658a95ade9573c2540 Mon Sep 17 00:00:00 2001
-From: Matthias Reichl <hias@horus.com>
-Date: Sat, 4 Jun 2016 11:30:48 +0200
-Subject: [PATCH 378/423] gpio-ir overlay: gpio_pin shouldn't change pull
- setting
-
-Signed-off-by: Matthias Reichl <hias@horus.com>
----
- arch/arm/boot/dts/overlays/gpio-ir-overlay.dts | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts
-@@ -36,8 +36,7 @@
-         __overrides__ {
-                 // parameters
-                 gpio_pin =      <&gpio_ir>,"gpios:4",
--                                        <&gpio_ir_pins>,"brcm,pins:0",
--                                        <&gpio_ir_pins>,"brcm,pull:0";  // pin number
-+                                        <&gpio_ir_pins>,"brcm,pins:0";  // pin number
-                 gpio_pull = <&gpio_ir_pins>,"brcm,pull:0";              // pull-up/down state
-                 rc-map-name = <&gpio_ir>,"linux,rc-map-name";           // default rc map
diff --git a/target/linux/brcm2708/patches-4.4/0378-media-rc-core-define-a-default-timeout-for-drivers.patch b/target/linux/brcm2708/patches-4.4/0378-media-rc-core-define-a-default-timeout-for-drivers.patch
new file mode 100644 (file)
index 0000000..77967a2
--- /dev/null
@@ -0,0 +1,25 @@
+From 3d63c720f92caf1f3870154739bf9770eab06b9a Mon Sep 17 00:00:00 2001
+From: Eric Nelson <eric@nelint.com>
+Date: Sat, 3 Oct 2015 08:18:50 -0700
+Subject: [PATCH] [media] rc-core: define a default timeout for drivers
+
+A default timeout value of 125 ms should work for all decoders.
+
+Declare a constant to help standardize its' use.
+
+Signed-off-by: Eric Nelson <eric@nelint.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+---
+ include/media/rc-core.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/include/media/rc-core.h
++++ b/include/media/rc-core.h
+@@ -239,6 +239,7 @@ static inline void init_ir_raw_event(str
+       memset(ev, 0, sizeof(*ev));
+ }
++#define IR_DEFAULT_TIMEOUT    MS_TO_NS(125)
+ #define IR_MAX_DURATION         500000000     /* 500 ms */
+ #define US_TO_NS(usec)                ((usec) * 1000)
+ #define MS_TO_US(msec)                ((msec) * 1000)
diff --git a/target/linux/brcm2708/patches-4.4/0379-media-rc-core-define-a-default-timeout-for-drivers.patch b/target/linux/brcm2708/patches-4.4/0379-media-rc-core-define-a-default-timeout-for-drivers.patch
deleted file mode 100644 (file)
index 130afb5..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From 17d27b2171c997d5803172e7a9fa4f474f9687c1 Mon Sep 17 00:00:00 2001
-From: Eric Nelson <eric@nelint.com>
-Date: Sat, 3 Oct 2015 08:18:50 -0700
-Subject: [PATCH 379/423] [media] rc-core: define a default timeout for drivers
-
-A default timeout value of 125 ms should work for all decoders.
-
-Declare a constant to help standardize its' use.
-
-Signed-off-by: Eric Nelson <eric@nelint.com>
-Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
----
- include/media/rc-core.h | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/include/media/rc-core.h
-+++ b/include/media/rc-core.h
-@@ -239,6 +239,7 @@ static inline void init_ir_raw_event(str
-       memset(ev, 0, sizeof(*ev));
- }
-+#define IR_DEFAULT_TIMEOUT    MS_TO_NS(125)
- #define IR_MAX_DURATION         500000000     /* 500 ms */
- #define US_TO_NS(usec)                ((usec) * 1000)
- #define MS_TO_US(msec)                ((msec) * 1000)
diff --git a/target/linux/brcm2708/patches-4.4/0379-media-rc-gpio-ir-recv-add-timeout-on-idle.patch b/target/linux/brcm2708/patches-4.4/0379-media-rc-gpio-ir-recv-add-timeout-on-idle.patch
new file mode 100644 (file)
index 0000000..1436803
--- /dev/null
@@ -0,0 +1,91 @@
+From ae20f89a35806322a318195e1067ddd9ca8b7eb8 Mon Sep 17 00:00:00 2001
+From: Eric Nelson <eric@nelint.com>
+Date: Wed, 23 Sep 2015 11:07:08 -0300
+Subject: [PATCH] [media] rc: gpio-ir-recv: add timeout on idle
+
+Many decoders require a trailing space (period without IR illumination)
+to be delivered before completing a decode.
+
+Since the gpio-ir-recv driver only delivers events on gpio transitions,
+a single IR symbol (caused by a quick touch on an IR remote) will not
+be properly decoded without the use of a timer to flush the tail end
+state of the IR receiver.
+
+This patch initializes and uses a timer and the timeout field of rcdev
+to complete the stream and allow decode.
+
+The timeout can be overridden through the use of the LIRC_SET_REC_TIMEOUT
+ioctl.
+
+Signed-off-by: Eric Nelson <eric@nelint.com>
+Acked-by: Sean Young <sean@mess.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+---
+ drivers/media/rc/gpio-ir-recv.c | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+--- a/drivers/media/rc/gpio-ir-recv.c
++++ b/drivers/media/rc/gpio-ir-recv.c
+@@ -30,6 +30,7 @@ struct gpio_rc_dev {
+       struct rc_dev *rcdev;
+       int gpio_nr;
+       bool active_low;
++      struct timer_list flush_timer;
+ };
+ #ifdef CONFIG_OF
+@@ -93,12 +94,26 @@ static irqreturn_t gpio_ir_recv_irq(int
+       if (rc < 0)
+               goto err_get_value;
++      mod_timer(&gpio_dev->flush_timer,
++                jiffies + nsecs_to_jiffies(gpio_dev->rcdev->timeout));
++
+       ir_raw_event_handle(gpio_dev->rcdev);
+ err_get_value:
+       return IRQ_HANDLED;
+ }
++static void flush_timer(unsigned long arg)
++{
++      struct gpio_rc_dev *gpio_dev = (struct gpio_rc_dev *)arg;
++      DEFINE_IR_RAW_EVENT(ev);
++
++      ev.timeout = true;
++      ev.duration = gpio_dev->rcdev->timeout;
++      ir_raw_event_store(gpio_dev->rcdev, &ev);
++      ir_raw_event_handle(gpio_dev->rcdev);
++}
++
+ static int gpio_ir_recv_probe(struct platform_device *pdev)
+ {
+       struct gpio_rc_dev *gpio_dev;
+@@ -144,6 +159,9 @@ static int gpio_ir_recv_probe(struct pla
+       rcdev->input_id.version = 0x0100;
+       rcdev->dev.parent = &pdev->dev;
+       rcdev->driver_name = GPIO_IR_DRIVER_NAME;
++      rcdev->min_timeout = 0;
++      rcdev->timeout = IR_DEFAULT_TIMEOUT;
++      rcdev->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
+       if (pdata->allowed_protos)
+               rcdev->allowed_protocols = pdata->allowed_protos;
+       else
+@@ -154,6 +172,9 @@ static int gpio_ir_recv_probe(struct pla
+       gpio_dev->gpio_nr = pdata->gpio_nr;
+       gpio_dev->active_low = pdata->active_low;
++      setup_timer(&gpio_dev->flush_timer, flush_timer,
++                  (unsigned long)gpio_dev);
++
+       rc = gpio_request(pdata->gpio_nr, "gpio-ir-recv");
+       if (rc < 0)
+               goto err_gpio_request;
+@@ -196,6 +217,7 @@ static int gpio_ir_recv_remove(struct pl
+       struct gpio_rc_dev *gpio_dev = platform_get_drvdata(pdev);
+       free_irq(gpio_to_irq(gpio_dev->gpio_nr), gpio_dev);
++      del_timer_sync(&gpio_dev->flush_timer);
+       rc_unregister_device(gpio_dev->rcdev);
+       gpio_free(gpio_dev->gpio_nr);
+       kfree(gpio_dev);
diff --git a/target/linux/brcm2708/patches-4.4/0380-media-rc-gpio-ir-recv-add-timeout-on-idle.patch b/target/linux/brcm2708/patches-4.4/0380-media-rc-gpio-ir-recv-add-timeout-on-idle.patch
deleted file mode 100644 (file)
index 02514cb..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-From 87909c64d14dc0f907ebe95f77874075a75e7f66 Mon Sep 17 00:00:00 2001
-From: Eric Nelson <eric@nelint.com>
-Date: Wed, 23 Sep 2015 11:07:08 -0300
-Subject: [PATCH 380/423] [media] rc: gpio-ir-recv: add timeout on idle
-
-Many decoders require a trailing space (period without IR illumination)
-to be delivered before completing a decode.
-
-Since the gpio-ir-recv driver only delivers events on gpio transitions,
-a single IR symbol (caused by a quick touch on an IR remote) will not
-be properly decoded without the use of a timer to flush the tail end
-state of the IR receiver.
-
-This patch initializes and uses a timer and the timeout field of rcdev
-to complete the stream and allow decode.
-
-The timeout can be overridden through the use of the LIRC_SET_REC_TIMEOUT
-ioctl.
-
-Signed-off-by: Eric Nelson <eric@nelint.com>
-Acked-by: Sean Young <sean@mess.org>
-Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
----
- drivers/media/rc/gpio-ir-recv.c | 22 ++++++++++++++++++++++
- 1 file changed, 22 insertions(+)
-
---- a/drivers/media/rc/gpio-ir-recv.c
-+++ b/drivers/media/rc/gpio-ir-recv.c
-@@ -30,6 +30,7 @@ struct gpio_rc_dev {
-       struct rc_dev *rcdev;
-       int gpio_nr;
-       bool active_low;
-+      struct timer_list flush_timer;
- };
- #ifdef CONFIG_OF
-@@ -93,12 +94,26 @@ static irqreturn_t gpio_ir_recv_irq(int
-       if (rc < 0)
-               goto err_get_value;
-+      mod_timer(&gpio_dev->flush_timer,
-+                jiffies + nsecs_to_jiffies(gpio_dev->rcdev->timeout));
-+
-       ir_raw_event_handle(gpio_dev->rcdev);
- err_get_value:
-       return IRQ_HANDLED;
- }
-+static void flush_timer(unsigned long arg)
-+{
-+      struct gpio_rc_dev *gpio_dev = (struct gpio_rc_dev *)arg;
-+      DEFINE_IR_RAW_EVENT(ev);
-+
-+      ev.timeout = true;
-+      ev.duration = gpio_dev->rcdev->timeout;
-+      ir_raw_event_store(gpio_dev->rcdev, &ev);
-+      ir_raw_event_handle(gpio_dev->rcdev);
-+}
-+
- static int gpio_ir_recv_probe(struct platform_device *pdev)
- {
-       struct gpio_rc_dev *gpio_dev;
-@@ -144,6 +159,9 @@ static int gpio_ir_recv_probe(struct pla
-       rcdev->input_id.version = 0x0100;
-       rcdev->dev.parent = &pdev->dev;
-       rcdev->driver_name = GPIO_IR_DRIVER_NAME;
-+      rcdev->min_timeout = 0;
-+      rcdev->timeout = IR_DEFAULT_TIMEOUT;
-+      rcdev->max_timeout = 10 * IR_DEFAULT_TIMEOUT;
-       if (pdata->allowed_protos)
-               rcdev->allowed_protocols = pdata->allowed_protos;
-       else
-@@ -154,6 +172,9 @@ static int gpio_ir_recv_probe(struct pla
-       gpio_dev->gpio_nr = pdata->gpio_nr;
-       gpio_dev->active_low = pdata->active_low;
-+      setup_timer(&gpio_dev->flush_timer, flush_timer,
-+                  (unsigned long)gpio_dev);
-+
-       rc = gpio_request(pdata->gpio_nr, "gpio-ir-recv");
-       if (rc < 0)
-               goto err_gpio_request;
-@@ -196,6 +217,7 @@ static int gpio_ir_recv_remove(struct pl
-       struct gpio_rc_dev *gpio_dev = platform_get_drvdata(pdev);
-       free_irq(gpio_to_irq(gpio_dev->gpio_nr), gpio_dev);
-+      del_timer_sync(&gpio_dev->flush_timer);
-       rc_unregister_device(gpio_dev->rcdev);
-       gpio_free(gpio_dev->gpio_nr);
-       kfree(gpio_dev);
diff --git a/target/linux/brcm2708/patches-4.4/0380-smsir.h-remove-a-now-duplicated-definition-IR_DEFAUL.patch b/target/linux/brcm2708/patches-4.4/0380-smsir.h-remove-a-now-duplicated-definition-IR_DEFAUL.patch
new file mode 100644 (file)
index 0000000..53d338b
--- /dev/null
@@ -0,0 +1,24 @@
+From 0f922daa23beb3c3f591d61824a2e4a2031559a3 Mon Sep 17 00:00:00 2001
+From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+Date: Thu, 19 Nov 2015 11:41:36 -0200
+Subject: [PATCH] smsir.h: remove a now duplicated definition
+ (IR_DEFAULT_TIMEOUT)
+
+This macro is now part of the core. Remove from Siano driver.
+
+Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+---
+ drivers/media/common/siano/smsir.h | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/media/common/siano/smsir.h
++++ b/drivers/media/common/siano/smsir.h
+@@ -30,8 +30,6 @@ along with this program.  If not, see <h
+ #include <linux/input.h>
+ #include <media/rc-core.h>
+-#define IR_DEFAULT_TIMEOUT            100
+-
+ struct smscore_device_t;
+ struct ir_t {
diff --git a/target/linux/brcm2708/patches-4.4/0381-Implement-a-wakeup-source-option-for-the-i2c-rtc-Dev.patch b/target/linux/brcm2708/patches-4.4/0381-Implement-a-wakeup-source-option-for-the-i2c-rtc-Dev.patch
new file mode 100644 (file)
index 0000000..7108614
--- /dev/null
@@ -0,0 +1,36 @@
+From 23a16f885df81479a81bc6ba3ebbb4a25716ca6c Mon Sep 17 00:00:00 2001
+From: Nicolas Boullis <nboullis@debian.org>
+Date: Sat, 4 Jun 2016 00:57:06 +0200
+Subject: [PATCH] Implement a "wakeup-source" option for the i2c-rtc DeviceTree
+ overlay.
+
+See: https://github.com/raspberrypi/linux/pull/1511
+---
+ arch/arm/boot/dts/overlays/README              | 3 +++
+ arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts | 4 ++++
+ 2 files changed, 7 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -445,6 +445,9 @@ Params: ds1307                  Select t
+         trickle-resistor-ohms   Resistor value for trickle charge (DS1339-only)
++        wakeup-source           Specify that the RTC can be used as a wakeup
++                                source
++
+ Name:   i2c0-bcm2708
+ Info:   Enable the i2c_bcm2708 driver for the i2c0 bus. Not all pin combinations
+--- a/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts
+@@ -65,5 +65,9 @@
+               pcf8523 = <&pcf8523>,"status";
+               pcf8563 = <&pcf8563>,"status";
+               trickle-resistor-ohms = <&ds1339>,"trickle-resistor-ohms:0";
++              wakeup-source = <&ds1339>,"wakeup-source?",
++                              <&ds3231>,"wakeup-source?",
++                              <&mcp7940x>,"wakeup-source?",
++                              <&mcp7941x>,"wakeup-source?";
+       };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0381-smsir.h-remove-a-now-duplicated-definition-IR_DEFAUL.patch b/target/linux/brcm2708/patches-4.4/0381-smsir.h-remove-a-now-duplicated-definition-IR_DEFAUL.patch
deleted file mode 100644 (file)
index b4cd66e..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-From 3818b6877b525824f6fff4c9ede5f768ce55aac6 Mon Sep 17 00:00:00 2001
-From: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-Date: Thu, 19 Nov 2015 11:41:36 -0200
-Subject: [PATCH 381/423] smsir.h: remove a now duplicated definition
- (IR_DEFAULT_TIMEOUT)
-
-This macro is now part of the core. Remove from Siano driver.
-
-Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
----
- drivers/media/common/siano/smsir.h | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/drivers/media/common/siano/smsir.h
-+++ b/drivers/media/common/siano/smsir.h
-@@ -30,8 +30,6 @@ along with this program.  If not, see <h
- #include <linux/input.h>
- #include <media/rc-core.h>
--#define IR_DEFAULT_TIMEOUT            100
--
- struct smscore_device_t;
- struct ir_t {
diff --git a/target/linux/brcm2708/patches-4.4/0382-BCM270X_DT-Fix-rpi-dac-overlay.patch b/target/linux/brcm2708/patches-4.4/0382-BCM270X_DT-Fix-rpi-dac-overlay.patch
new file mode 100644 (file)
index 0000000..760359c
--- /dev/null
@@ -0,0 +1,34 @@
+From d6b1e376414ff77bcfc449e7dcc0f1ee7b91a888 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 3 Jun 2016 21:56:40 +0100
+Subject: [PATCH] BCM270X_DT: Fix rpi-dac overlay
+
+The rpi-dac overlay is almost identical to the hifiberry-dac overlay -
+the codec used is different but it also doesn't sit on the I2C bus. As
+a result, when the overlays were modified for dynamic loading and it
+was discovered that the hifiberry-dac overlay didn't work any more, the
+the rpi-dac overlay was also broken.
+
+The failure was caused by the fact that outside a bus, device names are
+constructed from the concatenation of the path elements leading to it,
+so moving the codec instantiation inside /soc caused the device name
+to get a "soc" added, breaking ALSA's naming.
+
+See: http://forum.kodi.tv/showthread.php?tid=269814&pid=2349776#pid2349776
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/rpi-dac-overlay.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts
++++ b/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts
+@@ -13,7 +13,7 @@
+       };
+       fragment@1 {
+-              target = <&soc>;
++              target-path = "/";
+               __overlay__ {
+                       pcm1794a-codec {
+                               #sound-dai-cells = <0>;
diff --git a/target/linux/brcm2708/patches-4.4/0382-Implement-a-wakeup-source-option-for-the-i2c-rtc-Dev.patch b/target/linux/brcm2708/patches-4.4/0382-Implement-a-wakeup-source-option-for-the-i2c-rtc-Dev.patch
deleted file mode 100644 (file)
index 571c66b..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0b0219c615f8715c180e0c20bbecb97ae2c49f45 Mon Sep 17 00:00:00 2001
-From: Nicolas Boullis <nboullis@debian.org>
-Date: Sat, 4 Jun 2016 00:57:06 +0200
-Subject: [PATCH 382/423] Implement a "wakeup-source" option for the i2c-rtc
- DeviceTree overlay.
-
-See: https://github.com/raspberrypi/linux/pull/1511
----
- arch/arm/boot/dts/overlays/README              | 3 +++
- arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts | 4 ++++
- 2 files changed, 7 insertions(+)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -445,6 +445,9 @@ Params: ds1307                  Select t
-         trickle-resistor-ohms   Resistor value for trickle charge (DS1339-only)
-+        wakeup-source           Specify that the RTC can be used as a wakeup
-+                                source
-+
- Name:   i2c0-bcm2708
- Info:   Enable the i2c_bcm2708 driver for the i2c0 bus. Not all pin combinations
---- a/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts
-@@ -65,5 +65,9 @@
-               pcf8523 = <&pcf8523>,"status";
-               pcf8563 = <&pcf8563>,"status";
-               trickle-resistor-ohms = <&ds1339>,"trickle-resistor-ohms:0";
-+              wakeup-source = <&ds1339>,"wakeup-source?",
-+                              <&ds3231>,"wakeup-source?",
-+                              <&mcp7940x>,"wakeup-source?",
-+                              <&mcp7941x>,"wakeup-source?";
-       };
- };
diff --git a/target/linux/brcm2708/patches-4.4/0383-BCM270X_DT-Fix-rpi-dac-overlay.patch b/target/linux/brcm2708/patches-4.4/0383-BCM270X_DT-Fix-rpi-dac-overlay.patch
deleted file mode 100644 (file)
index 1f04d53..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From 5524577be75ee648266c47fe6d4a9be80411827f Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 3 Jun 2016 21:56:40 +0100
-Subject: [PATCH 383/423] BCM270X_DT: Fix rpi-dac overlay
-
-The rpi-dac overlay is almost identical to the hifiberry-dac overlay -
-the codec used is different but it also doesn't sit on the I2C bus. As
-a result, when the overlays were modified for dynamic loading and it
-was discovered that the hifiberry-dac overlay didn't work any more, the
-the rpi-dac overlay was also broken.
-
-The failure was caused by the fact that outside a bus, device names are
-constructed from the concatenation of the path elements leading to it,
-so moving the codec instantiation inside /soc caused the device name
-to get a "soc" added, breaking ALSA's naming.
-
-See: http://forum.kodi.tv/showthread.php?tid=269814&pid=2349776#pid2349776
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/rpi-dac-overlay.dts | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts
-@@ -13,7 +13,7 @@
-       };
-       fragment@1 {
--              target = <&soc>;
-+              target-path = "/";
-               __overlay__ {
-                       pcm1794a-codec {
-                               #sound-dai-cells = <0>;
diff --git a/target/linux/brcm2708/patches-4.4/0383-BCM270X_DT-Make-i2c-gpio-usable-by-other-overlays.patch b/target/linux/brcm2708/patches-4.4/0383-BCM270X_DT-Make-i2c-gpio-usable-by-other-overlays.patch
new file mode 100644 (file)
index 0000000..6671b69
--- /dev/null
@@ -0,0 +1,37 @@
+From 5e5cb8f76037673c14925324606738587f65427c Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 6 Jun 2016 09:23:37 +0100
+Subject: [PATCH] BCM270X_DT: Make i2c-gpio usable by other overlays
+
+Modify the i2c-gpio overlay to export symbol i2c-gpio for use by other
+overlays. Export the alias as well for good measure.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts
+@@ -19,6 +19,21 @@
+                       };
+               };
+       };
++
++      fragment@1 {
++              target-path = "/aliases";
++              __overlay__ {
++                      i2c_gpio = "/i2c@0";
++              };
++      };
++
++      fragment@2 {
++              target-path = "/__symbols__";
++              __overlay__ {
++                      i2c_gpio = "/i2c@0";
++              };
++      };
++
+       __overrides__ {
+               i2c_gpio_sda = <&i2c_gpio>,"gpios:4";
+               i2c_gpio_scl = <&i2c_gpio>,"gpios:16";
diff --git a/target/linux/brcm2708/patches-4.4/0384-BCM270X_DT-Make-i2c-gpio-usable-by-other-overlays.patch b/target/linux/brcm2708/patches-4.4/0384-BCM270X_DT-Make-i2c-gpio-usable-by-other-overlays.patch
deleted file mode 100644 (file)
index 81e4ed4..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From 1ea97f82e7a653ad18f39f9de5ea34f182650d70 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Mon, 6 Jun 2016 09:23:37 +0100
-Subject: [PATCH 384/423] BCM270X_DT: Make i2c-gpio usable by other overlays
-
-Modify the i2c-gpio overlay to export symbol i2c-gpio for use by other
-overlays. Export the alias as well for good measure.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts | 15 +++++++++++++++
- 1 file changed, 15 insertions(+)
-
---- a/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts
-@@ -19,6 +19,21 @@
-                       };
-               };
-       };
-+
-+      fragment@1 {
-+              target-path = "/aliases";
-+              __overlay__ {
-+                      i2c_gpio = "/i2c@0";
-+              };
-+      };
-+
-+      fragment@2 {
-+              target-path = "/__symbols__";
-+              __overlay__ {
-+                      i2c_gpio = "/i2c@0";
-+              };
-+      };
-+
-       __overrides__ {
-               i2c_gpio_sda = <&i2c_gpio>,"gpios:4";
-               i2c_gpio_scl = <&i2c_gpio>,"gpios:16";
diff --git a/target/linux/brcm2708/patches-4.4/0387-Add-ads1015-overlay.patch b/target/linux/brcm2708/patches-4.4/0387-Add-ads1015-overlay.patch
new file mode 100644 (file)
index 0000000..80c663e
--- /dev/null
@@ -0,0 +1,155 @@
+From adce42f39f75ac5d479d2b4caff73723107e0539 Mon Sep 17 00:00:00 2001
+From: Erik Sejr <erik@eriks.ssimicro.com>
+Date: Tue, 7 Jun 2016 20:58:17 -0400
+Subject: [PATCH] Add ads1015 overlay
+
+See: https://github.com/raspberrypi/linux/pull/1520
+---
+ arch/arm/boot/dts/overlays/Makefile            |  1 +
+ arch/arm/boot/dts/overlays/README              | 22 ++++++
+ arch/arm/boot/dts/overlays/ads1015-overlay.dts | 98 ++++++++++++++++++++++++++
+ 3 files changed, 121 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/ads1015-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -13,6 +13,7 @@ ifeq ($(CONFIG_ARCH_BCM2835),y)
+ endif
+ dtbo-$(RPI_DT_OVERLAYS) += adau1977-adc.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += ads1015.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -168,6 +168,28 @@ Load:   dtoverlay=adau1977-adc
+ Params: <None>
++Name:   ads1015
++Info:   Overlay for activation of Texas Instruments ADS1015 ADC over I2C
++Load:   dtoverlay=ads1015,<param>=<val>
++Params: addr                    I2C bus address of device. Set based on how the
++                                addr pin is wired. (default=0x48 assumes addr
++                                is pulled to GND)
++        cha_enable              Enable virtual channel a. (default=true)
++        cha_cfg                 Set the configuration for virtual channel a.
++                                (default=4 configures this channel for the
++                                voltage at A0 with respect to GND)
++        cha_datarate            Set the datarate (samples/sec) for this channel.
++                                (default=4 sets 1600 sps)
++        cha_gain                Set the gain of the Programmable Gain
++                                Amplifier for this channel. (default=2 sets the
++                                full scale of the channel to 2.048 Volts)
++
++        Channel (ch) parameters can be set for each enabled channel.
++        A maximum of 4 channels can be enabled (letters a thru d).
++        For more information refer to the device datasheet at:
++        http://www.ti.com/lit/ds/symlink/ads1015.pdf
++
++
+ Name:   ads7846
+ Info:   ADS7846 Touch controller
+ Load:   dtoverlay=ads7846,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/ads1015-overlay.dts
+@@ -0,0 +1,98 @@
++/*
++ * 2016 - Erik Sejr
++ */
++/dts-v1/;
++/plugin/;
++
++/ {
++    compatible = "brcm,bcm2708";
++    /* ----------- ADS1015 ------------ */
++    fragment@0 {
++        target = <&i2c_arm>;
++        __overlay__ {
++            #address-cells = <1>;
++            #size-cells = <0>;
++            status = "okay";
++            ads1015: ads1015 {
++                compatible = "ti,ads1015";
++                status = "okay";
++                #address-cells = <1>;
++                #size-cells = <0>;
++                reg = <0x48>;
++            };
++        };
++    };
++
++    fragment@1 {
++        target-path = "i2c_arm/ads1015";
++        __overlay__ {
++            #address-cells = <1>;
++            #size-cells = <0>;
++            channel_a: channel_a {
++                reg = <4>;
++                ti,gain = <2>;
++                ti,datarate = <4>;
++            };
++        };
++    };
++
++    fragment@2 {
++        target-path = "i2c_arm/ads1015";
++        __dormant__ {
++            #address-cells = <1>;
++            #size-cells = <0>;
++            channel_b: channel_b {
++                reg = <5>;
++                ti,gain = <2>;
++                ti,datarate = <4>;
++            };
++        };
++    };
++
++    fragment@3 {
++        target-path = "i2c_arm/ads1015";
++        __dormant__ {
++            #address-cells = <1>;
++            #size-cells = <0>;
++            channel_c: channel_c {
++                reg = <6>;
++                ti,gain = <2>;
++                ti,datarate = <4>;
++            };
++        };
++    };
++
++    fragment@4 {
++        target-path = "i2c_arm/ads1015";
++        __dormant__ {
++            #address-cells = <1>;
++            #size-cells = <0>;
++            channel_d: channel_d {
++                reg = <7>;
++                ti,gain = <2>;
++                ti,datarate = <4>;
++            };
++        };
++    };
++
++    __overrides__ {
++        addr =            <&ads1015>,"reg:0";
++        cha_enable =      <0>,"=1";
++        cha_cfg =         <&channel_a>,"reg:0";
++        cha_gain =        <&channel_a>,"ti,gain:0";
++        cha_datarate =    <&channel_a>,"ti,datarate:0";
++        chb_enable =      <0>,"=2";
++        chb_cfg =         <&channel_b>,"reg:0";
++        chb_gain =        <&channel_b>,"ti,gain:0";
++        chb_datarate =    <&channel_b>,"ti,datarate:0";
++        chc_enable =      <0>,"=3";
++        chc_cfg =         <&channel_c>,"reg:0";
++        chc_gain =        <&channel_c>,"ti,gain:0";
++        chc_datarate =    <&channel_c>,"ti,datarate:0";
++        chd_enable =      <0>,"=4";
++        chd_cfg =         <&channel_d>,"reg:0";
++        chd_gain =        <&channel_d>,"ti,gain:0";
++        chd_datarate =    <&channel_d>,"ti,datarate:0";
++   };
++
++};
diff --git a/target/linux/brcm2708/patches-4.4/0388-Add-ads1015-overlay.patch b/target/linux/brcm2708/patches-4.4/0388-Add-ads1015-overlay.patch
deleted file mode 100644 (file)
index 1aece82..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-From a16a1b167229779e3e417a1f63eeb176048ef6e0 Mon Sep 17 00:00:00 2001
-From: Erik Sejr <erik@eriks.ssimicro.com>
-Date: Tue, 7 Jun 2016 20:58:17 -0400
-Subject: [PATCH 388/423] Add ads1015 overlay
-
-See: https://github.com/raspberrypi/linux/pull/1520
----
- arch/arm/boot/dts/overlays/Makefile            |  1 +
- arch/arm/boot/dts/overlays/README              | 22 ++++++
- arch/arm/boot/dts/overlays/ads1015-overlay.dts | 98 ++++++++++++++++++++++++++
- 3 files changed, 121 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/ads1015-overlay.dts
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -13,6 +13,7 @@ ifeq ($(CONFIG_ARCH_BCM2835),y)
- endif
- dtbo-$(RPI_DT_OVERLAYS) += adau1977-adc.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += ads1015.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -168,6 +168,28 @@ Load:   dtoverlay=adau1977-adc
- Params: <None>
-+Name:   ads1015
-+Info:   Overlay for activation of Texas Instruments ADS1015 ADC over I2C
-+Load:   dtoverlay=ads1015,<param>=<val>
-+Params: addr                    I2C bus address of device. Set based on how the
-+                                addr pin is wired. (default=0x48 assumes addr
-+                                is pulled to GND)
-+        cha_enable              Enable virtual channel a. (default=true)
-+        cha_cfg                 Set the configuration for virtual channel a.
-+                                (default=4 configures this channel for the
-+                                voltage at A0 with respect to GND)
-+        cha_datarate            Set the datarate (samples/sec) for this channel.
-+                                (default=4 sets 1600 sps)
-+        cha_gain                Set the gain of the Programmable Gain
-+                                Amplifier for this channel. (default=2 sets the
-+                                full scale of the channel to 2.048 Volts)
-+
-+        Channel (ch) parameters can be set for each enabled channel.
-+        A maximum of 4 channels can be enabled (letters a thru d).
-+        For more information refer to the device datasheet at:
-+        http://www.ti.com/lit/ds/symlink/ads1015.pdf
-+
-+
- Name:   ads7846
- Info:   ADS7846 Touch controller
- Load:   dtoverlay=ads7846,<param>=<val>
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/ads1015-overlay.dts
-@@ -0,0 +1,98 @@
-+/*
-+ * 2016 - Erik Sejr
-+ */
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+    compatible = "brcm,bcm2708";
-+    /* ----------- ADS1015 ------------ */
-+    fragment@0 {
-+        target = <&i2c_arm>;
-+        __overlay__ {
-+            #address-cells = <1>;
-+            #size-cells = <0>;
-+            status = "okay";
-+            ads1015: ads1015 {
-+                compatible = "ti,ads1015";
-+                status = "okay";
-+                #address-cells = <1>;
-+                #size-cells = <0>;
-+                reg = <0x48>;
-+            };
-+        };
-+    };
-+
-+    fragment@1 {
-+        target-path = "i2c_arm/ads1015";
-+        __overlay__ {
-+            #address-cells = <1>;
-+            #size-cells = <0>;
-+            channel_a: channel_a {
-+                reg = <4>;
-+                ti,gain = <2>;
-+                ti,datarate = <4>;
-+            };
-+        };
-+    };
-+
-+    fragment@2 {
-+        target-path = "i2c_arm/ads1015";
-+        __dormant__ {
-+            #address-cells = <1>;
-+            #size-cells = <0>;
-+            channel_b: channel_b {
-+                reg = <5>;
-+                ti,gain = <2>;
-+                ti,datarate = <4>;
-+            };
-+        };
-+    };
-+
-+    fragment@3 {
-+        target-path = "i2c_arm/ads1015";
-+        __dormant__ {
-+            #address-cells = <1>;
-+            #size-cells = <0>;
-+            channel_c: channel_c {
-+                reg = <6>;
-+                ti,gain = <2>;
-+                ti,datarate = <4>;
-+            };
-+        };
-+    };
-+
-+    fragment@4 {
-+        target-path = "i2c_arm/ads1015";
-+        __dormant__ {
-+            #address-cells = <1>;
-+            #size-cells = <0>;
-+            channel_d: channel_d {
-+                reg = <7>;
-+                ti,gain = <2>;
-+                ti,datarate = <4>;
-+            };
-+        };
-+    };
-+
-+    __overrides__ {
-+        addr =            <&ads1015>,"reg:0";
-+        cha_enable =      <0>,"=1";
-+        cha_cfg =         <&channel_a>,"reg:0";
-+        cha_gain =        <&channel_a>,"ti,gain:0";
-+        cha_datarate =    <&channel_a>,"ti,datarate:0";
-+        chb_enable =      <0>,"=2";
-+        chb_cfg =         <&channel_b>,"reg:0";
-+        chb_gain =        <&channel_b>,"ti,gain:0";
-+        chb_datarate =    <&channel_b>,"ti,datarate:0";
-+        chc_enable =      <0>,"=3";
-+        chc_cfg =         <&channel_c>,"reg:0";
-+        chc_gain =        <&channel_c>,"ti,gain:0";
-+        chc_datarate =    <&channel_c>,"ti,datarate:0";
-+        chd_enable =      <0>,"=4";
-+        chd_cfg =         <&channel_d>,"reg:0";
-+        chd_gain =        <&channel_d>,"ti,gain:0";
-+        chd_datarate =    <&channel_d>,"ti,datarate:0";
-+   };
-+
-+};
diff --git a/target/linux/brcm2708/patches-4.4/0388-Fixed-MCP23017-section-in-overlay-README.patch b/target/linux/brcm2708/patches-4.4/0388-Fixed-MCP23017-section-in-overlay-README.patch
new file mode 100644 (file)
index 0000000..a120f14
--- /dev/null
@@ -0,0 +1,22 @@
+From 83ee5f5d26599a914e05a9eac8250029a4410969 Mon Sep 17 00:00:00 2001
+From: Michael Kaplan <m.kaplan@evva.com>
+Date: Wed, 8 Jun 2016 15:14:11 +0200
+Subject: [PATCH] Fixed MCP23017 section in overlay README
+
+Old description could have led to the misunderstanding that it is an
+i2c port expander, but in fact it is a gpio expander.
+---
+ 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
+@@ -595,7 +595,7 @@ Params: gpio_out_pin            GPIO for
+ Name:   mcp23017
+-Info:   Configures the MCP23017 I2C port expander
++Info:   Configures the MCP23017 I2C GPIO expander
+ Load:   dtoverlay=mcp23017,<param>=<val>
+ Params: gpiopin                 Gpio pin connected to the INTA output of the
+                                 MCP23017 (default: 4)
diff --git a/target/linux/brcm2708/patches-4.4/0389-Fixed-MCP23017-section-in-overlay-README.patch b/target/linux/brcm2708/patches-4.4/0389-Fixed-MCP23017-section-in-overlay-README.patch
deleted file mode 100644 (file)
index 21676a8..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From 863ab87efa682d499ed1bfaeae1753e4a86b392d Mon Sep 17 00:00:00 2001
-From: Michael Kaplan <m.kaplan@evva.com>
-Date: Wed, 8 Jun 2016 15:14:11 +0200
-Subject: [PATCH 389/423] Fixed MCP23017 section in overlay README
-
-Old description could have led to the misunderstanding that it is an
-i2c port expander, but in fact it is a gpio expander.
----
- 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
-@@ -595,7 +595,7 @@ Params: gpio_out_pin            GPIO for
- Name:   mcp23017
--Info:   Configures the MCP23017 I2C port expander
-+Info:   Configures the MCP23017 I2C GPIO expander
- Load:   dtoverlay=mcp23017,<param>=<val>
- Params: gpiopin                 Gpio pin connected to the INTA output of the
-                                 MCP23017 (default: 4)
diff --git a/target/linux/brcm2708/patches-4.4/0389-Revert-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch b/target/linux/brcm2708/patches-4.4/0389-Revert-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch
new file mode 100644 (file)
index 0000000..3cbcba0
--- /dev/null
@@ -0,0 +1,86 @@
+From a236ecec838c8cf9928e9d2b8dc03346276627a1 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Fri, 22 Apr 2016 17:17:13 +0000
+Subject: [PATCH] Revert "bcm2835-dma: Fix up convert to DMA pool"
+
+This reverts commit ec2e48fda22c57cab56a4332d1a095f91c919493.
+---
+ drivers/dma/bcm2835-dma.c | 36 ++++++++++--------------------------
+ 1 file changed, 10 insertions(+), 26 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -488,17 +488,6 @@ static struct dma_async_tx_descriptor *b
+       c->cyclic = true;
+       return vchan_tx_prep(&c->vc, &d->vd, flags);
+-error_cb:
+-      i--;
+-      for (; i >= 0; i--) {
+-              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
+-
+-              dma_pool_free(c->cb_pool, cb_entry->cb, cb_entry->paddr);
+-      }
+-
+-      kfree(d->cb_list);
+-      kfree(d);
+-      return NULL;
+ }
+ static struct dma_async_tx_descriptor *
+@@ -545,7 +534,6 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
+       if (!d)
+               return NULL;
+-      d->c = c;
+       d->dir = direction;
+       if (c->ch >= 8) /* LITE channel */
+@@ -565,21 +553,15 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
+               d->frames += len / max_size + 1;
+       }
+-      d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
+-      if (!d->cb_list) {
++      /* Allocate memory for control blocks */
++      d->control_block_size = d->frames * sizeof(struct bcm2835_dma_cb);
++      d->control_block_base = dma_zalloc_coherent(chan->device->dev,
++                      d->control_block_size, &d->control_block_base_phys,
++                      GFP_NOWAIT);
++      if (!d->control_block_base) {
+               kfree(d);
+               return NULL;
+       }
+-      /* Allocate memory for control blocks */
+-      for (i = 0; i < d->frames; i++) {
+-              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
+-
+-              cb_entry->cb = dma_pool_zalloc(c->cb_pool, GFP_ATOMIC,
+-                                              &cb_entry->paddr);
+-
+-              if (!cb_entry->cb)
+-                      goto error_cb;
+-      }
+       /*
+        * Iterate over all SG entries, create a control block
+@@ -596,7 +578,7 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
+               for (j = 0; j < len; j += max_size) {
+                       struct bcm2835_dma_cb *control_block =
+-                              d->cb_list[i + split_cnt].cb;
++                              &d->control_block_base[i + split_cnt];
+                       /* Setup addresses */
+                       if (d->dir == DMA_DEV_TO_MEM) {
+@@ -638,7 +620,9 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
+                       if (i < sg_len - 1 || len - j > max_size) {
+                               /* Next block is the next frame. */
+                               control_block->next =
+-                                      d->cb_list[i + split_cnt + 1].paddr;
++                                      d->control_block_base_phys +
++                                      sizeof(struct bcm2835_dma_cb) *
++                                      (i + split_cnt + 1);
+                       } else {
+                               /* Next block is empty. */
+                               control_block->next = 0;
diff --git a/target/linux/brcm2708/patches-4.4/0390-Revert-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch b/target/linux/brcm2708/patches-4.4/0390-Revert-bcm2835-dma-Fix-up-convert-to-DMA-pool.patch
deleted file mode 100644 (file)
index 97a16a2..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-From d9c36fdc44cdf154a0849b03e94b0a6b6f86defb Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Fri, 22 Apr 2016 17:17:13 +0000
-Subject: [PATCH 390/423] Revert "bcm2835-dma: Fix up convert to DMA pool"
-
-This reverts commit ec2e48fda22c57cab56a4332d1a095f91c919493.
----
- drivers/dma/bcm2835-dma.c | 36 ++++++++++--------------------------
- 1 file changed, 10 insertions(+), 26 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -488,17 +488,6 @@ static struct dma_async_tx_descriptor *b
-       c->cyclic = true;
-       return vchan_tx_prep(&c->vc, &d->vd, flags);
--error_cb:
--      i--;
--      for (; i >= 0; i--) {
--              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
--
--              dma_pool_free(c->cb_pool, cb_entry->cb, cb_entry->paddr);
--      }
--
--      kfree(d->cb_list);
--      kfree(d);
--      return NULL;
- }
- static struct dma_async_tx_descriptor *
-@@ -545,7 +534,6 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
-       if (!d)
-               return NULL;
--      d->c = c;
-       d->dir = direction;
-       if (c->ch >= 8) /* LITE channel */
-@@ -565,21 +553,15 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
-               d->frames += len / max_size + 1;
-       }
--      d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
--      if (!d->cb_list) {
-+      /* Allocate memory for control blocks */
-+      d->control_block_size = d->frames * sizeof(struct bcm2835_dma_cb);
-+      d->control_block_base = dma_zalloc_coherent(chan->device->dev,
-+                      d->control_block_size, &d->control_block_base_phys,
-+                      GFP_NOWAIT);
-+      if (!d->control_block_base) {
-               kfree(d);
-               return NULL;
-       }
--      /* Allocate memory for control blocks */
--      for (i = 0; i < d->frames; i++) {
--              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
--
--              cb_entry->cb = dma_pool_zalloc(c->cb_pool, GFP_ATOMIC,
--                                              &cb_entry->paddr);
--
--              if (!cb_entry->cb)
--                      goto error_cb;
--      }
-       /*
-        * Iterate over all SG entries, create a control block
-@@ -596,7 +578,7 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
-               for (j = 0; j < len; j += max_size) {
-                       struct bcm2835_dma_cb *control_block =
--                              d->cb_list[i + split_cnt].cb;
-+                              &d->control_block_base[i + split_cnt];
-                       /* Setup addresses */
-                       if (d->dir == DMA_DEV_TO_MEM) {
-@@ -638,7 +620,9 @@ bcm2835_dma_prep_slave_sg(struct dma_cha
-                       if (i < sg_len - 1 || len - j > max_size) {
-                               /* Next block is the next frame. */
-                               control_block->next =
--                                      d->cb_list[i + split_cnt + 1].paddr;
-+                                      d->control_block_base_phys +
-+                                      sizeof(struct bcm2835_dma_cb) *
-+                                      (i + split_cnt + 1);
-                       } else {
-                               /* Next block is empty. */
-                               control_block->next = 0;
diff --git a/target/linux/brcm2708/patches-4.4/0390-Revert-bcm2835-dma-Limit-cyclic-transfers-on-lite-ch.patch b/target/linux/brcm2708/patches-4.4/0390-Revert-bcm2835-dma-Limit-cyclic-transfers-on-lite-ch.patch
new file mode 100644 (file)
index 0000000..d99355d
--- /dev/null
@@ -0,0 +1,35 @@
+From 31c4d45f25abd0680e05775f3166ec6066e39a2a Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Fri, 22 Apr 2016 17:17:22 +0000
+Subject: [PATCH] Revert "bcm2835-dma: Limit cyclic transfers on lite channels
+ to 32k"
+
+This reverts commit 052c2005b6ecedc5abad86632f5781adda310aa7.
+---
+ drivers/dma/bcm2835-dma.c | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -144,12 +144,6 @@ struct bcm2835_desc {
+  */
+ #define MAX_LITE_TRANSFER     (SZ_64K - 4)
+-/*
+- * Transfers larger than 32k cause issues with the bcm2708-i2s driver,
+- * so limit transfer size to 32k as bcm2708-dmaengine did.
+- */
+-#define MAX_CYCLIC_LITE_TRANSFER      SZ_32K
+-
+ static inline struct bcm2835_dmadev *to_bcm2835_dma_dev(struct dma_device *d)
+ {
+       return container_of(d, struct bcm2835_dmadev, ddev);
+@@ -418,7 +412,7 @@ static struct dma_async_tx_descriptor *b
+       d->c = c;
+       d->dir = direction;
+       if (c->ch >= 8) /* LITE channel */
+-              max_size = MAX_CYCLIC_LITE_TRANSFER;
++              max_size = MAX_LITE_TRANSFER;
+       else
+               max_size = MAX_NORMAL_TRANSFER;
+       period_len = min(period_len, max_size);
diff --git a/target/linux/brcm2708/patches-4.4/0391-Revert-bcm2835-dma-Limit-cyclic-transfers-on-lite-ch.patch b/target/linux/brcm2708/patches-4.4/0391-Revert-bcm2835-dma-Limit-cyclic-transfers-on-lite-ch.patch
deleted file mode 100644 (file)
index 1fd6fb2..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0bdc822d579b856a40a24f8c58765d2200f15099 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Fri, 22 Apr 2016 17:17:22 +0000
-Subject: [PATCH 391/423] Revert "bcm2835-dma: Limit cyclic transfers on lite
- channels to 32k"
-
-This reverts commit 052c2005b6ecedc5abad86632f5781adda310aa7.
----
- drivers/dma/bcm2835-dma.c | 8 +-------
- 1 file changed, 1 insertion(+), 7 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -144,12 +144,6 @@ struct bcm2835_desc {
-  */
- #define MAX_LITE_TRANSFER     (SZ_64K - 4)
--/*
-- * Transfers larger than 32k cause issues with the bcm2708-i2s driver,
-- * so limit transfer size to 32k as bcm2708-dmaengine did.
-- */
--#define MAX_CYCLIC_LITE_TRANSFER      SZ_32K
--
- static inline struct bcm2835_dmadev *to_bcm2835_dma_dev(struct dma_device *d)
- {
-       return container_of(d, struct bcm2835_dmadev, ddev);
-@@ -418,7 +412,7 @@ static struct dma_async_tx_descriptor *b
-       d->c = c;
-       d->dir = direction;
-       if (c->ch >= 8) /* LITE channel */
--              max_size = MAX_CYCLIC_LITE_TRANSFER;
-+              max_size = MAX_LITE_TRANSFER;
-       else
-               max_size = MAX_NORMAL_TRANSFER;
-       period_len = min(period_len, max_size);
diff --git a/target/linux/brcm2708/patches-4.4/0391-Revert-dmaengine-bcm2835-Load-driver-early-and-suppo.patch b/target/linux/brcm2708/patches-4.4/0391-Revert-dmaengine-bcm2835-Load-driver-early-and-suppo.patch
new file mode 100644 (file)
index 0000000..b7fdb9e
--- /dev/null
@@ -0,0 +1,90 @@
+From 7d58feb7f06a5e05aa3b99b32b4bba4b927b7b3f Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Fri, 22 Apr 2016 17:17:30 +0000
+Subject: [PATCH] Revert "dmaengine: bcm2835: Load driver early and support
+ legacy API"
+
+This reverts commit 6f56fff39c811953809b011f59c49a2122c4d173.
+---
+ drivers/dma/Kconfig       |  2 +-
+ drivers/dma/bcm2835-dma.c | 30 ++++++------------------------
+ 2 files changed, 7 insertions(+), 25 deletions(-)
+
+--- a/drivers/dma/Kconfig
++++ b/drivers/dma/Kconfig
+@@ -108,7 +108,7 @@ config COH901318
+ config DMA_BCM2835
+       tristate "BCM2835 DMA engine support"
+-      depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
++      depends on ARCH_BCM2835
+       select DMA_ENGINE
+       select DMA_VIRTUAL_CHANNELS
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -36,7 +36,6 @@
+ #include <linux/interrupt.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
+-#include <linux/platform_data/dma-bcm2708.h>
+ #include <linux/platform_device.h>
+ #include <linux/slab.h>
+ #include <linux/io.h>
+@@ -787,10 +786,6 @@ static int bcm2835_dma_probe(struct plat
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+-      rc = bcm_dmaman_probe(pdev, base, BCM2835_DMA_BULK_MASK);
+-      if (rc)
+-              dev_err(&pdev->dev, "Failed to initialize the legacy API\n");
+-
+       od->base = base;
+       dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
+@@ -823,8 +818,11 @@ static int bcm2835_dma_probe(struct plat
+               goto err_no_dma;
+       }
+-      /* Channel 0 is used by the legacy API */
+-      chans_available &= ~BCM2835_DMA_BULK_MASK;
++      /*
++       * Do not use the FIQ and BULK channels,
++       * because they are used by the GPU.
++       */
++      chans_available &= ~(BCM2835_DMA_FIQ_MASK | BCM2835_DMA_BULK_MASK);
+       for (i = 0; i < pdev->num_resources; i++) {
+               irq = platform_get_irq(pdev, i);
+@@ -868,7 +866,6 @@ static int bcm2835_dma_remove(struct pla
+ {
+       struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
+-      bcm_dmaman_remove(pdev);
+       dma_async_device_unregister(&od->ddev);
+       bcm2835_dma_free(od);
+@@ -884,22 +881,7 @@ static struct platform_driver bcm2835_dm
+       },
+ };
+-static int bcm2835_dma_init(void)
+-{
+-      return platform_driver_register(&bcm2835_dma_driver);
+-}
+-
+-static void bcm2835_dma_exit(void)
+-{
+-      platform_driver_unregister(&bcm2835_dma_driver);
+-}
+-
+-/*
+- * Load after serial driver (arch_initcall) so we see the messages if it fails,
+- * but before drivers (module_init) that need a DMA channel.
+- */
+-subsys_initcall(bcm2835_dma_init);
+-module_exit(bcm2835_dma_exit);
++module_platform_driver(bcm2835_dma_driver);
+ MODULE_ALIAS("platform:bcm2835-dma");
+ MODULE_DESCRIPTION("BCM2835 DMA engine driver");
diff --git a/target/linux/brcm2708/patches-4.4/0392-Revert-dmaengine-bcm2835-Add-slave-dma-support.patch b/target/linux/brcm2708/patches-4.4/0392-Revert-dmaengine-bcm2835-Add-slave-dma-support.patch
new file mode 100644 (file)
index 0000000..7cac679
--- /dev/null
@@ -0,0 +1,312 @@
+From b80a19b329a3fcbb74490a4b8d86055ee7d40c13 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Fri, 22 Apr 2016 17:17:37 +0000
+Subject: [PATCH] Revert "dmaengine: bcm2835: Add slave dma support"
+
+This reverts commit 8a349301238aabb40c9da5ca8c8492b6b8d146f6.
+---
+ drivers/dma/bcm2835-dma.c | 206 ++++------------------------------------------
+ 1 file changed, 14 insertions(+), 192 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -1,10 +1,11 @@
+ /*
+  * BCM2835 DMA engine support
+  *
++ * This driver only supports cyclic DMA transfers
++ * as needed for the I2S module.
++ *
+  * Author:      Florian Meier <florian.meier@koalo.de>
+  *              Copyright 2013
+- *              Gellert Weisz <gellert@raspberrypi.org>
+- *              Copyright 2013-2014
+  *
+  * Based on
+  *    OMAP DMAengine support by Russell King
+@@ -94,8 +95,6 @@ struct bcm2835_desc {
+       size_t size;
+ };
+-#define BCM2835_DMA_WAIT_CYCLES       0  /* Slow down DMA transfers: 0-31 */
+-
+ #define BCM2835_DMA_CS                0x00
+ #define BCM2835_DMA_ADDR      0x04
+ #define BCM2835_DMA_SOURCE_AD 0x0c
+@@ -112,16 +111,12 @@ struct bcm2835_desc {
+ #define BCM2835_DMA_RESET     BIT(31) /* WO, self clearing */
+ #define BCM2835_DMA_INT_EN    BIT(0)
+-#define BCM2835_DMA_WAIT_RESP BIT(3)
+ #define BCM2835_DMA_D_INC     BIT(4)
+-#define BCM2835_DMA_D_WIDTH   BIT(5)
+ #define BCM2835_DMA_D_DREQ    BIT(6)
+ #define BCM2835_DMA_S_INC     BIT(8)
+-#define BCM2835_DMA_S_WIDTH   BIT(9)
+ #define BCM2835_DMA_S_DREQ    BIT(10)
+ #define BCM2835_DMA_PER_MAP(x)        ((x) << 16)
+-#define BCM2835_DMA_WAITS(x)  (((x) & 0x1f) << 21)
+ #define BCM2835_DMA_DATA_TYPE_S8      1
+ #define BCM2835_DMA_DATA_TYPE_S16     2
+@@ -135,14 +130,6 @@ struct bcm2835_desc {
+ #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
+ #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
+-#define MAX_NORMAL_TRANSFER   SZ_1G
+-/*
+- * Max length on a Lite channel is 65535 bytes.
+- * DMA handles byte-enables on SDRAM reads and writes even on 128-bit accesses,
+- * but byte-enables don't exist on peripheral addresses, so align to 32-bit.
+- */
+-#define MAX_LITE_TRANSFER     (SZ_64K - 4)
+-
+ static inline struct bcm2835_dmadev *to_bcm2835_dma_dev(struct dma_device *d)
+ {
+       return container_of(d, struct bcm2835_dmadev, ddev);
+@@ -239,19 +226,13 @@ static irqreturn_t bcm2835_dma_callback(
+       d = c->desc;
+       if (d) {
+-              if (c->cyclic) {
+-                      vchan_cyclic_callback(&d->vd);
+-
+-                      /* Keep the DMA engine running */
+-                      writel(BCM2835_DMA_ACTIVE,
+-                             c->chan_base + BCM2835_DMA_CS);
+-
+-              } else {
+-                      vchan_cookie_complete(&c->desc->vd);
+-                      bcm2835_dma_start_desc(c);
+-              }
++              /* TODO Only works for cyclic DMA */
++              vchan_cyclic_callback(&d->vd);
+       }
++      /* Keep the DMA engine running */
++      writel(BCM2835_DMA_ACTIVE, c->chan_base + BCM2835_DMA_CS);
++
+       spin_unlock_irqrestore(&c->vc.lock, flags);
+       return IRQ_HANDLED;
+@@ -358,6 +339,8 @@ static void bcm2835_dma_issue_pending(st
+       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
+       unsigned long flags;
++      c->cyclic = true; /* Nothing else is implemented */
++
+       spin_lock_irqsave(&c->vc.lock, flags);
+       if (vchan_issue_pending(&c->vc) && !c->desc)
+               bcm2835_dma_start_desc(c);
+@@ -375,7 +358,7 @@ static struct dma_async_tx_descriptor *b
+       struct bcm2835_desc *d;
+       dma_addr_t dev_addr;
+       unsigned int es, sync_type;
+-      unsigned int frame, max_size;
++      unsigned int frame;
+       int i;
+       /* Grab configuration */
+@@ -410,12 +393,7 @@ static struct dma_async_tx_descriptor *b
+       d->c = c;
+       d->dir = direction;
+-      if (c->ch >= 8) /* LITE channel */
+-              max_size = MAX_LITE_TRANSFER;
+-      else
+-              max_size = MAX_NORMAL_TRANSFER;
+-      period_len = min(period_len, max_size);
+-      d->frames = (buf_len - 1) / (period_len + 1);
++      d->frames = buf_len / period_len;
+       d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
+       if (!d->cb_list) {
+@@ -463,171 +441,17 @@ static struct dma_async_tx_descriptor *b
+                               BCM2835_DMA_PER_MAP(c->dreq);
+               /* Length of a frame */
+-              if (frame != d->frames - 1)
+-                      control_block->length = period_len;
+-              else
+-                      control_block->length = buf_len - (d->frames - 1) *
+-                                              period_len;
++              control_block->length = period_len;
+               d->size += control_block->length;
+               /*
+                * Next block is the next frame.
+-               * This function is called on cyclic DMA transfers.
++               * This DMA engine driver currently only supports cyclic DMA.
+                * Therefore, wrap around at number of frames.
+                */
+               control_block->next = d->cb_list[((frame + 1) % d->frames)].paddr;
+       }
+-      c->cyclic = true;
+-
+-      return vchan_tx_prep(&c->vc, &d->vd, flags);
+-}
+-
+-static struct dma_async_tx_descriptor *
+-bcm2835_dma_prep_slave_sg(struct dma_chan *chan,
+-                        struct scatterlist *sgl,
+-                        unsigned int sg_len,
+-                        enum dma_transfer_direction direction,
+-                        unsigned long flags, void *context)
+-{
+-      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
+-      enum dma_slave_buswidth dev_width;
+-      struct bcm2835_desc *d;
+-      dma_addr_t dev_addr;
+-      struct scatterlist *sgent;
+-      unsigned int i, sync_type, split_cnt, max_size;
+-
+-      if (!is_slave_direction(direction)) {
+-              dev_err(chan->device->dev, "direction not supported\n");
+-              return NULL;
+-      }
+-
+-      if (direction == DMA_DEV_TO_MEM) {
+-              dev_addr = c->cfg.src_addr;
+-              dev_width = c->cfg.src_addr_width;
+-              sync_type = BCM2835_DMA_S_DREQ;
+-      } else {
+-              dev_addr = c->cfg.dst_addr;
+-              dev_width = c->cfg.dst_addr_width;
+-              sync_type = BCM2835_DMA_D_DREQ;
+-      }
+-
+-      /* Bus width translates to the element size (ES) */
+-      switch (dev_width) {
+-      case DMA_SLAVE_BUSWIDTH_4_BYTES:
+-              break;
+-      default:
+-              dev_err(chan->device->dev, "buswidth not supported: %i\n",
+-                      dev_width);
+-              return NULL;
+-      }
+-
+-      /* Allocate and setup the descriptor. */
+-      d = kzalloc(sizeof(*d), GFP_NOWAIT);
+-      if (!d)
+-              return NULL;
+-
+-      d->dir = direction;
+-
+-      if (c->ch >= 8) /* LITE channel */
+-              max_size = MAX_LITE_TRANSFER;
+-      else
+-              max_size = MAX_NORMAL_TRANSFER;
+-
+-      /*
+-       * Store the length of the SG list in d->frames
+-       * taking care to account for splitting up transfers
+-       * too large for a LITE channel
+-       */
+-      d->frames = 0;
+-      for_each_sg(sgl, sgent, sg_len, i) {
+-              unsigned int len = sg_dma_len(sgent);
+-
+-              d->frames += len / max_size + 1;
+-      }
+-
+-      /* Allocate memory for control blocks */
+-      d->control_block_size = d->frames * sizeof(struct bcm2835_dma_cb);
+-      d->control_block_base = dma_zalloc_coherent(chan->device->dev,
+-                      d->control_block_size, &d->control_block_base_phys,
+-                      GFP_NOWAIT);
+-      if (!d->control_block_base) {
+-              kfree(d);
+-              return NULL;
+-      }
+-
+-      /*
+-       * Iterate over all SG entries, create a control block
+-       * for each frame and link them together.
+-       * Count the number of times an SG entry had to be split
+-       * as a result of using a LITE channel
+-       */
+-      split_cnt = 0;
+-
+-      for_each_sg(sgl, sgent, sg_len, i) {
+-              unsigned int j;
+-              dma_addr_t addr = sg_dma_address(sgent);
+-              unsigned int len = sg_dma_len(sgent);
+-
+-              for (j = 0; j < len; j += max_size) {
+-                      struct bcm2835_dma_cb *control_block =
+-                              &d->control_block_base[i + split_cnt];
+-
+-                      /* Setup addresses */
+-                      if (d->dir == DMA_DEV_TO_MEM) {
+-                              control_block->info = BCM2835_DMA_D_INC |
+-                                                    BCM2835_DMA_D_WIDTH |
+-                                                    BCM2835_DMA_S_DREQ;
+-                              control_block->src = dev_addr;
+-                              control_block->dst = addr + (dma_addr_t)j;
+-                      } else {
+-                              control_block->info = BCM2835_DMA_S_INC |
+-                                                    BCM2835_DMA_S_WIDTH |
+-                                                    BCM2835_DMA_D_DREQ;
+-                              control_block->src = addr + (dma_addr_t)j;
+-                              control_block->dst = dev_addr;
+-                      }
+-
+-                      /* Common part */
+-                      control_block->info |=
+-                              BCM2835_DMA_WAITS(BCM2835_DMA_WAIT_CYCLES);
+-                      control_block->info |= BCM2835_DMA_WAIT_RESP;
+-
+-                      /* Enable */
+-                      if (i == sg_len - 1 && len - j <= max_size)
+-                              control_block->info |= BCM2835_DMA_INT_EN;
+-
+-                      /* Setup synchronization */
+-                      if (sync_type)
+-                              control_block->info |= sync_type;
+-
+-                      /* Setup DREQ channel */
+-                      if (c->dreq)
+-                              control_block->info |=
+-                                      BCM2835_DMA_PER_MAP(c->dreq);
+-
+-                      /* Length of a frame */
+-                      control_block->length = min(len - j, max_size);
+-                      d->size += control_block->length;
+-
+-                      if (i < sg_len - 1 || len - j > max_size) {
+-                              /* Next block is the next frame. */
+-                              control_block->next =
+-                                      d->control_block_base_phys +
+-                                      sizeof(struct bcm2835_dma_cb) *
+-                                      (i + split_cnt + 1);
+-                      } else {
+-                              /* Next block is empty. */
+-                              control_block->next = 0;
+-                      }
+-
+-                      if (len - j > max_size)
+-                              split_cnt++;
+-              }
+-      }
+-
+-      c->cyclic = false;
+-
+       return vchan_tx_prep(&c->vc, &d->vd, flags);
+ error_cb:
+       i--;
+@@ -796,7 +620,6 @@ static int bcm2835_dma_probe(struct plat
+       od->ddev.device_tx_status = bcm2835_dma_tx_status;
+       od->ddev.device_issue_pending = bcm2835_dma_issue_pending;
+       od->ddev.device_prep_dma_cyclic = bcm2835_dma_prep_dma_cyclic;
+-      od->ddev.device_prep_slave_sg = bcm2835_dma_prep_slave_sg;
+       od->ddev.device_config = bcm2835_dma_slave_config;
+       od->ddev.device_terminate_all = bcm2835_dma_terminate_all;
+       od->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
+@@ -886,5 +709,4 @@ module_platform_driver(bcm2835_dma_drive
+ MODULE_ALIAS("platform:bcm2835-dma");
+ MODULE_DESCRIPTION("BCM2835 DMA engine driver");
+ MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
+-MODULE_AUTHOR("Gellert Weisz <gellert@raspberrypi.org>");
+ MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0392-Revert-dmaengine-bcm2835-Load-driver-early-and-suppo.patch b/target/linux/brcm2708/patches-4.4/0392-Revert-dmaengine-bcm2835-Load-driver-early-and-suppo.patch
deleted file mode 100644 (file)
index 5ad5ffa..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-From 7550c11bac6c1990f2e4a583c99e211cb402782b Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Fri, 22 Apr 2016 17:17:30 +0000
-Subject: [PATCH 392/423] Revert "dmaengine: bcm2835: Load driver early and
- support legacy API"
-
-This reverts commit 6f56fff39c811953809b011f59c49a2122c4d173.
----
- drivers/dma/Kconfig       |  2 +-
- drivers/dma/bcm2835-dma.c | 30 ++++++------------------------
- 2 files changed, 7 insertions(+), 25 deletions(-)
-
---- a/drivers/dma/Kconfig
-+++ b/drivers/dma/Kconfig
-@@ -108,7 +108,7 @@ config COH901318
- config DMA_BCM2835
-       tristate "BCM2835 DMA engine support"
--      depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
-+      depends on ARCH_BCM2835
-       select DMA_ENGINE
-       select DMA_VIRTUAL_CHANNELS
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -36,7 +36,6 @@
- #include <linux/interrupt.h>
- #include <linux/list.h>
- #include <linux/module.h>
--#include <linux/platform_data/dma-bcm2708.h>
- #include <linux/platform_device.h>
- #include <linux/slab.h>
- #include <linux/io.h>
-@@ -787,10 +786,6 @@ static int bcm2835_dma_probe(struct plat
-       if (IS_ERR(base))
-               return PTR_ERR(base);
--      rc = bcm_dmaman_probe(pdev, base, BCM2835_DMA_BULK_MASK);
--      if (rc)
--              dev_err(&pdev->dev, "Failed to initialize the legacy API\n");
--
-       od->base = base;
-       dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
-@@ -823,8 +818,11 @@ static int bcm2835_dma_probe(struct plat
-               goto err_no_dma;
-       }
--      /* Channel 0 is used by the legacy API */
--      chans_available &= ~BCM2835_DMA_BULK_MASK;
-+      /*
-+       * Do not use the FIQ and BULK channels,
-+       * because they are used by the GPU.
-+       */
-+      chans_available &= ~(BCM2835_DMA_FIQ_MASK | BCM2835_DMA_BULK_MASK);
-       for (i = 0; i < pdev->num_resources; i++) {
-               irq = platform_get_irq(pdev, i);
-@@ -868,7 +866,6 @@ static int bcm2835_dma_remove(struct pla
- {
-       struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
--      bcm_dmaman_remove(pdev);
-       dma_async_device_unregister(&od->ddev);
-       bcm2835_dma_free(od);
-@@ -884,22 +881,7 @@ static struct platform_driver bcm2835_dm
-       },
- };
--static int bcm2835_dma_init(void)
--{
--      return platform_driver_register(&bcm2835_dma_driver);
--}
--
--static void bcm2835_dma_exit(void)
--{
--      platform_driver_unregister(&bcm2835_dma_driver);
--}
--
--/*
-- * Load after serial driver (arch_initcall) so we see the messages if it fails,
-- * but before drivers (module_init) that need a DMA channel.
-- */
--subsys_initcall(bcm2835_dma_init);
--module_exit(bcm2835_dma_exit);
-+module_platform_driver(bcm2835_dma_driver);
- MODULE_ALIAS("platform:bcm2835-dma");
- MODULE_DESCRIPTION("BCM2835 DMA engine driver");
diff --git a/target/linux/brcm2708/patches-4.4/0393-Revert-dmaengine-bcm2835-Add-slave-dma-support.patch b/target/linux/brcm2708/patches-4.4/0393-Revert-dmaengine-bcm2835-Add-slave-dma-support.patch
deleted file mode 100644 (file)
index 890ebb8..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-From c748f44b0b10023e4207cb288ce9c169e390fbaf Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Fri, 22 Apr 2016 17:17:37 +0000
-Subject: [PATCH 393/423] Revert "dmaengine: bcm2835: Add slave dma support"
-
-This reverts commit 8a349301238aabb40c9da5ca8c8492b6b8d146f6.
----
- drivers/dma/bcm2835-dma.c | 206 ++++------------------------------------------
- 1 file changed, 14 insertions(+), 192 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -1,10 +1,11 @@
- /*
-  * BCM2835 DMA engine support
-  *
-+ * This driver only supports cyclic DMA transfers
-+ * as needed for the I2S module.
-+ *
-  * Author:      Florian Meier <florian.meier@koalo.de>
-  *              Copyright 2013
-- *              Gellert Weisz <gellert@raspberrypi.org>
-- *              Copyright 2013-2014
-  *
-  * Based on
-  *    OMAP DMAengine support by Russell King
-@@ -94,8 +95,6 @@ struct bcm2835_desc {
-       size_t size;
- };
--#define BCM2835_DMA_WAIT_CYCLES       0  /* Slow down DMA transfers: 0-31 */
--
- #define BCM2835_DMA_CS                0x00
- #define BCM2835_DMA_ADDR      0x04
- #define BCM2835_DMA_SOURCE_AD 0x0c
-@@ -112,16 +111,12 @@ struct bcm2835_desc {
- #define BCM2835_DMA_RESET     BIT(31) /* WO, self clearing */
- #define BCM2835_DMA_INT_EN    BIT(0)
--#define BCM2835_DMA_WAIT_RESP BIT(3)
- #define BCM2835_DMA_D_INC     BIT(4)
--#define BCM2835_DMA_D_WIDTH   BIT(5)
- #define BCM2835_DMA_D_DREQ    BIT(6)
- #define BCM2835_DMA_S_INC     BIT(8)
--#define BCM2835_DMA_S_WIDTH   BIT(9)
- #define BCM2835_DMA_S_DREQ    BIT(10)
- #define BCM2835_DMA_PER_MAP(x)        ((x) << 16)
--#define BCM2835_DMA_WAITS(x)  (((x) & 0x1f) << 21)
- #define BCM2835_DMA_DATA_TYPE_S8      1
- #define BCM2835_DMA_DATA_TYPE_S16     2
-@@ -135,14 +130,6 @@ struct bcm2835_desc {
- #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
- #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
--#define MAX_NORMAL_TRANSFER   SZ_1G
--/*
-- * Max length on a Lite channel is 65535 bytes.
-- * DMA handles byte-enables on SDRAM reads and writes even on 128-bit accesses,
-- * but byte-enables don't exist on peripheral addresses, so align to 32-bit.
-- */
--#define MAX_LITE_TRANSFER     (SZ_64K - 4)
--
- static inline struct bcm2835_dmadev *to_bcm2835_dma_dev(struct dma_device *d)
- {
-       return container_of(d, struct bcm2835_dmadev, ddev);
-@@ -239,19 +226,13 @@ static irqreturn_t bcm2835_dma_callback(
-       d = c->desc;
-       if (d) {
--              if (c->cyclic) {
--                      vchan_cyclic_callback(&d->vd);
--
--                      /* Keep the DMA engine running */
--                      writel(BCM2835_DMA_ACTIVE,
--                             c->chan_base + BCM2835_DMA_CS);
--
--              } else {
--                      vchan_cookie_complete(&c->desc->vd);
--                      bcm2835_dma_start_desc(c);
--              }
-+              /* TODO Only works for cyclic DMA */
-+              vchan_cyclic_callback(&d->vd);
-       }
-+      /* Keep the DMA engine running */
-+      writel(BCM2835_DMA_ACTIVE, c->chan_base + BCM2835_DMA_CS);
-+
-       spin_unlock_irqrestore(&c->vc.lock, flags);
-       return IRQ_HANDLED;
-@@ -358,6 +339,8 @@ static void bcm2835_dma_issue_pending(st
-       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
-       unsigned long flags;
-+      c->cyclic = true; /* Nothing else is implemented */
-+
-       spin_lock_irqsave(&c->vc.lock, flags);
-       if (vchan_issue_pending(&c->vc) && !c->desc)
-               bcm2835_dma_start_desc(c);
-@@ -375,7 +358,7 @@ static struct dma_async_tx_descriptor *b
-       struct bcm2835_desc *d;
-       dma_addr_t dev_addr;
-       unsigned int es, sync_type;
--      unsigned int frame, max_size;
-+      unsigned int frame;
-       int i;
-       /* Grab configuration */
-@@ -410,12 +393,7 @@ static struct dma_async_tx_descriptor *b
-       d->c = c;
-       d->dir = direction;
--      if (c->ch >= 8) /* LITE channel */
--              max_size = MAX_LITE_TRANSFER;
--      else
--              max_size = MAX_NORMAL_TRANSFER;
--      period_len = min(period_len, max_size);
--      d->frames = (buf_len - 1) / (period_len + 1);
-+      d->frames = buf_len / period_len;
-       d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
-       if (!d->cb_list) {
-@@ -463,171 +441,17 @@ static struct dma_async_tx_descriptor *b
-                               BCM2835_DMA_PER_MAP(c->dreq);
-               /* Length of a frame */
--              if (frame != d->frames - 1)
--                      control_block->length = period_len;
--              else
--                      control_block->length = buf_len - (d->frames - 1) *
--                                              period_len;
-+              control_block->length = period_len;
-               d->size += control_block->length;
-               /*
-                * Next block is the next frame.
--               * This function is called on cyclic DMA transfers.
-+               * This DMA engine driver currently only supports cyclic DMA.
-                * Therefore, wrap around at number of frames.
-                */
-               control_block->next = d->cb_list[((frame + 1) % d->frames)].paddr;
-       }
--      c->cyclic = true;
--
--      return vchan_tx_prep(&c->vc, &d->vd, flags);
--}
--
--static struct dma_async_tx_descriptor *
--bcm2835_dma_prep_slave_sg(struct dma_chan *chan,
--                        struct scatterlist *sgl,
--                        unsigned int sg_len,
--                        enum dma_transfer_direction direction,
--                        unsigned long flags, void *context)
--{
--      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
--      enum dma_slave_buswidth dev_width;
--      struct bcm2835_desc *d;
--      dma_addr_t dev_addr;
--      struct scatterlist *sgent;
--      unsigned int i, sync_type, split_cnt, max_size;
--
--      if (!is_slave_direction(direction)) {
--              dev_err(chan->device->dev, "direction not supported\n");
--              return NULL;
--      }
--
--      if (direction == DMA_DEV_TO_MEM) {
--              dev_addr = c->cfg.src_addr;
--              dev_width = c->cfg.src_addr_width;
--              sync_type = BCM2835_DMA_S_DREQ;
--      } else {
--              dev_addr = c->cfg.dst_addr;
--              dev_width = c->cfg.dst_addr_width;
--              sync_type = BCM2835_DMA_D_DREQ;
--      }
--
--      /* Bus width translates to the element size (ES) */
--      switch (dev_width) {
--      case DMA_SLAVE_BUSWIDTH_4_BYTES:
--              break;
--      default:
--              dev_err(chan->device->dev, "buswidth not supported: %i\n",
--                      dev_width);
--              return NULL;
--      }
--
--      /* Allocate and setup the descriptor. */
--      d = kzalloc(sizeof(*d), GFP_NOWAIT);
--      if (!d)
--              return NULL;
--
--      d->dir = direction;
--
--      if (c->ch >= 8) /* LITE channel */
--              max_size = MAX_LITE_TRANSFER;
--      else
--              max_size = MAX_NORMAL_TRANSFER;
--
--      /*
--       * Store the length of the SG list in d->frames
--       * taking care to account for splitting up transfers
--       * too large for a LITE channel
--       */
--      d->frames = 0;
--      for_each_sg(sgl, sgent, sg_len, i) {
--              unsigned int len = sg_dma_len(sgent);
--
--              d->frames += len / max_size + 1;
--      }
--
--      /* Allocate memory for control blocks */
--      d->control_block_size = d->frames * sizeof(struct bcm2835_dma_cb);
--      d->control_block_base = dma_zalloc_coherent(chan->device->dev,
--                      d->control_block_size, &d->control_block_base_phys,
--                      GFP_NOWAIT);
--      if (!d->control_block_base) {
--              kfree(d);
--              return NULL;
--      }
--
--      /*
--       * Iterate over all SG entries, create a control block
--       * for each frame and link them together.
--       * Count the number of times an SG entry had to be split
--       * as a result of using a LITE channel
--       */
--      split_cnt = 0;
--
--      for_each_sg(sgl, sgent, sg_len, i) {
--              unsigned int j;
--              dma_addr_t addr = sg_dma_address(sgent);
--              unsigned int len = sg_dma_len(sgent);
--
--              for (j = 0; j < len; j += max_size) {
--                      struct bcm2835_dma_cb *control_block =
--                              &d->control_block_base[i + split_cnt];
--
--                      /* Setup addresses */
--                      if (d->dir == DMA_DEV_TO_MEM) {
--                              control_block->info = BCM2835_DMA_D_INC |
--                                                    BCM2835_DMA_D_WIDTH |
--                                                    BCM2835_DMA_S_DREQ;
--                              control_block->src = dev_addr;
--                              control_block->dst = addr + (dma_addr_t)j;
--                      } else {
--                              control_block->info = BCM2835_DMA_S_INC |
--                                                    BCM2835_DMA_S_WIDTH |
--                                                    BCM2835_DMA_D_DREQ;
--                              control_block->src = addr + (dma_addr_t)j;
--                              control_block->dst = dev_addr;
--                      }
--
--                      /* Common part */
--                      control_block->info |=
--                              BCM2835_DMA_WAITS(BCM2835_DMA_WAIT_CYCLES);
--                      control_block->info |= BCM2835_DMA_WAIT_RESP;
--
--                      /* Enable */
--                      if (i == sg_len - 1 && len - j <= max_size)
--                              control_block->info |= BCM2835_DMA_INT_EN;
--
--                      /* Setup synchronization */
--                      if (sync_type)
--                              control_block->info |= sync_type;
--
--                      /* Setup DREQ channel */
--                      if (c->dreq)
--                              control_block->info |=
--                                      BCM2835_DMA_PER_MAP(c->dreq);
--
--                      /* Length of a frame */
--                      control_block->length = min(len - j, max_size);
--                      d->size += control_block->length;
--
--                      if (i < sg_len - 1 || len - j > max_size) {
--                              /* Next block is the next frame. */
--                              control_block->next =
--                                      d->control_block_base_phys +
--                                      sizeof(struct bcm2835_dma_cb) *
--                                      (i + split_cnt + 1);
--                      } else {
--                              /* Next block is empty. */
--                              control_block->next = 0;
--                      }
--
--                      if (len - j > max_size)
--                              split_cnt++;
--              }
--      }
--
--      c->cyclic = false;
--
-       return vchan_tx_prep(&c->vc, &d->vd, flags);
- error_cb:
-       i--;
-@@ -796,7 +620,6 @@ static int bcm2835_dma_probe(struct plat
-       od->ddev.device_tx_status = bcm2835_dma_tx_status;
-       od->ddev.device_issue_pending = bcm2835_dma_issue_pending;
-       od->ddev.device_prep_dma_cyclic = bcm2835_dma_prep_dma_cyclic;
--      od->ddev.device_prep_slave_sg = bcm2835_dma_prep_slave_sg;
-       od->ddev.device_config = bcm2835_dma_slave_config;
-       od->ddev.device_terminate_all = bcm2835_dma_terminate_all;
-       od->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
-@@ -886,5 +709,4 @@ module_platform_driver(bcm2835_dma_drive
- MODULE_ALIAS("platform:bcm2835-dma");
- MODULE_DESCRIPTION("BCM2835 DMA engine driver");
- MODULE_AUTHOR("Florian Meier <florian.meier@koalo.de>");
--MODULE_AUTHOR("Gellert Weisz <gellert@raspberrypi.org>");
- MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0393-dmaengine-bcm2835-remove-unnecessary-masking-of-dma-.patch b/target/linux/brcm2708/patches-4.4/0393-dmaengine-bcm2835-remove-unnecessary-masking-of-dma-.patch
new file mode 100644 (file)
index 0000000..5254a2a
--- /dev/null
@@ -0,0 +1,56 @@
+From 0f65c306a55ab6a8e8148b6d9c966a1d214ae3c9 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:24:56 -0700
+Subject: [PATCH] dmaengine: bcm2835: remove unnecessary masking of dma
+ channels
+
+The original patch contained 3 dma channels that were masked out.
+
+These - as far as research and discussions show - are a
+artefacts remaining from the downstream legacy dma-api.
+
+Right now down-stream still includes a legacy api used only
+in a single (downstream only) driver (bcm2708_fb) that requires
+2D DMA for speedup (DMA-channel 0).
+Formerly the sd-card support driver also was using this legacy
+api (DMA-channel 2), but since has been moved over to use
+dmaengine directly.
+
+The DMA-channel 3 is already masked out in the devicetree in
+the default property "brcm,dma-channel-mask = <0x7f35>;"
+
+So we can remove the whole masking of DMA channels.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -123,9 +123,6 @@ struct bcm2835_desc {
+ #define BCM2835_DMA_DATA_TYPE_S32     4
+ #define BCM2835_DMA_DATA_TYPE_S128    16
+-#define BCM2835_DMA_BULK_MASK BIT(0)
+-#define BCM2835_DMA_FIQ_MASK  (BIT(2) | BIT(3))
+-
+ /* Valid only for channels 0 - 14, 15 has its own base address */
+ #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
+ #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
+@@ -641,12 +638,6 @@ static int bcm2835_dma_probe(struct plat
+               goto err_no_dma;
+       }
+-      /*
+-       * Do not use the FIQ and BULK channels,
+-       * because they are used by the GPU.
+-       */
+-      chans_available &= ~(BCM2835_DMA_FIQ_MASK | BCM2835_DMA_BULK_MASK);
+-
+       for (i = 0; i < pdev->num_resources; i++) {
+               irq = platform_get_irq(pdev, i);
+               if (irq < 0)
diff --git a/target/linux/brcm2708/patches-4.4/0394-dmaengine-bcm2835-add-additional-defines-for-DMA-reg.patch b/target/linux/brcm2708/patches-4.4/0394-dmaengine-bcm2835-add-additional-defines-for-DMA-reg.patch
new file mode 100644 (file)
index 0000000..6f300a2
--- /dev/null
@@ -0,0 +1,93 @@
+From 2e9daa8fabdef7a31da63f9a532105d94ade48ae Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:24:57 -0700
+Subject: [PATCH] dmaengine: bcm2835: add additional defines for DMA-registers
+
+Add additional defines describing the DMA registers
+as well as adding some more documentation to those registers.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 57 ++++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 49 insertions(+), 8 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -97,26 +97,67 @@ struct bcm2835_desc {
+ #define BCM2835_DMA_CS                0x00
+ #define BCM2835_DMA_ADDR      0x04
++#define BCM2835_DMA_TI                0x08
+ #define BCM2835_DMA_SOURCE_AD 0x0c
+ #define BCM2835_DMA_DEST_AD   0x10
+-#define BCM2835_DMA_NEXTCB    0x1C
++#define BCM2835_DMA_LEN               0x14
++#define BCM2835_DMA_STRIDE    0x18
++#define BCM2835_DMA_NEXTCB    0x1c
++#define BCM2835_DMA_DEBUG     0x20
+ /* DMA CS Control and Status bits */
+-#define BCM2835_DMA_ACTIVE    BIT(0)
+-#define BCM2835_DMA_INT       BIT(2)
++#define BCM2835_DMA_ACTIVE    BIT(0)  /* activate the DMA */
++#define BCM2835_DMA_END               BIT(1)  /* current CB has ended */
++#define BCM2835_DMA_INT               BIT(2)  /* interrupt status */
++#define BCM2835_DMA_DREQ      BIT(3)  /* DREQ state */
+ #define BCM2835_DMA_ISPAUSED  BIT(4)  /* Pause requested or not active */
+ #define BCM2835_DMA_ISHELD    BIT(5)  /* Is held by DREQ flow control */
+-#define BCM2835_DMA_ERR       BIT(8)
++#define BCM2835_DMA_WAITING_FOR_WRITES BIT(6) /* waiting for last
++                                             * AXI-write to ack
++                                             */
++#define BCM2835_DMA_ERR               BIT(8)
++#define BCM2835_DMA_PRIORITY(x) ((x & 15) << 16) /* AXI priority */
++#define BCM2835_DMA_PANIC_PRIORITY(x) ((x & 15) << 20) /* panic priority */
++/* current value of TI.BCM2835_DMA_WAIT_RESP */
++#define BCM2835_DMA_WAIT_FOR_WRITES BIT(28)
++#define BCM2835_DMA_DIS_DEBUG BIT(29) /* disable debug pause signal */
+ #define BCM2835_DMA_ABORT     BIT(30) /* Stop current CB, go to next, WO */
+ #define BCM2835_DMA_RESET     BIT(31) /* WO, self clearing */
++/* Transfer information bits - also bcm2835_cb.info field */
+ #define BCM2835_DMA_INT_EN    BIT(0)
++#define BCM2835_DMA_TDMODE    BIT(1) /* 2D-Mode */
++#define BCM2835_DMA_WAIT_RESP BIT(3) /* wait for AXI-write to be acked */
+ #define BCM2835_DMA_D_INC     BIT(4)
+-#define BCM2835_DMA_D_DREQ    BIT(6)
++#define BCM2835_DMA_D_WIDTH   BIT(5) /* 128bit writes if set */
++#define BCM2835_DMA_D_DREQ    BIT(6) /* enable DREQ for destination */
++#define BCM2835_DMA_D_IGNORE  BIT(7) /* ignore destination writes */
+ #define BCM2835_DMA_S_INC     BIT(8)
+-#define BCM2835_DMA_S_DREQ    BIT(10)
++#define BCM2835_DMA_S_WIDTH   BIT(9) /* 128bit writes if set */
++#define BCM2835_DMA_S_DREQ    BIT(10) /* enable SREQ for source */
++#define BCM2835_DMA_S_IGNORE  BIT(11) /* ignore source reads - read 0 */
++#define BCM2835_DMA_BURST_LENGTH(x) ((x & 15) << 12)
++#define BCM2835_DMA_PER_MAP(x)        ((x & 31) << 16) /* REQ source */
++#define BCM2835_DMA_WAIT(x)   ((x & 31) << 21) /* add DMA-wait cycles */
++#define BCM2835_DMA_NO_WIDE_BURSTS BIT(26) /* no 2 beat write bursts */
+-#define BCM2835_DMA_PER_MAP(x)        ((x) << 16)
++/* debug register bits */
++#define BCM2835_DMA_DEBUG_LAST_NOT_SET_ERR    BIT(0)
++#define BCM2835_DMA_DEBUG_FIFO_ERR            BIT(1)
++#define BCM2835_DMA_DEBUG_READ_ERR            BIT(2)
++#define BCM2835_DMA_DEBUG_OUTSTANDING_WRITES_SHIFT 4
++#define BCM2835_DMA_DEBUG_OUTSTANDING_WRITES_BITS 4
++#define BCM2835_DMA_DEBUG_ID_SHIFT            16
++#define BCM2835_DMA_DEBUG_ID_BITS             9
++#define BCM2835_DMA_DEBUG_STATE_SHIFT         16
++#define BCM2835_DMA_DEBUG_STATE_BITS          9
++#define BCM2835_DMA_DEBUG_VERSION_SHIFT               25
++#define BCM2835_DMA_DEBUG_VERSION_BITS                3
++#define BCM2835_DMA_DEBUG_LITE                        BIT(28)
++
++/* shared registers for all dma channels */
++#define BCM2835_DMA_INT_STATUS         0xfe0
++#define BCM2835_DMA_ENABLE             0xff0
+ #define BCM2835_DMA_DATA_TYPE_S8      1
+ #define BCM2835_DMA_DATA_TYPE_S16     2
diff --git a/target/linux/brcm2708/patches-4.4/0394-dmaengine-bcm2835-remove-unnecessary-masking-of-dma-.patch b/target/linux/brcm2708/patches-4.4/0394-dmaengine-bcm2835-remove-unnecessary-masking-of-dma-.patch
deleted file mode 100644 (file)
index 63a232a..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-From dd06728c740cdeb3346a7b74d8a5924672ed6da1 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:24:56 -0700
-Subject: [PATCH 394/423] dmaengine: bcm2835: remove unnecessary masking of dma
- channels
-
-The original patch contained 3 dma channels that were masked out.
-
-These - as far as research and discussions show - are a
-artefacts remaining from the downstream legacy dma-api.
-
-Right now down-stream still includes a legacy api used only
-in a single (downstream only) driver (bcm2708_fb) that requires
-2D DMA for speedup (DMA-channel 0).
-Formerly the sd-card support driver also was using this legacy
-api (DMA-channel 2), but since has been moved over to use
-dmaengine directly.
-
-The DMA-channel 3 is already masked out in the devicetree in
-the default property "brcm,dma-channel-mask = <0x7f35>;"
-
-So we can remove the whole masking of DMA channels.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 9 ---------
- 1 file changed, 9 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -123,9 +123,6 @@ struct bcm2835_desc {
- #define BCM2835_DMA_DATA_TYPE_S32     4
- #define BCM2835_DMA_DATA_TYPE_S128    16
--#define BCM2835_DMA_BULK_MASK BIT(0)
--#define BCM2835_DMA_FIQ_MASK  (BIT(2) | BIT(3))
--
- /* Valid only for channels 0 - 14, 15 has its own base address */
- #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
- #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
-@@ -641,12 +638,6 @@ static int bcm2835_dma_probe(struct plat
-               goto err_no_dma;
-       }
--      /*
--       * Do not use the FIQ and BULK channels,
--       * because they are used by the GPU.
--       */
--      chans_available &= ~(BCM2835_DMA_FIQ_MASK | BCM2835_DMA_BULK_MASK);
--
-       for (i = 0; i < pdev->num_resources; i++) {
-               irq = platform_get_irq(pdev, i);
-               if (irq < 0)
diff --git a/target/linux/brcm2708/patches-4.4/0395-dmaengine-bcm2835-add-additional-defines-for-DMA-reg.patch b/target/linux/brcm2708/patches-4.4/0395-dmaengine-bcm2835-add-additional-defines-for-DMA-reg.patch
deleted file mode 100644 (file)
index f2cc0e3..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-From b1f4d42406261ed1ddffbbf0582ebbfaf6c0a73b Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:24:57 -0700
-Subject: [PATCH 395/423] dmaengine: bcm2835: add additional defines for
- DMA-registers
-
-Add additional defines describing the DMA registers
-as well as adding some more documentation to those registers.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 57 ++++++++++++++++++++++++++++++++++++++++-------
- 1 file changed, 49 insertions(+), 8 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -97,26 +97,67 @@ struct bcm2835_desc {
- #define BCM2835_DMA_CS                0x00
- #define BCM2835_DMA_ADDR      0x04
-+#define BCM2835_DMA_TI                0x08
- #define BCM2835_DMA_SOURCE_AD 0x0c
- #define BCM2835_DMA_DEST_AD   0x10
--#define BCM2835_DMA_NEXTCB    0x1C
-+#define BCM2835_DMA_LEN               0x14
-+#define BCM2835_DMA_STRIDE    0x18
-+#define BCM2835_DMA_NEXTCB    0x1c
-+#define BCM2835_DMA_DEBUG     0x20
- /* DMA CS Control and Status bits */
--#define BCM2835_DMA_ACTIVE    BIT(0)
--#define BCM2835_DMA_INT       BIT(2)
-+#define BCM2835_DMA_ACTIVE    BIT(0)  /* activate the DMA */
-+#define BCM2835_DMA_END               BIT(1)  /* current CB has ended */
-+#define BCM2835_DMA_INT               BIT(2)  /* interrupt status */
-+#define BCM2835_DMA_DREQ      BIT(3)  /* DREQ state */
- #define BCM2835_DMA_ISPAUSED  BIT(4)  /* Pause requested or not active */
- #define BCM2835_DMA_ISHELD    BIT(5)  /* Is held by DREQ flow control */
--#define BCM2835_DMA_ERR       BIT(8)
-+#define BCM2835_DMA_WAITING_FOR_WRITES BIT(6) /* waiting for last
-+                                             * AXI-write to ack
-+                                             */
-+#define BCM2835_DMA_ERR               BIT(8)
-+#define BCM2835_DMA_PRIORITY(x) ((x & 15) << 16) /* AXI priority */
-+#define BCM2835_DMA_PANIC_PRIORITY(x) ((x & 15) << 20) /* panic priority */
-+/* current value of TI.BCM2835_DMA_WAIT_RESP */
-+#define BCM2835_DMA_WAIT_FOR_WRITES BIT(28)
-+#define BCM2835_DMA_DIS_DEBUG BIT(29) /* disable debug pause signal */
- #define BCM2835_DMA_ABORT     BIT(30) /* Stop current CB, go to next, WO */
- #define BCM2835_DMA_RESET     BIT(31) /* WO, self clearing */
-+/* Transfer information bits - also bcm2835_cb.info field */
- #define BCM2835_DMA_INT_EN    BIT(0)
-+#define BCM2835_DMA_TDMODE    BIT(1) /* 2D-Mode */
-+#define BCM2835_DMA_WAIT_RESP BIT(3) /* wait for AXI-write to be acked */
- #define BCM2835_DMA_D_INC     BIT(4)
--#define BCM2835_DMA_D_DREQ    BIT(6)
-+#define BCM2835_DMA_D_WIDTH   BIT(5) /* 128bit writes if set */
-+#define BCM2835_DMA_D_DREQ    BIT(6) /* enable DREQ for destination */
-+#define BCM2835_DMA_D_IGNORE  BIT(7) /* ignore destination writes */
- #define BCM2835_DMA_S_INC     BIT(8)
--#define BCM2835_DMA_S_DREQ    BIT(10)
-+#define BCM2835_DMA_S_WIDTH   BIT(9) /* 128bit writes if set */
-+#define BCM2835_DMA_S_DREQ    BIT(10) /* enable SREQ for source */
-+#define BCM2835_DMA_S_IGNORE  BIT(11) /* ignore source reads - read 0 */
-+#define BCM2835_DMA_BURST_LENGTH(x) ((x & 15) << 12)
-+#define BCM2835_DMA_PER_MAP(x)        ((x & 31) << 16) /* REQ source */
-+#define BCM2835_DMA_WAIT(x)   ((x & 31) << 21) /* add DMA-wait cycles */
-+#define BCM2835_DMA_NO_WIDE_BURSTS BIT(26) /* no 2 beat write bursts */
--#define BCM2835_DMA_PER_MAP(x)        ((x) << 16)
-+/* debug register bits */
-+#define BCM2835_DMA_DEBUG_LAST_NOT_SET_ERR    BIT(0)
-+#define BCM2835_DMA_DEBUG_FIFO_ERR            BIT(1)
-+#define BCM2835_DMA_DEBUG_READ_ERR            BIT(2)
-+#define BCM2835_DMA_DEBUG_OUTSTANDING_WRITES_SHIFT 4
-+#define BCM2835_DMA_DEBUG_OUTSTANDING_WRITES_BITS 4
-+#define BCM2835_DMA_DEBUG_ID_SHIFT            16
-+#define BCM2835_DMA_DEBUG_ID_BITS             9
-+#define BCM2835_DMA_DEBUG_STATE_SHIFT         16
-+#define BCM2835_DMA_DEBUG_STATE_BITS          9
-+#define BCM2835_DMA_DEBUG_VERSION_SHIFT               25
-+#define BCM2835_DMA_DEBUG_VERSION_BITS                3
-+#define BCM2835_DMA_DEBUG_LITE                        BIT(28)
-+
-+/* shared registers for all dma channels */
-+#define BCM2835_DMA_INT_STATUS         0xfe0
-+#define BCM2835_DMA_ENABLE             0xff0
- #define BCM2835_DMA_DATA_TYPE_S8      1
- #define BCM2835_DMA_DATA_TYPE_S16     2
diff --git a/target/linux/brcm2708/patches-4.4/0395-dmaengine-bcm2835-move-cyclic-member-from-bcm2835_ch.patch b/target/linux/brcm2708/patches-4.4/0395-dmaengine-bcm2835-move-cyclic-member-from-bcm2835_ch.patch
new file mode 100644 (file)
index 0000000..831928c
--- /dev/null
@@ -0,0 +1,53 @@
+From 45a5aa455ea243c3daf0d1bdbfdb83787ae95249 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:24:58 -0700
+Subject: [PATCH] dmaengine: bcm2835: move cyclic member from bcm2835_chan into
+ bcm2835_desc
+
+In preparation to consolidating code we move the cyclic member
+into the bcm_2835_desc structure.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -73,7 +73,6 @@ struct bcm2835_chan {
+       struct list_head node;
+       struct dma_slave_config cfg;
+-      bool cyclic;
+       unsigned int dreq;
+       int ch;
+@@ -93,6 +92,8 @@ struct bcm2835_desc {
+       unsigned int frames;
+       size_t size;
++
++      bool cyclic;
+ };
+ #define BCM2835_DMA_CS                0x00
+@@ -377,8 +378,6 @@ static void bcm2835_dma_issue_pending(st
+       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
+       unsigned long flags;
+-      c->cyclic = true; /* Nothing else is implemented */
+-
+       spin_lock_irqsave(&c->vc.lock, flags);
+       if (vchan_issue_pending(&c->vc) && !c->desc)
+               bcm2835_dma_start_desc(c);
+@@ -432,6 +431,7 @@ static struct dma_async_tx_descriptor *b
+       d->c = c;
+       d->dir = direction;
+       d->frames = buf_len / period_len;
++      d->cyclic = true;
+       d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
+       if (!d->cb_list) {
diff --git a/target/linux/brcm2708/patches-4.4/0396-dmaengine-bcm2835-move-controlblock-chain-generation.patch b/target/linux/brcm2708/patches-4.4/0396-dmaengine-bcm2835-move-controlblock-chain-generation.patch
new file mode 100644 (file)
index 0000000..1507d6b
--- /dev/null
@@ -0,0 +1,378 @@
+From a41b5c7005c6880ac91b9e08062c6b6813df758e Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:24:59 -0700
+Subject: [PATCH] dmaengine: bcm2835: move controlblock chain generation into
+ separate method
+
+In preparation of adding slave_sg functionality this patch moves the
+generation/allocation of bcm2835_desc and the building of
+the corresponding DMA-control-block chain from bcm2835_dma_prep_dma_cyclic
+into the newly created method bcm2835_dma_create_cb_chain.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 294 +++++++++++++++++++++++++++++++---------------
+ 1 file changed, 198 insertions(+), 96 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -88,12 +88,12 @@ struct bcm2835_desc {
+       struct virt_dma_desc vd;
+       enum dma_transfer_direction dir;
+-      struct bcm2835_cb_entry *cb_list;
+-
+       unsigned int frames;
+       size_t size;
+       bool cyclic;
++
++      struct bcm2835_cb_entry cb_list[];
+ };
+ #define BCM2835_DMA_CS                0x00
+@@ -169,6 +169,13 @@ struct bcm2835_desc {
+ #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
+ #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
++/* how many frames of max_len size do we need to transfer len bytes */
++static inline size_t bcm2835_dma_frames_for_length(size_t len,
++                                                 size_t max_len)
++{
++      return DIV_ROUND_UP(len, max_len);
++}
++
+ static inline struct bcm2835_dmadev *to_bcm2835_dma_dev(struct dma_device *d)
+ {
+       return container_of(d, struct bcm2835_dmadev, ddev);
+@@ -185,19 +192,161 @@ static inline struct bcm2835_desc *to_bc
+       return container_of(t, struct bcm2835_desc, vd.tx);
+ }
+-static void bcm2835_dma_desc_free(struct virt_dma_desc *vd)
++static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc)
+ {
+-      struct bcm2835_desc *desc = container_of(vd, struct bcm2835_desc, vd);
+-      int i;
++      size_t i;
+       for (i = 0; i < desc->frames; i++)
+               dma_pool_free(desc->c->cb_pool, desc->cb_list[i].cb,
+                             desc->cb_list[i].paddr);
+-      kfree(desc->cb_list);
+       kfree(desc);
+ }
++static void bcm2835_dma_desc_free(struct virt_dma_desc *vd)
++{
++      bcm2835_dma_free_cb_chain(
++              container_of(vd, struct bcm2835_desc, vd));
++}
++
++static void bcm2835_dma_create_cb_set_length(
++      struct bcm2835_chan *chan,
++      struct bcm2835_dma_cb *control_block,
++      size_t len,
++      size_t period_len,
++      size_t *total_len,
++      u32 finalextrainfo)
++{
++      /* set the length */
++      control_block->length = len;
++
++      /* finished if we have no period_length */
++      if (!period_len)
++              return;
++
++      /*
++       * period_len means: that we need to generate
++       * transfers that are terminating at every
++       * multiple of period_len - this is typically
++       * used to set the interrupt flag in info
++       * which is required during cyclic transfers
++       */
++
++      /* have we filled in period_length yet? */
++      if (*total_len + control_block->length < period_len)
++              return;
++
++      /* calculate the length that remains to reach period_length */
++      control_block->length = period_len - *total_len;
++
++      /* reset total_length for next period */
++      *total_len = 0;
++
++      /* add extrainfo bits in info */
++      control_block->info |= finalextrainfo;
++}
++
++/**
++ * bcm2835_dma_create_cb_chain - create a control block and fills data in
++ *
++ * @chan:           the @dma_chan for which we run this
++ * @direction:      the direction in which we transfer
++ * @cyclic:         it is a cyclic transfer
++ * @info:           the default info bits to apply per controlblock
++ * @frames:         number of controlblocks to allocate
++ * @src:            the src address to assign (if the S_INC bit is set
++ *                  in @info, then it gets incremented)
++ * @dst:            the dst address to assign (if the D_INC bit is set
++ *                  in @info, then it gets incremented)
++ * @buf_len:        the full buffer length (may also be 0)
++ * @period_len:     the period length when to apply @finalextrainfo
++ *                  in addition to the last transfer
++ *                  this will also break some control-blocks early
++ * @finalextrainfo: additional bits in last controlblock
++ *                  (or when period_len is reached in case of cyclic)
++ * @gfp:            the GFP flag to use for allocation
++ */
++static struct bcm2835_desc *bcm2835_dma_create_cb_chain(
++      struct dma_chan *chan, enum dma_transfer_direction direction,
++      bool cyclic, u32 info, u32 finalextrainfo, size_t frames,
++      dma_addr_t src, dma_addr_t dst, size_t buf_len,
++      size_t period_len, gfp_t gfp)
++{
++      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
++      size_t len = buf_len, total_len;
++      size_t frame;
++      struct bcm2835_desc *d;
++      struct bcm2835_cb_entry *cb_entry;
++      struct bcm2835_dma_cb *control_block;
++
++      /* allocate and setup the descriptor. */
++      d = kzalloc(sizeof(*d) + frames * sizeof(struct bcm2835_cb_entry),
++                  gfp);
++      if (!d)
++              return NULL;
++
++      d->c = c;
++      d->dir = direction;
++      d->cyclic = cyclic;
++
++      /*
++       * Iterate over all frames, create a control block
++       * for each frame and link them together.
++       */
++      for (frame = 0, total_len = 0; frame < frames; d->frames++, frame++) {
++              cb_entry = &d->cb_list[frame];
++              cb_entry->cb = dma_pool_alloc(c->cb_pool, gfp,
++                                            &cb_entry->paddr);
++              if (!cb_entry->cb)
++                      goto error_cb;
++
++              /* fill in the control block */
++              control_block = cb_entry->cb;
++              control_block->info = info;
++              control_block->src = src;
++              control_block->dst = dst;
++              control_block->stride = 0;
++              control_block->next = 0;
++              /* set up length in control_block if requested */
++              if (buf_len) {
++                      /* calculate length honoring period_length */
++                      bcm2835_dma_create_cb_set_length(
++                              c, control_block,
++                              len, period_len, &total_len,
++                              cyclic ? finalextrainfo : 0);
++
++                      /* calculate new remaining length */
++                      len -= control_block->length;
++              }
++
++              /* link this the last controlblock */
++              if (frame)
++                      d->cb_list[frame - 1].cb->next = cb_entry->paddr;
++
++              /* update src and dst and length */
++              if (src && (info & BCM2835_DMA_S_INC))
++                      src += control_block->length;
++              if (dst && (info & BCM2835_DMA_D_INC))
++                      dst += control_block->length;
++
++              /* Length of total transfer */
++              d->size += control_block->length;
++      }
++
++      /* the last frame requires extra flags */
++      d->cb_list[d->frames - 1].cb->info |= finalextrainfo;
++
++      /* detect a size missmatch */
++      if (buf_len && (d->size != buf_len))
++              goto error_cb;
++
++      return d;
++error_cb:
++      bcm2835_dma_free_cb_chain(d);
++
++      return NULL;
++}
++
+ static int bcm2835_dma_abort(void __iomem *chan_base)
+ {
+       unsigned long cs;
+@@ -391,12 +540,11 @@ static struct dma_async_tx_descriptor *b
+       unsigned long flags)
+ {
+       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
+-      enum dma_slave_buswidth dev_width;
+       struct bcm2835_desc *d;
+-      dma_addr_t dev_addr;
+-      unsigned int es, sync_type;
+-      unsigned int frame;
+-      int i;
++      dma_addr_t src, dst;
++      u32 info = BCM2835_DMA_WAIT_RESP;
++      u32 extra = BCM2835_DMA_INT_EN;
++      size_t frames;
+       /* Grab configuration */
+       if (!is_slave_direction(direction)) {
+@@ -404,104 +552,58 @@ static struct dma_async_tx_descriptor *b
+               return NULL;
+       }
+-      if (direction == DMA_DEV_TO_MEM) {
+-              dev_addr = c->cfg.src_addr;
+-              dev_width = c->cfg.src_addr_width;
+-              sync_type = BCM2835_DMA_S_DREQ;
+-      } else {
+-              dev_addr = c->cfg.dst_addr;
+-              dev_width = c->cfg.dst_addr_width;
+-              sync_type = BCM2835_DMA_D_DREQ;
+-      }
+-
+-      /* Bus width translates to the element size (ES) */
+-      switch (dev_width) {
+-      case DMA_SLAVE_BUSWIDTH_4_BYTES:
+-              es = BCM2835_DMA_DATA_TYPE_S32;
+-              break;
+-      default:
++      if (!buf_len) {
++              dev_err(chan->device->dev,
++                      "%s: bad buffer length (= 0)\n", __func__);
+               return NULL;
+       }
+-      /* Now allocate and setup the descriptor. */
+-      d = kzalloc(sizeof(*d), GFP_NOWAIT);
+-      if (!d)
+-              return NULL;
+-
+-      d->c = c;
+-      d->dir = direction;
+-      d->frames = buf_len / period_len;
+-      d->cyclic = true;
++      /*
++       * warn if buf_len is not a multiple of period_len - this may leed
++       * to unexpected latencies for interrupts and thus audiable clicks
++       */
++      if (buf_len % period_len)
++              dev_warn_once(chan->device->dev,
++                            "%s: buffer_length (%zd) is not a multiple of period_len (%zd)\n",
++                            __func__, buf_len, period_len);
++
++      /* Setup DREQ channel */
++      if (c->dreq != 0)
++              info |= BCM2835_DMA_PER_MAP(c->dreq);
+-      d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
+-      if (!d->cb_list) {
+-              kfree(d);
+-              return NULL;
++      if (direction == DMA_DEV_TO_MEM) {
++              if (c->cfg.src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
++                      return NULL;
++              src = c->cfg.src_addr;
++              dst = buf_addr;
++              info |= BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC;
++      } else {
++              if (c->cfg.dst_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
++                      return NULL;
++              dst = c->cfg.dst_addr;
++              src = buf_addr;
++              info |= BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC;
+       }
+-      /* Allocate memory for control blocks */
+-      for (i = 0; i < d->frames; i++) {
+-              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
+-              cb_entry->cb = dma_pool_zalloc(c->cb_pool, GFP_ATOMIC,
+-                                             &cb_entry->paddr);
+-              if (!cb_entry->cb)
+-                      goto error_cb;
+-      }
++      /* calculate number of frames */
++      frames = DIV_ROUND_UP(buf_len, period_len);
+       /*
+-       * Iterate over all frames, create a control block
+-       * for each frame and link them together.
++       * allocate the CB chain
++       * note that we need to use GFP_NOWAIT, as the ALSA i2s dmaengine
++       * implementation calls prep_dma_cyclic with interrupts disabled.
+        */
+-      for (frame = 0; frame < d->frames; frame++) {
+-              struct bcm2835_dma_cb *control_block = d->cb_list[frame].cb;
+-
+-              /* Setup adresses */
+-              if (d->dir == DMA_DEV_TO_MEM) {
+-                      control_block->info = BCM2835_DMA_D_INC;
+-                      control_block->src = dev_addr;
+-                      control_block->dst = buf_addr + frame * period_len;
+-              } else {
+-                      control_block->info = BCM2835_DMA_S_INC;
+-                      control_block->src = buf_addr + frame * period_len;
+-                      control_block->dst = dev_addr;
+-              }
+-
+-              /* Enable interrupt */
+-              control_block->info |= BCM2835_DMA_INT_EN;
+-
+-              /* Setup synchronization */
+-              if (sync_type != 0)
+-                      control_block->info |= sync_type;
+-
+-              /* Setup DREQ channel */
+-              if (c->dreq != 0)
+-                      control_block->info |=
+-                              BCM2835_DMA_PER_MAP(c->dreq);
+-
+-              /* Length of a frame */
+-              control_block->length = period_len;
+-              d->size += control_block->length;
++      d = bcm2835_dma_create_cb_chain(chan, direction, true,
++                                      info, extra,
++                                      frames, src, dst, buf_len,
++                                      period_len, GFP_NOWAIT);
++      if (!d)
++              return NULL;
+-              /*
+-               * Next block is the next frame.
+-               * This DMA engine driver currently only supports cyclic DMA.
+-               * Therefore, wrap around at number of frames.
+-               */
+-              control_block->next = d->cb_list[((frame + 1) % d->frames)].paddr;
+-      }
++      /* wrap around into a loop */
++      d->cb_list[d->frames - 1].cb->next = d->cb_list[0].paddr;
+       return vchan_tx_prep(&c->vc, &d->vd, flags);
+-error_cb:
+-      i--;
+-      for (; i >= 0; i--) {
+-              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
+-
+-              dma_pool_free(c->cb_pool, cb_entry->cb, cb_entry->paddr);
+-      }
+-
+-      kfree(d->cb_list);
+-      kfree(d);
+-      return NULL;
+ }
+ static int bcm2835_dma_slave_config(struct dma_chan *chan,
diff --git a/target/linux/brcm2708/patches-4.4/0396-dmaengine-bcm2835-move-cyclic-member-from-bcm2835_ch.patch b/target/linux/brcm2708/patches-4.4/0396-dmaengine-bcm2835-move-cyclic-member-from-bcm2835_ch.patch
deleted file mode 100644 (file)
index 8b97f11..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-From 51fa7004613fc6a4567938f0a8358346ca602b5f Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:24:58 -0700
-Subject: [PATCH 396/423] dmaengine: bcm2835: move cyclic member from
- bcm2835_chan into bcm2835_desc
-
-In preparation to consolidating code we move the cyclic member
-into the bcm_2835_desc structure.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -73,7 +73,6 @@ struct bcm2835_chan {
-       struct list_head node;
-       struct dma_slave_config cfg;
--      bool cyclic;
-       unsigned int dreq;
-       int ch;
-@@ -93,6 +92,8 @@ struct bcm2835_desc {
-       unsigned int frames;
-       size_t size;
-+
-+      bool cyclic;
- };
- #define BCM2835_DMA_CS                0x00
-@@ -377,8 +378,6 @@ static void bcm2835_dma_issue_pending(st
-       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
-       unsigned long flags;
--      c->cyclic = true; /* Nothing else is implemented */
--
-       spin_lock_irqsave(&c->vc.lock, flags);
-       if (vchan_issue_pending(&c->vc) && !c->desc)
-               bcm2835_dma_start_desc(c);
-@@ -432,6 +431,7 @@ static struct dma_async_tx_descriptor *b
-       d->c = c;
-       d->dir = direction;
-       d->frames = buf_len / period_len;
-+      d->cyclic = true;
-       d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
-       if (!d->cb_list) {
diff --git a/target/linux/brcm2708/patches-4.4/0397-dmaengine-bcm2835-limit-max-length-based-on-channel-.patch b/target/linux/brcm2708/patches-4.4/0397-dmaengine-bcm2835-limit-max-length-based-on-channel-.patch
new file mode 100644 (file)
index 0000000..65b402a
--- /dev/null
@@ -0,0 +1,114 @@
+From 350247e0611f171a3372386e389e24746daff84f Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:25:00 -0700
+Subject: [PATCH] dmaengine: bcm2835: limit max length based on channel type
+
+The bcm2835 dma system has 2 basic types of dma-channels:
+* "normal" channels
+* "light" channels
+
+Lite channels are limited in several aspects:
+* internal data-structure is 128 bit (not 256)
+* does not support BCM2835_DMA_TDMODE (2D)
+* DMA length register is limited to 16 bit.
+  so 0-65535 (not 0-65536 as mentioned in the official datasheet)
+* BCM2835_DMA_S/D_IGNORE are not supported
+
+The detection of the type of mode is implemented by looking at
+the LITE bit in the DEBUG register for each channel.
+This allows automatic detection.
+
+Based on this the maximum block size is set to (64K - 4) or to 1G
+and this limit is honored during generation of control block
+chains. The effect is that when a LITE channel is used more
+control blocks are used to do the same transfer (compared
+to a normal channel).
+
+As there are several sources/target DREQS that are 32 bit wide
+we need to have the transfer to be a multiple of 4 as this would
+break the transfer otherwise.
+
+This is why the limit of (64K - 4) was chosen over the
+alternative of (64K - 4K).
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 29 ++++++++++++++++++++++++++---
+ 1 file changed, 26 insertions(+), 3 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -81,6 +81,8 @@ struct bcm2835_chan {
+       void __iomem *chan_base;
+       int irq_number;
++
++      bool is_lite_channel;
+ };
+ struct bcm2835_desc {
+@@ -169,6 +171,16 @@ struct bcm2835_desc {
+ #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
+ #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
++/* the max dma length for different channels */
++#define MAX_DMA_LEN SZ_1G
++#define MAX_LITE_DMA_LEN (SZ_64K - 4)
++
++static inline size_t bcm2835_dma_max_frame_length(struct bcm2835_chan *c)
++{
++      /* lite and normal channels have different max frame length */
++      return c->is_lite_channel ? MAX_LITE_DMA_LEN : MAX_DMA_LEN;
++}
++
+ /* how many frames of max_len size do we need to transfer len bytes */
+ static inline size_t bcm2835_dma_frames_for_length(size_t len,
+                                                  size_t max_len)
+@@ -217,8 +229,10 @@ static void bcm2835_dma_create_cb_set_le
+       size_t *total_len,
+       u32 finalextrainfo)
+ {
+-      /* set the length */
+-      control_block->length = len;
++      size_t max_len = bcm2835_dma_max_frame_length(chan);
++
++      /* set the length taking lite-channel limitations into account */
++      control_block->length = min_t(u32, len, max_len);
+       /* finished if we have no period_length */
+       if (!period_len)
+@@ -544,6 +558,7 @@ static struct dma_async_tx_descriptor *b
+       dma_addr_t src, dst;
+       u32 info = BCM2835_DMA_WAIT_RESP;
+       u32 extra = BCM2835_DMA_INT_EN;
++      size_t max_len = bcm2835_dma_max_frame_length(c);
+       size_t frames;
+       /* Grab configuration */
+@@ -586,7 +601,10 @@ static struct dma_async_tx_descriptor *b
+       }
+       /* calculate number of frames */
+-      frames = DIV_ROUND_UP(buf_len, period_len);
++      frames = /* number of periods */
++               DIV_ROUND_UP(buf_len, period_len) *
++               /* number of frames per period */
++               bcm2835_dma_frames_for_length(period_len, max_len);
+       /*
+        * allocate the CB chain
+@@ -685,6 +703,11 @@ static int bcm2835_dma_chan_init(struct
+       c->ch = chan_id;
+       c->irq_number = irq;
++      /* check in DEBUG register if this is a LITE channel */
++      if (readl(c->chan_base + BCM2835_DMA_DEBUG) &
++              BCM2835_DMA_DEBUG_LITE)
++              c->is_lite_channel = true;
++
+       return 0;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0397-dmaengine-bcm2835-move-controlblock-chain-generation.patch b/target/linux/brcm2708/patches-4.4/0397-dmaengine-bcm2835-move-controlblock-chain-generation.patch
deleted file mode 100644 (file)
index f998a88..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-From b181092e7661f90e4777e0b858e601a33c1e5af9 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:24:59 -0700
-Subject: [PATCH 397/423] dmaengine: bcm2835: move controlblock chain
- generation into separate method
-
-In preparation of adding slave_sg functionality this patch moves the
-generation/allocation of bcm2835_desc and the building of
-the corresponding DMA-control-block chain from bcm2835_dma_prep_dma_cyclic
-into the newly created method bcm2835_dma_create_cb_chain.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 294 +++++++++++++++++++++++++++++++---------------
- 1 file changed, 198 insertions(+), 96 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -88,12 +88,12 @@ struct bcm2835_desc {
-       struct virt_dma_desc vd;
-       enum dma_transfer_direction dir;
--      struct bcm2835_cb_entry *cb_list;
--
-       unsigned int frames;
-       size_t size;
-       bool cyclic;
-+
-+      struct bcm2835_cb_entry cb_list[];
- };
- #define BCM2835_DMA_CS                0x00
-@@ -169,6 +169,13 @@ struct bcm2835_desc {
- #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
- #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
-+/* how many frames of max_len size do we need to transfer len bytes */
-+static inline size_t bcm2835_dma_frames_for_length(size_t len,
-+                                                 size_t max_len)
-+{
-+      return DIV_ROUND_UP(len, max_len);
-+}
-+
- static inline struct bcm2835_dmadev *to_bcm2835_dma_dev(struct dma_device *d)
- {
-       return container_of(d, struct bcm2835_dmadev, ddev);
-@@ -185,19 +192,161 @@ static inline struct bcm2835_desc *to_bc
-       return container_of(t, struct bcm2835_desc, vd.tx);
- }
--static void bcm2835_dma_desc_free(struct virt_dma_desc *vd)
-+static void bcm2835_dma_free_cb_chain(struct bcm2835_desc *desc)
- {
--      struct bcm2835_desc *desc = container_of(vd, struct bcm2835_desc, vd);
--      int i;
-+      size_t i;
-       for (i = 0; i < desc->frames; i++)
-               dma_pool_free(desc->c->cb_pool, desc->cb_list[i].cb,
-                             desc->cb_list[i].paddr);
--      kfree(desc->cb_list);
-       kfree(desc);
- }
-+static void bcm2835_dma_desc_free(struct virt_dma_desc *vd)
-+{
-+      bcm2835_dma_free_cb_chain(
-+              container_of(vd, struct bcm2835_desc, vd));
-+}
-+
-+static void bcm2835_dma_create_cb_set_length(
-+      struct bcm2835_chan *chan,
-+      struct bcm2835_dma_cb *control_block,
-+      size_t len,
-+      size_t period_len,
-+      size_t *total_len,
-+      u32 finalextrainfo)
-+{
-+      /* set the length */
-+      control_block->length = len;
-+
-+      /* finished if we have no period_length */
-+      if (!period_len)
-+              return;
-+
-+      /*
-+       * period_len means: that we need to generate
-+       * transfers that are terminating at every
-+       * multiple of period_len - this is typically
-+       * used to set the interrupt flag in info
-+       * which is required during cyclic transfers
-+       */
-+
-+      /* have we filled in period_length yet? */
-+      if (*total_len + control_block->length < period_len)
-+              return;
-+
-+      /* calculate the length that remains to reach period_length */
-+      control_block->length = period_len - *total_len;
-+
-+      /* reset total_length for next period */
-+      *total_len = 0;
-+
-+      /* add extrainfo bits in info */
-+      control_block->info |= finalextrainfo;
-+}
-+
-+/**
-+ * bcm2835_dma_create_cb_chain - create a control block and fills data in
-+ *
-+ * @chan:           the @dma_chan for which we run this
-+ * @direction:      the direction in which we transfer
-+ * @cyclic:         it is a cyclic transfer
-+ * @info:           the default info bits to apply per controlblock
-+ * @frames:         number of controlblocks to allocate
-+ * @src:            the src address to assign (if the S_INC bit is set
-+ *                  in @info, then it gets incremented)
-+ * @dst:            the dst address to assign (if the D_INC bit is set
-+ *                  in @info, then it gets incremented)
-+ * @buf_len:        the full buffer length (may also be 0)
-+ * @period_len:     the period length when to apply @finalextrainfo
-+ *                  in addition to the last transfer
-+ *                  this will also break some control-blocks early
-+ * @finalextrainfo: additional bits in last controlblock
-+ *                  (or when period_len is reached in case of cyclic)
-+ * @gfp:            the GFP flag to use for allocation
-+ */
-+static struct bcm2835_desc *bcm2835_dma_create_cb_chain(
-+      struct dma_chan *chan, enum dma_transfer_direction direction,
-+      bool cyclic, u32 info, u32 finalextrainfo, size_t frames,
-+      dma_addr_t src, dma_addr_t dst, size_t buf_len,
-+      size_t period_len, gfp_t gfp)
-+{
-+      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
-+      size_t len = buf_len, total_len;
-+      size_t frame;
-+      struct bcm2835_desc *d;
-+      struct bcm2835_cb_entry *cb_entry;
-+      struct bcm2835_dma_cb *control_block;
-+
-+      /* allocate and setup the descriptor. */
-+      d = kzalloc(sizeof(*d) + frames * sizeof(struct bcm2835_cb_entry),
-+                  gfp);
-+      if (!d)
-+              return NULL;
-+
-+      d->c = c;
-+      d->dir = direction;
-+      d->cyclic = cyclic;
-+
-+      /*
-+       * Iterate over all frames, create a control block
-+       * for each frame and link them together.
-+       */
-+      for (frame = 0, total_len = 0; frame < frames; d->frames++, frame++) {
-+              cb_entry = &d->cb_list[frame];
-+              cb_entry->cb = dma_pool_alloc(c->cb_pool, gfp,
-+                                            &cb_entry->paddr);
-+              if (!cb_entry->cb)
-+                      goto error_cb;
-+
-+              /* fill in the control block */
-+              control_block = cb_entry->cb;
-+              control_block->info = info;
-+              control_block->src = src;
-+              control_block->dst = dst;
-+              control_block->stride = 0;
-+              control_block->next = 0;
-+              /* set up length in control_block if requested */
-+              if (buf_len) {
-+                      /* calculate length honoring period_length */
-+                      bcm2835_dma_create_cb_set_length(
-+                              c, control_block,
-+                              len, period_len, &total_len,
-+                              cyclic ? finalextrainfo : 0);
-+
-+                      /* calculate new remaining length */
-+                      len -= control_block->length;
-+              }
-+
-+              /* link this the last controlblock */
-+              if (frame)
-+                      d->cb_list[frame - 1].cb->next = cb_entry->paddr;
-+
-+              /* update src and dst and length */
-+              if (src && (info & BCM2835_DMA_S_INC))
-+                      src += control_block->length;
-+              if (dst && (info & BCM2835_DMA_D_INC))
-+                      dst += control_block->length;
-+
-+              /* Length of total transfer */
-+              d->size += control_block->length;
-+      }
-+
-+      /* the last frame requires extra flags */
-+      d->cb_list[d->frames - 1].cb->info |= finalextrainfo;
-+
-+      /* detect a size missmatch */
-+      if (buf_len && (d->size != buf_len))
-+              goto error_cb;
-+
-+      return d;
-+error_cb:
-+      bcm2835_dma_free_cb_chain(d);
-+
-+      return NULL;
-+}
-+
- static int bcm2835_dma_abort(void __iomem *chan_base)
- {
-       unsigned long cs;
-@@ -391,12 +540,11 @@ static struct dma_async_tx_descriptor *b
-       unsigned long flags)
- {
-       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
--      enum dma_slave_buswidth dev_width;
-       struct bcm2835_desc *d;
--      dma_addr_t dev_addr;
--      unsigned int es, sync_type;
--      unsigned int frame;
--      int i;
-+      dma_addr_t src, dst;
-+      u32 info = BCM2835_DMA_WAIT_RESP;
-+      u32 extra = BCM2835_DMA_INT_EN;
-+      size_t frames;
-       /* Grab configuration */
-       if (!is_slave_direction(direction)) {
-@@ -404,104 +552,58 @@ static struct dma_async_tx_descriptor *b
-               return NULL;
-       }
--      if (direction == DMA_DEV_TO_MEM) {
--              dev_addr = c->cfg.src_addr;
--              dev_width = c->cfg.src_addr_width;
--              sync_type = BCM2835_DMA_S_DREQ;
--      } else {
--              dev_addr = c->cfg.dst_addr;
--              dev_width = c->cfg.dst_addr_width;
--              sync_type = BCM2835_DMA_D_DREQ;
--      }
--
--      /* Bus width translates to the element size (ES) */
--      switch (dev_width) {
--      case DMA_SLAVE_BUSWIDTH_4_BYTES:
--              es = BCM2835_DMA_DATA_TYPE_S32;
--              break;
--      default:
-+      if (!buf_len) {
-+              dev_err(chan->device->dev,
-+                      "%s: bad buffer length (= 0)\n", __func__);
-               return NULL;
-       }
--      /* Now allocate and setup the descriptor. */
--      d = kzalloc(sizeof(*d), GFP_NOWAIT);
--      if (!d)
--              return NULL;
--
--      d->c = c;
--      d->dir = direction;
--      d->frames = buf_len / period_len;
--      d->cyclic = true;
-+      /*
-+       * warn if buf_len is not a multiple of period_len - this may leed
-+       * to unexpected latencies for interrupts and thus audiable clicks
-+       */
-+      if (buf_len % period_len)
-+              dev_warn_once(chan->device->dev,
-+                            "%s: buffer_length (%zd) is not a multiple of period_len (%zd)\n",
-+                            __func__, buf_len, period_len);
-+
-+      /* Setup DREQ channel */
-+      if (c->dreq != 0)
-+              info |= BCM2835_DMA_PER_MAP(c->dreq);
--      d->cb_list = kcalloc(d->frames, sizeof(*d->cb_list), GFP_KERNEL);
--      if (!d->cb_list) {
--              kfree(d);
--              return NULL;
-+      if (direction == DMA_DEV_TO_MEM) {
-+              if (c->cfg.src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
-+                      return NULL;
-+              src = c->cfg.src_addr;
-+              dst = buf_addr;
-+              info |= BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC;
-+      } else {
-+              if (c->cfg.dst_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
-+                      return NULL;
-+              dst = c->cfg.dst_addr;
-+              src = buf_addr;
-+              info |= BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC;
-       }
--      /* Allocate memory for control blocks */
--      for (i = 0; i < d->frames; i++) {
--              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
--              cb_entry->cb = dma_pool_zalloc(c->cb_pool, GFP_ATOMIC,
--                                             &cb_entry->paddr);
--              if (!cb_entry->cb)
--                      goto error_cb;
--      }
-+      /* calculate number of frames */
-+      frames = DIV_ROUND_UP(buf_len, period_len);
-       /*
--       * Iterate over all frames, create a control block
--       * for each frame and link them together.
-+       * allocate the CB chain
-+       * note that we need to use GFP_NOWAIT, as the ALSA i2s dmaengine
-+       * implementation calls prep_dma_cyclic with interrupts disabled.
-        */
--      for (frame = 0; frame < d->frames; frame++) {
--              struct bcm2835_dma_cb *control_block = d->cb_list[frame].cb;
--
--              /* Setup adresses */
--              if (d->dir == DMA_DEV_TO_MEM) {
--                      control_block->info = BCM2835_DMA_D_INC;
--                      control_block->src = dev_addr;
--                      control_block->dst = buf_addr + frame * period_len;
--              } else {
--                      control_block->info = BCM2835_DMA_S_INC;
--                      control_block->src = buf_addr + frame * period_len;
--                      control_block->dst = dev_addr;
--              }
--
--              /* Enable interrupt */
--              control_block->info |= BCM2835_DMA_INT_EN;
--
--              /* Setup synchronization */
--              if (sync_type != 0)
--                      control_block->info |= sync_type;
--
--              /* Setup DREQ channel */
--              if (c->dreq != 0)
--                      control_block->info |=
--                              BCM2835_DMA_PER_MAP(c->dreq);
--
--              /* Length of a frame */
--              control_block->length = period_len;
--              d->size += control_block->length;
-+      d = bcm2835_dma_create_cb_chain(chan, direction, true,
-+                                      info, extra,
-+                                      frames, src, dst, buf_len,
-+                                      period_len, GFP_NOWAIT);
-+      if (!d)
-+              return NULL;
--              /*
--               * Next block is the next frame.
--               * This DMA engine driver currently only supports cyclic DMA.
--               * Therefore, wrap around at number of frames.
--               */
--              control_block->next = d->cb_list[((frame + 1) % d->frames)].paddr;
--      }
-+      /* wrap around into a loop */
-+      d->cb_list[d->frames - 1].cb->next = d->cb_list[0].paddr;
-       return vchan_tx_prep(&c->vc, &d->vd, flags);
--error_cb:
--      i--;
--      for (; i >= 0; i--) {
--              struct bcm2835_cb_entry *cb_entry = &d->cb_list[i];
--
--              dma_pool_free(c->cb_pool, cb_entry->cb, cb_entry->paddr);
--      }
--
--      kfree(d->cb_list);
--      kfree(d);
--      return NULL;
- }
- static int bcm2835_dma_slave_config(struct dma_chan *chan,
diff --git a/target/linux/brcm2708/patches-4.4/0398-dmaengine-bcm2835-add-slave_sg-support-to-bcm2835-dm.patch b/target/linux/brcm2708/patches-4.4/0398-dmaengine-bcm2835-add-slave_sg-support-to-bcm2835-dm.patch
new file mode 100644 (file)
index 0000000..ef1b433
--- /dev/null
@@ -0,0 +1,182 @@
+From 9026efd53eae4b320941e581f141ddc87f2adc20 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:25:01 -0700
+Subject: [PATCH] dmaengine: bcm2835: add slave_sg support to bcm2835-dma
+
+Add slave_sg support to bcm2835-dma using shared allocation
+code for bcm2835_desc and DMA-control blocks already used by
+dma_cyclic.
+
+Note that bcm2835_dma_callback had to get modified to support
+both modes of operation (cyclic and non-cyclic).
+
+Tested using:
+* Hifiberry I2S card (using cyclic DMA)
+* fb_st7735r SPI-framebuffer (using slave_sg DMA via spi-bcm2835)
+playing BigBuckBunny for audio and video.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 113 ++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 108 insertions(+), 5 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -260,6 +260,23 @@ static void bcm2835_dma_create_cb_set_le
+       control_block->info |= finalextrainfo;
+ }
++static inline size_t bcm2835_dma_count_frames_for_sg(
++      struct bcm2835_chan *c,
++      struct scatterlist *sgl,
++      unsigned int sg_len)
++{
++      size_t frames = 0;
++      struct scatterlist *sgent;
++      unsigned int i;
++      size_t plength = bcm2835_dma_max_frame_length(c);
++
++      for_each_sg(sgl, sgent, sg_len, i)
++              frames += bcm2835_dma_frames_for_length(
++                      sg_dma_len(sgent), plength);
++
++      return frames;
++}
++
+ /**
+  * bcm2835_dma_create_cb_chain - create a control block and fills data in
+  *
+@@ -361,6 +378,32 @@ error_cb:
+       return NULL;
+ }
++static void bcm2835_dma_fill_cb_chain_with_sg(
++      struct dma_chan *chan,
++      enum dma_transfer_direction direction,
++      struct bcm2835_cb_entry *cb,
++      struct scatterlist *sgl,
++      unsigned int sg_len)
++{
++      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
++      size_t max_len = bcm2835_dma_max_frame_length(c);
++      unsigned int i, len;
++      dma_addr_t addr;
++      struct scatterlist *sgent;
++
++      for_each_sg(sgl, sgent, sg_len, i) {
++              for (addr = sg_dma_address(sgent), len = sg_dma_len(sgent);
++                   len > 0;
++                   addr += cb->cb->length, len -= cb->cb->length, cb++) {
++                      if (direction == DMA_DEV_TO_MEM)
++                              cb->cb->dst = addr;
++                      else
++                              cb->cb->src = addr;
++                      cb->cb->length = min(len, max_len);
++              }
++      }
++}
++
+ static int bcm2835_dma_abort(void __iomem *chan_base)
+ {
+       unsigned long cs;
+@@ -428,13 +471,19 @@ static irqreturn_t bcm2835_dma_callback(
+       d = c->desc;
+       if (d) {
+-              /* TODO Only works for cyclic DMA */
+-              vchan_cyclic_callback(&d->vd);
++              if (d->cyclic) {
++                      /* call the cyclic callback */
++                      vchan_cyclic_callback(&d->vd);
++
++                      /* Keep the DMA engine running */
++                      writel(BCM2835_DMA_ACTIVE,
++                             c->chan_base + BCM2835_DMA_CS);
++              } else {
++                      vchan_cookie_complete(&c->desc->vd);
++                      bcm2835_dma_start_desc(c);
++              }
+       }
+-      /* Keep the DMA engine running */
+-      writel(BCM2835_DMA_ACTIVE, c->chan_base + BCM2835_DMA_CS);
+-
+       spin_unlock_irqrestore(&c->vc.lock, flags);
+       return IRQ_HANDLED;
+@@ -548,6 +597,58 @@ static void bcm2835_dma_issue_pending(st
+       spin_unlock_irqrestore(&c->vc.lock, flags);
+ }
++static struct dma_async_tx_descriptor *bcm2835_dma_prep_slave_sg(
++      struct dma_chan *chan,
++      struct scatterlist *sgl, unsigned int sg_len,
++      enum dma_transfer_direction direction,
++      unsigned long flags, void *context)
++{
++      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
++      struct bcm2835_desc *d;
++      dma_addr_t src = 0, dst = 0;
++      u32 info = BCM2835_DMA_WAIT_RESP;
++      u32 extra = BCM2835_DMA_INT_EN;
++      size_t frames;
++
++      if (!is_slave_direction(direction)) {
++              dev_err(chan->device->dev,
++                      "%s: bad direction?\n", __func__);
++              return NULL;
++      }
++
++      if (c->dreq != 0)
++              info |= BCM2835_DMA_PER_MAP(c->dreq);
++
++      if (direction == DMA_DEV_TO_MEM) {
++              if (c->cfg.src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
++                      return NULL;
++              src = c->cfg.src_addr;
++              info |= BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC;
++      } else {
++              if (c->cfg.dst_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
++                      return NULL;
++              dst = c->cfg.dst_addr;
++              info |= BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC;
++      }
++
++      /* count frames in sg list */
++      frames = bcm2835_dma_count_frames_for_sg(c, sgl, sg_len);
++
++      /* allocate the CB chain */
++      d = bcm2835_dma_create_cb_chain(chan, direction, false,
++                                      info, extra,
++                                      frames, src, dst, 0, 0,
++                                      GFP_KERNEL);
++      if (!d)
++              return NULL;
++
++      /* fill in frames with scatterlist pointers */
++      bcm2835_dma_fill_cb_chain_with_sg(chan, direction, d->cb_list,
++                                        sgl, sg_len);
++
++      return vchan_tx_prep(&c->vc, &d->vd, flags);
++}
++
+ static struct dma_async_tx_descriptor *bcm2835_dma_prep_dma_cyclic(
+       struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
+       size_t period_len, enum dma_transfer_direction direction,
+@@ -778,11 +879,13 @@ static int bcm2835_dma_probe(struct plat
+       dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
+       dma_cap_set(DMA_PRIVATE, od->ddev.cap_mask);
+       dma_cap_set(DMA_CYCLIC, od->ddev.cap_mask);
++      dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
+       od->ddev.device_alloc_chan_resources = bcm2835_dma_alloc_chan_resources;
+       od->ddev.device_free_chan_resources = bcm2835_dma_free_chan_resources;
+       od->ddev.device_tx_status = bcm2835_dma_tx_status;
+       od->ddev.device_issue_pending = bcm2835_dma_issue_pending;
+       od->ddev.device_prep_dma_cyclic = bcm2835_dma_prep_dma_cyclic;
++      od->ddev.device_prep_slave_sg = bcm2835_dma_prep_slave_sg;
+       od->ddev.device_config = bcm2835_dma_slave_config;
+       od->ddev.device_terminate_all = bcm2835_dma_terminate_all;
+       od->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
diff --git a/target/linux/brcm2708/patches-4.4/0398-dmaengine-bcm2835-limit-max-length-based-on-channel-.patch b/target/linux/brcm2708/patches-4.4/0398-dmaengine-bcm2835-limit-max-length-based-on-channel-.patch
deleted file mode 100644 (file)
index e679850..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-From 930015dce415e4203daeafb09c24759ac883613e Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:25:00 -0700
-Subject: [PATCH 398/423] dmaengine: bcm2835: limit max length based on channel
- type
-
-The bcm2835 dma system has 2 basic types of dma-channels:
-* "normal" channels
-* "light" channels
-
-Lite channels are limited in several aspects:
-* internal data-structure is 128 bit (not 256)
-* does not support BCM2835_DMA_TDMODE (2D)
-* DMA length register is limited to 16 bit.
-  so 0-65535 (not 0-65536 as mentioned in the official datasheet)
-* BCM2835_DMA_S/D_IGNORE are not supported
-
-The detection of the type of mode is implemented by looking at
-the LITE bit in the DEBUG register for each channel.
-This allows automatic detection.
-
-Based on this the maximum block size is set to (64K - 4) or to 1G
-and this limit is honored during generation of control block
-chains. The effect is that when a LITE channel is used more
-control blocks are used to do the same transfer (compared
-to a normal channel).
-
-As there are several sources/target DREQS that are 32 bit wide
-we need to have the transfer to be a multiple of 4 as this would
-break the transfer otherwise.
-
-This is why the limit of (64K - 4) was chosen over the
-alternative of (64K - 4K).
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 29 ++++++++++++++++++++++++++---
- 1 file changed, 26 insertions(+), 3 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -81,6 +81,8 @@ struct bcm2835_chan {
-       void __iomem *chan_base;
-       int irq_number;
-+
-+      bool is_lite_channel;
- };
- struct bcm2835_desc {
-@@ -169,6 +171,16 @@ struct bcm2835_desc {
- #define BCM2835_DMA_CHAN(n)   ((n) << 8) /* Base address */
- #define BCM2835_DMA_CHANIO(base, n) ((base) + BCM2835_DMA_CHAN(n))
-+/* the max dma length for different channels */
-+#define MAX_DMA_LEN SZ_1G
-+#define MAX_LITE_DMA_LEN (SZ_64K - 4)
-+
-+static inline size_t bcm2835_dma_max_frame_length(struct bcm2835_chan *c)
-+{
-+      /* lite and normal channels have different max frame length */
-+      return c->is_lite_channel ? MAX_LITE_DMA_LEN : MAX_DMA_LEN;
-+}
-+
- /* how many frames of max_len size do we need to transfer len bytes */
- static inline size_t bcm2835_dma_frames_for_length(size_t len,
-                                                  size_t max_len)
-@@ -217,8 +229,10 @@ static void bcm2835_dma_create_cb_set_le
-       size_t *total_len,
-       u32 finalextrainfo)
- {
--      /* set the length */
--      control_block->length = len;
-+      size_t max_len = bcm2835_dma_max_frame_length(chan);
-+
-+      /* set the length taking lite-channel limitations into account */
-+      control_block->length = min_t(u32, len, max_len);
-       /* finished if we have no period_length */
-       if (!period_len)
-@@ -544,6 +558,7 @@ static struct dma_async_tx_descriptor *b
-       dma_addr_t src, dst;
-       u32 info = BCM2835_DMA_WAIT_RESP;
-       u32 extra = BCM2835_DMA_INT_EN;
-+      size_t max_len = bcm2835_dma_max_frame_length(c);
-       size_t frames;
-       /* Grab configuration */
-@@ -586,7 +601,10 @@ static struct dma_async_tx_descriptor *b
-       }
-       /* calculate number of frames */
--      frames = DIV_ROUND_UP(buf_len, period_len);
-+      frames = /* number of periods */
-+               DIV_ROUND_UP(buf_len, period_len) *
-+               /* number of frames per period */
-+               bcm2835_dma_frames_for_length(period_len, max_len);
-       /*
-        * allocate the CB chain
-@@ -685,6 +703,11 @@ static int bcm2835_dma_chan_init(struct
-       c->ch = chan_id;
-       c->irq_number = irq;
-+      /* check in DEBUG register if this is a LITE channel */
-+      if (readl(c->chan_base + BCM2835_DMA_DEBUG) &
-+              BCM2835_DMA_DEBUG_LITE)
-+              c->is_lite_channel = true;
-+
-       return 0;
- }
diff --git a/target/linux/brcm2708/patches-4.4/0399-dmaengine-bcm2835-add-dma_memcopy-support-to-bcm2835.patch b/target/linux/brcm2708/patches-4.4/0399-dmaengine-bcm2835-add-dma_memcopy-support-to-bcm2835.patch
new file mode 100644 (file)
index 0000000..a7b50a5
--- /dev/null
@@ -0,0 +1,87 @@
+From 24392a5f014f3106442cef99e9956d0f826337e3 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Wed, 16 Mar 2016 12:25:02 -0700
+Subject: [PATCH] dmaengine: bcm2835: add dma_memcopy support to bcm2835-dma
+
+Also added check for an error condition in bcm2835_dma_create_cb_chain
+that showed up during development of this patch.
+
+Tested using dmatest for all enabled channels.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 36 +++++++++++++++++++++++++++++++++++-
+ 1 file changed, 35 insertions(+), 1 deletion(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -310,6 +310,9 @@ static struct bcm2835_desc *bcm2835_dma_
+       struct bcm2835_cb_entry *cb_entry;
+       struct bcm2835_dma_cb *control_block;
++      if (!frames)
++              return NULL;
++
+       /* allocate and setup the descriptor. */
+       d = kzalloc(sizeof(*d) + frames * sizeof(struct bcm2835_cb_entry),
+                   gfp);
+@@ -597,6 +600,34 @@ static void bcm2835_dma_issue_pending(st
+       spin_unlock_irqrestore(&c->vc.lock, flags);
+ }
++struct dma_async_tx_descriptor *bcm2835_dma_prep_dma_memcpy(
++      struct dma_chan *chan, dma_addr_t dst, dma_addr_t src,
++      size_t len, unsigned long flags)
++{
++      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
++      struct bcm2835_desc *d;
++      u32 info = BCM2835_DMA_D_INC | BCM2835_DMA_S_INC;
++      u32 extra = BCM2835_DMA_INT_EN | BCM2835_DMA_WAIT_RESP;
++      size_t max_len = bcm2835_dma_max_frame_length(c);
++      size_t frames;
++
++      /* if src, dst or len is not given return with an error */
++      if (!src || !dst || !len)
++              return NULL;
++
++      /* calculate number of frames */
++      frames = bcm2835_dma_frames_for_length(len, max_len);
++
++      /* allocate the CB chain - this also fills in the pointers */
++      d = bcm2835_dma_create_cb_chain(chan, DMA_MEM_TO_MEM, false,
++                                      info, extra, frames,
++                                      src, dst, len, 0, GFP_KERNEL);
++      if (!d)
++              return NULL;
++
++      return vchan_tx_prep(&c->vc, &d->vd, flags);
++}
++
+ static struct dma_async_tx_descriptor *bcm2835_dma_prep_slave_sg(
+       struct dma_chan *chan,
+       struct scatterlist *sgl, unsigned int sg_len,
+@@ -880,17 +911,20 @@ static int bcm2835_dma_probe(struct plat
+       dma_cap_set(DMA_PRIVATE, od->ddev.cap_mask);
+       dma_cap_set(DMA_CYCLIC, od->ddev.cap_mask);
+       dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
++      dma_cap_set(DMA_MEMCPY, od->ddev.cap_mask);
+       od->ddev.device_alloc_chan_resources = bcm2835_dma_alloc_chan_resources;
+       od->ddev.device_free_chan_resources = bcm2835_dma_free_chan_resources;
+       od->ddev.device_tx_status = bcm2835_dma_tx_status;
+       od->ddev.device_issue_pending = bcm2835_dma_issue_pending;
+       od->ddev.device_prep_dma_cyclic = bcm2835_dma_prep_dma_cyclic;
+       od->ddev.device_prep_slave_sg = bcm2835_dma_prep_slave_sg;
++      od->ddev.device_prep_dma_memcpy = bcm2835_dma_prep_dma_memcpy;
+       od->ddev.device_config = bcm2835_dma_slave_config;
+       od->ddev.device_terminate_all = bcm2835_dma_terminate_all;
+       od->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
+       od->ddev.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
+-      od->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
++      od->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV) |
++                            BIT(DMA_MEM_TO_MEM);
+       od->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
+       od->ddev.dev = &pdev->dev;
+       INIT_LIST_HEAD(&od->ddev.channels);
diff --git a/target/linux/brcm2708/patches-4.4/0399-dmaengine-bcm2835-add-slave_sg-support-to-bcm2835-dm.patch b/target/linux/brcm2708/patches-4.4/0399-dmaengine-bcm2835-add-slave_sg-support-to-bcm2835-dm.patch
deleted file mode 100644 (file)
index ad1a0f8..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-From 7cd84b455f4681e4db6cd9e3cd628bcd06df0978 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:25:01 -0700
-Subject: [PATCH 399/423] dmaengine: bcm2835: add slave_sg support to
- bcm2835-dma
-
-Add slave_sg support to bcm2835-dma using shared allocation
-code for bcm2835_desc and DMA-control blocks already used by
-dma_cyclic.
-
-Note that bcm2835_dma_callback had to get modified to support
-both modes of operation (cyclic and non-cyclic).
-
-Tested using:
-* Hifiberry I2S card (using cyclic DMA)
-* fb_st7735r SPI-framebuffer (using slave_sg DMA via spi-bcm2835)
-playing BigBuckBunny for audio and video.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 113 ++++++++++++++++++++++++++++++++++++++++++++--
- 1 file changed, 108 insertions(+), 5 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -260,6 +260,23 @@ static void bcm2835_dma_create_cb_set_le
-       control_block->info |= finalextrainfo;
- }
-+static inline size_t bcm2835_dma_count_frames_for_sg(
-+      struct bcm2835_chan *c,
-+      struct scatterlist *sgl,
-+      unsigned int sg_len)
-+{
-+      size_t frames = 0;
-+      struct scatterlist *sgent;
-+      unsigned int i;
-+      size_t plength = bcm2835_dma_max_frame_length(c);
-+
-+      for_each_sg(sgl, sgent, sg_len, i)
-+              frames += bcm2835_dma_frames_for_length(
-+                      sg_dma_len(sgent), plength);
-+
-+      return frames;
-+}
-+
- /**
-  * bcm2835_dma_create_cb_chain - create a control block and fills data in
-  *
-@@ -361,6 +378,32 @@ error_cb:
-       return NULL;
- }
-+static void bcm2835_dma_fill_cb_chain_with_sg(
-+      struct dma_chan *chan,
-+      enum dma_transfer_direction direction,
-+      struct bcm2835_cb_entry *cb,
-+      struct scatterlist *sgl,
-+      unsigned int sg_len)
-+{
-+      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
-+      size_t max_len = bcm2835_dma_max_frame_length(c);
-+      unsigned int i, len;
-+      dma_addr_t addr;
-+      struct scatterlist *sgent;
-+
-+      for_each_sg(sgl, sgent, sg_len, i) {
-+              for (addr = sg_dma_address(sgent), len = sg_dma_len(sgent);
-+                   len > 0;
-+                   addr += cb->cb->length, len -= cb->cb->length, cb++) {
-+                      if (direction == DMA_DEV_TO_MEM)
-+                              cb->cb->dst = addr;
-+                      else
-+                              cb->cb->src = addr;
-+                      cb->cb->length = min(len, max_len);
-+              }
-+      }
-+}
-+
- static int bcm2835_dma_abort(void __iomem *chan_base)
- {
-       unsigned long cs;
-@@ -428,13 +471,19 @@ static irqreturn_t bcm2835_dma_callback(
-       d = c->desc;
-       if (d) {
--              /* TODO Only works for cyclic DMA */
--              vchan_cyclic_callback(&d->vd);
-+              if (d->cyclic) {
-+                      /* call the cyclic callback */
-+                      vchan_cyclic_callback(&d->vd);
-+
-+                      /* Keep the DMA engine running */
-+                      writel(BCM2835_DMA_ACTIVE,
-+                             c->chan_base + BCM2835_DMA_CS);
-+              } else {
-+                      vchan_cookie_complete(&c->desc->vd);
-+                      bcm2835_dma_start_desc(c);
-+              }
-       }
--      /* Keep the DMA engine running */
--      writel(BCM2835_DMA_ACTIVE, c->chan_base + BCM2835_DMA_CS);
--
-       spin_unlock_irqrestore(&c->vc.lock, flags);
-       return IRQ_HANDLED;
-@@ -548,6 +597,58 @@ static void bcm2835_dma_issue_pending(st
-       spin_unlock_irqrestore(&c->vc.lock, flags);
- }
-+static struct dma_async_tx_descriptor *bcm2835_dma_prep_slave_sg(
-+      struct dma_chan *chan,
-+      struct scatterlist *sgl, unsigned int sg_len,
-+      enum dma_transfer_direction direction,
-+      unsigned long flags, void *context)
-+{
-+      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
-+      struct bcm2835_desc *d;
-+      dma_addr_t src = 0, dst = 0;
-+      u32 info = BCM2835_DMA_WAIT_RESP;
-+      u32 extra = BCM2835_DMA_INT_EN;
-+      size_t frames;
-+
-+      if (!is_slave_direction(direction)) {
-+              dev_err(chan->device->dev,
-+                      "%s: bad direction?\n", __func__);
-+              return NULL;
-+      }
-+
-+      if (c->dreq != 0)
-+              info |= BCM2835_DMA_PER_MAP(c->dreq);
-+
-+      if (direction == DMA_DEV_TO_MEM) {
-+              if (c->cfg.src_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
-+                      return NULL;
-+              src = c->cfg.src_addr;
-+              info |= BCM2835_DMA_S_DREQ | BCM2835_DMA_D_INC;
-+      } else {
-+              if (c->cfg.dst_addr_width != DMA_SLAVE_BUSWIDTH_4_BYTES)
-+                      return NULL;
-+              dst = c->cfg.dst_addr;
-+              info |= BCM2835_DMA_D_DREQ | BCM2835_DMA_S_INC;
-+      }
-+
-+      /* count frames in sg list */
-+      frames = bcm2835_dma_count_frames_for_sg(c, sgl, sg_len);
-+
-+      /* allocate the CB chain */
-+      d = bcm2835_dma_create_cb_chain(chan, direction, false,
-+                                      info, extra,
-+                                      frames, src, dst, 0, 0,
-+                                      GFP_KERNEL);
-+      if (!d)
-+              return NULL;
-+
-+      /* fill in frames with scatterlist pointers */
-+      bcm2835_dma_fill_cb_chain_with_sg(chan, direction, d->cb_list,
-+                                        sgl, sg_len);
-+
-+      return vchan_tx_prep(&c->vc, &d->vd, flags);
-+}
-+
- static struct dma_async_tx_descriptor *bcm2835_dma_prep_dma_cyclic(
-       struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
-       size_t period_len, enum dma_transfer_direction direction,
-@@ -778,11 +879,13 @@ static int bcm2835_dma_probe(struct plat
-       dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
-       dma_cap_set(DMA_PRIVATE, od->ddev.cap_mask);
-       dma_cap_set(DMA_CYCLIC, od->ddev.cap_mask);
-+      dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
-       od->ddev.device_alloc_chan_resources = bcm2835_dma_alloc_chan_resources;
-       od->ddev.device_free_chan_resources = bcm2835_dma_free_chan_resources;
-       od->ddev.device_tx_status = bcm2835_dma_tx_status;
-       od->ddev.device_issue_pending = bcm2835_dma_issue_pending;
-       od->ddev.device_prep_dma_cyclic = bcm2835_dma_prep_dma_cyclic;
-+      od->ddev.device_prep_slave_sg = bcm2835_dma_prep_slave_sg;
-       od->ddev.device_config = bcm2835_dma_slave_config;
-       od->ddev.device_terminate_all = bcm2835_dma_terminate_all;
-       od->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
diff --git a/target/linux/brcm2708/patches-4.4/0400-dmaengine-bcm2835-add-dma_memcopy-support-to-bcm2835.patch b/target/linux/brcm2708/patches-4.4/0400-dmaengine-bcm2835-add-dma_memcopy-support-to-bcm2835.patch
deleted file mode 100644 (file)
index 829f9c2..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-From ce27d8ba202467a2b811de711ed95d17b2bb27e5 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Wed, 16 Mar 2016 12:25:02 -0700
-Subject: [PATCH 400/423] dmaengine: bcm2835: add dma_memcopy support to
- bcm2835-dma
-
-Also added check for an error condition in bcm2835_dma_create_cb_chain
-that showed up during development of this patch.
-
-Tested using dmatest for all enabled channels.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Reviewed-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Eric Anholt <eric@anholt.net>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 36 +++++++++++++++++++++++++++++++++++-
- 1 file changed, 35 insertions(+), 1 deletion(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -310,6 +310,9 @@ static struct bcm2835_desc *bcm2835_dma_
-       struct bcm2835_cb_entry *cb_entry;
-       struct bcm2835_dma_cb *control_block;
-+      if (!frames)
-+              return NULL;
-+
-       /* allocate and setup the descriptor. */
-       d = kzalloc(sizeof(*d) + frames * sizeof(struct bcm2835_cb_entry),
-                   gfp);
-@@ -597,6 +600,34 @@ static void bcm2835_dma_issue_pending(st
-       spin_unlock_irqrestore(&c->vc.lock, flags);
- }
-+struct dma_async_tx_descriptor *bcm2835_dma_prep_dma_memcpy(
-+      struct dma_chan *chan, dma_addr_t dst, dma_addr_t src,
-+      size_t len, unsigned long flags)
-+{
-+      struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
-+      struct bcm2835_desc *d;
-+      u32 info = BCM2835_DMA_D_INC | BCM2835_DMA_S_INC;
-+      u32 extra = BCM2835_DMA_INT_EN | BCM2835_DMA_WAIT_RESP;
-+      size_t max_len = bcm2835_dma_max_frame_length(c);
-+      size_t frames;
-+
-+      /* if src, dst or len is not given return with an error */
-+      if (!src || !dst || !len)
-+              return NULL;
-+
-+      /* calculate number of frames */
-+      frames = bcm2835_dma_frames_for_length(len, max_len);
-+
-+      /* allocate the CB chain - this also fills in the pointers */
-+      d = bcm2835_dma_create_cb_chain(chan, DMA_MEM_TO_MEM, false,
-+                                      info, extra, frames,
-+                                      src, dst, len, 0, GFP_KERNEL);
-+      if (!d)
-+              return NULL;
-+
-+      return vchan_tx_prep(&c->vc, &d->vd, flags);
-+}
-+
- static struct dma_async_tx_descriptor *bcm2835_dma_prep_slave_sg(
-       struct dma_chan *chan,
-       struct scatterlist *sgl, unsigned int sg_len,
-@@ -880,17 +911,20 @@ static int bcm2835_dma_probe(struct plat
-       dma_cap_set(DMA_PRIVATE, od->ddev.cap_mask);
-       dma_cap_set(DMA_CYCLIC, od->ddev.cap_mask);
-       dma_cap_set(DMA_SLAVE, od->ddev.cap_mask);
-+      dma_cap_set(DMA_MEMCPY, od->ddev.cap_mask);
-       od->ddev.device_alloc_chan_resources = bcm2835_dma_alloc_chan_resources;
-       od->ddev.device_free_chan_resources = bcm2835_dma_free_chan_resources;
-       od->ddev.device_tx_status = bcm2835_dma_tx_status;
-       od->ddev.device_issue_pending = bcm2835_dma_issue_pending;
-       od->ddev.device_prep_dma_cyclic = bcm2835_dma_prep_dma_cyclic;
-       od->ddev.device_prep_slave_sg = bcm2835_dma_prep_slave_sg;
-+      od->ddev.device_prep_dma_memcpy = bcm2835_dma_prep_dma_memcpy;
-       od->ddev.device_config = bcm2835_dma_slave_config;
-       od->ddev.device_terminate_all = bcm2835_dma_terminate_all;
-       od->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
-       od->ddev.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
--      od->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
-+      od->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV) |
-+                            BIT(DMA_MEM_TO_MEM);
-       od->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
-       od->ddev.dev = &pdev->dev;
-       INIT_LIST_HEAD(&od->ddev.channels);
diff --git a/target/linux/brcm2708/patches-4.4/0400-dmaengine-bcm2835-use-platform_get_irq_byname.patch b/target/linux/brcm2708/patches-4.4/0400-dmaengine-bcm2835-use-platform_get_irq_byname.patch
new file mode 100644 (file)
index 0000000..b8eecaf
--- /dev/null
@@ -0,0 +1,170 @@
+From 27a895c19212e695f70bd4860d4420f70f915fe1 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Mon, 11 Apr 2016 13:29:08 +0000
+Subject: [PATCH] dmaengine: bcm2835: use platform_get_irq_byname
+
+Use platform_get_irq_byname to allow for correct mapping of
+interrupts to dma channels.
+
+The currently implemented device tree is unfortunately
+implemented with the wrong assumption, that each dma-channel
+has its own dma channel, but dma-irq 11 is handling
+dma-channel 11-14 and dma-irq 12 is actually a "catch all"
+interrupt.
+
+So here we use the byname variant and require that interrupts
+are explicitly named via the interrupts-name property in the
+device tree.
+
+The use of shared interrupts is also implemented.
+
+As a side-effect this means we can now use dma channels 12, 13 and 14
+in a correct manner - also testing shows that onl using
+channels 11 to 14 for spi and i2s works perfectly (when playing
+some video)
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Acked-by: Eric Anholt <eric@anholt.net>
+Acked-by: Mark Rutland <mark.rutland@arm.com>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+---
+ drivers/dma/bcm2835-dma.c | 77 ++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 63 insertions(+), 14 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -46,6 +46,9 @@
+ #include "virt-dma.h"
++#define BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED 14
++#define BCM2835_DMA_CHAN_NAME_SIZE 8
++
+ struct bcm2835_dmadev {
+       struct dma_device ddev;
+       spinlock_t lock;
+@@ -81,6 +84,7 @@ struct bcm2835_chan {
+       void __iomem *chan_base;
+       int irq_number;
++      unsigned int irq_flags;
+       bool is_lite_channel;
+ };
+@@ -466,6 +470,15 @@ static irqreturn_t bcm2835_dma_callback(
+       struct bcm2835_desc *d;
+       unsigned long flags;
++      /* check the shared interrupt */
++      if (c->irq_flags & IRQF_SHARED) {
++              /* check if the interrupt is enabled */
++              flags = readl(c->chan_base + BCM2835_DMA_CS);
++              /* if not set then we are not the reason for the irq */
++              if (!(flags & BCM2835_DMA_INT))
++                      return IRQ_NONE;
++      }
++
+       spin_lock_irqsave(&c->vc.lock, flags);
+       /* Acknowledge interrupt */
+@@ -506,8 +519,8 @@ static int bcm2835_dma_alloc_chan_resour
+               return -ENOMEM;
+       }
+-      return request_irq(c->irq_number,
+-                      bcm2835_dma_callback, 0, "DMA IRQ", c);
++      return request_irq(c->irq_number, bcm2835_dma_callback,
++                         c->irq_flags, "DMA IRQ", c);
+ }
+ static void bcm2835_dma_free_chan_resources(struct dma_chan *chan)
+@@ -819,7 +832,8 @@ static int bcm2835_dma_terminate_all(str
+       return 0;
+ }
+-static int bcm2835_dma_chan_init(struct bcm2835_dmadev *d, int chan_id, int irq)
++static int bcm2835_dma_chan_init(struct bcm2835_dmadev *d, int chan_id,
++                               int irq, unsigned int irq_flags)
+ {
+       struct bcm2835_chan *c;
+@@ -834,6 +848,7 @@ static int bcm2835_dma_chan_init(struct
+       c->chan_base = BCM2835_DMA_CHANIO(d->base, chan_id);
+       c->ch = chan_id;
+       c->irq_number = irq;
++      c->irq_flags = irq_flags;
+       /* check in DEBUG register if this is a LITE channel */
+       if (readl(c->chan_base + BCM2835_DMA_DEBUG) &
+@@ -882,9 +897,11 @@ static int bcm2835_dma_probe(struct plat
+       struct resource *res;
+       void __iomem *base;
+       int rc;
+-      int i;
+-      int irq;
++      int i, j;
++      int irq[BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED + 1];
++      int irq_flags;
+       uint32_t chans_available;
++      char chan_name[BCM2835_DMA_CHAN_NAME_SIZE];
+       if (!pdev->dev.dma_mask)
+               pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
+@@ -941,16 +958,48 @@ static int bcm2835_dma_probe(struct plat
+               goto err_no_dma;
+       }
+-      for (i = 0; i < pdev->num_resources; i++) {
+-              irq = platform_get_irq(pdev, i);
+-              if (irq < 0)
+-                      break;
+-
+-              if (chans_available & (1 << i)) {
+-                      rc = bcm2835_dma_chan_init(od, i, irq);
+-                      if (rc)
+-                              goto err_no_dma;
++      /* get irqs for each channel that we support */
++      for (i = 0; i <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) {
++              /* skip masked out channels */
++              if (!(chans_available & (1 << i))) {
++                      irq[i] = -1;
++                      continue;
+               }
++
++              /* get the named irq */
++              snprintf(chan_name, sizeof(chan_name), "dma%i", i);
++              irq[i] = platform_get_irq_byname(pdev, chan_name);
++              if (irq[i] >= 0)
++                      continue;
++
++              /* legacy device tree case handling */
++              dev_warn_once(&pdev->dev,
++                            "missing interrupts-names property in device tree - legacy interpretation is used");
++              /*
++               * in case of channel >= 11
++               * use the 11th interrupt and that is shared
++               */
++              irq[i] = platform_get_irq(pdev, i < 11 ? i : 11);
++      }
++
++      /* get irqs for each channel */
++      for (i = 0; i <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) {
++              /* skip channels without irq */
++              if (irq[i] < 0)
++                      continue;
++
++              /* check if there are other channels that also use this irq */
++              irq_flags = 0;
++              for (j = 0; j <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; j++)
++                      if ((i != j) && (irq[j] == irq[i])) {
++                              irq_flags = IRQF_SHARED;
++                              break;
++                      }
++
++              /* initialize the channel */
++              rc = bcm2835_dma_chan_init(od, i, irq[i], irq_flags);
++              if (rc)
++                      goto err_no_dma;
+       }
+       dev_dbg(&pdev->dev, "Initialized %i DMA channels\n", i);
diff --git a/target/linux/brcm2708/patches-4.4/0401-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch b/target/linux/brcm2708/patches-4.4/0401-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch
new file mode 100644 (file)
index 0000000..f8ad8f3
--- /dev/null
@@ -0,0 +1,89 @@
+From 479b918cb9511d5044cc660f0c74d42952a87910 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] dmaengine: bcm2835: Load driver early and support legacy API
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Load driver early since at least bcm2708_fb doesn't support deferred
+probing and even if it did, we don't want the video driver deferred.
+
+Support the legacy DMA API which is needed by bcm2708_fb
+(but only using the dedicated dma channel 0).
+
+Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+---
+ drivers/dma/Kconfig       |  2 +-
+ drivers/dma/bcm2835-dma.c | 27 ++++++++++++++++++++++++++-
+ 2 files changed, 27 insertions(+), 2 deletions(-)
+
+--- a/drivers/dma/Kconfig
++++ b/drivers/dma/Kconfig
+@@ -108,7 +108,7 @@ config COH901318
+ config DMA_BCM2835
+       tristate "BCM2835 DMA engine support"
+-      depends on ARCH_BCM2835
++      depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
+       select DMA_ENGINE
+       select DMA_VIRTUAL_CHANNELS
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -37,6 +37,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
++#include <linux/platform_data/dma-bcm2708.h>
+ #include <linux/platform_device.h>
+ #include <linux/slab.h>
+ #include <linux/io.h>
+@@ -1021,6 +1022,14 @@ static int bcm2835_dma_probe(struct plat
+       dev_dbg(&pdev->dev, "Load BCM2835 DMA engine driver\n");
++      /* load the legacy api if bit 0 in the mask is cleared */
++      if ((chans_available & BIT(0)) == 0) {
++              rc = bcm_dmaman_probe(pdev, base, BIT(0));
++              if (rc)
++                      dev_err(&pdev->dev,
++                              "Failed to initialize the legacy API\n");
++      }
++
+       return 0;
+ err_no_dma:
+@@ -1032,6 +1041,7 @@ static int bcm2835_dma_remove(struct pla
+ {
+       struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
++      bcm_dmaman_remove(pdev);
+       dma_async_device_unregister(&od->ddev);
+       bcm2835_dma_free(od);
+@@ -1047,7 +1057,22 @@ static struct platform_driver bcm2835_dm
+       },
+ };
+-module_platform_driver(bcm2835_dma_driver);
++static int bcm2835_dma_init(void)
++{
++      return platform_driver_register(&bcm2835_dma_driver);
++}
++
++static void bcm2835_dma_exit(void)
++{
++      platform_driver_unregister(&bcm2835_dma_driver);
++}
++
++/*
++ * Load after serial driver (arch_initcall) so we see the messages if it fails,
++ * but before drivers (module_init) that need a DMA channel.
++ */
++subsys_initcall(bcm2835_dma_init);
++module_exit(bcm2835_dma_exit);
+ MODULE_ALIAS("platform:bcm2835-dma");
+ MODULE_DESCRIPTION("BCM2835 DMA engine driver");
diff --git a/target/linux/brcm2708/patches-4.4/0401-dmaengine-bcm2835-use-platform_get_irq_byname.patch b/target/linux/brcm2708/patches-4.4/0401-dmaengine-bcm2835-use-platform_get_irq_byname.patch
deleted file mode 100644 (file)
index 4ac145d..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-From 1e4008ef44653e552ce20969322fc271a2b52fe4 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Mon, 11 Apr 2016 13:29:08 +0000
-Subject: [PATCH 401/423] dmaengine: bcm2835: use platform_get_irq_byname
-
-Use platform_get_irq_byname to allow for correct mapping of
-interrupts to dma channels.
-
-The currently implemented device tree is unfortunately
-implemented with the wrong assumption, that each dma-channel
-has its own dma channel, but dma-irq 11 is handling
-dma-channel 11-14 and dma-irq 12 is actually a "catch all"
-interrupt.
-
-So here we use the byname variant and require that interrupts
-are explicitly named via the interrupts-name property in the
-device tree.
-
-The use of shared interrupts is also implemented.
-
-As a side-effect this means we can now use dma channels 12, 13 and 14
-in a correct manner - also testing shows that onl using
-channels 11 to 14 for spi and i2s works perfectly (when playing
-some video)
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Acked-by: Eric Anholt <eric@anholt.net>
-Acked-by: Mark Rutland <mark.rutland@arm.com>
-Signed-off-by: Vinod Koul <vinod.koul@intel.com>
----
- drivers/dma/bcm2835-dma.c | 77 ++++++++++++++++++++++++++++++++++++++---------
- 1 file changed, 63 insertions(+), 14 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -46,6 +46,9 @@
- #include "virt-dma.h"
-+#define BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED 14
-+#define BCM2835_DMA_CHAN_NAME_SIZE 8
-+
- struct bcm2835_dmadev {
-       struct dma_device ddev;
-       spinlock_t lock;
-@@ -81,6 +84,7 @@ struct bcm2835_chan {
-       void __iomem *chan_base;
-       int irq_number;
-+      unsigned int irq_flags;
-       bool is_lite_channel;
- };
-@@ -466,6 +470,15 @@ static irqreturn_t bcm2835_dma_callback(
-       struct bcm2835_desc *d;
-       unsigned long flags;
-+      /* check the shared interrupt */
-+      if (c->irq_flags & IRQF_SHARED) {
-+              /* check if the interrupt is enabled */
-+              flags = readl(c->chan_base + BCM2835_DMA_CS);
-+              /* if not set then we are not the reason for the irq */
-+              if (!(flags & BCM2835_DMA_INT))
-+                      return IRQ_NONE;
-+      }
-+
-       spin_lock_irqsave(&c->vc.lock, flags);
-       /* Acknowledge interrupt */
-@@ -506,8 +519,8 @@ static int bcm2835_dma_alloc_chan_resour
-               return -ENOMEM;
-       }
--      return request_irq(c->irq_number,
--                      bcm2835_dma_callback, 0, "DMA IRQ", c);
-+      return request_irq(c->irq_number, bcm2835_dma_callback,
-+                         c->irq_flags, "DMA IRQ", c);
- }
- static void bcm2835_dma_free_chan_resources(struct dma_chan *chan)
-@@ -819,7 +832,8 @@ static int bcm2835_dma_terminate_all(str
-       return 0;
- }
--static int bcm2835_dma_chan_init(struct bcm2835_dmadev *d, int chan_id, int irq)
-+static int bcm2835_dma_chan_init(struct bcm2835_dmadev *d, int chan_id,
-+                               int irq, unsigned int irq_flags)
- {
-       struct bcm2835_chan *c;
-@@ -834,6 +848,7 @@ static int bcm2835_dma_chan_init(struct
-       c->chan_base = BCM2835_DMA_CHANIO(d->base, chan_id);
-       c->ch = chan_id;
-       c->irq_number = irq;
-+      c->irq_flags = irq_flags;
-       /* check in DEBUG register if this is a LITE channel */
-       if (readl(c->chan_base + BCM2835_DMA_DEBUG) &
-@@ -882,9 +897,11 @@ static int bcm2835_dma_probe(struct plat
-       struct resource *res;
-       void __iomem *base;
-       int rc;
--      int i;
--      int irq;
-+      int i, j;
-+      int irq[BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED + 1];
-+      int irq_flags;
-       uint32_t chans_available;
-+      char chan_name[BCM2835_DMA_CHAN_NAME_SIZE];
-       if (!pdev->dev.dma_mask)
-               pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
-@@ -941,16 +958,48 @@ static int bcm2835_dma_probe(struct plat
-               goto err_no_dma;
-       }
--      for (i = 0; i < pdev->num_resources; i++) {
--              irq = platform_get_irq(pdev, i);
--              if (irq < 0)
--                      break;
--
--              if (chans_available & (1 << i)) {
--                      rc = bcm2835_dma_chan_init(od, i, irq);
--                      if (rc)
--                              goto err_no_dma;
-+      /* get irqs for each channel that we support */
-+      for (i = 0; i <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) {
-+              /* skip masked out channels */
-+              if (!(chans_available & (1 << i))) {
-+                      irq[i] = -1;
-+                      continue;
-               }
-+
-+              /* get the named irq */
-+              snprintf(chan_name, sizeof(chan_name), "dma%i", i);
-+              irq[i] = platform_get_irq_byname(pdev, chan_name);
-+              if (irq[i] >= 0)
-+                      continue;
-+
-+              /* legacy device tree case handling */
-+              dev_warn_once(&pdev->dev,
-+                            "missing interrupts-names property in device tree - legacy interpretation is used");
-+              /*
-+               * in case of channel >= 11
-+               * use the 11th interrupt and that is shared
-+               */
-+              irq[i] = platform_get_irq(pdev, i < 11 ? i : 11);
-+      }
-+
-+      /* get irqs for each channel */
-+      for (i = 0; i <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; i++) {
-+              /* skip channels without irq */
-+              if (irq[i] < 0)
-+                      continue;
-+
-+              /* check if there are other channels that also use this irq */
-+              irq_flags = 0;
-+              for (j = 0; j <= BCM2835_DMA_MAX_DMA_CHAN_SUPPORTED; j++)
-+                      if ((i != j) && (irq[j] == irq[i])) {
-+                              irq_flags = IRQF_SHARED;
-+                              break;
-+                      }
-+
-+              /* initialize the channel */
-+              rc = bcm2835_dma_chan_init(od, i, irq[i], irq_flags);
-+              if (rc)
-+                      goto err_no_dma;
-       }
-       dev_dbg(&pdev->dev, "Initialized %i DMA channels\n", i);
diff --git a/target/linux/brcm2708/patches-4.4/0402-ARM-bcm270x-changed-bcrm-dma-channel-mask-to-mask-ou.patch b/target/linux/brcm2708/patches-4.4/0402-ARM-bcm270x-changed-bcrm-dma-channel-mask-to-mask-ou.patch
new file mode 100644 (file)
index 0000000..1bcdd93
--- /dev/null
@@ -0,0 +1,26 @@
+From fa1852176e0d03be5650aa88a6e051541fa3da7a Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Fri, 22 Apr 2016 16:13:59 +0000
+Subject: [PATCH] ARM: bcm270x: changed bcrm,dma-channel-mask to mask out the
+ used channel
+
+Dma channel0 is used by the legacy api - to avoid confilcts this
+needs to get masked out in the device-tree instead of hardcoding it
+in the driver.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -59,7 +59,7 @@
+                                    <1 27>;
+                       #dma-cells = <1>;
+-                      brcm,dma-channel-mask = <0x0f35>;
++                      brcm,dma-channel-mask = <0x0f34>;
+               };
+               intc: interrupt-controller@7e00b200 {
diff --git a/target/linux/brcm2708/patches-4.4/0402-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch b/target/linux/brcm2708/patches-4.4/0402-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch
deleted file mode 100644 (file)
index 5d21ffd..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-From b0ad872cdb56e3dfd36ec2fbd0aad0375609bb0f 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 402/423] dmaengine: bcm2835: Load driver early and support
- legacy API
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Load driver early since at least bcm2708_fb doesn't support deferred
-probing and even if it did, we don't want the video driver deferred.
-
-Support the legacy DMA API which is needed by bcm2708_fb
-(but only using the dedicated dma channel 0).
-
-Signed-off-by: Noralf Trønnes <noralf@tronnes.org>
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
----
- drivers/dma/Kconfig       |  2 +-
- drivers/dma/bcm2835-dma.c | 27 ++++++++++++++++++++++++++-
- 2 files changed, 27 insertions(+), 2 deletions(-)
-
---- a/drivers/dma/Kconfig
-+++ b/drivers/dma/Kconfig
-@@ -108,7 +108,7 @@ config COH901318
- config DMA_BCM2835
-       tristate "BCM2835 DMA engine support"
--      depends on ARCH_BCM2835
-+      depends on ARCH_BCM2835 || ARCH_BCM2708 || ARCH_BCM2709
-       select DMA_ENGINE
-       select DMA_VIRTUAL_CHANNELS
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -37,6 +37,7 @@
- #include <linux/interrupt.h>
- #include <linux/list.h>
- #include <linux/module.h>
-+#include <linux/platform_data/dma-bcm2708.h>
- #include <linux/platform_device.h>
- #include <linux/slab.h>
- #include <linux/io.h>
-@@ -1021,6 +1022,14 @@ static int bcm2835_dma_probe(struct plat
-       dev_dbg(&pdev->dev, "Load BCM2835 DMA engine driver\n");
-+      /* load the legacy api if bit 0 in the mask is cleared */
-+      if ((chans_available & BIT(0)) == 0) {
-+              rc = bcm_dmaman_probe(pdev, base, BIT(0));
-+              if (rc)
-+                      dev_err(&pdev->dev,
-+                              "Failed to initialize the legacy API\n");
-+      }
-+
-       return 0;
- err_no_dma:
-@@ -1032,6 +1041,7 @@ static int bcm2835_dma_remove(struct pla
- {
-       struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
-+      bcm_dmaman_remove(pdev);
-       dma_async_device_unregister(&od->ddev);
-       bcm2835_dma_free(od);
-@@ -1047,7 +1057,22 @@ static struct platform_driver bcm2835_dm
-       },
- };
--module_platform_driver(bcm2835_dma_driver);
-+static int bcm2835_dma_init(void)
-+{
-+      return platform_driver_register(&bcm2835_dma_driver);
-+}
-+
-+static void bcm2835_dma_exit(void)
-+{
-+      platform_driver_unregister(&bcm2835_dma_driver);
-+}
-+
-+/*
-+ * Load after serial driver (arch_initcall) so we see the messages if it fails,
-+ * but before drivers (module_init) that need a DMA channel.
-+ */
-+subsys_initcall(bcm2835_dma_init);
-+module_exit(bcm2835_dma_exit);
- MODULE_ALIAS("platform:bcm2835-dma");
- MODULE_DESCRIPTION("BCM2835 DMA engine driver");
diff --git a/target/linux/brcm2708/patches-4.4/0403-ARM-bcm270x-changed-bcrm-dma-channel-mask-to-mask-ou.patch b/target/linux/brcm2708/patches-4.4/0403-ARM-bcm270x-changed-bcrm-dma-channel-mask-to-mask-ou.patch
deleted file mode 100644 (file)
index 84d24c0..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From 397377a39914146b6c7ac085436fbc948c39b0ff Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Fri, 22 Apr 2016 16:13:59 +0000
-Subject: [PATCH 403/423] ARM: bcm270x: changed bcrm,dma-channel-mask to mask
- out the used channel
-
-Dma channel0 is used by the legacy api - to avoid confilcts this
-needs to get masked out in the device-tree instead of hardcoding it
-in the driver.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
----
- arch/arm/boot/dts/bcm2708_common.dtsi | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/arm/boot/dts/bcm2708_common.dtsi
-+++ b/arch/arm/boot/dts/bcm2708_common.dtsi
-@@ -59,7 +59,7 @@
-                                    <1 27>;
-                       #dma-cells = <1>;
--                      brcm,dma-channel-mask = <0x0f35>;
-+                      brcm,dma-channel-mask = <0x0f34>;
-               };
-               intc: interrupt-controller@7e00b200 {
diff --git a/target/linux/brcm2708/patches-4.4/0403-ARM-bcm2835-add-interrupt-names-and-apply-correct-ma.patch b/target/linux/brcm2708/patches-4.4/0403-ARM-bcm2835-add-interrupt-names-and-apply-correct-ma.patch
new file mode 100644 (file)
index 0000000..eb5a6cd
--- /dev/null
@@ -0,0 +1,50 @@
+From c4eb741282cc9300119adaa4d6d3a278b9cd5f15 Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Sat, 23 Apr 2016 14:07:03 +0000
+Subject: [PATCH] ARM: bcm2835: add interrupt-names and apply correct mapping
+
+Add interrupt-names properties to dt and apply the correct
+mapping between irq and dma channels.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 26 ++++++++++++++++++++++++--
+ 1 file changed, 24 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -56,10 +56,32 @@
+                                    <1 24>,
+                                    <1 25>,
+                                    <1 26>,
+-                                   <1 27>;
++                                   /* dma channel 11-14 share one irq */
++                                   <1 27>,
++                                   <1 27>,
++                                   <1 27>,
++                                   <1 27>,
++                                   /* unused shared irq for all channels */
++                                   <1 28>;
++                      interrupt-names = "dma0",
++                                        "dma1",
++                                        "dma2",
++                                        "dma3",
++                                        "dma4",
++                                        "dma5",
++                                        "dma6",
++                                        "dma7",
++                                        "dma8",
++                                        "dma9",
++                                        "dma10",
++                                        "dma11",
++                                        "dma12",
++                                        "dma13",
++                                        "dma14",
++                                        "dma-shared-all";
+                       #dma-cells = <1>;
+-                      brcm,dma-channel-mask = <0x0f34>;
++                      brcm,dma-channel-mask = <0x7f34>;
+               };
+               intc: interrupt-controller@7e00b200 {
diff --git a/target/linux/brcm2708/patches-4.4/0404-ARM-bcm2835-add-interrupt-names-and-apply-correct-ma.patch b/target/linux/brcm2708/patches-4.4/0404-ARM-bcm2835-add-interrupt-names-and-apply-correct-ma.patch
deleted file mode 100644 (file)
index 0710286..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-From b11585bc1bd969c750b3f02fd15a584b463602f8 Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Sat, 23 Apr 2016 14:07:03 +0000
-Subject: [PATCH 404/423] ARM: bcm2835: add interrupt-names and apply correct
- mapping
-
-Add interrupt-names properties to dt and apply the correct
-mapping between irq and dma channels.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
----
- arch/arm/boot/dts/bcm2708_common.dtsi | 26 ++++++++++++++++++++++++--
- 1 file changed, 24 insertions(+), 2 deletions(-)
-
---- a/arch/arm/boot/dts/bcm2708_common.dtsi
-+++ b/arch/arm/boot/dts/bcm2708_common.dtsi
-@@ -56,10 +56,32 @@
-                                    <1 24>,
-                                    <1 25>,
-                                    <1 26>,
--                                   <1 27>;
-+                                   /* dma channel 11-14 share one irq */
-+                                   <1 27>,
-+                                   <1 27>,
-+                                   <1 27>,
-+                                   <1 27>,
-+                                   /* unused shared irq for all channels */
-+                                   <1 28>;
-+                      interrupt-names = "dma0",
-+                                        "dma1",
-+                                        "dma2",
-+                                        "dma3",
-+                                        "dma4",
-+                                        "dma5",
-+                                        "dma6",
-+                                        "dma7",
-+                                        "dma8",
-+                                        "dma9",
-+                                        "dma10",
-+                                        "dma11",
-+                                        "dma12",
-+                                        "dma13",
-+                                        "dma14",
-+                                        "dma-shared-all";
-                       #dma-cells = <1>;
--                      brcm,dma-channel-mask = <0x0f34>;
-+                      brcm,dma-channel-mask = <0x7f34>;
-               };
-               intc: interrupt-controller@7e00b200 {
diff --git a/target/linux/brcm2708/patches-4.4/0404-ARM-bcm2835-make-dma-channel-0-available-for-kms-set.patch b/target/linux/brcm2708/patches-4.4/0404-ARM-bcm2835-make-dma-channel-0-available-for-kms-set.patch
new file mode 100644 (file)
index 0000000..d00a19b
--- /dev/null
@@ -0,0 +1,28 @@
+From 0cbf2a548657ddbeb0b7b7d144cc4f46f477b2fc Mon Sep 17 00:00:00 2001
+From: Martin Sperl <kernel@martin.sperl.org>
+Date: Sat, 23 Apr 2016 14:20:41 +0000
+Subject: [PATCH] ARM: bcm2835: make dma-channel-0 available for kms setups
+
+Enable the use of dma-channel 0 when using the vc4-kms-v3d overlay.
+
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+---
+ arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
++++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
+@@ -119,6 +119,13 @@
+               };
+       };
++      fragment@15 {
++              target-path = "/soc/dma";
++              __overlay__ {
++                      brcm,dma-channel-mask = <0x7f35>;
++              };
++      };
++
+       __overrides__ {
+               cma-256 = <0>,"+0-1-2-3-4";
+               cma-192 = <0>,"-0+1-2-3-4";
diff --git a/target/linux/brcm2708/patches-4.4/0405-ARM-bcm2835-make-dma-channel-0-available-for-kms-set.patch b/target/linux/brcm2708/patches-4.4/0405-ARM-bcm2835-make-dma-channel-0-available-for-kms-set.patch
deleted file mode 100644 (file)
index 94d559c..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 2ebd83e6f79690289068f691c2ad67db4e40deca Mon Sep 17 00:00:00 2001
-From: Martin Sperl <kernel@martin.sperl.org>
-Date: Sat, 23 Apr 2016 14:20:41 +0000
-Subject: [PATCH 405/423] ARM: bcm2835: make dma-channel-0 available for kms
- setups
-
-Enable the use of dma-channel 0 when using the vc4-kms-v3d overlay.
-
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
----
- arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
-@@ -119,6 +119,13 @@
-               };
-       };
-+      fragment@15 {
-+              target-path = "/soc/dma";
-+              __overlay__ {
-+                      brcm,dma-channel-mask = <0x7f35>;
-+              };
-+      };
-+
-       __overrides__ {
-               cma-256 = <0>,"+0-1-2-3-4";
-               cma-192 = <0>,"-0+1-2-3-4";
diff --git a/target/linux/brcm2708/patches-4.4/0405-dmaengine-bcm2835-Fix-cyclic-DMA-period-splitting.patch b/target/linux/brcm2708/patches-4.4/0405-dmaengine-bcm2835-Fix-cyclic-DMA-period-splitting.patch
new file mode 100644 (file)
index 0000000..e76c99b
--- /dev/null
@@ -0,0 +1,38 @@
+From aaf4cb4fda9ed5c19f0db02023c5c11f51a23aaf Mon Sep 17 00:00:00 2001
+From: Matthias Reichl <hias@horus.com>
+Date: Tue, 7 Jun 2016 19:37:10 +0200
+Subject: [PATCH] dmaengine: bcm2835: Fix cyclic DMA period splitting
+
+The code responsible for splitting periods into chunks that
+can be handled by the DMA controller missed to update total_len,
+the number of bytes processed in the current period, when there
+are more chunks to follow.
+
+Therefore total_len was stuck at 0 and the code didn't work at all.
+This resulted in a wrong control block layout and audio issues because
+the cyclic DMA callback wasn't executing on period boundaries.
+
+Fix this by adding the missing total_len update.
+
+Signed-off-by: Matthias Reichl <hias@horus.com>
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Tested-by: Clive Messer <clive.messer@digitaldreamtime.co.uk>
+---
+ drivers/dma/bcm2835-dma.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -252,8 +252,11 @@ static void bcm2835_dma_create_cb_set_le
+        */
+       /* have we filled in period_length yet? */
+-      if (*total_len + control_block->length < period_len)
++      if (*total_len + control_block->length < period_len) {
++              /* update number of bytes in this period so far */
++              *total_len += control_block->length;
+               return;
++      }
+       /* calculate the length that remains to reach period_length */
+       control_block->length = period_len - *total_len;
diff --git a/target/linux/brcm2708/patches-4.4/0406-dmaengine-bcm2835-Avoid-splitting-periods-into-very-.patch b/target/linux/brcm2708/patches-4.4/0406-dmaengine-bcm2835-Avoid-splitting-periods-into-very-.patch
new file mode 100644 (file)
index 0000000..265ee10
--- /dev/null
@@ -0,0 +1,56 @@
+From 47b93cc5b706cb592f924199f00d5adbb66bd3ca Mon Sep 17 00:00:00 2001
+From: Matthias Reichl <hias@horus.com>
+Date: Wed, 8 Jun 2016 13:09:56 +0200
+Subject: [PATCH] dmaengine: bcm2835: Avoid splitting periods into very small
+ chunks
+
+The current cyclic DMA period splitting implementation can generate
+very small chunks at the end of each period. For example a 65536 byte
+period will be split into a 65532 byte chunk and a 4 byte chunk on
+the "lite" DMA channels.
+
+This increases pressure on the RAM controller as the DMA controller
+needs to fetch two control blocks from RAM in quick succession and
+could potentially cause latency issues if the RAM is tied up by other
+devices.
+
+We can easily avoid these situations by distributing the remaining
+length evenly between the last-but-one and the last chunk, making
+sure that split chunks will be at least half the maximum length the
+DMA controller can handle.
+
+This patch checks if the last chunk would be less than half of
+the maximum DMA length and if yes distributes the max len+4...max_len*1.5
+bytes evenly between the last 2 chunks. This results in chunk sizes
+between max_len/2 and max_len*0.75 bytes.
+
+Signed-off-by: Matthias Reichl <hias@horus.com>
+Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
+Tested-by: Clive Messer <clive.messer@digitaldreamtime.co.uk>
+---
+ drivers/dma/bcm2835-dma.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -253,6 +253,20 @@ static void bcm2835_dma_create_cb_set_le
+       /* have we filled in period_length yet? */
+       if (*total_len + control_block->length < period_len) {
++              /*
++               * If the next control block is the last in the period
++               * and it's length would be less than half of max_len
++               * change it so that both control blocks are (almost)
++               * equally long. This avoids generating very short
++               * control blocks (worst case would be 4 bytes) which
++               * might be problematic. We also have to make sure the
++               * new length is a multiple of 4 bytes.
++               */
++              if (*total_len + control_block->length + max_len / 2 >
++                  period_len) {
++                      control_block->length =
++                              DIV_ROUND_UP(period_len - *total_len, 8) * 4;
++              }
+               /* update number of bytes in this period so far */
+               *total_len += control_block->length;
+               return;
diff --git a/target/linux/brcm2708/patches-4.4/0406-dmaengine-bcm2835-Fix-cyclic-DMA-period-splitting.patch b/target/linux/brcm2708/patches-4.4/0406-dmaengine-bcm2835-Fix-cyclic-DMA-period-splitting.patch
deleted file mode 100644 (file)
index 56cceb0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-From 74d0d3161d711b51be692cf1750b6eb60719f782 Mon Sep 17 00:00:00 2001
-From: Matthias Reichl <hias@horus.com>
-Date: Tue, 7 Jun 2016 19:37:10 +0200
-Subject: [PATCH 406/423] dmaengine: bcm2835: Fix cyclic DMA period splitting
-
-The code responsible for splitting periods into chunks that
-can be handled by the DMA controller missed to update total_len,
-the number of bytes processed in the current period, when there
-are more chunks to follow.
-
-Therefore total_len was stuck at 0 and the code didn't work at all.
-This resulted in a wrong control block layout and audio issues because
-the cyclic DMA callback wasn't executing on period boundaries.
-
-Fix this by adding the missing total_len update.
-
-Signed-off-by: Matthias Reichl <hias@horus.com>
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Tested-by: Clive Messer <clive.messer@digitaldreamtime.co.uk>
----
- drivers/dma/bcm2835-dma.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -252,8 +252,11 @@ static void bcm2835_dma_create_cb_set_le
-        */
-       /* have we filled in period_length yet? */
--      if (*total_len + control_block->length < period_len)
-+      if (*total_len + control_block->length < period_len) {
-+              /* update number of bytes in this period so far */
-+              *total_len += control_block->length;
-               return;
-+      }
-       /* calculate the length that remains to reach period_length */
-       control_block->length = period_len - *total_len;
diff --git a/target/linux/brcm2708/patches-4.4/0407-dmaengine-bcm2835-Avoid-splitting-periods-into-very-.patch b/target/linux/brcm2708/patches-4.4/0407-dmaengine-bcm2835-Avoid-splitting-periods-into-very-.patch
deleted file mode 100644 (file)
index 2e827e2..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-From 6bcfb541bbf5398f91d426c9e6c0e3817d18bb8e Mon Sep 17 00:00:00 2001
-From: Matthias Reichl <hias@horus.com>
-Date: Wed, 8 Jun 2016 13:09:56 +0200
-Subject: [PATCH 407/423] dmaengine: bcm2835: Avoid splitting periods into very
- small chunks
-
-The current cyclic DMA period splitting implementation can generate
-very small chunks at the end of each period. For example a 65536 byte
-period will be split into a 65532 byte chunk and a 4 byte chunk on
-the "lite" DMA channels.
-
-This increases pressure on the RAM controller as the DMA controller
-needs to fetch two control blocks from RAM in quick succession and
-could potentially cause latency issues if the RAM is tied up by other
-devices.
-
-We can easily avoid these situations by distributing the remaining
-length evenly between the last-but-one and the last chunk, making
-sure that split chunks will be at least half the maximum length the
-DMA controller can handle.
-
-This patch checks if the last chunk would be less than half of
-the maximum DMA length and if yes distributes the max len+4...max_len*1.5
-bytes evenly between the last 2 chunks. This results in chunk sizes
-between max_len/2 and max_len*0.75 bytes.
-
-Signed-off-by: Matthias Reichl <hias@horus.com>
-Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
-Tested-by: Clive Messer <clive.messer@digitaldreamtime.co.uk>
----
- drivers/dma/bcm2835-dma.c | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -253,6 +253,20 @@ static void bcm2835_dma_create_cb_set_le
-       /* have we filled in period_length yet? */
-       if (*total_len + control_block->length < period_len) {
-+              /*
-+               * If the next control block is the last in the period
-+               * and it's length would be less than half of max_len
-+               * change it so that both control blocks are (almost)
-+               * equally long. This avoids generating very short
-+               * control blocks (worst case would be 4 bytes) which
-+               * might be problematic. We also have to make sure the
-+               * new length is a multiple of 4 bytes.
-+               */
-+              if (*total_len + control_block->length + max_len / 2 >
-+                  period_len) {
-+                      control_block->length =
-+                              DIV_ROUND_UP(period_len - *total_len, 8) * 4;
-+              }
-               /* update number of bytes in this period so far */
-               *total_len += control_block->length;
-               return;
diff --git a/target/linux/brcm2708/patches-4.4/0407-dmaengine-bcm2835-Fix-polling-for-completion-of-DMA-.patch b/target/linux/brcm2708/patches-4.4/0407-dmaengine-bcm2835-Fix-polling-for-completion-of-DMA-.patch
new file mode 100644 (file)
index 0000000..7ff0ab1
--- /dev/null
@@ -0,0 +1,68 @@
+From 3288dc56cae869c8c49202f36669ea64d568407f Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 3 Jun 2016 19:29:11 -0700
+Subject: [PATCH] dmaengine: bcm2835: Fix polling for completion of DMA with
+ interrupts masked.
+
+The tx_status hook is supposed to be safe to call from interrupt
+context, but it wouldn't ever return completion for the last transfer,
+meaning you couldn't poll for DMA completion with interrupts masked.
+
+This fixes IRQ handling for bcm2835's DSI1, which requires using the
+DMA engine to write its registers due to a bug in the AXI bridge.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/dma/bcm2835-dma.c | 24 +++++++++++++++++++-----
+ 1 file changed, 19 insertions(+), 5 deletions(-)
+
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -588,16 +588,16 @@ static enum dma_status bcm2835_dma_tx_st
+       struct virt_dma_desc *vd;
+       enum dma_status ret;
+       unsigned long flags;
++      u32 residue;
+       ret = dma_cookie_status(chan, cookie, txstate);
+-      if (ret == DMA_COMPLETE || !txstate)
++      if (ret == DMA_COMPLETE)
+               return ret;
+       spin_lock_irqsave(&c->vc.lock, flags);
+       vd = vchan_find_desc(&c->vc, cookie);
+       if (vd) {
+-              txstate->residue =
+-                      bcm2835_dma_desc_size(to_bcm2835_dma_desc(&vd->tx));
++              residue = bcm2835_dma_desc_size(to_bcm2835_dma_desc(&vd->tx));
+       } else if (c->desc && c->desc->vd.tx.cookie == cookie) {
+               struct bcm2835_desc *d = c->desc;
+               dma_addr_t pos;
+@@ -609,11 +609,25 @@ static enum dma_status bcm2835_dma_tx_st
+               else
+                       pos = 0;
+-              txstate->residue = bcm2835_dma_desc_size_pos(d, pos);
++              residue = bcm2835_dma_desc_size_pos(d, pos);
++
++              /*
++               * If our non-cyclic transfer is done, then report
++               * complete and trigger the next tx now.  This lets
++               * the dmaengine API be used synchronously from an IRQ
++               * handler.
++               */
++              if (!d->cyclic && residue == 0) {
++                      vchan_cookie_complete(&c->desc->vd);
++                      bcm2835_dma_start_desc(c);
++                      ret = dma_cookie_status(chan, cookie, txstate);
++              }
+       } else {
+-              txstate->residue = 0;
++              residue = 0;
+       }
++      dma_set_residue(txstate, residue);
++
+       spin_unlock_irqrestore(&c->vc.lock, flags);
+       return ret;
diff --git a/target/linux/brcm2708/patches-4.4/0408-dmaengine-bcm2835-Fix-polling-for-completion-of-DMA-.patch b/target/linux/brcm2708/patches-4.4/0408-dmaengine-bcm2835-Fix-polling-for-completion-of-DMA-.patch
deleted file mode 100644 (file)
index 7229a5c..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-From 467c8219ee56e75ab53f29b569f9fb5d033f57d4 Mon Sep 17 00:00:00 2001
-From: Eric Anholt <eric@anholt.net>
-Date: Fri, 3 Jun 2016 19:29:11 -0700
-Subject: [PATCH 408/423] dmaengine: bcm2835: Fix polling for completion of DMA
- with interrupts masked.
-
-The tx_status hook is supposed to be safe to call from interrupt
-context, but it wouldn't ever return completion for the last transfer,
-meaning you couldn't poll for DMA completion with interrupts masked.
-
-This fixes IRQ handling for bcm2835's DSI1, which requires using the
-DMA engine to write its registers due to a bug in the AXI bridge.
-
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
- drivers/dma/bcm2835-dma.c | 24 +++++++++++++++++++-----
- 1 file changed, 19 insertions(+), 5 deletions(-)
-
---- a/drivers/dma/bcm2835-dma.c
-+++ b/drivers/dma/bcm2835-dma.c
-@@ -588,16 +588,16 @@ static enum dma_status bcm2835_dma_tx_st
-       struct virt_dma_desc *vd;
-       enum dma_status ret;
-       unsigned long flags;
-+      u32 residue;
-       ret = dma_cookie_status(chan, cookie, txstate);
--      if (ret == DMA_COMPLETE || !txstate)
-+      if (ret == DMA_COMPLETE)
-               return ret;
-       spin_lock_irqsave(&c->vc.lock, flags);
-       vd = vchan_find_desc(&c->vc, cookie);
-       if (vd) {
--              txstate->residue =
--                      bcm2835_dma_desc_size(to_bcm2835_dma_desc(&vd->tx));
-+              residue = bcm2835_dma_desc_size(to_bcm2835_dma_desc(&vd->tx));
-       } else if (c->desc && c->desc->vd.tx.cookie == cookie) {
-               struct bcm2835_desc *d = c->desc;
-               dma_addr_t pos;
-@@ -609,11 +609,25 @@ static enum dma_status bcm2835_dma_tx_st
-               else
-                       pos = 0;
--              txstate->residue = bcm2835_dma_desc_size_pos(d, pos);
-+              residue = bcm2835_dma_desc_size_pos(d, pos);
-+
-+              /*
-+               * If our non-cyclic transfer is done, then report
-+               * complete and trigger the next tx now.  This lets
-+               * the dmaengine API be used synchronously from an IRQ
-+               * handler.
-+               */
-+              if (!d->cyclic && residue == 0) {
-+                      vchan_cookie_complete(&c->desc->vd);
-+                      bcm2835_dma_start_desc(c);
-+                      ret = dma_cookie_status(chan, cookie, txstate);
-+              }
-       } else {
--              txstate->residue = 0;
-+              residue = 0;
-       }
-+      dma_set_residue(txstate, residue);
-+
-       spin_unlock_irqrestore(&c->vc.lock, flags);
-       return ret;
diff --git a/target/linux/brcm2708/patches-4.4/0409-BCM270X_DT-Add-spi-rtc-overlay-on-SPI0.0.patch b/target/linux/brcm2708/patches-4.4/0409-BCM270X_DT-Add-spi-rtc-overlay-on-SPI0.0.patch
new file mode 100644 (file)
index 0000000..b4ca047
--- /dev/null
@@ -0,0 +1,76 @@
+From a008938ed54a702e72a8421776c1d3f97b79a97b Mon Sep 17 00:00:00 2001
+From: Thomas Kriechbaumer <thomas@kriechbaumer.name>
+Date: Fri, 3 Jun 2016 09:40:44 +0200
+Subject: [PATCH] BCM270X_DT: Add spi-rtc overlay on SPI0.0
+
+Initial version only supports PCF2123 RTC.
+
+See: https://github.com/raspberrypi/linux/pull/1510
+---
+ arch/arm/boot/dts/overlays/Makefile            |  1 +
+ arch/arm/boot/dts/overlays/README              |  6 +++++
+ arch/arm/boot/dts/overlays/spi-rtc-overlay.dts | 33 ++++++++++++++++++++++++++
+ 3 files changed, 40 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/spi-rtc-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -78,6 +78,7 @@ dtbo-$(RPI_DT_OVERLAYS) += smi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += smi-dev.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += smi-nand.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi-gpio35-39.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi-rtc.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi1-1cs.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi1-2cs.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi1-3cs.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -975,6 +975,12 @@ Load:   dtoverlay=spi-gpio35-39
+ Params: <None>
++Name:   spi-rtc
++Info:   Adds support for a number of SPI Real Time Clock devices
++Load:   dtoverlay=spi-rtc,<param>=<val>
++Params: pcf2123                 Select the PCF2123 device
++
++
+ Name:   spi1-1cs
+ Info:   Enables spi1 with a single chip select (CS) line and associated spidev
+         dev node. The gpio pin number for the CS line and spidev device node
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/spi-rtc-overlay.dts
+@@ -0,0 +1,33 @@
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&spidev0>;
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      fragment@1 {
++              target = <&spi0>;
++              __dormant__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      rtc-pcf2123@0 {
++                              compatible = "nxp,rtc-pcf2123";
++                              spi-max-frequency = <5000000>;
++                              spi-cs-high = <1>;
++                              reg = <0>;
++                      };
++              };
++      };
++
++      __overrides__ {
++              pcf2123 = <0>, "=0=1";
++      };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0410-BCM270X_DT-Add-spi-rtc-overlay-on-SPI0.0.patch b/target/linux/brcm2708/patches-4.4/0410-BCM270X_DT-Add-spi-rtc-overlay-on-SPI0.0.patch
deleted file mode 100644 (file)
index 2358797..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-From ae24592f7b8e0af654a25d18a8d26cd0e5799fdb Mon Sep 17 00:00:00 2001
-From: Thomas Kriechbaumer <thomas@kriechbaumer.name>
-Date: Fri, 3 Jun 2016 09:40:44 +0200
-Subject: [PATCH 410/423] BCM270X_DT: Add spi-rtc overlay on SPI0.0
-
-Initial version only supports PCF2123 RTC.
-
-See: https://github.com/raspberrypi/linux/pull/1510
----
- arch/arm/boot/dts/overlays/Makefile            |  1 +
- arch/arm/boot/dts/overlays/README              |  6 +++++
- arch/arm/boot/dts/overlays/spi-rtc-overlay.dts | 33 ++++++++++++++++++++++++++
- 3 files changed, 40 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/spi-rtc-overlay.dts
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -78,6 +78,7 @@ dtbo-$(RPI_DT_OVERLAYS) += smi.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += smi-dev.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += smi-nand.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi-gpio35-39.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += spi-rtc.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi1-1cs.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi1-2cs.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi1-3cs.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -975,6 +975,12 @@ Load:   dtoverlay=spi-gpio35-39
- Params: <None>
-+Name:   spi-rtc
-+Info:   Adds support for a number of SPI Real Time Clock devices
-+Load:   dtoverlay=spi-rtc,<param>=<val>
-+Params: pcf2123                 Select the PCF2123 device
-+
-+
- Name:   spi1-1cs
- Info:   Enables spi1 with a single chip select (CS) line and associated spidev
-         dev node. The gpio pin number for the CS line and spidev device node
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/spi-rtc-overlay.dts
-@@ -0,0 +1,33 @@
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&spidev0>;
-+              __dormant__ {
-+                      status = "disabled";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&spi0>;
-+              __dormant__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      rtc-pcf2123@0 {
-+                              compatible = "nxp,rtc-pcf2123";
-+                              spi-max-frequency = <5000000>;
-+                              spi-cs-high = <1>;
-+                              reg = <0>;
-+                      };
-+              };
-+      };
-+
-+      __overrides__ {
-+              pcf2123 = <0>, "=0=1";
-+      };
-+};
diff --git a/target/linux/brcm2708/patches-4.4/0410-rtc-Add-SPI-alias-for-pcf2123-driver.patch b/target/linux/brcm2708/patches-4.4/0410-rtc-Add-SPI-alias-for-pcf2123-driver.patch
new file mode 100644 (file)
index 0000000..574f3de
--- /dev/null
@@ -0,0 +1,20 @@
+From 2fbf5d24ff1f88d0aa977089549056cf4863f0de Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 15 Jun 2016 16:48:41 +0100
+Subject: [PATCH] rtc: Add SPI alias for pcf2123 driver
+
+Without this alias, Device Tree won't cause the driver
+to be loaded.
+
+See: https://github.com/raspberrypi/linux/pull/1510
+---
+ drivers/rtc/rtc-pcf2123.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/rtc/rtc-pcf2123.c
++++ b/drivers/rtc/rtc-pcf2123.c
+@@ -358,3 +358,4 @@ MODULE_AUTHOR("Chris Verges <chrisv@cybe
+ MODULE_DESCRIPTION("NXP PCF2123 RTC driver");
+ MODULE_LICENSE("GPL");
+ MODULE_VERSION(DRV_VERSION);
++MODULE_ALIAS("spi:rtc-pcf2123");
diff --git a/target/linux/brcm2708/patches-4.4/0411-Added-support-for-headphones-microphone-and-bclk_rat.patch b/target/linux/brcm2708/patches-4.4/0411-Added-support-for-headphones-microphone-and-bclk_rat.patch
new file mode 100644 (file)
index 0000000..fb6661c
--- /dev/null
@@ -0,0 +1,119 @@
+From 84b2845509748519f239b8212bdc672b84755cd0 Mon Sep 17 00:00:00 2001
+From: Matt Flax <flatmax@flatmax.org>
+Date: Fri, 17 Jun 2016 12:03:39 +1000
+Subject: [PATCH] Added support for headphones, microphone and bclk_ratio
+ settings.
+
+This patch adds headphone and microphone capability to the Audio Injector sound card. The patch also sets the bit clock ratio for use in the bcm2835-i2s driver. The bcm2835-i2s can't handle an 8 kHz sample rate when the bit clock is at 12 MHz because its register is only 10 bits wide which can't represent the ch2 offset of 1508. For that reason, the rate constraint is added.
+---
+ sound/soc/bcm/audioinjector-pi-soundcard.c | 67 ++++++++++++++++++++++++++----
+ 1 file changed, 58 insertions(+), 9 deletions(-)
+
+--- a/sound/soc/bcm/audioinjector-pi-soundcard.c
++++ b/sound/soc/bcm/audioinjector-pi-soundcard.c
+@@ -29,16 +29,56 @@
+ #include "../codecs/wm8731.h"
+-static int audioinjector_pi_soundcard_dai_init(struct snd_soc_pcm_runtime *rtd)
++static const unsigned int bcm2835_rates_12000000[] = {
++      32000, 44100, 48000, 96000, 88200,
++};
++
++static struct snd_pcm_hw_constraint_list bcm2835_constraints_12000000 = {
++      .list = bcm2835_rates_12000000,
++      .count = ARRAY_SIZE(bcm2835_rates_12000000),
++};
++
++static int snd_audioinjector_pi_soundcard_startup(struct snd_pcm_substream *substream)
+ {
+-      struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
++      /* Setup constraints, because there is a 12 MHz XTAL on the board */
++      snd_pcm_hw_constraint_list(substream->runtime, 0,
++                              SNDRV_PCM_HW_PARAM_RATE,
++                              &bcm2835_constraints_12000000);
++      return 0;
++}
+-      // not connected
+-      snd_soc_dapm_nc_pin(dapm, "Mic Bias");
+-      snd_soc_dapm_nc_pin(dapm, "MICIN");
+-      snd_soc_dapm_nc_pin(dapm, "RHPOUT");
+-      snd_soc_dapm_nc_pin(dapm, "LHPOUT");
++static int snd_audioinjector_pi_soundcard_hw_params(struct snd_pcm_substream *substream,
++                                     struct snd_pcm_hw_params *params)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
++      switch (params_rate(params)){
++              case 8000:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 1508);
++              case 32000:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 378);
++              case 44100:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 274);
++              case 48000:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 252);
++              case 88200:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 136);
++              case 96000:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 126);
++              default:
++                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 126);
++      }
++}
++
++/* machine stream operations */
++static struct snd_soc_ops snd_audioinjector_pi_soundcard_ops = {
++      .startup = snd_audioinjector_pi_soundcard_startup,
++      .hw_params = snd_audioinjector_pi_soundcard_hw_params,
++};
++
++static int audioinjector_pi_soundcard_dai_init(struct snd_soc_pcm_runtime *rtd)
++{
+       return snd_soc_dai_set_sysclk(rtd->codec_dai, WM8731_SYSCLK_XTAL, 12000000, SND_SOC_CLOCK_IN);
+ }
+@@ -50,30 +90,39 @@ static struct snd_soc_dai_link audioinje
+               .codec_dai_name = "wm8731-hifi",
+               .platform_name  = "bcm2835-i2s.0",
+               .codec_name = "wm8731.1-001a",
++              .ops = &snd_audioinjector_pi_soundcard_ops,
+               .init = audioinjector_pi_soundcard_dai_init,
+               .dai_fmt = SND_SOC_DAIFMT_CBM_CFM|SND_SOC_DAIFMT_I2S|SND_SOC_DAIFMT_NB_NF,
+       },
+ };
+ static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
++      SND_SOC_DAPM_HP("Headphone Jack", NULL),
+       SND_SOC_DAPM_SPK("Ext Spk", NULL),
+       SND_SOC_DAPM_LINE("Line In Jacks", NULL),
++      SND_SOC_DAPM_MIC("Microphone", NULL),
+ };
+-/* Corgi machine connections to the codec pins */
+ static const struct snd_soc_dapm_route audioinjector_audio_map[] = {
++      /* headphone connected to LHPOUT, RHPOUT */
++      {"Headphone Jack", NULL, "LHPOUT"},
++      {"Headphone Jack", NULL, "RHPOUT"},
++
+       /* speaker connected to LOUT, ROUT */
+       {"Ext Spk", NULL, "ROUT"},
+       {"Ext Spk", NULL, "LOUT"},
+       /* line inputs */
+       {"Line In Jacks", NULL, "Line Input"},
++
++      /* mic is connected to Mic Jack, with WM8731 Mic Bias */
++      {"Microphone", NULL, "Mic Bias"},
+ };
+ static struct snd_soc_card snd_soc_audioinjector = {
+       .name = "audioinjector-pi-soundcard",
+       .dai_link = audioinjector_pi_soundcard_dai,
+-      .num_links = 1,
++      .num_links = ARRAY_SIZE(audioinjector_pi_soundcard_dai),
+       .dapm_widgets = wm8731_dapm_widgets,
+       .num_dapm_widgets = ARRAY_SIZE(wm8731_dapm_widgets),
diff --git a/target/linux/brcm2708/patches-4.4/0411-rtc-Add-SPI-alias-for-pcf2123-driver.patch b/target/linux/brcm2708/patches-4.4/0411-rtc-Add-SPI-alias-for-pcf2123-driver.patch
deleted file mode 100644 (file)
index c5dda32..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-From 2306db770d37cfaa8fe2805febe84a504709fac8 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 15 Jun 2016 16:48:41 +0100
-Subject: [PATCH 411/423] rtc: Add SPI alias for pcf2123 driver
-
-Without this alias, Device Tree won't cause the driver
-to be loaded.
-
-See: https://github.com/raspberrypi/linux/pull/1510
----
- drivers/rtc/rtc-pcf2123.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/rtc/rtc-pcf2123.c
-+++ b/drivers/rtc/rtc-pcf2123.c
-@@ -358,3 +358,4 @@ MODULE_AUTHOR("Chris Verges <chrisv@cybe
- MODULE_DESCRIPTION("NXP PCF2123 RTC driver");
- MODULE_LICENSE("GPL");
- MODULE_VERSION(DRV_VERSION);
-+MODULE_ALIAS("spi:rtc-pcf2123");
diff --git a/target/linux/brcm2708/patches-4.4/0412-Added-support-for-headphones-microphone-and-bclk_rat.patch b/target/linux/brcm2708/patches-4.4/0412-Added-support-for-headphones-microphone-and-bclk_rat.patch
deleted file mode 100644 (file)
index 8f4e61e..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-From 5f16fa4548512193704eb5480bf93f6badc803bd Mon Sep 17 00:00:00 2001
-From: Matt Flax <flatmax@flatmax.org>
-Date: Fri, 17 Jun 2016 12:03:39 +1000
-Subject: [PATCH 412/423] Added support for headphones, microphone and
- bclk_ratio settings.
-
-This patch adds headphone and microphone capability to the Audio Injector sound card. The patch also sets the bit clock ratio for use in the bcm2835-i2s driver. The bcm2835-i2s can't handle an 8 kHz sample rate when the bit clock is at 12 MHz because its register is only 10 bits wide which can't represent the ch2 offset of 1508. For that reason, the rate constraint is added.
----
- sound/soc/bcm/audioinjector-pi-soundcard.c | 67 ++++++++++++++++++++++++++----
- 1 file changed, 58 insertions(+), 9 deletions(-)
-
---- a/sound/soc/bcm/audioinjector-pi-soundcard.c
-+++ b/sound/soc/bcm/audioinjector-pi-soundcard.c
-@@ -29,16 +29,56 @@
- #include "../codecs/wm8731.h"
--static int audioinjector_pi_soundcard_dai_init(struct snd_soc_pcm_runtime *rtd)
-+static const unsigned int bcm2835_rates_12000000[] = {
-+      32000, 44100, 48000, 96000, 88200,
-+};
-+
-+static struct snd_pcm_hw_constraint_list bcm2835_constraints_12000000 = {
-+      .list = bcm2835_rates_12000000,
-+      .count = ARRAY_SIZE(bcm2835_rates_12000000),
-+};
-+
-+static int snd_audioinjector_pi_soundcard_startup(struct snd_pcm_substream *substream)
- {
--      struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
-+      /* Setup constraints, because there is a 12 MHz XTAL on the board */
-+      snd_pcm_hw_constraint_list(substream->runtime, 0,
-+                              SNDRV_PCM_HW_PARAM_RATE,
-+                              &bcm2835_constraints_12000000);
-+      return 0;
-+}
--      // not connected
--      snd_soc_dapm_nc_pin(dapm, "Mic Bias");
--      snd_soc_dapm_nc_pin(dapm, "MICIN");
--      snd_soc_dapm_nc_pin(dapm, "RHPOUT");
--      snd_soc_dapm_nc_pin(dapm, "LHPOUT");
-+static int snd_audioinjector_pi_soundcard_hw_params(struct snd_pcm_substream *substream,
-+                                     struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-+      switch (params_rate(params)){
-+              case 8000:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 1508);
-+              case 32000:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 378);
-+              case 44100:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 274);
-+              case 48000:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 252);
-+              case 88200:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 136);
-+              case 96000:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 126);
-+              default:
-+                      return snd_soc_dai_set_bclk_ratio(cpu_dai, 126);
-+      }
-+}
-+
-+/* machine stream operations */
-+static struct snd_soc_ops snd_audioinjector_pi_soundcard_ops = {
-+      .startup = snd_audioinjector_pi_soundcard_startup,
-+      .hw_params = snd_audioinjector_pi_soundcard_hw_params,
-+};
-+
-+static int audioinjector_pi_soundcard_dai_init(struct snd_soc_pcm_runtime *rtd)
-+{
-       return snd_soc_dai_set_sysclk(rtd->codec_dai, WM8731_SYSCLK_XTAL, 12000000, SND_SOC_CLOCK_IN);
- }
-@@ -50,30 +90,39 @@ static struct snd_soc_dai_link audioinje
-               .codec_dai_name = "wm8731-hifi",
-               .platform_name  = "bcm2835-i2s.0",
-               .codec_name = "wm8731.1-001a",
-+              .ops = &snd_audioinjector_pi_soundcard_ops,
-               .init = audioinjector_pi_soundcard_dai_init,
-               .dai_fmt = SND_SOC_DAIFMT_CBM_CFM|SND_SOC_DAIFMT_I2S|SND_SOC_DAIFMT_NB_NF,
-       },
- };
- static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
-+      SND_SOC_DAPM_HP("Headphone Jack", NULL),
-       SND_SOC_DAPM_SPK("Ext Spk", NULL),
-       SND_SOC_DAPM_LINE("Line In Jacks", NULL),
-+      SND_SOC_DAPM_MIC("Microphone", NULL),
- };
--/* Corgi machine connections to the codec pins */
- static const struct snd_soc_dapm_route audioinjector_audio_map[] = {
-+      /* headphone connected to LHPOUT, RHPOUT */
-+      {"Headphone Jack", NULL, "LHPOUT"},
-+      {"Headphone Jack", NULL, "RHPOUT"},
-+
-       /* speaker connected to LOUT, ROUT */
-       {"Ext Spk", NULL, "ROUT"},
-       {"Ext Spk", NULL, "LOUT"},
-       /* line inputs */
-       {"Line In Jacks", NULL, "Line Input"},
-+
-+      /* mic is connected to Mic Jack, with WM8731 Mic Bias */
-+      {"Microphone", NULL, "Mic Bias"},
- };
- static struct snd_soc_card snd_soc_audioinjector = {
-       .name = "audioinjector-pi-soundcard",
-       .dai_link = audioinjector_pi_soundcard_dai,
--      .num_links = 1,
-+      .num_links = ARRAY_SIZE(audioinjector_pi_soundcard_dai),
-       .dapm_widgets = wm8731_dapm_widgets,
-       .num_dapm_widgets = ARRAY_SIZE(wm8731_dapm_widgets),
diff --git a/target/linux/brcm2708/patches-4.4/0412-IQaudIO-auto-mute-for-AMP-and-DigiAMP.patch b/target/linux/brcm2708/patches-4.4/0412-IQaudIO-auto-mute-for-AMP-and-DigiAMP.patch
new file mode 100644 (file)
index 0000000..7636883
--- /dev/null
@@ -0,0 +1,272 @@
+From 98f0214603229df4038cc0d318111a37b10078a1 Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Mon, 9 May 2016 20:38:08 +0100
+Subject: [PATCH] IQaudIO: auto-mute for AMP+ and DigiAMP+
+
+IQAudIO amplifier mute via GPIO22. Add dt params for "one-shot" unmute
+and auto mute.
+
+Revision 2, auto mute implementing HiassofT suggestion to mute/unmute
+using set_bias_level, rather than startup/shutdown....
+"By default DAPM waits 5 seconds (pmdown_time) before shutting down
+playback streams so a close/stop immediately followed by open/start
+doesn't trigger an amp mute+unmute."
+
+Tested on both AMP+ (via DAC+) and DigiAMP+, with both options...
+
+dtoverlay=iqaudio-dacplus,unmute_amp
+ "one-shot" unmute when kernel module loads.
+
+dtoverlay=iqaudio-dacplus,auto_mute_amp
+ Unmute amp when ALSA device opened by a client. Mute, with 5 second delay
+ when ALSA device closed. (Re-opening the device within the 5 second close
+ window, will cancel mute.)
+
+Revision 4, using gpiod.
+
+Revision 5, clean-up formatting before adding mute code.
+ - Convert tab plus 4 space formatting to 2x tab
+ - Remove '// NOT USED' commented code
+
+Revision 6, don't attempt to "one-shot" unmute amp, unless card is
+successfully registered.
+
+Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+---
+ arch/arm/boot/dts/overlays/README                  |   4 +
+ .../boot/dts/overlays/iqaudio-dacplus-overlay.dts  |   7 +-
+ sound/soc/bcm/iqaudio-dac.c                        | 144 ++++++++++++++++-----
+ 3 files changed, 124 insertions(+), 31 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -540,6 +540,10 @@ Params: 24db_digital_gain       Allow ga
+                                 responsibility of the user to ensure that
+                                 the Digital volume control is set to a value
+                                 that does not result in clipping/distortion!)
++        auto_mute_amp           If specified, unmute/mute the IQaudIO amp when
++                                starting/stopping audio playback.
++        unmute_amp              If specified, unmute the IQaudIO amp once when
++                                the DAC driver module loads.
+ Name:   justboom-dac
+--- a/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts
++++ b/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts
+@@ -30,14 +30,17 @@
+       fragment@2 {
+               target = <&sound>;
+-              frag2: __overlay__ {
++              iqaudio_dac: __overlay__ {
+                       compatible = "iqaudio,iqaudio-dac";
+                       i2s-controller = <&i2s>;
++                      mute-gpios = <&gpio 22 0>;
+                       status = "okay";
+               };
+       };
+       __overrides__ {
+-              24db_digital_gain = <&frag2>,"iqaudio,24db_digital_gain?";
++              24db_digital_gain = <&iqaudio_dac>,"iqaudio,24db_digital_gain?";
++              auto_mute_amp = <&iqaudio_dac>,"iqaudio-dac,auto-mute-amp?";
++              unmute_amp = <&iqaudio_dac>,"iqaudio-dac,unmute-amp?";
+       };
+ };
+--- a/sound/soc/bcm/iqaudio-dac.c
++++ b/sound/soc/bcm/iqaudio-dac.c
+@@ -15,6 +15,7 @@
+  */
+ #include <linux/module.h>
++#include <linux/gpio/consumer.h>
+ #include <linux/platform_device.h>
+ #include <sound/core.h>
+@@ -25,6 +26,8 @@
+ static bool digital_gain_0db_limit = true;
++static struct gpio_desc *mute_gpio;
++
+ static int snd_rpi_iqaudio_dac_init(struct snd_soc_pcm_runtime *rtd)
+ {
+       if (digital_gain_0db_limit)
+@@ -41,11 +44,9 @@ static int snd_rpi_iqaudio_dac_init(stru
+ }
+ static int snd_rpi_iqaudio_dac_hw_params(struct snd_pcm_substream *substream,
+-                                     struct snd_pcm_hw_params *params)
++      struct snd_pcm_hw_params *params)
+ {
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+-// NOT USED   struct snd_soc_dai *codec_dai = rtd->codec_dai;
+-// NOT USED   struct snd_soc_codec *codec = rtd->codec;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       unsigned int sample_bits =
+@@ -54,6 +55,56 @@ static int snd_rpi_iqaudio_dac_hw_params
+       return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
+ }
++static void snd_rpi_iqaudio_gpio_mute(struct snd_soc_card *card)
++{
++      if (mute_gpio) {
++              dev_info(card->dev, "%s: muting amp using GPIO22\n",
++                       __func__);
++              gpiod_set_value_cansleep(mute_gpio, 0);
++      }
++}
++
++static void snd_rpi_iqaudio_gpio_unmute(struct snd_soc_card *card)
++{
++      if (mute_gpio) {
++              dev_info(card->dev, "%s: un-muting amp using GPIO22\n",
++                       __func__);
++              gpiod_set_value_cansleep(mute_gpio, 1);
++      }
++}
++
++static int snd_rpi_iqaudio_set_bias_level(struct snd_soc_card *card,
++      struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
++{
++      struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
++
++      if (dapm->dev != codec_dai->dev)
++              return 0;
++
++      switch (level) {
++      case SND_SOC_BIAS_PREPARE:
++              if (dapm->bias_level != SND_SOC_BIAS_STANDBY)
++                      break;
++
++              /* UNMUTE AMP */
++              snd_rpi_iqaudio_gpio_unmute(card);
++
++              break;
++      case SND_SOC_BIAS_STANDBY:
++              if (dapm->bias_level != SND_SOC_BIAS_PREPARE)
++                      break;
++
++              /* MUTE AMP */
++              snd_rpi_iqaudio_gpio_mute(card);
++
++              break;
++      default:
++              break;
++      }
++
++      return 0;
++}
++
+ /* machine stream operations */
+ static struct snd_soc_ops snd_rpi_iqaudio_dac_ops = {
+       .hw_params = snd_rpi_iqaudio_dac_hw_params,
+@@ -82,46 +133,81 @@ static struct snd_soc_card snd_rpi_iqaud
+ static int snd_rpi_iqaudio_dac_probe(struct platform_device *pdev)
+ {
+       int ret = 0;
++      bool gpio_unmute = false;
+       snd_rpi_iqaudio_dac.dev = &pdev->dev;
+       if (pdev->dev.of_node) {
+-          struct device_node *i2s_node;
+-          struct snd_soc_card *card = &snd_rpi_iqaudio_dac;
+-          struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
+-          i2s_node = of_parse_phandle(pdev->dev.of_node,
+-                                      "i2s-controller", 0);
+-
+-          if (i2s_node) {
+-              dai->cpu_dai_name = NULL;
+-              dai->cpu_of_node = i2s_node;
+-              dai->platform_name = NULL;
+-              dai->platform_of_node = i2s_node;
+-          }
+-
+-          digital_gain_0db_limit = !of_property_read_bool(pdev->dev.of_node,
+-                                      "iqaudio,24db_digital_gain");
+-          if (of_property_read_string(pdev->dev.of_node, "card_name",
+-                                      &card->name))
+-              card->name = "IQaudIODAC";
+-          if (of_property_read_string(pdev->dev.of_node, "dai_name",
+-                                      &dai->name))
+-              dai->name = "IQaudIO DAC";
+-          if (of_property_read_string(pdev->dev.of_node, "dai_stream_name",
+-                                      &dai->stream_name))
+-              dai->stream_name = "IQaudIO DAC HiFi";
++              struct device_node *i2s_node;
++              struct snd_soc_card *card = &snd_rpi_iqaudio_dac;
++              struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
++              bool auto_gpio_mute = false;
++
++              i2s_node = of_parse_phandle(pdev->dev.of_node,
++                                          "i2s-controller", 0);
++              if (i2s_node) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_node;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_node;
++              }
++
++              digital_gain_0db_limit = !of_property_read_bool(
++                      pdev->dev.of_node, "iqaudio,24db_digital_gain");
++
++              if (of_property_read_string(pdev->dev.of_node, "card_name",
++                                          &card->name))
++                      card->name = "IQaudIODAC";
++
++              if (of_property_read_string(pdev->dev.of_node, "dai_name",
++                                          &dai->name))
++                      dai->name = "IQaudIO DAC";
++
++              if (of_property_read_string(pdev->dev.of_node,
++                                      "dai_stream_name", &dai->stream_name))
++                      dai->stream_name = "IQaudIO DAC HiFi";
++
++              /* gpio_unmute - one time unmute amp using GPIO */
++              gpio_unmute = of_property_read_bool(pdev->dev.of_node,
++                                                  "iqaudio-dac,unmute-amp");
++
++              /* auto_gpio_mute - mute/unmute amp using GPIO */
++              auto_gpio_mute = of_property_read_bool(pdev->dev.of_node,
++                                              "iqaudio-dac,auto-mute-amp");
++
++              if (auto_gpio_mute || gpio_unmute) {
++                      mute_gpio = devm_gpiod_get_optional(&pdev->dev, "mute",
++                                                          GPIOD_OUT_LOW);
++                      if (IS_ERR(mute_gpio)) {
++                              ret = PTR_ERR(mute_gpio);
++                              dev_err(&pdev->dev,
++                                      "Failed to get mute gpio: %d\n", ret);
++                              return ret;
++                      }
++
++                      if (auto_gpio_mute && mute_gpio)
++                              snd_rpi_iqaudio_dac.set_bias_level =
++                                              snd_rpi_iqaudio_set_bias_level;
++              }
+       }
+       ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);
+-      if (ret)
++      if (ret) {
+               dev_err(&pdev->dev,
+                       "snd_soc_register_card() failed: %d\n", ret);
++              return ret;
++      }
++
++      if (gpio_unmute && mute_gpio)
++              snd_rpi_iqaudio_gpio_unmute(&snd_rpi_iqaudio_dac);
+-      return ret;
++      return 0;
+ }
+ static int snd_rpi_iqaudio_dac_remove(struct platform_device *pdev)
+ {
++      snd_rpi_iqaudio_gpio_mute(&snd_rpi_iqaudio_dac);
++
+       return snd_soc_unregister_card(&snd_rpi_iqaudio_dac);
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0413-IQaudIO-auto-mute-for-AMP-and-DigiAMP.patch b/target/linux/brcm2708/patches-4.4/0413-IQaudIO-auto-mute-for-AMP-and-DigiAMP.patch
deleted file mode 100644 (file)
index 1e6f65a..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-From c5368041bdadf28f7081deb6e11c9aaafe05377f Mon Sep 17 00:00:00 2001
-From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
-Date: Mon, 9 May 2016 20:38:08 +0100
-Subject: [PATCH 413/423] IQaudIO: auto-mute for AMP+ and DigiAMP+
-
-IQAudIO amplifier mute via GPIO22. Add dt params for "one-shot" unmute
-and auto mute.
-
-Revision 2, auto mute implementing HiassofT suggestion to mute/unmute
-using set_bias_level, rather than startup/shutdown....
-"By default DAPM waits 5 seconds (pmdown_time) before shutting down
-playback streams so a close/stop immediately followed by open/start
-doesn't trigger an amp mute+unmute."
-
-Tested on both AMP+ (via DAC+) and DigiAMP+, with both options...
-
-dtoverlay=iqaudio-dacplus,unmute_amp
- "one-shot" unmute when kernel module loads.
-
-dtoverlay=iqaudio-dacplus,auto_mute_amp
- Unmute amp when ALSA device opened by a client. Mute, with 5 second delay
- when ALSA device closed. (Re-opening the device within the 5 second close
- window, will cancel mute.)
-
-Revision 4, using gpiod.
-
-Revision 5, clean-up formatting before adding mute code.
- - Convert tab plus 4 space formatting to 2x tab
- - Remove '// NOT USED' commented code
-
-Revision 6, don't attempt to "one-shot" unmute amp, unless card is
-successfully registered.
-
-Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
----
- arch/arm/boot/dts/overlays/README                  |   4 +
- .../boot/dts/overlays/iqaudio-dacplus-overlay.dts  |   7 +-
- sound/soc/bcm/iqaudio-dac.c                        | 144 ++++++++++++++++-----
- 3 files changed, 124 insertions(+), 31 deletions(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -540,6 +540,10 @@ Params: 24db_digital_gain       Allow ga
-                                 responsibility of the user to ensure that
-                                 the Digital volume control is set to a value
-                                 that does not result in clipping/distortion!)
-+        auto_mute_amp           If specified, unmute/mute the IQaudIO amp when
-+                                starting/stopping audio playback.
-+        unmute_amp              If specified, unmute the IQaudIO amp once when
-+                                the DAC driver module loads.
- Name:   justboom-dac
---- a/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts
-+++ b/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts
-@@ -30,14 +30,17 @@
-       fragment@2 {
-               target = <&sound>;
--              frag2: __overlay__ {
-+              iqaudio_dac: __overlay__ {
-                       compatible = "iqaudio,iqaudio-dac";
-                       i2s-controller = <&i2s>;
-+                      mute-gpios = <&gpio 22 0>;
-                       status = "okay";
-               };
-       };
-       __overrides__ {
--              24db_digital_gain = <&frag2>,"iqaudio,24db_digital_gain?";
-+              24db_digital_gain = <&iqaudio_dac>,"iqaudio,24db_digital_gain?";
-+              auto_mute_amp = <&iqaudio_dac>,"iqaudio-dac,auto-mute-amp?";
-+              unmute_amp = <&iqaudio_dac>,"iqaudio-dac,unmute-amp?";
-       };
- };
---- a/sound/soc/bcm/iqaudio-dac.c
-+++ b/sound/soc/bcm/iqaudio-dac.c
-@@ -15,6 +15,7 @@
-  */
- #include <linux/module.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/platform_device.h>
- #include <sound/core.h>
-@@ -25,6 +26,8 @@
- static bool digital_gain_0db_limit = true;
-+static struct gpio_desc *mute_gpio;
-+
- static int snd_rpi_iqaudio_dac_init(struct snd_soc_pcm_runtime *rtd)
- {
-       if (digital_gain_0db_limit)
-@@ -41,11 +44,9 @@ static int snd_rpi_iqaudio_dac_init(stru
- }
- static int snd_rpi_iqaudio_dac_hw_params(struct snd_pcm_substream *substream,
--                                     struct snd_pcm_hw_params *params)
-+      struct snd_pcm_hw_params *params)
- {
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
--// NOT USED   struct snd_soc_dai *codec_dai = rtd->codec_dai;
--// NOT USED   struct snd_soc_codec *codec = rtd->codec;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-       unsigned int sample_bits =
-@@ -54,6 +55,56 @@ static int snd_rpi_iqaudio_dac_hw_params
-       return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
- }
-+static void snd_rpi_iqaudio_gpio_mute(struct snd_soc_card *card)
-+{
-+      if (mute_gpio) {
-+              dev_info(card->dev, "%s: muting amp using GPIO22\n",
-+                       __func__);
-+              gpiod_set_value_cansleep(mute_gpio, 0);
-+      }
-+}
-+
-+static void snd_rpi_iqaudio_gpio_unmute(struct snd_soc_card *card)
-+{
-+      if (mute_gpio) {
-+              dev_info(card->dev, "%s: un-muting amp using GPIO22\n",
-+                       __func__);
-+              gpiod_set_value_cansleep(mute_gpio, 1);
-+      }
-+}
-+
-+static int snd_rpi_iqaudio_set_bias_level(struct snd_soc_card *card,
-+      struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
-+{
-+      struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
-+
-+      if (dapm->dev != codec_dai->dev)
-+              return 0;
-+
-+      switch (level) {
-+      case SND_SOC_BIAS_PREPARE:
-+              if (dapm->bias_level != SND_SOC_BIAS_STANDBY)
-+                      break;
-+
-+              /* UNMUTE AMP */
-+              snd_rpi_iqaudio_gpio_unmute(card);
-+
-+              break;
-+      case SND_SOC_BIAS_STANDBY:
-+              if (dapm->bias_level != SND_SOC_BIAS_PREPARE)
-+                      break;
-+
-+              /* MUTE AMP */
-+              snd_rpi_iqaudio_gpio_mute(card);
-+
-+              break;
-+      default:
-+              break;
-+      }
-+
-+      return 0;
-+}
-+
- /* machine stream operations */
- static struct snd_soc_ops snd_rpi_iqaudio_dac_ops = {
-       .hw_params = snd_rpi_iqaudio_dac_hw_params,
-@@ -82,46 +133,81 @@ static struct snd_soc_card snd_rpi_iqaud
- static int snd_rpi_iqaudio_dac_probe(struct platform_device *pdev)
- {
-       int ret = 0;
-+      bool gpio_unmute = false;
-       snd_rpi_iqaudio_dac.dev = &pdev->dev;
-       if (pdev->dev.of_node) {
--          struct device_node *i2s_node;
--          struct snd_soc_card *card = &snd_rpi_iqaudio_dac;
--          struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
--          i2s_node = of_parse_phandle(pdev->dev.of_node,
--                                      "i2s-controller", 0);
--
--          if (i2s_node) {
--              dai->cpu_dai_name = NULL;
--              dai->cpu_of_node = i2s_node;
--              dai->platform_name = NULL;
--              dai->platform_of_node = i2s_node;
--          }
--
--          digital_gain_0db_limit = !of_property_read_bool(pdev->dev.of_node,
--                                      "iqaudio,24db_digital_gain");
--          if (of_property_read_string(pdev->dev.of_node, "card_name",
--                                      &card->name))
--              card->name = "IQaudIODAC";
--          if (of_property_read_string(pdev->dev.of_node, "dai_name",
--                                      &dai->name))
--              dai->name = "IQaudIO DAC";
--          if (of_property_read_string(pdev->dev.of_node, "dai_stream_name",
--                                      &dai->stream_name))
--              dai->stream_name = "IQaudIO DAC HiFi";
-+              struct device_node *i2s_node;
-+              struct snd_soc_card *card = &snd_rpi_iqaudio_dac;
-+              struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_dac_dai[0];
-+              bool auto_gpio_mute = false;
-+
-+              i2s_node = of_parse_phandle(pdev->dev.of_node,
-+                                          "i2s-controller", 0);
-+              if (i2s_node) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_node;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_node;
-+              }
-+
-+              digital_gain_0db_limit = !of_property_read_bool(
-+                      pdev->dev.of_node, "iqaudio,24db_digital_gain");
-+
-+              if (of_property_read_string(pdev->dev.of_node, "card_name",
-+                                          &card->name))
-+                      card->name = "IQaudIODAC";
-+
-+              if (of_property_read_string(pdev->dev.of_node, "dai_name",
-+                                          &dai->name))
-+                      dai->name = "IQaudIO DAC";
-+
-+              if (of_property_read_string(pdev->dev.of_node,
-+                                      "dai_stream_name", &dai->stream_name))
-+                      dai->stream_name = "IQaudIO DAC HiFi";
-+
-+              /* gpio_unmute - one time unmute amp using GPIO */
-+              gpio_unmute = of_property_read_bool(pdev->dev.of_node,
-+                                                  "iqaudio-dac,unmute-amp");
-+
-+              /* auto_gpio_mute - mute/unmute amp using GPIO */
-+              auto_gpio_mute = of_property_read_bool(pdev->dev.of_node,
-+                                              "iqaudio-dac,auto-mute-amp");
-+
-+              if (auto_gpio_mute || gpio_unmute) {
-+                      mute_gpio = devm_gpiod_get_optional(&pdev->dev, "mute",
-+                                                          GPIOD_OUT_LOW);
-+                      if (IS_ERR(mute_gpio)) {
-+                              ret = PTR_ERR(mute_gpio);
-+                              dev_err(&pdev->dev,
-+                                      "Failed to get mute gpio: %d\n", ret);
-+                              return ret;
-+                      }
-+
-+                      if (auto_gpio_mute && mute_gpio)
-+                              snd_rpi_iqaudio_dac.set_bias_level =
-+                                              snd_rpi_iqaudio_set_bias_level;
-+              }
-       }
-       ret = snd_soc_register_card(&snd_rpi_iqaudio_dac);
--      if (ret)
-+      if (ret) {
-               dev_err(&pdev->dev,
-                       "snd_soc_register_card() failed: %d\n", ret);
-+              return ret;
-+      }
-+
-+      if (gpio_unmute && mute_gpio)
-+              snd_rpi_iqaudio_gpio_unmute(&snd_rpi_iqaudio_dac);
--      return ret;
-+      return 0;
- }
- static int snd_rpi_iqaudio_dac_remove(struct platform_device *pdev)
- {
-+      snd_rpi_iqaudio_gpio_mute(&snd_rpi_iqaudio_dac);
-+
-       return snd_soc_unregister_card(&snd_rpi_iqaudio_dac);
- }
diff --git a/target/linux/brcm2708/patches-4.4/0413-mmc-Apply-ERASE_BROKEN-quirks-correctly.patch b/target/linux/brcm2708/patches-4.4/0413-mmc-Apply-ERASE_BROKEN-quirks-correctly.patch
new file mode 100644 (file)
index 0000000..c644066
--- /dev/null
@@ -0,0 +1,28 @@
+From 3aa91ff84515641bdc7a3b2ddf4638af0942bc56 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 23 Jun 2016 16:37:46 +0100
+Subject: [PATCH] mmc: Apply ERASE_BROKEN quirks correctly
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/card/block.c | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -2563,12 +2563,9 @@ static const struct mmc_fixup blk_fixups
+        *  On some Kingston SD cards, multiple erases of less than 64
+        *  sectors can cause corruption.
+        */
+-      MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
+-                MMC_QUIRK_ERASE_BROKEN),
+-      MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk_mmc,
+-                MMC_QUIRK_ERASE_BROKEN),
+-      MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk_mmc,
+-                MMC_QUIRK_ERASE_BROKEN),
++      MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk, MMC_QUIRK_ERASE_BROKEN),
++      MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk, MMC_QUIRK_ERASE_BROKEN),
++      MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk, MMC_QUIRK_ERASE_BROKEN),
+       END_FIXUP
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0414-enable-led-support-for-xpad-driver-fixes-flashing-le.patch b/target/linux/brcm2708/patches-4.4/0414-enable-led-support-for-xpad-driver-fixes-flashing-le.patch
new file mode 100644 (file)
index 0000000..45ffaee
--- /dev/null
@@ -0,0 +1,31 @@
+From 37d18c9d142632b625e03586657631099217dd5d Mon Sep 17 00:00:00 2001
+From: Jools Wills <buzz@exotica.org.uk>
+Date: Sun, 26 Jun 2016 16:28:48 +0000
+Subject: [PATCH] enable led support for xpad driver - fixes flashing leds on
+ controller
+
+---
+ 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
+@@ -559,6 +559,7 @@ CONFIG_JOYSTICK_IFORCE=m
+ CONFIG_JOYSTICK_IFORCE_USB=y
+ CONFIG_JOYSTICK_XPAD=m
+ CONFIG_JOYSTICK_XPAD_FF=y
++CONFIG_JOYSTICK_XPAD_LEDS=y
+ CONFIG_JOYSTICK_RPISENSE=m
+ CONFIG_INPUT_TOUCHSCREEN=y
+ CONFIG_TOUCHSCREEN_ADS7846=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -552,6 +552,7 @@ CONFIG_JOYSTICK_IFORCE=m
+ CONFIG_JOYSTICK_IFORCE_USB=y
+ CONFIG_JOYSTICK_XPAD=m
+ CONFIG_JOYSTICK_XPAD_FF=y
++CONFIG_JOYSTICK_XPAD_LEDS=y
+ CONFIG_JOYSTICK_RPISENSE=m
+ CONFIG_INPUT_TOUCHSCREEN=y
+ CONFIG_TOUCHSCREEN_ADS7846=m
diff --git a/target/linux/brcm2708/patches-4.4/0414-mmc-Apply-ERASE_BROKEN-quirks-correctly.patch b/target/linux/brcm2708/patches-4.4/0414-mmc-Apply-ERASE_BROKEN-quirks-correctly.patch
deleted file mode 100644 (file)
index 97f9589..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From 62f0d8320a176602d37c51fad03cafc736441ad4 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Thu, 23 Jun 2016 16:37:46 +0100
-Subject: [PATCH 414/423] mmc: Apply ERASE_BROKEN quirks correctly
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/mmc/card/block.c | 9 +++------
- 1 file changed, 3 insertions(+), 6 deletions(-)
-
---- a/drivers/mmc/card/block.c
-+++ b/drivers/mmc/card/block.c
-@@ -2563,12 +2563,9 @@ static const struct mmc_fixup blk_fixups
-        *  On some Kingston SD cards, multiple erases of less than 64
-        *  sectors can cause corruption.
-        */
--      MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk_mmc,
--                MMC_QUIRK_ERASE_BROKEN),
--      MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk_mmc,
--                MMC_QUIRK_ERASE_BROKEN),
--      MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk_mmc,
--                MMC_QUIRK_ERASE_BROKEN),
-+      MMC_FIXUP("SD16G", 0x41, 0x3432, add_quirk, MMC_QUIRK_ERASE_BROKEN),
-+      MMC_FIXUP("SD32G", 0x41, 0x3432, add_quirk, MMC_QUIRK_ERASE_BROKEN),
-+      MMC_FIXUP("SD64G", 0x41, 0x3432, add_quirk, MMC_QUIRK_ERASE_BROKEN),
-       END_FIXUP
- };
diff --git a/target/linux/brcm2708/patches-4.4/0415-Add-critical-information-for-getting-pi3-miniuart-bt.patch b/target/linux/brcm2708/patches-4.4/0415-Add-critical-information-for-getting-pi3-miniuart-bt.patch
new file mode 100644 (file)
index 0000000..dc3871d
--- /dev/null
@@ -0,0 +1,25 @@
+From 740fa92fd41e2c4dd5798d462fe4646d0cc6cc48 Mon Sep 17 00:00:00 2001
+From: David Lechner <david@lechnology.com>
+Date: Mon, 27 Jun 2016 22:52:22 -0500
+Subject: [PATCH] Add critical information for getting pi3-miniuart-bt overlay
+ to work
+
+Bluetooth on RPi 3 using uart1 will not work without setting core_freq=250 in config.txt. This is not
+documented anywhere, so this seems like a good place to start.
+---
+ arch/arm/boot/dts/overlays/README | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -691,7 +691,9 @@ Info:   Switch Pi3 Bluetooth function to
+         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.
++        /dev/serial1 instead because it will always be correct. Furthermore,
++        you must also set core_freq=250 in config.txt or the miniuart will not
++        work.
+ Load:   dtoverlay=pi3-miniuart-bt
+ Params: <None>
diff --git a/target/linux/brcm2708/patches-4.4/0415-enable-led-support-for-xpad-driver-fixes-flashing-le.patch b/target/linux/brcm2708/patches-4.4/0415-enable-led-support-for-xpad-driver-fixes-flashing-le.patch
deleted file mode 100644 (file)
index 6d280b0..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From 7c9908c6f70b0c8c7213d663f8e517b5321ebfbe Mon Sep 17 00:00:00 2001
-From: Jools Wills <buzz@exotica.org.uk>
-Date: Sun, 26 Jun 2016 16:28:48 +0000
-Subject: [PATCH 415/423] enable led support for xpad driver - fixes flashing
- leds on controller
-
----
- 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
-@@ -559,6 +559,7 @@ CONFIG_JOYSTICK_IFORCE=m
- CONFIG_JOYSTICK_IFORCE_USB=y
- CONFIG_JOYSTICK_XPAD=m
- CONFIG_JOYSTICK_XPAD_FF=y
-+CONFIG_JOYSTICK_XPAD_LEDS=y
- CONFIG_JOYSTICK_RPISENSE=m
- CONFIG_INPUT_TOUCHSCREEN=y
- CONFIG_TOUCHSCREEN_ADS7846=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -552,6 +552,7 @@ CONFIG_JOYSTICK_IFORCE=m
- CONFIG_JOYSTICK_IFORCE_USB=y
- CONFIG_JOYSTICK_XPAD=m
- CONFIG_JOYSTICK_XPAD_FF=y
-+CONFIG_JOYSTICK_XPAD_LEDS=y
- CONFIG_JOYSTICK_RPISENSE=m
- CONFIG_INPUT_TOUCHSCREEN=y
- CONFIG_TOUCHSCREEN_ADS7846=m
diff --git a/target/linux/brcm2708/patches-4.4/0416-Add-critical-information-for-getting-pi3-miniuart-bt.patch b/target/linux/brcm2708/patches-4.4/0416-Add-critical-information-for-getting-pi3-miniuart-bt.patch
deleted file mode 100644 (file)
index 3c1a463..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From 97230b9a008e1c6707ad1bafa4ebd4d6b11a022f Mon Sep 17 00:00:00 2001
-From: David Lechner <david@lechnology.com>
-Date: Mon, 27 Jun 2016 22:52:22 -0500
-Subject: [PATCH 416/423] Add critical information for getting pi3-miniuart-bt
- overlay to work
-
-Bluetooth on RPi 3 using uart1 will not work without setting core_freq=250 in config.txt. This is not
-documented anywhere, so this seems like a good place to start.
----
- arch/arm/boot/dts/overlays/README | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -691,7 +691,9 @@ Info:   Switch Pi3 Bluetooth function to
-         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.
-+        /dev/serial1 instead because it will always be correct. Furthermore,
-+        you must also set core_freq=250 in config.txt or the miniuart will not
-+        work.
- Load:   dtoverlay=pi3-miniuart-bt
- Params: <None>
diff --git a/target/linux/brcm2708/patches-4.4/0416-bcm2835-sdhost-Improvements-to-error-recovery.patch b/target/linux/brcm2708/patches-4.4/0416-bcm2835-sdhost-Improvements-to-error-recovery.patch
new file mode 100644 (file)
index 0000000..0437931
--- /dev/null
@@ -0,0 +1,312 @@
+From d90c379ffd993c72371252fe7840c14e4428410b Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Wed, 15 Jun 2016 17:13:55 +0100
+Subject: [PATCH] bcm2835-sdhost: Improvements to error recovery
+
+1) Try to avoid reducing overclock when a card is removed.
+
+2) Reset overclock on card insertion.
+
+3) Reduce logging when errors occur, lowering the severity of
+   some messages and making others conditional on the debug
+   flag.
+
+4) Attempt to identify a disconnected SD bus earlier, treating a
+   zero returned OCR (voltage support) as an error condition.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/host/bcm2835-sdhost.c | 117 ++++++++++++++++++++++++--------------
+ 1 file changed, 74 insertions(+), 43 deletions(-)
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -38,6 +38,7 @@
+ #include <linux/mmc/mmc.h>
+ #include <linux/mmc/host.h>
+ #include <linux/mmc/sd.h>
++#include <linux/mmc/sdio.h>
+ #include <linux/scatterlist.h>
+ #include <linux/of_address.h>
+ #include <linux/of_irq.h>
+@@ -206,6 +207,7 @@ struct bcm2835_host {
+       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                             user_overclock_50; /* User's preferred frequency to use when 50MHz is requested (in MHz) */
+       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) */
+@@ -282,7 +284,7 @@ static void log_dump(void)
+               do {
+                       entry = sdhost_log_buf + idx;
+                       if (entry->event[0] != '\0')
+-                              pr_err("[%08x] %.4s %x %x\n",
++                              pr_info("[%08x] %.4s %x %x\n",
+                                      entry->timestamp,
+                                      entry->event,
+                                      entry->param1,
+@@ -324,7 +326,7 @@ static void bcm2835_sdhost_dumpcmd(struc
+                                  const char *label)
+ {
+       if (cmd)
+-              pr_err("%s:%c%s op %d arg 0x%x flags 0x%x - resp %08x %08x %08x %08x, err %d\n",
++              pr_info("%s:%c%s op %d arg 0x%x flags 0x%x - resp %08x %08x %08x %08x, err %d\n",
+                       mmc_hostname(host->mmc),
+                       (cmd == host->cmd) ? '>' : ' ',
+                       label, cmd->opcode, cmd->arg, cmd->flags,
+@@ -339,7 +341,7 @@ static void bcm2835_sdhost_dumpregs(stru
+               bcm2835_sdhost_dumpcmd(host, host->mrq->sbc, "sbc");
+               bcm2835_sdhost_dumpcmd(host, host->mrq->cmd, "cmd");
+               if (host->mrq->data)
+-                      pr_err("%s: data blocks %x blksz %x - err %d\n",
++                      pr_info("%s: data blocks %x blksz %x - err %d\n",
+                              mmc_hostname(host->mmc),
+                              host->mrq->data->blocks,
+                              host->mrq->data->blksz,
+@@ -347,53 +349,53 @@ static void bcm2835_sdhost_dumpregs(stru
+               bcm2835_sdhost_dumpcmd(host, host->mrq->stop, "stop");
+       }
+-      pr_err("%s: =========== REGISTER DUMP ===========\n",
++      pr_info("%s: =========== REGISTER DUMP ===========\n",
+               mmc_hostname(host->mmc));
+-      pr_err("%s: SDCMD  0x%08x\n",
++      pr_info("%s: SDCMD  0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDCMD));
+-      pr_err("%s: SDARG  0x%08x\n",
++      pr_info("%s: SDARG  0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDARG));
+-      pr_err("%s: SDTOUT 0x%08x\n",
++      pr_info("%s: SDTOUT 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDTOUT));
+-      pr_err("%s: SDCDIV 0x%08x\n",
++      pr_info("%s: SDCDIV 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDCDIV));
+-      pr_err("%s: SDRSP0 0x%08x\n",
++      pr_info("%s: SDRSP0 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDRSP0));
+-      pr_err("%s: SDRSP1 0x%08x\n",
++      pr_info("%s: SDRSP1 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDRSP1));
+-      pr_err("%s: SDRSP2 0x%08x\n",
++      pr_info("%s: SDRSP2 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDRSP2));
+       pr_err("%s: SDRSP3 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDRSP3));
+-      pr_err("%s: SDHSTS 0x%08x\n",
++      pr_info("%s: SDHSTS 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDHSTS));
+-      pr_err("%s: SDVDD  0x%08x\n",
++      pr_info("%s: SDVDD  0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDVDD));
+-      pr_err("%s: SDEDM  0x%08x\n",
++      pr_info("%s: SDEDM  0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDEDM));
+-      pr_err("%s: SDHCFG 0x%08x\n",
++      pr_info("%s: SDHCFG 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDHCFG));
+-      pr_err("%s: SDHBCT 0x%08x\n",
++      pr_info("%s: SDHBCT 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDHBCT));
+-      pr_err("%s: SDHBLC 0x%08x\n",
++      pr_info("%s: SDHBLC 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDHBLC));
+-      pr_err("%s: ===========================================\n",
++      pr_info("%s: ===========================================\n",
+               mmc_hostname(host->mmc));
+ }
+@@ -608,7 +610,7 @@ static void bcm2835_sdhost_read_block_pi
+                                   (fsm_state != SDEDM_FSM_READCRC)) {
+                                       hsts = bcm2835_sdhost_read(host,
+                                                                  SDHSTS);
+-                                      pr_err("%s: fsm %x, hsts %x\n",
++                                      pr_info("%s: fsm %x, hsts %x\n",
+                                              mmc_hostname(host->mmc),
+                                              fsm_state, hsts);
+                                       if (hsts & SDHSTS_ERROR_MASK)
+@@ -698,7 +700,7 @@ static void bcm2835_sdhost_write_block_p
+                                   (fsm_state != SDEDM_FSM_WRITESTART2)) {
+                                       hsts = bcm2835_sdhost_read(host,
+                                                                  SDHSTS);
+-                                      pr_err("%s: fsm %x, hsts %x\n",
++                                      pr_info("%s: fsm %x, hsts %x\n",
+                                              mmc_hostname(host->mmc),
+                                              fsm_state, hsts);
+                                       if (hsts & SDHSTS_ERROR_MASK)
+@@ -953,9 +955,10 @@ bool bcm2835_sdhost_send_command(struct
+       while (bcm2835_sdhost_read(host, SDCMD) & SDCMD_NEW_FLAG) {
+               if (timeout == 0) {
+-                      pr_err("%s: previous command never completed.\n",
++                      pr_warn("%s: previous command never completed.\n",
+                               mmc_hostname(host->mmc));
+-                      bcm2835_sdhost_dumpregs(host);
++                      if (host->debug)
++                              bcm2835_sdhost_dumpregs(host);
+                       cmd->error = -EILSEQ;
+                       tasklet_schedule(&host->finish_tasklet);
+                       return false;
+@@ -1213,10 +1216,12 @@ static void bcm2835_sdhost_finish_comman
+       /* Check for errors */
+       if (sdcmd & SDCMD_NEW_FLAG) {
+-              pr_err("%s: command never completed.\n",
+-                     mmc_hostname(host->mmc));
+-              bcm2835_sdhost_dumpregs(host);
+-              host->cmd->error = -EIO;
++              if (host->debug) {
++                      pr_err("%s: command %d never completed.\n",
++                             mmc_hostname(host->mmc), host->cmd->opcode);
++                      bcm2835_sdhost_dumpregs(host);
++              }
++              host->cmd->error = -EILSEQ;
+               tasklet_schedule(&host->finish_tasklet);
+               return;
+       } else if (sdcmd & SDCMD_FAIL_FLAG) {
+@@ -1238,15 +1243,14 @@ static void bcm2835_sdhost_finish_comman
+               } else {
+                       if (sdhsts & SDHSTS_CMD_TIME_OUT) {
+                               if (host->debug)
+-                                      pr_err("%s: command %d timeout\n",
++                                      pr_warn("%s: command %d timeout\n",
+                                              mmc_hostname(host->mmc),
+                                              host->cmd->opcode);
+                               host->cmd->error = -ETIMEDOUT;
+                       } else {
+-                              pr_err("%s: unexpected command %d error\n",
++                              pr_warn("%s: unexpected command %d error\n",
+                                      mmc_hostname(host->mmc),
+                                      host->cmd->opcode);
+-                              bcm2835_sdhost_dumpregs(host);
+                               host->cmd->error = -EILSEQ;
+                       }
+                       tasklet_schedule(&host->finish_tasklet);
+@@ -1370,8 +1374,10 @@ static void bcm2835_sdhost_busy_irq(stru
+               } else if (intmask & SDHSTS_CMD_TIME_OUT)
+                       host->cmd->error = -ETIMEDOUT;
+-              log_dump();
+-              bcm2835_sdhost_dumpregs(host);
++              if (host->debug) {
++                      log_dump();
++                      bcm2835_sdhost_dumpregs(host);
++              }
+       }
+       else
+               bcm2835_sdhost_finish_command(host, NULL);
+@@ -1595,7 +1601,7 @@ void bcm2835_sdhost_set_clock(struct bcm
+                       host->overclock_50 = (clock/MHZ);
+                       if (clock != host->overclock) {
+-                              pr_warn("%s: overclocking to %dHz\n",
++                              pr_info("%s: overclocking to %dHz\n",
+                                       mmc_hostname(host->mmc), clock);
+                               host->overclock = clock;
+                       }
+@@ -1605,6 +1611,11 @@ void bcm2835_sdhost_set_clock(struct bcm
+                               pr_warn("%s: cancelling overclock\n",
+                                       mmc_hostname(host->mmc));
+               }
++      } else if (input_clock == 0) {
++              /* Reset the preferred overclock when the clock is stopped.
++               * This always happens during initialisation. */
++              host->overclock_50 = host->user_overclock_50;
++              host->overclock = 0;
+       }
+       /* Set the timeout to 500ms */
+@@ -1678,13 +1689,15 @@ static void bcm2835_sdhost_request(struc
+       log_event("REQ<", (u32)mrq, edm);
+       if ((fsm != SDEDM_FSM_IDENTMODE) &&
+           (fsm != SDEDM_FSM_DATAMODE)) {
+-              pr_err("%s: previous command (%d) not complete (EDM %x)\n",
+-                     mmc_hostname(host->mmc),
+-                     bcm2835_sdhost_read(host, SDCMD) & SDCMD_CMD_MASK,
+-                     edm);
+               log_event("REQ!", (u32)mrq, edm);
+-              log_dump();
+-              bcm2835_sdhost_dumpregs(host);
++              if (host->debug) {
++                      pr_warn("%s: previous command (%d) not complete (EDM %x)\n",
++                             mmc_hostname(host->mmc),
++                             bcm2835_sdhost_read(host, SDCMD) & SDCMD_CMD_MASK,
++                             edm);
++                      log_dump();
++                      bcm2835_sdhost_dumpregs(host);
++              }
+               mrq->cmd->error = -EILSEQ;
+               tasklet_schedule(&host->finish_tasklet);
+               mmiowb();
+@@ -1814,16 +1827,19 @@ static void bcm2835_sdhost_tasklet_finis
+       mrq = host->mrq;
+       /* Drop the overclock after any data corruption, or after any
+-         error overclocked */
++       * error while overclocked. Ignore errors for status commands,
++       * as they are likely when a card is ejected. */
+       if (host->overclock) {
+-              if ((mrq->cmd && mrq->cmd->error) ||
++              if ((mrq->cmd && mrq->cmd->error &&
++                   (mrq->cmd->opcode != MMC_SEND_STATUS)) ||
+                   (mrq->data && mrq->data->error) ||
+-                  (mrq->stop && mrq->stop->error)) {
++                  (mrq->stop && mrq->stop->error) ||
++                  (mrq->sbc && mrq->sbc->error)) {
+                       host->overclock_50--;
+                       pr_warn("%s: reducing overclock due to errors\n",
+                               mmc_hostname(host->mmc));
+                       host->reset_clock = 1;
+-                      mrq->cmd->error = -EILSEQ;
++                      mrq->cmd->error = -ETIMEDOUT;
+                       mrq->cmd->retries = 1;
+               }
+       }
+@@ -1848,6 +1864,21 @@ static void bcm2835_sdhost_tasklet_finis
+                              mmc_hostname(host->mmc), err);
+       }
++      /* The SDHOST block doesn't report any errors for a disconnected
++         interface. All cards and SDIO devices should report some supported
++         voltage range, so a zero response to SEND_OP_COND, IO_SEND_OP_COND
++         or APP_SEND_OP_COND can be treated as an error. */
++      if (((mrq->cmd->opcode == MMC_SEND_OP_COND) ||
++           (mrq->cmd->opcode == SD_IO_SEND_OP_COND) ||
++           (mrq->cmd->opcode == SD_APP_OP_COND)) &&
++          (mrq->cmd->error == 0) &&
++          (mrq->cmd->resp[0] == 0)) {
++              mrq->cmd->error = -ETIMEDOUT;
++              if (host->debug)
++                      pr_info("%s: faking timeout due to zero OCR\n",
++                              mmc_hostname(host->mmc));
++      }
++
+       mmc_request_done(host->mmc, mrq);
+       log_event("TSK>", (u32)mrq, 0);
+ }
+@@ -2023,7 +2054,7 @@ static int bcm2835_sdhost_probe(struct p
+                                    &host->delay_after_stop);
+               of_property_read_u32(node,
+                                    "brcm,overclock-50",
+-                                   &host->overclock_50);
++                                   &host->user_overclock_50);
+               of_property_read_u32(node,
+                                    "brcm,pio-limit",
+                                    &host->pio_limit);
diff --git a/target/linux/brcm2708/patches-4.4/0417-bcm2835-sdhost-Improvements-to-error-recovery.patch b/target/linux/brcm2708/patches-4.4/0417-bcm2835-sdhost-Improvements-to-error-recovery.patch
deleted file mode 100644 (file)
index 7f77065..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-From 336a4fae0a026365e58842b5df9e275858938f79 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Wed, 15 Jun 2016 17:13:55 +0100
-Subject: [PATCH 417/423] bcm2835-sdhost: Improvements to error recovery
-
-1) Try to avoid reducing overclock when a card is removed.
-
-2) Reset overclock on card insertion.
-
-3) Reduce logging when errors occur, lowering the severity of
-   some messages and making others conditional on the debug
-   flag.
-
-4) Attempt to identify a disconnected SD bus earlier, treating a
-   zero returned OCR (voltage support) as an error condition.
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- drivers/mmc/host/bcm2835-sdhost.c | 117 ++++++++++++++++++++++++--------------
- 1 file changed, 74 insertions(+), 43 deletions(-)
-
---- a/drivers/mmc/host/bcm2835-sdhost.c
-+++ b/drivers/mmc/host/bcm2835-sdhost.c
-@@ -38,6 +38,7 @@
- #include <linux/mmc/mmc.h>
- #include <linux/mmc/host.h>
- #include <linux/mmc/sd.h>
-+#include <linux/mmc/sdio.h>
- #include <linux/scatterlist.h>
- #include <linux/of_address.h>
- #include <linux/of_irq.h>
-@@ -206,6 +207,7 @@ struct bcm2835_host {
-       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                             user_overclock_50; /* User's preferred frequency to use when 50MHz is requested (in MHz) */
-       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) */
-@@ -282,7 +284,7 @@ static void log_dump(void)
-               do {
-                       entry = sdhost_log_buf + idx;
-                       if (entry->event[0] != '\0')
--                              pr_err("[%08x] %.4s %x %x\n",
-+                              pr_info("[%08x] %.4s %x %x\n",
-                                      entry->timestamp,
-                                      entry->event,
-                                      entry->param1,
-@@ -324,7 +326,7 @@ static void bcm2835_sdhost_dumpcmd(struc
-                                  const char *label)
- {
-       if (cmd)
--              pr_err("%s:%c%s op %d arg 0x%x flags 0x%x - resp %08x %08x %08x %08x, err %d\n",
-+              pr_info("%s:%c%s op %d arg 0x%x flags 0x%x - resp %08x %08x %08x %08x, err %d\n",
-                       mmc_hostname(host->mmc),
-                       (cmd == host->cmd) ? '>' : ' ',
-                       label, cmd->opcode, cmd->arg, cmd->flags,
-@@ -339,7 +341,7 @@ static void bcm2835_sdhost_dumpregs(stru
-               bcm2835_sdhost_dumpcmd(host, host->mrq->sbc, "sbc");
-               bcm2835_sdhost_dumpcmd(host, host->mrq->cmd, "cmd");
-               if (host->mrq->data)
--                      pr_err("%s: data blocks %x blksz %x - err %d\n",
-+                      pr_info("%s: data blocks %x blksz %x - err %d\n",
-                              mmc_hostname(host->mmc),
-                              host->mrq->data->blocks,
-                              host->mrq->data->blksz,
-@@ -347,53 +349,53 @@ static void bcm2835_sdhost_dumpregs(stru
-               bcm2835_sdhost_dumpcmd(host, host->mrq->stop, "stop");
-       }
--      pr_err("%s: =========== REGISTER DUMP ===========\n",
-+      pr_info("%s: =========== REGISTER DUMP ===========\n",
-               mmc_hostname(host->mmc));
--      pr_err("%s: SDCMD  0x%08x\n",
-+      pr_info("%s: SDCMD  0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDCMD));
--      pr_err("%s: SDARG  0x%08x\n",
-+      pr_info("%s: SDARG  0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDARG));
--      pr_err("%s: SDTOUT 0x%08x\n",
-+      pr_info("%s: SDTOUT 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDTOUT));
--      pr_err("%s: SDCDIV 0x%08x\n",
-+      pr_info("%s: SDCDIV 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDCDIV));
--      pr_err("%s: SDRSP0 0x%08x\n",
-+      pr_info("%s: SDRSP0 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDRSP0));
--      pr_err("%s: SDRSP1 0x%08x\n",
-+      pr_info("%s: SDRSP1 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDRSP1));
--      pr_err("%s: SDRSP2 0x%08x\n",
-+      pr_info("%s: SDRSP2 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDRSP2));
-       pr_err("%s: SDRSP3 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDRSP3));
--      pr_err("%s: SDHSTS 0x%08x\n",
-+      pr_info("%s: SDHSTS 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDHSTS));
--      pr_err("%s: SDVDD  0x%08x\n",
-+      pr_info("%s: SDVDD  0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDVDD));
--      pr_err("%s: SDEDM  0x%08x\n",
-+      pr_info("%s: SDEDM  0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDEDM));
--      pr_err("%s: SDHCFG 0x%08x\n",
-+      pr_info("%s: SDHCFG 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDHCFG));
--      pr_err("%s: SDHBCT 0x%08x\n",
-+      pr_info("%s: SDHBCT 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDHBCT));
--      pr_err("%s: SDHBLC 0x%08x\n",
-+      pr_info("%s: SDHBLC 0x%08x\n",
-               mmc_hostname(host->mmc),
-               bcm2835_sdhost_read(host, SDHBLC));
--      pr_err("%s: ===========================================\n",
-+      pr_info("%s: ===========================================\n",
-               mmc_hostname(host->mmc));
- }
-@@ -608,7 +610,7 @@ static void bcm2835_sdhost_read_block_pi
-                                   (fsm_state != SDEDM_FSM_READCRC)) {
-                                       hsts = bcm2835_sdhost_read(host,
-                                                                  SDHSTS);
--                                      pr_err("%s: fsm %x, hsts %x\n",
-+                                      pr_info("%s: fsm %x, hsts %x\n",
-                                              mmc_hostname(host->mmc),
-                                              fsm_state, hsts);
-                                       if (hsts & SDHSTS_ERROR_MASK)
-@@ -698,7 +700,7 @@ static void bcm2835_sdhost_write_block_p
-                                   (fsm_state != SDEDM_FSM_WRITESTART2)) {
-                                       hsts = bcm2835_sdhost_read(host,
-                                                                  SDHSTS);
--                                      pr_err("%s: fsm %x, hsts %x\n",
-+                                      pr_info("%s: fsm %x, hsts %x\n",
-                                              mmc_hostname(host->mmc),
-                                              fsm_state, hsts);
-                                       if (hsts & SDHSTS_ERROR_MASK)
-@@ -953,9 +955,10 @@ bool bcm2835_sdhost_send_command(struct
-       while (bcm2835_sdhost_read(host, SDCMD) & SDCMD_NEW_FLAG) {
-               if (timeout == 0) {
--                      pr_err("%s: previous command never completed.\n",
-+                      pr_warn("%s: previous command never completed.\n",
-                               mmc_hostname(host->mmc));
--                      bcm2835_sdhost_dumpregs(host);
-+                      if (host->debug)
-+                              bcm2835_sdhost_dumpregs(host);
-                       cmd->error = -EILSEQ;
-                       tasklet_schedule(&host->finish_tasklet);
-                       return false;
-@@ -1213,10 +1216,12 @@ static void bcm2835_sdhost_finish_comman
-       /* Check for errors */
-       if (sdcmd & SDCMD_NEW_FLAG) {
--              pr_err("%s: command never completed.\n",
--                     mmc_hostname(host->mmc));
--              bcm2835_sdhost_dumpregs(host);
--              host->cmd->error = -EIO;
-+              if (host->debug) {
-+                      pr_err("%s: command %d never completed.\n",
-+                             mmc_hostname(host->mmc), host->cmd->opcode);
-+                      bcm2835_sdhost_dumpregs(host);
-+              }
-+              host->cmd->error = -EILSEQ;
-               tasklet_schedule(&host->finish_tasklet);
-               return;
-       } else if (sdcmd & SDCMD_FAIL_FLAG) {
-@@ -1238,15 +1243,14 @@ static void bcm2835_sdhost_finish_comman
-               } else {
-                       if (sdhsts & SDHSTS_CMD_TIME_OUT) {
-                               if (host->debug)
--                                      pr_err("%s: command %d timeout\n",
-+                                      pr_warn("%s: command %d timeout\n",
-                                              mmc_hostname(host->mmc),
-                                              host->cmd->opcode);
-                               host->cmd->error = -ETIMEDOUT;
-                       } else {
--                              pr_err("%s: unexpected command %d error\n",
-+                              pr_warn("%s: unexpected command %d error\n",
-                                      mmc_hostname(host->mmc),
-                                      host->cmd->opcode);
--                              bcm2835_sdhost_dumpregs(host);
-                               host->cmd->error = -EILSEQ;
-                       }
-                       tasklet_schedule(&host->finish_tasklet);
-@@ -1370,8 +1374,10 @@ static void bcm2835_sdhost_busy_irq(stru
-               } else if (intmask & SDHSTS_CMD_TIME_OUT)
-                       host->cmd->error = -ETIMEDOUT;
--              log_dump();
--              bcm2835_sdhost_dumpregs(host);
-+              if (host->debug) {
-+                      log_dump();
-+                      bcm2835_sdhost_dumpregs(host);
-+              }
-       }
-       else
-               bcm2835_sdhost_finish_command(host, NULL);
-@@ -1595,7 +1601,7 @@ void bcm2835_sdhost_set_clock(struct bcm
-                       host->overclock_50 = (clock/MHZ);
-                       if (clock != host->overclock) {
--                              pr_warn("%s: overclocking to %dHz\n",
-+                              pr_info("%s: overclocking to %dHz\n",
-                                       mmc_hostname(host->mmc), clock);
-                               host->overclock = clock;
-                       }
-@@ -1605,6 +1611,11 @@ void bcm2835_sdhost_set_clock(struct bcm
-                               pr_warn("%s: cancelling overclock\n",
-                                       mmc_hostname(host->mmc));
-               }
-+      } else if (input_clock == 0) {
-+              /* Reset the preferred overclock when the clock is stopped.
-+               * This always happens during initialisation. */
-+              host->overclock_50 = host->user_overclock_50;
-+              host->overclock = 0;
-       }
-       /* Set the timeout to 500ms */
-@@ -1678,13 +1689,15 @@ static void bcm2835_sdhost_request(struc
-       log_event("REQ<", (u32)mrq, edm);
-       if ((fsm != SDEDM_FSM_IDENTMODE) &&
-           (fsm != SDEDM_FSM_DATAMODE)) {
--              pr_err("%s: previous command (%d) not complete (EDM %x)\n",
--                     mmc_hostname(host->mmc),
--                     bcm2835_sdhost_read(host, SDCMD) & SDCMD_CMD_MASK,
--                     edm);
-               log_event("REQ!", (u32)mrq, edm);
--              log_dump();
--              bcm2835_sdhost_dumpregs(host);
-+              if (host->debug) {
-+                      pr_warn("%s: previous command (%d) not complete (EDM %x)\n",
-+                             mmc_hostname(host->mmc),
-+                             bcm2835_sdhost_read(host, SDCMD) & SDCMD_CMD_MASK,
-+                             edm);
-+                      log_dump();
-+                      bcm2835_sdhost_dumpregs(host);
-+              }
-               mrq->cmd->error = -EILSEQ;
-               tasklet_schedule(&host->finish_tasklet);
-               mmiowb();
-@@ -1814,16 +1827,19 @@ static void bcm2835_sdhost_tasklet_finis
-       mrq = host->mrq;
-       /* Drop the overclock after any data corruption, or after any
--         error overclocked */
-+       * error while overclocked. Ignore errors for status commands,
-+       * as they are likely when a card is ejected. */
-       if (host->overclock) {
--              if ((mrq->cmd && mrq->cmd->error) ||
-+              if ((mrq->cmd && mrq->cmd->error &&
-+                   (mrq->cmd->opcode != MMC_SEND_STATUS)) ||
-                   (mrq->data && mrq->data->error) ||
--                  (mrq->stop && mrq->stop->error)) {
-+                  (mrq->stop && mrq->stop->error) ||
-+                  (mrq->sbc && mrq->sbc->error)) {
-                       host->overclock_50--;
-                       pr_warn("%s: reducing overclock due to errors\n",
-                               mmc_hostname(host->mmc));
-                       host->reset_clock = 1;
--                      mrq->cmd->error = -EILSEQ;
-+                      mrq->cmd->error = -ETIMEDOUT;
-                       mrq->cmd->retries = 1;
-               }
-       }
-@@ -1848,6 +1864,21 @@ static void bcm2835_sdhost_tasklet_finis
-                              mmc_hostname(host->mmc), err);
-       }
-+      /* The SDHOST block doesn't report any errors for a disconnected
-+         interface. All cards and SDIO devices should report some supported
-+         voltage range, so a zero response to SEND_OP_COND, IO_SEND_OP_COND
-+         or APP_SEND_OP_COND can be treated as an error. */
-+      if (((mrq->cmd->opcode == MMC_SEND_OP_COND) ||
-+           (mrq->cmd->opcode == SD_IO_SEND_OP_COND) ||
-+           (mrq->cmd->opcode == SD_APP_OP_COND)) &&
-+          (mrq->cmd->error == 0) &&
-+          (mrq->cmd->resp[0] == 0)) {
-+              mrq->cmd->error = -ETIMEDOUT;
-+              if (host->debug)
-+                      pr_info("%s: faking timeout due to zero OCR\n",
-+                              mmc_hostname(host->mmc));
-+      }
-+
-       mmc_request_done(host->mmc, mrq);
-       log_event("TSK>", (u32)mrq, 0);
- }
-@@ -2023,7 +2054,7 @@ static int bcm2835_sdhost_probe(struct p
-                                    &host->delay_after_stop);
-               of_property_read_u32(node,
-                                    "brcm,overclock-50",
--                                   &host->overclock_50);
-+                                   &host->user_overclock_50);
-               of_property_read_u32(node,
-                                    "brcm,pio-limit",
-                                    &host->pio_limit);
diff --git a/target/linux/brcm2708/patches-4.4/0417-pinctrl-bcm2835-Fix-return-type-of-bcm2835_pmx_free.patch b/target/linux/brcm2708/patches-4.4/0417-pinctrl-bcm2835-Fix-return-type-of-bcm2835_pmx_free.patch
new file mode 100644 (file)
index 0000000..57e5785
--- /dev/null
@@ -0,0 +1,27 @@
+From a1c9b6e2482ecc3dd3191b494d6cb717fa700ce4 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Tue, 28 Jun 2016 22:13:15 +0100
+Subject: [PATCH] pinctrl-bcm2835: Fix return type of bcm2835_pmx_free
+
+---
+ drivers/pinctrl/bcm/pinctrl-bcm2835.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+@@ -831,13 +831,14 @@ static const struct pinctrl_ops bcm2835_
+       .dt_free_map = bcm2835_pctl_dt_free_map,
+ };
+-static void bcm2835_pmx_free(struct pinctrl_dev *pctldev,
++static int bcm2835_pmx_free(struct pinctrl_dev *pctldev,
+               unsigned offset)
+ {
+       struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
+       /* disable by setting to GPIO_IN */
+       bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
++      return 0;
+ }
+ static int bcm2835_pmx_get_functions_count(struct pinctrl_dev *pctldev)
diff --git a/target/linux/brcm2708/patches-4.4/0418-Add-IQAudIO-Digi-WM8804-board-support.patch b/target/linux/brcm2708/patches-4.4/0418-Add-IQAudIO-Digi-WM8804-board-support.patch
new file mode 100644 (file)
index 0000000..1c57ceb
--- /dev/null
@@ -0,0 +1,399 @@
+From a5bf4ef8a41a52453b9505ffef39b7635feef4b2 Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Thu, 30 Jun 2016 18:38:42 +0100
+Subject: [PATCH] Add IQAudIO Digi WM8804 board support
+
+Support IQAudIO Digi board with iqaudio_digi machine driver and
+ iqaudio-digi-wm8804-audio overlay.
+
+NB. Machine driver is a cut and paste of hifiberry_digi code, with format
+    and general cleanup to comply with kernel coding standards.
+
+Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+---
+ arch/arm/boot/dts/overlays/Makefile                |   1 +
+ arch/arm/boot/dts/overlays/README                  |   9 +
+ .../overlays/iqaudio-digi-wm8804-audio-overlay.dts |  47 ++++
+ arch/arm/configs/bcm2709_defconfig                 |   1 +
+ arch/arm/configs/bcmrpi_defconfig                  |   1 +
+ sound/soc/bcm/Kconfig                              |   7 +
+ sound/soc/bcm/Makefile                             |   2 +
+ sound/soc/bcm/iqaudio_digi.c                       | 239 +++++++++++++++++++++
+ 8 files changed, 307 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts
+ create mode 100644 sound/soc/bcm/iqaudio_digi.c
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -42,6 +42,7 @@ dtbo-$(RPI_DT_OVERLAYS) += i2s-gpio28-31
+ 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) += iqaudio-digi-wm8804-audio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += justboom-dac.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -546,6 +546,15 @@ Params: 24db_digital_gain       Allow ga
+                                 the DAC driver module loads.
++Name:   iqaudio-digi-wm8804-audio
++Info:   Configures the IQAudIO Digi WM8804 audio card
++Load:   dtoverlay=iqaudio-digi-wm8804-audio,<param>=<val>
++Params: card_name               Override the default, "IQAudIODigi", card name.
++        dai_name                Override the default, "IQAudIO Digi", dai name.
++        dai_stream_name         Override the default, "IQAudIO Digi HiFi",
++                                dai stream name.
++
++
+ Name:   justboom-dac
+ Info:   Configures the JustBoom DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
+         cards
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts
+@@ -0,0 +1,47 @@
++// Definitions for IQAudIO Digi WM8804 audio board
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      wm8804@3b {
++                              #sound-dai-cells = <0>;
++                              compatible = "wlf,wm8804";
++                              reg = <0x3b>;
++                              status = "okay";
++                              // DVDD-supply = <&reg_3v3>;
++                              // PVDD-supply = <&reg_3v3>;
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&sound>;
++              wm8804_digi: __overlay__ {
++                      compatible = "iqaudio,wm8804-digi";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++
++      __overrides__ {
++              card_name = <&wm8804_digi>,"wm8804-digi,card-name";
++              dai_name = <&wm8804_digi>,"wm8804-digi,dai-name";
++              dai_stream_name = <&wm8804_digi>,"wm8804-digi,dai-stream-name";
++      };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -865,6 +865,7 @@ CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
+ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
+ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
++CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -857,6 +857,7 @@ CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
+ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
+ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
++CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -71,6 +71,13 @@ config SND_BCM2708_SOC_IQAUDIO_DAC
+       help
+         Say Y or M if you want to add support for IQaudIO-DAC.
++config SND_BCM2708_SOC_IQAUDIO_DIGI
++        tristate "Support for IQAudIO Digi"
++        depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
++        select SND_SOC_WM8804
++        help
++         Say Y or M if you want to add support for IQAudIO Digital IO board.
++
+ config SND_BCM2708_SOC_RASPIDAC3
+       tristate "Support for RaspiDAC Rev.3x"
+       depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
+--- a/sound/soc/bcm/Makefile
++++ b/sound/soc/bcm/Makefile
+@@ -14,6 +14,7 @@ snd-soc-justboom-digi-objs := justboom-d
+ snd-soc-rpi-dac-objs := rpi-dac.o
+ snd-soc-rpi-proto-objs := rpi-proto.o
+ snd-soc-iqaudio-dac-objs := iqaudio-dac.o
++snd-soc-iqaudio-digi-objs := iqaudio_digi.o
+ snd-soc-raspidac3-objs := raspidac3.o
+ snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
+ snd-soc-digidac1-soundcard-objs := digidac1-soundcard.o
+@@ -28,6 +29,7 @@ obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DI
+ obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o
+ obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
+ obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
++obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI) += snd-soc-iqaudio-digi.o
+ obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
+ obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
+ obj-$(CONFIG_SND_DIGIDAC1_SOUNDCARD) += snd-soc-digidac1-soundcard.o
+--- /dev/null
++++ b/sound/soc/bcm/iqaudio_digi.c
+@@ -0,0 +1,239 @@
++/*
++ * ASoC Driver for IQAudIO WM8804 Digi
++ *
++ * Author: Daniel Matuschek <info@crazy-audio.com>
++ * based on the HifiBerry DAC driver by Florian Meier <florian.meier@koalo.de>
++ *    Copyright 2013
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/jack.h>
++
++#include "../codecs/wm8804.h"
++
++static short int auto_shutdown_output;
++module_param(auto_shutdown_output, short,
++            S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
++MODULE_PARM_DESC(auto_shutdown_output, "Shutdown SP/DIF output if playback is stopped");
++
++static int snd_rpi_iqaudio_digi_init(struct snd_soc_pcm_runtime *rtd)
++{
++      struct snd_soc_codec *codec = rtd->codec;
++
++      /* enable TX output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++
++      return 0;
++}
++
++static int snd_rpi_iqaudio_digi_startup(struct snd_pcm_substream *substream)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_codec *codec = rtd->codec;
++
++      /* turn on digital output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
++
++      return 0;
++}
++
++static void snd_rpi_iqaudio_digi_shutdown(struct snd_pcm_substream *substream)
++{
++      if (auto_shutdown_output) {
++              struct snd_soc_pcm_runtime *rtd = substream->private_data;
++              struct snd_soc_codec *codec = rtd->codec;
++
++              /* turn off digital output */
++              snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
++      }
++}
++
++
++static int snd_rpi_iqaudio_digi_hw_params(struct snd_pcm_substream *substream,
++      struct snd_pcm_hw_params *params)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_dai *codec_dai = rtd->codec_dai;
++      struct snd_soc_codec *codec = rtd->codec;
++      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
++
++      int sysclk = 27000000; /* This is fixed on this board */
++
++      long mclk_freq = 0;
++      int mclk_div = 1;
++      int sampling_freq = 1;
++
++      int ret;
++
++      int samplerate = params_rate(params);
++
++      if (samplerate <= 96000) {
++              mclk_freq = samplerate * 256;
++              mclk_div = WM8804_MCLKDIV_256FS;
++      } else {
++              mclk_freq = samplerate * 128;
++              mclk_div = WM8804_MCLKDIV_128FS;
++      }
++
++      switch (samplerate) {
++      case 32000:
++              sampling_freq = 0x03;
++              break;
++      case 44100:
++              sampling_freq = 0x00;
++              break;
++      case 48000:
++              sampling_freq = 0x02;
++              break;
++      case 88200:
++              sampling_freq = 0x08;
++              break;
++      case 96000:
++              sampling_freq = 0x0a;
++              break;
++      case 176400:
++              sampling_freq = 0x0c;
++              break;
++      case 192000:
++              sampling_freq = 0x0e;
++              break;
++      default:
++              dev_err(codec->dev, "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
++                      samplerate);
++      }
++
++      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
++      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
++
++      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
++                                      sysclk, SND_SOC_CLOCK_OUT);
++      if (ret < 0) {
++              dev_err(codec->dev, "Failed to set WM8804 SYSCLK: %d\n", ret);
++              return ret;
++      }
++
++      /* Enable TX output */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++
++      /* Power on */
++      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
++
++      /* set sampling frequency status bits */
++      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
++
++      return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);
++}
++
++/* machine stream operations */
++static struct snd_soc_ops snd_rpi_iqaudio_digi_ops = {
++      .hw_params      = snd_rpi_iqaudio_digi_hw_params,
++      .startup        = snd_rpi_iqaudio_digi_startup,
++      .shutdown       = snd_rpi_iqaudio_digi_shutdown,
++};
++
++static struct snd_soc_dai_link snd_rpi_iqaudio_digi_dai[] = {
++{
++      .name           = "IQAudIO Digi",
++      .stream_name    = "IQAudIO Digi HiFi",
++      .cpu_dai_name   = "bcm2708-i2s.0",
++      .codec_dai_name = "wm8804-spdif",
++      .platform_name  = "bcm2708-i2s.0",
++      .codec_name     = "wm8804.1-003b",
++      .dai_fmt        = SND_SOC_DAIFMT_I2S |
++                        SND_SOC_DAIFMT_NB_NF |
++                        SND_SOC_DAIFMT_CBM_CFM,
++      .ops            = &snd_rpi_iqaudio_digi_ops,
++      .init           = snd_rpi_iqaudio_digi_init,
++},
++};
++
++/* audio machine driver */
++static struct snd_soc_card snd_rpi_iqaudio_digi = {
++      .name           = "IQAudIODigi",
++      .owner          = THIS_MODULE,
++      .dai_link       = snd_rpi_iqaudio_digi_dai,
++      .num_links      = ARRAY_SIZE(snd_rpi_iqaudio_digi_dai),
++};
++
++static int snd_rpi_iqaudio_digi_probe(struct platform_device *pdev)
++{
++      struct snd_soc_card *card = &snd_rpi_iqaudio_digi;
++      char *prefix = "wm8804-digi,";
++      char prop[128];
++      struct device_node *np;
++      int ret = 0;
++
++      snd_rpi_iqaudio_digi.dev = &pdev->dev;
++
++      np = pdev->dev.of_node;
++      if (np) {
++              struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_digi_dai[0];
++              struct device_node *i2s_node;
++
++              i2s_node = of_parse_phandle(np, "i2s-controller", 0);
++              if (i2s_node) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_node;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_node;
++              }
++
++              snprintf(prop, sizeof(prop), "%scard-name", prefix);
++              of_property_read_string(np, prop, &card->name);
++
++              snprintf(prop, sizeof(prop), "%sdai-name", prefix);
++              of_property_read_string(np, prop, &dai->name);
++
++              snprintf(prop, sizeof(prop), "%sdai-stream-name", prefix);
++              of_property_read_string(np, prop, &dai->stream_name);
++      }
++
++      ret = snd_soc_register_card(card);
++      if (ret)
++              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
++                      ret);
++
++      return ret;
++}
++
++static int snd_rpi_iqaudio_digi_remove(struct platform_device *pdev)
++{
++      return snd_soc_unregister_card(&snd_rpi_iqaudio_digi);
++}
++
++static const struct of_device_id snd_rpi_iqaudio_digi_of_match[] = {
++      { .compatible = "iqaudio,wm8804-digi", },
++      {},
++};
++MODULE_DEVICE_TABLE(of, snd_rpi_iqaudio_digi_of_match);
++
++static struct platform_driver snd_rpi_iqaudio_digi_driver = {
++      .driver = {
++              .name           = "IQAudIODigi",
++              .owner          = THIS_MODULE,
++              .of_match_table = snd_rpi_iqaudio_digi_of_match,
++      },
++      .probe  = snd_rpi_iqaudio_digi_probe,
++      .remove = snd_rpi_iqaudio_digi_remove,
++};
++
++module_platform_driver(snd_rpi_iqaudio_digi_driver);
++
++MODULE_AUTHOR("Daniel Matuschek <info@crazy-audio.com>");
++MODULE_DESCRIPTION("ASoC Driver for IQAudIO WM8804 Digi");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0418-pinctrl-bcm2835-Fix-return-type-of-bcm2835_pmx_free.patch b/target/linux/brcm2708/patches-4.4/0418-pinctrl-bcm2835-Fix-return-type-of-bcm2835_pmx_free.patch
deleted file mode 100644 (file)
index 0cb395d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-From cf4bd841e1b8b74c77601b90dff106331740af62 Mon Sep 17 00:00:00 2001
-From: popcornmix <popcornmix@gmail.com>
-Date: Tue, 28 Jun 2016 22:13:15 +0100
-Subject: [PATCH 418/423] pinctrl-bcm2835: Fix return type of bcm2835_pmx_free
-
----
- drivers/pinctrl/bcm/pinctrl-bcm2835.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
-+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
-@@ -831,13 +831,14 @@ static const struct pinctrl_ops bcm2835_
-       .dt_free_map = bcm2835_pctl_dt_free_map,
- };
--static void bcm2835_pmx_free(struct pinctrl_dev *pctldev,
-+static int bcm2835_pmx_free(struct pinctrl_dev *pctldev,
-               unsigned offset)
- {
-       struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
-       /* disable by setting to GPIO_IN */
-       bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
-+      return 0;
- }
- static int bcm2835_pmx_get_functions_count(struct pinctrl_dev *pctldev)
diff --git a/target/linux/brcm2708/patches-4.4/0419-Add-IQAudIO-Digi-WM8804-board-support.patch b/target/linux/brcm2708/patches-4.4/0419-Add-IQAudIO-Digi-WM8804-board-support.patch
deleted file mode 100644 (file)
index 0cc610c..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-From c0b9e2c502269ef126969709f54e4489b87e3923 Mon Sep 17 00:00:00 2001
-From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
-Date: Thu, 30 Jun 2016 18:38:42 +0100
-Subject: [PATCH 419/423] Add IQAudIO Digi WM8804 board support
-
-Support IQAudIO Digi board with iqaudio_digi machine driver and
- iqaudio-digi-wm8804-audio overlay.
-
-NB. Machine driver is a cut and paste of hifiberry_digi code, with format
-    and general cleanup to comply with kernel coding standards.
-
-Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
----
- arch/arm/boot/dts/overlays/Makefile                |   1 +
- arch/arm/boot/dts/overlays/README                  |   9 +
- .../overlays/iqaudio-digi-wm8804-audio-overlay.dts |  47 ++++
- arch/arm/configs/bcm2709_defconfig                 |   1 +
- arch/arm/configs/bcmrpi_defconfig                  |   1 +
- sound/soc/bcm/Kconfig                              |   7 +
- sound/soc/bcm/Makefile                             |   2 +
- sound/soc/bcm/iqaudio_digi.c                       | 239 +++++++++++++++++++++
- 8 files changed, 307 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts
- create mode 100644 sound/soc/bcm/iqaudio_digi.c
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -42,6 +42,7 @@ dtbo-$(RPI_DT_OVERLAYS) += i2s-gpio28-31
- 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) += iqaudio-digi-wm8804-audio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += justboom-dac.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -546,6 +546,15 @@ Params: 24db_digital_gain       Allow ga
-                                 the DAC driver module loads.
-+Name:   iqaudio-digi-wm8804-audio
-+Info:   Configures the IQAudIO Digi WM8804 audio card
-+Load:   dtoverlay=iqaudio-digi-wm8804-audio,<param>=<val>
-+Params: card_name               Override the default, "IQAudIODigi", card name.
-+        dai_name                Override the default, "IQAudIO Digi", dai name.
-+        dai_stream_name         Override the default, "IQAudIO Digi HiFi",
-+                                dai stream name.
-+
-+
- Name:   justboom-dac
- Info:   Configures the JustBoom DAC HAT, Amp HAT, DAC Zero and Amp Zero audio
-         cards
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts
-@@ -0,0 +1,47 @@
-+// Definitions for IQAudIO Digi WM8804 audio board
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&i2c1>;
-+              __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      status = "okay";
-+
-+                      wm8804@3b {
-+                              #sound-dai-cells = <0>;
-+                              compatible = "wlf,wm8804";
-+                              reg = <0x3b>;
-+                              status = "okay";
-+                              // DVDD-supply = <&reg_3v3>;
-+                              // PVDD-supply = <&reg_3v3>;
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&sound>;
-+              wm8804_digi: __overlay__ {
-+                      compatible = "iqaudio,wm8804-digi";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+
-+      __overrides__ {
-+              card_name = <&wm8804_digi>,"wm8804-digi,card-name";
-+              dai_name = <&wm8804_digi>,"wm8804-digi,dai-name";
-+              dai_stream_name = <&wm8804_digi>,"wm8804-digi,dai-stream-name";
-+      };
-+};
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -865,6 +865,7 @@ CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
- CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
- CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
-+CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
- CONFIG_SND_DIGIDAC1_SOUNDCARD=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -857,6 +857,7 @@ CONFIG_SND_BCM2708_SOC_RPI_PROTO=m
- CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m
- CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
- CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
-+CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m
- CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
- CONFIG_SND_DIGIDAC1_SOUNDCARD=m
---- a/sound/soc/bcm/Kconfig
-+++ b/sound/soc/bcm/Kconfig
-@@ -71,6 +71,13 @@ config SND_BCM2708_SOC_IQAUDIO_DAC
-       help
-         Say Y or M if you want to add support for IQaudIO-DAC.
-+config SND_BCM2708_SOC_IQAUDIO_DIGI
-+        tristate "Support for IQAudIO Digi"
-+        depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-+        select SND_SOC_WM8804
-+        help
-+         Say Y or M if you want to add support for IQAudIO Digital IO board.
-+
- config SND_BCM2708_SOC_RASPIDAC3
-       tristate "Support for RaspiDAC Rev.3x"
-       depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
---- a/sound/soc/bcm/Makefile
-+++ b/sound/soc/bcm/Makefile
-@@ -14,6 +14,7 @@ snd-soc-justboom-digi-objs := justboom-d
- snd-soc-rpi-dac-objs := rpi-dac.o
- snd-soc-rpi-proto-objs := rpi-proto.o
- snd-soc-iqaudio-dac-objs := iqaudio-dac.o
-+snd-soc-iqaudio-digi-objs := iqaudio_digi.o
- snd-soc-raspidac3-objs := raspidac3.o
- snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
- snd-soc-digidac1-soundcard-objs := digidac1-soundcard.o
-@@ -28,6 +29,7 @@ obj-$(CONFIG_SND_BCM2708_SOC_JUSTBOOM_DI
- obj-$(CONFIG_SND_BCM2708_SOC_RPI_DAC) += snd-soc-rpi-dac.o
- obj-$(CONFIG_SND_BCM2708_SOC_RPI_PROTO) += snd-soc-rpi-proto.o
- obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC) += snd-soc-iqaudio-dac.o
-+obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI) += snd-soc-iqaudio-digi.o
- obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
- obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
- obj-$(CONFIG_SND_DIGIDAC1_SOUNDCARD) += snd-soc-digidac1-soundcard.o
---- /dev/null
-+++ b/sound/soc/bcm/iqaudio_digi.c
-@@ -0,0 +1,239 @@
-+/*
-+ * ASoC Driver for IQAudIO WM8804 Digi
-+ *
-+ * Author: Daniel Matuschek <info@crazy-audio.com>
-+ * based on the HifiBerry DAC driver by Florian Meier <florian.meier@koalo.de>
-+ *    Copyright 2013
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/jack.h>
-+
-+#include "../codecs/wm8804.h"
-+
-+static short int auto_shutdown_output;
-+module_param(auto_shutdown_output, short,
-+            S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
-+MODULE_PARM_DESC(auto_shutdown_output, "Shutdown SP/DIF output if playback is stopped");
-+
-+static int snd_rpi_iqaudio_digi_init(struct snd_soc_pcm_runtime *rtd)
-+{
-+      struct snd_soc_codec *codec = rtd->codec;
-+
-+      /* enable TX output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
-+
-+      return 0;
-+}
-+
-+static int snd_rpi_iqaudio_digi_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->codec;
-+
-+      /* turn on digital output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x00);
-+
-+      return 0;
-+}
-+
-+static void snd_rpi_iqaudio_digi_shutdown(struct snd_pcm_substream *substream)
-+{
-+      if (auto_shutdown_output) {
-+              struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+              struct snd_soc_codec *codec = rtd->codec;
-+
-+              /* turn off digital output */
-+              snd_soc_update_bits(codec, WM8804_PWRDN, 0x3c, 0x3c);
-+      }
-+}
-+
-+
-+static int snd_rpi_iqaudio_digi_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai *codec_dai = rtd->codec_dai;
-+      struct snd_soc_codec *codec = rtd->codec;
-+      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-+
-+      int sysclk = 27000000; /* This is fixed on this board */
-+
-+      long mclk_freq = 0;
-+      int mclk_div = 1;
-+      int sampling_freq = 1;
-+
-+      int ret;
-+
-+      int samplerate = params_rate(params);
-+
-+      if (samplerate <= 96000) {
-+              mclk_freq = samplerate * 256;
-+              mclk_div = WM8804_MCLKDIV_256FS;
-+      } else {
-+              mclk_freq = samplerate * 128;
-+              mclk_div = WM8804_MCLKDIV_128FS;
-+      }
-+
-+      switch (samplerate) {
-+      case 32000:
-+              sampling_freq = 0x03;
-+              break;
-+      case 44100:
-+              sampling_freq = 0x00;
-+              break;
-+      case 48000:
-+              sampling_freq = 0x02;
-+              break;
-+      case 88200:
-+              sampling_freq = 0x08;
-+              break;
-+      case 96000:
-+              sampling_freq = 0x0a;
-+              break;
-+      case 176400:
-+              sampling_freq = 0x0c;
-+              break;
-+      case 192000:
-+              sampling_freq = 0x0e;
-+              break;
-+      default:
-+              dev_err(codec->dev, "Failed to set WM8804 SYSCLK, unsupported samplerate %d\n",
-+                      samplerate);
-+      }
-+
-+      snd_soc_dai_set_clkdiv(codec_dai, WM8804_MCLK_DIV, mclk_div);
-+      snd_soc_dai_set_pll(codec_dai, 0, 0, sysclk, mclk_freq);
-+
-+      ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
-+                                      sysclk, SND_SOC_CLOCK_OUT);
-+      if (ret < 0) {
-+              dev_err(codec->dev, "Failed to set WM8804 SYSCLK: %d\n", ret);
-+              return ret;
-+      }
-+
-+      /* Enable TX output */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
-+
-+      /* Power on */
-+      snd_soc_update_bits(codec, WM8804_PWRDN, 0x9, 0);
-+
-+      /* set sampling frequency status bits */
-+      snd_soc_update_bits(codec, WM8804_SPDTX4, 0x0f, sampling_freq);
-+
-+      return snd_soc_dai_set_bclk_ratio(cpu_dai, 64);
-+}
-+
-+/* machine stream operations */
-+static struct snd_soc_ops snd_rpi_iqaudio_digi_ops = {
-+      .hw_params      = snd_rpi_iqaudio_digi_hw_params,
-+      .startup        = snd_rpi_iqaudio_digi_startup,
-+      .shutdown       = snd_rpi_iqaudio_digi_shutdown,
-+};
-+
-+static struct snd_soc_dai_link snd_rpi_iqaudio_digi_dai[] = {
-+{
-+      .name           = "IQAudIO Digi",
-+      .stream_name    = "IQAudIO Digi HiFi",
-+      .cpu_dai_name   = "bcm2708-i2s.0",
-+      .codec_dai_name = "wm8804-spdif",
-+      .platform_name  = "bcm2708-i2s.0",
-+      .codec_name     = "wm8804.1-003b",
-+      .dai_fmt        = SND_SOC_DAIFMT_I2S |
-+                        SND_SOC_DAIFMT_NB_NF |
-+                        SND_SOC_DAIFMT_CBM_CFM,
-+      .ops            = &snd_rpi_iqaudio_digi_ops,
-+      .init           = snd_rpi_iqaudio_digi_init,
-+},
-+};
-+
-+/* audio machine driver */
-+static struct snd_soc_card snd_rpi_iqaudio_digi = {
-+      .name           = "IQAudIODigi",
-+      .owner          = THIS_MODULE,
-+      .dai_link       = snd_rpi_iqaudio_digi_dai,
-+      .num_links      = ARRAY_SIZE(snd_rpi_iqaudio_digi_dai),
-+};
-+
-+static int snd_rpi_iqaudio_digi_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_card *card = &snd_rpi_iqaudio_digi;
-+      char *prefix = "wm8804-digi,";
-+      char prop[128];
-+      struct device_node *np;
-+      int ret = 0;
-+
-+      snd_rpi_iqaudio_digi.dev = &pdev->dev;
-+
-+      np = pdev->dev.of_node;
-+      if (np) {
-+              struct snd_soc_dai_link *dai = &snd_rpi_iqaudio_digi_dai[0];
-+              struct device_node *i2s_node;
-+
-+              i2s_node = of_parse_phandle(np, "i2s-controller", 0);
-+              if (i2s_node) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_node;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_node;
-+              }
-+
-+              snprintf(prop, sizeof(prop), "%scard-name", prefix);
-+              of_property_read_string(np, prop, &card->name);
-+
-+              snprintf(prop, sizeof(prop), "%sdai-name", prefix);
-+              of_property_read_string(np, prop, &dai->name);
-+
-+              snprintf(prop, sizeof(prop), "%sdai-stream-name", prefix);
-+              of_property_read_string(np, prop, &dai->stream_name);
-+      }
-+
-+      ret = snd_soc_register_card(card);
-+      if (ret)
-+              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
-+                      ret);
-+
-+      return ret;
-+}
-+
-+static int snd_rpi_iqaudio_digi_remove(struct platform_device *pdev)
-+{
-+      return snd_soc_unregister_card(&snd_rpi_iqaudio_digi);
-+}
-+
-+static const struct of_device_id snd_rpi_iqaudio_digi_of_match[] = {
-+      { .compatible = "iqaudio,wm8804-digi", },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, snd_rpi_iqaudio_digi_of_match);
-+
-+static struct platform_driver snd_rpi_iqaudio_digi_driver = {
-+      .driver = {
-+              .name           = "IQAudIODigi",
-+              .owner          = THIS_MODULE,
-+              .of_match_table = snd_rpi_iqaudio_digi_of_match,
-+      },
-+      .probe  = snd_rpi_iqaudio_digi_probe,
-+      .remove = snd_rpi_iqaudio_digi_remove,
-+};
-+
-+module_platform_driver(snd_rpi_iqaudio_digi_driver);
-+
-+MODULE_AUTHOR("Daniel Matuschek <info@crazy-audio.com>");
-+MODULE_DESCRIPTION("ASoC Driver for IQAudIO WM8804 Digi");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0419-dts-Add-overlay-for-NXP-SC16IS752-Dual-UART-with-SPI.patch b/target/linux/brcm2708/patches-4.4/0419-dts-Add-overlay-for-NXP-SC16IS752-Dual-UART-with-SPI.patch
new file mode 100644 (file)
index 0000000..f47efb7
--- /dev/null
@@ -0,0 +1,106 @@
+From fbbafbb2b4739eb6980f18c78c276ffbee2602db Mon Sep 17 00:00:00 2001
+From: Erdem MEYDANLI <erdem.meydanli@punica.com.tr>
+Date: Thu, 30 Jun 2016 21:05:08 +0300
+Subject: [PATCH] dts: Add overlay for NXP SC16IS752 Dual UART with SPI
+ Interface
+
+---
+ arch/arm/boot/dts/overlays/Makefile                |  1 +
+ arch/arm/boot/dts/overlays/README                  | 10 ++++
+ .../boot/dts/overlays/sc16is752-spi1-overlay.dts   | 61 ++++++++++++++++++++++
+ 3 files changed, 72 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -71,6 +71,7 @@ dtbo-$(RPI_DT_OVERLAYS) += rpi-ft5406.dt
+ dtbo-$(RPI_DT_OVERLAYS) += rpi-proto.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += rpi-sense.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += rra-digidac1-wm8741-audio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += sc16is752-spi1.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio-1bit.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -888,6 +888,16 @@ Load:   dtoverlay=rra-digidac1-wm8741-au
+ Params: <None>
++Name:   sc16is752-spi1
++Info:   Overlay for the NXP SC16IS752 Dual UART with SPI Interface
++        Enables the chip on SPI1.
++        N.B.: spi1 is only accessible on devices with a 40pin header, eg:
++              A+, B+, Zero and PI2 B; as well as the Compute Module.
++
++Load:   dtoverlay=sc16is752-spi1,<param>=<val>
++Params: int_pin                 GPIO used for IRQ (default 24)
++
++
+ Name:   sdhost
+ Info:   Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock.
+         N.B. This overlay is designed for situations where the mmc driver is
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts
+@@ -0,0 +1,61 @@
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++      fragment@0 {
++              target = <&gpio>;
++              __overlay__ {
++                      spi1_pins: spi1_pins {
++                              brcm,pins = <19 20 21>;
++                              brcm,function = <3>; /* alt4 */
++                      };
++
++                      spi1_cs_pins: spi1_cs_pins {
++                              brcm,pins = <18>;
++                              brcm,function = <1>; /* output */
++                      };
++              };
++      };
++
++      fragment@1 {
++              target = <&spi1>;
++              frag1: __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      pinctrl-names = "default";
++                      pinctrl-0 = <&spi1_pins &spi1_cs_pins>;
++                      cs-gpios = <&gpio 18 1>;
++                      status = "okay";
++
++                      sc16is752: sc16is752@0 {
++                              compatible = "nxp,sc16is752";
++                              reg = <0>; /* CE0 */
++                              clocks = <&sc16is752_clk>;
++                              interrupt-parent = <&gpio>;
++                              interrupts = <24 2>; /* IRQ_TYPE_EDGE_FALLING */
++                              #gpio-controller;
++                              #gpio-cells = <2>;
++                              spi-max-frequency = <4000000>;
++
++                              sc16is752_clk: sc16is752_clk {
++                                      compatible = "fixed-clock";
++                                      #clock-cells = <0>;
++                                      clock-frequency = <14745600>;
++                              };
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&aux>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++    __overrides__ {
++      int_pin = <&sc16is752>,"interrupts:0";
++    };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0420-dts-Add-overlay-for-NXP-SC16IS752-Dual-UART-with-SPI.patch b/target/linux/brcm2708/patches-4.4/0420-dts-Add-overlay-for-NXP-SC16IS752-Dual-UART-with-SPI.patch
deleted file mode 100644 (file)
index 595c0ee..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-From 27fac2f6623e8a3cddeaaf9851b719469b8df22e Mon Sep 17 00:00:00 2001
-From: Erdem MEYDANLI <erdem.meydanli@punica.com.tr>
-Date: Thu, 30 Jun 2016 21:05:08 +0300
-Subject: [PATCH 420/423] dts: Add overlay for NXP SC16IS752 Dual UART with SPI
- Interface
-
----
- arch/arm/boot/dts/overlays/Makefile                |  1 +
- arch/arm/boot/dts/overlays/README                  | 10 ++++
- .../boot/dts/overlays/sc16is752-spi1-overlay.dts   | 61 ++++++++++++++++++++++
- 3 files changed, 72 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -71,6 +71,7 @@ dtbo-$(RPI_DT_OVERLAYS) += rpi-ft5406.dt
- dtbo-$(RPI_DT_OVERLAYS) += rpi-proto.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += rpi-sense.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += rra-digidac1-wm8741-audio.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += sc16is752-spi1.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += sdio-1bit.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -888,6 +888,16 @@ Load:   dtoverlay=rra-digidac1-wm8741-au
- Params: <None>
-+Name:   sc16is752-spi1
-+Info:   Overlay for the NXP SC16IS752 Dual UART with SPI Interface
-+        Enables the chip on SPI1.
-+        N.B.: spi1 is only accessible on devices with a 40pin header, eg:
-+              A+, B+, Zero and PI2 B; as well as the Compute Module.
-+
-+Load:   dtoverlay=sc16is752-spi1,<param>=<val>
-+Params: int_pin                 GPIO used for IRQ (default 24)
-+
-+
- Name:   sdhost
- Info:   Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock.
-         N.B. This overlay is designed for situations where the mmc driver is
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts
-@@ -0,0 +1,61 @@
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
-+
-+      fragment@0 {
-+              target = <&gpio>;
-+              __overlay__ {
-+                      spi1_pins: spi1_pins {
-+                              brcm,pins = <19 20 21>;
-+                              brcm,function = <3>; /* alt4 */
-+                      };
-+
-+                      spi1_cs_pins: spi1_cs_pins {
-+                              brcm,pins = <18>;
-+                              brcm,function = <1>; /* output */
-+                      };
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&spi1>;
-+              frag1: __overlay__ {
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+                      pinctrl-names = "default";
-+                      pinctrl-0 = <&spi1_pins &spi1_cs_pins>;
-+                      cs-gpios = <&gpio 18 1>;
-+                      status = "okay";
-+
-+                      sc16is752: sc16is752@0 {
-+                              compatible = "nxp,sc16is752";
-+                              reg = <0>; /* CE0 */
-+                              clocks = <&sc16is752_clk>;
-+                              interrupt-parent = <&gpio>;
-+                              interrupts = <24 2>; /* IRQ_TYPE_EDGE_FALLING */
-+                              #gpio-controller;
-+                              #gpio-cells = <2>;
-+                              spi-max-frequency = <4000000>;
-+
-+                              sc16is752_clk: sc16is752_clk {
-+                                      compatible = "fixed-clock";
-+                                      #clock-cells = <0>;
-+                                      clock-frequency = <14745600>;
-+                              };
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&aux>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+    __overrides__ {
-+      int_pin = <&sc16is752>,"interrupts:0";
-+    };
-+};
diff --git a/target/linux/brcm2708/patches-4.4/0420-spi-bcm2835-Disable-forced-software-CS.patch b/target/linux/brcm2708/patches-4.4/0420-spi-bcm2835-Disable-forced-software-CS.patch
new file mode 100644 (file)
index 0000000..ad922ae
--- /dev/null
@@ -0,0 +1,46 @@
+From f3ca1e96b47181a009fd99fbb8e22f9afa5b1972 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 1 Jul 2016 22:09:24 +0100
+Subject: [PATCH] spi-bcm2835: Disable forced software CS
+
+Select software CS in bcm2708_common.dtsi, and disable the automatic
+conversion in the driver to allow hardware CS to be re-enabled with an
+overlay.
+
+See: https://github.com/raspberrypi/linux/issues/1547
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 2 +-
+ drivers/spi/spi-bcm2835.c             | 2 ++
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -183,7 +183,7 @@
+                        * add more gpios if necessary as <&gpio 6 1>
+                        * (but do not forget to make them output!)
+                        */
+-                      cs-gpios = <0>, <0>;
++                      cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+               };
+               i2c0: i2c@7e205000 {
+--- a/drivers/spi/spi-bcm2835.c
++++ b/drivers/spi/spi-bcm2835.c
+@@ -707,6 +707,7 @@ static int bcm2835_spi_setup(struct spi_
+               return -EINVAL;
+       }
++#if 0
+       /* now translate native cs to GPIO */
+       /* first look for chip select pins in the devices pin groups */
+       for (pingroup_index = 0;
+@@ -761,6 +762,7 @@ static int bcm2835_spi_setup(struct spi_
+        * so we are setting it here explicitly
+        */
+       gpio_set_value(spi->cs_gpio, (spi->mode & SPI_CS_HIGH) ? 0 : 1);
++#endif
+       return 0;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0421-BCM270X_DT-Overlay-to-re-enable-HW-CS-on-SPI0.patch b/target/linux/brcm2708/patches-4.4/0421-BCM270X_DT-Overlay-to-re-enable-HW-CS-on-SPI0.patch
new file mode 100644 (file)
index 0000000..4300c54
--- /dev/null
@@ -0,0 +1,69 @@
+From 538f85c20d4209dbae6851f9733e3e3f0450ff32 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 1 Jul 2016 22:34:52 +0100
+Subject: [PATCH] BCM270X_DT: Overlay to re-enable HW CS on SPI0
+
+See: https://github.com/raspberrypi/linux/issues/1547
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/overlays/Makefile               |  1 +
+ arch/arm/boot/dts/overlays/README                 |  6 ++++++
+ arch/arm/boot/dts/overlays/spi0-hw-cs-overlay.dts | 26 +++++++++++++++++++++++
+ 3 files changed, 33 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/spi0-hw-cs-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -81,6 +81,7 @@ dtbo-$(RPI_DT_OVERLAYS) += smi-dev.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += smi-nand.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi-gpio35-39.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi-rtc.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += spi0-hw-cs.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi1-1cs.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi1-2cs.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += spi1-3cs.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -1006,6 +1006,12 @@ Load:   dtoverlay=spi-rtc,<param>=<val>
+ Params: pcf2123                 Select the PCF2123 device
++Name:   spi0-hw-cs
++Info:   Re-enables hardware CS/CE (chip selects) for SPI0
++Load:   dtoverlay=spi0-hw-cs
++Params: <None>
++
++
+ Name:   spi1-1cs
+ Info:   Enables spi1 with a single chip select (CS) line and associated spidev
+         dev node. The gpio pin number for the CS line and spidev device node
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/spi0-hw-cs-overlay.dts
+@@ -0,0 +1,26 @@
++/*
++ * Device tree overlay to re-enable hardware CS for SPI0
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";
++
++      fragment@0 {
++              target = <&spi0>;
++              __overlay__ {
++                      cs-gpios = <0>, <0>;
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&spi0_cs_pins>;
++              __overlay__ {
++                      brcm,pins = <8 7>;
++                      brcm,function = <4>; /* alt0 */
++              };
++      };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0421-spi-bcm2835-Disable-forced-software-CS.patch b/target/linux/brcm2708/patches-4.4/0421-spi-bcm2835-Disable-forced-software-CS.patch
deleted file mode 100644 (file)
index 1e40763..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From e95bf039347d97f57e7045d7cd2d1f7e4daed1c6 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 1 Jul 2016 22:09:24 +0100
-Subject: [PATCH 421/423] spi-bcm2835: Disable forced software CS
-
-Select software CS in bcm2708_common.dtsi, and disable the automatic
-conversion in the driver to allow hardware CS to be re-enabled with an
-overlay.
-
-See: https://github.com/raspberrypi/linux/issues/1547
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/bcm2708_common.dtsi | 2 +-
- drivers/spi/spi-bcm2835.c             | 2 ++
- 2 files changed, 3 insertions(+), 1 deletion(-)
-
---- a/arch/arm/boot/dts/bcm2708_common.dtsi
-+++ b/arch/arm/boot/dts/bcm2708_common.dtsi
-@@ -183,7 +183,7 @@
-                        * add more gpios if necessary as <&gpio 6 1>
-                        * (but do not forget to make them output!)
-                        */
--                      cs-gpios = <0>, <0>;
-+                      cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
-               };
-               i2c0: i2c@7e205000 {
---- a/drivers/spi/spi-bcm2835.c
-+++ b/drivers/spi/spi-bcm2835.c
-@@ -707,6 +707,7 @@ static int bcm2835_spi_setup(struct spi_
-               return -EINVAL;
-       }
-+#if 0
-       /* now translate native cs to GPIO */
-       /* first look for chip select pins in the devices pin groups */
-       for (pingroup_index = 0;
-@@ -761,6 +762,7 @@ static int bcm2835_spi_setup(struct spi_
-        * so we are setting it here explicitly
-        */
-       gpio_set_value(spi->cs_gpio, (spi->mode & SPI_CS_HIGH) ? 0 : 1);
-+#endif
-       return 0;
- }
diff --git a/target/linux/brcm2708/patches-4.4/0422-Add-support-for-Dion-Audio-LOCO-DAC-AMP-HAT.patch b/target/linux/brcm2708/patches-4.4/0422-Add-support-for-Dion-Audio-LOCO-DAC-AMP-HAT.patch
new file mode 100644 (file)
index 0000000..d51d4f9
--- /dev/null
@@ -0,0 +1,261 @@
+From 91bb6ae349039ab6c1336a463d3c3d26e4df9fb0 Mon Sep 17 00:00:00 2001
+From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+Date: Sat, 2 Jul 2016 16:26:19 +0100
+Subject: [PATCH] Add support for Dion Audio LOCO DAC-AMP HAT
+
+Using dedicated machine driver and pcm5102a codec driver.
+
+Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
+---
+ arch/arm/boot/dts/overlays/Makefile                |   1 +
+ arch/arm/boot/dts/overlays/README                  |   6 +
+ .../boot/dts/overlays/dionaudio-loco-overlay.dts   |  39 +++++++
+ arch/arm/configs/bcm2709_defconfig                 |   1 +
+ arch/arm/configs/bcmrpi_defconfig                  |   1 +
+ sound/soc/bcm/Kconfig                              |   7 ++
+ sound/soc/bcm/Makefile                             |   3 +-
+ sound/soc/bcm/dionaudio_loco.c                     | 121 +++++++++++++++++++++
+ 8 files changed, 178 insertions(+), 1 deletion(-)
+ create mode 100644 arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts
+ create mode 100644 sound/soc/bcm/dionaudio_loco.c
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -20,6 +20,7 @@ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtb
+ dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += dionaudio-loco.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dpi24.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -268,6 +268,12 @@ Params: gpiopin                 GPIO con
+                                 (default 4)
++Name:   dionaudio-loco
++Info:   Configures the Dion Audio LOCO DAC-AMP
++Load:   dtoverlay=dionaudio-loco
++Params: <None>
++
++
+ Name:   dpi24
+ Info:   Overlay for a generic 24-bit DPI display
+         This uses GPIOs 0-27 (so no I2C, uart etc.), and activates the output
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts
+@@ -0,0 +1,39 @@
++// Definitions for Dion Audio LOCO DAC-AMP
++
++/*
++ * PCM5242 DAC (in hardware mode) and TPA3118 AMP.
++ */
++
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target-path = "/";
++              __overlay__ {
++                      pcm5102a-codec {
++                              #sound-dai-cells = <0>;
++                              compatible = "ti,pcm5102a";
++                              status = "okay";
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&sound>;
++              __overlay__ {
++                      compatible = "dionaudio,loco-pcm5242-tpa3118";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++              };
++      };
++};
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -870,6 +870,7 @@ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+ CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
++CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+ CONFIG_SND_SIMPLE_CARD=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -862,6 +862,7 @@ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+ CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
++CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+ CONFIG_SND_SIMPLE_CARD=m
+--- a/sound/soc/bcm/Kconfig
++++ b/sound/soc/bcm/Kconfig
+@@ -107,3 +107,10 @@ config SND_DIGIDAC1_SOUNDCARD
+         select SND_SOC_WM8741
+         help
+          Say Y or M if you want to add support for Red Rocks Audio DigiDAC1 board.
++
++config SND_BCM2708_SOC_DIONAUDIO_LOCO
++      tristate "Support for Dion Audio LOCO DAC-AMP"
++      depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
++      select SND_SOC_PCM5102a
++      help
++        Say Y or M if you want to add support for Dion Audio LOCO.
+--- a/sound/soc/bcm/Makefile
++++ b/sound/soc/bcm/Makefile
+@@ -18,6 +18,7 @@ snd-soc-iqaudio-digi-objs := iqaudio_dig
+ snd-soc-raspidac3-objs := raspidac3.o
+ snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
+ snd-soc-digidac1-soundcard-objs := digidac1-soundcard.o
++snd-soc-dionaudio-loco-objs := dionaudio_loco.o
+ obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
+ obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
+@@ -33,4 +34,4 @@ obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DIG
+ obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
+ obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
+ obj-$(CONFIG_SND_DIGIDAC1_SOUNDCARD) += snd-soc-digidac1-soundcard.o
+-
++obj-$(CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO) += snd-soc-dionaudio-loco.o
+--- /dev/null
++++ b/sound/soc/bcm/dionaudio_loco.c
+@@ -0,0 +1,121 @@
++/*
++ * ASoC Driver for Dion Audio LOCO DAC-AMP
++ *
++ * Author:      Miquel Blauw <info@dionaudio.nl>
++ *              Copyright 2016
++ *
++ * Based on the software of the RPi-DAC writen by Florian Meier
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/jack.h>
++
++static int snd_rpi_dionaudio_loco_hw_params(
++      struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params)
++{
++      struct snd_soc_pcm_runtime *rtd = substream->private_data;
++      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
++
++      unsigned int sample_bits =
++              snd_pcm_format_physical_width(params_format(params));
++
++      return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
++}
++
++/* machine stream operations */
++static struct snd_soc_ops snd_rpi_dionaudio_loco_ops = {
++      .hw_params = snd_rpi_dionaudio_loco_hw_params,
++};
++
++static struct snd_soc_dai_link snd_rpi_dionaudio_loco_dai[] = {
++{
++      .name           = "DionAudio LOCO",
++      .stream_name    = "DionAudio LOCO DAC-AMP",
++      .cpu_dai_name   = "bcm2708-i2s.0",
++      .codec_dai_name = "pcm5102a-hifi",
++      .platform_name  = "bcm2708-i2s.0",
++      .codec_name     = "pcm5102a-codec",
++      .dai_fmt        = SND_SOC_DAIFMT_I2S |
++                        SND_SOC_DAIFMT_NB_NF |
++                        SND_SOC_DAIFMT_CBS_CFS,
++      .ops            = &snd_rpi_dionaudio_loco_ops,
++},
++};
++
++/* audio machine driver */
++static struct snd_soc_card snd_rpi_dionaudio_loco = {
++      .name           = "snd_rpi_dionaudio_loco",
++      .dai_link       = snd_rpi_dionaudio_loco_dai,
++      .num_links      = ARRAY_SIZE(snd_rpi_dionaudio_loco_dai),
++};
++
++static int snd_rpi_dionaudio_loco_probe(struct platform_device *pdev)
++{
++      struct device_node *np;
++      int ret = 0;
++
++      snd_rpi_dionaudio_loco.dev = &pdev->dev;
++
++      np = pdev->dev.of_node;
++      if (np) {
++              struct snd_soc_dai_link *dai = &snd_rpi_dionaudio_loco_dai[0];
++              struct device_node *i2s_np;
++
++              i2s_np = of_parse_phandle(np, "i2s-controller", 0);
++              if (i2s_np) {
++                      dai->cpu_dai_name = NULL;
++                      dai->cpu_of_node = i2s_np;
++                      dai->platform_name = NULL;
++                      dai->platform_of_node = i2s_np;
++              }
++      }
++
++      ret = snd_soc_register_card(&snd_rpi_dionaudio_loco);
++      if (ret)
++              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
++                      ret);
++
++      return ret;
++}
++
++static int snd_rpi_dionaudio_loco_remove(struct platform_device *pdev)
++{
++      return snd_soc_unregister_card(&snd_rpi_dionaudio_loco);
++}
++
++static const struct of_device_id snd_rpi_dionaudio_loco_of_match[] = {
++      { .compatible = "dionaudio,loco-pcm5242-tpa3118", },
++      { /* sentinel */ },
++};
++MODULE_DEVICE_TABLE(of, snd_rpi_dionaudio_loco_of_match);
++
++static struct platform_driver snd_rpi_dionaudio_loco_driver = {
++      .driver = {
++              .name           = "snd-dionaudio-loco",
++              .owner          = THIS_MODULE,
++              .of_match_table = snd_rpi_dionaudio_loco_of_match,
++      },
++      .probe  = snd_rpi_dionaudio_loco_probe,
++      .remove = snd_rpi_dionaudio_loco_remove,
++};
++
++module_platform_driver(snd_rpi_dionaudio_loco_driver);
++
++MODULE_AUTHOR("Miquel Blauw <info@dionaudio.nl>");
++MODULE_DESCRIPTION("ASoC Driver for DionAudio LOCO");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0422-BCM270X_DT-Overlay-to-re-enable-HW-CS-on-SPI0.patch b/target/linux/brcm2708/patches-4.4/0422-BCM270X_DT-Overlay-to-re-enable-HW-CS-on-SPI0.patch
deleted file mode 100644 (file)
index 81319b2..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-From b8fdcf0f9af482e7dfa6fc5bb470318696789a52 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 1 Jul 2016 22:34:52 +0100
-Subject: [PATCH 422/423] BCM270X_DT: Overlay to re-enable HW CS on SPI0
-
-See: https://github.com/raspberrypi/linux/issues/1547
-
-Signed-off-by: Phil Elwell <phil@raspberrypi.org>
----
- arch/arm/boot/dts/overlays/Makefile               |  1 +
- arch/arm/boot/dts/overlays/README                 |  6 ++++++
- arch/arm/boot/dts/overlays/spi0-hw-cs-overlay.dts | 26 +++++++++++++++++++++++
- 3 files changed, 33 insertions(+)
- create mode 100644 arch/arm/boot/dts/overlays/spi0-hw-cs-overlay.dts
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -81,6 +81,7 @@ dtbo-$(RPI_DT_OVERLAYS) += smi-dev.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += smi-nand.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi-gpio35-39.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi-rtc.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += spi0-hw-cs.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi1-1cs.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi1-2cs.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += spi1-3cs.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -1006,6 +1006,12 @@ Load:   dtoverlay=spi-rtc,<param>=<val>
- Params: pcf2123                 Select the PCF2123 device
-+Name:   spi0-hw-cs
-+Info:   Re-enables hardware CS/CE (chip selects) for SPI0
-+Load:   dtoverlay=spi0-hw-cs
-+Params: <None>
-+
-+
- Name:   spi1-1cs
- Info:   Enables spi1 with a single chip select (CS) line and associated spidev
-         dev node. The gpio pin number for the CS line and spidev device node
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/spi0-hw-cs-overlay.dts
-@@ -0,0 +1,26 @@
-+/*
-+ * Device tree overlay to re-enable hardware CS for SPI0
-+ */
-+
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";
-+
-+      fragment@0 {
-+              target = <&spi0>;
-+              __overlay__ {
-+                      cs-gpios = <0>, <0>;
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target = <&spi0_cs_pins>;
-+              __overlay__ {
-+                      brcm,pins = <8 7>;
-+                      brcm,function = <4>; /* alt0 */
-+              };
-+      };
-+};
diff --git a/target/linux/brcm2708/patches-4.4/0423-ASoc-wm8731-add-32bit-mode.patch b/target/linux/brcm2708/patches-4.4/0423-ASoc-wm8731-add-32bit-mode.patch
new file mode 100644 (file)
index 0000000..b9f3f39
--- /dev/null
@@ -0,0 +1,39 @@
+From 4dd7b6b8c1354ab21b4e3f85dcd513252fe8afea Mon Sep 17 00:00:00 2001
+From: Matt Flax <flatmax@flatmax.org>
+Date: Fri, 17 Jun 2016 14:48:16 +1000
+Subject: [PATCH] ASoc: wm8731: add 32bit mode.
+
+commit cf5ef3a299ba32f6ac24c3c6ba18c1b7f1b5475f upstream.
+
+This patch adds 32 bit word capability to the wm8731 driver. The wm8731
+codec is capable of handling 32 bit word sizes, however that has not
+previously been activated in the codec driver.
+
+Signed-off-by: Matt Flax <flatmax@flatmax.org>
+Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+---
+ sound/soc/codecs/wm8731.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/sound/soc/codecs/wm8731.c
++++ b/sound/soc/codecs/wm8731.c
+@@ -358,6 +358,9 @@ static int wm8731_hw_params(struct snd_p
+       case 24:
+               iface |= 0x0008;
+               break;
++      case 32:
++              iface |= 0x000c;
++              break;
+       }
+       wm8731_set_deemph(codec);
+@@ -541,7 +544,7 @@ static int wm8731_startup(struct snd_pcm
+ #define WM8731_RATES SNDRV_PCM_RATE_8000_96000
+ #define WM8731_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
+-      SNDRV_PCM_FMTBIT_S24_LE)
++      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
+ static const struct snd_soc_dai_ops wm8731_dai_ops = {
+       .startup        = wm8731_startup,
diff --git a/target/linux/brcm2708/patches-4.4/0423-Add-support-for-Dion-Audio-LOCO-DAC-AMP-HAT.patch b/target/linux/brcm2708/patches-4.4/0423-Add-support-for-Dion-Audio-LOCO-DAC-AMP-HAT.patch
deleted file mode 100644 (file)
index fd411d8..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-From 6fa4c2110478a814a9dd44d64522e7a81a1a2793 Mon Sep 17 00:00:00 2001
-From: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
-Date: Sat, 2 Jul 2016 16:26:19 +0100
-Subject: [PATCH 423/423] Add support for Dion Audio LOCO DAC-AMP HAT
-
-Using dedicated machine driver and pcm5102a codec driver.
-
-Signed-off-by: DigitalDreamtime <clive.messer@digitaldreamtime.co.uk>
----
- arch/arm/boot/dts/overlays/Makefile                |   1 +
- arch/arm/boot/dts/overlays/README                  |   6 +
- .../boot/dts/overlays/dionaudio-loco-overlay.dts   |  39 +++++++
- arch/arm/configs/bcm2709_defconfig                 |   1 +
- arch/arm/configs/bcmrpi_defconfig                  |   1 +
- sound/soc/bcm/Kconfig                              |   7 ++
- sound/soc/bcm/Makefile                             |   3 +-
- sound/soc/bcm/dionaudio_loco.c                     | 121 +++++++++++++++++++++
- 8 files changed, 178 insertions(+), 1 deletion(-)
- create mode 100644 arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts
- create mode 100644 sound/soc/bcm/dionaudio_loco.c
-
---- a/arch/arm/boot/dts/overlays/Makefile
-+++ b/arch/arm/boot/dts/overlays/Makefile
-@@ -20,6 +20,7 @@ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtb
- dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
-+dtbo-$(RPI_DT_OVERLAYS) += dionaudio-loco.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dpi24.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dwc-otg.dtbo
- dtbo-$(RPI_DT_OVERLAYS) += dwc2.dtbo
---- a/arch/arm/boot/dts/overlays/README
-+++ b/arch/arm/boot/dts/overlays/README
-@@ -268,6 +268,12 @@ Params: gpiopin                 GPIO con
-                                 (default 4)
-+Name:   dionaudio-loco
-+Info:   Configures the Dion Audio LOCO DAC-AMP
-+Load:   dtoverlay=dionaudio-loco
-+Params: <None>
-+
-+
- Name:   dpi24
- Info:   Overlay for a generic 24-bit DPI display
-         This uses GPIOs 0-27 (so no I2C, uart etc.), and activates the output
---- /dev/null
-+++ b/arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts
-@@ -0,0 +1,39 @@
-+// Definitions for Dion Audio LOCO DAC-AMP
-+
-+/*
-+ * PCM5242 DAC (in hardware mode) and TPA3118 AMP.
-+ */
-+
-+/dts-v1/;
-+/plugin/;
-+
-+/ {
-+      compatible = "brcm,bcm2708";
-+
-+      fragment@0 {
-+              target = <&i2s>;
-+              __overlay__ {
-+                      status = "okay";
-+              };
-+      };
-+
-+      fragment@1 {
-+              target-path = "/";
-+              __overlay__ {
-+                      pcm5102a-codec {
-+                              #sound-dai-cells = <0>;
-+                              compatible = "ti,pcm5102a";
-+                              status = "okay";
-+                      };
-+              };
-+      };
-+
-+      fragment@2 {
-+              target = <&sound>;
-+              __overlay__ {
-+                      compatible = "dionaudio,loco-pcm5242-tpa3118";
-+                      i2s-controller = <&i2s>;
-+                      status = "okay";
-+              };
-+      };
-+};
---- a/arch/arm/configs/bcm2709_defconfig
-+++ b/arch/arm/configs/bcm2709_defconfig
-@@ -870,6 +870,7 @@ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
- CONFIG_SND_DIGIDAC1_SOUNDCARD=m
- CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
-+CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
- CONFIG_SND_SIMPLE_CARD=m
---- a/arch/arm/configs/bcmrpi_defconfig
-+++ b/arch/arm/configs/bcmrpi_defconfig
-@@ -862,6 +862,7 @@ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
- CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
- CONFIG_SND_DIGIDAC1_SOUNDCARD=m
- CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
-+CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m
- CONFIG_SND_SOC_ADAU1701=m
- CONFIG_SND_SOC_WM8804_I2C=m
- CONFIG_SND_SIMPLE_CARD=m
---- a/sound/soc/bcm/Kconfig
-+++ b/sound/soc/bcm/Kconfig
-@@ -107,3 +107,10 @@ config SND_DIGIDAC1_SOUNDCARD
-         select SND_SOC_WM8741
-         help
-          Say Y or M if you want to add support for Red Rocks Audio DigiDAC1 board.
-+
-+config SND_BCM2708_SOC_DIONAUDIO_LOCO
-+      tristate "Support for Dion Audio LOCO DAC-AMP"
-+      depends on SND_BCM2708_SOC_I2S || SND_BCM2835_SOC_I2S
-+      select SND_SOC_PCM5102a
-+      help
-+        Say Y or M if you want to add support for Dion Audio LOCO.
---- a/sound/soc/bcm/Makefile
-+++ b/sound/soc/bcm/Makefile
-@@ -18,6 +18,7 @@ snd-soc-iqaudio-digi-objs := iqaudio_dig
- snd-soc-raspidac3-objs := raspidac3.o
- snd-soc-audioinjector-pi-soundcard-objs := audioinjector-pi-soundcard.o
- snd-soc-digidac1-soundcard-objs := digidac1-soundcard.o
-+snd-soc-dionaudio-loco-objs := dionaudio_loco.o
- obj-$(CONFIG_SND_BCM2708_SOC_ADAU1977_ADC) += snd-soc-adau1977-adc.o
- obj-$(CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC) += snd-soc-hifiberry-dac.o
-@@ -33,4 +34,4 @@ obj-$(CONFIG_SND_BCM2708_SOC_IQAUDIO_DIG
- obj-$(CONFIG_SND_BCM2708_SOC_RASPIDAC3) += snd-soc-raspidac3.o
- obj-$(CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD) += snd-soc-audioinjector-pi-soundcard.o
- obj-$(CONFIG_SND_DIGIDAC1_SOUNDCARD) += snd-soc-digidac1-soundcard.o
--
-+obj-$(CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO) += snd-soc-dionaudio-loco.o
---- /dev/null
-+++ b/sound/soc/bcm/dionaudio_loco.c
-@@ -0,0 +1,121 @@
-+/*
-+ * ASoC Driver for Dion Audio LOCO DAC-AMP
-+ *
-+ * Author:      Miquel Blauw <info@dionaudio.nl>
-+ *              Copyright 2016
-+ *
-+ * Based on the software of the RPi-DAC writen by Florian Meier
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/jack.h>
-+
-+static int snd_rpi_dionaudio_loco_hw_params(
-+      struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-+
-+      unsigned int sample_bits =
-+              snd_pcm_format_physical_width(params_format(params));
-+
-+      return snd_soc_dai_set_bclk_ratio(cpu_dai, sample_bits * 2);
-+}
-+
-+/* machine stream operations */
-+static struct snd_soc_ops snd_rpi_dionaudio_loco_ops = {
-+      .hw_params = snd_rpi_dionaudio_loco_hw_params,
-+};
-+
-+static struct snd_soc_dai_link snd_rpi_dionaudio_loco_dai[] = {
-+{
-+      .name           = "DionAudio LOCO",
-+      .stream_name    = "DionAudio LOCO DAC-AMP",
-+      .cpu_dai_name   = "bcm2708-i2s.0",
-+      .codec_dai_name = "pcm5102a-hifi",
-+      .platform_name  = "bcm2708-i2s.0",
-+      .codec_name     = "pcm5102a-codec",
-+      .dai_fmt        = SND_SOC_DAIFMT_I2S |
-+                        SND_SOC_DAIFMT_NB_NF |
-+                        SND_SOC_DAIFMT_CBS_CFS,
-+      .ops            = &snd_rpi_dionaudio_loco_ops,
-+},
-+};
-+
-+/* audio machine driver */
-+static struct snd_soc_card snd_rpi_dionaudio_loco = {
-+      .name           = "snd_rpi_dionaudio_loco",
-+      .dai_link       = snd_rpi_dionaudio_loco_dai,
-+      .num_links      = ARRAY_SIZE(snd_rpi_dionaudio_loco_dai),
-+};
-+
-+static int snd_rpi_dionaudio_loco_probe(struct platform_device *pdev)
-+{
-+      struct device_node *np;
-+      int ret = 0;
-+
-+      snd_rpi_dionaudio_loco.dev = &pdev->dev;
-+
-+      np = pdev->dev.of_node;
-+      if (np) {
-+              struct snd_soc_dai_link *dai = &snd_rpi_dionaudio_loco_dai[0];
-+              struct device_node *i2s_np;
-+
-+              i2s_np = of_parse_phandle(np, "i2s-controller", 0);
-+              if (i2s_np) {
-+                      dai->cpu_dai_name = NULL;
-+                      dai->cpu_of_node = i2s_np;
-+                      dai->platform_name = NULL;
-+                      dai->platform_of_node = i2s_np;
-+              }
-+      }
-+
-+      ret = snd_soc_register_card(&snd_rpi_dionaudio_loco);
-+      if (ret)
-+              dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
-+                      ret);
-+
-+      return ret;
-+}
-+
-+static int snd_rpi_dionaudio_loco_remove(struct platform_device *pdev)
-+{
-+      return snd_soc_unregister_card(&snd_rpi_dionaudio_loco);
-+}
-+
-+static const struct of_device_id snd_rpi_dionaudio_loco_of_match[] = {
-+      { .compatible = "dionaudio,loco-pcm5242-tpa3118", },
-+      { /* sentinel */ },
-+};
-+MODULE_DEVICE_TABLE(of, snd_rpi_dionaudio_loco_of_match);
-+
-+static struct platform_driver snd_rpi_dionaudio_loco_driver = {
-+      .driver = {
-+              .name           = "snd-dionaudio-loco",
-+              .owner          = THIS_MODULE,
-+              .of_match_table = snd_rpi_dionaudio_loco_of_match,
-+      },
-+      .probe  = snd_rpi_dionaudio_loco_probe,
-+      .remove = snd_rpi_dionaudio_loco_remove,
-+};
-+
-+module_platform_driver(snd_rpi_dionaudio_loco_driver);
-+
-+MODULE_AUTHOR("Miquel Blauw <info@dionaudio.nl>");
-+MODULE_DESCRIPTION("ASoC Driver for DionAudio LOCO");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0424-BCM270X_DT-Declare-the-audio-PWM-pins-explicitly.patch b/target/linux/brcm2708/patches-4.4/0424-BCM270X_DT-Declare-the-audio-PWM-pins-explicitly.patch
new file mode 100644 (file)
index 0000000..c0f2c39
--- /dev/null
@@ -0,0 +1,122 @@
+From 4a1655a918b26f5d24d04b1bb798feb39982ac78 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 20 Jun 2016 13:21:26 +0100
+Subject: [PATCH] BCM270X_DT: Declare the audio PWM pins explicitly
+
+Make the audio driver's use of the PWM functions explicit. Overlays
+that want to use the PWM functionality for other purposes must
+disable the audio node.
+
+See: https://github.com/raspberrypi/linux/issues/1473
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 10 ++++++++++
+ arch/arm/boot/dts/bcm2708-rpi-b.dts      |  9 +++++++++
+ arch/arm/boot/dts/bcm2709-rpi-2-b.dts    | 10 ++++++++++
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts    | 10 ++++++++++
+ 4 files changed, 39 insertions(+)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts
+@@ -37,6 +37,11 @@
+               brcm,pins = <18 19 20 21>;
+               brcm,function = <4>; /* alt0 */
+       };
++
++      audio_pins: audio_pins {
++              brcm,pins = <40 45>;
++              brcm,function = <4>;
++      };
+ };
+ &sdhost {
+@@ -120,6 +125,11 @@
+       hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
++&audio {
++      pinctrl-names = "default";
++      pinctrl-0 = <&audio_pins>;
++};
++
+ / {
+       __overrides__ {
+               uart0 = <&uart0>,"status";
+--- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
+@@ -36,6 +36,10 @@
+       i2s_pins: i2s {
+               brcm,pins = <28 29 30 31>;
+               brcm,function = <6>; /* alt2 */
++
++      audio_pins: audio_pins {
++              brcm,pins = <40 45>;
++              brcm,function = <4>;
+       };
+ };
+@@ -114,6 +118,11 @@
+       hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
+ };
++&audio {
++      pinctrl-names = "default";
++      pinctrl-0 = <&audio_pins>;
++};
++
+ / {
+       __overrides__ {
+               uart0 = <&uart0>,"status";
+--- a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
++++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts
+@@ -37,6 +37,11 @@
+               brcm,pins = <18 19 20 21>;
+               brcm,function = <4>; /* alt0 */
+       };
++
++      audio_pins: audio_pins {
++              brcm,pins = <40 45>;
++              brcm,function = <4>;
++      };
+ };
+ &sdhost {
+@@ -120,6 +125,11 @@
+       hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
++&audio {
++      pinctrl-names = "default";
++      pinctrl-0 = <&audio_pins>;
++};
++
+ / {
+       __overrides__ {
+               uart0 = <&uart0>,"status";
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -61,6 +61,11 @@
+               brcm,function;
+               brcm,pull;
+       };
++
++      audio_pins: audio_pins {
++              brcm,pins = <40 41>;
++              brcm,function = <4>;
++      };
+ };
+ &sdhost {
+@@ -165,6 +170,11 @@
+       hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+ };
++&audio {
++      pinctrl-names = "default";
++      pinctrl-0 = <&audio_pins>;
++};
++
+ / {
+       chosen {
+               bootargs = "8250.nr_uarts=1";
diff --git a/target/linux/brcm2708/patches-4.4/0425-BCM270X_DT-Restore-lost-closing-brace.patch b/target/linux/brcm2708/patches-4.4/0425-BCM270X_DT-Restore-lost-closing-brace.patch
new file mode 100644 (file)
index 0000000..38e04aa
--- /dev/null
@@ -0,0 +1,20 @@
+From a9b472033e4d34df447f1bdf87d520137559bb66 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 12 Jul 2016 10:35:01 +0100
+Subject: [PATCH] BCM270X_DT: Restore lost closing brace.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708-rpi-b.dts | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-b.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts
+@@ -36,6 +36,7 @@
+       i2s_pins: i2s {
+               brcm,pins = <28 29 30 31>;
+               brcm,function = <6>; /* alt2 */
++      };
+       audio_pins: audio_pins {
+               brcm,pins = <40 45>;
diff --git a/target/linux/brcm2708/patches-4.4/0426-config-Add-driver-for-mcp23017-I2C-GPIO-expander.patch b/target/linux/brcm2708/patches-4.4/0426-config-Add-driver-for-mcp23017-I2C-GPIO-expander.patch
new file mode 100644 (file)
index 0000000..46a030c
--- /dev/null
@@ -0,0 +1,56 @@
+From 42700ba3ac2664f121b29892762b5c7eb2292fe1 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 14 Jul 2016 10:40:20 +0100
+Subject: [PATCH] config: Add driver for mcp23017 I2C GPIO expander
+
+There is already an overlay for the mcp23017 I2C GPIO expander,
+but it does nothing without the required driver module.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/configs/bcm2709_defconfig | 3 ++-
+ arch/arm/configs/bcmrpi_defconfig  | 3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/configs/bcm2709_defconfig
++++ b/arch/arm/configs/bcm2709_defconfig
+@@ -619,6 +619,7 @@ CONFIG_GPIO_SYSFS=y
+ CONFIG_GPIO_BCM_VIRT=y
+ CONFIG_GPIO_ARIZONA=m
+ CONFIG_GPIO_STMPE=y
++CONFIG_GPIO_MCP23S08=m
+ CONFIG_W1=m
+ CONFIG_W1_MASTER_DS2490=m
+ CONFIG_W1_MASTER_DS2482=m
+@@ -867,9 +868,9 @@ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
++CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+-CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -611,6 +611,7 @@ CONFIG_PPS_CLIENT_GPIO=m
+ CONFIG_GPIO_SYSFS=y
+ CONFIG_GPIO_ARIZONA=m
+ CONFIG_GPIO_STMPE=y
++CONFIG_GPIO_MCP23S08=m
+ CONFIG_W1=m
+ CONFIG_W1_MASTER_DS2490=m
+ CONFIG_W1_MASTER_DS2482=m
+@@ -859,9 +860,9 @@ CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m
+ CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m
+ CONFIG_SND_BCM2708_SOC_RASPIDAC3=m
++CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m
+ CONFIG_SND_DIGIDAC1_SOUNDCARD=m
+-CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m
+ CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m
+ CONFIG_SND_SOC_ADAU1701=m
+ CONFIG_SND_SOC_WM8804_I2C=m
diff --git a/target/linux/brcm2708/patches-4.4/0427-vchiq_arm-Avoid-use-of-mutex-in-add_completion.patch b/target/linux/brcm2708/patches-4.4/0427-vchiq_arm-Avoid-use-of-mutex-in-add_completion.patch
new file mode 100644 (file)
index 0000000..6dfecc0
--- /dev/null
@@ -0,0 +1,192 @@
+From 00d6172964200c5d72cef2264ff09d38f764bd69 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 20 Jun 2016 13:51:44 +0100
+Subject: [PATCH] vchiq_arm: Avoid use of mutex in add_completion
+
+Claiming the completion_mutex within add_completion did prevent some
+messages appearing twice, but provokes a deadlock caused by vcsm using
+vchiq within a page fault handler.
+
+Revert the use of completion_mutex, and instead fix the original
+problem using more memory barriers.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ .../vc04_services/interface/vchiq_arm/vchiq_arm.c  | 55 +++++++++++-----------
+ .../vc04_services/interface/vchiq_arm/vchiq_core.c | 14 ++++--
+ 2 files changed, 37 insertions(+), 32 deletions(-)
+
+--- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_arm.c
+@@ -64,10 +64,10 @@
+ #define VCHIQ_MINOR 0
+ /* Some per-instance constants */
+-#define MAX_COMPLETIONS 16
++#define MAX_COMPLETIONS 128
+ #define MAX_SERVICES 64
+ #define MAX_ELEMENTS 8
+-#define MSG_QUEUE_SIZE 64
++#define MSG_QUEUE_SIZE 128
+ #define KEEPALIVE_VER 1
+ #define KEEPALIVE_VER_MIN KEEPALIVE_VER
+@@ -208,28 +208,24 @@ add_completion(VCHIQ_INSTANCE_T instance
+       void *bulk_userdata)
+ {
+       VCHIQ_COMPLETION_DATA_T *completion;
++      int insert;
+       DEBUG_INITIALISE(g_state.local)
+-      mutex_lock(&instance->completion_mutex);
+-
+-      while (instance->completion_insert ==
+-              (instance->completion_remove + MAX_COMPLETIONS)) {
++      insert = instance->completion_insert;
++      while ((insert - instance->completion_remove) >= MAX_COMPLETIONS) {
+               /* Out of space - wait for the client */
+               DEBUG_TRACE(SERVICE_CALLBACK_LINE);
+               vchiq_log_trace(vchiq_arm_log_level,
+                       "add_completion - completion queue full");
+               DEBUG_COUNT(COMPLETION_QUEUE_FULL_COUNT);
+-              mutex_unlock(&instance->completion_mutex);
+               if (down_interruptible(&instance->remove_event) != 0) {
+                       vchiq_log_info(vchiq_arm_log_level,
+                               "service_callback interrupted");
+                       return VCHIQ_RETRY;
+               }
+-              mutex_lock(&instance->completion_mutex);
+               if (instance->closing) {
+-                      mutex_unlock(&instance->completion_mutex);
+                       vchiq_log_info(vchiq_arm_log_level,
+                               "service_callback closing");
+                       return VCHIQ_SUCCESS;
+@@ -237,9 +233,7 @@ add_completion(VCHIQ_INSTANCE_T instance
+               DEBUG_TRACE(SERVICE_CALLBACK_LINE);
+       }
+-      completion =
+-               &instance->completions[instance->completion_insert &
+-               (MAX_COMPLETIONS - 1)];
++      completion = &instance->completions[insert & (MAX_COMPLETIONS - 1)];
+       completion->header = header;
+       completion->reason = reason;
+@@ -260,12 +254,9 @@ add_completion(VCHIQ_INSTANCE_T instance
+       wmb();
+       if (reason == VCHIQ_MESSAGE_AVAILABLE)
+-              user_service->message_available_pos =
+-                      instance->completion_insert;
+-
+-      instance->completion_insert++;
++              user_service->message_available_pos = insert;
+-      mutex_unlock(&instance->completion_mutex);
++      instance->completion_insert = ++insert;
+       up(&instance->insert_event);
+@@ -795,6 +786,7 @@ vchiq_ioctl(struct file *file, unsigned
+                       instance->completion_insert)
+                       && !instance->closing) {
+                       int rc;
++
+                       DEBUG_TRACE(AWAIT_COMPLETION_LINE);
+                       mutex_unlock(&instance->completion_mutex);
+                       rc = down_interruptible(&instance->insert_event);
+@@ -809,24 +801,29 @@ vchiq_ioctl(struct file *file, unsigned
+               }
+               DEBUG_TRACE(AWAIT_COMPLETION_LINE);
+-              /* A read memory barrier is needed to stop prefetch of a stale
+-              ** completion record
+-              */
+-              rmb();
+-
+               if (ret == 0) {
+                       int msgbufcount = args.msgbufcount;
++                      int remove;
++
++                      remove = instance->completion_remove;
++
+                       for (ret = 0; ret < args.count; ret++) {
+                               VCHIQ_COMPLETION_DATA_T *completion;
+                               VCHIQ_SERVICE_T *service;
+                               USER_SERVICE_T *user_service;
+                               VCHIQ_HEADER_T *header;
+-                              if (instance->completion_remove ==
+-                                      instance->completion_insert)
++
++                              if (remove == instance->completion_insert)
+                                       break;
++
+                               completion = &instance->completions[
+-                                      instance->completion_remove &
+-                                      (MAX_COMPLETIONS - 1)];
++                                      remove & (MAX_COMPLETIONS - 1)];
++
++
++                              /* A read memory barrier is needed to prevent
++                              ** the prefetch of a stale completion record
++                              */
++                              rmb();
+                               service = completion->service_userdata;
+                               user_service = service->base.userdata;
+@@ -903,7 +900,11 @@ vchiq_ioctl(struct file *file, unsigned
+                                       break;
+                               }
+-                              instance->completion_remove++;
++                              /* Ensure that the above copy has completed
++                              ** before advancing the remove pointer. */
++                              mb();
++
++                              instance->completion_remove = ++remove;
+                       }
+                       if (msgbufcount != args.msgbufcount) {
+--- a/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
++++ b/drivers/misc/vc04_services/interface/vchiq_arm/vchiq_core.c
+@@ -610,15 +610,15 @@ process_free_queue(VCHIQ_STATE_T *state)
+       BITSET_T service_found[BITSET_SIZE(VCHIQ_MAX_SERVICES)];
+       int slot_queue_available;
+-      /* Use a read memory barrier to ensure that any state that may have
+-      ** been modified by another thread is not masked by stale prefetched
+-      ** values. */
+-      rmb();
+-
+       /* Find slots which have been freed by the other side, and return them
+       ** to the available queue. */
+       slot_queue_available = state->slot_queue_available;
++      /* Use a memory barrier to ensure that any state that may have been
++      ** modified by another thread is not masked by stale prefetched
++      ** values. */
++      mb();
++
+       while (slot_queue_available != local->slot_queue_recycle) {
+               unsigned int pos;
+               int slot_index = local->slot_queue[slot_queue_available++ &
+@@ -626,6 +626,8 @@ process_free_queue(VCHIQ_STATE_T *state)
+               char *data = (char *)SLOT_DATA_FROM_INDEX(state, slot_index);
+               int data_found = 0;
++              rmb();
++
+               vchiq_log_trace(vchiq_core_log_level, "%d: pfq %d=%x %x %x",
+                       state->id, slot_index, (unsigned int)data,
+                       local->slot_queue_recycle, slot_queue_available);
+@@ -741,6 +743,8 @@ process_free_queue(VCHIQ_STATE_T *state)
+                               up(&state->data_quota_event);
+               }
++              mb();
++
+               state->slot_queue_available = slot_queue_available;
+               up(&state->slot_available_event);
+       }
diff --git a/target/linux/brcm2708/patches-4.4/0428-bcm2708_fb-Default-framebuffer-to-32-bit.patch b/target/linux/brcm2708/patches-4.4/0428-bcm2708_fb-Default-framebuffer-to-32-bit.patch
new file mode 100644 (file)
index 0000000..9f3ec1f
--- /dev/null
@@ -0,0 +1,21 @@
+From bf38f441ef6cbc85f8232f4a43e19557c89ad21c Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Thu, 28 Jul 2016 12:15:47 +0100
+Subject: [PATCH] bcm2708_fb: Default framebuffer to 32-bit
+
+Can be overridden with framebuffer_depth=16 in config.txt for old behaviour
+---
+ drivers/video/fbdev/bcm2708_fb.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/video/fbdev/bcm2708_fb.c
++++ b/drivers/video/fbdev/bcm2708_fb.c
+@@ -51,7 +51,7 @@ static const char *bcm2708_name = "BCM27
+ static int fbwidth = 800;  /* module parameter */
+ static int fbheight = 480; /* module parameter */
+-static int fbdepth = 16;   /* module parameter */
++static int fbdepth = 32;   /* module parameter */
+ static int fbswap = 0;     /* module parameter */
+ static u32 dma_busy_wait_threshold = 1<<15;
diff --git a/target/linux/brcm2708/patches-4.4/0429-fix-auto-sense-in-lirc_rpi-driver.patch b/target/linux/brcm2708/patches-4.4/0429-fix-auto-sense-in-lirc_rpi-driver.patch
new file mode 100644 (file)
index 0000000..4857620
--- /dev/null
@@ -0,0 +1,45 @@
+From 7e5bbf1a74ec6bbaa25fe6cadf715946e3e4d692 Mon Sep 17 00:00:00 2001
+From: Ingo Kresse <ingo.kresse@gmail.com>
+Date: Fri, 29 Jul 2016 22:50:21 +0000
+Subject: [PATCH] fix auto-sense in lirc_rpi driver
+
+On a Raspberry Pi 2, the lirc_rpi driver might receive spurious
+interrupts and change it's low-active / high-active setting.
+When this happens, the IR remote control stops working.
+
+This patch disables this auto-detection if the 'sense' parameter
+was set in the device tree, making the driver robust to such
+spurious interrupts.
+---
+ drivers/staging/media/lirc/lirc_rpi.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/staging/media/lirc/lirc_rpi.c
++++ b/drivers/staging/media/lirc/lirc_rpi.c
+@@ -79,6 +79,7 @@ static bool invert = 0;
+ struct gpio_chip *gpiochip;
+ static int irq_num;
++static int auto_sense = 1;
+ /* forward declarations */
+ static long send_pulse(unsigned long length);
+@@ -279,7 +280,9 @@ static irqreturn_t irq_handler(int i, vo
+                                * detecting pulse while this
+                                * MUST be a space!
+                                */
+-                              sense = sense ? 0 : 1;
++                              if (auto_sense) {
++                                      sense = sense ? 0 : 1;
++                              }
+                       }
+               } else {
+                       data = (int) (deltv*1000000 +
+@@ -417,6 +420,7 @@ static int init_port(void)
+               printk(KERN_INFO LIRC_DRIVER_NAME
+                      ": manually using active %s receiver on GPIO pin %d\n",
+                      sense ? "low" : "high", gpio_in_pin);
++              auto_sense = 0;
+       }
+       return 0;
diff --git a/target/linux/brcm2708/patches-4.4/0430-enable-gembird-joypad-support.patch b/target/linux/brcm2708/patches-4.4/0430-enable-gembird-joypad-support.patch
new file mode 100644 (file)
index 0000000..2216661
--- /dev/null
@@ -0,0 +1,30 @@
+From 71a05d081ab744650deae9bc9008739ad16581f5 Mon Sep 17 00:00:00 2001
+From: Jools Wills <buzz@exotica.org.uk>
+Date: Mon, 8 Aug 2016 11:04:29 +0100
+Subject: [PATCH] enable gembird joypad support
+
+---
+ 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
+@@ -891,6 +891,7 @@ CONFIG_HID_EMS_FF=m
+ CONFIG_HID_ELECOM=m
+ CONFIG_HID_ELO=m
+ CONFIG_HID_EZKEY=m
++CONFIG_HID_GEMBIRD=m
+ CONFIG_HID_HOLTEK=m
+ CONFIG_HID_KEYTOUCH=m
+ CONFIG_HID_KYE=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -883,6 +883,7 @@ CONFIG_HID_EMS_FF=m
+ CONFIG_HID_ELECOM=m
+ CONFIG_HID_ELO=m
+ CONFIG_HID_EZKEY=m
++CONFIG_HID_GEMBIRD=m
+ CONFIG_HID_HOLTEK=m
+ CONFIG_HID_KEYTOUCH=m
+ CONFIG_HID_KYE=m
diff --git a/target/linux/brcm2708/patches-4.4/0431-Added-HiFiBerry-Digi-Pro-driver.patch b/target/linux/brcm2708/patches-4.4/0431-Added-HiFiBerry-Digi-Pro-driver.patch
new file mode 100644 (file)
index 0000000..c718209
--- /dev/null
@@ -0,0 +1,187 @@
+From e528c5d3f8cffca37abf9c69f7178f0221974225 Mon Sep 17 00:00:00 2001
+From: "Daniel Matuschek (HiFiBerry)" <daniel@hifiberry.com>
+Date: Tue, 26 Jul 2016 19:16:25 +0200
+Subject: [PATCH] Added HiFiBerry Digi+ Pro driver
+
+Signed-off-by: Daniel Matuschek <daniel@hifiberry.com>
+---
+ arch/arm/boot/dts/overlays/Makefile                |  1 +
+ arch/arm/boot/dts/overlays/README                  |  8 +++-
+ .../dts/overlays/hifiberry-digi-pro-overlay.dts    | 41 +++++++++++++++++
+ sound/soc/bcm/hifiberry_digi.c                     | 51 ++++++++++++++++++++++
+ 4 files changed, 100 insertions(+), 1 deletion(-)
+ create mode 100644 arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -31,6 +31,7 @@ dtbo-$(RPI_DT_OVERLAYS) += hifiberry-amp
+ 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) += hifiberry-digi-pro.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += hy28a.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += hy28b.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += i2c-gpio.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -377,11 +377,17 @@ Params: 24db_digital_gain       Allow ga
+ Name:   hifiberry-digi
+-Info:   Configures the HifiBerry Digi audio card
++Info:   Configures the HifiBerry Digi and Digi+ audio card
+ Load:   dtoverlay=hifiberry-digi
+ Params: <None>
++Name:   hifiberry-digi-pro
++Info:   Configures the HifiBerry Digi+ Pro audio card
++Load:   dtoverlay=hifiberry-digi-pro
++Params: <None>
++
++
+ Name:   hy28a
+ Info:   HY28A - 2.8" TFT LCD Display Module by HAOYU Electronics
+         Default values match Texy's display shield
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts
+@@ -0,0 +1,41 @@
++// Definitions for HiFiBerry Digi Pro
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2708";
++
++      fragment@0 {
++              target = <&i2s>;
++              __overlay__ {
++                      status = "okay";
++              };
++      };
++
++      fragment@1 {
++              target = <&i2c1>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      wm8804@3b {
++                              #sound-dai-cells = <0>;
++                              compatible = "wlf,wm8804";
++                              reg = <0x3b>;
++                              status = "okay";
++                      };
++              };
++      };
++
++      fragment@2 {
++              target = <&sound>;
++              __overlay__ {
++                      compatible = "hifiberry,hifiberry-digi";
++                      i2s-controller = <&i2s>;
++                      status = "okay";
++                      clock44-gpio = <&gpio 5 0>;
++                      clock48-gpio = <&gpio 6 0>;
++              };
++      };
++};
+--- a/sound/soc/bcm/hifiberry_digi.c
++++ b/sound/soc/bcm/hifiberry_digi.c
+@@ -23,6 +23,7 @@
+ #include <sound/pcm_params.h>
+ #include <sound/soc.h>
+ #include <sound/jack.h>
++#include <linux/gpio/consumer.h>
+ #include "../codecs/wm8804.h"
+@@ -30,9 +31,34 @@ static short int auto_shutdown_output =
+ module_param(auto_shutdown_output, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+ MODULE_PARM_DESC(auto_shutdown_output, "Shutdown SP/DIF output if playback is stopped");
++#define CLK_44EN_RATE 22579200UL
++#define CLK_48EN_RATE 24576000UL
++
++static bool snd_rpi_hifiberry_is_digipro;
++static struct gpio_desc *snd_rpi_hifiberry_clk44gpio;
++static struct gpio_desc *snd_rpi_hifiberry_clk48gpio;
+ static int samplerate=44100;
++static uint32_t snd_rpi_hifiberry_digi_enable_clock(int sample_rate)
++{
++      switch (sample_rate) {
++      case 11025:
++      case 22050:
++      case 44100:
++      case 88200:
++      case 176400:
++              gpiod_set_value_cansleep(snd_rpi_hifiberry_clk44gpio, 1);
++              gpiod_set_value_cansleep(snd_rpi_hifiberry_clk48gpio, 0);
++              return CLK_44EN_RATE;
++      default:
++              gpiod_set_value_cansleep(snd_rpi_hifiberry_clk48gpio, 1);
++              gpiod_set_value_cansleep(snd_rpi_hifiberry_clk44gpio, 0);
++              return CLK_48EN_RATE;
++      }
++}
++
++
+ static int snd_rpi_hifiberry_digi_init(struct snd_soc_pcm_runtime *rtd)
+ {
+       struct snd_soc_codec *codec = rtd->codec;
+@@ -40,6 +66,14 @@ static int snd_rpi_hifiberry_digi_init(s
+       /* enable TX output */
+       snd_soc_update_bits(codec, WM8804_PWRDN, 0x4, 0x0);
++      /* Initialize Digi+ Pro hardware */
++      if (snd_rpi_hifiberry_is_digipro) {
++              struct snd_soc_dai_link *dai = rtd->dai_link;
++
++              dai->name = "HiFiBerry Digi+ Pro";
++              dai->stream_name = "HiFiBerry Digi+ Pro HiFi";
++      }
++
+       return 0;
+ }
+@@ -87,6 +121,9 @@ static int snd_rpi_hifiberry_digi_hw_par
+               mclk_freq=samplerate*128;
+               mclk_div=WM8804_MCLKDIV_128FS;
+       }
++
++      if (snd_rpi_hifiberry_is_digipro)
++              sysclk = snd_rpi_hifiberry_digi_enable_clock(samplerate);
+       
+       switch (samplerate) {
+               case 32000:
+@@ -121,6 +158,7 @@ static int snd_rpi_hifiberry_digi_hw_par
+       ret = snd_soc_dai_set_sysclk(codec_dai, WM8804_TX_CLKSRC_PLL,
+                                       sysclk, SND_SOC_CLOCK_OUT);
++
+       if (ret < 0) {
+               dev_err(codec->dev,
+               "Failed to set WM8804 SYSCLK: %d\n", ret);
+@@ -187,6 +225,19 @@ static int snd_rpi_hifiberry_digi_probe(
+               dai->platform_name = NULL;
+               dai->platform_of_node = i2s_node;
+           }
++
++          snd_rpi_hifiberry_is_digipro = 1;
++
++          snd_rpi_hifiberry_clk44gpio =
++              devm_gpiod_get(&pdev->dev, "clock44", GPIOD_OUT_LOW);
++          if (IS_ERR(snd_rpi_hifiberry_clk44gpio))
++              snd_rpi_hifiberry_is_digipro = 0;
++
++          snd_rpi_hifiberry_clk48gpio =
++              devm_gpiod_get(&pdev->dev, "clock48", GPIOD_OUT_LOW);
++          if (IS_ERR(snd_rpi_hifiberry_clk48gpio))
++              snd_rpi_hifiberry_is_digipro = 0;
++
+       }
+       ret = snd_soc_register_card(&snd_rpi_hifiberry_digi);
diff --git a/target/linux/brcm2708/patches-4.4/0432-clk-bcm2835-Mark-the-CM-SDRAM-clock-s-parent-as-crit.patch b/target/linux/brcm2708/patches-4.4/0432-clk-bcm2835-Mark-the-CM-SDRAM-clock-s-parent-as-crit.patch
new file mode 100644 (file)
index 0000000..a24afc8
--- /dev/null
@@ -0,0 +1,73 @@
+From a916fdb4aef02300a69cb49fb20f36ab4dc91673 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Wed, 1 Jun 2016 12:05:35 -0700
+Subject: [PATCH] clk: bcm2835: Mark the CM SDRAM clock's parent as critical
+
+While the SDRAM is being driven by its dedicated PLL most of the time,
+there is a little loop running in the firmware that periodically turns
+on the CM SDRAM clock (using its pre-initialized parent) and switches
+SDRAM to using the CM clock to do PVT recalibration.
+
+This avoids system hangs if we choose SDRAM's parent for some other
+clock, then disable that clock.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/clk/bcm/clk-bcm2835.c | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -36,6 +36,7 @@
+ #include <linux/clk-provider.h>
+ #include <linux/clkdev.h>
++#include <linux/clk.h>
+ #include <linux/clk/bcm2835.h>
+ #include <linux/debugfs.h>
+ #include <linux/module.h>
+@@ -1839,6 +1840,25 @@ static const struct bcm2835_clk_desc clk
+               .ctl_reg = CM_PERIICTL),
+ };
++/*
++ * Permanently take a reference on the parent of the SDRAM clock.
++ *
++ * While the SDRAM is being driven by its dedicated PLL most of the
++ * time, there is a little loop running in the firmware that
++ * periodically switches the SDRAM to using our CM clock to do PVT
++ * recalibration, with the assumption that the previously configured
++ * SDRAM parent is still enabled and running.
++ */
++static int bcm2835_mark_sdc_parent_critical(struct clk *sdc)
++{
++      struct clk *parent = clk_get_parent(sdc);
++
++      if (IS_ERR(parent))
++              return PTR_ERR(parent);
++
++      return clk_prepare_enable(parent);
++}
++
+ static int bcm2835_clk_probe(struct platform_device *pdev)
+ {
+       struct device *dev = &pdev->dev;
+@@ -1848,6 +1868,7 @@ static int bcm2835_clk_probe(struct plat
+       const struct bcm2835_clk_desc *desc;
+       const size_t asize = ARRAY_SIZE(clk_desc_array);
+       size_t i;
++      int ret;
+       cprman = devm_kzalloc(dev,
+                             sizeof(*cprman) + asize * sizeof(*clks),
+@@ -1878,6 +1899,10 @@ static int bcm2835_clk_probe(struct plat
+                       clks[i] = desc->clk_register(cprman, desc->data);
+       }
++      ret = bcm2835_mark_sdc_parent_critical(clks[BCM2835_CLOCK_SDRAM]);
++      if (ret)
++              return ret;
++
+       return of_clk_add_provider(dev->of_node, of_clk_src_onecell_get,
+                                  &cprman->onecell);
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0433-clk-bcm2835-Don-t-rate-change-PLLs-on-behalf-of-divi.patch b/target/linux/brcm2708/patches-4.4/0433-clk-bcm2835-Don-t-rate-change-PLLs-on-behalf-of-divi.patch
new file mode 100644 (file)
index 0000000..717c95b
--- /dev/null
@@ -0,0 +1,27 @@
+From 523bd5057f674fec3006af36a1aaca2480cb09c6 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 31 Mar 2016 12:51:04 -0700
+Subject: [PATCH] clk: bcm2835: Don't rate change PLLs on behalf of dividers.
+
+Our core PLLs are intended to be configured once and left alone.  With
+the flag set, asking to set the PLLD_DSI1 clock rate would change PLLD
+just to get closer to the requested DSI clock, thus changing PLLD_PER,
+the UART and ethernet PHY clock rates downstream of it, and breaking
+ethernet.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/clk/bcm/clk-bcm2835.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -1209,7 +1209,7 @@ bcm2835_register_pll_divider(struct bcm2
+       init.num_parents = 1;
+       init.name = divider_name;
+       init.ops = &bcm2835_pll_divider_clk_ops;
+-      init.flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED;
++      init.flags = CLK_IGNORE_UNUSED;
+       divider = devm_kzalloc(cprman->dev, sizeof(*divider), GFP_KERNEL);
+       if (!divider)
diff --git a/target/linux/brcm2708/patches-4.4/0434-clk-bcm2835-Do-appropriate-name-lookups-for-DSI1-s-p.patch b/target/linux/brcm2708/patches-4.4/0434-clk-bcm2835-Do-appropriate-name-lookups-for-DSI1-s-p.patch
new file mode 100644 (file)
index 0000000..ab7eff3
--- /dev/null
@@ -0,0 +1,125 @@
+From b0fde8ea889e47505e4112d89da4be9469a37775 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 14 Apr 2016 15:13:53 -0700
+Subject: [PATCH] clk: bcm2835: Do appropriate name lookups for DSI1's parents
+ as well.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ .../bindings/clock/brcm,bcm2835-cprman.txt         | 12 ++++-
+ drivers/clk/bcm/clk-bcm2835.c                      | 54 +++++++++++++++++-----
+ 2 files changed, 54 insertions(+), 12 deletions(-)
+
+--- a/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt
++++ b/Documentation/devicetree/bindings/clock/brcm,bcm2835-cprman.txt
+@@ -16,7 +16,17 @@ Required properties:
+ - #clock-cells:       Should be <1>. The permitted clock-specifier values can be
+                 found in include/dt-bindings/clock/bcm2835.h
+ - reg:                Specifies base physical address and size of the registers
+-- clocks:     The external oscillator clock phandle
++- clocks:     phandles to the parent clocks used as input to the module, in
++                the following order:
++
++                - External oscillator
++                - DSI1 byte clock
++                - DSI1 DDR2 clock
++                - DSI1 DDR clock
++
++                Only external oscillator is required.  The DSI clocks may
++                not be present, in which case their children will be
++                unusable.
+ Example:
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -297,11 +297,29 @@
+ #define LOCK_TIMEOUT_NS               100000000
+ #define BCM2835_MAX_FB_RATE   1750000000u
++/*
++ * Names of clocks used within the driver that need to be replaced
++ * with an external parent's name.  This array is in the order that
++ * the clocks node in the DT references external clocks.
++ */
++static const char *cprman_parent_names[] = {
++      "xosc",
++      "dsi1_byte",
++      "dsi1_ddr2",
++      "dsi1_ddr",
++};
++
+ struct bcm2835_cprman {
+       struct device *dev;
+       void __iomem *regs;
+       spinlock_t regs_lock; /* spinlock for all clocks */
+-      const char *osc_name;
++
++      /*
++       * Real names of cprman clock parents looked up through
++       * of_clk_get_parent_name(), which will be used in the
++       * parent_names[] arrays for clock registration.
++       */
++      const char *real_parent_names[ARRAY_SIZE(cprman_parent_names)];
+       struct clk_onecell_data onecell;
+       struct clk *clks[];
+@@ -1168,7 +1186,7 @@ static struct clk *bcm2835_register_pll(
+       memset(&init, 0, sizeof(init));
+       /* All of the PLLs derive from the external oscillator. */
+-      init.parent_names = &cprman->osc_name;
++      init.parent_names = &cprman->real_parent_names[0];
+       init.num_parents = 1;
+       init.name = data->name;
+       init.ops = &bcm2835_pll_clk_ops;
+@@ -1251,17 +1269,21 @@ static struct clk *bcm2835_register_cloc
+       struct bcm2835_clock *clock;
+       struct clk_init_data init;
+       const char *parents[1 << CM_SRC_BITS];
+-      size_t i;
++      size_t i, j;
+       /*
+-       * Replace our "xosc" references with the oscillator's
+-       * actual name.
++       * Replace our strings referencing parent clocks with the
++       * actual clock-output-name of the parent.
+        */
+       for (i = 0; i < data->num_mux_parents; i++) {
+-              if (strcmp(data->parents[i], "xosc") == 0)
+-                      parents[i] = cprman->osc_name;
+-              else
+-                      parents[i] = data->parents[i];
++              parents[i] = data->parents[i];
++
++              for (j = 0; j < ARRAY_SIZE(cprman_parent_names); j++) {
++                      if (strcmp(parents[i], cprman_parent_names[j]) == 0) {
++                              parents[i] = cprman->real_parent_names[j];
++                              break;
++                      }
++              }
+       }
+       memset(&init, 0, sizeof(init));
+@@ -1883,8 +1905,18 @@ static int bcm2835_clk_probe(struct plat
+       if (IS_ERR(cprman->regs))
+               return PTR_ERR(cprman->regs);
+-      cprman->osc_name = of_clk_get_parent_name(dev->of_node, 0);
+-      if (!cprman->osc_name)
++      for (i = 0; i < ARRAY_SIZE(cprman_parent_names); i++) {
++              cprman->real_parent_names[i] =
++                      of_clk_get_parent_name(dev->of_node, i);
++      }
++      /*
++       * Make sure the external oscillator has been registered.
++       *
++       * The other (DSI) clocks are not present on older device
++       * trees, which we still need to support for backwards
++       * compatibility.
++       */
++      if (!cprman->real_parent_names[0])
+               return -ENODEV;
+       platform_set_drvdata(pdev, cprman);
diff --git a/target/linux/brcm2708/patches-4.4/0435-clk-bcm2835-Add-an-enum-for-the-DSI1-pixel-clock.patch b/target/linux/brcm2708/patches-4.4/0435-clk-bcm2835-Add-an-enum-for-the-DSI1-pixel-clock.patch
new file mode 100644 (file)
index 0000000..db3201e
--- /dev/null
@@ -0,0 +1,87 @@
+From 719dcb9b9bc907dafeb20fbbf4895f928dafa353 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 14 Apr 2016 19:00:33 -0700
+Subject: [PATCH] clk: bcm2835: Add an enum for the DSI1 pixel clock.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/clk/bcm/clk-bcm2835.c       | 39 +++++++++++++++++++++++++++++++++++--
+ include/dt-bindings/clock/bcm2835.h |  1 +
+ 2 files changed, 38 insertions(+), 2 deletions(-)
+
+--- a/drivers/clk/bcm/clk-bcm2835.c
++++ b/drivers/clk/bcm/clk-bcm2835.c
+@@ -934,6 +934,9 @@ static long bcm2835_clock_rate_from_divi
+       const struct bcm2835_clock_data *data = clock->data;
+       u64 temp;
++      if (data->int_bits == 0 && data->frac_bits == 0)
++              return parent_rate;
++
+       /*
+        * The divisor is a 12.12 fixed point field, but only some of
+        * the bits are populated in any given clock.
+@@ -957,7 +960,12 @@ static unsigned long bcm2835_clock_get_r
+       struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
+       struct bcm2835_cprman *cprman = clock->cprman;
+       const struct bcm2835_clock_data *data = clock->data;
+-      u32 div = cprman_read(cprman, data->div_reg);
++      u32 div;
++
++      if (data->int_bits == 0 && data->frac_bits == 0)
++              return parent_rate;
++
++      div = cprman_read(cprman, data->div_reg);
+       return bcm2835_clock_rate_from_divisor(clock, parent_rate, div);
+ }
+@@ -1403,6 +1411,28 @@ static const char *const bcm2835_clock_v
+       __VA_ARGS__)
+ /*
++ * DSI1 parent clocks.  The DSI1 byte clock comes from the DSI1 PHY,
++ * which in turn sources from plld_dsi1.
++ */
++static const char *const bcm2835_clock_dsi1_parents[] = {
++      "gnd",
++      "xosc",
++      "testdebug0",
++      "testdebug1",
++      "dsi1_ddr",
++      "dsi1_ddr_inv",
++      "dsi1_ddr2",
++      "dsi1_ddr2_inv",
++      "dsi1_byte",
++      "dsi1_byte_inv",
++};
++
++#define REGISTER_DSI1_CLK(...)        REGISTER_CLK(                           \
++      .num_mux_parents = ARRAY_SIZE(bcm2835_clock_dsi1_parents),      \
++      .parents = bcm2835_clock_dsi1_parents,                          \
++      __VA_ARGS__)
++
++/*
+  * the real definition of all the pll, pll_dividers and clocks
+  * these make use of the above REGISTER_* macros
+  */
+@@ -1847,7 +1877,12 @@ static const struct bcm2835_clk_desc clk
+               .div_reg = CM_DSI1EDIV,
+               .int_bits = 4,
+               .frac_bits = 8),
+-
++      [BCM2835_CLOCK_DSI1P]   = REGISTER_DSI1_CLK(
++              .name = "dsi1p",
++              .ctl_reg = CM_DSI1PCTL,
++              .div_reg = CM_DSI1PDIV,
++              .int_bits = 0,
++              .frac_bits = 0),
+       /* the gates */
+       /*
+--- a/include/dt-bindings/clock/bcm2835.h
++++ b/include/dt-bindings/clock/bcm2835.h
+@@ -64,3 +64,4 @@
+ #define BCM2835_CLOCK_CAM1            46
+ #define BCM2835_CLOCK_DSI0E           47
+ #define BCM2835_CLOCK_DSI1E           48
++#define BCM2835_CLOCK_DSI1P           49
diff --git a/target/linux/brcm2708/patches-4.4/0436-drm-fb_cma_helper-Remove-implicit-call-to-disable_un.patch b/target/linux/brcm2708/patches-4.4/0436-drm-fb_cma_helper-Remove-implicit-call-to-disable_un.patch
new file mode 100644 (file)
index 0000000..431e0d9
--- /dev/null
@@ -0,0 +1,79 @@
+From 64eb54a20a8624412ba45bf453b8588e7e6a2c53 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime.ripard@free-electrons.com>
+Date: Thu, 14 Jan 2016 16:24:56 +0100
+Subject: [PATCH] drm/fb_cma_helper: Remove implicit call to
+ disable_unused_functions
+
+The drm_fbdev_cma_init function always calls the
+drm_helper_disable_unused_functions. Since it's part of the usual probe
+process, all the drivers using that helper will end up having their encoder
+and CRTC disable functions called at probe if their device has not been
+reported as enabled.
+
+This could be fixed by reading out from the registers the current state of
+the device if it is enabled, but even that will not handle the case where
+the device is actually disabled.
+
+Moreover, the drivers using the atomic modesetting expect that their enable
+and disable callback to be called when the device is already enabled or
+disabled (respectively).
+
+We can however fix this issue by moving the call to
+drm_helper_disable_unused_functions out of drm_fbdev_cma_init and make the
+drivers needing it (all the drivers calling drm_fbdev_cma_init and not
+using the atomic modesetting) explicitly call it.
+
+Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/1452785109-6172-14-git-send-email-maxime.ripard@free-electrons.com
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+(cherry picked from commit 4314e19ef4ae0ba8872bd8610f6fef5e8743e236)
+---
+ drivers/gpu/drm/drm_fb_cma_helper.c | 3 ---
+ drivers/gpu/drm/imx/imx-drm-core.c  | 1 +
+ drivers/gpu/drm/sti/sti_drv.c       | 1 +
+ drivers/gpu/drm/tilcdc/tilcdc_drv.c | 1 +
+ 4 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/drm_fb_cma_helper.c
++++ b/drivers/gpu/drm/drm_fb_cma_helper.c
+@@ -348,9 +348,6 @@ struct drm_fbdev_cma *drm_fbdev_cma_init
+       }
+-      /* disable all the possible outputs/crtcs before entering KMS mode */
+-      drm_helper_disable_unused_functions(dev);
+-
+       ret = drm_fb_helper_initial_config(helper, preferred_bpp);
+       if (ret < 0) {
+               dev_err(dev->dev, "Failed to set initial hw configuration.\n");
+--- a/drivers/gpu/drm/imx/imx-drm-core.c
++++ b/drivers/gpu/drm/imx/imx-drm-core.c
+@@ -313,6 +313,7 @@ static int imx_drm_driver_load(struct dr
+               dev_warn(drm->dev, "Invalid legacyfb_depth.  Defaulting to 16bpp\n");
+               legacyfb_depth = 16;
+       }
++      drm_helper_disable_unused_functions(drm);
+       imxdrm->fbhelper = drm_fbdev_cma_init(drm, legacyfb_depth,
+                               drm->mode_config.num_crtc, MAX_CRTC);
+       if (IS_ERR(imxdrm->fbhelper)) {
+--- a/drivers/gpu/drm/sti/sti_drv.c
++++ b/drivers/gpu/drm/sti/sti_drv.c
+@@ -160,6 +160,7 @@ static int sti_load(struct drm_device *d
+       drm_mode_config_reset(dev);
++      drm_helper_disable_unused_functions(dev);
+       drm_fbdev_cma_init(dev, 32,
+                          dev->mode_config.num_crtc,
+                          dev->mode_config.num_connector);
+--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
++++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+@@ -294,6 +294,7 @@ static int tilcdc_load(struct drm_device
+                       break;
+       }
++      drm_helper_disable_unused_functions(dev);
+       priv->fbdev = drm_fbdev_cma_init(dev, bpp,
+                       dev->mode_config.num_crtc,
+                       dev->mode_config.num_connector);
diff --git a/target/linux/brcm2708/patches-4.4/0437-overlays-Add-assert_falling_edge-to-pps-gpio-overlay.patch b/target/linux/brcm2708/patches-4.4/0437-overlays-Add-assert_falling_edge-to-pps-gpio-overlay.patch
new file mode 100644 (file)
index 0000000..496539e
--- /dev/null
@@ -0,0 +1,31 @@
+From b90a1393b3bdffa88c8e8dfbdc2bec650a5f885e Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Tue, 9 Aug 2016 21:51:41 +0100
+Subject: [PATCH] overlays: Add assert_falling_edge to pps-gpio overlay
+
+See: https://github.com/raspberrypi/linux/issues/1590
+---
+ arch/arm/boot/dts/overlays/README               | 2 ++
+ arch/arm/boot/dts/overlays/pps-gpio-overlay.dts | 1 +
+ 2 files changed, 3 insertions(+)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -797,6 +797,8 @@ Name:   pps-gpio
+ Info:   Configures the pps-gpio (pulse-per-second time signal via GPIO).
+ Load:   dtoverlay=pps-gpio,<param>=<val>
+ Params: gpiopin                 Input GPIO (default "18")
++        assert_falling_edge     When present, assert is indicated by a falling
++                                edge, rather than by a rising edge
+ Name:   pwm
+--- a/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts
++++ b/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts
+@@ -30,5 +30,6 @@
+       __overrides__ {
+               gpiopin = <&pps>,"gpios:4",
+                         <&pps_pins>,"brcm,pins:0";
++              assert_falling_edge = <&pps>,"assert-falling-edge?";
+       };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0438-drm-mipi-dsi-Unregister-bus-at-exit.patch b/target/linux/brcm2708/patches-4.4/0438-drm-mipi-dsi-Unregister-bus-at-exit.patch
new file mode 100644 (file)
index 0000000..a5ed02c
--- /dev/null
@@ -0,0 +1,30 @@
+From 229ed4a50a90820a5288c7f839db1f089bed71c4 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 2 Aug 2016 14:16:42 +0200
+Subject: [PATCH] drm/mipi-dsi: Unregister bus at exit
+
+This is a preliminary patch for building drm-mipi-dsi as a module.
+Add the module exit callback to unregister the bus properly.
+
+Suggested-by: Thierry Reding <treding@nvidia.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/drm_mipi_dsi.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/gpu/drm/drm_mipi_dsi.c
++++ b/drivers/gpu/drm/drm_mipi_dsi.c
+@@ -928,6 +928,12 @@ static int __init mipi_dsi_bus_init(void
+ }
+ postcore_initcall(mipi_dsi_bus_init);
++static void __exit mipi_dsi_bus_exit(void)
++{
++      bus_unregister(&mipi_dsi_bus_type);
++}
++module_exit(mipi_dsi_bus_exit);
++
+ MODULE_AUTHOR("Andrzej Hajda <a.hajda@samsung.com>");
+ MODULE_DESCRIPTION("MIPI DSI Bus");
+ MODULE_LICENSE("GPL and additional rights");
diff --git a/target/linux/brcm2708/patches-4.4/0439-drm-mipi-dsi-Allow-to-build-drm-mipi-dsi-as-a-module.patch b/target/linux/brcm2708/patches-4.4/0439-drm-mipi-dsi-Allow-to-build-drm-mipi-dsi-as-a-module.patch
new file mode 100644 (file)
index 0000000..7d21e2a
--- /dev/null
@@ -0,0 +1,32 @@
+From cee1a8a6610e7184a9df7975c67d7e64bb80ee27 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 2 Aug 2016 14:16:43 +0200
+Subject: [PATCH] drm/mipi-dsi: Allow to build drm-mipi-dsi as a module
+
+The drm-mipi-dsi driver has been only built-in although this isn't
+strictly required to be so.  Since it's referred by lots of DRM
+drivers nowadays, most of distro kernels include the driver as
+built-in as a result, even though many systems don't need it at all.
+
+This patch fixes Kconfig to allow drm-mipi-dsi driver built as a
+module, so that we can save footprint on systems without such DRM
+drivers.  The probe order is managed by the module dependency, and
+postcore_initcall() works just fine as a module init call.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/Kconfig
++++ b/drivers/gpu/drm/Kconfig
+@@ -22,7 +22,7 @@ menuconfig DRM
+         (/dev/agpgart) support if it is available for your platform.
+ config DRM_MIPI_DSI
+-      bool
++      tristate
+       depends on DRM
+ config DRM_KMS_HELPER
diff --git a/target/linux/brcm2708/patches-4.4/0440-drm-vc4-Fix-flipped-HVS-channels-for-DSI0-1.patch b/target/linux/brcm2708/patches-4.4/0440-drm-vc4-Fix-flipped-HVS-channels-for-DSI0-1.patch
new file mode 100644 (file)
index 0000000..116ae0c
--- /dev/null
@@ -0,0 +1,30 @@
+From 3ecee79bedf0a2dbca94281674b7a86f3b82f522 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 11 Feb 2016 12:29:45 -0800
+Subject: [PATCH] drm/vc4: Fix flipped HVS channels for DSI0/1.
+
+Empirically, DSI1 appears to be using HVS channel 0 on my Pi2.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -699,13 +699,13 @@ void vc4_cancel_page_flip(struct drm_crt
+ }
+ static const struct vc4_crtc_data pv0_data = {
+-      .hvs_channel = 0,
++      .hvs_channel = 2,
+       .encoder0_type = VC4_ENCODER_TYPE_DSI0,
+       .encoder1_type = VC4_ENCODER_TYPE_DPI,
+ };
+ static const struct vc4_crtc_data pv1_data = {
+-      .hvs_channel = 2,
++      .hvs_channel = 0,
+       .encoder0_type = VC4_ENCODER_TYPE_DSI1,
+       .encoder1_type = VC4_ENCODER_TYPE_SMI,
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0441-drm-vc4-Add-support-for-feeding-DSI-encoders-from-th.patch b/target/linux/brcm2708/patches-4.4/0441-drm-vc4-Add-support-for-feeding-DSI-encoders-from-th.patch
new file mode 100644 (file)
index 0000000..7b36ff9
--- /dev/null
@@ -0,0 +1,96 @@
+From c50d2b2fc772468306a8b30159924f19edab4901 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Wed, 10 Feb 2016 16:17:29 -0800
+Subject: [PATCH] drm/vc4: Add support for feeding DSI encoders from the pixel
+ valve.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 30 +++++++++++++++++-------------
+ drivers/gpu/drm/vc4/vc4_regs.h |  2 ++
+ 2 files changed, 19 insertions(+), 13 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -210,38 +210,40 @@ static u32 vc4_get_fifo_full_level(u32 f
+ }
+ /*
+- * Returns the clock select bit for the connector attached to the
+- * CRTC.
++ * Returns the encoder attached to the CRTC.
++ *
++ * VC4 can only scan out to one encoder at a type, while the DRM core
++ * allows drivers to push pixels to more than one encoder from the
++ * same CRTC.
+  */
+-static int vc4_get_clock_select(struct drm_crtc *crtc)
++static struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc)
+ {
+       struct drm_connector *connector;
+       drm_for_each_connector(connector, crtc->dev) {
+               if (connector->state->crtc == crtc) {
+-                      struct drm_encoder *encoder = connector->encoder;
+-                      struct vc4_encoder *vc4_encoder =
+-                              to_vc4_encoder(encoder);
+-
+-                      return vc4_encoder->clock_select;
++                      return connector->encoder;
+               }
+       }
+-      return -1;
++      return NULL;
+ }
+ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
+ {
+       struct drm_device *dev = crtc->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
++      struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc);
++      struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
+       struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+       struct drm_crtc_state *state = crtc->state;
+       struct drm_display_mode *mode = &state->adjusted_mode;
+       bool interlace = mode->flags & DRM_MODE_FLAG_INTERLACE;
+       u32 vactive = (mode->vdisplay >> (interlace ? 1 : 0));
+-      u32 format = PV_CONTROL_FORMAT_24;
+-      bool debug_dump_regs = false;
+-      int clock_select = vc4_get_clock_select(crtc);
++      bool is_dsi = (vc4_encoder->type == VC4_ENCODER_TYPE_DSI0 ||
++                     vc4_encoder->type == VC4_ENCODER_TYPE_DSI1);
++      u32 format = is_dsi ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24;
++      bool debug_dump_regs = true;
+       if (debug_dump_regs) {
+               DRM_INFO("CRTC %d regs before:\n", drm_crtc_index(crtc));
+@@ -289,6 +291,7 @@ static void vc4_crtc_mode_set_nofb(struc
+       CRTC_WRITE(PV_V_CONTROL,
+                  PV_VCONTROL_CONTINUOUS |
++                 (is_dsi ? PV_VCONTROL_DSI : 0) |
+                  (interlace ? PV_VCONTROL_INTERLACE : 0));
+       CRTC_WRITE(PV_CONTROL,
+@@ -298,7 +301,8 @@ static void vc4_crtc_mode_set_nofb(struc
+                  PV_CONTROL_CLR_AT_START |
+                  PV_CONTROL_TRIGGER_UNDERFLOW |
+                  PV_CONTROL_WAIT_HSTART |
+-                 VC4_SET_FIELD(clock_select, PV_CONTROL_CLK_SELECT) |
++                 VC4_SET_FIELD(vc4_encoder->clock_select,
++                               PV_CONTROL_CLK_SELECT) |
+                  PV_CONTROL_FIFO_CLR |
+                  PV_CONTROL_EN);
+--- a/drivers/gpu/drm/vc4/vc4_regs.h
++++ b/drivers/gpu/drm/vc4/vc4_regs.h
+@@ -184,6 +184,8 @@
+ #define PV_V_CONTROL                          0x04
+ # define PV_VCONTROL_INTERLACE                        BIT(4)
++# define PV_VCONTROL_DSI                      BIT(3)
++# define PV_VCONTROL_COMMAND                  BIT(2)
+ # define PV_VCONTROL_CONTINUOUS                       BIT(1)
+ # define PV_VCONTROL_VIDEN                    BIT(0)
diff --git a/target/linux/brcm2708/patches-4.4/0442-drm-vc4-Start-switching-to-using-debugfs_reg32-helpe.patch b/target/linux/brcm2708/patches-4.4/0442-drm-vc4-Start-switching-to-using-debugfs_reg32-helpe.patch
new file mode 100644 (file)
index 0000000..3733c32
--- /dev/null
@@ -0,0 +1,156 @@
+From e2934c6a46a8bfadced1866adea668cebbc698da Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 20 May 2016 16:24:47 -0700
+Subject: [PATCH] drm/vc4: Start switching to using debugfs_reg32 helpers for
+ debugfs.
+
+Every file was defining its own little struct and dumping for the
+regs, when there's a helper in debugfs for doing just this.  However,
+instead of printing:
+
+PV_HORZA (0x000c): 0x00000000
+
+we now print:
+
+PV_HORZA = 0x00000000
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 48 ++++++++++++++++--------------------------
+ drivers/gpu/drm/vc4/vc4_drv.c  | 13 ++++++++++++
+ drivers/gpu/drm/vc4/vc4_drv.h  |  6 ++++++
+ 3 files changed, 37 insertions(+), 30 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -35,6 +35,7 @@
+ #include "drm_atomic_helper.h"
+ #include "drm_crtc_helper.h"
+ #include "linux/clk.h"
++#include "linux/debugfs.h"
+ #include "drm_fb_cma_helper.h"
+ #include "linux/component.h"
+ #include "linux/of_device.h"
+@@ -85,35 +86,25 @@ struct vc4_crtc_data {
+ #define CRTC_WRITE(offset, val) writel(val, vc4_crtc->regs + (offset))
+ #define CRTC_READ(offset) readl(vc4_crtc->regs + (offset))
+-#define CRTC_REG(reg) { reg, #reg }
+-static const struct {
+-      u32 reg;
+-      const char *name;
+-} crtc_regs[] = {
+-      CRTC_REG(PV_CONTROL),
+-      CRTC_REG(PV_V_CONTROL),
+-      CRTC_REG(PV_VSYNCD_EVEN),
+-      CRTC_REG(PV_HORZA),
+-      CRTC_REG(PV_HORZB),
+-      CRTC_REG(PV_VERTA),
+-      CRTC_REG(PV_VERTB),
+-      CRTC_REG(PV_VERTA_EVEN),
+-      CRTC_REG(PV_VERTB_EVEN),
+-      CRTC_REG(PV_INTEN),
+-      CRTC_REG(PV_INTSTAT),
+-      CRTC_REG(PV_STAT),
+-      CRTC_REG(PV_HACT_ACT),
++static const struct debugfs_reg32 crtc_regs[] = {
++      VC4_DEBUG_REG(PV_CONTROL),
++      VC4_DEBUG_REG(PV_V_CONTROL),
++      VC4_DEBUG_REG(PV_VSYNCD_EVEN),
++      VC4_DEBUG_REG(PV_HORZA),
++      VC4_DEBUG_REG(PV_HORZB),
++      VC4_DEBUG_REG(PV_VERTA),
++      VC4_DEBUG_REG(PV_VERTB),
++      VC4_DEBUG_REG(PV_VERTA_EVEN),
++      VC4_DEBUG_REG(PV_VERTB_EVEN),
++      VC4_DEBUG_REG(PV_INTEN),
++      VC4_DEBUG_REG(PV_INTSTAT),
++      VC4_DEBUG_REG(PV_STAT),
++      VC4_DEBUG_REG(PV_HACT_ACT),
+ };
+ static void vc4_crtc_dump_regs(struct vc4_crtc *vc4_crtc)
+ {
+-      int i;
+-
+-      for (i = 0; i < ARRAY_SIZE(crtc_regs); i++) {
+-              DRM_INFO("0x%04x (%s): 0x%08x\n",
+-                       crtc_regs[i].reg, crtc_regs[i].name,
+-                       CRTC_READ(crtc_regs[i].reg));
+-      }
++      vc4_dump_regs32(crtc_regs, ARRAY_SIZE(crtc_regs), vc4_crtc->regs, "");
+ }
+ #ifdef CONFIG_DEBUG_FS
+@@ -136,11 +127,8 @@ int vc4_crtc_debugfs_regs(struct seq_fil
+               return 0;
+       vc4_crtc = to_vc4_crtc(crtc);
+-      for (i = 0; i < ARRAY_SIZE(crtc_regs); i++) {
+-              seq_printf(m, "%s (0x%04x): 0x%08x\n",
+-                         crtc_regs[i].name, crtc_regs[i].reg,
+-                         CRTC_READ(crtc_regs[i].reg));
+-      }
++      debugfs_print_regs32(m, crtc_regs, ARRAY_SIZE(crtc_regs),
++                           vc4_crtc->regs, "");
+       return 0;
+ }
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -9,6 +9,7 @@
+ #include <linux/clk.h>
+ #include <linux/component.h>
++#include <linux/debugfs.h>
+ #include <linux/device.h>
+ #include <linux/io.h>
+ #include <linux/module.h>
+@@ -52,6 +53,18 @@ static void vc4_drm_preclose(struct drm_
+               vc4_cancel_page_flip(crtc, file);
+ }
++void vc4_dump_regs32(const struct debugfs_reg32 *regs, unsigned int num_regs,
++                   void __iomem *base, const char *prefix)
++{
++      unsigned int i;
++
++      for (i = 0; i < num_regs; i++) {
++              DRM_INFO("%s0x%04lx (%s): 0x%08x\n",
++                       prefix, regs[i].offset, regs[i].name,
++                       readl(base + regs[i].offset));
++      }
++}
++
+ static void vc4_lastclose(struct drm_device *dev)
+ {
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -9,6 +9,8 @@
+ #include "drmP.h"
+ #include "drm_gem_cma_helper.h"
++struct debugfs_reg32;
++
+ struct vc4_dev {
+       struct drm_device *dev;
+@@ -207,6 +209,8 @@ to_vc4_encoder(struct drm_encoder *encod
+ #define HVS_READ(offset) readl(vc4->hvs->regs + offset)
+ #define HVS_WRITE(offset, val) writel(val, vc4->hvs->regs + offset)
++#define VC4_DEBUG_REG(reg) { .name = #reg, .offset = reg }
++
+ struct vc4_exec_info {
+       /* Sequence number for this bin/render job. */
+       uint64_t seqno;
+@@ -418,6 +422,8 @@ void vc4_debugfs_cleanup(struct drm_mino
+ /* vc4_drv.c */
+ void __iomem *vc4_ioremap_regs(struct platform_device *dev, int index);
++void vc4_dump_regs32(const struct debugfs_reg32 *reg, unsigned int num_regs,
++                   void __iomem *base, const char *prefix);
+ /* vc4_dpi.c */
+ extern struct platform_driver vc4_dpi_driver;
diff --git a/target/linux/brcm2708/patches-4.4/0443-drm-vc4-Add-DSI1-driver.patch b/target/linux/brcm2708/patches-4.4/0443-drm-vc4-Add-DSI1-driver.patch
new file mode 100644 (file)
index 0000000..a59dd3d
--- /dev/null
@@ -0,0 +1,1914 @@
+From 7e409fcf8006642edc6f817b6832f27b66debc44 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Wed, 10 Feb 2016 11:42:32 -0800
+Subject: [PATCH] drm/vc4: Add DSI1 driver
+
+The DSI0 and DSI1 blocks on the 2835 are different but very similar
+hardware blocks.  Some registers move around, and the featureset is
+slightly different, but they're clearly related.  This doesn't enable
+DSI0, but some of the infrastructure is present.
+
+Also, this driver doesn't initialize the DSI successfully from
+poweron, so we currently require that the Raspberry Pi firmware enable
+it at boot time.  From there, we just keep the same settings forever,
+and when poweroff is requested we just scan out black instead.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/Kconfig       |    2 +
+ drivers/gpu/drm/vc4/Makefile      |    1 +
+ drivers/gpu/drm/vc4/vc4_crtc.c    |   41 +-
+ drivers/gpu/drm/vc4/vc4_debugfs.c |    2 +
+ drivers/gpu/drm/vc4/vc4_drv.c     |    1 +
+ drivers/gpu/drm/vc4/vc4_drv.h     |    8 +
+ drivers/gpu/drm/vc4/vc4_dsi.c     | 1737 +++++++++++++++++++++++++++++++++++++
+ 7 files changed, 1780 insertions(+), 12 deletions(-)
+ create mode 100644 drivers/gpu/drm/vc4/vc4_dsi.c
+
+--- a/drivers/gpu/drm/vc4/Kconfig
++++ b/drivers/gpu/drm/vc4/Kconfig
+@@ -6,6 +6,8 @@ config DRM_VC4
+       select DRM_KMS_CMA_HELPER
+       select DRM_GEM_CMA_HELPER
+       select DRM_PANEL
++      select DRM_MIPI_DSI
++      select CLKSRC_OF
+       help
+         Choose this option if you have a system that has a Broadcom
+         VC4 GPU, such as the Raspberry Pi or other BCM2708/BCM2835.
+--- a/drivers/gpu/drm/vc4/Makefile
++++ b/drivers/gpu/drm/vc4/Makefile
+@@ -8,6 +8,7 @@ vc4-y := \
+       vc4_crtc.o \
+       vc4_drv.o \
+       vc4_dpi.o \
++      vc4_dsi.o \
+       vc4_kms.o \
+       vc4_gem.o \
+       vc4_hdmi.o \
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -231,7 +231,7 @@ static void vc4_crtc_mode_set_nofb(struc
+       bool is_dsi = (vc4_encoder->type == VC4_ENCODER_TYPE_DSI0 ||
+                      vc4_encoder->type == VC4_ENCODER_TYPE_DSI1);
+       u32 format = is_dsi ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24;
+-      bool debug_dump_regs = true;
++      bool debug_dump_regs = false;
+       if (debug_dump_regs) {
+               DRM_INFO("CRTC %d regs before:\n", drm_crtc_index(crtc));
+@@ -327,6 +327,19 @@ static void vc4_crtc_disable(struct drm_
+       int ret;
+       require_hvs_enabled(dev);
++      if (VC4_DSI_USE_FIRMWARE_SETUP &&
++          (CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_DSI)) {
++              /* Skip disabling the PV/HVS for the channel if it was
++               * connected to the DSI panel and we're using the
++               * firmware setup.  Instead, just set it to stuff
++               * black in the composite output buffer.
++               */
++              HVS_WRITE(SCALER_DISPBKGNDX(vc4_crtc->channel),
++                        HVS_READ(SCALER_DISPBKGNDX(vc4_crtc->channel)) |
++                        SCALER_DISPBKGND_FILL);
++              return;
++      }
++
+       CRTC_WRITE(PV_V_CONTROL,
+                  CRTC_READ(PV_V_CONTROL) & ~PV_VCONTROL_VIDEN);
+       ret = wait_for(!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN), 1);
+@@ -396,17 +409,19 @@ static int vc4_crtc_atomic_check(struct
+       if (drm_atomic_connectors_for_crtc(state->state, crtc) > 1)
+               return -EINVAL;
+-      drm_atomic_crtc_state_for_each_plane(plane, state) {
+-              struct drm_plane_state *plane_state =
+-                      state->state->plane_states[drm_plane_index(plane)];
+-
+-              /* plane might not have changed, in which case take
+-               * current state:
+-               */
+-              if (!plane_state)
+-                      plane_state = plane->state;
++      if (state->active) {
++              drm_atomic_crtc_state_for_each_plane(plane, state) {
++                      struct drm_plane_state *plane_state =
++                              state->state->plane_states[drm_plane_index(plane)];
++
++                      /* plane might not have changed, in which case take
++                       * current state:
++                       */
++                      if (!plane_state)
++                              plane_state = plane->state;
+-              dlist_count += vc4_plane_dlist_size(plane_state);
++                      dlist_count += vc4_plane_dlist_size(plane_state);
++              }
+       }
+       dlist_count++; /* Account for SCALER_CTL0_END. */
+@@ -439,8 +454,10 @@ static void vc4_crtc_atomic_flush(struct
+       }
+       /* Copy all the active planes' dlist contents to the hardware dlist. */
+-      drm_atomic_crtc_for_each_plane(plane, crtc) {
+-              dlist_next += vc4_plane_write_dlist(plane, dlist_next);
++      if (crtc->state->active) {
++              drm_atomic_crtc_for_each_plane(plane, crtc) {
++                      dlist_next += vc4_plane_write_dlist(plane, dlist_next);
++              }
+       }
+       writel(SCALER_CTL0_END, dlist_next);
+--- a/drivers/gpu/drm/vc4/vc4_debugfs.c
++++ b/drivers/gpu/drm/vc4/vc4_debugfs.c
+@@ -19,6 +19,8 @@ static const struct drm_info_list vc4_de
+       {"bo_stats", vc4_bo_stats_debugfs, 0},
+       {"dpi_regs", vc4_dpi_debugfs_regs, 0},
+       {"gem_exec", vc4_gem_exec_debugfs, 0},
++      {"dsi0_regs", vc4_dsi_debugfs_regs, 0, (void *)(uintptr_t)0},
++      {"dsi1_regs", vc4_dsi_debugfs_regs, 0, (void *)(uintptr_t)1},
+       {"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.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -294,6 +294,7 @@ static const struct component_master_ops
+ static struct platform_driver *const component_drivers[] = {
+       &vc4_hdmi_driver,
+       &vc4_dpi_driver,
++      &vc4_dsi_driver,
+       &vc4_crtc_driver,
+       &vc4_hvs_driver,
+       &vc4_v3d_driver,
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -19,6 +19,8 @@ struct vc4_dev {
+       struct vc4_crtc *crtc[3];
+       struct vc4_v3d *v3d;
+       struct vc4_dpi *dpi;
++      struct vc4_dsi *dsi0;
++      struct vc4_dsi *dsi1;
+       struct drm_fbdev_cma *fbdev;
+       struct rpi_firmware *firmware;
+@@ -192,6 +194,8 @@ enum vc4_encoder_type {
+       VC4_ENCODER_TYPE_DPI,
+ };
++#define VC4_DSI_USE_FIRMWARE_SETUP true
++
+ struct vc4_encoder {
+       struct drm_encoder base;
+       enum vc4_encoder_type type;
+@@ -429,6 +433,10 @@ void vc4_dump_regs32(const struct debugf
+ extern struct platform_driver vc4_dpi_driver;
+ int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused);
++/* vc4_dsi.c */
++extern struct platform_driver vc4_dsi_driver;
++int vc4_dsi_debugfs_regs(struct seq_file *m, void *unused);
++
+ /* vc4_gem.c */
+ void vc4_gem_init(struct drm_device *dev);
+ void vc4_gem_destroy(struct drm_device *dev);
+--- /dev/null
++++ b/drivers/gpu/drm/vc4/vc4_dsi.c
+@@ -0,0 +1,1737 @@
++ /*
++ * Copyright (C) 2016 Broadcom Limited
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published by
++ * the Free Software Foundation.
++ *
++ * 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/>.
++ */
++
++/**
++ * DOC: VC4 DSI0 module
++ */
++
++#include "drm_atomic_helper.h"
++#include "drm_crtc_helper.h"
++#include "drm_edid.h"
++#include "drm_mipi_dsi.h"
++#include "drm_panel.h"
++#include "linux/clk.h"
++#include "linux/clk-provider.h"
++#include "linux/completion.h"
++#include "linux/component.h"
++#include "linux/debugfs.h"
++#include "linux/dmaengine.h"
++#include "linux/i2c.h"
++#include "linux/of_address.h"
++#include "linux/of_gpio.h"
++#include "linux/of_platform.h"
++#include "vc4_drv.h"
++#include "vc4_regs.h"
++
++#define DSI_CMD_FIFO_DEPTH  16
++#define DSI_PIX_FIFO_DEPTH 256
++#define DSI_PIX_FIFO_WIDTH   4
++
++#define DSI0_CTRL             0x00
++
++/* Command packet control. */
++#define DSI0_TXPKT1C          0x04 /* AKA PKTC */
++#define DSI1_TXPKT1C          0x04
++# define DSI_TXPKT1C_TRIG_CMD_MASK    VC4_MASK(31, 24)
++# define DSI_TXPKT1C_TRIG_CMD_SHIFT   24
++# define DSI_TXPKT1C_CMD_REPEAT_MASK  VC4_MASK(23, 10)
++# define DSI_TXPKT1C_CMD_REPEAT_SHIFT 10
++
++# define DSI_TXPKT1C_DISPLAY_NO_MASK  VC4_MASK(9, 8)
++# define DSI_TXPKT1C_DISPLAY_NO_SHIFT 8
++/* Short, trigger, BTA, or a long packet that fits all in CMDFIFO. */
++# define DSI_TXPKT1C_DISPLAY_NO_SHORT         0
++/* Primary display where cmdfifo provides part of the payload and
++ * pixelvalve the rest.
++ */
++# define DSI_TXPKT1C_DISPLAY_NO_PRIMARY               1
++/* Secondary display where cmdfifo provides part of the payload and
++ * pixfifo the rest.
++ */
++# define DSI_TXPKT1C_DISPLAY_NO_SECONDARY     2
++
++# define DSI_TXPKT1C_CMD_TX_TIME_MASK VC4_MASK(7, 6)
++# define DSI_TXPKT1C_CMD_TX_TIME_SHIFT        6
++# define DSI_TXPKT1C_CMD_CTRL_MASK    VC4_MASK(5, 4)
++# define DSI_TXPKT1C_CMD_CTRL_SHIFT   4
++/* Command only.  Uses TXPKT1H and DISPLAY_NO */
++# define DSI_TXPKT1C_CMD_CTRL_TX      0
++/* Command with BTA for either ack or read data. */
++# define DSI_TXPKT1C_CMD_CTRL_RX      1
++/* Trigger according to TRIG_CMD */
++# define DSI_TXPKT1C_CMD_CTRL_TRIG    2
++/* BTA alone for getting error status after a command, or a TE trigger
++ * without a previous command.
++ */
++# define DSI_TXPKT1C_CMD_CTRL_BTA     3
++
++# define DSI_TXPKT1C_CMD_MODE_LP      BIT(3)
++# define DSI_TXPKT1C_CMD_TYPE_LONG    BIT(2)
++# define DSI_TXPKT1C_CMD_TE_EN                BIT(1)
++# define DSI_TXPKT1C_CMD_EN           BIT(0)
++
++/* Command packet header. */
++#define DSI0_TXPKT1H          0x08 /* AKA PKTH */
++#define DSI1_TXPKT1H          0x08
++# define DSI_TXPKT1H_BC_CMDFIFO_MASK  VC4_MASK(31, 24)
++# define DSI_TXPKT1H_BC_CMDFIFO_SHIFT 24
++# define DSI_TXPKT1H_BC_PARAM_MASK    VC4_MASK(23, 8)
++# define DSI_TXPKT1H_BC_PARAM_SHIFT   8
++# define DSI_TXPKT1H_BC_DT_MASK               VC4_MASK(7, 0)
++# define DSI_TXPKT1H_BC_DT_SHIFT      0
++
++#define DSI0_RXPKT1H          0x0c /* AKA RX1_PKTH */
++#define DSI1_RXPKT1H          0x14
++# define DSI_RXPKT1H_CRC_ERR          BIT(31)
++# define DSI_RXPKT1H_DET_ERR          BIT(30)
++# define DSI_RXPKT1H_ECC_ERR          BIT(29)
++# define DSI_RXPKT1H_COR_ERR          BIT(28)
++# define DSI_RXPKT1H_INCOMP_PKT               BIT(25)
++# define DSI_RXPKT1H_PKT_TYPE_LONG    BIT(24)
++/* Byte count if DSI_RXPKT1H_PKT_TYPE_LONG */
++# define DSI_RXPKT1H_BC_PARAM_MASK    VC4_MASK(23, 8)
++# define DSI_RXPKT1H_BC_PARAM_SHIFT   8
++/* Short return bytes if !DSI_RXPKT1H_PKT_TYPE_LONG */
++# define DSI_RXPKT1H_SHORT_1_MASK     VC4_MASK(23, 16)
++# define DSI_RXPKT1H_SHORT_1_SHIFT    16
++# define DSI_RXPKT1H_SHORT_0_MASK     VC4_MASK(15, 8)
++# define DSI_RXPKT1H_SHORT_0_SHIFT    8
++# define DSI_RXPKT1H_DT_LP_CMD_MASK   VC4_MASK(7, 0)
++# define DSI_RXPKT1H_DT_LP_CMD_SHIFT  0
++
++#define DSI0_RXPKT2H          0x10 /* AKA RX2_PKTH */
++#define DSI1_RXPKT2H          0x18
++# define DSI_RXPKT1H_DET_ERR          BIT(30)
++# define DSI_RXPKT1H_ECC_ERR          BIT(29)
++# define DSI_RXPKT1H_COR_ERR          BIT(28)
++# define DSI_RXPKT1H_INCOMP_PKT               BIT(25)
++# define DSI_RXPKT1H_BC_PARAM_MASK    VC4_MASK(23, 8)
++# define DSI_RXPKT1H_BC_PARAM_SHIFT   8
++# define DSI_RXPKT1H_DT_MASK          VC4_MASK(7, 0)
++# define DSI_RXPKT1H_DT_SHIFT         0
++
++#define DSI0_TXPKT_CMD_FIFO   0x14 /* AKA CMD_DATAF */
++#define DSI1_TXPKT_CMD_FIFO   0x1c
++
++#define DSI0_DISP0_CTRL               0x18
++# define DSI_DISP0_PIX_CLK_DIV_MASK   VC4_MASK(21, 13)
++# define DSI_DISP0_PIX_CLK_DIV_SHIFT  13
++# define DSI_DISP0_LP_STOP_CTRL_MASK  VC4_MASK(12, 11)
++# define DSI_DISP0_LP_STOP_CTRL_SHIFT 11
++# define DSI_DISP0_LP_STOP_DISABLE    0
++# define DSI_DISP0_LP_STOP_PERLINE    1
++# define DSI_DISP0_LP_STOP_PERFRAME   2
++
++/* Transmit RGB pixels and null packets only during HACTIVE, instead
++ * of going to LP-STOP.
++ */
++# define DSI_DISP_HACTIVE_NULL                BIT(10)
++/* Transmit blanking packet only during vblank, instead of allowing LP-STOP. */
++# define DSI_DISP_VBLP_CTRL           BIT(9)
++/* Transmit blanking packet only during HFP, instead of allowing LP-STOP. */
++# define DSI_DISP_HFP_CTRL            BIT(8)
++/* Transmit blanking packet only during HBP, instead of allowing LP-STOP. */
++# define DSI_DISP_HBP_CTRL            BIT(7)
++# define DSI_DISP0_CHANNEL_MASK               VC4_MASK(6, 5)
++# define DSI_DISP0_CHANNEL_SHIFT      5
++/* Enables and end events for HSYNC/VSYNC, not just start events. */
++# define DSI_DISP0_ST_END             BIT(4)
++# define DSI_DISP0_PFORMAT_MASK               VC4_MASK(3, 2)
++# define DSI_DISP0_PFORMAT_SHIFT      2
++# define DSI_PFORMAT_RGB565           0
++# define DSI_PFORMAT_RGB666_PACKED    1
++# define DSI_PFORMAT_RGB666           2
++# define DSI_PFORMAT_RGB888           3
++/* Default is VIDEO mode. */
++# define DSI_DISP0_COMMAND_MODE               BIT(1)
++# define DSI_DISP0_ENABLE             BIT(0)
++
++#define DSI0_DISP1_CTRL               0x1c
++#define DSI1_DISP1_CTRL               0x2c
++/* Format of the data written to TXPKT_PIX_FIFO. */
++# define DSI_DISP1_PFORMAT_MASK               VC4_MASK(2, 1)
++# define DSI_DISP1_PFORMAT_SHIFT      1
++# define DSI_DISP1_PFORMAT_16BIT      0
++# define DSI_DISP1_PFORMAT_24BIT      1
++# define DSI_DISP1_PFORMAT_32BIT_LE   2
++# define DSI_DISP1_PFORMAT_32BIT_BE   3
++
++/* DISP1 is always command mode. */
++# define DSI_DISP1_ENABLE             BIT(0)
++
++#define DSI0_TXPKT_PIX_FIFO           0x20 /* AKA PIX_FIFO */
++
++#define DSI0_INT_STAT         0x24
++#define DSI0_INT_EN           0x28
++# define DSI1_INT_PHY_D3_ULPS         BIT(30)
++# define DSI1_INT_PHY_D3_STOP         BIT(29)
++# define DSI1_INT_PHY_D2_ULPS         BIT(28)
++# define DSI1_INT_PHY_D2_STOP         BIT(27)
++# define DSI1_INT_PHY_D1_ULPS         BIT(26)
++# define DSI1_INT_PHY_D1_STOP         BIT(25)
++# define DSI1_INT_PHY_D0_ULPS         BIT(24)
++# define DSI1_INT_PHY_D0_STOP         BIT(23)
++# define DSI1_INT_FIFO_ERR            BIT(22)
++# define DSI1_INT_PHY_DIR_RTF         BIT(21)
++# define DSI1_INT_PHY_RXLPDT          BIT(20)
++# define DSI1_INT_PHY_RXTRIG          BIT(19)
++# define DSI1_INT_PHY_D0_LPDT         BIT(18)
++# define DSI1_INT_PHY_DIR_FTR         BIT(17)
++
++/* Signaled when the clock lane enters the given state. */
++# define DSI1_INT_PHY_CLOCK_ULPS      BIT(16)
++# define DSI1_INT_PHY_CLOCK_HS                BIT(15)
++# define DSI1_INT_PHY_CLOCK_STOP      BIT(14)
++
++/* Signaled on timeouts */
++# define DSI1_INT_PR_TO                       BIT(13)
++# define DSI1_INT_TA_TO                       BIT(12)
++# define DSI1_INT_LPRX_TO             BIT(11)
++# define DSI1_INT_HSTX_TO             BIT(10)
++
++/* Contention on a line when trying to drive the line low */
++# define DSI1_INT_ERR_CONT_LP1                BIT(9)
++# define DSI1_INT_ERR_CONT_LP0                BIT(8)
++
++/* Control error: incorrect line state sequence on data lane 0. */
++# define DSI1_INT_ERR_CONTROL         BIT(7)
++/* LPDT synchronization error (bits received not a multiple of 8. */
++
++# define DSI1_INT_ERR_SYNC_ESC                BIT(6)
++/* Signaled after receiving an error packet from the display in
++ * response to a read.
++ */
++# define DSI1_INT_RXPKT2              BIT(5)
++/* Signaled after receiving a packet.  The header and optional short
++ * response will be in RXPKT1H, and a long response will be in the
++ * RXPKT_FIFO.
++ */
++# define DSI1_INT_RXPKT1              BIT(4)
++# define DSI1_INT_TXPKT2_DONE         BIT(3)
++# define DSI1_INT_TXPKT2_END          BIT(2)
++/* Signaled after all repeats of TXPKT1 are transferred. */
++# define DSI1_INT_TXPKT1_DONE         BIT(1)
++/* Signaled after each TXPKT1 repeat is scheduled. */
++# define DSI1_INT_TXPKT1_END          BIT(0)
++
++#define DSI1_INTERRUPTS_ALWAYS_ENABLED        (DSI1_INT_ERR_SYNC_ESC | \
++                                       DSI1_INT_ERR_CONTROL |  \
++                                       DSI1_INT_ERR_CONT_LP0 | \
++                                       DSI1_INT_ERR_CONT_LP1 | \
++                                       DSI1_INT_HSTX_TO |      \
++                                       DSI1_INT_LPRX_TO |      \
++                                       DSI1_INT_TA_TO |        \
++                                       DSI1_INT_PR_TO)
++
++#define DSI0_STAT             0x2c
++#define DSI0_HSTX_TO_CNT      0x30
++#define DSI0_LPRX_TO_CNT      0x34
++#define DSI0_TA_TO_CNT                0x38
++#define DSI0_PR_TO_CNT                0x3c
++#define DSI0_PHYC             0x40
++# define DSI1_PHYC_ESC_CLK_LPDT_MASK  VC4_MASK(25, 20)
++# define DSI1_PHYC_ESC_CLK_LPDT_SHIFT 20
++# define DSI1_PHYC_HS_CLK_CONTINUOUS  BIT(18)
++# define DSI1_PHYC_CLANE_ULPS         BIT(17)
++# define DSI0_PHYC_ESC_CLK_LPDT_MASK  VC4_MASK(17, 12)
++# define DSI0_PHYC_ESC_CLK_LPDT_SHIFT 12
++# define DSI1_PHYC_CLANE_ENABLE               BIT(16)
++# define DSI_PHYC_DLANE3_ULPS         BIT(13)
++# define DSI_PHYC_DLANE3_ENABLE               BIT(12)
++# define DSI0_PHYC_HS_CLK_CONTINUOUS  BIT(10)
++# define DSI0_PHYC_CLANE_ULPS         BIT(9)
++# define DSI_PHYC_DLANE2_ULPS         BIT(9)
++# define DSI0_PHYC_CLANE_ENABLE               BIT(8)
++# define DSI_PHYC_DLANE2_ENABLE               BIT(8)
++# define DSI_PHYC_DLANE1_ULPS         BIT(5)
++# define DSI_PHYC_DLANE1_ENABLE               BIT(4)
++# define DSI_PHYC_DLANE0_FORCE_STOP   BIT(2)
++# define DSI_PHYC_DLANE0_ULPS         BIT(1)
++# define DSI_PHYC_DLANE0_ENABLE               BIT(0)
++
++#define DSI0_HS_CLT0          0x44
++#define DSI0_HS_CLT1          0x48
++#define DSI0_HS_CLT2          0x4c
++#define DSI0_HS_DLT3          0x50
++#define DSI0_HS_DLT4          0x54
++#define DSI0_HS_DLT5          0x58
++#define DSI0_HS_DLT6          0x5c
++#define DSI0_HS_DLT7          0x60
++
++#define DSI0_PHY_AFEC0                0x64
++# define DSI0_PHY_AFEC0_DDR2CLK_EN            BIT(26)
++# define DSI0_PHY_AFEC0_DDRCLK_EN             BIT(25)
++# define DSI0_PHY_AFEC0_LATCH_ULPS            BIT(24)
++# define DSI1_PHY_AFEC0_IDR_DLANE3_MASK               VC4_MASK(31, 29)
++# define DSI1_PHY_AFEC0_IDR_DLANE3_SHIFT      29
++# define DSI1_PHY_AFEC0_IDR_DLANE2_MASK               VC4_MASK(28, 26)
++# define DSI1_PHY_AFEC0_IDR_DLANE2_SHIFT      26
++# define DSI1_PHY_AFEC0_IDR_DLANE1_MASK               VC4_MASK(27, 23)
++# define DSI1_PHY_AFEC0_IDR_DLANE1_SHIFT      23
++# define DSI1_PHY_AFEC0_IDR_DLANE0_MASK               VC4_MASK(22, 20)
++# define DSI1_PHY_AFEC0_IDR_DLANE0_SHIFT      20
++# define DSI1_PHY_AFEC0_IDR_CLANE_MASK                VC4_MASK(19, 17)
++# define DSI1_PHY_AFEC0_IDR_CLANE_SHIFT               17
++# define DSI0_PHY_AFEC0_ACTRL_DLANE1_MASK     VC4_MASK(23, 20)
++# define DSI0_PHY_AFEC0_ACTRL_DLANE1_SHIFT    20
++# define DSI0_PHY_AFEC0_ACTRL_DLANE0_MASK     VC4_MASK(19, 16)
++# define DSI0_PHY_AFEC0_ACTRL_DLANE0_SHIFT    16
++# define DSI0_PHY_AFEC0_ACTRL_CLANE_MASK      VC4_MASK(15, 12)
++# define DSI0_PHY_AFEC0_ACTRL_CLANE_SHIFT     12
++# define DSI1_PHY_AFEC0_DDR2CLK_EN            BIT(16)
++# define DSI1_PHY_AFEC0_DDRCLK_EN             BIT(15)
++# define DSI1_PHY_AFEC0_LATCH_ULPS            BIT(14)
++# define DSI1_PHY_AFEC0_RESET                 BIT(13)
++# define DSI1_PHY_AFEC0_PD                    BIT(12)
++# define DSI0_PHY_AFEC0_RESET                 BIT(11)
++# define DSI1_PHY_AFEC0_PD_BG                 BIT(11)
++# define DSI0_PHY_AFEC0_PD                    BIT(10)
++# define DSI1_PHY_AFEC0_PD_DLANE3             BIT(10)
++# define DSI0_PHY_AFEC0_PD_BG                 BIT(9)
++# define DSI1_PHY_AFEC0_PD_DLANE2             BIT(9)
++# define DSI0_PHY_AFEC0_PD_DLANE1             BIT(8)
++# define DSI1_PHY_AFEC0_PD_DLANE1             BIT(8)
++# define DSI_PHY_AFEC0_PTATADJ_MASK           VC4_MASK(7, 4)
++# define DSI_PHY_AFEC0_PTATADJ_SHIFT          4
++# define DSI_PHY_AFEC0_CTATADJ_MASK           VC4_MASK(3, 0)
++# define DSI_PHY_AFEC0_CTATADJ_SHIFT          0
++
++#define DSI0_PHY_AFEC1                0x68
++# define DSI0_PHY_AFEC1_IDR_DLANE1_MASK               VC4_MASK(10, 8)
++# define DSI0_PHY_AFEC1_IDR_DLANE1_SHIFT      8
++# define DSI0_PHY_AFEC1_IDR_DLANE0_MASK               VC4_MASK(6, 4)
++# define DSI0_PHY_AFEC1_IDR_DLANE0_SHIFT      4
++# define DSI0_PHY_AFEC1_IDR_CLANE_MASK                VC4_MASK(2, 0)
++# define DSI0_PHY_AFEC1_IDR_CLANE_SHIFT               0
++
++#define DSI0_TST_SEL          0x6c
++#define DSI0_TST_MON          0x70
++#define DSI0_ID                       0x74
++# define DSI_ID_VALUE         0x00647369
++
++
++#define DSI1_CTRL             0x00
++# define DSI_CTRL_HS_CLKC_MASK                VC4_MASK(15, 14)
++# define DSI_CTRL_HS_CLKC_SHIFT               14
++# define DSI_CTRL_HS_CLKC_BYTE                0
++# define DSI_CTRL_HS_CLKC_DDR2                1
++# define DSI_CTRL_HS_CLKC_DDR         2
++
++# define DSI_CTRL_RX_LPDT_EOT_DISABLE BIT(13)
++# define DSI_CTRL_LPDT_EOT_DISABLE    BIT(12)
++# define DSI_CTRL_HSDT_EOT_DISABLE    BIT(11)
++# define DSI_CTRL_SOFT_RESET_CFG      BIT(10)
++# define DSI_CTRL_CAL_BYTE            BIT(9)
++# define DSI_CTRL_INV_BYTE            BIT(8)
++# define DSI_CTRL_CLR_LDF             BIT(7)
++# define DSI0_CTRL_CLR_PBCF           BIT(6)
++# define DSI1_CTRL_CLR_RXF            BIT(6)
++# define DSI0_CTRL_CLR_CPBCF          BIT(5)
++# define DSI1_CTRL_CLR_PDF            BIT(5)
++# define DSI0_CTRL_CLR_PDF            BIT(4)
++# define DSI1_CTRL_CLR_CDF            BIT(4)
++# define DSI0_CTRL_CLR_CDF            BIT(3)
++# define DSI0_CTRL_CTRL2              BIT(2)
++# define DSI1_CTRL_DISABLE_DISP_CRCC  BIT(2)
++# define DSI0_CTRL_CTRL1              BIT(1)
++# define DSI1_CTRL_DISABLE_DISP_ECCC  BIT(1)
++# define DSI0_CTRL_CTRL0              BIT(0)
++# define DSI1_CTRL_EN                 BIT(0)
++# define DSI0_CTRL_RESET_FIFOS                (DSI_CTRL_CLR_LDF | \
++                                       DSI0_CTRL_CLR_PBCF | \
++                                       DSI0_CTRL_CLR_CPBCF |  \
++                                       DSI0_CTRL_CLR_PDF | \
++                                       DSI0_CTRL_CLR_CDF)
++# define DSI1_CTRL_RESET_FIFOS                (DSI_CTRL_CLR_LDF | \
++                                       DSI1_CTRL_CLR_RXF | \
++                                       DSI1_CTRL_CLR_PDF | \
++                                       DSI1_CTRL_CLR_CDF)
++
++#define DSI1_TXPKT2C          0x0c
++#define DSI1_TXPKT2H          0x10
++#define DSI1_TXPKT_PIX_FIFO   0x20
++#define DSI1_RXPKT_FIFO               0x24
++#define DSI1_DISP0_CTRL               0x28
++#define DSI1_INT_STAT         0x30
++#define DSI1_INT_EN           0x34
++
++/* State reporting bits.  These mostly behave like INT_STAT, where
++ * writing a 1 clears the bit.
++ */
++#define DSI1_STAT             0x38
++# define DSI1_STAT_PHY_D3_ULPS                BIT(31)
++# define DSI1_STAT_PHY_D3_STOP                BIT(30)
++# define DSI1_STAT_PHY_D2_ULPS                BIT(29)
++# define DSI1_STAT_PHY_D2_STOP                BIT(28)
++# define DSI1_STAT_PHY_D1_ULPS                BIT(27)
++# define DSI1_STAT_PHY_D1_STOP                BIT(26)
++# define DSI1_STAT_PHY_D0_ULPS                BIT(25)
++# define DSI1_STAT_PHY_D0_STOP                BIT(24)
++# define DSI1_STAT_FIFO_ERR           BIT(23)
++# define DSI1_STAT_PHY_RXLPDT         BIT(22)
++# define DSI1_STAT_PHY_RXTRIG         BIT(21)
++# define DSI1_STAT_PHY_D0_LPDT                BIT(20)
++/* Set when in forward direction */
++# define DSI1_STAT_PHY_DIR            BIT(19)
++# define DSI1_STAT_PHY_CLOCK_ULPS     BIT(18)
++# define DSI1_STAT_PHY_CLOCK_HS               BIT(17)
++# define DSI1_STAT_PHY_CLOCK_STOP     BIT(16)
++# define DSI1_STAT_PR_TO              BIT(15)
++# define DSI1_STAT_TA_TO              BIT(14)
++# define DSI1_STAT_LPRX_TO            BIT(13)
++# define DSI1_STAT_HSTX_TO            BIT(12)
++# define DSI1_STAT_ERR_CONT_LP1               BIT(11)
++# define DSI1_STAT_ERR_CONT_LP0               BIT(10)
++# define DSI1_STAT_ERR_CONTROL                BIT(9)
++# define DSI1_STAT_ERR_SYNC_ESC               BIT(8)
++# define DSI1_STAT_RXPKT2             BIT(7)
++# define DSI1_STAT_RXPKT1             BIT(6)
++# define DSI1_STAT_TXPKT2_BUSY                BIT(5)
++# define DSI1_STAT_TXPKT2_DONE                BIT(4)
++# define DSI1_STAT_TXPKT2_END         BIT(3)
++# define DSI1_STAT_TXPKT1_BUSY                BIT(2)
++# define DSI1_STAT_TXPKT1_DONE                BIT(1)
++# define DSI1_STAT_TXPKT1_END         BIT(0)
++
++#define DSI1_HSTX_TO_CNT      0x3c
++#define DSI1_LPRX_TO_CNT      0x40
++#define DSI1_TA_TO_CNT                0x44
++#define DSI1_PR_TO_CNT                0x48
++#define DSI1_PHYC             0x4c
++
++#define DSI1_HS_CLT0          0x50
++# define DSI_HS_CLT0_CZERO_MASK               VC4_MASK(26, 18)
++# define DSI_HS_CLT0_CZERO_SHIFT      18
++# define DSI_HS_CLT0_CPRE_MASK                VC4_MASK(17, 9)
++# define DSI_HS_CLT0_CPRE_SHIFT               9
++# define DSI_HS_CLT0_CPREP_MASK               VC4_MASK(8, 0)
++# define DSI_HS_CLT0_CPREP_SHIFT      0
++
++#define DSI1_HS_CLT1          0x54
++# define DSI_HS_CLT1_CTRAIL_MASK      VC4_MASK(17, 9)
++# define DSI_HS_CLT1_CTRAIL_SHIFT     9
++# define DSI_HS_CLT1_CPOST_MASK               VC4_MASK(8, 0)
++# define DSI_HS_CLT1_CPOST_SHIFT      0
++
++#define DSI1_HS_CLT2          0x58
++# define DSI_HS_CLT2_WUP_MASK         VC4_MASK(23, 0)
++# define DSI_HS_CLT2_WUP_SHIFT                0
++
++#define DSI1_HS_DLT3          0x5c
++# define DSI_HS_DLT3_EXIT_MASK                VC4_MASK(26, 18)
++# define DSI_HS_DLT3_EXIT_SHIFT               18
++# define DSI_HS_DLT3_ZERO_MASK                VC4_MASK(17, 9)
++# define DSI_HS_DLT3_ZERO_SHIFT               9
++# define DSI_HS_DLT3_PRE_MASK         VC4_MASK(8, 0)
++# define DSI_HS_DLT3_PRE_SHIFT                0
++
++#define DSI1_HS_DLT4          0x60
++# define DSI_HS_DLT4_ANLAT_MASK               VC4_MASK(22, 18)
++# define DSI_HS_DLT4_ANLAT_SHIFT      18
++# define DSI_HS_DLT4_TRAIL_MASK               VC4_MASK(17, 9)
++# define DSI_HS_DLT4_TRAIL_SHIFT      9
++# define DSI_HS_DLT4_LPX_MASK         VC4_MASK(8, 0)
++# define DSI_HS_DLT4_LPX_SHIFT                0
++
++#define DSI1_HS_DLT5          0x64
++# define DSI_HS_DLT5_INIT_MASK                VC4_MASK(23, 0)
++# define DSI_HS_DLT5_INIT_SHIFT               0
++
++#define DSI1_HS_DLT6          0x68
++# define DSI_HS_DLT6_TA_GET_MASK      VC4_MASK(31, 24)
++# define DSI_HS_DLT6_TA_GET_SHIFT     24
++# define DSI_HS_DLT6_TA_SURE_MASK     VC4_MASK(23, 16)
++# define DSI_HS_DLT6_TA_SURE_SHIFT    16
++# define DSI_HS_DLT6_TA_GO_MASK               VC4_MASK(15, 8)
++# define DSI_HS_DLT6_TA_GO_SHIFT      8
++# define DSI_HS_DLT6_LP_LPX_MASK      VC4_MASK(7, 0)
++# define DSI_HS_DLT6_LP_LPX_SHIFT     0
++
++#define DSI1_HS_DLT7          0x6c
++# define DSI_HS_DLT7_LP_WUP_MASK      VC4_MASK(23, 0)
++# define DSI_HS_DLT7_LP_WUP_SHIFT     0
++
++#define DSI1_PHY_AFEC0                0x70
++
++#define DSI1_PHY_AFEC1                0x74
++# define DSI1_PHY_AFEC1_ACTRL_DLANE3_MASK     VC4_MASK(19, 16)
++# define DSI1_PHY_AFEC1_ACTRL_DLANE3_SHIFT    16
++# define DSI1_PHY_AFEC1_ACTRL_DLANE2_MASK     VC4_MASK(15, 12)
++# define DSI1_PHY_AFEC1_ACTRL_DLANE2_SHIFT    12
++# define DSI1_PHY_AFEC1_ACTRL_DLANE1_MASK     VC4_MASK(11, 8)
++# define DSI1_PHY_AFEC1_ACTRL_DLANE1_SHIFT    8
++# define DSI1_PHY_AFEC1_ACTRL_DLANE0_MASK     VC4_MASK(7, 4)
++# define DSI1_PHY_AFEC1_ACTRL_DLANE0_SHIFT    4
++# define DSI1_PHY_AFEC1_ACTRL_CLANE_MASK      VC4_MASK(3, 0)
++# define DSI1_PHY_AFEC1_ACTRL_CLANE_SHIFT     0
++
++#define DSI1_TST_SEL          0x78
++#define DSI1_TST_MON          0x7c
++#define DSI1_PHY_TST1         0x80
++#define DSI1_PHY_TST2         0x84
++#define DSI1_PHY_FIFO_STAT    0x88
++/* Actually, all registers in the range that aren't otherwise claimed
++ * will return the ID.
++ */
++#define DSI1_ID                       0x8c
++
++/* General DSI hardware state. */
++struct vc4_dsi {
++      struct platform_device *pdev;
++
++      struct mipi_dsi_host dsi_host;
++      struct drm_encoder *encoder;
++      struct drm_connector *connector;
++      struct drm_panel *panel;
++
++      void __iomem *regs;
++
++      struct dma_chan *reg_dma_chan;
++      dma_addr_t reg_dma_paddr;
++      u32 *reg_dma_mem;
++      dma_addr_t reg_paddr;
++
++      /* Whether we're on bcm2835's DSI0 or DSI1. */
++      int port;
++
++      /* DSI channel for the panel we're connected to. */
++      u32 channel;
++      u32 lanes;
++      enum mipi_dsi_pixel_format format;
++      u32 mode_flags;
++
++      /* Input clock to the PHY, for the DSI escape clock. */
++      struct clk *escape_clock;
++
++      /* Input clock to the PHY, used to generate the DSI bit
++       * clock.
++       */
++      struct clk *pll_phy_clock;
++
++      /* Byte clock generated within the DSI PHY. */
++      struct clk_hw phy_byte_clock;
++
++      struct clk_onecell_data clk_onecell;
++
++      /* Pixel clock output to the pixelvalve, generated from the
++       * byte clock.
++       */
++      struct clk *pixel_clock;
++
++      struct completion xfer_completion;
++      int xfer_result;
++
++      bool use_firmware_setup;
++};
++
++static inline void
++dsi_write(struct vc4_dsi *dsi, u32 offset, u32 val)
++{
++      struct dma_chan *chan = dsi->reg_dma_chan;
++      struct dma_async_tx_descriptor *tx;
++      dma_cookie_t cookie;
++      int ret;
++
++#if 0 /* XXX */
++      dev_info(&dsi->pdev->dev, "WRITE 0x%04x -> 0x%08x\n", offset, val);
++#endif
++
++      if (!chan) {
++              writel(val, dsi->regs + offset);
++              return;
++      }
++
++      *dsi->reg_dma_mem = val;
++
++      tx = chan->device->device_prep_dma_memcpy(chan,
++                                                dsi->reg_paddr + offset,
++                                                dsi->reg_dma_paddr,
++                                                4, 0);
++      if (!tx) {
++              DRM_ERROR("Failed to set up DMA register write\n");
++              return;
++      }
++
++      cookie = tx->tx_submit(tx);
++      ret = dma_submit_error(cookie);
++      if (ret) {
++              DRM_ERROR("Failed to submit DMA: %d\n", ret);
++              return;
++      }
++      ret = dma_sync_wait(chan, cookie);
++      if (ret)
++              DRM_ERROR("Failed to wait for DMA: %d\n", ret);
++
++#if 0 /* XXX */
++      if (offset != DSI1_TXPKT_CMD_FIFO &&
++          offset != DSI1_TXPKT_PIX_FIFO) {
++              dev_info(&dsi->pdev->dev,
++                       "             -> 0x%08x\n",
++                       readl(dsi->regs + (offset)));
++      }
++#endif
++}
++
++#define DSI_READ(offset) readl(dsi->regs + (offset))
++#define DSI_WRITE(offset, val) dsi_write(dsi, offset, val)
++#define DSI_PORT_READ(offset) \
++      DSI_READ(dsi->port ? DSI1_##offset : DSI0_##offset)
++#define DSI_PORT_WRITE(offset, val) \
++      DSI_WRITE(dsi->port ? DSI1_##offset : DSI0_##offset, val)
++#define DSI_PORT_BIT(bit) (dsi->port ? DSI1_##bit : DSI0_##bit)
++
++/* VC4 DSI encoder KMS struct */
++struct vc4_dsi_encoder {
++      struct vc4_encoder base;
++      struct vc4_dsi *dsi;
++};
++
++static inline struct vc4_dsi_encoder *
++to_vc4_dsi_encoder(struct drm_encoder *encoder)
++{
++      return container_of(encoder, struct vc4_dsi_encoder, base.base);
++}
++#define host_to_dsi(host) container_of(host, struct vc4_dsi, dsi_host)
++
++/* VC4 DSI connector KMS struct */
++struct vc4_dsi_connector {
++      struct drm_connector base;
++      struct vc4_dsi *dsi;
++
++      /* Since the connector is attached to just the one encoder,
++       * this is the reference to it so we can do the best_encoder()
++       * hook.
++       */
++      struct drm_encoder *encoder;
++};
++
++static inline struct vc4_dsi_connector *
++to_vc4_dsi_connector(struct drm_connector *connector)
++{
++      return container_of(connector, struct vc4_dsi_connector, base);
++}
++
++static const struct debugfs_reg32 dsi0_regs[] = {
++      VC4_DEBUG_REG(DSI0_CTRL),
++      VC4_DEBUG_REG(DSI0_STAT),
++      VC4_DEBUG_REG(DSI0_DISP0_CTRL),
++      VC4_DEBUG_REG(DSI0_DISP1_CTRL),
++      VC4_DEBUG_REG(DSI0_PHYC),
++      VC4_DEBUG_REG(DSI0_STAT),
++      VC4_DEBUG_REG(DSI0_HS_CLT0),
++      VC4_DEBUG_REG(DSI0_HS_CLT1),
++      VC4_DEBUG_REG(DSI0_HS_CLT2),
++      VC4_DEBUG_REG(DSI0_HS_DLT3),
++      VC4_DEBUG_REG(DSI0_HS_DLT4),
++      VC4_DEBUG_REG(DSI0_HS_DLT5),
++      VC4_DEBUG_REG(DSI0_HS_DLT6),
++      VC4_DEBUG_REG(DSI0_HS_DLT7),
++      VC4_DEBUG_REG(DSI0_PHY_AFEC0),
++      VC4_DEBUG_REG(DSI0_PHY_AFEC1),
++      VC4_DEBUG_REG(DSI0_ID),
++};
++
++static const struct debugfs_reg32 dsi1_regs[] = {
++      VC4_DEBUG_REG(DSI1_CTRL),
++      VC4_DEBUG_REG(DSI1_STAT),
++      VC4_DEBUG_REG(DSI1_DISP0_CTRL),
++      VC4_DEBUG_REG(DSI1_DISP1_CTRL),
++      VC4_DEBUG_REG(DSI1_PHYC),
++      VC4_DEBUG_REG(DSI1_STAT),
++      VC4_DEBUG_REG(DSI1_HS_CLT0),
++      VC4_DEBUG_REG(DSI1_HS_CLT1),
++      VC4_DEBUG_REG(DSI1_HS_CLT2),
++      VC4_DEBUG_REG(DSI1_HS_DLT3),
++      VC4_DEBUG_REG(DSI1_HS_DLT4),
++      VC4_DEBUG_REG(DSI1_HS_DLT5),
++      VC4_DEBUG_REG(DSI1_HS_DLT6),
++      VC4_DEBUG_REG(DSI1_HS_DLT7),
++      VC4_DEBUG_REG(DSI1_PHY_AFEC0),
++      VC4_DEBUG_REG(DSI1_PHY_AFEC1),
++      VC4_DEBUG_REG(DSI1_ID),
++};
++
++static void vc4_dsi_dump_regs(struct vc4_dsi *dsi, const char *prefix)
++{
++      if (dsi->port == 0) {
++              vc4_dump_regs32(dsi0_regs, ARRAY_SIZE(dsi0_regs), dsi->regs,
++                              prefix);
++      } else {
++              vc4_dump_regs32(dsi1_regs, ARRAY_SIZE(dsi1_regs), dsi->regs,
++                              prefix);
++      }
++}
++
++#ifdef CONFIG_DEBUG_FS
++int vc4_dsi_debugfs_regs(struct seq_file *m, void *number)
++{
++      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);
++      struct vc4_dsi *dsi;
++      int port = (uintptr_t)number;
++
++      if (port == 0) {
++              dsi = vc4->dsi0;
++              debugfs_print_regs32(m, dsi0_regs, ARRAY_SIZE(dsi0_regs),
++                                   dsi->regs, "");
++      } else {
++              dsi = vc4->dsi1;
++              debugfs_print_regs32(m, dsi1_regs, ARRAY_SIZE(dsi1_regs),
++                                   dsi->regs, "");
++      }
++
++      return 0;
++}
++#endif
++
++static enum drm_connector_status
++vc4_dsi_connector_detect(struct drm_connector *connector, bool force)
++{
++      struct vc4_dsi_connector *vc4_connector =
++              to_vc4_dsi_connector(connector);
++      struct vc4_dsi *dsi = vc4_connector->dsi;
++
++      if (dsi->panel)
++              return connector_status_connected;
++      else
++              return connector_status_disconnected;
++}
++
++static void vc4_dsi_connector_destroy(struct drm_connector *connector)
++{
++      drm_connector_unregister(connector);
++      drm_connector_cleanup(connector);
++}
++
++static int vc4_dsi_connector_get_modes(struct drm_connector *connector)
++{
++      struct vc4_dsi_connector *vc4_connector =
++              to_vc4_dsi_connector(connector);
++      struct vc4_dsi *dsi = vc4_connector->dsi;
++
++      if (dsi->panel)
++              return drm_panel_get_modes(dsi->panel);
++
++      return 0;
++}
++
++static struct drm_encoder *
++vc4_dsi_connector_best_encoder(struct drm_connector *connector)
++{
++      struct vc4_dsi_connector *dsi_connector =
++              to_vc4_dsi_connector(connector);
++      return dsi_connector->encoder;
++}
++
++static const struct drm_connector_funcs vc4_dsi_connector_funcs = {
++      .dpms = drm_atomic_helper_connector_dpms,
++      .detect = vc4_dsi_connector_detect,
++      .fill_modes = drm_helper_probe_single_connector_modes,
++      .destroy = vc4_dsi_connector_destroy,
++      .reset = drm_atomic_helper_connector_reset,
++      .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
++      .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
++};
++
++static const struct drm_connector_helper_funcs vc4_dsi_connector_helper_funcs = {
++      .get_modes = vc4_dsi_connector_get_modes,
++      .best_encoder = vc4_dsi_connector_best_encoder,
++};
++
++static struct drm_connector *vc4_dsi_connector_init(struct drm_device *dev,
++                                                  struct vc4_dsi *dsi)
++{
++      struct drm_connector *connector = NULL;
++      struct vc4_dsi_connector *dsi_connector;
++      int ret = 0;
++
++      dsi_connector = devm_kzalloc(dev->dev, sizeof(*dsi_connector),
++                                    GFP_KERNEL);
++      if (!dsi_connector) {
++              ret = -ENOMEM;
++              goto fail;
++      }
++      connector = &dsi_connector->base;
++
++      dsi_connector->encoder = dsi->encoder;
++      dsi_connector->dsi = dsi;
++
++      drm_connector_init(dev, connector, &vc4_dsi_connector_funcs,
++                         DRM_MODE_CONNECTOR_DSI);
++      drm_connector_helper_add(connector, &vc4_dsi_connector_helper_funcs);
++
++      connector->polled = 0;
++      connector->interlace_allowed = 0;
++      connector->doublescan_allowed = 0;
++
++      drm_mode_connector_attach_encoder(connector, dsi->encoder);
++
++      return connector;
++
++ fail:
++      if (connector)
++              vc4_dsi_connector_destroy(connector);
++
++      return ERR_PTR(ret);
++}
++
++static void vc4_dsi_encoder_destroy(struct drm_encoder *encoder)
++{
++      drm_encoder_cleanup(encoder);
++}
++
++static const struct drm_encoder_funcs vc4_dsi_encoder_funcs = {
++      .destroy = vc4_dsi_encoder_destroy,
++};
++
++static void vc4_dsi_latch_ulps(struct vc4_dsi *dsi, bool latch)
++{
++      u32 afec0 = DSI_PORT_READ(PHY_AFEC0);
++
++      if (latch)
++              afec0 |= DSI_PORT_BIT(PHY_AFEC0_LATCH_ULPS);
++      else
++              afec0 &= ~DSI_PORT_BIT(PHY_AFEC0_LATCH_ULPS);
++
++      DSI_PORT_WRITE(PHY_AFEC0, afec0);
++}
++
++/* Enters or exits Ultra Low Power State. */
++static void vc4_dsi_ulps(struct vc4_dsi *dsi, bool ulps)
++{
++      u32 phyc_ulps = (DSI_PORT_BIT(PHYC_CLANE_ULPS) |
++                       DSI_PHYC_DLANE0_ULPS |
++                       (dsi->lanes > 1 ? DSI_PHYC_DLANE1_ULPS : 0) |
++                       (dsi->lanes > 2 ? DSI_PHYC_DLANE2_ULPS : 0) |
++                       (dsi->lanes > 3 ? DSI_PHYC_DLANE3_ULPS : 0));
++      u32 stat_ulps = (DSI1_STAT_PHY_CLOCK_ULPS |
++                       DSI1_STAT_PHY_D0_ULPS |
++                       (dsi->lanes > 1 ? DSI1_STAT_PHY_D1_ULPS : 0) |
++                       (dsi->lanes > 2 ? DSI1_STAT_PHY_D2_ULPS : 0) |
++                       (dsi->lanes > 3 ? DSI1_STAT_PHY_D3_ULPS : 0));
++      u32 stat_stop = (DSI1_STAT_PHY_CLOCK_STOP |
++                       DSI1_STAT_PHY_D0_STOP |
++                       (dsi->lanes > 1 ? DSI1_STAT_PHY_D1_STOP : 0) |
++                       (dsi->lanes > 2 ? DSI1_STAT_PHY_D2_STOP : 0) |
++                       (dsi->lanes > 3 ? DSI1_STAT_PHY_D3_STOP : 0));
++      int ret;
++
++      DSI_PORT_WRITE(STAT, stat_ulps);
++      DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) | phyc_ulps);
++      ret = wait_for((DSI_PORT_READ(STAT) & stat_ulps) == stat_ulps, 20);
++      if (ret) {
++              dev_warn(&dsi->pdev->dev,
++                       "Timeout waiting for DSI ULPS entry: STAT 0x%08x",
++                       DSI_PORT_READ(STAT));
++              DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) & ~phyc_ulps);
++              vc4_dsi_latch_ulps(dsi, false);
++              return;
++      }
++
++      /* The DSI module can't be disabled while the module is
++       * generating ULPS state.  So, to be able to disable the
++       * module, we have the AFE latch the ULPS state and continue
++       * on to having the module enter STOP.
++       */
++      vc4_dsi_latch_ulps(dsi, ulps);
++
++      DSI_PORT_WRITE(STAT, stat_stop);
++      DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) & ~phyc_ulps);
++      ret = wait_for((DSI_PORT_READ(STAT) & stat_stop) == stat_stop, 20);
++      if (ret) {
++              dev_warn(&dsi->pdev->dev,
++                       "Timeout waiting for DSI STOP entry: STAT 0x%08x",
++                       DSI_PORT_READ(STAT));
++              DSI_PORT_WRITE(PHYC, DSI_PORT_READ(PHYC) & ~phyc_ulps);
++              return;
++      }
++}
++
++static uint32_t
++dsi_hs_timing(u32 ui_ns, u32 ns, u32 ui)
++{
++      /* The HS timings have to be rounded up to a multiple of 8
++       * because we're using the byte clock.
++       */
++      return roundup(ui + DIV_ROUND_UP(ns, ui_ns), 8);
++}
++
++/* ESC always runs at 100Mhz. */
++#define ESC_TIME_NS 10
++
++static uint32_t
++dsi_esc_timing(u32 ns)
++{
++      return DIV_ROUND_UP(ns, ESC_TIME_NS);
++}
++
++static void vc4_dsi_encoder_disable(struct drm_encoder *encoder)
++{
++      struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder);
++      struct vc4_dsi *dsi = vc4_encoder->dsi;
++
++      drm_panel_disable(dsi->panel);
++
++      if (!dsi->use_firmware_setup)
++              vc4_dsi_ulps(dsi, true);
++
++      drm_panel_unprepare(dsi->panel);
++
++      if (dsi->use_firmware_setup) {
++              /* Since we're using the firmware setup and aren't
++               * communicating with the panel to bring the link
++               * down, we need to just keep the clocks and DSI
++               * module running.
++               */
++      } else {
++              clk_disable_unprepare(dsi->pll_phy_clock);
++              clk_disable_unprepare(dsi->escape_clock);
++              clk_disable_unprepare(dsi->pixel_clock);
++      }
++}
++
++static void vc4_dsi_encoder_enable(struct drm_encoder *encoder)
++{
++      struct drm_display_mode *mode = &encoder->crtc->mode;
++      struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder);
++      struct vc4_dsi *dsi = vc4_encoder->dsi;
++      struct device *dev = &dsi->pdev->dev;
++      uint32_t format = 0, divider = 0;
++      bool debug_dump_regs = false;
++      unsigned long hs_clock;
++      uint32_t ui_ns;
++      /* Minimum LP state duration in escape clock cycles. */
++      uint32_t lpx = dsi_esc_timing(60);
++      uint32_t phyc;
++      int ret;
++
++      ret = drm_panel_prepare(dsi->panel);
++      if (ret) {
++              DRM_ERROR("Panel failed to prepare\n");
++              return;
++      }
++
++      if (debug_dump_regs)
++              vc4_dsi_dump_regs(dsi, "DSI before: ");
++
++      /* XXX */
++      if (!dsi->use_firmware_setup) {
++              ret = clk_set_rate(dsi->pll_phy_clock, 2020000000 / 3);
++              if (ret)
++                      dev_err(&dsi->pdev->dev, "Failed to set phy clock: %d\n", ret);
++              dev_info(&dsi->pdev->dev, "Tried to set clock to: %d\n", 2000000000 / 3);
++
++              ret = clk_prepare_enable(dsi->escape_clock);
++              if (ret) {
++                      DRM_ERROR("Failed to turn on DSI escape clock: %d\n", ret);
++                      return;
++              }
++
++              ret = clk_prepare_enable(dsi->pll_phy_clock);
++              if (ret) {
++                      DRM_ERROR("Failed to turn on DSI PLL: %d\n", ret);
++                      return;
++              }
++
++              ret = clk_set_rate(dsi->pixel_clock, mode->clock * 1000);
++              if (ret)
++                      dev_err(dev, "Failed to set pixel clock: %d\n", ret);
++              dev_info(&dsi->pdev->dev, "Tried to set pixel clock to: %d\n", mode->clock * 1000);
++
++              ret = clk_prepare_enable(dsi->pixel_clock);
++              if (ret) {
++                      DRM_ERROR("Failed to turn on DSI pixel clock: %d\n", ret);
++                      return;
++              }
++      }
++
++      hs_clock = clk_get_rate(dsi->pll_phy_clock);
++
++      /* Reset the DSI and all its fifos. */
++      if (dsi->port == 0) {
++              DSI_PORT_WRITE(CTRL,
++                             DSI_CTRL_SOFT_RESET_CFG |
++                             DSI0_CTRL_RESET_FIFOS);
++      } else {
++              DSI_PORT_WRITE(CTRL,
++                             DSI_CTRL_SOFT_RESET_CFG |
++                             DSI1_CTRL_RESET_FIFOS);
++      }
++
++      DSI_PORT_WRITE(CTRL,
++                     DSI_CTRL_HSDT_EOT_DISABLE |
++                     DSI_CTRL_RX_LPDT_EOT_DISABLE);
++
++      switch (dsi->format) {
++      case MIPI_DSI_FMT_RGB888:
++              format = DSI_PFORMAT_RGB888;
++              divider = 24 / dsi->lanes;
++              break;
++      case MIPI_DSI_FMT_RGB666:
++              format = DSI_PFORMAT_RGB666;
++              divider = 24 / dsi->lanes;
++              break;
++      case MIPI_DSI_FMT_RGB666_PACKED:
++              format = DSI_PFORMAT_RGB666_PACKED;
++              divider = 18 / dsi->lanes;
++              break;
++      case MIPI_DSI_FMT_RGB565:
++              format = DSI_PFORMAT_RGB565;
++              divider = 16 / dsi->lanes;
++              break;
++      }
++
++      /* Set AFE CTR00/CTR1 to release powerdown of analog. */
++      if (dsi->port == 0) {
++              u32 afec0 = (VC4_SET_FIELD(7, DSI_PHY_AFEC0_PTATADJ) |
++                           VC4_SET_FIELD(7, DSI_PHY_AFEC0_CTATADJ));
++
++              if (dsi->lanes < 2)
++                      afec0 |= DSI0_PHY_AFEC0_PD_DLANE1;
++
++              if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO))
++                      afec0 |= DSI0_PHY_AFEC0_RESET;
++
++              DSI_PORT_WRITE(PHY_AFEC0, afec0);
++
++              DSI_PORT_WRITE(PHY_AFEC1,
++                        VC4_SET_FIELD(6,  DSI0_PHY_AFEC1_IDR_DLANE1) |
++                        VC4_SET_FIELD(6,  DSI0_PHY_AFEC1_IDR_DLANE0) |
++                        VC4_SET_FIELD(6,  DSI0_PHY_AFEC1_IDR_CLANE));
++      } else {
++              u32 afec0 = (VC4_SET_FIELD(7, DSI_PHY_AFEC0_PTATADJ) |
++                           VC4_SET_FIELD(7, DSI_PHY_AFEC0_CTATADJ) |
++                           VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_CLANE) |
++                           VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE0) |
++                           VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE1) |
++                           VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE2) |
++                           VC4_SET_FIELD(6, DSI1_PHY_AFEC0_IDR_DLANE3));
++
++              if (dsi->lanes < 4)
++                      afec0 |= DSI1_PHY_AFEC0_PD_DLANE3;
++              if (dsi->lanes < 3)
++                      afec0 |= DSI1_PHY_AFEC0_PD_DLANE2;
++              if (dsi->lanes < 2)
++                      afec0 |= DSI1_PHY_AFEC0_PD_DLANE1;
++
++              if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO))
++                      afec0 |= DSI1_PHY_AFEC0_RESET;
++
++              DSI_PORT_WRITE(PHY_AFEC0, afec0);
++
++              DSI_PORT_WRITE(PHY_AFEC1, 0);
++      }
++
++      /* How many ns one DSI unit interval is.  Note that the clock
++       * is DDR, so there's an extra divide by 2.
++       */
++      ui_ns = DIV_ROUND_UP(500000000, hs_clock);
++
++      DSI_PORT_WRITE(HS_CLT0,
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 262, 0),
++                                   DSI_HS_CLT0_CZERO) |
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 0, 8),
++                                   DSI_HS_CLT0_CPRE) |
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 38, 0),
++                                   DSI_HS_CLT0_CPREP));
++
++      DSI_PORT_WRITE(HS_CLT1,
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 60, 0),
++                                   DSI_HS_CLT1_CTRAIL) |
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 60, 52),
++                                   DSI_HS_CLT1_CPOST));
++
++      DSI_PORT_WRITE(HS_CLT2,
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 1000000, 0),
++                                   DSI_HS_CLT2_WUP));
++
++      DSI_PORT_WRITE(HS_DLT3,
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 100, 0),
++                                   DSI_HS_DLT3_EXIT) |
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 105, 6),
++                                   DSI_HS_DLT3_ZERO) |
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, 40, 4),
++                                   DSI_HS_DLT3_PRE));
++
++      DSI_PORT_WRITE(HS_DLT4,
++                     VC4_SET_FIELD(dsi_hs_timing(ui_ns, lpx * ESC_TIME_NS, 0),
++                                   DSI_HS_DLT4_LPX) |
++                     VC4_SET_FIELD(max(dsi_hs_timing(ui_ns, 0, 8),
++                                       dsi_hs_timing(ui_ns, 60, 4)),
++                                   DSI_HS_DLT4_TRAIL) |
++                     VC4_SET_FIELD(0, DSI_HS_DLT4_ANLAT));
++
++      DSI_PORT_WRITE(HS_DLT5, VC4_SET_FIELD(dsi_hs_timing(ui_ns, 1000, 5000),
++                                            DSI_HS_DLT5_INIT));
++
++      DSI_PORT_WRITE(HS_DLT6,
++                     VC4_SET_FIELD(lpx * 5, DSI_HS_DLT6_TA_GET) |
++                     VC4_SET_FIELD(lpx, DSI_HS_DLT6_TA_SURE) |
++                     VC4_SET_FIELD(lpx * 4, DSI_HS_DLT6_TA_GO) |
++                     VC4_SET_FIELD(lpx, DSI_HS_DLT6_LP_LPX));
++
++      DSI_PORT_WRITE(HS_DLT7,
++                     VC4_SET_FIELD(dsi_esc_timing(1000000),
++                                   DSI_HS_DLT7_LP_WUP));
++
++      /* Define EOT PKT in EOT reg. */
++
++      phyc = (DSI_PHYC_DLANE0_ENABLE |
++              (dsi->lanes >= 2 ? DSI_PHYC_DLANE1_ENABLE : 0) |
++              (dsi->lanes >= 3 ? DSI_PHYC_DLANE2_ENABLE : 0) |
++              (dsi->lanes >= 4 ? DSI_PHYC_DLANE3_ENABLE : 0) |
++              (dsi->port == 0 ?
++               VC4_SET_FIELD(lpx - 1, DSI0_PHYC_ESC_CLK_LPDT) :
++               VC4_SET_FIELD(lpx - 1, DSI1_PHYC_ESC_CLK_LPDT)) |
++              DSI_PORT_BIT(PHYC_CLANE_ENABLE));
++
++      DSI_PORT_WRITE(CTRL,
++                     DSI_PORT_READ(CTRL) |
++                     DSI_CTRL_CAL_BYTE);
++
++      /* HS timeout in HS clock cycles: disabled. */
++      DSI_PORT_WRITE(HSTX_TO_CNT, 0);
++      /* LP receive timeout in HS clocks. */
++      DSI_PORT_WRITE(LPRX_TO_CNT, 0xffffff);
++      /* Bus turnaround timeout */
++      DSI_PORT_WRITE(TA_TO_CNT, 100000);
++      /* Display reset sequence timeout */
++      DSI_PORT_WRITE(TA_TO_CNT, 100000);
++
++      if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
++              DSI_PORT_WRITE(DISP0_CTRL,
++                             VC4_SET_FIELD(divider, DSI_DISP0_PIX_CLK_DIV) |
++                             VC4_SET_FIELD(format, DSI_DISP0_PFORMAT) |
++                             VC4_SET_FIELD(DSI_DISP0_LP_STOP_PERFRAME,
++                                           DSI_DISP0_LP_STOP_CTRL) |
++                             DSI_DISP0_ST_END |
++                             DSI_DISP0_ENABLE);
++      } else {
++              DSI_PORT_WRITE(DISP0_CTRL,
++                             DSI_DISP0_COMMAND_MODE |
++                             DSI_DISP0_ENABLE);
++      }
++
++      /* Set up DISP1 for transferring long command payloads through
++       * the pixfifo.
++       */
++      DSI_PORT_WRITE(DISP1_CTRL,
++                     VC4_SET_FIELD(DSI_DISP1_PFORMAT_32BIT_LE,
++                                   DSI_DISP1_PFORMAT) |
++                     DSI_DISP1_ENABLE);
++
++      if (!(dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS))
++              phyc |= DSI_PORT_BIT(PHYC_HS_CLK_CONTINUOUS);
++
++      DSI_PORT_WRITE(PHYC, phyc);
++
++      /* Ungate the block. */
++      if (dsi->port == 0)
++              DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI0_CTRL_CTRL0);
++      else {
++              DSI_PORT_WRITE(CTRL, DSI_PORT_READ(CTRL) | DSI1_CTRL_EN);
++      }
++
++      if (!dsi->use_firmware_setup)
++              vc4_dsi_ulps(dsi, false);
++
++      if (debug_dump_regs)
++              vc4_dsi_dump_regs(dsi, "DSI after: ");
++
++      ret = drm_panel_enable(dsi->panel);
++      if (ret) {
++              DRM_ERROR("Panel failed to enable\n");
++              drm_panel_unprepare(dsi->panel);
++              return;
++      }
++}
++
++static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host,
++                                   const struct mipi_dsi_msg *msg)
++{
++      struct vc4_dsi *dsi = host_to_dsi(host);
++      struct mipi_dsi_packet packet;
++      u32 pkth = 0, pktc = 0;
++      int i, ret;
++      bool is_long = mipi_dsi_packet_format_is_long(msg->type);
++      u32 cmd_fifo_len = 0, pix_fifo_len = 0;
++
++      mipi_dsi_create_packet(&packet, msg);
++      pr_err("DSI host xfer %db, %s\n",
++             packet.payload_length,
++             is_long ? "long" : "short");
++
++      pkth |= VC4_SET_FIELD(packet.header[0], DSI_TXPKT1H_BC_DT);
++      pkth |= VC4_SET_FIELD(packet.header[1] |
++                            (packet.header[2] << 8),
++                            DSI_TXPKT1H_BC_PARAM);
++      if (is_long) {
++              /* Divide data across the various FIFOs we have available.
++               * The command FIFO takes byte-oriented data, but is of
++               * limited size. The pixel FIFO (never actually used for
++               * pixel data in reality) is word oriented, and substantially
++               * larger. So, we use the pixel FIFO for most of the data,
++               * sending the residual bytes in the command FIFO at the start.
++               *
++               * With this arrangement, the command FIFO will never get full.
++               */
++              cmd_fifo_len = packet.payload_length % DSI_PIX_FIFO_WIDTH;
++              pix_fifo_len = ((packet.payload_length - cmd_fifo_len) /
++                              DSI_PIX_FIFO_WIDTH);
++
++              WARN_ON_ONCE(pix_fifo_len >= DSI_PIX_FIFO_DEPTH);
++
++              pkth |= VC4_SET_FIELD(cmd_fifo_len, DSI_TXPKT1H_BC_CMDFIFO);
++      }
++
++      if (msg->rx_len) {
++              pktc |= VC4_SET_FIELD(DSI_TXPKT1C_CMD_CTRL_RX,
++                                    DSI_TXPKT1C_CMD_CTRL);
++      } else {
++              pktc |= VC4_SET_FIELD(DSI_TXPKT1C_CMD_CTRL_TX,
++                                    DSI_TXPKT1C_CMD_CTRL);
++      }
++
++      dev_info(&dsi->pdev->dev, "FIFO setup: %d, %d\n",
++               cmd_fifo_len, pix_fifo_len);
++
++      for (i = 0; i < cmd_fifo_len; i++)
++              DSI_PORT_WRITE(TXPKT_CMD_FIFO, packet.payload[i]);
++      for (i = 0; i < pix_fifo_len; i++) {
++              const uint8_t *pix = packet.payload + cmd_fifo_len + i * 4;
++              DSI_PORT_WRITE(TXPKT_PIX_FIFO,
++                             pix[0] |
++                             pix[1] << 8 |
++                             pix[2] << 16 |
++                             pix[3] << 24);
++      }
++
++      if (msg->flags & MIPI_DSI_MSG_USE_LPM)
++              pktc |= DSI_TXPKT1C_CMD_MODE_LP;
++      if (is_long)
++              pktc |= DSI_TXPKT1C_CMD_TYPE_LONG;
++
++      /* Send one copy of the packet.  Larger repeats are used for pixel
++       * data in command mode.
++       */
++      pktc |= VC4_SET_FIELD(1, DSI_TXPKT1C_CMD_REPEAT);
++
++      pktc |= DSI_TXPKT1C_CMD_EN;
++      if (pix_fifo_len) {
++              pktc |= VC4_SET_FIELD(DSI_TXPKT1C_DISPLAY_NO_SECONDARY,
++                                    DSI_TXPKT1C_DISPLAY_NO);
++      } else {
++              pktc |= VC4_SET_FIELD(DSI_TXPKT1C_DISPLAY_NO_SHORT,
++                                    DSI_TXPKT1C_DISPLAY_NO);
++      }
++
++      /* Enable the appropriate interrupt for the transfer completion. */
++      dsi->xfer_result = 0;
++      reinit_completion(&dsi->xfer_completion);
++      DSI_PORT_WRITE(INT_STAT, DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF);
++      if (msg->rx_len) {
++              DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED |
++                                      DSI1_INT_PHY_DIR_RTF));
++      } else {
++              DSI_PORT_WRITE(INT_EN, (DSI1_INTERRUPTS_ALWAYS_ENABLED |
++                                      DSI1_INT_TXPKT1_DONE));
++      }
++
++      /* Send the packet. */
++      DSI_PORT_WRITE(TXPKT1H, pkth);
++      DSI_PORT_WRITE(TXPKT1C, pktc);
++
++      if (!wait_for_completion_timeout(&dsi->xfer_completion,
++                                       msecs_to_jiffies(100))) {
++              u32 stat = DSI_PORT_READ(STAT);
++
++              dev_err(&dsi->pdev->dev, "transfer interrupt wait timeout");
++              dev_err(&dsi->pdev->dev, "INT_STAT: 0x%08x, STAT: 0x%08x\n",
++                      DSI_PORT_READ(INT_STAT), stat);
++
++              if (stat & DSI1_STAT_TXPKT1_DONE) {
++                      dev_info(&dsi->pdev->dev,
++                               "STAT reports DONE, though.\n");
++                      ret = 0;
++              } else {
++                      ret = -ETIMEDOUT;
++              }
++      } else {
++              ret = dsi->xfer_result;
++      }
++
++      DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED);
++      if (ret)
++              goto reset_fifo_and_return;
++
++      if (ret == 0 && msg->rx_len) {
++              u32 rxpkt1h = DSI_PORT_READ(RXPKT1H);
++              u8 *msg_rx = msg->rx_buf;
++
++              if (rxpkt1h & DSI_RXPKT1H_PKT_TYPE_LONG) {
++                      u32 rxlen = VC4_GET_FIELD(rxpkt1h, DSI_RXPKT1H_BC_PARAM);
++
++                      if (rxlen != msg->rx_len) {
++                              DRM_ERROR("DSI returned %db, expecting %db\n",
++                                        rxlen, msg->rx_len);
++                              ret = -ENXIO;
++                              goto reset_fifo_and_return;
++                      }
++
++                      for (i = 0; i < msg->rx_len; i++)
++                              msg_rx[i] = DSI_READ(DSI1_RXPKT_FIFO);
++              } else {
++                      /* XXX: AWER */
++
++                      msg_rx[0] = VC4_GET_FIELD(rxpkt1h,
++                                                DSI_RXPKT1H_SHORT_0);
++                      if (msg->rx_len > 1) {
++                              msg_rx[1] = VC4_GET_FIELD(rxpkt1h,
++                                                        DSI_RXPKT1H_SHORT_1);
++                      }
++              }
++      }
++
++      return ret;
++
++reset_fifo_and_return:
++      DRM_ERROR("DSI TRANSFER failed, resetting: %d\n", ret);
++
++      DSI_PORT_WRITE(TXPKT1C, DSI_PORT_READ(TXPKT1C) & ~DSI_TXPKT1C_CMD_EN);
++      udelay(1);
++      if (dsi->port == 0) {
++              DSI_PORT_WRITE(CTRL,
++                             DSI_PORT_READ(CTRL) | DSI0_CTRL_RESET_FIFOS);
++      } else {
++              DSI_PORT_WRITE(CTRL,
++                             DSI_PORT_READ(CTRL) | DSI1_CTRL_RESET_FIFOS);
++      }
++
++      DSI_PORT_WRITE(TXPKT1C, 0);
++      DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED);
++
++
++      return ret;
++}
++
++static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
++                             struct mipi_dsi_device *device)
++{
++      struct vc4_dsi *dsi = host_to_dsi(host);
++
++      dsi->lanes = device->lanes;
++      dsi->channel = device->channel;
++      dsi->format = device->format;
++      dsi->mode_flags = device->mode_flags;
++
++      if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO)) {
++              dev_err(&dsi->pdev->dev,
++                      "Only VIDEO mode panels supported currently.\n");
++              return 0;
++      }
++
++      dsi->panel = of_drm_find_panel(device->dev.of_node);
++      if (dsi->panel)
++              return drm_panel_attach(dsi->panel, dsi->connector);
++
++      drm_helper_hpd_irq_event(dsi->connector->dev);
++
++      return 0;
++}
++
++static int vc4_dsi_host_detach(struct mipi_dsi_host *host,
++                             struct mipi_dsi_device *device)
++{
++      struct vc4_dsi *dsi = host_to_dsi(host);
++
++      if (dsi->panel) {
++              int ret = drm_panel_detach(dsi->panel);
++              if (ret)
++                      return ret;
++
++              dsi->panel = NULL;
++      }
++
++      drm_helper_hpd_irq_event(dsi->connector->dev);
++
++      return 0;
++}
++
++static const struct mipi_dsi_host_ops vc4_dsi_host_ops = {
++      .attach = vc4_dsi_host_attach,
++      .detach = vc4_dsi_host_detach,
++      .transfer = vc4_dsi_host_transfer,
++};
++
++static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = {
++      .disable = vc4_dsi_encoder_disable,
++      .enable = vc4_dsi_encoder_enable,
++};
++
++static const struct of_device_id vc4_dsi_dt_match[] = {
++      { .compatible = "brcm,bcm2835-dsi0", (void *)(uintptr_t)0 },
++      { .compatible = "brcm,bcm2835-dsi1", (void *)(uintptr_t)1 },
++      {}
++};
++
++static long vc4_dsi_byte_clock_round_rate(struct clk_hw *hw, unsigned long rate,
++                                        unsigned long *parent_rate)
++{
++      return *parent_rate / 8;
++}
++
++static unsigned long vc4_dsi_byte_clock_get_rate(struct clk_hw *hw,
++                                        unsigned long parent_rate)
++{
++      return parent_rate / 8;
++}
++
++static int vc4_dsi_byte_clock_set_rate(struct clk_hw *hw,
++                                     unsigned long rate,
++                                     unsigned long parent_rate)
++{
++      return 0;
++}
++
++/* The byte clock has *no* ops filled.  It's always running when the
++ * PHY is.
++ */
++static const struct clk_ops vc4_dsi_byte_clock_ops = {
++      .recalc_rate = vc4_dsi_byte_clock_get_rate,
++      .set_rate = vc4_dsi_byte_clock_set_rate,
++      .round_rate = vc4_dsi_byte_clock_round_rate,
++};
++
++static void dsi_handle_error(struct vc4_dsi *dsi,
++                           irqreturn_t *ret, u32 stat, u32 bit,
++                           const char *type)
++{
++      if (!(stat & bit))
++              return;
++
++      DRM_ERROR("DSI%d: %s error\n", dsi->port, type);
++      *ret = IRQ_HANDLED;
++}
++
++static irqreturn_t vc4_dsi_irq_handler(int irq, void *data)
++{
++      struct vc4_dsi *dsi = data;
++      u32 stat = DSI_PORT_READ(INT_STAT);
++      irqreturn_t ret = IRQ_NONE;
++
++      DSI_PORT_WRITE(INT_STAT, stat);
++
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_ERR_SYNC_ESC, "LPDT sync");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_ERR_CONTROL, "data lane 0 sequence");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_ERR_CONT_LP0, "LP0 contention");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_ERR_CONT_LP1, "LP1 contention");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_HSTX_TO, "HSTX timeout");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_LPRX_TO, "LPRX timeout");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_TA_TO, "turnaround timeout");
++      dsi_handle_error(dsi, &ret, stat,
++                       DSI1_INT_PR_TO, "peripheral reset timeout");
++
++      if (stat & (DSI1_INT_TXPKT1_DONE | DSI1_INT_PHY_DIR_RTF)) {
++              complete(&dsi->xfer_completion);
++              ret = IRQ_HANDLED;
++      } else if (stat & DSI1_INT_HSTX_TO) {
++              complete(&dsi->xfer_completion);
++              dsi->xfer_result = -ETIMEDOUT;
++              ret = IRQ_HANDLED;
++      }
++
++      return ret;
++}
++
++static int
++vc4_dsi_init_phy_byte_clock(struct vc4_dsi *dsi)
++{
++      struct device *dev = &dsi->pdev->dev;
++      const char *parent_name = __clk_get_name(dsi->pll_phy_clock);
++      struct clk_init_data init;
++      struct clk *clk;
++
++      memset(&init, 0, sizeof(init));
++      init.parent_names = &parent_name;
++      init.num_parents = 1;
++      if (dsi->port == 1)
++              init.name = "dsi1_byte";
++      else
++              init.name = "dsi0_byte";
++      init.ops = &vc4_dsi_byte_clock_ops;
++      init.flags = 0;
++
++      dsi->phy_byte_clock.init = &init;
++      clk = devm_clk_register(dev, &dsi->phy_byte_clock);
++      if (IS_ERR(clk))
++              return PTR_ERR(clk);
++
++      /* Use the onecell provider because we may need to expose the
++       * DDR and DDR2 clocks at some point, which we'd want to put
++       * in slots 1 and 2.
++       */
++      dsi->clk_onecell.clk_num = 1;
++      dsi->clk_onecell.clks = devm_kcalloc(dev,
++                                           dsi->clk_onecell.clk_num,
++                                           sizeof(*dsi->clk_onecell.clks),
++                                           GFP_KERNEL);
++      if (!dsi->clk_onecell.clks)
++              return -ENOMEM;
++
++      dsi->clk_onecell.clks[0] = clk;
++
++      return of_clk_add_provider(dev->of_node,
++                                 of_clk_src_onecell_get,
++                                 &dsi->clk_onecell);
++}
++
++static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
++{
++      struct platform_device *pdev = to_platform_device(dev);
++      struct drm_device *drm = dev_get_drvdata(master);
++      struct vc4_dev *vc4 = to_vc4_dev(drm);
++      struct vc4_dsi *dsi;
++      struct vc4_dsi_encoder *vc4_dsi_encoder;
++      const struct of_device_id *match;
++      dma_cap_mask_t dma_mask;
++      int ret;
++
++      dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
++      if (!dsi)
++              return -ENOMEM;
++
++      match = of_match_device(vc4_dsi_dt_match, dev);
++      if (!match)
++              return -ENODEV;
++
++      dsi->port = (uintptr_t)match->data;
++
++      vc4_dsi_encoder = devm_kzalloc(dev, sizeof(*vc4_dsi_encoder),
++                                     GFP_KERNEL);
++      if (!vc4_dsi_encoder)
++              return -ENOMEM;
++      vc4_dsi_encoder->base.type = VC4_ENCODER_TYPE_DSI1;
++      vc4_dsi_encoder->dsi = dsi;
++      dsi->encoder = &vc4_dsi_encoder->base.base;
++
++      dsi->pdev = pdev;
++      dsi->regs = vc4_ioremap_regs(pdev, 0);
++      if (IS_ERR(dsi->regs))
++              return PTR_ERR(dsi->regs);
++
++      if (DSI_PORT_READ(ID) != DSI_ID_VALUE) {
++              dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n",
++                      DSI_PORT_READ(ID), DSI_ID_VALUE);
++              return -ENODEV;
++      }
++
++      if (DSI_PORT_READ(CTRL) == 0) {
++              dev_info(dev, "DSI not set up by firmware.\n");
++              return 0;
++      }
++
++      /* Set this flag to indicate that we're relying on boot-time
++       * DSI state and can't successfully reconfigure DSI yet.
++       */
++      dsi->use_firmware_setup = VC4_DSI_USE_FIRMWARE_SETUP;
++
++      if (dsi->use_firmware_setup) {
++              /* Increment references to the various clocks so that
++               * they stay always enabled and the clock framework
++               * doesn't disable their parents.
++               */
++              ret = clk_prepare_enable(dsi->escape_clock);
++              if (ret) {
++                      DRM_ERROR("Failed to refcount DSI escape clock: %d\n", ret);
++                      return ret;
++              }
++
++              ret = clk_prepare_enable(dsi->pll_phy_clock);
++              if (ret) {
++                      DRM_ERROR("Failed to refcount DSI PLL: %d\n", ret);
++                      return ret;
++              }
++
++              ret = clk_prepare_enable(dsi->pixel_clock);
++              if (ret) {
++                      DRM_ERROR("Failed to refcount pixel clock: %d\n", ret);
++                      return ret;
++              }
++      }
++
++      /* DSI1 has a broken AXI slave that doesn't respond to writes
++       * from the ARM.  It does handle writes from the DMA engine,
++       * so set up a channel for talking to it.
++       */
++      if (dsi->port == 1) {
++              dsi->reg_dma_mem = dma_alloc_coherent(dev, 4,
++                                                    &dsi->reg_dma_paddr,
++                                                    GFP_KERNEL);
++              if (!dsi->reg_dma_mem) {
++                      DRM_ERROR("Failed to get DMA memory\n");
++                      return -ENOMEM;
++              }
++
++              dma_cap_zero(dma_mask);
++              dma_cap_set(DMA_MEMCPY, dma_mask);
++              dsi->reg_dma_chan = dma_request_channel(dma_mask, NULL, NULL);
++              if (IS_ERR(dsi->reg_dma_chan)) {
++                      ret = PTR_ERR(dsi->reg_dma_chan);
++                      if (ret != -EPROBE_DEFER)
++                              DRM_ERROR("Failed to get DMA channel: %d\n",
++                                        ret);
++                      return ret;
++              }
++
++              /* Get the physical address of the device's registers.  The
++               * struct resource for the regs gives us the bus address
++               * instead.
++               */
++              dsi->reg_paddr = be32_to_cpup(of_get_address(dev->of_node,
++                                                           0, NULL, NULL));
++      }
++
++      init_completion(&dsi->xfer_completion);
++      /* At startup enable error-reporting interrupts and nothing else. */
++      DSI_PORT_WRITE(INT_EN, DSI1_INTERRUPTS_ALWAYS_ENABLED);
++      /* Clear any existing interrupt state. */
++      DSI_PORT_WRITE(INT_STAT, DSI_PORT_READ(INT_STAT));
++
++      ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
++                             vc4_dsi_irq_handler, 0, "vc4 dsi", dsi);
++      if (ret) {
++              if (ret != -EPROBE_DEFER)
++                      dev_err(dev, "Failed to get interrupt: %d\n", ret);
++              return ret;
++      }
++
++      dsi->escape_clock = devm_clk_get(dev, "escape");
++      if (IS_ERR(dsi->escape_clock)) {
++              ret = PTR_ERR(dsi->escape_clock);
++              if (ret != -EPROBE_DEFER)
++                      dev_err(dev, "Failed to get escape clock: %d\n", ret);
++              return ret;
++      }
++
++      dsi->pll_phy_clock = devm_clk_get(dev, "phy");
++      if (IS_ERR(dsi->pll_phy_clock)) {
++              ret = PTR_ERR(dsi->pll_phy_clock);
++              if (ret != -EPROBE_DEFER)
++                      dev_err(dev, "Failed to get phy clock: %d\n", ret);
++              return ret;
++      }
++
++      dsi->pixel_clock = devm_clk_get(dev, "pixel");
++      if (IS_ERR(dsi->pixel_clock)) {
++              ret = PTR_ERR(dsi->pixel_clock);
++              if (ret != -EPROBE_DEFER)
++                      dev_err(dev, "Failed to get pixel clock: %d\n", ret);
++              return ret;
++      }
++
++      /* The esc clock rate is supposed to always be 100Mhz. */
++      ret = clk_set_rate(dsi->escape_clock, 100 * 1000000);
++      if (ret) {
++              dev_err(dev, "Failed to set esc clock: %d\n", ret);
++              return ret;
++      }
++
++      ret = vc4_dsi_init_phy_byte_clock(dsi);
++      if (ret)
++              return ret;
++
++      if (dsi->port == 1)
++              vc4->dsi1 = dsi;
++
++      drm_encoder_init(drm, dsi->encoder, &vc4_dsi_encoder_funcs,
++                       DRM_MODE_ENCODER_DSI);
++      drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs);
++
++      dsi->connector = vc4_dsi_connector_init(drm, dsi);
++      if (IS_ERR(dsi->connector)) {
++              ret = PTR_ERR(dsi->connector);
++              goto err_destroy_encoder;
++      }
++
++      dsi->dsi_host.ops = &vc4_dsi_host_ops;
++      dsi->dsi_host.dev = dev;
++
++      mipi_dsi_host_register(&dsi->dsi_host);
++
++      dev_set_drvdata(dev, dsi);
++
++      return 0;
++
++err_destroy_encoder:
++      vc4_dsi_encoder_destroy(dsi->encoder);
++
++      return ret;
++}
++
++static void vc4_dsi_unbind(struct device *dev, struct device *master,
++                         void *data)
++{
++      struct drm_device *drm = dev_get_drvdata(master);
++      struct vc4_dev *vc4 = to_vc4_dev(drm);
++      struct vc4_dsi *dsi = dev_get_drvdata(dev);
++
++      vc4_dsi_connector_destroy(dsi->connector);
++      vc4_dsi_encoder_destroy(dsi->encoder);
++
++      mipi_dsi_host_unregister(&dsi->dsi_host);
++
++      if (!dsi->use_firmware_setup) {
++              clk_disable_unprepare(dsi->pll_phy_clock);
++              clk_disable_unprepare(dsi->escape_clock);
++              clk_disable_unprepare(dsi->pixel_clock);
++      }
++
++      if (dsi->port == 1)
++              vc4->dsi1 = NULL;
++}
++
++static const struct component_ops vc4_dsi_ops = {
++      .bind   = vc4_dsi_bind,
++      .unbind = vc4_dsi_unbind,
++};
++
++static int vc4_dsi_dev_probe(struct platform_device *pdev)
++{
++      return component_add(&pdev->dev, &vc4_dsi_ops);
++}
++
++static int vc4_dsi_dev_remove(struct platform_device *pdev)
++{
++      component_del(&pdev->dev, &vc4_dsi_ops);
++      return 0;
++}
++
++struct platform_driver vc4_dsi_driver = {
++      .probe = vc4_dsi_dev_probe,
++      .remove = vc4_dsi_dev_remove,
++      .driver = {
++              .name = "vc4_dsi",
++              .of_match_table = vc4_dsi_dt_match,
++      },
++};
diff --git a/target/linux/brcm2708/patches-4.4/0444-drm-panel-Add-support-for-the-Raspberry-Pi-7-Touchsc.patch b/target/linux/brcm2708/patches-4.4/0444-drm-panel-Add-support-for-the-Raspberry-Pi-7-Touchsc.patch
new file mode 100644 (file)
index 0000000..0291ce2
--- /dev/null
@@ -0,0 +1,390 @@
+From 4557de6d23737cf44fa5ddf1379be59d4bca2df7 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 26 Apr 2016 13:46:13 -0700
+Subject: [PATCH] drm/panel: Add support for the Raspberry Pi 7" Touchscreen.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/panel/Kconfig                      |   9 +
+ drivers/gpu/drm/panel/Makefile                     |   1 +
+ .../gpu/drm/panel/panel-raspberrypi-touchscreen.c  | 347 +++++++++++++++++++++
+ 3 files changed, 357 insertions(+)
+ create mode 100644 drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+
+--- a/drivers/gpu/drm/panel/Kconfig
++++ b/drivers/gpu/drm/panel/Kconfig
+@@ -31,6 +31,15 @@ config DRM_PANEL_LG_LG4573
+         Say Y here if you want to enable support for LG4573 RGB panel.
+         To compile this driver as a module, choose M here.
++config DRM_PANEL_RASPBERRYPI_TOUCHSCREEN
++      tristate "Raspberry Pi 7-inch touchscreen panel"
++      depends on DRM_MIPI_DSI
++      depends on BACKLIGHT_CLASS_DEVICE
++      help
++        Say Y here if you want to enable support for the Raspberry
++        Pi 7" Touchscreen.  To compile this driver as a module,
++        choose M here.
++
+ config DRM_PANEL_SAMSUNG_S6E8AA0
+       tristate "Samsung S6E8AA0 DSI video mode panel"
+       depends on OF
+--- a/drivers/gpu/drm/panel/Makefile
++++ b/drivers/gpu/drm/panel/Makefile
+@@ -1,5 +1,6 @@
+ obj-$(CONFIG_DRM_PANEL_SIMPLE) += panel-simple.o
+ obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o
++obj-$(CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN) += panel-raspberrypi-touchscreen.o
+ obj-$(CONFIG_DRM_PANEL_SAMSUNG_LD9040) += panel-samsung-ld9040.o
+ obj-$(CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0) += panel-samsung-s6e8aa0.o
+ obj-$(CONFIG_DRM_PANEL_SHARP_LQ101R1SX01) += panel-sharp-lq101r1sx01.o
+--- /dev/null
++++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+@@ -0,0 +1,347 @@
++/*
++ * Copyright © 2016 Broadcom Limited
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ *
++ * Portions of this file (derived from panel-simple.c) are:
++ *
++ * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sub license,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the
++ * next paragraph) shall be included in all copies or substantial portions
++ * of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ */
++
++/**
++ * DOC: Raspberry Pi 7" touchscreen panel driver.
++ *
++ * The 7" touchscreen consists of a DPI LCD panel, a Toshiba
++ * TC358762XBG DSI-DPI bridge, and an I2C-connected Atmel ATTINY88-MUR
++ * controlling power management, the LCD PWM, and the touchscreen.
++ *
++ * This driver presents this device as a MIPI DSI panel to the DRM
++ * driver, and should expose the touchscreen as a HID device.
++ */
++
++#include <linux/backlight.h>
++#include <linux/delay.h>
++#include <linux/err.h>
++#include <linux/fb.h>
++#include <linux/gpio.h>
++#include <linux/gpio/consumer.h>
++#include <linux/i2c.h>
++#include <linux/module.h>
++#include <linux/of.h>
++#include <linux/of_device.h>
++#include <linux/of_graph.h>
++#include <linux/pm.h>
++
++#include <drm/drm_panel.h>
++#include <drm/drmP.h>
++#include <drm/drm_crtc.h>
++#include <drm/drm_mipi_dsi.h>
++#include <drm/drm_panel.h>
++
++struct rpi_touchscreen {
++      struct drm_panel base;
++      struct mipi_dsi_device *dsi;
++      struct i2c_client *bridge_i2c;
++      struct backlight_device *backlight;
++
++      bool prepared;
++      bool enabled;
++
++      /* Version of the firmware on the bridge chip */
++      int atmel_ver;
++};
++
++static const struct drm_display_mode rpi_touchscreen_modes[] = {
++      {
++              /* This is assuming that we'll be running the DSI PLL
++               * at 2Ghz / 3 (since we only get integer dividers),
++               * so a pixel clock of 2Ghz / 3 / 8.
++               */
++              .clock = 83333,
++              .hdisplay = 800,
++              .hsync_start = 800 + 61,
++              .hsync_end = 800 + 61 + 2,
++              .htotal = 800 + 61 + 2 + 44,
++              .vdisplay = 480,
++              .vsync_start = 480 + 7,
++              .vsync_end = 480 + 7 + 2,
++              .vtotal = 480 + 7 + 2 + 21,
++              .vrefresh = 60,
++      },
++};
++
++static struct rpi_touchscreen *panel_to_ts(struct drm_panel *panel)
++{
++      return container_of(panel, struct rpi_touchscreen, base);
++}
++
++struct regdump {
++      const char *reg;
++      u32 offset;
++};
++
++#define REGDUMP(reg) { #reg, reg }
++
++static int rpi_touchscreen_disable(struct drm_panel *panel)
++{
++      struct rpi_touchscreen *ts = panel_to_ts(panel);
++      pr_err("disable\n");
++
++      if (!ts->enabled)
++              return 0;
++
++      if (ts->backlight) {
++              ts->backlight->props.power = FB_BLANK_POWERDOWN;
++              backlight_update_status(ts->backlight);
++      }
++
++      ts->enabled = false;
++
++      return 0;
++}
++
++static int rpi_touchscreen_unprepare(struct drm_panel *panel)
++{
++      struct rpi_touchscreen *ts = panel_to_ts(panel);
++
++      if (!ts->prepared)
++              return 0;
++
++      ts->prepared = false;
++
++      return 0;
++}
++
++static int rpi_touchscreen_prepare(struct drm_panel *panel)
++{
++      struct rpi_touchscreen *ts = panel_to_ts(panel);
++
++      if (ts->prepared)
++              return 0;
++
++      ts->prepared = true;
++
++      return 0;
++}
++
++/*
++ * Powers on the panel once the DSI link is up.
++ *
++ * The TC358762 is run in PLLOFF mode, where it usees the MIPI DSI
++ * byte clock instead of an external reference clock.  This means that
++ * we need the DSI host to be on and transmitting before we start
++ * talking to it.
++ */
++static int rpi_touchscreen_enable(struct drm_panel *panel)
++{
++      struct rpi_touchscreen *ts = panel_to_ts(panel);
++
++      if (ts->enabled)
++              return 0;
++
++      if (ts->backlight) {
++              ts->backlight->props.power = FB_BLANK_UNBLANK;
++              backlight_update_status(ts->backlight);
++      }
++
++      ts->enabled = true;
++
++      return 0;
++}
++
++static int rpi_touchscreen_get_modes(struct drm_panel *panel)
++{
++      struct drm_connector *connector = panel->connector;
++      struct drm_device *drm = panel->drm;
++      unsigned int i, num = 0;
++
++      for (i = 0; i < ARRAY_SIZE(rpi_touchscreen_modes); i++) {
++              const struct drm_display_mode *m = &rpi_touchscreen_modes[i];
++              struct drm_display_mode *mode;
++
++              mode = drm_mode_duplicate(drm, m);
++              if (!mode) {
++                      dev_err(drm->dev, "failed to add mode %ux%u@%u\n",
++                              m->hdisplay, m->vdisplay, m->vrefresh);
++                      continue;
++              }
++
++              mode->type |= DRM_MODE_TYPE_DRIVER;
++
++              if (i == 0)
++                      mode->type |= DRM_MODE_TYPE_PREFERRED;
++
++              drm_mode_set_name(mode);
++
++              drm_mode_probed_add(connector, mode);
++              num++;
++      }
++
++      connector->display_info.bpc = 8;
++      connector->display_info.width_mm = 217; /* XXX */
++      connector->display_info.height_mm = 136; /* XXX */
++
++      return num;
++}
++
++static int rpi_touchscreen_backlight_update(struct backlight_device *bl)
++{
++      int brightness = bl->props.brightness;
++
++      if (bl->props.power != FB_BLANK_UNBLANK ||
++          bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
++              brightness = 0;
++
++      return 0;
++}
++
++static const struct backlight_ops rpi_touchscreen_backlight_ops = {
++      .update_status  = rpi_touchscreen_backlight_update,
++};
++
++static const struct drm_panel_funcs rpi_touchscreen_funcs = {
++      .disable = rpi_touchscreen_disable,
++      .unprepare = rpi_touchscreen_unprepare,
++      .prepare = rpi_touchscreen_prepare,
++      .enable = rpi_touchscreen_enable,
++      .get_modes = rpi_touchscreen_get_modes,
++};
++
++static struct i2c_client *rpi_touchscreen_get_i2c(struct device *dev,
++                                                const char *name)
++{
++      struct device_node *node;
++      struct i2c_client *client;
++
++      node = of_parse_phandle(dev->of_node, name, 0);
++      if (!node)
++              return ERR_PTR(-ENODEV);
++
++      client = of_find_i2c_device_by_node(node);
++
++      of_node_put(node);
++
++      return client;
++}
++
++static int rpi_touchscreen_dsi_probe(struct mipi_dsi_device *dsi)
++{
++      struct device *dev = &dsi->dev;
++      struct rpi_touchscreen *ts;
++      int ret;
++
++      ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL);
++      if (!ts)
++              return -ENOMEM;
++
++      dev_set_drvdata(dev, ts);
++
++      ts->dsi = dsi;
++      dsi->mode_flags = (MIPI_DSI_MODE_VIDEO |
++                         MIPI_DSI_MODE_VIDEO_SYNC_PULSE);
++      dsi->format = MIPI_DSI_FMT_RGB888;
++      dsi->lanes = 1;
++
++      ts->bridge_i2c =
++              rpi_touchscreen_get_i2c(dev, "raspberrypi,touchscreen-bridge");
++      if (!ts->bridge_i2c) {
++              ret = -EPROBE_DEFER;
++              return ret;
++      }
++
++#if 0
++      ts->backlight =
++              devm_backlight_device_register(dev,
++                                             "raspberrypi-touchscreen-backlight",
++                                             dev, ts,
++                                             &rpi_touchscreen_backlight_ops,
++                                             NULL);
++      if (IS_ERR(ts->backlight)) {
++              DRM_ERROR("failed to register backlight\n");
++              return PTR_ERR(ts->backlight);
++      }
++      ts->backlight->props.max_brightness = RPI_TOUCHSCREEN_MAX_BRIGHTNESS;
++      ts->backlight->props.brightness = RPI_TOUCHSCREEN_MAX_BRIGHTNESS;
++#endif
++
++      drm_panel_init(&ts->base);
++      ts->base.dev = dev;
++      ts->base.funcs = &rpi_touchscreen_funcs;
++
++      ret = drm_panel_add(&ts->base);
++      if (ret < 0)
++              goto err_release_bridge;
++
++      return mipi_dsi_attach(dsi);
++
++err_release_bridge:
++      put_device(&ts->bridge_i2c->dev);
++      return ret;
++}
++
++static int rpi_touchscreen_dsi_remove(struct mipi_dsi_device *dsi)
++{
++      struct device *dev = &dsi->dev;
++      struct rpi_touchscreen *ts = dev_get_drvdata(dev);
++      int ret;
++
++      ret = mipi_dsi_detach(dsi);
++      if (ret < 0) {
++              dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", ret);
++              return ret;
++      }
++
++      drm_panel_detach(&ts->base);
++      drm_panel_remove(&ts->base);
++
++      put_device(&ts->bridge_i2c->dev);
++
++      return 0;
++}
++
++static void rpi_touchscreen_dsi_shutdown(struct mipi_dsi_device *dsi)
++{
++      /* XXX: poweroff */
++}
++
++static const struct of_device_id rpi_touchscreen_of_match[] = {
++      { .compatible = "raspberrypi,touchscreen" },
++      { } /* sentinel */
++};
++MODULE_DEVICE_TABLE(of, rpi_touchscreen_of_match);
++
++static struct mipi_dsi_driver rpi_touchscreen_driver = {
++      .driver = {
++              .name = "raspberrypi-touchscreen",
++              .of_match_table = rpi_touchscreen_of_match,
++      },
++      .probe = rpi_touchscreen_dsi_probe,
++      .remove = rpi_touchscreen_dsi_remove,
++      .shutdown = rpi_touchscreen_dsi_shutdown,
++};
++module_mipi_dsi_driver(rpi_touchscreen_driver);
++
++MODULE_AUTHOR("Eric Anholt <eric@anholt.net>");
++MODULE_DESCRIPTION("Raspberry Pi 7-inch touchscreen driver");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/brcm2708/patches-4.4/0445-BCM270X-Add-the-DSI-panel-to-the-defconfig.patch b/target/linux/brcm2708/patches-4.4/0445-BCM270X-Add-the-DSI-panel-to-the-defconfig.patch
new file mode 100644 (file)
index 0000000..5e813f9
--- /dev/null
@@ -0,0 +1,31 @@
+From 42c5b9d02e0076ce2b198a6364215ca46bec6e29 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 2 Jun 2016 12:29:45 -0700
+Subject: [PATCH] BCM270X: Add the DSI panel to the defconfig.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ 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
+@@ -822,6 +822,7 @@ CONFIG_DRM=m
+ CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_PANEL_SIMPLE=m
++CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+ CONFIG_FB_BCM2708=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -814,6 +814,7 @@ CONFIG_DRM=m
+ CONFIG_DRM_LOAD_EDID_FIRMWARE=y
+ CONFIG_DRM_UDL=m
+ CONFIG_DRM_PANEL_SIMPLE=m
++CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m
+ CONFIG_DRM_VC4=m
+ CONFIG_FB=y
+ CONFIG_FB_BCM2708=y
diff --git a/target/linux/brcm2708/patches-4.4/0446-BCM270X-Add-the-DSI-and-DSI-panel-nodes-to-the-VC4-o.patch b/target/linux/brcm2708/patches-4.4/0446-BCM270X-Add-the-DSI-and-DSI-panel-nodes-to-the-VC4-o.patch
new file mode 100644 (file)
index 0000000..44f29dd
--- /dev/null
@@ -0,0 +1,84 @@
+From 64871d96e1d387437fa52d8398f2212722890bcd Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 2 Jun 2016 15:09:35 -0700
+Subject: [PATCH] BCM270X: Add the DSI and DSI panel nodes to the VC4 overlay.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi              | 24 ++++++++++++++++++++--
+ arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts | 16 +++++++++++++++
+ 2 files changed, 38 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -2,6 +2,7 @@
+ #include <dt-bindings/clock/bcm2835-aux.h>
+ #include "dt-bindings/power/raspberrypi-power.h"
+ #include "dt-bindings/gpio/gpio.h"
++#include "dt-bindings/pinctrl/bcm2835.h"
+ #include "skeleton.dtsi"
+ / {
+@@ -110,9 +111,10 @@
+                       reg = <0x7e101000 0x2000>;
+                       /* CPRMAN derives everything from the platform's
+-                       * oscillator.
++                       * oscillator except for a few clocks that may
++                       * derive from something else derived from CPRMAN..
+                        */
+-                      clocks = <&clk_osc>;
++                      clocks = <&clk_osc>, <&dsi1 0>, <&dsi1 1>, <&dsi1 2>;
+                       status = "disabled";
+               };
+@@ -282,6 +284,24 @@
+                       status = "disabled";
+               };
++              dsi1: dsi@7e700000 {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      #clock-cells = <1>;
++
++                      compatible = "brcm,bcm2835-dsi1";
++                      reg = <0x7e700000 0x8c>;
++                      interrupts = <2 12>;
++
++                      clocks = <&cprman BCM2835_PLLD_DSI1>,
++                               <&cprman BCM2835_CLOCK_DSI1E>,
++                               <&cprman BCM2835_CLOCK_DSI1P>;
++                      clock-names = "phy", "escape", "pixel";
++                      clock-output-names = "dsi1_byte", "dsi1_ddr2", "dsi1_ddr";
++                      status = "disabled";
++                      power-domains = <&power RPI_POWER_DOMAIN_DSI1>;
++              };
++
+               i2c1: i2c@7e804000 {
+                       compatible = "brcm,bcm2708-i2c";
+                       reg = <0x7e804000 0x1000>;
+--- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
++++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts
+@@ -126,6 +126,22 @@
+               };
+       };
++      fragment@16 {
++              target = <&dsi1>;
++              __overlay__  {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      brcm,panel = <&pitouchscreen>;
++
++                      pitouchscreen: panel {
++                              compatible = "raspberrypi,touchscreen";
++                              reg = <0>;
++                      };
++              };
++      };
++
+       __overrides__ {
+               cma-256 = <0>,"+0-1-2-3-4";
+               cma-192 = <0>,"-0+1-2-3-4";
diff --git a/target/linux/brcm2708/patches-4.4/0447-of-Export-of_device_uevent_modalias-for-DRM_MIPI_DSI.patch b/target/linux/brcm2708/patches-4.4/0447-of-Export-of_device_uevent_modalias-for-DRM_MIPI_DSI.patch
new file mode 100644 (file)
index 0000000..a9ae593
--- /dev/null
@@ -0,0 +1,21 @@
+From e294a4775d033ed4d0850f841786ec9358facf69 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 9 Aug 2016 15:12:06 -0700
+Subject: [PATCH] of: Export of_device_uevent_modalias for DRM_MIPI_DSI.
+
+In order to make DSI panel modules able to load automatically, we need
+to emit the OF modalias uevent so that their MODULE_DEVICE_TABLE(of,
+...) can match against it.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/of/device.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/of/device.c
++++ b/drivers/of/device.c
+@@ -287,3 +287,4 @@ int of_device_uevent_modalias(struct dev
+       return 0;
+ }
++EXPORT_SYMBOL(of_device_uevent_modalias);
diff --git a/target/linux/brcm2708/patches-4.4/0448-drm-Emit-modalias-uevents-for-the-DSI-devices-we-cre.patch b/target/linux/brcm2708/patches-4.4/0448-drm-Emit-modalias-uevents-for-the-DSI-devices-we-cre.patch
new file mode 100644 (file)
index 0000000..77b0eca
--- /dev/null
@@ -0,0 +1,48 @@
+From e46450e232a96665344b825557bacf1d37842174 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 9 Aug 2016 15:13:33 -0700
+Subject: [PATCH] drm: Emit modalias uevents for the DSI devices we create.
+
+This gets the Raspberry Pi panel module to automatically load at boot
+time.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/drm_mipi_dsi.c | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+--- a/drivers/gpu/drm/drm_mipi_dsi.c
++++ b/drivers/gpu/drm/drm_mipi_dsi.c
+@@ -50,6 +50,24 @@ static int mipi_dsi_device_match(struct
+       return of_driver_match_device(dev, drv);
+ }
++/**
++ * Send modalias events when devices are created on the bus, so that
++ * modules can load automatically.
++ */
++static int mipi_dsi_uevent(struct device *dev, struct kobj_uevent_env *env)
++{
++      int rc;
++
++      /* Just do the OF uevent, which emits the compatible string so
++       * that a MODULE_DEVICE_TABLE(of, ...) works.
++       */
++      rc = of_device_uevent_modalias(dev, env);
++      if (rc != -ENODEV)
++              return rc;
++
++      return 0;
++}
++
+ static const struct dev_pm_ops mipi_dsi_device_pm_ops = {
+       .runtime_suspend = pm_generic_runtime_suspend,
+       .runtime_resume = pm_generic_runtime_resume,
+@@ -65,6 +83,7 @@ static struct bus_type mipi_dsi_bus_type
+       .name = "mipi-dsi",
+       .match = mipi_dsi_device_match,
+       .pm = &mipi_dsi_device_pm_ops,
++      .uevent = mipi_dsi_uevent,
+ };
+ static int of_device_match(struct device *dev, void *data)
diff --git a/target/linux/brcm2708/patches-4.4/0449-gpu-drm-vc4_hdmi-add-missing-of_node_put-after-calli.patch b/target/linux/brcm2708/patches-4.4/0449-gpu-drm-vc4_hdmi-add-missing-of_node_put-after-calli.patch
new file mode 100644 (file)
index 0000000..75bc32d
--- /dev/null
@@ -0,0 +1,46 @@
+From cededb2870ab15fcf79f063a83f5f37421e5bdfc Mon Sep 17 00:00:00 2001
+From: Peter Chen <peter.chen@nxp.com>
+Date: Tue, 5 Jul 2016 10:04:54 +0800
+Subject: [PATCH] gpu: drm: vc4_hdmi: add missing of_node_put after calling
+ of_parse_phandle
+
+of_node_put needs to be called when the device node which is got
+from of_parse_phandle has finished using.
+
+Signed-off-by: Peter Chen <peter.chen@nxp.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 027a697677b0d5ff211773596d96f84078ceda80)
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -467,12 +467,6 @@ static int vc4_hdmi_bind(struct device *
+       if (IS_ERR(hdmi->hd_regs))
+               return PTR_ERR(hdmi->hd_regs);
+-      ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
+-      if (!ddc_node) {
+-              DRM_ERROR("Failed to find ddc node in device tree\n");
+-              return -ENODEV;
+-      }
+-
+       hdmi->pixel_clock = devm_clk_get(dev, "pixel");
+       if (IS_ERR(hdmi->pixel_clock)) {
+               DRM_ERROR("Failed to get pixel clock\n");
+@@ -484,7 +478,14 @@ static int vc4_hdmi_bind(struct device *
+               return PTR_ERR(hdmi->hsm_clock);
+       }
++      ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
++      if (!ddc_node) {
++              DRM_ERROR("Failed to find ddc node in device tree\n");
++              return -ENODEV;
++      }
++
+       hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node);
++      of_node_put(ddc_node);
+       if (!hdmi->ddc) {
+               DRM_DEBUG("Failed to get ddc i2c adapter by node\n");
+               return -EPROBE_DEFER;
diff --git a/target/linux/brcm2708/patches-4.4/0450-drm-vc4-Use-for_each_plane_in_state.patch b/target/linux/brcm2708/patches-4.4/0450-drm-vc4-Use-for_each_plane_in_state.patch
new file mode 100644 (file)
index 0000000..8b0d0b6
--- /dev/null
@@ -0,0 +1,42 @@
+From fa8b827fb90719d981a8fa292064958219c8ed10 Mon Sep 17 00:00:00 2001
+From: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date: Thu, 2 Jun 2016 00:06:28 +0200
+Subject: [PATCH] drm/vc4: Use for_each_plane_in_state
+
+We want to hide drm_atomic_stat internals a bit better.
+
+Cc: Eric Anholt <eric@anholt.net>
+Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
+Link: http://patchwork.freedesktop.org/patch/msgid/1464818821-5736-6-git-send-email-daniel.vetter@ffwll.ch
+(cherry picked from commit 833cd78adbc236db684f19e93121d4bf6659a8af)
+---
+ drivers/gpu/drm/vc4/vc4_kms.c | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_kms.c
++++ b/drivers/gpu/drm/vc4/vc4_kms.c
+@@ -111,6 +111,8 @@ static int vc4_atomic_commit(struct drm_
+       int i;
+       uint64_t wait_seqno = 0;
+       struct vc4_commit *c;
++      struct drm_plane *plane;
++      struct drm_plane_state *new_state;
+       c = commit_init(state);
+       if (!c)
+@@ -130,13 +132,7 @@ static int vc4_atomic_commit(struct drm_
+               return ret;
+       }
+-      for (i = 0; i < dev->mode_config.num_total_plane; i++) {
+-              struct drm_plane *plane = state->planes[i];
+-              struct drm_plane_state *new_state = state->plane_states[i];
+-
+-              if (!plane)
+-                      continue;
+-
++      for_each_plane_in_state(state, plane, new_state, i) {
+               if ((plane->state->fb != new_state->fb) && new_state->fb) {
+                       struct drm_gem_cma_object *cma_bo =
+                               drm_fb_cma_get_gem_obj(new_state->fb, 0);
diff --git a/target/linux/brcm2708/patches-4.4/0451-drm-vc4-Fix-ioctl-permissions-for-render-nodes.patch b/target/linux/brcm2708/patches-4.4/0451-drm-vc4-Fix-ioctl-permissions-for-render-nodes.patch
new file mode 100644 (file)
index 0000000..40afd95
--- /dev/null
@@ -0,0 +1,39 @@
+From cd24c4594b21f3a9dec5780d06dacbaf59415225 Mon Sep 17 00:00:00 2001
+From: Herve Jourdain <herve.jourdain@neuf.fr>
+Date: Wed, 1 Jun 2016 02:24:46 +0800
+Subject: [PATCH] drm/vc4: Fix ioctl permissions for render nodes.
+
+Contrary to other flags to DRM_IOCTL_DEF_DRV(), which restrict usage,
+the flag for render node is an enabler (the IOCTL can't be used from
+render node if it's not present).  So DRM_RENDER_ALLOW needs to be
+added to all the flags that were previously 0.
+
+Signed-off-by: Herve Jourdain <herve.jourdain@neuf.fr>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+Fixes: 0cd3e2747662 ("drm/vc4: Add missing render node support")
+(cherry picked from commit b10c22e5f9902a329450c2027e9291b71e9f1602)
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -88,12 +88,12 @@ static const struct file_operations vc4_
+ };
+ static const struct drm_ioctl_desc vc4_drm_ioctls[] = {
+-      DRM_IOCTL_DEF_DRV(VC4_SUBMIT_CL, vc4_submit_cl_ioctl, 0),
+-      DRM_IOCTL_DEF_DRV(VC4_WAIT_SEQNO, vc4_wait_seqno_ioctl, 0),
+-      DRM_IOCTL_DEF_DRV(VC4_WAIT_BO, vc4_wait_bo_ioctl, 0),
+-      DRM_IOCTL_DEF_DRV(VC4_CREATE_BO, vc4_create_bo_ioctl, 0),
+-      DRM_IOCTL_DEF_DRV(VC4_MMAP_BO, vc4_mmap_bo_ioctl, 0),
+-      DRM_IOCTL_DEF_DRV(VC4_CREATE_SHADER_BO, vc4_create_shader_bo_ioctl, 0),
++      DRM_IOCTL_DEF_DRV(VC4_SUBMIT_CL, vc4_submit_cl_ioctl, DRM_RENDER_ALLOW),
++      DRM_IOCTL_DEF_DRV(VC4_WAIT_SEQNO, vc4_wait_seqno_ioctl, DRM_RENDER_ALLOW),
++      DRM_IOCTL_DEF_DRV(VC4_WAIT_BO, vc4_wait_bo_ioctl, DRM_RENDER_ALLOW),
++      DRM_IOCTL_DEF_DRV(VC4_CREATE_BO, vc4_create_bo_ioctl, DRM_RENDER_ALLOW),
++      DRM_IOCTL_DEF_DRV(VC4_MMAP_BO, vc4_mmap_bo_ioctl, DRM_RENDER_ALLOW),
++      DRM_IOCTL_DEF_DRV(VC4_CREATE_SHADER_BO, vc4_create_shader_bo_ioctl, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(VC4_GET_HANG_STATE, vc4_get_hang_state_ioctl,
+                         DRM_ROOT_ONLY),
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0452-drm-vc4-Make-pageflip-completion-handling-more-robus.patch b/target/linux/brcm2708/patches-4.4/0452-drm-vc4-Make-pageflip-completion-handling-more-robus.patch
new file mode 100644 (file)
index 0000000..00701f8
--- /dev/null
@@ -0,0 +1,126 @@
+From cb182bb6180c57b28636669a613861023fd8f03d Mon Sep 17 00:00:00 2001
+From: Mario Kleiner <mario.kleiner.de@gmail.com>
+Date: Wed, 18 May 2016 14:02:46 +0200
+Subject: [PATCH] drm/vc4: Make pageflip completion handling more robust.
+
+Protect both the setup of the pageflip event and the
+latching of the new requested displaylist head pointer
+by the event lock, so we can't get into a situation
+where vc4_atomic_flush latches the new display list via
+HVS_WRITE, then immediately gets preempted before queueing
+the pageflip event, then the page-flip completes in hw and
+the vc4_crtc_handle_page_flip() runs and no-ops due to
+lack of a pending pageflip event, then vc4_atomic_flush
+continues and only then queues the pageflip event - after
+the page flip handling already no-oped. This would cause
+flip completion handling only at the next vblank - one
+frame too late.
+
+In vc4_crtc_handle_page_flip() check the actual DL head
+pointer in SCALER_DISPLACTX against the requested pointer
+for page flip to make sure that the flip actually really
+completed in the current vblank and doesn't get deferred
+to the next one because the DL head pointer was written
+a bit too late into SCALER_DISPLISTX, after start of
+vblank, and missed the boat. This avoids handling a
+pageflip completion too early - one frame too early.
+
+According to Eric, DL head pointer updates which were
+written into the HVS DISPLISTX reg get committed to hardware
+at the last pixel of active scanout. Our vblank interrupt
+handler, as triggered by PV_INT_VFP_START irq, gets to run
+earliest at the first pixel of HBLANK at the end of the
+last scanline of active scanout, ie. vblank irq handling
+runs at least 1 pixel duration after a potential pageflip
+completion happened in hardware.
+
+This ordering of events in the hardware, together with the
+lock protection and SCALER_DISPLACTX sampling of this patch,
+guarantees that pageflip completion handling only runs at
+exactly the vblank irq of actual pageflip completion in all
+cases.
+
+Background info from Eric about the relative timing of
+HVS, PV's and trigger points for interrupts, DL updates:
+
+https://lists.freedesktop.org/archives/dri-devel/2016-May/107510.html
+
+Tested on RPi 2B with hardware timing measurement equipment
+and shown to no longer complete flips too early or too late.
+
+Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 56d1fe0979dc9b73c1c12ee07722ac380d42a0c4)
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 28 ++++++++++++++++++----------
+ drivers/gpu/drm/vc4/vc4_regs.h |  4 ++++
+ 2 files changed, 22 insertions(+), 10 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -465,14 +465,6 @@ static void vc4_crtc_atomic_flush(struct
+       WARN_ON_ONCE(dlist_next - dlist_start != vc4_state->mm.size);
+-      HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
+-                vc4_state->mm.start);
+-
+-      if (debug_dump_regs) {
+-              DRM_INFO("CRTC %d HVS after:\n", drm_crtc_index(crtc));
+-              vc4_hvs_dump_state(dev);
+-      }
+-
+       if (crtc->state->event) {
+               unsigned long flags;
+@@ -482,8 +474,20 @@ static void vc4_crtc_atomic_flush(struct
+               spin_lock_irqsave(&dev->event_lock, flags);
+               vc4_crtc->event = crtc->state->event;
+-              spin_unlock_irqrestore(&dev->event_lock, flags);
+               crtc->state->event = NULL;
++
++              HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
++                        vc4_state->mm.start);
++
++              spin_unlock_irqrestore(&dev->event_lock, flags);
++      } else {
++              HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
++                        vc4_state->mm.start);
++      }
++
++      if (debug_dump_regs) {
++              DRM_INFO("CRTC %d HVS after:\n", drm_crtc_index(crtc));
++              vc4_hvs_dump_state(dev);
+       }
+ }
+@@ -509,10 +513,14 @@ static void vc4_crtc_handle_page_flip(st
+ {
+       struct drm_crtc *crtc = &vc4_crtc->base;
+       struct drm_device *dev = crtc->dev;
++      struct vc4_dev *vc4 = to_vc4_dev(dev);
++      struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
++      u32 chan = vc4_crtc->channel;
+       unsigned long flags;
+       spin_lock_irqsave(&dev->event_lock, flags);
+-      if (vc4_crtc->event) {
++      if (vc4_crtc->event &&
++          (vc4_state->mm.start == HVS_READ(SCALER_DISPLACTX(chan)))) {
+               drm_crtc_send_vblank_event(crtc, vc4_crtc->event);
+               vc4_crtc->event = NULL;
+               drm_crtc_vblank_put(crtc);
+--- a/drivers/gpu/drm/vc4/vc4_regs.h
++++ b/drivers/gpu/drm/vc4/vc4_regs.h
+@@ -343,6 +343,10 @@
+ #define SCALER_DISPLACT0                        0x00000030
+ #define SCALER_DISPLACT1                        0x00000034
+ #define SCALER_DISPLACT2                        0x00000038
++#define SCALER_DISPLACTX(x)                   (SCALER_DISPLACT0 +     \
++                                               (x) * (SCALER_DISPLACT1 - \
++                                                      SCALER_DISPLACT0))
++
+ #define SCALER_DISPCTRL0                        0x00000040
+ # define SCALER_DISPCTRLX_ENABLE              BIT(31)
+ # define SCALER_DISPCTRLX_RESET                       BIT(30)
diff --git a/target/linux/brcm2708/patches-4.4/0453-drm-vc4-clean-up-error-exit-path-on-failed-dpi_conne.patch b/target/linux/brcm2708/patches-4.4/0453-drm-vc4-clean-up-error-exit-path-on-failed-dpi_conne.patch
new file mode 100644 (file)
index 0000000..4407c4a
--- /dev/null
@@ -0,0 +1,53 @@
+From 2092b669dd8d4c87cbbf107fd63fe2050ec5b4aa Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+Date: Thu, 2 Jun 2016 10:38:29 +0100
+Subject: [PATCH] drm/vc4: clean up error exit path on failed dpi_connector
+ allocation
+
+There is redundant code in the clean up exit path when dpi_connector
+fails to be allocated.  The current code checks if connector is NULL
+before destroying it, in fact, connector is NULL at this point so
+the check is redundant and can be removed. The final clean up is
+that we can remove the goto fail with a simple return and the unused
+variable ret.
+
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit a9402dfe17bddeee5c72943385eaa13c39f106f7)
+---
+ drivers/gpu/drm/vc4/vc4_dpi.c | 14 +++-----------
+ 1 file changed, 3 insertions(+), 11 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_dpi.c
++++ b/drivers/gpu/drm/vc4/vc4_dpi.c
+@@ -236,14 +236,12 @@ static struct drm_connector *vc4_dpi_con
+ {
+       struct drm_connector *connector = NULL;
+       struct vc4_dpi_connector *dpi_connector;
+-      int ret = 0;
+       dpi_connector = devm_kzalloc(dev->dev, sizeof(*dpi_connector),
+                                    GFP_KERNEL);
+-      if (!dpi_connector) {
+-              ret = -ENOMEM;
+-              goto fail;
+-      }
++      if (!dpi_connector)
++              return ERR_PTR(-ENOMEM);
++
+       connector = &dpi_connector->base;
+       dpi_connector->encoder = dpi->encoder;
+@@ -260,12 +258,6 @@ static struct drm_connector *vc4_dpi_con
+       drm_mode_connector_attach_encoder(connector, dpi->encoder);
+       return connector;
+-
+- fail:
+-      if (connector)
+-              vc4_dpi_connector_destroy(connector);
+-
+-      return ERR_PTR(ret);
+ }
+ static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = {
diff --git a/target/linux/brcm2708/patches-4.4/0454-drm-vc4-enable-XBGR8888-and-ABGR8888-pixel-formats.patch b/target/linux/brcm2708/patches-4.4/0454-drm-vc4-enable-XBGR8888-and-ABGR8888-pixel-formats.patch
new file mode 100644 (file)
index 0000000..f68531e
--- /dev/null
@@ -0,0 +1,34 @@
+From 1a5b389a95cc5e468477b183d3e7312caf2ea2f4 Mon Sep 17 00:00:00 2001
+From: Rob Herring <robh@kernel.org>
+Date: Thu, 9 Jun 2016 16:19:25 -0500
+Subject: [PATCH] drm: vc4: enable XBGR8888 and ABGR8888 pixel formats
+
+DRM_FORMAT_XBGR8888 and DRM_FORMAT_ABGR8888 are 2 of the native formats
+used in Android, so enable them for VC4. There seems to be no logic behind
+HVS_PIXEL_ORDER_xxxx naming, but HVS_PIXEL_ORDER_ARGB seems to work
+correctly.
+
+Signed-off-by: Rob Herring <robh@kernel.org>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 93977767f092fbf0787e5d2a0bf2e0a3fc6f6ced)
+---
+ drivers/gpu/drm/vc4/vc4_plane.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_plane.c
++++ b/drivers/gpu/drm/vc4/vc4_plane.c
+@@ -94,6 +94,14 @@ static const struct hvs_format {
+               .pixel_order = HVS_PIXEL_ORDER_ABGR, .has_alpha = true,
+       },
+       {
++              .drm = DRM_FORMAT_ABGR8888, .hvs = HVS_PIXEL_FORMAT_RGBA8888,
++              .pixel_order = HVS_PIXEL_ORDER_ARGB, .has_alpha = true,
++      },
++      {
++              .drm = DRM_FORMAT_XBGR8888, .hvs = HVS_PIXEL_FORMAT_RGBA8888,
++              .pixel_order = HVS_PIXEL_ORDER_ARGB, .has_alpha = false,
++      },
++      {
+               .drm = DRM_FORMAT_RGB565, .hvs = HVS_PIXEL_FORMAT_RGB565,
+               .pixel_order = HVS_PIXEL_ORDER_XRGB, .has_alpha = false,
+       },
diff --git a/target/linux/brcm2708/patches-4.4/0455-drm-vc4-Bind-the-HVS-before-we-bind-the-individual-C.patch b/target/linux/brcm2708/patches-4.4/0455-drm-vc4-Bind-the-HVS-before-we-bind-the-individual-C.patch
new file mode 100644 (file)
index 0000000..351220b
--- /dev/null
@@ -0,0 +1,28 @@
+From 4bdd6172dbf4ea9d9ae85b6a3214bdb787f16778 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 8 Jul 2016 11:25:09 -0700
+Subject: [PATCH] drm/vc4: Bind the HVS before we bind the individual CRTCs.
+
+We need to be able to look at the CRTC's registers in the HVS as part
+of initialization, while the HVS doesn't need to look at the PV
+registers.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Reviewed-and-tested-by: Mario Kleiner <mario.kleiner.de@gmail.com>
+(cherry picked from commit 7a100969f30b77761901c05a5c810bcaea65df44)
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -295,8 +295,8 @@ static struct platform_driver *const com
+       &vc4_hdmi_driver,
+       &vc4_dpi_driver,
+       &vc4_dsi_driver,
+-      &vc4_crtc_driver,
+       &vc4_hvs_driver,
++      &vc4_crtc_driver,
+       &vc4_v3d_driver,
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0456-drm-vc4-Implement-precise-vblank-timestamping.patch b/target/linux/brcm2708/patches-4.4/0456-drm-vc4-Implement-precise-vblank-timestamping.patch
new file mode 100644 (file)
index 0000000..8ae2819
--- /dev/null
@@ -0,0 +1,358 @@
+From d1a9a03cbe1110756a63d4a3747e22eb8417f75e Mon Sep 17 00:00:00 2001
+From: Mario Kleiner <mario.kleiner.de@gmail.com>
+Date: Thu, 23 Jun 2016 08:17:50 +0200
+Subject: [PATCH] drm/vc4: Implement precise vblank timestamping.
+
+Precise vblank timestamping is implemented via the
+usual scanout position based method. On VC4 the
+pixelvalves PV do not have a scanout position
+register. Only the hardware video scaler HVS has a
+similar register which describes which scanline for
+the output is currently composited and stored in the
+HVS fifo for later consumption by the PV.
+
+This causes a problem in that the HVS runs at a much
+faster clock (system clock / audio gate) than the PV
+which runs at video mode dot clock, so the unless the
+fifo between HVS and PV is full, the HVS will progress
+faster in its observable read line position than video
+scan rate, so the HVS position reading can't be directly
+translated into a scanout position for timestamp correction.
+
+Additionally when the PV is in vblank, it doesn't consume
+from the fifo, so the fifo gets full very quickly and then
+the HVS stops compositing until the PV enters active scanout
+and starts consuming scanlines from the fifo again, making
+new space for the HVS to composite.
+
+Therefore a simple translation of HVS read position into
+elapsed time since (or to) start of active scanout does
+not work, but for the most interesting cases we can still
+get useful and sufficiently accurate results:
+
+1. The PV enters active scanout of a new frame with the
+   fifo of the HVS completely full, and the HVS can refill
+   any fifo line which gets consumed and thereby freed up by
+   the PV during active scanout very quickly. Therefore the
+   PV and HVS work effectively in lock-step during active
+   scanout with the fifo never having more than 1 scanline
+   freed up by the PV before it gets refilled. The PV's
+   real scanout position is therefore trailing the HVS
+   compositing position as scanoutpos = hvspos - fifosize
+   and we can get the true scanoutpos as HVS readpos minus
+   fifo size, so precise timestamping works while in active
+   scanout, except for the last few scanlines of the frame,
+   when the HVS reaches end of frame, stops compositing and
+   the PV catches up and drains the fifo. This special case
+   would only introduce minor errors though.
+
+2. If we are in vblank, then we can only guess something
+   reasonable. If called from vblank irq, we assume the irq is
+   usually dispatched with minimum delay, so we can take a
+   timestamp taken at entry into the vblank irq handler as a
+   baseline and then add a full vblank duration until the
+   guessed start of active scanout. As irq dispatch is usually
+   pretty low latency this works with relatively low jitter and
+   good results.
+
+   If we aren't called from vblank then we could be anywhere
+   within the vblank interval, so we return a neutral result,
+   simply the current system timestamp, and hope for the best.
+
+Measurement shows the generated timestamps to be rather precise,
+and at least never off more than 1 vblank duration worst-case.
+
+Limitations: Doesn't work well yet for interlaced video modes,
+             therefore disabled in interlaced mode for now.
+
+v2: Use the DISPBASE registers to determine the FIFO size (changes
+    by anholt)
+
+Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Reviewed-and-tested-by: Mario Kleiner <mario.kleiner.de@gmail.com> (v2)
+(cherry picked from commit 1bf59f1dcbe25272f6b5d870054647e58a8a9c55)
+---
+ drivers/gpu/drm/vc4/vc4_crtc.c | 162 +++++++++++++++++++++++++++++++++++++++++
+ drivers/gpu/drm/vc4/vc4_drv.c  |   2 +
+ drivers/gpu/drm/vc4/vc4_drv.h  |   7 ++
+ drivers/gpu/drm/vc4/vc4_regs.h |  22 +++++-
+ 4 files changed, 192 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_crtc.c
++++ b/drivers/gpu/drm/vc4/vc4_crtc.c
+@@ -47,12 +47,17 @@ struct vc4_crtc {
+       const struct vc4_crtc_data *data;
+       void __iomem *regs;
++      /* Timestamp at start of vblank irq - unaffected by lock delays. */
++      ktime_t t_vblank;
++
+       /* Which HVS channel we're using for our CRTC. */
+       int channel;
+       u8 lut_r[256];
+       u8 lut_g[256];
+       u8 lut_b[256];
++      /* Size in pixels of the COB memory allocated to this CRTC. */
++      u32 cob_size;
+       struct drm_pending_vblank_event *event;
+ };
+@@ -134,6 +139,144 @@ int vc4_crtc_debugfs_regs(struct seq_fil
+ }
+ #endif
++int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id,
++                          unsigned int flags, int *vpos, int *hpos,
++                          ktime_t *stime, ktime_t *etime,
++                          const struct drm_display_mode *mode)
++{
++      struct vc4_dev *vc4 = to_vc4_dev(dev);
++      struct vc4_crtc *vc4_crtc = vc4->crtc[crtc_id];
++      u32 val;
++      int fifo_lines;
++      int vblank_lines;
++      int ret = 0;
++
++      /*
++       * XXX Doesn't work well in interlaced mode yet, partially due
++       * to problems in vc4 kms or drm core interlaced mode handling,
++       * so disable for now in interlaced mode.
++       */
++      if (mode->flags & DRM_MODE_FLAG_INTERLACE)
++              return ret;
++
++      /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
++
++      /* Get optional system timestamp before query. */
++      if (stime)
++              *stime = ktime_get();
++
++      /*
++       * Read vertical scanline which is currently composed for our
++       * pixelvalve by the HVS, and also the scaler status.
++       */
++      val = HVS_READ(SCALER_DISPSTATX(vc4_crtc->channel));
++
++      /* Get optional system timestamp after query. */
++      if (etime)
++              *etime = ktime_get();
++
++      /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
++
++      /* Vertical position of hvs composed scanline. */
++      *vpos = VC4_GET_FIELD(val, SCALER_DISPSTATX_LINE);
++
++      /* No hpos info available. */
++      if (hpos)
++              *hpos = 0;
++
++      /* This is the offset we need for translating hvs -> pv scanout pos. */
++      fifo_lines = vc4_crtc->cob_size / mode->crtc_hdisplay;
++
++      if (fifo_lines > 0)
++              ret |= DRM_SCANOUTPOS_VALID;
++
++      /* HVS more than fifo_lines into frame for compositing? */
++      if (*vpos > fifo_lines) {
++              /*
++               * We are in active scanout and can get some meaningful results
++               * from HVS. The actual PV scanout can not trail behind more
++               * than fifo_lines as that is the fifo's capacity. Assume that
++               * in active scanout the HVS and PV work in lockstep wrt. HVS
++               * refilling the fifo and PV consuming from the fifo, ie.
++               * whenever the PV consumes and frees up a scanline in the
++               * fifo, the HVS will immediately refill it, therefore
++               * incrementing vpos. Therefore we choose HVS read position -
++               * fifo size in scanlines as a estimate of the real scanout
++               * position of the PV.
++               */
++              *vpos -= fifo_lines + 1;
++              if (mode->flags & DRM_MODE_FLAG_INTERLACE)
++                      *vpos /= 2;
++
++              ret |= DRM_SCANOUTPOS_ACCURATE;
++              return ret;
++      }
++
++      /*
++       * Less: This happens when we are in vblank and the HVS, after getting
++       * the VSTART restart signal from the PV, just started refilling its
++       * fifo with new lines from the top-most lines of the new framebuffers.
++       * The PV does not scan out in vblank, so does not remove lines from
++       * the fifo, so the fifo will be full quickly and the HVS has to pause.
++       * We can't get meaningful readings wrt. scanline position of the PV
++       * and need to make things up in a approximative but consistent way.
++       */
++      ret |= DRM_SCANOUTPOS_IN_VBLANK;
++      vblank_lines = mode->crtc_vtotal - mode->crtc_vdisplay;
++
++      if (flags & DRM_CALLED_FROM_VBLIRQ) {
++              /*
++               * Assume the irq handler got called close to first
++               * line of vblank, so PV has about a full vblank
++               * scanlines to go, and as a base timestamp use the
++               * one taken at entry into vblank irq handler, so it
++               * is not affected by random delays due to lock
++               * contention on event_lock or vblank_time lock in
++               * the core.
++               */
++              *vpos = -vblank_lines;
++
++              if (stime)
++                      *stime = vc4_crtc->t_vblank;
++              if (etime)
++                      *etime = vc4_crtc->t_vblank;
++
++              /*
++               * If the HVS fifo is not yet full then we know for certain
++               * we are at the very beginning of vblank, as the hvs just
++               * started refilling, and the stime and etime timestamps
++               * truly correspond to start of vblank.
++               */
++              if ((val & SCALER_DISPSTATX_FULL) != SCALER_DISPSTATX_FULL)
++                      ret |= DRM_SCANOUTPOS_ACCURATE;
++      } else {
++              /*
++               * No clue where we are inside vblank. Return a vpos of zero,
++               * which will cause calling code to just return the etime
++               * timestamp uncorrected. At least this is no worse than the
++               * standard fallback.
++               */
++              *vpos = 0;
++      }
++
++      return ret;
++}
++
++int vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
++                                int *max_error, struct timeval *vblank_time,
++                                unsigned flags)
++{
++      struct vc4_dev *vc4 = to_vc4_dev(dev);
++      struct vc4_crtc *vc4_crtc = vc4->crtc[crtc_id];
++      struct drm_crtc *crtc = &vc4_crtc->base;
++      struct drm_crtc_state *state = crtc->state;
++
++      /* Helper routine in DRM core does all the work: */
++      return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc_id, max_error,
++                                                   vblank_time, flags,
++                                                   &state->adjusted_mode);
++}
++
+ static void vc4_crtc_destroy(struct drm_crtc *crtc)
+ {
+       drm_crtc_cleanup(crtc);
+@@ -535,6 +678,7 @@ static irqreturn_t vc4_crtc_irq_handler(
+       irqreturn_t ret = IRQ_NONE;
+       if (stat & PV_INT_VFP_START) {
++              vc4_crtc->t_vblank = ktime_get();
+               CRTC_WRITE(PV_INTSTAT, PV_INT_VFP_START);
+               drm_crtc_handle_vblank(&vc4_crtc->base);
+               vc4_crtc_handle_page_flip(vc4_crtc);
+@@ -759,6 +903,22 @@ static void vc4_set_crtc_possible_masks(
+       }
+ }
++static void
++vc4_crtc_get_cob_allocation(struct vc4_crtc *vc4_crtc)
++{
++      struct drm_device *drm = vc4_crtc->base.dev;
++      struct vc4_dev *vc4 = to_vc4_dev(drm);
++      u32 dispbase = HVS_READ(SCALER_DISPBASEX(vc4_crtc->channel));
++      /* Top/base are supposed to be 4-pixel aligned, but the
++       * Raspberry Pi firmware fills the low bits (which are
++       * presumably ignored).
++       */
++      u32 top = VC4_GET_FIELD(dispbase, SCALER_DISPBASEX_TOP) & ~3;
++      u32 base = VC4_GET_FIELD(dispbase, SCALER_DISPBASEX_BASE) & ~3;
++
++      vc4_crtc->cob_size = top - base + 4;
++}
++
+ static int vc4_crtc_bind(struct device *dev, struct device *master, void *data)
+ {
+       struct platform_device *pdev = to_platform_device(dev);
+@@ -835,6 +995,8 @@ static int vc4_crtc_bind(struct device *
+               crtc->cursor = cursor_plane;
+       }
++      vc4_crtc_get_cob_allocation(vc4_crtc);
++
+       CRTC_WRITE(PV_INTEN, 0);
+       CRTC_WRITE(PV_INTSTAT, PV_INT_VFP_START);
+       ret = devm_request_irq(dev, platform_get_irq(pdev, 0),
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -116,6 +116,8 @@ static struct drm_driver vc4_drm_driver
+       .enable_vblank = vc4_enable_vblank,
+       .disable_vblank = vc4_disable_vblank,
+       .get_vblank_counter = drm_vblank_no_hw_counter,
++      .get_scanout_position = vc4_crtc_get_scanoutpos,
++      .get_vblank_timestamp = vc4_crtc_get_vblank_timestamp,
+ #if defined(CONFIG_DEBUG_FS)
+       .debugfs_init = vc4_debugfs_init,
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -419,6 +419,13 @@ int vc4_enable_vblank(struct drm_device
+ void vc4_disable_vblank(struct drm_device *dev, unsigned int crtc_id);
+ void vc4_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file);
+ int vc4_crtc_debugfs_regs(struct seq_file *m, void *arg);
++int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id,
++                          unsigned int flags, int *vpos, int *hpos,
++                          ktime_t *stime, ktime_t *etime,
++                          const struct drm_display_mode *mode);
++int vc4_crtc_get_vblank_timestamp(struct drm_device *dev, unsigned int crtc_id,
++                                int *max_error, struct timeval *vblank_time,
++                                unsigned flags);
+ /* vc4_debugfs.c */
+ int vc4_debugfs_init(struct drm_minor *minor);
+--- a/drivers/gpu/drm/vc4/vc4_regs.h
++++ b/drivers/gpu/drm/vc4/vc4_regs.h
+@@ -368,7 +368,6 @@
+ # define SCALER_DISPBKGND_FILL                        BIT(24)
+ #define SCALER_DISPSTAT0                        0x00000048
+-#define SCALER_DISPBASE0                        0x0000004c
+ # define SCALER_DISPSTATX_MODE_MASK           VC4_MASK(31, 30)
+ # define SCALER_DISPSTATX_MODE_SHIFT          30
+ # define SCALER_DISPSTATX_MODE_DISABLED               0
+@@ -377,6 +376,24 @@
+ # define SCALER_DISPSTATX_MODE_EOF            3
+ # define SCALER_DISPSTATX_FULL                        BIT(29)
+ # define SCALER_DISPSTATX_EMPTY                       BIT(28)
++# define SCALER_DISPSTATX_FRAME_COUNT_MASK    VC4_MASK(17, 12)
++# define SCALER_DISPSTATX_FRAME_COUNT_SHIFT   12
++# define SCALER_DISPSTATX_LINE_MASK           VC4_MASK(11, 0)
++# define SCALER_DISPSTATX_LINE_SHIFT          0
++
++#define SCALER_DISPBASE0                        0x0000004c
++/* Last pixel in the COB (display FIFO memory) allocated to this HVS
++ * channel.  Must be 4-pixel aligned (and thus 4 pixels less than the
++ * next COB base).
++ */
++# define SCALER_DISPBASEX_TOP_MASK            VC4_MASK(31, 16)
++# define SCALER_DISPBASEX_TOP_SHIFT           16
++/* First pixel in the COB (display FIFO memory) allocated to this HVS
++ * channel.  Must be 4-pixel aligned.
++ */
++# define SCALER_DISPBASEX_BASE_MASK           VC4_MASK(15, 0)
++# define SCALER_DISPBASEX_BASE_SHIFT          0
++
+ #define SCALER_DISPCTRL1                        0x00000050
+ #define SCALER_DISPBKGND1                       0x00000054
+ #define SCALER_DISPBKGNDX(x)                  (SCALER_DISPBKGND0 +        \
+@@ -387,6 +404,9 @@
+                                                (x) * (SCALER_DISPSTAT1 - \
+                                                       SCALER_DISPSTAT0))
+ #define SCALER_DISPBASE1                        0x0000005c
++#define SCALER_DISPBASEX(x)                   (SCALER_DISPBASE0 +        \
++                                               (x) * (SCALER_DISPBASE1 - \
++                                                      SCALER_DISPBASE0))
+ #define SCALER_DISPCTRL2                        0x00000060
+ #define SCALER_DISPCTRLX(x)                   (SCALER_DISPCTRL0 +        \
+                                                (x) * (SCALER_DISPCTRL1 - \
diff --git a/target/linux/brcm2708/patches-4.4/0457-drm-vc4-remove-redundant-ret-status-check.patch b/target/linux/brcm2708/patches-4.4/0457-drm-vc4-remove-redundant-ret-status-check.patch
new file mode 100644 (file)
index 0000000..7887f60
--- /dev/null
@@ -0,0 +1,35 @@
+From 2b643111b81df8724f317507471499660f4fc6f6 Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+Date: Sat, 9 Jul 2016 23:26:03 +0100
+Subject: [PATCH] drm/vc4: remove redundant ret status check
+
+At the current point where ret is being checked for non-zero it has
+not changed since it was initialized to zero, hence the check and the
+label unref are redundant and can be removed.
+
+Signed-off-by: Colin Ian King <colin.king@canonical.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit deb4765db386db67626ffd075d8b5eb5fdf9c4f6)
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -233,8 +233,6 @@ static int vc4_drm_bind(struct device *d
+       vc4_bo_cache_init(drm);
+       drm_mode_config_init(drm);
+-      if (ret)
+-              goto unref;
+       vc4_gem_init(drm);
+@@ -268,7 +266,6 @@ unbind_all:
+       component_unbind_all(dev, drm);
+ gem_destroy:
+       vc4_gem_destroy(drm);
+-unref:
+       drm_dev_unref(drm);
+       vc4_bo_cache_destroy(drm);
+       return ret;
diff --git a/target/linux/brcm2708/patches-4.4/0458-drm-vc4-add-extern-C-guard-for-the-UAPI-header.patch b/target/linux/brcm2708/patches-4.4/0458-drm-vc4-add-extern-C-guard-for-the-UAPI-header.patch
new file mode 100644 (file)
index 0000000..3b32bf8
--- /dev/null
@@ -0,0 +1,34 @@
+From 2f037770b9fedc29f75847a8323ffca49244e140 Mon Sep 17 00:00:00 2001
+From: Emil Velikov <emil.l.velikov@gmail.com>
+Date: Thu, 7 Apr 2016 19:36:57 +0100
+Subject: [PATCH] drm/vc4: add extern C guard for the UAPI header
+
+Cc: Eric Anholt <eric@anholt.net>
+Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
+(cherry picked from commit 6a982350f892c286c645a6fe0e1da1f869a0c43f)
+---
+ include/uapi/drm/vc4_drm.h | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/include/uapi/drm/vc4_drm.h
++++ b/include/uapi/drm/vc4_drm.h
+@@ -26,6 +26,10 @@
+ #include "drm.h"
++#if defined(__cplusplus)
++extern "C" {
++#endif
++
+ #define DRM_VC4_SUBMIT_CL                         0x00
+ #define DRM_VC4_WAIT_SEQNO                        0x01
+ #define DRM_VC4_WAIT_BO                           0x02
+@@ -276,4 +280,8 @@ struct drm_vc4_get_hang_state {
+       __u32 pad[16];
+ };
++#if defined(__cplusplus)
++}
++#endif
++
+ #endif /* _UAPI_VC4_DRM_H_ */
diff --git a/target/linux/brcm2708/patches-4.4/0459-drm-vc4-Fix-definition-of-QPU_R_MS_REV_FLAGS.patch b/target/linux/brcm2708/patches-4.4/0459-drm-vc4-Fix-definition-of-QPU_R_MS_REV_FLAGS.patch
new file mode 100644 (file)
index 0000000..15dfd76
--- /dev/null
@@ -0,0 +1,25 @@
+From ad6f4991e27d60b8939b8a1421166342355db503 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 4 Jul 2016 12:59:18 -0700
+Subject: [PATCH] drm/vc4: Fix definition of QPU_R_MS_REV_FLAGS
+
+We don't use it in shader validation currently, so it had no effect,
+but best to fix it anyway in case we do some day.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 20e48fd6a9252e21528c7e39b874c8fdca97f25a)
+---
+ drivers/gpu/drm/vc4/vc4_qpu_defines.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_qpu_defines.h
++++ b/drivers/gpu/drm/vc4/vc4_qpu_defines.h
+@@ -70,7 +70,7 @@ enum qpu_raddr {
+       QPU_R_ELEM_QPU = 38,
+       QPU_R_NOP,
+       QPU_R_XY_PIXEL_COORD = 41,
+-      QPU_R_MS_REV_FLAGS = 41,
++      QPU_R_MS_REV_FLAGS = 42,
+       QPU_R_VPM = 48,
+       QPU_R_VPM_LD_BUSY,
+       QPU_R_VPM_LD_WAIT,
diff --git a/target/linux/brcm2708/patches-4.4/0460-drm-vc4-Fix-a-the-the-typo-in-a-comment.patch b/target/linux/brcm2708/patches-4.4/0460-drm-vc4-Fix-a-the-the-typo-in-a-comment.patch
new file mode 100644 (file)
index 0000000..ca504cf
--- /dev/null
@@ -0,0 +1,22 @@
+From 18b45d780c43af635c4ed343ef99738bbfd07e26 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Sat, 2 Jul 2016 09:58:41 -0700
+Subject: [PATCH] drm/vc4: Fix a "the the" typo in a comment.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit a20d5fa61c32a0c94d237da642326db2ef3c7433)
+---
+ drivers/gpu/drm/vc4/vc4_validate_shaders.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
++++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+@@ -162,7 +162,7 @@ check_tmu_write(uint64_t inst,
+                       return false;
+               }
+-              /* We assert that the the clamped address is the first
++              /* We assert that the clamped address is the first
+                * argument, and the UBO base address is the second argument.
+                * This is arbitrary, but simpler than supporting flipping the
+                * two either way.
diff --git a/target/linux/brcm2708/patches-4.4/0461-drm-vc4-Return-EBUSY-if-there-s-already-a-pending-fl.patch b/target/linux/brcm2708/patches-4.4/0461-drm-vc4-Return-EBUSY-if-there-s-already-a-pending-fl.patch
new file mode 100644 (file)
index 0000000..39f74e9
--- /dev/null
@@ -0,0 +1,44 @@
+From bc27882bfefac9a1596aaed387ac01a844765e6c Mon Sep 17 00:00:00 2001
+From: Robert Foss <robert.foss@collabora.com>
+Date: Tue, 3 May 2016 13:48:20 -0400
+Subject: [PATCH] drm/vc4: Return -EBUSY if there's already a pending flip
+ event.
+
+As per the documentation in drm_crtc.h, atomic_commit should return
+-EBUSY if an asynchronous update is requested and there is an earlier
+update pending.
+
+v2: Rebase on the s/async/nonblock/ change.
+
+Signed-off-by: Robert Foss <robert.foss@collabora.com>
+Reviewed-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit e7c31f6f25b84fed961dc0dce6248878527693ae)
+---
+ drivers/gpu/drm/vc4/vc4_kms.c | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_kms.c
++++ b/drivers/gpu/drm/vc4/vc4_kms.c
+@@ -119,10 +119,18 @@ static int vc4_atomic_commit(struct drm_
+               return -ENOMEM;
+       /* Make sure that any outstanding modesets have finished. */
+-      ret = down_interruptible(&vc4->async_modeset);
+-      if (ret) {
+-              kfree(c);
+-              return ret;
++      if (nonblock) {
++              ret = down_trylock(&vc4->async_modeset);
++              if (ret) {
++                      kfree(c);
++                      return -EBUSY;
++              }
++      } else {
++              ret = down_interruptible(&vc4->async_modeset);
++              if (ret) {
++                      kfree(c);
++                      return ret;
++              }
+       }
+       ret = drm_atomic_helper_prepare_planes(dev, state);
diff --git a/target/linux/brcm2708/patches-4.4/0462-config-Enable-SENSORS_LM75.patch b/target/linux/brcm2708/patches-4.4/0462-config-Enable-SENSORS_LM75.patch
new file mode 100644 (file)
index 0000000..4a2259f
--- /dev/null
@@ -0,0 +1,30 @@
+From a770137c882b00d89888e007cd1f0a44475c2b60 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 12 Aug 2016 17:12:32 +0100
+Subject: [PATCH] config: Enable SENSORS_LM75
+
+---
+ 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
+@@ -642,6 +642,7 @@ CONFIG_BATTERY_DS2760=m
+ CONFIG_POWER_RESET=y
+ CONFIG_POWER_RESET_GPIO=y
+ CONFIG_HWMON=m
++CONFIG_SENSORS_LM75=m
+ CONFIG_SENSORS_SHT21=m
+ CONFIG_SENSORS_SHTC1=m
+ CONFIG_THERMAL=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -634,6 +634,7 @@ CONFIG_BATTERY_DS2760=m
+ CONFIG_POWER_RESET=y
+ CONFIG_POWER_RESET_GPIO=y
+ CONFIG_HWMON=m
++CONFIG_SENSORS_LM75=m
+ CONFIG_SENSORS_SHT21=m
+ CONFIG_SENSORS_SHTC1=m
+ CONFIG_THERMAL=y
diff --git a/target/linux/brcm2708/patches-4.4/0463-config-Enable-SERIAL_SC16IS7XX.patch b/target/linux/brcm2708/patches-4.4/0463-config-Enable-SERIAL_SC16IS7XX.patch
new file mode 100644 (file)
index 0000000..5fec3d7
--- /dev/null
@@ -0,0 +1,30 @@
+From d64a1deaa6da4663cbd148e9a047f069d99c14f5 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 12 Aug 2016 17:00:18 +0100
+Subject: [PATCH] config: Enable SERIAL_SC16IS7XX
+
+---
+ 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
+@@ -600,6 +600,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=0
+ CONFIG_SERIAL_AMBA_PL011=y
+ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+ CONFIG_SERIAL_OF_PLATFORM=y
++CONFIG_SERIAL_SC16IS7XX=m
+ CONFIG_TTY_PRINTK=y
+ CONFIG_HW_RANDOM=y
+ CONFIG_RAW_DRIVER=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -593,6 +593,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=0
+ CONFIG_SERIAL_AMBA_PL011=y
+ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+ CONFIG_SERIAL_OF_PLATFORM=y
++CONFIG_SERIAL_SC16IS7XX=m
+ CONFIG_TTY_PRINTK=y
+ CONFIG_HW_RANDOM=y
+ CONFIG_RAW_DRIVER=y
diff --git a/target/linux/brcm2708/patches-4.4/0464-snd-bcm2835-Don-t-allow-responses-from-VC-to-be-inte.patch b/target/linux/brcm2708/patches-4.4/0464-snd-bcm2835-Don-t-allow-responses-from-VC-to-be-inte.patch
new file mode 100644 (file)
index 0000000..ef5d0a3
--- /dev/null
@@ -0,0 +1,63 @@
+From 385eb363335dfe4120643ea72f3060fce745b5b7 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 12 Aug 2016 15:46:21 +0100
+Subject: [PATCH] snd-bcm2835: Don't allow responses from VC to be interrupted
+ by user signals
+
+There should always be a response, and retry after a signal interruption is not handled, so don't report
+we are interruptible.
+
+See: https://github.com/raspberrypi/linux/issues/1560
+---
+ sound/arm/bcm2835-vchiq.c | 25 ++++++-------------------
+ 1 file changed, 6 insertions(+), 19 deletions(-)
+
+--- a/sound/arm/bcm2835-vchiq.c
++++ b/sound/arm/bcm2835-vchiq.c
+@@ -511,12 +511,7 @@ static int bcm2835_audio_set_ctls_chan(b
+       }
+       /* We are expecting a reply from the videocore */
+-      ret = wait_for_completion_interruptible(&instance->msg_avail_comp);
+-      if (ret) {
+-              LOG_DBG("%s: failed on waiting for event (status=%d)\n",
+-                      __func__, success);
+-              goto unlock;
+-      }
++      wait_for_completion(&instance->msg_avail_comp);
+       if (instance->result != 0) {
+               LOG_ERR("%s: result=%d\n", __func__, instance->result);
+@@ -615,12 +610,7 @@ int bcm2835_audio_set_params(bcm2835_als
+       }
+       /* We are expecting a reply from the videocore */
+-      ret = wait_for_completion_interruptible(&instance->msg_avail_comp);
+-      if (ret) {
+-              LOG_DBG("%s: failed on waiting for event (status=%d)\n",
+-                      __func__, success);
+-              goto unlock;
+-      }
++      wait_for_completion(&instance->msg_avail_comp);
+       if (instance->result != 0) {
+               LOG_ERR("%s: result=%d", __func__, instance->result);
+@@ -761,14 +751,11 @@ int bcm2835_audio_close(bcm2835_alsa_str
+               goto unlock;
+       }
+-      ret = wait_for_completion_interruptible(&instance->msg_avail_comp);
+-      if (ret) {
+-              LOG_DBG("%s: failed on waiting for event (status=%d)\n",
+-                      __func__, success);
+-              goto unlock;
+-      }
++      /* We are expecting a reply from the videocore */
++      wait_for_completion(&instance->msg_avail_comp);
++
+       if (instance->result != 0) {
+-              LOG_ERR("%s: failed result (status=%d)\n",
++              LOG_ERR("%s: failed result (result=%d)\n",
+                       __func__, instance->result);
+               ret = -1;
diff --git a/target/linux/brcm2708/patches-4.4/0465-BCM270X-Connect-V3D-to-its-power-domain.patch b/target/linux/brcm2708/patches-4.4/0465-BCM270X-Connect-V3D-to-its-power-domain.patch
new file mode 100644 (file)
index 0000000..c305216
--- /dev/null
@@ -0,0 +1,23 @@
+From 1337324cc06c008a9d65b15328a96b21ab675113 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 12 Aug 2016 10:15:34 -0700
+Subject: [PATCH] BCM270X: Connect V3D to its power domain.
+
+We were doing this with manual firmware calls before, but to backport
+runtime PM we want to be using a proper power domain.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -366,6 +366,7 @@
+               v3d: v3d@7ec00000 {
+                       compatible = "brcm,vc4-v3d";
+                       reg = <0x7ec00000 0x1000>;
++                      power-domains = <&power RPI_POWER_DOMAIN_V3D>;
+                       status = "disabled";
+               };
diff --git a/target/linux/brcm2708/patches-4.4/0466-drm-vc4-Enable-runtime-PM.patch b/target/linux/brcm2708/patches-4.4/0466-drm-vc4-Enable-runtime-PM.patch
new file mode 100644 (file)
index 0000000..fc00a1a
--- /dev/null
@@ -0,0 +1,205 @@
+From 02a0346c7f8159cb0930ff153bf2cb3b1f1a7a79 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 5 Feb 2016 17:41:49 -0800
+Subject: [PATCH] drm/vc4: Enable runtime PM.
+
+This may actually get us a feature that the closed driver didn't have:
+turning off the GPU in between rendering jobs, while the V3D device is
+still opened by the client.
+
+There may be some tuning to be applied here to use autosuspend so that
+we don't bounce the device's power so much, but in steady-state
+GPU-bound rendering we keep the power on (since we keep multiple jobs
+outstanding) and even if we power cycle on every job we can still
+manage at least 680 fps.
+
+More importantly, though, runtime PM will allow us to power off the
+device to do a GPU reset.
+
+v2: Switch #ifdef to CONFIG_PM not CONFIG_PM_SLEEP (caught by kbuild
+    test robot)
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 001bdb55d9eb72a9e2d5b623bacfc52da74ae03e)
+---
+ drivers/gpu/drm/vc4/vc4_drv.h |  1 +
+ drivers/gpu/drm/vc4/vc4_gem.c | 10 ++++++++
+ drivers/gpu/drm/vc4/vc4_v3d.c | 59 ++++++++++++++++++++++++++-----------------
+ 3 files changed, 47 insertions(+), 23 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -155,6 +155,7 @@ struct vc4_seqno_cb {
+ };
+ struct vc4_v3d {
++      struct vc4_dev *vc4;
+       struct platform_device *pdev;
+       void __iomem *regs;
+ };
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -23,6 +23,7 @@
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
++#include <linux/pm_runtime.h>
+ #include <linux/device.h>
+ #include <linux/io.h>
+@@ -689,6 +690,7 @@ fail:
+ static void
+ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
+ {
++      struct vc4_dev *vc4 = to_vc4_dev(dev);
+       unsigned i;
+       /* Need the struct lock for drm_gem_object_unreference(). */
+@@ -707,6 +709,8 @@ vc4_complete_exec(struct drm_device *dev
+       }
+       mutex_unlock(&dev->struct_mutex);
++      pm_runtime_put(&vc4->v3d->pdev->dev);
++
+       kfree(exec);
+ }
+@@ -860,6 +864,12 @@ vc4_submit_cl_ioctl(struct drm_device *d
+               return -ENOMEM;
+       }
++      ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++      if (ret < 0) {
++              kfree(exec);
++              return ret;
++      }
++
+       exec->args = args;
+       INIT_LIST_HEAD(&exec->unref_list);
+--- a/drivers/gpu/drm/vc4/vc4_v3d.c
++++ b/drivers/gpu/drm/vc4/vc4_v3d.c
+@@ -17,7 +17,7 @@
+  */
+ #include "linux/component.h"
+-#include "soc/bcm2835/raspberrypi-firmware.h"
++#include "linux/pm_runtime.h"
+ #include "vc4_drv.h"
+ #include "vc4_regs.h"
+@@ -145,22 +145,6 @@ int vc4_v3d_debugfs_ident(struct seq_fil
+ }
+ #endif /* CONFIG_DEBUG_FS */
+-/*
+- * Asks the firmware to turn on power to the V3D engine.
+- *
+- * This may be doable with just the clocks interface, though this
+- * packet does some other register setup from the firmware, too.
+- */
+-int
+-vc4_v3d_set_power(struct vc4_dev *vc4, bool on)
+-{
+-      u32 packet = on;
+-
+-      return rpi_firmware_property(vc4->firmware,
+-                                   RPI_FIRMWARE_SET_ENABLE_QPU,
+-                                   &packet, sizeof(packet));
+-}
+-
+ static void vc4_v3d_init_hw(struct drm_device *dev)
+ {
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+@@ -172,6 +156,29 @@ static void vc4_v3d_init_hw(struct drm_d
+       V3D_WRITE(V3D_VPMBASE, 0);
+ }
++#ifdef CONFIG_PM
++static int vc4_v3d_runtime_suspend(struct device *dev)
++{
++      struct vc4_v3d *v3d = dev_get_drvdata(dev);
++      struct vc4_dev *vc4 = v3d->vc4;
++
++      vc4_irq_uninstall(vc4->dev);
++
++      return 0;
++}
++
++static int vc4_v3d_runtime_resume(struct device *dev)
++{
++      struct vc4_v3d *v3d = dev_get_drvdata(dev);
++      struct vc4_dev *vc4 = v3d->vc4;
++
++      vc4_v3d_init_hw(vc4->dev);
++      vc4_irq_postinstall(vc4->dev);
++
++      return 0;
++}
++#endif
++
+ static int vc4_v3d_bind(struct device *dev, struct device *master, void *data)
+ {
+       struct platform_device *pdev = to_platform_device(dev);
+@@ -184,6 +191,8 @@ static int vc4_v3d_bind(struct device *d
+       if (!v3d)
+               return -ENOMEM;
++      dev_set_drvdata(dev, v3d);
++
+       v3d->pdev = pdev;
+       v3d->regs = vc4_ioremap_regs(pdev, 0);
+@@ -191,10 +200,7 @@ static int vc4_v3d_bind(struct device *d
+               return PTR_ERR(v3d->regs);
+       vc4->v3d = v3d;
+-
+-      ret = vc4_v3d_set_power(vc4, true);
+-      if (ret)
+-              return ret;
++      v3d->vc4 = vc4;
+       if (V3D_READ(V3D_IDENT0) != V3D_EXPECTED_IDENT0) {
+               DRM_ERROR("V3D_IDENT0 read 0x%08x instead of 0x%08x\n",
+@@ -216,6 +222,8 @@ static int vc4_v3d_bind(struct device *d
+               return ret;
+       }
++      pm_runtime_enable(dev);
++
+       return 0;
+ }
+@@ -225,6 +233,8 @@ static void vc4_v3d_unbind(struct device
+       struct drm_device *drm = dev_get_drvdata(master);
+       struct vc4_dev *vc4 = to_vc4_dev(drm);
++      pm_runtime_disable(dev);
++
+       drm_irq_uninstall(drm);
+       /* Disable the binner's overflow memory address, so the next
+@@ -234,11 +244,13 @@ static void vc4_v3d_unbind(struct device
+       V3D_WRITE(V3D_BPOA, 0);
+       V3D_WRITE(V3D_BPOS, 0);
+-      vc4_v3d_set_power(vc4, false);
+-
+       vc4->v3d = NULL;
+ }
++static const struct dev_pm_ops vc4_v3d_pm_ops = {
++      SET_RUNTIME_PM_OPS(vc4_v3d_runtime_suspend, vc4_v3d_runtime_resume, NULL)
++};
++
+ static const struct component_ops vc4_v3d_ops = {
+       .bind   = vc4_v3d_bind,
+       .unbind = vc4_v3d_unbind,
+@@ -267,5 +279,6 @@ struct platform_driver vc4_v3d_driver =
+       .driver = {
+               .name = "vc4_v3d",
+               .of_match_table = vc4_v3d_dt_match,
++              .pm = &vc4_v3d_pm_ops,
+       },
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0467-drm-vc4-Drop-firmware-node-getting-now-that-we-use-t.patch b/target/linux/brcm2708/patches-4.4/0467-drm-vc4-Drop-firmware-node-getting-now-that-we-use-t.patch
new file mode 100644 (file)
index 0000000..353eb43
--- /dev/null
@@ -0,0 +1,54 @@
+From f83b96d75cab6d19376dcb9f49ebd870a8f73b69 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 12 Aug 2016 10:45:04 -0700
+Subject: [PATCH] drm/vc4: Drop firmware node getting now that we use the power
+ domain.
+
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 10 ----------
+ drivers/gpu/drm/vc4/vc4_drv.h |  1 -
+ 2 files changed, 11 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -15,7 +15,6 @@
+ #include <linux/module.h>
+ #include <linux/of_platform.h>
+ #include <linux/platform_device.h>
+-#include <soc/bcm2835/raspberrypi-firmware.h>
+ #include "drm_fb_cma_helper.h"
+ #include "uapi/drm/vc4_drm.h"
+@@ -204,7 +203,6 @@ static int vc4_drm_bind(struct device *d
+       struct drm_device *drm;
+       struct drm_connector *connector;
+       struct vc4_dev *vc4;
+-      struct device_node *firmware_node;
+       int ret = 0;
+       dev->coherent_dma_mask = DMA_BIT_MASK(32);
+@@ -213,14 +211,6 @@ static int vc4_drm_bind(struct device *d
+       if (!vc4)
+               return -ENOMEM;
+-      firmware_node = of_parse_phandle(dev->of_node, "firmware", 0);
+-      vc4->firmware = rpi_firmware_get(firmware_node);
+-      if (!vc4->firmware) {
+-              DRM_DEBUG("Failed to get Raspberry Pi firmware reference.\n");
+-              return -EPROBE_DEFER;
+-      }
+-      of_node_put(firmware_node);
+-
+       drm = drm_dev_alloc(&vc4_drm_driver, dev);
+       if (!drm)
+               return -ENOMEM;
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -23,7 +23,6 @@ struct vc4_dev {
+       struct vc4_dsi *dsi1;
+       struct drm_fbdev_cma *fbdev;
+-      struct rpi_firmware *firmware;
+       struct vc4_hang_state *hang_state;
diff --git a/target/linux/brcm2708/patches-4.4/0468-drm-vc4-Use-runtime-PM-to-power-cycle-the-device-whe.patch b/target/linux/brcm2708/patches-4.4/0468-drm-vc4-Use-runtime-PM-to-power-cycle-the-device-whe.patch
new file mode 100644 (file)
index 0000000..d771261
--- /dev/null
@@ -0,0 +1,102 @@
+From e70d1a5fdbb7277490c273533ce535977326c6a5 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 8 Feb 2016 12:59:02 -0800
+Subject: [PATCH] drm/vc4: Use runtime PM to power cycle the device when the
+ GPU hangs.
+
+This gets us functional GPU reset again, like we had until a refactor
+at merge time.  Tested with a little patch to stuff in a broken binner
+job every 100 frames.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 36cb6253f9383fd9a59ee7b8458c6232ef48577c)
+---
+ drivers/gpu/drm/vc4/vc4_drv.h |  6 +++++-
+ drivers/gpu/drm/vc4/vc4_gem.c | 26 +++++++++++++++++++++-----
+ 2 files changed, 26 insertions(+), 6 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -104,6 +104,11 @@ struct vc4_dev {
+       struct vc4_bo *overflow_mem;
+       struct work_struct overflow_mem_work;
++      int power_refcount;
++
++      /* Mutex controlling the power refcount. */
++      struct mutex power_lock;
++
+       struct {
+               struct timer_list timer;
+               struct work_struct reset_work;
+@@ -495,7 +500,6 @@ void vc4_plane_async_set_fb(struct drm_p
+ extern struct platform_driver vc4_v3d_driver;
+ int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused);
+ int vc4_v3d_debugfs_regs(struct seq_file *m, void *unused);
+-int vc4_v3d_set_power(struct vc4_dev *vc4, bool on);
+ /* vc4_validate.c */
+ int
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -261,8 +261,16 @@ vc4_reset(struct drm_device *dev)
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       DRM_INFO("Resetting GPU.\n");
+-      vc4_v3d_set_power(vc4, false);
+-      vc4_v3d_set_power(vc4, true);
++
++      mutex_lock(&vc4->power_lock);
++      if (vc4->power_refcount) {
++              /* Power the device off and back on the by dropping the
++               * reference on runtime PM.
++               */
++              pm_runtime_put_sync_suspend(&vc4->v3d->pdev->dev);
++              pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++      }
++      mutex_unlock(&vc4->power_lock);
+       vc4_irq_reset(dev);
+@@ -709,7 +717,10 @@ vc4_complete_exec(struct drm_device *dev
+       }
+       mutex_unlock(&dev->struct_mutex);
+-      pm_runtime_put(&vc4->v3d->pdev->dev);
++      mutex_lock(&vc4->power_lock);
++      if (--vc4->power_refcount == 0)
++              pm_runtime_put(&vc4->v3d->pdev->dev);
++      mutex_unlock(&vc4->power_lock);
+       kfree(exec);
+ }
+@@ -851,7 +862,7 @@ vc4_submit_cl_ioctl(struct drm_device *d
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       struct drm_vc4_submit_cl *args = data;
+       struct vc4_exec_info *exec;
+-      int ret;
++      int ret = 0;
+       if ((args->flags & ~VC4_SUBMIT_CL_USE_CLEAR_COLOR) != 0) {
+               DRM_ERROR("Unknown flags: 0x%02x\n", args->flags);
+@@ -864,7 +875,10 @@ vc4_submit_cl_ioctl(struct drm_device *d
+               return -ENOMEM;
+       }
+-      ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++      mutex_lock(&vc4->power_lock);
++      if (vc4->power_refcount++ == 0)
++              ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++      mutex_unlock(&vc4->power_lock);
+       if (ret < 0) {
+               kfree(exec);
+               return ret;
+@@ -925,6 +939,8 @@ vc4_gem_init(struct drm_device *dev)
+                   (unsigned long)dev);
+       INIT_WORK(&vc4->job_done_work, vc4_job_done_work);
++
++      mutex_init(&vc4->power_lock);
+ }
+ void
diff --git a/target/linux/brcm2708/patches-4.4/0469-drm-panel-Drop-debug-printf-from-the-Raspberry-Pi-to.patch b/target/linux/brcm2708/patches-4.4/0469-drm-panel-Drop-debug-printf-from-the-Raspberry-Pi-to.patch
new file mode 100644 (file)
index 0000000..56ccf2e
--- /dev/null
@@ -0,0 +1,21 @@
+From 7cac96392a51584d864291e08aeda97f9ee3e384 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 12 Aug 2016 10:55:53 -0700
+Subject: [PATCH] drm/panel: Drop debug printf from the Raspberry Pi
+ touchscreen.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
++++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+@@ -106,7 +106,6 @@ struct regdump {
+ static int rpi_touchscreen_disable(struct drm_panel *panel)
+ {
+       struct rpi_touchscreen *ts = panel_to_ts(panel);
+-      pr_err("disable\n");
+       if (!ts->enabled)
+               return 0;
diff --git a/target/linux/brcm2708/patches-4.4/0470-drm-vc4-Replace-HDMI-force-connected-with-an-EDID-pr.patch b/target/linux/brcm2708/patches-4.4/0470-drm-vc4-Replace-HDMI-force-connected-with-an-EDID-pr.patch
new file mode 100644 (file)
index 0000000..3c23794
--- /dev/null
@@ -0,0 +1,42 @@
+From 05352a2959d8924a6333726cd15144245d7c98fa Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 12 Aug 2016 10:57:41 -0700
+Subject: [PATCH] drm/vc4: Replace HDMI force-connected with an EDID probe.
+
+The force-connected started out because I didn't know how to read the
+HPD pin successfully, which required the hpd_active_low check and
+getting the correct active level into the DTs.  It stayed because we
+don't have the Pi3's HPD line exposed to Linux, so this was the only
+way to bring up graphics on it.
+
+However, with the DSI panel support now present, users want to be able
+to run DSI-only systems, and forcing HDMI on is interfering with
+default screen configurations.  Work around the Pi3's missing HPD by
+probing the DDC on I2C and see if it's present at all.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -166,8 +166,6 @@ vc4_hdmi_connector_detect(struct drm_con
+       struct drm_device *dev = connector->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+-      return connector_status_connected;
+-
+       if (vc4->hdmi->hpd_gpio) {
+               if (gpio_get_value_cansleep(vc4->hdmi->hpd_gpio) ^
+                   vc4->hdmi->hpd_active_low)
+@@ -176,6 +174,9 @@ vc4_hdmi_connector_detect(struct drm_con
+                       return connector_status_disconnected;
+       }
++      if (drm_probe_ddc(vc4->hdmi->ddc))
++              return connector_status_connected;
++
+       if (HDMI_READ(VC4_HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED)
+               return connector_status_connected;
+       else
diff --git a/target/linux/brcm2708/patches-4.4/0471-net-ethernet-enc28j60-add-device-tree-support.patch b/target/linux/brcm2708/patches-4.4/0471-net-ethernet-enc28j60-add-device-tree-support.patch
new file mode 100644 (file)
index 0000000..eab1286
--- /dev/null
@@ -0,0 +1,143 @@
+From 55d0ce46f962a768dd358ca26158c8c195988645 Mon Sep 17 00:00:00 2001
+From: Michael Heimpold <mhei@heimpold.de>
+Date: Thu, 28 Apr 2016 22:06:15 +0200
+Subject: [PATCH] net: ethernet: enc28j60: add device tree support
+
+(Upstream commit 2dd355a007e44960ec049c75920ddb6778fec9ee)
+
+The following patch adds the required match table for device tree support
+(and while at, fix the indent). It's also possible to specify the
+MAC address in the DT blob.
+
+Also add the corresponding binding documentation file.
+
+Signed-off-by: Michael Heimpold <mhei@heimpold.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ .../devicetree/bindings/net/microchip,enc28j60.txt | 59 ++++++++++++++++++++++
+ drivers/net/ethernet/microchip/enc28j60.c          | 21 +++++---
+ 2 files changed, 73 insertions(+), 7 deletions(-)
+ create mode 100644 Documentation/devicetree/bindings/net/microchip,enc28j60.txt
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/net/microchip,enc28j60.txt
+@@ -0,0 +1,59 @@
++* Microchip ENC28J60
++
++This is a standalone 10 MBit ethernet controller with SPI interface.
++
++For each device connected to a SPI bus, define a child node within
++the SPI master node.
++
++Required properties:
++- compatible: Should be "microchip,enc28j60"
++- reg: Specify the SPI chip select the ENC28J60 is wired to
++- interrupt-parent: Specify the phandle of the source interrupt, see interrupt
++                    binding documentation for details. Usually this is the GPIO bank
++                    the interrupt line is wired to.
++- interrupts: Specify the interrupt index within the interrupt controller (referred
++              to above in interrupt-parent) and interrupt type. The ENC28J60 natively
++              generates falling edge interrupts, however, additional board logic
++              might invert the signal.
++- pinctrl-names: List of assigned state names, see pinctrl binding documentation.
++- pinctrl-0: List of phandles to configure the GPIO pin used as interrupt line,
++             see also generic and your platform specific pinctrl binding
++             documentation.
++
++Optional properties:
++- spi-max-frequency: Maximum frequency of the SPI bus when accessing the ENC28J60.
++  According to the ENC28J80 datasheet, the chip allows a maximum of 20 MHz, however,
++  board designs may need to limit this value.
++- local-mac-address: See ethernet.txt in the same directory.
++
++
++Example (for NXP i.MX28 with pin control stuff for GPIO irq):
++
++        ssp2: ssp@80014000 {
++                compatible = "fsl,imx28-spi";
++                pinctrl-names = "default";
++                pinctrl-0 = <&spi2_pins_b &spi2_sck_cfg>;
++                status = "okay";
++
++                enc28j60: ethernet@0 {
++                        compatible = "microchip,enc28j60";
++                        pinctrl-names = "default";
++                        pinctrl-0 = <&enc28j60_pins>;
++                        reg = <0>;
++                        interrupt-parent = <&gpio3>;
++                        interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
++                        spi-max-frequency = <12000000>;
++                };
++        };
++
++        pinctrl@80018000 {
++                enc28j60_pins: enc28j60_pins@0 {
++                        reg = <0>;
++                        fsl,pinmux-ids = <
++                                MX28_PAD_AUART0_RTS__GPIO_3_3    /* Interrupt */
++                        >;
++                        fsl,drive-strength = <MXS_DRIVE_4mA>;
++                        fsl,voltage = <MXS_VOLTAGE_HIGH>;
++                        fsl,pull-up = <MXS_PULL_DISABLE>;
++                };
++        };
+--- a/drivers/net/ethernet/microchip/enc28j60.c
++++ b/drivers/net/ethernet/microchip/enc28j60.c
+@@ -28,11 +28,12 @@
+ #include <linux/skbuff.h>
+ #include <linux/delay.h>
+ #include <linux/spi/spi.h>
++#include <linux/of_net.h>
+ #include "enc28j60_hw.h"
+ #define DRV_NAME      "enc28j60"
+-#define DRV_VERSION   "1.01"
++#define DRV_VERSION   "1.02"
+ #define SPI_OPLEN     1
+@@ -1544,6 +1545,7 @@ static int enc28j60_probe(struct spi_dev
+ {
+       struct net_device *dev;
+       struct enc28j60_net *priv;
++      const void *macaddr;
+       int ret = 0;
+       if (netif_msg_drv(&debug))
+@@ -1575,7 +1577,12 @@ static int enc28j60_probe(struct spi_dev
+               ret = -EIO;
+               goto error_irq;
+       }
+-      eth_hw_addr_random(dev);
++
++      macaddr = of_get_mac_address(spi->dev.of_node);
++      if (macaddr)
++              ether_addr_copy(dev->dev_addr, macaddr);
++      else
++              eth_hw_addr_random(dev);
+       enc28j60_set_hw_macaddr(dev);
+       /* Board setup must set the relevant edge trigger type;
+@@ -1630,16 +1637,16 @@ static int enc28j60_remove(struct spi_de
+       return 0;
+ }
+-static const struct of_device_id enc28j60_of_match[] = {
+-      { .compatible = "microchip,enc28j60", },
++static const struct of_device_id enc28j60_dt_ids[] = {
++      { .compatible = "microchip,enc28j60" },
+       { /* sentinel */ }
+ };
+-MODULE_DEVICE_TABLE(of, enc28j60_of_match);
++MODULE_DEVICE_TABLE(of, enc28j60_dt_ids);
+ static struct spi_driver enc28j60_driver = {
+       .driver = {
+-                 .name = DRV_NAME,
+-                 .of_match_table = enc28j60_of_match,
++              .name = DRV_NAME,
++              .of_match_table = enc28j60_dt_ids,
+        },
+       .probe = enc28j60_probe,
+       .remove = enc28j60_remove,
diff --git a/target/linux/brcm2708/patches-4.4/0472-enc28j60-Fix-race-condition-in-enc28j60-driver.patch b/target/linux/brcm2708/patches-4.4/0472-enc28j60-Fix-race-condition-in-enc28j60-driver.patch
new file mode 100644 (file)
index 0000000..1447beb
--- /dev/null
@@ -0,0 +1,64 @@
+From 2f1038fb16442e7285c6a4da47c56d1967ab05da Mon Sep 17 00:00:00 2001
+From: Sergio Valverde <sergio.valverde@hpe.com>
+Date: Fri, 1 Jul 2016 11:44:30 -0600
+Subject: [PATCH] enc28j60: Fix race condition in enc28j60 driver
+
+(Upstream commit 373819ec391de0d11f63b10b2fb69ef2854236ca)
+
+The interrupt worker code for the enc28j60 relies only on the TXIF flag to
+determinate if the packet transmission was completed. However the datasheet
+specifies in section 12.1.3 that TXERIF will clear the TXRTS after a
+transmit abort. Also in section 12.1.4 that TXIF will be set
+when TXRTS transitions from '1' to '0'. Therefore the TXIF flag is enabled
+during transmission errors.
+
+This causes a race condition, since the worker code will invoke
+enc28j60_tx_clear() -> netif_wake_queue(), potentially invoking the
+ndo_start_xmit function to send a new packet. The enc28j60_send_packet function
+uses a workqueue that invokes enc28j60_hw_tx(). In between this function is
+called, the worker from the interrupt handler will enter the path for error
+handler because of the TXERIF flag, causing to invoke enc28j60_tx_clear() again
+and releasing the packet scheduled for transmission, causing a kernel crash with
+due a NULL pointer.
+
+These crashes due a NULL pointer were observed under stress conditions of the
+device. A BUG_ON() sequence was used to validate the issue was fixed, and has
+been running without problems for 2 years now.
+
+Signed-off-by: Diego Dompe <dompe@hpe.com>
+Acked-by: Sergio Valverde <sergio.valverde@hpe.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/microchip/enc28j60.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/microchip/enc28j60.c
++++ b/drivers/net/ethernet/microchip/enc28j60.c
+@@ -1147,7 +1147,8 @@ static void enc28j60_irq_work_handler(st
+                       enc28j60_phy_read(priv, PHIR);
+               }
+               /* TX complete handler */
+-              if ((intflags & EIR_TXIF) != 0) {
++              if (((intflags & EIR_TXIF) != 0) &&
++                  ((intflags & EIR_TXERIF) == 0)) {
+                       bool err = false;
+                       loop++;
+                       if (netif_msg_intr(priv))
+@@ -1199,7 +1200,7 @@ static void enc28j60_irq_work_handler(st
+                                       enc28j60_tx_clear(ndev, true);
+                       } else
+                               enc28j60_tx_clear(ndev, true);
+-                      locked_reg_bfclr(priv, EIR, EIR_TXERIF);
++                      locked_reg_bfclr(priv, EIR, EIR_TXERIF | EIR_TXIF);
+               }
+               /* RX Error handler */
+               if ((intflags & EIR_RXERIF) != 0) {
+@@ -1234,6 +1235,8 @@ static void enc28j60_irq_work_handler(st
+  */
+ static void enc28j60_hw_tx(struct enc28j60_net *priv)
+ {
++      BUG_ON(!priv->tx_skb);
++
+       if (netif_msg_tx_queued(priv))
+               printk(KERN_DEBUG DRV_NAME
+                       ": Tx Packet Len:%d\n", priv->tx_skb->len);
diff --git a/target/linux/brcm2708/patches-4.4/0473-Add-cm3-dts-file.patch b/target/linux/brcm2708/patches-4.4/0473-Add-cm3-dts-file.patch
new file mode 100644 (file)
index 0000000..4f322bb
--- /dev/null
@@ -0,0 +1,200 @@
+From 22af0da1539b63a5dc49cc03d28a726027e2d688 Mon Sep 17 00:00:00 2001
+From: James Adams <james@raspberrypi.org>
+Date: Fri, 12 Aug 2016 14:35:00 +0100
+Subject: [PATCH] Add cm3 dts file
+
+---
+ arch/arm/boot/dts/Makefile            |   1 +
+ arch/arm/boot/dts/bcm2710-rpi-cm3.dts | 176 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 177 insertions(+)
+ create mode 100644 arch/arm/boot/dts/bcm2710-rpi-cm3.dts
+
+--- a/arch/arm/boot/dts/Makefile
++++ b/arch/arm/boot/dts/Makefile
+@@ -6,6 +6,7 @@ dtb-$(CONFIG_ARCH_BCM2708) += bcm2708-rp
+ dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-cm.dtb
+ dtb-$(CONFIG_ARCH_BCM2709) += bcm2709-rpi-2-b.dtb
+ dtb-$(CONFIG_ARCH_BCM2709) += bcm2710-rpi-3-b.dtb
++dtb-$(CONFIG_ARCH_BCM2709) += bcm2710-rpi-cm3.dtb
+ # Raspberry Pi
+ ifeq ($(CONFIG_ARCH_BCM2708),y)
+--- /dev/null
++++ b/arch/arm/boot/dts/bcm2710-rpi-cm3.dts
+@@ -0,0 +1,176 @@
++/dts-v1/;
++
++#include "bcm2710.dtsi"
++
++/ {
++      compatible = "brcm,bcm2710","brcm,bcm2709";
++      model = "Raspberry Pi Compute Module 3";
++};
++
++&gpio {
++
++      mmc_pins: mmc_pins {
++              brcm,pins = <48 49 50 51 52 53>;
++              brcm,function = <7>; /* alt3 */
++              brcm,pull = <0 2 2 2 2 2>;
++      };
++
++      spi0_pins: spi0_pins {
++              brcm,pins = <9 10 11>;
++              brcm,function = <4>; /* alt0 */
++      };
++
++      spi0_cs_pins: spi0_cs_pins {
++              brcm,pins = <8 7>;
++              brcm,function = <1>; /* output */
++      };
++
++      i2c0_pins: i2c0 {
++              brcm,pins = <0 1>;
++              brcm,function = <4>;
++      };
++
++      i2c1_pins: i2c1 {
++              brcm,pins = <2 3>;
++              brcm,function = <4>;
++      };
++
++      i2s_pins: i2s {
++              brcm,pins = <18 19 20 21>;
++              brcm,function = <4>; /* alt0 */
++      };
++
++      uart0_pins: uart0_pins {
++              brcm,pins;
++              brcm,function;
++              brcm,pull = <0 2>;
++      };
++
++      audio_pins: audio_pins {
++              brcm,pins;
++              brcm,function;
++      };
++};
++
++&mmc {
++      pinctrl-names = "default";
++      pinctrl-0 = <&mmc_pins>;
++      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 {
++      status = "okay";
++};
++
++&uart0 {
++      pinctrl-names = "default";
++      pinctrl-0 = <&uart0_pins>;
++      status = "okay";
++};
++
++&spi0 {
++      pinctrl-names = "default";
++      pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
++      cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
++
++      spidev0: spidev@0{
++              compatible = "spidev";
++              reg = <0>;      /* CE0 */
++              #address-cells = <1>;
++              #size-cells = <0>;
++              spi-max-frequency = <500000>;
++      };
++
++      spidev1: spidev@1{
++              compatible = "spidev";
++              reg = <1>;      /* CE1 */
++              #address-cells = <1>;
++              #size-cells = <0>;
++              spi-max-frequency = <500000>;
++      };
++};
++
++&i2c0 {
++      pinctrl-names = "default";
++      pinctrl-0 = <&i2c0_pins>;
++      clock-frequency = <100000>;
++};
++
++&i2c1 {
++      pinctrl-names = "default";
++      pinctrl-0 = <&i2c1_pins>;
++      clock-frequency = <100000>;
++};
++
++&i2c2 {
++      clock-frequency = <100000>;
++};
++
++&i2s {
++      #sound-dai-cells = <0>;
++      pinctrl-names = "default";
++      pinctrl-0 = <&i2s_pins>;
++};
++
++&random {
++      status = "okay";
++};
++
++&leds {
++      act_led: act {
++              label = "led0";
++              linux,default-trigger = "mmc0";
++              gpios = <&virtgpio 0 0>;
++      };
++};
++
++&hdmi {
++      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
++};
++
++&audio {
++      pinctrl-names = "default";
++      pinctrl-0 = <&audio_pins>;
++};
++
++/ {
++      __overrides__ {
++              uart0 = <&uart0>,"status";
++              uart0_clkrate = <&clk_uart0>,"clock-frequency:0";
++              uart1 = <&uart1>,"status";
++              i2s = <&i2s>,"status";
++              spi = <&spi0>,"status";
++              i2c0 = <&i2c0>,"status";
++              i2c1 = <&i2c1>,"status";
++              i2c2_iknowwhatimdoing = <&i2c2>,"status";
++              i2c0_baudrate = <&i2c0>,"clock-frequency:0";
++              i2c1_baudrate = <&i2c1>,"clock-frequency:0";
++              i2c2_baudrate = <&i2c2>,"clock-frequency:0";
++              core_freq = <&clk_core>,"clock-frequency:0";
++
++              act_led_gpio = <&act_led>,"gpios:4";
++              act_led_activelow = <&act_led>,"gpios:8";
++              act_led_trigger = <&act_led>,"linux,default-trigger";
++
++              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";
++      };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0474-BCM270X-Drop-HPD-setting-from-the-common-dtsi.patch b/target/linux/brcm2708/patches-4.4/0474-BCM270X-Drop-HPD-setting-from-the-common-dtsi.patch
new file mode 100644 (file)
index 0000000..61b1985
--- /dev/null
@@ -0,0 +1,21 @@
+From 8f7b6b3db2ffcec68137e671c158c705241e1009 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 15 Aug 2016 10:08:58 -0700
+Subject: [PATCH] BCM270X: Drop HPD setting from the common dtsi.
+
+The HPD is quite board-specific, so we need to set it in the per-board
+DT.
+---
+ arch/arm/boot/dts/bcm2708_common.dtsi | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/arch/arm/boot/dts/bcm2708_common.dtsi
++++ b/arch/arm/boot/dts/bcm2708_common.dtsi
+@@ -347,7 +347,6 @@
+                       reg = <0x7e902000 0x600>,
+                             <0x7e808000 0x100>;
+                       ddc = <&i2c2>;
+-                      hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
+                       clocks = <&cprman BCM2835_PLLH_PIX>,
+                                <&cprman BCM2835_CLOCK_HSM>;
+                       clock-names = "pixel", "hdmi";
diff --git a/target/linux/brcm2708/patches-4.4/0475-BCM2710-Drop-incorrect-HDMI-HPD-line-from-the-DT.patch b/target/linux/brcm2708/patches-4.4/0475-BCM2710-Drop-incorrect-HDMI-HPD-line-from-the-DT.patch
new file mode 100644 (file)
index 0000000..4ae0e30
--- /dev/null
@@ -0,0 +1,26 @@
+From 5bdac7f7f6e6d9938da0d6bd0d58a136cf29515b Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 12 Aug 2016 11:02:14 -0700
+Subject: [PATCH] BCM2710: Drop incorrect HDMI HPD line from the DT.
+
+It's actually off on the GPIO expander, which I don't think we have
+access to.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts
+@@ -166,10 +166,6 @@
+       };
+ };
+-&hdmi {
+-      hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+-};
+-
+ &audio {
+       pinctrl-names = "default";
+       pinctrl-0 = <&audio_pins>;
diff --git a/target/linux/brcm2708/patches-4.4/0476-drm-vc4-Add-a-getparam-ioctl-for-getting-the-V3D-ide.patch b/target/linux/brcm2708/patches-4.4/0476-drm-vc4-Add-a-getparam-ioctl-for-getting-the-V3D-ide.patch
new file mode 100644 (file)
index 0000000..a51347e
--- /dev/null
@@ -0,0 +1,124 @@
+From 35d17fc64d8612bfc019a9a6078647886fae783f Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Fri, 1 Jul 2016 13:10:38 -0700
+Subject: [PATCH] drm/vc4: Add a getparam ioctl for getting the V3D identity
+ regs.
+
+As I extend the driver to support different V3D revisions, userspace
+needs to know what version it's targeting.  This is most easily
+detected using the V3D identity registers.
+
+v2: Make sure V3D is runtime PM on when reading the registers.
+v3: Switch to a 64-bit param value (suggested by Rob Clark in review)
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> (v2)
+Reviewed-by: Rob Clark <robdclark@gmail.com> (v3, over irc)
+(cherry picked from commit af713795c59fea36161a7debf97dbc10bf652cf7)
+
+v4: Squashed in "drm/vc4: Fix handling of a pm_runtime_get_sync() success case."
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ include/uapi/drm/vc4_drm.h    | 12 ++++++++++++
+ 2 files changed, 54 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -15,6 +15,7 @@
+ #include <linux/module.h>
+ #include <linux/of_platform.h>
+ #include <linux/platform_device.h>
++#include <linux/pm_runtime.h>
+ #include "drm_fb_cma_helper.h"
+ #include "uapi/drm/vc4_drm.h"
+@@ -64,6 +65,46 @@ void vc4_dump_regs32(const struct debugf
+       }
+ }
++static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
++                             struct drm_file *file_priv)
++{
++      struct vc4_dev *vc4 = to_vc4_dev(dev);
++      struct drm_vc4_get_param *args = data;
++      int ret;
++
++      if (args->pad != 0)
++              return -EINVAL;
++
++      switch (args->param) {
++      case DRM_VC4_PARAM_V3D_IDENT0:
++              ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++              if (ret < 0)
++                      return ret;
++              args->value = V3D_READ(V3D_IDENT0);
++              pm_runtime_put(&vc4->v3d->pdev->dev);
++              break;
++      case DRM_VC4_PARAM_V3D_IDENT1:
++              ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++              if (ret < 0)
++                      return ret;
++              args->value = V3D_READ(V3D_IDENT1);
++              pm_runtime_put(&vc4->v3d->pdev->dev);
++              break;
++      case DRM_VC4_PARAM_V3D_IDENT2:
++              ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
++              if (ret < 0)
++                      return ret;
++              args->value = V3D_READ(V3D_IDENT2);
++              pm_runtime_put(&vc4->v3d->pdev->dev);
++              break;
++      default:
++              DRM_DEBUG("Unknown parameter %d\n", args->param);
++              return -EINVAL;
++      }
++
++      return 0;
++}
++
+ static void vc4_lastclose(struct drm_device *dev)
+ {
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+@@ -95,6 +136,7 @@ static const struct drm_ioctl_desc vc4_d
+       DRM_IOCTL_DEF_DRV(VC4_CREATE_SHADER_BO, vc4_create_shader_bo_ioctl, DRM_RENDER_ALLOW),
+       DRM_IOCTL_DEF_DRV(VC4_GET_HANG_STATE, vc4_get_hang_state_ioctl,
+                         DRM_ROOT_ONLY),
++      DRM_IOCTL_DEF_DRV(VC4_GET_PARAM, vc4_get_param_ioctl, DRM_RENDER_ALLOW),
+ };
+ static struct drm_driver vc4_drm_driver = {
+--- a/include/uapi/drm/vc4_drm.h
++++ b/include/uapi/drm/vc4_drm.h
+@@ -37,6 +37,7 @@ extern "C" {
+ #define DRM_VC4_MMAP_BO                           0x04
+ #define DRM_VC4_CREATE_SHADER_BO                  0x05
+ #define DRM_VC4_GET_HANG_STATE                    0x06
++#define DRM_VC4_GET_PARAM                         0x07
+ #define DRM_IOCTL_VC4_SUBMIT_CL           DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SUBMIT_CL, struct drm_vc4_submit_cl)
+ #define DRM_IOCTL_VC4_WAIT_SEQNO          DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_WAIT_SEQNO, struct drm_vc4_wait_seqno)
+@@ -45,6 +46,7 @@ extern "C" {
+ #define DRM_IOCTL_VC4_MMAP_BO             DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_MMAP_BO, struct drm_vc4_mmap_bo)
+ #define DRM_IOCTL_VC4_CREATE_SHADER_BO    DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_SHADER_BO, struct drm_vc4_create_shader_bo)
+ #define DRM_IOCTL_VC4_GET_HANG_STATE      DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_HANG_STATE, struct drm_vc4_get_hang_state)
++#define DRM_IOCTL_VC4_GET_PARAM           DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_PARAM, struct drm_vc4_get_param)
+ struct drm_vc4_submit_rcl_surface {
+       __u32 hindex; /* Handle index, or ~0 if not present. */
+@@ -280,6 +282,16 @@ struct drm_vc4_get_hang_state {
+       __u32 pad[16];
+ };
++#define DRM_VC4_PARAM_V3D_IDENT0              0
++#define DRM_VC4_PARAM_V3D_IDENT1              1
++#define DRM_VC4_PARAM_V3D_IDENT2              2
++
++struct drm_vc4_get_param {
++      __u32 param;
++      __u32 pad;
++      __u64 value;
++};
++
+ #if defined(__cplusplus)
+ }
+ #endif
diff --git a/target/linux/brcm2708/patches-4.4/0477-drm-vc4-Move-validation-s-current-max-ip-into-the-va.patch b/target/linux/brcm2708/patches-4.4/0477-drm-vc4-Move-validation-s-current-max-ip-into-the-va.patch
new file mode 100644 (file)
index 0000000..53b8fb0
--- /dev/null
@@ -0,0 +1,176 @@
+From 71f1e833c8f76504921b3913d5a8da310318934f Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Sat, 2 Jul 2016 09:57:07 -0700
+Subject: [PATCH] drm/vc4: Move validation's current/max ip into the validation
+ struct.
+
+Reduces the argument count for some of the functions, and will be used
+more with the upcoming looping support.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit d0566c2a2f2baacefe1eb75be8a001fdd6fe84a3)
+---
+ drivers/gpu/drm/vc4/vc4_validate_shaders.c | 54 +++++++++++++++++-------------
+ 1 file changed, 30 insertions(+), 24 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
++++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+@@ -40,6 +40,14 @@
+ #include "vc4_qpu_defines.h"
+ struct vc4_shader_validation_state {
++      /* Current IP being validated. */
++      uint32_t ip;
++
++      /* IP at the end of the BO, do not read shader[max_ip] */
++      uint32_t max_ip;
++
++      uint64_t *shader;
++
+       struct vc4_texture_sample_info tmu_setup[2];
+       int tmu_write_count[2];
+@@ -129,11 +137,11 @@ record_texture_sample(struct vc4_validat
+ }
+ static bool
+-check_tmu_write(uint64_t inst,
+-              struct vc4_validated_shader_info *validated_shader,
++check_tmu_write(struct vc4_validated_shader_info *validated_shader,
+               struct vc4_shader_validation_state *validation_state,
+               bool is_mul)
+ {
++      uint64_t inst = validation_state->shader[validation_state->ip];
+       uint32_t waddr = (is_mul ?
+                         QPU_GET_FIELD(inst, QPU_WADDR_MUL) :
+                         QPU_GET_FIELD(inst, QPU_WADDR_ADD));
+@@ -228,11 +236,11 @@ check_tmu_write(uint64_t inst,
+ }
+ static bool
+-check_reg_write(uint64_t inst,
+-              struct vc4_validated_shader_info *validated_shader,
++check_reg_write(struct vc4_validated_shader_info *validated_shader,
+               struct vc4_shader_validation_state *validation_state,
+               bool is_mul)
+ {
++      uint64_t inst = validation_state->shader[validation_state->ip];
+       uint32_t waddr = (is_mul ?
+                         QPU_GET_FIELD(inst, QPU_WADDR_MUL) :
+                         QPU_GET_FIELD(inst, QPU_WADDR_ADD));
+@@ -261,7 +269,7 @@ check_reg_write(uint64_t inst,
+       case QPU_W_TMU1_T:
+       case QPU_W_TMU1_R:
+       case QPU_W_TMU1_B:
+-              return check_tmu_write(inst, validated_shader, validation_state,
++              return check_tmu_write(validated_shader, validation_state,
+                                      is_mul);
+       case QPU_W_HOST_INT:
+@@ -294,10 +302,10 @@ check_reg_write(uint64_t inst,
+ }
+ static void
+-track_live_clamps(uint64_t inst,
+-                struct vc4_validated_shader_info *validated_shader,
++track_live_clamps(struct vc4_validated_shader_info *validated_shader,
+                 struct vc4_shader_validation_state *validation_state)
+ {
++      uint64_t inst = validation_state->shader[validation_state->ip];
+       uint32_t op_add = QPU_GET_FIELD(inst, QPU_OP_ADD);
+       uint32_t waddr_add = QPU_GET_FIELD(inst, QPU_WADDR_ADD);
+       uint32_t waddr_mul = QPU_GET_FIELD(inst, QPU_WADDR_MUL);
+@@ -369,10 +377,10 @@ track_live_clamps(uint64_t inst,
+ }
+ static bool
+-check_instruction_writes(uint64_t inst,
+-                       struct vc4_validated_shader_info *validated_shader,
++check_instruction_writes(struct vc4_validated_shader_info *validated_shader,
+                        struct vc4_shader_validation_state *validation_state)
+ {
++      uint64_t inst = validation_state->shader[validation_state->ip];
+       uint32_t waddr_add = QPU_GET_FIELD(inst, QPU_WADDR_ADD);
+       uint32_t waddr_mul = QPU_GET_FIELD(inst, QPU_WADDR_MUL);
+       bool ok;
+@@ -382,12 +390,10 @@ check_instruction_writes(uint64_t inst,
+               return false;
+       }
+-      ok = (check_reg_write(inst, validated_shader, validation_state,
+-                            false) &&
+-            check_reg_write(inst, validated_shader, validation_state,
+-                            true));
++      ok = (check_reg_write(validated_shader, validation_state, false) &&
++            check_reg_write(validated_shader, validation_state, true));
+-      track_live_clamps(inst, validated_shader, validation_state);
++      track_live_clamps(validated_shader, validation_state);
+       return ok;
+ }
+@@ -417,30 +423,30 @@ vc4_validate_shader(struct drm_gem_cma_o
+ {
+       bool found_shader_end = false;
+       int shader_end_ip = 0;
+-      uint32_t ip, max_ip;
+-      uint64_t *shader;
++      uint32_t ip;
+       struct vc4_validated_shader_info *validated_shader;
+       struct vc4_shader_validation_state validation_state;
+       int i;
+       memset(&validation_state, 0, sizeof(validation_state));
++      validation_state.shader = shader_obj->vaddr;
++      validation_state.max_ip = shader_obj->base.size / sizeof(uint64_t);
+       for (i = 0; i < 8; i++)
+               validation_state.tmu_setup[i / 4].p_offset[i % 4] = ~0;
+       for (i = 0; i < ARRAY_SIZE(validation_state.live_min_clamp_offsets); i++)
+               validation_state.live_min_clamp_offsets[i] = ~0;
+-      shader = shader_obj->vaddr;
+-      max_ip = shader_obj->base.size / sizeof(uint64_t);
+-
+       validated_shader = kcalloc(1, sizeof(*validated_shader), GFP_KERNEL);
+       if (!validated_shader)
+               return NULL;
+-      for (ip = 0; ip < max_ip; ip++) {
+-              uint64_t inst = shader[ip];
++      for (ip = 0; ip < validation_state.max_ip; ip++) {
++              uint64_t inst = validation_state.shader[ip];
+               uint32_t sig = QPU_GET_FIELD(inst, QPU_SIG);
++              validation_state.ip = ip;
++
+               switch (sig) {
+               case QPU_SIG_NONE:
+               case QPU_SIG_WAIT_FOR_SCOREBOARD:
+@@ -450,7 +456,7 @@ vc4_validate_shader(struct drm_gem_cma_o
+               case QPU_SIG_LOAD_TMU1:
+               case QPU_SIG_PROG_END:
+               case QPU_SIG_SMALL_IMM:
+-                      if (!check_instruction_writes(inst, validated_shader,
++                      if (!check_instruction_writes(validated_shader,
+                                                     &validation_state)) {
+                               DRM_ERROR("Bad write at ip %d\n", ip);
+                               goto fail;
+@@ -467,7 +473,7 @@ vc4_validate_shader(struct drm_gem_cma_o
+                       break;
+               case QPU_SIG_LOAD_IMM:
+-                      if (!check_instruction_writes(inst, validated_shader,
++                      if (!check_instruction_writes(validated_shader,
+                                                     &validation_state)) {
+                               DRM_ERROR("Bad LOAD_IMM write at ip %d\n", ip);
+                               goto fail;
+@@ -487,7 +493,7 @@ vc4_validate_shader(struct drm_gem_cma_o
+                       break;
+       }
+-      if (ip == max_ip) {
++      if (ip == validation_state.max_ip) {
+               DRM_ERROR("shader failed to terminate before "
+                         "shader BO end at %zd\n",
+                         shader_obj->base.size);
diff --git a/target/linux/brcm2708/patches-4.4/0478-drm-vc4-Add-a-bitmap-of-branch-targets-during-shader.patch b/target/linux/brcm2708/patches-4.4/0478-drm-vc4-Add-a-bitmap-of-branch-targets-during-shader.patch
new file mode 100644 (file)
index 0000000..a8787ac
--- /dev/null
@@ -0,0 +1,200 @@
+From ba3aa9ce57cb933203cb0ebaa7c00ef756e5f84e Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Sat, 2 Jul 2016 10:10:24 -0700
+Subject: [PATCH] drm/vc4: Add a bitmap of branch targets during shader
+ validation.
+
+This isn't used yet, it's just a first step toward loop validation.
+During the main parsing of instructions, we need to know when we hit a
+new basic block so that we can reset validated state.
+
+v2: Fix a stray semicolon after an if block.  (caught by kbuild test).
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 93aa9ae3e5523e49e4e5abacd4dbee0e4ab2d931)
+---
+ drivers/gpu/drm/vc4/vc4_qpu_defines.h      |  12 +++
+ drivers/gpu/drm/vc4/vc4_validate_shaders.c | 114 ++++++++++++++++++++++++++++-
+ 2 files changed, 124 insertions(+), 2 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_qpu_defines.h
++++ b/drivers/gpu/drm/vc4/vc4_qpu_defines.h
+@@ -230,6 +230,15 @@ enum qpu_unpack_r4 {
+ #define QPU_COND_MUL_SHIFT              46
+ #define QPU_COND_MUL_MASK               QPU_MASK(48, 46)
++#define QPU_BRANCH_COND_SHIFT           52
++#define QPU_BRANCH_COND_MASK            QPU_MASK(55, 52)
++
++#define QPU_BRANCH_REL                  ((uint64_t)1 << 51)
++#define QPU_BRANCH_REG                  ((uint64_t)1 << 50)
++
++#define QPU_BRANCH_RADDR_A_SHIFT        45
++#define QPU_BRANCH_RADDR_A_MASK         QPU_MASK(49, 45)
++
+ #define QPU_SF                          ((uint64_t)1 << 45)
+ #define QPU_WADDR_ADD_SHIFT             38
+@@ -261,4 +270,7 @@ enum qpu_unpack_r4 {
+ #define QPU_OP_ADD_SHIFT                24
+ #define QPU_OP_ADD_MASK                 QPU_MASK(28, 24)
++#define QPU_BRANCH_TARGET_SHIFT         0
++#define QPU_BRANCH_TARGET_MASK          QPU_MASK(31, 0)
++
+ #endif /* VC4_QPU_DEFINES_H */
+--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
++++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+@@ -59,6 +59,13 @@ struct vc4_shader_validation_state {
+        */
+       uint32_t live_min_clamp_offsets[32 + 32 + 4];
+       bool live_max_clamp_regs[32 + 32 + 4];
++
++      /* Bitfield of which IPs are used as branch targets.
++       *
++       * Used for validation that the uniform stream is updated at the right
++       * points and clearing the texturing/clamping state.
++       */
++      unsigned long *branch_targets;
+ };
+ static uint32_t
+@@ -418,13 +425,104 @@ check_instruction_reads(uint64_t inst,
+       return true;
+ }
++/* Make sure that all branches are absolute and point within the shader, and
++ * note their targets for later.
++ */
++static bool
++vc4_validate_branches(struct vc4_shader_validation_state *validation_state)
++{
++      uint32_t max_branch_target = 0;
++      bool found_shader_end = false;
++      int ip;
++      int shader_end_ip = 0;
++      int last_branch = -2;
++
++      for (ip = 0; ip < validation_state->max_ip; ip++) {
++              uint64_t inst = validation_state->shader[ip];
++              int32_t branch_imm = QPU_GET_FIELD(inst, QPU_BRANCH_TARGET);
++              uint32_t sig = QPU_GET_FIELD(inst, QPU_SIG);
++              uint32_t after_delay_ip = ip + 4;
++              uint32_t branch_target_ip;
++
++              if (sig == QPU_SIG_PROG_END) {
++                      shader_end_ip = ip;
++                      found_shader_end = true;
++                      continue;
++              }
++
++              if (sig != QPU_SIG_BRANCH)
++                      continue;
++
++              if (ip - last_branch < 4) {
++                      DRM_ERROR("Branch at %d during delay slots\n", ip);
++                      return false;
++              }
++              last_branch = ip;
++
++              if (inst & QPU_BRANCH_REG) {
++                      DRM_ERROR("branching from register relative "
++                                "not supported\n");
++                      return false;
++              }
++
++              if (!(inst & QPU_BRANCH_REL)) {
++                      DRM_ERROR("relative branching required\n");
++                      return false;
++              }
++
++              /* The actual branch target is the instruction after the delay
++               * slots, plus whatever byte offset is in the low 32 bits of
++               * the instruction.  Make sure we're not branching beyond the
++               * end of the shader object.
++               */
++              if (branch_imm % sizeof(inst) != 0) {
++                      DRM_ERROR("branch target not aligned\n");
++                      return false;
++              }
++
++              branch_target_ip = after_delay_ip + (branch_imm >> 3);
++              if (branch_target_ip >= validation_state->max_ip) {
++                      DRM_ERROR("Branch at %d outside of shader (ip %d/%d)\n",
++                                ip, branch_target_ip,
++                                validation_state->max_ip);
++                      return false;
++              }
++              set_bit(branch_target_ip, validation_state->branch_targets);
++
++              /* Make sure that the non-branching path is also not outside
++               * the shader.
++               */
++              if (after_delay_ip >= validation_state->max_ip) {
++                      DRM_ERROR("Branch at %d continues past shader end "
++                                "(%d/%d)\n",
++                                ip, after_delay_ip, validation_state->max_ip);
++                      return false;
++              }
++              set_bit(after_delay_ip, validation_state->branch_targets);
++              max_branch_target = max(max_branch_target, after_delay_ip);
++
++              /* There are two delay slots after program end is signaled
++               * that are still executed, then we're finished.
++               */
++              if (found_shader_end && ip == shader_end_ip + 2)
++                      break;
++      }
++
++      if (max_branch_target > shader_end_ip) {
++              DRM_ERROR("Branch landed after QPU_SIG_PROG_END");
++              return false;
++      }
++
++      return true;
++}
++
+ struct vc4_validated_shader_info *
+ vc4_validate_shader(struct drm_gem_cma_object *shader_obj)
+ {
+       bool found_shader_end = false;
+       int shader_end_ip = 0;
+       uint32_t ip;
+-      struct vc4_validated_shader_info *validated_shader;
++      struct vc4_validated_shader_info *validated_shader = NULL;
+       struct vc4_shader_validation_state validation_state;
+       int i;
+@@ -437,9 +535,18 @@ vc4_validate_shader(struct drm_gem_cma_o
+       for (i = 0; i < ARRAY_SIZE(validation_state.live_min_clamp_offsets); i++)
+               validation_state.live_min_clamp_offsets[i] = ~0;
++      validation_state.branch_targets =
++              kcalloc(BITS_TO_LONGS(validation_state.max_ip),
++                      sizeof(unsigned long), GFP_KERNEL);
++      if (!validation_state.branch_targets)
++              goto fail;
++
+       validated_shader = kcalloc(1, sizeof(*validated_shader), GFP_KERNEL);
+       if (!validated_shader)
+-              return NULL;
++              goto fail;
++
++      if (!vc4_validate_branches(&validation_state))
++              goto fail;
+       for (ip = 0; ip < validation_state.max_ip; ip++) {
+               uint64_t inst = validation_state.shader[ip];
+@@ -508,9 +615,12 @@ vc4_validate_shader(struct drm_gem_cma_o
+               (validated_shader->uniforms_size +
+                4 * validated_shader->num_texture_samples);
++      kfree(validation_state.branch_targets);
++
+       return validated_shader;
+ fail:
++      kfree(validation_state.branch_targets);
+       if (validated_shader) {
+               kfree(validated_shader->texture_samples);
+               kfree(validated_shader);
diff --git a/target/linux/brcm2708/patches-4.4/0479-drm-vc4-Add-support-for-branching-in-shader-validati.patch b/target/linux/brcm2708/patches-4.4/0479-drm-vc4-Add-support-for-branching-in-shader-validati.patch
new file mode 100644 (file)
index 0000000..eb78dba
--- /dev/null
@@ -0,0 +1,475 @@
+From f9cd25fae900b1251e14ec894849846e0a2a7cb3 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Sat, 2 Jul 2016 12:17:10 -0700
+Subject: [PATCH] drm/vc4: Add support for branching in shader validation.
+
+We're already checking that branch instructions are between the start
+of the shader and the proper PROG_END sequence.  The other thing we
+need to make branching safe is to verify that the shader doesn't read
+past the end of the uniforms stream.
+
+To do that, we require that at any basic block reading uniforms have
+the following instructions:
+
+load_imm temp, <next offset within uniform stream>
+add unif_addr, temp, unif
+
+The instructions are generated by userspace, and the kernel verifies
+that the load_imm is of the expected offset, and that the add adds it
+to a uniform.  We track which uniform in the stream that is, and at
+draw call time fix up the uniform stream to have the address of the
+start of the shader's uniforms at that location.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 6d45c81d229d71da54d374143e7d6abad4c0cf31)
+---
+ drivers/gpu/drm/vc4/vc4_drv.h              |   3 +
+ drivers/gpu/drm/vc4/vc4_qpu_defines.h      |   3 +
+ drivers/gpu/drm/vc4/vc4_validate.c         |  13 +-
+ drivers/gpu/drm/vc4/vc4_validate_shaders.c | 281 +++++++++++++++++++++++++++--
+ 4 files changed, 283 insertions(+), 17 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -363,6 +363,9 @@ struct vc4_validated_shader_info {
+       uint32_t uniforms_src_size;
+       uint32_t num_texture_samples;
+       struct vc4_texture_sample_info *texture_samples;
++
++      uint32_t num_uniform_addr_offsets;
++      uint32_t *uniform_addr_offsets;
+ };
+ /**
+--- a/drivers/gpu/drm/vc4/vc4_qpu_defines.h
++++ b/drivers/gpu/drm/vc4/vc4_qpu_defines.h
+@@ -270,6 +270,9 @@ enum qpu_unpack_r4 {
+ #define QPU_OP_ADD_SHIFT                24
+ #define QPU_OP_ADD_MASK                 QPU_MASK(28, 24)
++#define QPU_LOAD_IMM_SHIFT              0
++#define QPU_LOAD_IMM_MASK               QPU_MASK(31, 0)
++
+ #define QPU_BRANCH_TARGET_SHIFT         0
+ #define QPU_BRANCH_TARGET_MASK          QPU_MASK(31, 0)
+--- a/drivers/gpu/drm/vc4/vc4_validate.c
++++ b/drivers/gpu/drm/vc4/vc4_validate.c
+@@ -802,7 +802,7 @@ validate_gl_shader_rec(struct drm_device
+               uint32_t src_offset = *(uint32_t *)(pkt_u + o);
+               uint32_t *texture_handles_u;
+               void *uniform_data_u;
+-              uint32_t tex;
++              uint32_t tex, uni;
+               *(uint32_t *)(pkt_v + o) = bo[i]->paddr + src_offset;
+@@ -840,6 +840,17 @@ validate_gl_shader_rec(struct drm_device
+                       }
+               }
++              /* Fill in the uniform slots that need this shader's
++               * start-of-uniforms address (used for resetting the uniform
++               * stream in the presence of control flow).
++               */
++              for (uni = 0;
++                   uni < validated_shader->num_uniform_addr_offsets;
++                   uni++) {
++                      uint32_t o = validated_shader->uniform_addr_offsets[uni];
++                      ((uint32_t *)exec->uniforms_v)[o] = exec->uniforms_p;
++              }
++
+               *(uint32_t *)(pkt_v + o + 4) = exec->uniforms_p;
+               exec->uniforms_u += validated_shader->uniforms_src_size;
+--- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c
++++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c
+@@ -39,6 +39,8 @@
+ #include "vc4_drv.h"
+ #include "vc4_qpu_defines.h"
++#define LIVE_REG_COUNT (32 + 32 + 4)
++
+ struct vc4_shader_validation_state {
+       /* Current IP being validated. */
+       uint32_t ip;
+@@ -57,8 +59,9 @@ struct vc4_shader_validation_state {
+        *
+        * This is used for the validation of direct address memory reads.
+        */
+-      uint32_t live_min_clamp_offsets[32 + 32 + 4];
+-      bool live_max_clamp_regs[32 + 32 + 4];
++      uint32_t live_min_clamp_offsets[LIVE_REG_COUNT];
++      bool live_max_clamp_regs[LIVE_REG_COUNT];
++      uint32_t live_immediates[LIVE_REG_COUNT];
+       /* Bitfield of which IPs are used as branch targets.
+        *
+@@ -66,6 +69,20 @@ struct vc4_shader_validation_state {
+        * points and clearing the texturing/clamping state.
+        */
+       unsigned long *branch_targets;
++
++      /* Set when entering a basic block, and cleared when the uniform
++       * address update is found.  This is used to make sure that we don't
++       * read uniforms when the address is undefined.
++       */
++      bool needs_uniform_address_update;
++
++      /* Set when we find a backwards branch.  If the branch is backwards,
++       * the taraget is probably doing an address reset to read uniforms,
++       * and so we need to be sure that a uniforms address is present in the
++       * stream, even if the shader didn't need to read uniforms in later
++       * basic blocks.
++       */
++      bool needs_uniform_address_for_loop;
+ };
+ static uint32_t
+@@ -227,8 +244,14 @@ check_tmu_write(struct vc4_validated_sha
+       /* Since direct uses a RADDR uniform reference, it will get counted in
+        * check_instruction_reads()
+        */
+-      if (!is_direct)
++      if (!is_direct) {
++              if (validation_state->needs_uniform_address_update) {
++                      DRM_ERROR("Texturing with undefined uniform address\n");
++                      return false;
++              }
++
+               validated_shader->uniforms_size += 4;
++      }
+       if (submit) {
+               if (!record_texture_sample(validated_shader,
+@@ -242,6 +265,98 @@ check_tmu_write(struct vc4_validated_sha
+       return true;
+ }
++static bool require_uniform_address_uniform(struct vc4_validated_shader_info *validated_shader)
++{
++      uint32_t o = validated_shader->num_uniform_addr_offsets;
++      uint32_t num_uniforms = validated_shader->uniforms_size / 4;
++
++      validated_shader->uniform_addr_offsets =
++              krealloc(validated_shader->uniform_addr_offsets,
++                       (o + 1) *
++                       sizeof(*validated_shader->uniform_addr_offsets),
++                       GFP_KERNEL);
++      if (!validated_shader->uniform_addr_offsets)
++              return false;
++
++      validated_shader->uniform_addr_offsets[o] = num_uniforms;
++      validated_shader->num_uniform_addr_offsets++;
++
++      return true;
++}
++
++static bool
++validate_uniform_address_write(struct vc4_validated_shader_info *validated_shader,
++                             struct vc4_shader_validation_state *validation_state,
++                             bool is_mul)
++{
++      uint64_t inst = validation_state->shader[validation_state->ip];
++      u32 add_b = QPU_GET_FIELD(inst, QPU_ADD_B);
++      u32 raddr_a = QPU_GET_FIELD(inst, QPU_RADDR_A);
++      u32 raddr_b = QPU_GET_FIELD(inst, QPU_RADDR_B);
++      u32 add_lri = raddr_add_a_to_live_reg_index(inst);
++      /* We want our reset to be pointing at whatever uniform follows the
++       * uniforms base address.
++       */
++      u32 expected_offset = validated_shader->uniforms_size + 4;
++
++      /* We only support absolute uniform address changes, and we
++       * require that they be in the current basic block before any
++       * of its uniform reads.
++       *
++       * One could potentially emit more efficient QPU code, by
++       * noticing that (say) an if statement does uniform control
++       * flow for all threads and that the if reads the same number
++       * of uniforms on each side.  However, this scheme is easy to
++       * validate so it's all we allow for now.
++       */
++
++      if (QPU_GET_FIELD(inst, QPU_SIG) != QPU_SIG_NONE) {
++              DRM_ERROR("uniforms address change must be "
++                        "normal math\n");
++              return false;
++      }
++
++      if (is_mul || QPU_GET_FIELD(inst, QPU_OP_ADD) != QPU_A_ADD) {
++              DRM_ERROR("Uniform address reset must be an ADD.\n");
++              return false;
++      }
++
++      if (QPU_GET_FIELD(inst, QPU_COND_ADD) != QPU_COND_ALWAYS) {
++              DRM_ERROR("Uniform address reset must be unconditional.\n");
++              return false;
++      }
++
++      if (QPU_GET_FIELD(inst, QPU_PACK) != QPU_PACK_A_NOP &&
++          !(inst & QPU_PM)) {
++              DRM_ERROR("No packing allowed on uniforms reset\n");
++              return false;
++      }
++
++      if (add_lri == -1) {
++              DRM_ERROR("First argument of uniform address write must be "
++                        "an immediate value.\n");
++              return false;
++      }
++
++      if (validation_state->live_immediates[add_lri] != expected_offset) {
++              DRM_ERROR("Resetting uniforms with offset %db instead of %db\n",
++                        validation_state->live_immediates[add_lri],
++                        expected_offset);
++              return false;
++      }
++
++      if (!(add_b == QPU_MUX_A && raddr_a == QPU_R_UNIF) &&
++          !(add_b == QPU_MUX_B && raddr_b == QPU_R_UNIF)) {
++              DRM_ERROR("Second argument of uniform address write must be "
++                        "a uniform.\n");
++              return false;
++      }
++
++      validation_state->needs_uniform_address_update = false;
++      validation_state->needs_uniform_address_for_loop = false;
++      return require_uniform_address_uniform(validated_shader);
++}
++
+ static bool
+ check_reg_write(struct vc4_validated_shader_info *validated_shader,
+               struct vc4_shader_validation_state *validation_state,
+@@ -251,14 +366,37 @@ check_reg_write(struct vc4_validated_sha
+       uint32_t waddr = (is_mul ?
+                         QPU_GET_FIELD(inst, QPU_WADDR_MUL) :
+                         QPU_GET_FIELD(inst, QPU_WADDR_ADD));
++      uint32_t sig = QPU_GET_FIELD(inst, QPU_SIG);
++      bool ws = inst & QPU_WS;
++      bool is_b = is_mul ^ ws;
++      u32 lri = waddr_to_live_reg_index(waddr, is_b);
++
++      if (lri != -1) {
++              uint32_t cond_add = QPU_GET_FIELD(inst, QPU_COND_ADD);
++              uint32_t cond_mul = QPU_GET_FIELD(inst, QPU_COND_MUL);
++
++              if (sig == QPU_SIG_LOAD_IMM &&
++                  QPU_GET_FIELD(inst, QPU_PACK) == QPU_PACK_A_NOP &&
++                  ((is_mul && cond_mul == QPU_COND_ALWAYS) ||
++                   (!is_mul && cond_add == QPU_COND_ALWAYS))) {
++                      validation_state->live_immediates[lri] =
++                              QPU_GET_FIELD(inst, QPU_LOAD_IMM);
++              } else {
++                      validation_state->live_immediates[lri] = ~0;
++              }
++      }
+       switch (waddr) {
+       case QPU_W_UNIFORMS_ADDRESS:
+-              /* XXX: We'll probably need to support this for reladdr, but
+-               * it's definitely a security-related one.
+-               */
+-              DRM_ERROR("uniforms address load unsupported\n");
+-              return false;
++              if (is_b) {
++                      DRM_ERROR("relative uniforms address change "
++                                "unsupported\n");
++                      return false;
++              }
++
++              return validate_uniform_address_write(validated_shader,
++                                                    validation_state,
++                                                    is_mul);
+       case QPU_W_TLB_COLOR_MS:
+       case QPU_W_TLB_COLOR_ALL:
+@@ -406,9 +544,35 @@ check_instruction_writes(struct vc4_vali
+ }
+ static bool
+-check_instruction_reads(uint64_t inst,
+-                      struct vc4_validated_shader_info *validated_shader)
++check_branch(uint64_t inst,
++           struct vc4_validated_shader_info *validated_shader,
++           struct vc4_shader_validation_state *validation_state,
++           int ip)
+ {
++      int32_t branch_imm = QPU_GET_FIELD(inst, QPU_BRANCH_TARGET);
++      uint32_t waddr_add = QPU_GET_FIELD(inst, QPU_WADDR_ADD);
++      uint32_t waddr_mul = QPU_GET_FIELD(inst, QPU_WADDR_MUL);
++
++      if ((int)branch_imm < 0)
++              validation_state->needs_uniform_address_for_loop = true;
++
++      /* We don't want to have to worry about validation of this, and
++       * there's no need for it.
++       */
++      if (waddr_add != QPU_W_NOP || waddr_mul != QPU_W_NOP) {
++              DRM_ERROR("branch instruction at %d wrote a register.\n",
++                        validation_state->ip);
++              return false;
++      }
++
++      return true;
++}
++
++static bool
++check_instruction_reads(struct vc4_validated_shader_info *validated_shader,
++                      struct vc4_shader_validation_state *validation_state)
++{
++      uint64_t inst = validation_state->shader[validation_state->ip];
+       uint32_t raddr_a = QPU_GET_FIELD(inst, QPU_RADDR_A);
+       uint32_t raddr_b = QPU_GET_FIELD(inst, QPU_RADDR_B);
+       uint32_t sig = QPU_GET_FIELD(inst, QPU_SIG);
+@@ -420,6 +584,12 @@ check_instruction_reads(uint64_t inst,
+                * already be OOM.
+                */
+               validated_shader->uniforms_size += 4;
++
++              if (validation_state->needs_uniform_address_update) {
++                      DRM_ERROR("Uniform read with undefined uniform "
++                                "address\n");
++                      return false;
++              }
+       }
+       return true;
+@@ -516,6 +686,65 @@ vc4_validate_branches(struct vc4_shader_
+       return true;
+ }
++/* Resets any known state for the shader, used when we may be branched to from
++ * multiple locations in the program (or at shader start).
++ */
++static void
++reset_validation_state(struct vc4_shader_validation_state *validation_state)
++{
++      int i;
++
++      for (i = 0; i < 8; i++)
++              validation_state->tmu_setup[i / 4].p_offset[i % 4] = ~0;
++
++      for (i = 0; i < LIVE_REG_COUNT; i++) {
++              validation_state->live_min_clamp_offsets[i] = ~0;
++              validation_state->live_max_clamp_regs[i] = false;
++              validation_state->live_immediates[i] = ~0;
++      }
++}
++
++static bool
++texturing_in_progress(struct vc4_shader_validation_state *validation_state)
++{
++      return (validation_state->tmu_write_count[0] != 0 ||
++              validation_state->tmu_write_count[1] != 0);
++}
++
++static bool
++vc4_handle_branch_target(struct vc4_shader_validation_state *validation_state)
++{
++      uint32_t ip = validation_state->ip;
++
++      if (!test_bit(ip, validation_state->branch_targets))
++              return true;
++
++      if (texturing_in_progress(validation_state)) {
++              DRM_ERROR("Branch target landed during TMU setup\n");
++              return false;
++      }
++
++      /* Reset our live values tracking, since this instruction may have
++       * multiple predecessors.
++       *
++       * One could potentially do analysis to determine that, for
++       * example, all predecessors have a live max clamp in the same
++       * register, but we don't bother with that.
++       */
++      reset_validation_state(validation_state);
++
++      /* Since we've entered a basic block from potentially multiple
++       * predecessors, we need the uniforms address to be updated before any
++       * unforms are read.  We require that after any branch point, the next
++       * uniform to be loaded is a uniform address offset.  That uniform's
++       * offset will be marked by the uniform address register write
++       * validation, or a one-off the end-of-program check.
++       */
++      validation_state->needs_uniform_address_update = true;
++
++      return true;
++}
++
+ struct vc4_validated_shader_info *
+ vc4_validate_shader(struct drm_gem_cma_object *shader_obj)
+ {
+@@ -524,16 +753,12 @@ vc4_validate_shader(struct drm_gem_cma_o
+       uint32_t ip;
+       struct vc4_validated_shader_info *validated_shader = NULL;
+       struct vc4_shader_validation_state validation_state;
+-      int i;
+       memset(&validation_state, 0, sizeof(validation_state));
+       validation_state.shader = shader_obj->vaddr;
+       validation_state.max_ip = shader_obj->base.size / sizeof(uint64_t);
+-      for (i = 0; i < 8; i++)
+-              validation_state.tmu_setup[i / 4].p_offset[i % 4] = ~0;
+-      for (i = 0; i < ARRAY_SIZE(validation_state.live_min_clamp_offsets); i++)
+-              validation_state.live_min_clamp_offsets[i] = ~0;
++      reset_validation_state(&validation_state);
+       validation_state.branch_targets =
+               kcalloc(BITS_TO_LONGS(validation_state.max_ip),
+@@ -554,6 +779,9 @@ vc4_validate_shader(struct drm_gem_cma_o
+               validation_state.ip = ip;
++              if (!vc4_handle_branch_target(&validation_state))
++                      goto fail;
++
+               switch (sig) {
+               case QPU_SIG_NONE:
+               case QPU_SIG_WAIT_FOR_SCOREBOARD:
+@@ -569,7 +797,8 @@ vc4_validate_shader(struct drm_gem_cma_o
+                               goto fail;
+                       }
+-                      if (!check_instruction_reads(inst, validated_shader))
++                      if (!check_instruction_reads(validated_shader,
++                                                   &validation_state))
+                               goto fail;
+                       if (sig == QPU_SIG_PROG_END) {
+@@ -587,6 +816,11 @@ vc4_validate_shader(struct drm_gem_cma_o
+                       }
+                       break;
++              case QPU_SIG_BRANCH:
++                      if (!check_branch(inst, validated_shader,
++                                        &validation_state, ip))
++                              goto fail;
++                      break;
+               default:
+                       DRM_ERROR("Unsupported QPU signal %d at "
+                                 "instruction %d\n", sig, ip);
+@@ -607,6 +841,21 @@ vc4_validate_shader(struct drm_gem_cma_o
+               goto fail;
+       }
++      /* If we did a backwards branch and we haven't emitted a uniforms
++       * reset since then, we still need the uniforms stream to have the
++       * uniforms address available so that the backwards branch can do its
++       * uniforms reset.
++       *
++       * We could potentially prove that the backwards branch doesn't
++       * contain any uses of uniforms until program exit, but that doesn't
++       * seem to be worth the trouble.
++       */
++      if (validation_state.needs_uniform_address_for_loop) {
++              if (!require_uniform_address_uniform(validated_shader))
++                      goto fail;
++              validated_shader->uniforms_size += 4;
++      }
++
+       /* Again, no chance of integer overflow here because the worst case
+        * scenario is 8 bytes of uniforms plus handles per 8-byte
+        * instruction.
diff --git a/target/linux/brcm2708/patches-4.4/0480-drm-vc4-Add-a-getparam-to-signal-support-for-branche.patch b/target/linux/brcm2708/patches-4.4/0480-drm-vc4-Add-a-getparam-to-signal-support-for-branche.patch
new file mode 100644 (file)
index 0000000..63c0445
--- /dev/null
@@ -0,0 +1,38 @@
+From f6b1410aedc0c8d04363a930fd70509e30e23eeb Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Sat, 2 Jul 2016 14:14:27 -0700
+Subject: [PATCH] drm/vc4: Add a getparam to signal support for branches.
+
+Userspace needs to know if it can create shaders that do branching.
+Otherwise, for backwards compatibility with old kernels it needs to
+lower if statements to conditional assignments.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+(cherry picked from commit 7363cee5b467c31dc3af2ac98df0634bb8bbc668)
+---
+ drivers/gpu/drm/vc4/vc4_drv.c | 3 +++
+ include/uapi/drm/vc4_drm.h    | 1 +
+ 2 files changed, 4 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.c
++++ b/drivers/gpu/drm/vc4/vc4_drv.c
+@@ -97,6 +97,9 @@ static int vc4_get_param_ioctl(struct dr
+               args->value = V3D_READ(V3D_IDENT2);
+               pm_runtime_put(&vc4->v3d->pdev->dev);
+               break;
++      case DRM_VC4_PARAM_SUPPORTS_BRANCHES:
++              args->value = true;
++              break;
+       default:
+               DRM_DEBUG("Unknown parameter %d\n", args->param);
+               return -EINVAL;
+--- a/include/uapi/drm/vc4_drm.h
++++ b/include/uapi/drm/vc4_drm.h
+@@ -285,6 +285,7 @@ struct drm_vc4_get_hang_state {
+ #define DRM_VC4_PARAM_V3D_IDENT0              0
+ #define DRM_VC4_PARAM_V3D_IDENT1              1
+ #define DRM_VC4_PARAM_V3D_IDENT2              2
++#define DRM_VC4_PARAM_SUPPORTS_BRANCHES               3
+ struct drm_vc4_get_param {
+       __u32 param;
diff --git a/target/linux/brcm2708/patches-4.4/0481-drm-vc4-Don-t-force-new-binner-overflow-allocation-p.patch b/target/linux/brcm2708/patches-4.4/0481-drm-vc4-Don-t-force-new-binner-overflow-allocation-p.patch
new file mode 100644 (file)
index 0000000..716961e
--- /dev/null
@@ -0,0 +1,28 @@
+From 033049599046df7c51b605b24224bbce6d60c762 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 2 Aug 2016 17:17:52 -0700
+Subject: [PATCH] drm/vc4: Don't force new binner overflow allocation per draw.
+
+This came from the initial bringup code, which always idled the GPU
+and always reset the overflow.  That massively increases the size of
+the working set when you're doing lots of small draws, though, as is
+common on X desktops or piglit.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -435,10 +435,6 @@ again:
+       vc4_flush_caches(dev);
+-      /* Disable the binner's pre-loaded overflow memory address */
+-      V3D_WRITE(V3D_BPOA, 0);
+-      V3D_WRITE(V3D_BPOS, 0);
+-
+       /* Either put the job in the binner if it uses the binner, or
+        * immediately move it to the to-be-rendered queue.
+        */
diff --git a/target/linux/brcm2708/patches-4.4/0482-drm-vc4-Use-drm_free_large-on-handles-to-match-its-a.patch b/target/linux/brcm2708/patches-4.4/0482-drm-vc4-Use-drm_free_large-on-handles-to-match-its-a.patch
new file mode 100644 (file)
index 0000000..2975c9b
--- /dev/null
@@ -0,0 +1,27 @@
+From 60db7ffd6d4ace445eb56659c6e700ee9494b846 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Tue, 19 Jul 2016 11:31:19 -0700
+Subject: [PATCH] drm/vc4: Use drm_free_large() on handles to match its
+ allocation.
+
+If you managed to exceed the limit to switch to vmalloc, we'd use the
+wrong free.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.")
+Cc: stable@vger.kernel.org
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -584,7 +584,7 @@ vc4_cl_lookup_bos(struct drm_device *dev
+       spin_unlock(&file_priv->table_lock);
+ fail:
+-      kfree(handles);
++      drm_free_large(handles);
+       return 0;
+ }
diff --git a/target/linux/brcm2708/patches-4.4/0483-drm-vc4-Fix-oops-when-userspace-hands-in-a-bad-BO.patch b/target/linux/brcm2708/patches-4.4/0483-drm-vc4-Fix-oops-when-userspace-hands-in-a-bad-BO.patch
new file mode 100644 (file)
index 0000000..00b1511
--- /dev/null
@@ -0,0 +1,26 @@
+From 6d3d23c57b33d76f0b4f01221593182c0de34ef4 Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Mon, 25 Jul 2016 16:10:04 -0700
+Subject: [PATCH] drm/vc4: Fix oops when userspace hands in a bad BO.
+
+We'd end up NULL pointer dereferencing because we didn't take the
+error path out in the parent.  Fixes igt vc4_lookup_fail test.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.")
+Cc: stable@vger.kernel.org
+---
+ drivers/gpu/drm/vc4/vc4_gem.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_gem.c
++++ b/drivers/gpu/drm/vc4/vc4_gem.c
+@@ -585,7 +585,7 @@ vc4_cl_lookup_bos(struct drm_device *dev
+ fail:
+       drm_free_large(handles);
+-      return 0;
++      return ret;
+ }
+ static int
diff --git a/target/linux/brcm2708/patches-4.4/0484-drm-vc4-Fix-overflow-mem-unreferencing-when-the-binn.patch b/target/linux/brcm2708/patches-4.4/0484-drm-vc4-Fix-overflow-mem-unreferencing-when-the-binn.patch
new file mode 100644 (file)
index 0000000..c136742
--- /dev/null
@@ -0,0 +1,57 @@
+From 379b5d818939dc58742278f744b60241a577568d Mon Sep 17 00:00:00 2001
+From: Eric Anholt <eric@anholt.net>
+Date: Thu, 21 Jul 2016 13:39:11 -0700
+Subject: [PATCH] drm/vc4: Fix overflow mem unreferencing when the binner runs
+ dry.
+
+Overflow memory handling is tricky: While it's still referenced by the
+BPO registers, we want to keep it from being freed.  When we are
+putting a new set of overflow memory in the registers, we need to
+assign the old one to the last rendering job using it.
+
+We were looking at "what's currently running in the binner", but since
+the bin/render submission split, we may end up with the binner
+completing and having no new job while the renderer is still
+processing.  So, if we don't find a bin job at all, look at the
+highest-seqno (last) render job to attach our overflow to.
+
+Signed-off-by: Eric Anholt <eric@anholt.net>
+Fixes: ca26d28bbaa3 ("drm/vc4: improve throughput by pipelining binning and rendering jobs")
+Cc: stable@vger.kernel.org
+---
+ drivers/gpu/drm/vc4/vc4_drv.h | 9 +++++++++
+ drivers/gpu/drm/vc4/vc4_irq.c | 4 +++-
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/vc4/vc4_drv.h
++++ b/drivers/gpu/drm/vc4/vc4_drv.h
+@@ -329,6 +329,15 @@ vc4_first_render_job(struct vc4_dev *vc4
+                               struct vc4_exec_info, head);
+ }
++static inline struct vc4_exec_info *
++vc4_last_render_job(struct vc4_dev *vc4)
++{
++      if (list_empty(&vc4->render_job_list))
++              return NULL;
++      return list_last_entry(&vc4->render_job_list,
++                             struct vc4_exec_info, head);
++}
++
+ /**
+  * struct vc4_texture_sample_info - saves the offsets into the UBO for texture
+  * setup parameters.
+--- a/drivers/gpu/drm/vc4/vc4_irq.c
++++ b/drivers/gpu/drm/vc4/vc4_irq.c
+@@ -83,8 +83,10 @@ vc4_overflow_mem_work(struct work_struct
+               spin_lock_irqsave(&vc4->job_lock, irqflags);
+               current_exec = vc4_first_bin_job(vc4);
++              if (!current_exec)
++                      current_exec = vc4_last_render_job(vc4);
+               if (current_exec) {
+-                      vc4->overflow_mem->seqno = vc4->finished_seqno + 1;
++                      vc4->overflow_mem->seqno = current_exec->seqno;
+                       list_add_tail(&vc4->overflow_mem->unref_head,
+                                     &current_exec->unref_list);
+                       vc4->overflow_mem = NULL;
diff --git a/target/linux/brcm2708/patches-4.4/0485-config-Enable-SERIAL_SC16IS7XX_SPI.patch b/target/linux/brcm2708/patches-4.4/0485-config-Enable-SERIAL_SC16IS7XX_SPI.patch
new file mode 100644 (file)
index 0000000..c780c9a
--- /dev/null
@@ -0,0 +1,33 @@
+From 6032b4e7060993a3a32b2e2a26c62ce0dd79a7fb Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Thu, 18 Aug 2016 17:36:39 +0100
+Subject: [PATCH] config: Enable SERIAL_SC16IS7XX_SPI
+
+Previously only the I2C mode was supported.
+
+See: https://github.com/raspberrypi/linux/issues/1594
+---
+ 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
+@@ -601,6 +601,7 @@ CONFIG_SERIAL_AMBA_PL011=y
+ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+ CONFIG_SERIAL_OF_PLATFORM=y
+ CONFIG_SERIAL_SC16IS7XX=m
++CONFIG_SERIAL_SC16IS7XX_SPI=y
+ CONFIG_TTY_PRINTK=y
+ CONFIG_HW_RANDOM=y
+ CONFIG_RAW_DRIVER=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -594,6 +594,7 @@ CONFIG_SERIAL_AMBA_PL011=y
+ CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+ CONFIG_SERIAL_OF_PLATFORM=y
+ CONFIG_SERIAL_SC16IS7XX=m
++CONFIG_SERIAL_SC16IS7XX_SPI=y
+ CONFIG_TTY_PRINTK=y
+ CONFIG_HW_RANDOM=y
+ CONFIG_RAW_DRIVER=y
diff --git a/target/linux/brcm2708/patches-4.4/0486-Overlay-for-Microchip-MCP23S08-17-SPI-gpio-expanders.patch b/target/linux/brcm2708/patches-4.4/0486-Overlay-for-Microchip-MCP23S08-17-SPI-gpio-expanders.patch
new file mode 100644 (file)
index 0000000..cd54783
--- /dev/null
@@ -0,0 +1,791 @@
+From bd7c2eac2ada8f60058768b00935cdfe010720a5 Mon Sep 17 00:00:00 2001
+From: wavelet2 <a3d35232@btinternet.com>
+Date: Fri, 19 Aug 2016 09:32:53 +0100
+Subject: [PATCH] Overlay for Microchip MCP23S08/17 SPI gpio expanders  (#1566)
+
+Added Overlay for Microchip MCP23S08/17 SPI gpio expanders
+---
+ arch/arm/boot/dts/overlays/Makefile             |   1 +
+ arch/arm/boot/dts/overlays/README               |  24 +
+ arch/arm/boot/dts/overlays/mcp23s17-overlay.dts | 732 ++++++++++++++++++++++++
+ 3 files changed, 757 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/mcp23s17-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -49,6 +49,7 @@ dtbo-$(RPI_DT_OVERLAYS) += justboom-dac.
+ dtbo-$(RPI_DT_OVERLAYS) += justboom-digi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += lirc-rpi.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp23017.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += mcp23s17.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can0.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mcp2515-can1.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += mmc.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -628,6 +628,30 @@ Params: gpiopin                 Gpio pin
+         addr                    I2C address of the MCP23017 (default: 0x20)
++Name:   mcp23s17
++Info:   Configures the MCP23S08/17 SPI GPIO expanders.
++        If devices are present on SPI1 or SPI2, those interfaces must be enabled
++        with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
++        If interrupts are enabled for a device on a given CS# on a SPI bus, that
++        device must be the only one present on that SPI bus/CS#.
++Load:   dtoverlay=mcp23s17,<param>=<val>
++Params: s08-spi<n>-<m>-present  4-bit integer, bitmap indicating MCP23S08
++                                devices present on SPI<n>, CS#<m>
++
++        s17-spi<n>-<m>-present  8-bit integer, bitmap indicating MCP23S17
++                                devices present on SPI<n>, CS#<m>
++
++        s08-spi<n>-<m>-int-gpio integer, enables interrupts on a single
++                                MCP23S08 device on SPI<n>, CS#<m>, specifies
++                                the GPIO pin to which INT output of MCP23S08
++                                is connected.
++
++        s17-spi<n>-<m>-int-gpio integer, enables mirrored interrupts on a
++                                single MCP23S17 device on SPI<n>, CS#<m>,
++                                specifies the GPIO pin to which either INTA
++                                or INTB output of MCP23S17 is connected.
++
++
+ Name:   mcp2515-can0
+ Info:   Configures the MCP2515 CAN controller on spi0.0
+ Load:   dtoverlay=mcp2515-can0,<param>=<val>
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts
+@@ -0,0 +1,732 @@
++// Overlay for MCP23S08/17 GPIO Extenders from Microchip Semiconductor
++
++// dtparams:
++//     s08-spi<n>-<m>-present  - 4-bit integer, bitmap indicating MCP23S08 devices present on SPI<n>, CS#<m>.
++//     s17-spi<n>-<m>-present  - 8-bit integer, bitmap indicating MCP23S17 devices present on SPI<n>, CS#<m>.
++//     s08-spi<n>-<m>-int-gpio - integer, enables interrupts on a single MCP23S08 device on SPI<n>, CS#<m>, specifies the GPIO pin to which INT output is connected.
++//     s17-spi<n>-<m>-int-gpio - integer, enables mirrored interrupts on a single MCP23S17 device on SPI<n>, CS#<m>, specifies the GPIO pin to which either INTA or INTB output is connected.
++//
++// If devices are present on SPI1 or SPI2, those interfaces must be enabled with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays.
++// If interrupts are enabled for a device on a given CS# on a SPI bus, that device must be the only one present on that SPI bus/CS#.
++//
++// Example 1: A single MCP23S17 device on SPI0, CS#0 with its SPI addr set to 0 and INTA output connected to GPIO25:
++// dtoverlay=mcp23s17:s17-spi0-0-present=1,s17-spi0-0-int-gpio=25
++//
++// Example 2: Two MCP23S08 devices on SPI1, CS#0 with their addrs set to 2 and 3. Three MCP23S17 devices on SPI1, CS#1 with their addrs set to 0, 1 and 7:
++// dtoverlay=spi1-2cs
++// dtoverlay=mcp23s17:s08-spi1-0-present=12,s17-spi1-1-present=131
++
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++      // disable spi-dev on spi0.0
++      fragment@0 {
++              target = <&spidev0>;
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi0.1
++      fragment@1 {
++              target = <&spidev1>;
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi1.0
++      fragment@2 {
++              target-path = "spi1/spidev@0";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi1.1
++      fragment@3 {
++              target-path = "spi1/spidev@1";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi1.2
++      fragment@4 {
++              target-path = "spi1/spidev@2";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi2.0
++      fragment@5 {
++              target-path = "spi2/spidev@0";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi2.1
++      fragment@6 {
++              target-path = "spi2/spidev@1";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // disable spi-dev on spi2.2
++      fragment@7 {
++              target-path = "spi2/spidev@2";
++              __dormant__ {
++                      status = "disabled";
++              };
++      };
++
++      // enable one or more mcp23s08s on spi0.0
++      fragment@8 {
++              target = <&spi0>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_00: mcp23s08@0 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi0-0-present parameter */
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi0-0-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi0.1
++      fragment@9 {
++              target = <&spi0>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_01: mcp23s08@1 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi0-1-present parameter */
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi0-1-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi1.0
++      fragment@10 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_10: mcp23s08@0 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi1-0-present parameter */
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi1-0-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi1.1
++      fragment@11 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_11: mcp23s08@1 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi1-1-present parameter */
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi1-1-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi1.2
++      fragment@12 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_12: mcp23s08@2 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi1-2-present parameter */
++                              reg = <2>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi1-2-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi2.0
++      fragment@13 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_20: mcp23s08@0 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi2-0-present parameter */
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi2-0-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi2.1
++      fragment@14 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_21: mcp23s08@1 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi2-1-present parameter */
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi2-1-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s08s on spi2.2
++      fragment@15 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s08_22: mcp23s08@2 {
++                              compatible = "microchip,mcp23s08";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s08-spi2-2-present parameter */
++                              reg = <2>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s08-spi2-2-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi0.0
++      fragment@16 {
++              target = <&spi0>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_00: mcp23s17@0 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi0-0-present parameter */
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi0-0-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi0.1
++      fragment@17 {
++              target = <&spi0>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_01: mcp23s17@1 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi0-1-present parameter */
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi0-1-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi1.0
++      fragment@18 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_10: mcp23s17@0 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi1-0-present parameter */
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi1-0-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi1.1
++      fragment@19 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_11: mcp23s17@1 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi1-1-present parameter */
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi1-1-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi1.2
++      fragment@20 {
++              target = <&spi1>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_12: mcp23s17@2 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi1-2-present parameter */
++                              reg = <2>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi1-2-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi2.0
++      fragment@21 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_20: mcp23s17@0 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi2-0-present parameter */
++                              reg = <0>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi2-0-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi2.1
++      fragment@22 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_21: mcp23s17@1 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi2-1-present parameter */
++                              reg = <1>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi2-1-int-gpio parameter */
++                      };
++              };
++      };
++
++      // enable one or more mcp23s17s on spi2.2
++      fragment@23 {
++              target = <&spi2>;
++              __dormant__ {
++                      status = "okay";
++                        #address-cells = <1>;
++                        #size-cells = <0>;
++                      mcp23s17_22: mcp23s17@2 {
++                              compatible = "microchip,mcp23s17";
++                              gpio-controller;
++                              #gpio-cells = <2>;
++                              microchip,spi-present-mask = <0x00>;  /* overwritten by mcp23s17-spi2-2-present parameter */
++                              reg = <2>;
++                              spi-max-frequency = <500000>;
++                              status = "okay";
++                              #interrupt-cells=<2>;
++                              interrupts = <0 2>;  /* 1st word overwritten by mcp23s17-spi2-2-int-gpio parameter */
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi0.0 as a input with no pull-up/down
++      fragment@24 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi0_0_int_pins: spi0_0_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi0-0-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi0.1 as a input with no pull-up/down
++      fragment@25 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi0_1_int_pins: spi0_1_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi0-1-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi1.0 as a input with no pull-up/down
++      fragment@26 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi1_0_int_pins: spi1_0_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi1-0-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi1.1 as a input with no pull-up/down
++      fragment@27 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi1_1_int_pins: spi1_1_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi1-1-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi1.2 as a input with no pull-up/down
++      fragment@28 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi1_2_int_pins: spi1_2_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi1-2-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi2.0 as a input with no pull-up/down
++      fragment@29 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi2_0_int_pins: spi2_0_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi2-0-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi2.1 as a input with no pull-up/down
++      fragment@30 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi2_1_int_pins: spi2_1_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi2-1-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Configure GPIO pin connected to INT(A/B) output of mcp23s08/17 on spi2.2 as a input with no pull-up/down
++      fragment@31 {
++              target = <&gpio>;
++              __dormant__ {
++                      spi2_2_int_pins: spi2_2_int_pins {
++                              brcm,pins = <0>;  /* overwritten by mcp23s08/17-spi2-2-int-gpio parameter */
++                              brcm,function = <0>;
++                              brcm,pull = <0>;
++                      };
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi0.0.
++      // Use default active low interrupt signalling.
++      fragment@32 {
++              target = <&mcp23s08_00>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi0.1.
++      // Use default active low interrupt signalling.
++      fragment@33 {
++              target = <&mcp23s08_01>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi1.0.
++      // Use default active low interrupt signalling.
++      fragment@34 {
++              target = <&mcp23s08_10>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi1.1.
++      // Use default active low interrupt signalling.
++      fragment@35 {
++              target = <&mcp23s08_11>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi1.2.
++      // Use default active low interrupt signalling.
++      fragment@36 {
++              target = <&mcp23s08_12>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi2.0.
++      // Use default active low interrupt signalling.
++      fragment@37 {
++              target = <&mcp23s08_20>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi2.1.
++      // Use default active low interrupt signalling.
++      fragment@38 {
++              target = <&mcp23s08_21>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s08 on spi2.2.
++      // Use default active low interrupt signalling.
++      fragment@39 {
++              target = <&mcp23s08_22>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi0.0.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Use default active low interrupt signalling.
++      fragment@40 {
++              target = <&mcp23s17_00>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi0.1.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@41 {
++              target = <&mcp23s17_01>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi1.0.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@42 {
++              target = <&mcp23s17_10>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi1.1.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@43 {
++              target = <&mcp23s17_11>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi1.2.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@44 {
++              target = <&mcp23s17_12>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi2.0.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@45 {
++              target = <&mcp23s17_20>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi2.1.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@46 {
++              target = <&mcp23s17_21>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      // Enable interrupts for a mcp23s17 on spi2.2.
++      // Enable mirroring so that either INTA or INTB output of mcp23s17 can be connected to the GPIO pin.
++      // Configure INTA/B outputs of mcp23s08/17 as active low.
++      fragment@47 {
++              target = <&mcp23s17_22>;
++              __dormant__ {
++                      interrupt-parent = <&gpio>;
++                      interrupt-controller;
++                      microchip,irq-mirror;
++              };
++      };
++
++      __overrides__ {
++              s08-spi0-0-present = <0>,"+0+8",  <&mcp23s08_00>,"microchip,spi-present-mask:0";
++              s08-spi0-1-present = <0>,"+1+9",  <&mcp23s08_01>,"microchip,spi-present-mask:0";
++              s08-spi1-0-present = <0>,"+2+10", <&mcp23s08_10>,"microchip,spi-present-mask:0";
++              s08-spi1-1-present = <0>,"+3+11", <&mcp23s08_11>,"microchip,spi-present-mask:0";
++              s08-spi1-2-present = <0>,"+4+12", <&mcp23s08_12>,"microchip,spi-present-mask:0";
++              s08-spi2-0-present = <0>,"+5+13", <&mcp23s08_20>,"microchip,spi-present-mask:0";
++              s08-spi2-1-present = <0>,"+6+14", <&mcp23s08_21>,"microchip,spi-present-mask:0";
++              s08-spi2-2-present = <0>,"+7+15", <&mcp23s08_22>,"microchip,spi-present-mask:0";
++              s17-spi0-0-present = <0>,"+0+16", <&mcp23s17_00>,"microchip,spi-present-mask:0";
++              s17-spi0-1-present = <0>,"+1+17", <&mcp23s17_01>,"microchip,spi-present-mask:0";
++              s17-spi1-0-present = <0>,"+2+18", <&mcp23s17_10>,"microchip,spi-present-mask:0";
++              s17-spi1-1-present = <0>,"+3+19", <&mcp23s17_11>,"microchip,spi-present-mask:0";
++              s17-spi1-2-present = <0>,"+4+20", <&mcp23s17_12>,"microchip,spi-present-mask:0";
++              s17-spi2-0-present = <0>,"+5+21", <&mcp23s17_20>,"microchip,spi-present-mask:0";
++              s17-spi2-1-present = <0>,"+6+22", <&mcp23s17_21>,"microchip,spi-present-mask:0";
++              s17-spi2-2-present = <0>,"+7+23", <&mcp23s17_22>,"microchip,spi-present-mask:0";
++              s08-spi0-0-int-gpio = <0>,"+24+32", <&spi0_0_int_pins>,"brcm,pins:0", <&mcp23s08_00>,"interrupts:0";
++              s08-spi0-1-int-gpio = <0>,"+25+33", <&spi0_1_int_pins>,"brcm,pins:0", <&mcp23s08_01>,"interrupts:0";
++              s08-spi1-0-int-gpio = <0>,"+26+34", <&spi1_0_int_pins>,"brcm,pins:0", <&mcp23s08_10>,"interrupts:0";
++              s08-spi1-1-int-gpio = <0>,"+27+35", <&spi1_1_int_pins>,"brcm,pins:0", <&mcp23s08_11>,"interrupts:0";
++              s08-spi1-2-int-gpio = <0>,"+28+36", <&spi1_2_int_pins>,"brcm,pins:0", <&mcp23s08_12>,"interrupts:0";
++              s08-spi2-0-int-gpio = <0>,"+29+37", <&spi2_0_int_pins>,"brcm,pins:0", <&mcp23s08_20>,"interrupts:0";
++              s08-spi2-1-int-gpio = <0>,"+30+38", <&spi2_1_int_pins>,"brcm,pins:0", <&mcp23s08_21>,"interrupts:0";
++              s08-spi2-2-int-gpio = <0>,"+31+39", <&spi2_2_int_pins>,"brcm,pins:0", <&mcp23s08_22>,"interrupts:0";
++              s17-spi0-0-int-gpio = <0>,"+24+40", <&spi0_0_int_pins>,"brcm,pins:0", <&mcp23s17_00>,"interrupts:0";
++              s17-spi0-1-int-gpio = <0>,"+25+41", <&spi0_1_int_pins>,"brcm,pins:0", <&mcp23s17_01>,"interrupts:0";
++              s17-spi1-0-int-gpio = <0>,"+26+42", <&spi1_0_int_pins>,"brcm,pins:0", <&mcp23s17_10>,"interrupts:0";
++              s17-spi1-1-int-gpio = <0>,"+27+43", <&spi1_1_int_pins>,"brcm,pins:0", <&mcp23s17_11>,"interrupts:0";
++              s17-spi1-2-int-gpio = <0>,"+28+44", <&spi1_2_int_pins>,"brcm,pins:0", <&mcp23s17_12>,"interrupts:0";
++              s17-spi2-0-int-gpio = <0>,"+29+45", <&spi2_0_int_pins>,"brcm,pins:0", <&mcp23s17_20>,"interrupts:0";
++              s17-spi2-1-int-gpio = <0>,"+30+46", <&spi2_1_int_pins>,"brcm,pins:0", <&mcp23s17_21>,"interrupts:0";
++              s17-spi2-2-int-gpio = <0>,"+31+47", <&spi2_2_int_pins>,"brcm,pins:0", <&mcp23s17_22>,"interrupts:0";
++      };
++};
++
diff --git a/target/linux/brcm2708/patches-4.4/0487-BCM270X_DT-Add-audio_pins-to-CM-dtb.patch b/target/linux/brcm2708/patches-4.4/0487-BCM270X_DT-Add-audio_pins-to-CM-dtb.patch
new file mode 100644 (file)
index 0000000..1f73e52
--- /dev/null
@@ -0,0 +1,24 @@
+From e34eb065a125fae5814256d77c03226a46083f87 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 19 Aug 2016 11:12:28 +0100
+Subject: [PATCH] BCM270X_DT: Add audio_pins to CM dtb
+
+Bring the CM .dtb in line with other others.
+---
+ arch/arm/boot/dts/bcm2708-rpi-cm.dts | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-cm.dts
++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dts
+@@ -35,6 +35,11 @@
+               brcm,pins = <18 19 20 21>;
+               brcm,function = <4>; /* alt0 */
+       };
++
++      audio_pins: audio_pins {
++              brcm,pins;
++              brcm,function;
++      };
+ };
+ &spi0 {
diff --git a/target/linux/brcm2708/patches-4.4/0488-BCM270X_DT-Don-t-enable-UART0-in-CM3-dtb.patch b/target/linux/brcm2708/patches-4.4/0488-BCM270X_DT-Don-t-enable-UART0-in-CM3-dtb.patch
new file mode 100644 (file)
index 0000000..f8a2be9
--- /dev/null
@@ -0,0 +1,37 @@
+From ec662a26071a7aa2d7617ac366ce91beebaf2ad1 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 19 Aug 2016 11:19:02 +0100
+Subject: [PATCH] BCM270X_DT: Don't enable UART0 in CM3 dtb
+
+---
+ arch/arm/boot/dts/bcm2710-rpi-cm3.dts | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2710-rpi-cm3.dts
++++ b/arch/arm/boot/dts/bcm2710-rpi-cm3.dts
+@@ -40,12 +40,6 @@
+               brcm,function = <4>; /* alt0 */
+       };
+-      uart0_pins: uart0_pins {
+-              brcm,pins;
+-              brcm,function;
+-              brcm,pull = <0 2>;
+-      };
+-
+       audio_pins: audio_pins {
+               brcm,pins;
+               brcm,function;
+@@ -75,12 +69,6 @@
+       status = "okay";
+ };
+-&uart0 {
+-      pinctrl-names = "default";
+-      pinctrl-0 = <&uart0_pins>;
+-      status = "okay";
+-};
+-
+ &spi0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
diff --git a/target/linux/brcm2708/patches-4.4/0489-overlays-Add-audremap-overlay.patch b/target/linux/brcm2708/patches-4.4/0489-overlays-Add-audremap-overlay.patch
new file mode 100644 (file)
index 0000000..e8d3976
--- /dev/null
@@ -0,0 +1,56 @@
+From 612d9be3d6aa73b018005a182bd55a551abfc271 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 19 Aug 2016 11:26:57 +0100
+Subject: [PATCH] overlays: Add audremap overlay
+
+The audremap overlay switches the PWM audio outputs to GPIO pins
+12 (L) and 13 (R).
+---
+ arch/arm/boot/dts/overlays/Makefile             |  1 +
+ arch/arm/boot/dts/overlays/README               |  6 ++++++
+ arch/arm/boot/dts/overlays/audremap-overlay.dts | 14 ++++++++++++++
+ 3 files changed, 21 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/audremap-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -18,6 +18,7 @@ dtbo-$(RPI_DT_OVERLAYS) += ads7846.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += akkordion-iqdacplus.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += at86rf233.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += audioinjector-wm8731-audio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += audremap.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += bmp085_i2c-sensor.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dht11.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += dionaudio-loco.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -253,6 +253,12 @@ Load:   dtoverlay=audioinjector-wm8731-a
+ Params: <None>
++Name:   audremap
++Info:   Switches PWM sound output to pins 12 & 13
++Load:   dtoverlay=audremap
++Params: <None>
++
++
+ Name:   bmp085_i2c-sensor
+ Info:   Configures the BMP085/BMP180 digital barometric pressure and temperature
+         sensors from Bosch Sensortec
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/audremap-overlay.dts
+@@ -0,0 +1,14 @@
++/dts-v1/;
++/plugin/;
++
++/ {
++        compatible = "brcm,bcm2708";
++
++        fragment@0 {
++                target = <&audio_pins>;
++                __overlay__ {
++                        brcm,pins = < 12 13 >;
++                        brcm,function = < 4 >; /* alt0 alt0 */
++                };
++        };
++};
diff --git a/target/linux/brcm2708/patches-4.4/0490-overlays-Add-swap_lr-and-enable_jack-to-audremap.patch b/target/linux/brcm2708/patches-4.4/0490-overlays-Add-swap_lr-and-enable_jack-to-audremap.patch
new file mode 100644 (file)
index 0000000..7261163
--- /dev/null
@@ -0,0 +1,50 @@
+From f8e026145de28acf5e36183f5c8b489bf172e9c8 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 19 Aug 2016 15:39:01 +0100
+Subject: [PATCH] overlays: Add swap_lr and enable_jack to audremap
+
+swap_lr causes the channels to be reversed, and enable_jack prevents the
+headphone output from being disabled.
+
+See: https://github.com/raspberrypi/linux/issues/1473
+---
+ arch/arm/boot/dts/overlays/README               | 9 ++++++---
+ arch/arm/boot/dts/overlays/audremap-overlay.dts | 7 ++++++-
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -254,9 +254,12 @@ Params: <None>
+ Name:   audremap
+-Info:   Switches PWM sound output to pins 12 & 13
+-Load:   dtoverlay=audremap
+-Params: <None>
++Info:   Switches PWM sound output to pins 12 (Right) & 13 (Left)
++Load:   dtoverlay=audremap,<param>=<val>
++Params: swap_lr                 Reverse the channel allocation, which will also
++                                swap the audio jack outputs (default off)
++        enable_jack             Don't switch off the audio jack output
++                                (default off)
+ Name:   bmp085_i2c-sensor
+--- a/arch/arm/boot/dts/overlays/audremap-overlay.dts
++++ b/arch/arm/boot/dts/overlays/audremap-overlay.dts
+@@ -6,9 +6,14 @@
+         fragment@0 {
+                 target = <&audio_pins>;
+-                __overlay__ {
++                frag0: __overlay__ {
+                         brcm,pins = < 12 13 >;
+                         brcm,function = < 4 >; /* alt0 alt0 */
+                 };
+         };
++
++      __overrides__ {
++              swap_lr = <&frag0>, "swap_lr?";
++              enable_jack = <&frag0>, "enable_jack?";
++      };
+ };
diff --git a/target/linux/brcm2708/patches-4.4/0491-overlays-Clarify-gpio-poweroff-semantics-in-README.patch b/target/linux/brcm2708/patches-4.4/0491-overlays-Clarify-gpio-poweroff-semantics-in-README.patch
new file mode 100644 (file)
index 0000000..915c998
--- /dev/null
@@ -0,0 +1,24 @@
+From 5b3a11f39bb1b0f9b43044c8109bd6a19b92cebe Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Mon, 22 Aug 2016 11:56:04 +0100
+Subject: [PATCH] overlays: Clarify gpio-poweroff semantics in README
+
+1) GPIO pin is signalled on poweroff, not reboot.
+2) In RPi kernels, halt is equivalent to poweroff.
+
+See: https://github.com/raspberrypi/linux/issues/1600
+---
+ 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
+@@ -340,7 +340,7 @@ Params: gpio_pin                Input pi
+ Name:   gpio-poweroff
+-Info:   Drives a GPIO high or low on reboot
++Info:   Drives a GPIO high or low on poweroff (including halt)
+ Load:   dtoverlay=gpio-poweroff,<param>=<val>
+ Params: gpiopin                 GPIO for signalling (default 26)
diff --git a/target/linux/brcm2708/patches-4.4/0492-overlays-added-sc16is750-UART-over-I2C-1617.patch b/target/linux/brcm2708/patches-4.4/0492-overlays-added-sc16is750-UART-over-I2C-1617.patch
new file mode 100644 (file)
index 0000000..db88579
--- /dev/null
@@ -0,0 +1,81 @@
+From 2de4b29019b167f079ea48e30d641f7d0370bf08 Mon Sep 17 00:00:00 2001
+From: Georgii Staroselskii <gosha371@gmail.com>
+Date: Tue, 23 Aug 2016 17:40:05 +0400
+Subject: [PATCH] overlays: added sc16is750 UART over I2C (#1617)
+
+---
+ arch/arm/boot/dts/overlays/Makefile                |  1 +
+ arch/arm/boot/dts/overlays/README                  | 10 ++++++
+ .../boot/dts/overlays/sc16is750-i2c-overlay.dts    | 37 ++++++++++++++++++++++
+ 3 files changed, 48 insertions(+)
+ create mode 100644 arch/arm/boot/dts/overlays/sc16is750-i2c-overlay.dts
+
+--- a/arch/arm/boot/dts/overlays/Makefile
++++ b/arch/arm/boot/dts/overlays/Makefile
+@@ -75,6 +75,7 @@ dtbo-$(RPI_DT_OVERLAYS) += rpi-ft5406.dt
+ dtbo-$(RPI_DT_OVERLAYS) += rpi-proto.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += rpi-sense.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += rra-digidac1-wm8741-audio.dtbo
++dtbo-$(RPI_DT_OVERLAYS) += sc16is750-i2c.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sc16is752-spi1.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdhost.dtbo
+ dtbo-$(RPI_DT_OVERLAYS) += sdio.dtbo
+--- a/arch/arm/boot/dts/overlays/README
++++ b/arch/arm/boot/dts/overlays/README
+@@ -935,6 +935,16 @@ Load:   dtoverlay=rra-digidac1-wm8741-au
+ Params: <None>
++Name:   sc16is750-i2c
++Info:   Overlay for the NXP SC16IS750 UART with I2C Interface
++        Enables the chip on I2C1 at 0x48. To select another address,
++        please refer to table 10 in reference manual.
++
++Load:   dtoverlay=sc16is750-i2c,<param>=<val>
++Params: int_pin                 GPIO used for IRQ (default 24)
++        addr                    Address (default 0x48)
++
++
+ Name:   sc16is752-spi1
+ Info:   Overlay for the NXP SC16IS752 Dual UART with SPI Interface
+         Enables the chip on SPI1.
+--- /dev/null
++++ b/arch/arm/boot/dts/overlays/sc16is750-i2c-overlay.dts
+@@ -0,0 +1,37 @@
++/dts-v1/;
++/plugin/;
++
++/ {
++      compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
++
++      fragment@0 {
++              target = <&i2c_arm>;
++              __overlay__ {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
++                      status = "okay";
++
++                      sc16is750: sc16is750@48 {
++                              compatible = "nxp,sc16is750";
++                              reg = <0x48>; /* address */
++                              clocks = <&sc16is750_clk>;
++                              interrupt-parent = <&gpio>;
++                              interrupts = <24 2>; /* IRQ_TYPE_EDGE_FALLING */
++                              #gpio-cells = <2>;
++
++                              sc16is750_clk: sc16is750_clk {
++                                      compatible = "fixed-clock";
++                                      #clock-cells = <0>;
++                                      clock-frequency = <14745600>;
++                              };
++                      };
++              };
++      };
++
++
++      __overrides__ {
++              int_pin = <&sc16is750>,"interrupts:0";
++              addr = <&sc16is750>,"reg:0";
++      };
++
++};
diff --git a/target/linux/brcm2708/patches-4.4/0493-Bluetooth-Fix-l2cap_sock_setsockopt-with-optname-BT_.patch b/target/linux/brcm2708/patches-4.4/0493-Bluetooth-Fix-l2cap_sock_setsockopt-with-optname-BT_.patch
new file mode 100644 (file)
index 0000000..a506297
--- /dev/null
@@ -0,0 +1,33 @@
+From 2b3cf031dfcef6f4fc803ae451364c70482404a8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Amadeusz=20S=C5=82awi=C5=84ski?=
+ <amadeusz.slawinski@tieto.com>
+Date: Thu, 14 Jul 2016 10:50:23 +0200
+Subject: [PATCH] Bluetooth: Fix l2cap_sock_setsockopt() with optname BT_RCVMTU
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit 23bc6ab0a0912146fd674a0becc758c3162baabc upstream.
+
+When we retrieve imtu value from userspace we should use 16 bit pointer
+cast instead of 32 as it's defined that way in headers. Fixes setsockopt
+calls on big-endian platforms.
+
+Signed-off-by: Amadeusz Sławiński <amadeusz.slawinski@tieto.com>
+Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/bluetooth/l2cap_sock.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/bluetooth/l2cap_sock.c
++++ b/net/bluetooth/l2cap_sock.c
+@@ -817,7 +817,7 @@ static int l2cap_sock_setsockopt(struct
+                       break;
+               }
+-              if (get_user(opt, (u32 __user *) optval)) {
++              if (get_user(opt, (u16 __user *) optval)) {
+                       err = -EFAULT;
+                       break;
+               }
diff --git a/target/linux/brcm2708/patches-4.4/0494-config-Add-CONFIG_IPVLAN-module.patch b/target/linux/brcm2708/patches-4.4/0494-config-Add-CONFIG_IPVLAN-module.patch
new file mode 100644 (file)
index 0000000..a585a58
--- /dev/null
@@ -0,0 +1,30 @@
+From 0ae26a9c13742759f83f94678e23a4b1ff87c92e Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Tue, 23 Aug 2016 14:07:29 +0100
+Subject: [PATCH] config: Add CONFIG_IPVLAN module
+
+---
+ 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
+@@ -448,6 +448,7 @@ CONFIG_BONDING=m
+ CONFIG_DUMMY=m
+ CONFIG_IFB=m
+ CONFIG_MACVLAN=m
++CONFIG_IPVLAN=m
+ CONFIG_NETCONSOLE=m
+ CONFIG_TUN=m
+ CONFIG_VETH=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -441,6 +441,7 @@ CONFIG_BONDING=m
+ CONFIG_DUMMY=m
+ CONFIG_IFB=m
+ CONFIG_MACVLAN=m
++CONFIG_IPVLAN=m
+ CONFIG_NETCONSOLE=m
+ CONFIG_TUN=m
+ CONFIG_VETH=m
diff --git a/target/linux/brcm2708/patches-4.4/0495-config-Add-CONFIG_VXLAN-module.patch b/target/linux/brcm2708/patches-4.4/0495-config-Add-CONFIG_VXLAN-module.patch
new file mode 100644 (file)
index 0000000..7993c92
--- /dev/null
@@ -0,0 +1,30 @@
+From 77861bfabc7b84513c6ccbbd2efbeaaca8e7e022 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Tue, 23 Aug 2016 14:08:55 +0100
+Subject: [PATCH] config: Add CONFIG_VXLAN module
+
+---
+ 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
+@@ -449,6 +449,7 @@ CONFIG_DUMMY=m
+ CONFIG_IFB=m
+ CONFIG_MACVLAN=m
+ CONFIG_IPVLAN=m
++CONFIG_VXLAN=m
+ CONFIG_NETCONSOLE=m
+ CONFIG_TUN=m
+ CONFIG_VETH=m
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -442,6 +442,7 @@ CONFIG_DUMMY=m
+ CONFIG_IFB=m
+ CONFIG_MACVLAN=m
+ CONFIG_IPVLAN=m
++CONFIG_VXLAN=m
+ CONFIG_NETCONSOLE=m
+ CONFIG_TUN=m
+ CONFIG_VETH=m
diff --git a/target/linux/brcm2708/patches-4.4/0496-Fixes-i2c_bcm2708-Write-to-FIFO-correctly-v2-1574.patch b/target/linux/brcm2708/patches-4.4/0496-Fixes-i2c_bcm2708-Write-to-FIFO-correctly-v2-1574.patch
new file mode 100644 (file)
index 0000000..da46d86
--- /dev/null
@@ -0,0 +1,48 @@
+From 1b6ee2ac8f1d55cb7ceeaa606e3d4868cfde363d Mon Sep 17 00:00:00 2001
+From: Simon Maes <simonn.maes@gmail.com>
+Date: Mon, 29 Aug 2016 21:11:01 +0200
+Subject: [PATCH] Fixes i2c_bcm2708: Write to FIFO correctly - v2 (#1574)
+
+* i2c: fix i2c_bcm2708: Clear FIFO before sending data
+
+Make sure FIFO gets cleared before trying to send
+data in case of a repeated start (COMBINED=Y).
+
+* i2c: fix i2c_bcm2708: Only write to FIFO when not full
+
+Check if FIFO can accept data before writing.
+To avoid a peripheral read on the last iteration of a loop,
+both bcm2708_bsc_fifo_fill and ~drain are changed as well.
+---
+ drivers/i2c/busses/i2c-bcm2708.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/drivers/i2c/busses/i2c-bcm2708.c
++++ b/drivers/i2c/busses/i2c-bcm2708.c
+@@ -115,13 +115,13 @@ static inline void bcm2708_bsc_reset(str
+ static inline void bcm2708_bsc_fifo_drain(struct bcm2708_i2c *bi)
+ {
+-      while ((bcm2708_rd(bi, BSC_S) & BSC_S_RXD) && (bi->pos < bi->msg->len))
++      while ((bi->pos < bi->msg->len) && (bcm2708_rd(bi, BSC_S) & BSC_S_RXD))
+               bi->msg->buf[bi->pos++] = bcm2708_rd(bi, BSC_FIFO);
+ }
+ static inline void bcm2708_bsc_fifo_fill(struct bcm2708_i2c *bi)
+ {
+-      while ((bcm2708_rd(bi, BSC_S) & BSC_S_TXD) && (bi->pos < bi->msg->len))
++      while ((bi->pos < bi->msg->len) && (bcm2708_rd(bi, BSC_S) & BSC_S_TXD))
+               bcm2708_wr(bi, BSC_FIFO, bi->msg->buf[bi->pos++]);
+ }
+@@ -155,6 +155,10 @@ static inline int bcm2708_bsc_setup(stru
+               if ( (bi->nmsgs > 1) &&
+                       !(bi->msg[0].flags & I2C_M_RD) && (bi->msg[1].flags & I2C_M_RD) &&
+                        (bi->msg[0].addr == bi->msg[1].addr) && (bi->msg[0].len <= 16)) {
++
++                      /* Clear FIFO */
++                      bcm2708_wr(bi, BSC_C, BSC_C_CLEAR_1);
++
+                       /* Fill FIFO with entire write message (16 byte FIFO) */
+                       while (bi->pos < bi->msg->len) {
+                               bcm2708_wr(bi, BSC_FIFO, bi->msg->buf[bi->pos++]);
diff --git a/target/linux/brcm2708/patches-4.4/0497-bcm2835-sdhost-Don-t-exit-cmd-wait-loop-on-error.patch b/target/linux/brcm2708/patches-4.4/0497-bcm2835-sdhost-Don-t-exit-cmd-wait-loop-on-error.patch
new file mode 100644 (file)
index 0000000..564b65d
--- /dev/null
@@ -0,0 +1,63 @@
+From 0ca1a9040cff3ace3d7fce5cdd83f1cbaa8da50c Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 2 Sep 2016 17:21:42 +0100
+Subject: [PATCH] bcm2835-sdhost: Don't exit cmd wait loop on error
+
+The FAIL flag can be set in the CMD register before command processing
+is complete, leading to spurious "failed to complete" errors. This has
+the effect of promoting harmless CRC7 errors during CMD1 processing
+into errors that can delay and even prevent booting.
+
+Also:
+1) Convert the last KERN_ERROR message in the register dumping to
+   KERN_INFO.
+2) Remove an unnecessary reset call from  bcm2835_sdhost_add_host.
+
+See: https://github.com/raspberrypi/linux/pull/1492
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ drivers/mmc/host/bcm2835-sdhost.c | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+--- a/drivers/mmc/host/bcm2835-sdhost.c
++++ b/drivers/mmc/host/bcm2835-sdhost.c
+@@ -373,7 +373,7 @@ static void bcm2835_sdhost_dumpregs(stru
+       pr_info("%s: SDRSP2 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDRSP2));
+-      pr_err("%s: SDRSP3 0x%08x\n",
++      pr_info("%s: SDRSP3 0x%08x\n",
+               mmc_hostname(host->mmc),
+               bcm2835_sdhost_read(host, SDRSP3));
+       pr_info("%s: SDHSTS 0x%08x\n",
+@@ -1183,9 +1183,8 @@ static void bcm2835_sdhost_finish_comman
+               retries = 1; // We've already waited long enough this time
+       }
+-      retries = host->cmd_quick_poll_retries;
+       for (sdcmd = bcm2835_sdhost_read(host, SDCMD);
+-           (sdcmd & SDCMD_NEW_FLAG) && !(sdcmd & SDCMD_FAIL_FLAG) && retries;
++           (sdcmd & SDCMD_NEW_FLAG) && retries;
+            retries--) {
+               cpu_relax();
+               sdcmd = bcm2835_sdhost_read(host, SDCMD);
+@@ -1208,8 +1207,7 @@ static void bcm2835_sdhost_finish_comman
+                       usleep_range(1, 10);
+                       spin_lock_irqsave(&host->lock, *irq_flags);
+                       sdcmd = bcm2835_sdhost_read(host, SDCMD);
+-                      if (!(sdcmd & SDCMD_NEW_FLAG) ||
+-                          (sdcmd & SDCMD_FAIL_FLAG))
++                      if (!(sdcmd & SDCMD_NEW_FLAG))
+                               break;
+               }
+       }
+@@ -1892,8 +1890,6 @@ int bcm2835_sdhost_add_host(struct bcm28
+       mmc = host->mmc;
+-      bcm2835_sdhost_reset_internal(host);
+-
+       mmc->f_max = host->max_clk;
+       mmc->f_min = host->max_clk / SDCDIV_MAX_CDIV;
diff --git a/target/linux/brcm2708/patches-4.4/0498-BCM270X_DT-Use-bcm2835-sdhost-on-Compute-Module.patch b/target/linux/brcm2708/patches-4.4/0498-BCM270X_DT-Use-bcm2835-sdhost-on-Compute-Module.patch
new file mode 100644 (file)
index 0000000..bb2895c
--- /dev/null
@@ -0,0 +1,30 @@
+From 6288d4a7b700cbb8c1c72210c9b2017cf8bc7dd2 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.org>
+Date: Fri, 2 Sep 2016 14:35:37 +0100
+Subject: [PATCH] BCM270X_DT: Use bcm2835-sdhost on Compute Module
+
+With the preceding commit:
+
+  bcm2835-sdhost: Don't exit cmd wait loop on error
+
+it is safe to use the bcm2835-sdhost driver on the Compute Module.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.org>
+---
+ arch/arm/boot/dts/bcm2708-rpi-cm.dtsi | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi
++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi
+@@ -23,9 +23,9 @@
+ };
+-&mmc {
++&sdhost {
+       pinctrl-names = "default";
+-      pinctrl-0 = <&mmc_pins>;
++      pinctrl-0 = <&sdhost_pins>;
+       non-removable;
+       bus-width = <4>;
+       status = "okay";
diff --git a/target/linux/brcm2708/patches-4.4/0499-fbmem-Ensure-that-parameters-are-properly-checked-wi.patch b/target/linux/brcm2708/patches-4.4/0499-fbmem-Ensure-that-parameters-are-properly-checked-wi.patch
new file mode 100644 (file)
index 0000000..186f29b
--- /dev/null
@@ -0,0 +1,27 @@
+From 7c8c6f113e1169690dbfbfc486360d10452e5a85 Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Wed, 7 Sep 2016 16:57:59 +0100
+Subject: [PATCH] fbmem: Ensure that parameters are properly checked within
+ fb_copyarea_user
+
+---
+ drivers/video/fbdev/core/fbmem.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/drivers/video/fbdev/core/fbmem.c
++++ b/drivers/video/fbdev/core/fbmem.c
+@@ -1090,7 +1090,13 @@ static int fb_copyarea_user(struct fb_in
+       int ret = 0;
+       if (!lock_fb_info(info))
+               return -ENODEV;
+-      if (copy->dx + copy->width > info->var.xres ||
++      if (copy->dx >= info->var.xres ||
++          copy->sx >= info->var.xres ||
++          copy->width > info->var.xres ||
++          copy->dy >= info->var.yres ||
++          copy->sy >= info->var.yres ||
++          copy->height > info->var.yres ||
++          copy->dx + copy->width > info->var.xres ||
+           copy->sx + copy->width > info->var.xres ||
+           copy->dy + copy->height > info->var.yres ||
+           copy->sy + copy->height > info->var.yres) {
diff --git a/target/linux/brcm2708/patches-4.4/0500-config-Enabled-SENSORS_INA2XX-module.patch b/target/linux/brcm2708/patches-4.4/0500-config-Enabled-SENSORS_INA2XX-module.patch
new file mode 100644 (file)
index 0000000..49e637e
--- /dev/null
@@ -0,0 +1,30 @@
+From a2aac70ca118d0a4cc7321cfcc4bf7884dd4208c Mon Sep 17 00:00:00 2001
+From: popcornmix <popcornmix@gmail.com>
+Date: Fri, 9 Sep 2016 19:35:13 +0100
+Subject: [PATCH] config: Enabled SENSORS_INA2XX module
+
+---
+ 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
+@@ -649,6 +649,7 @@ CONFIG_HWMON=m
+ CONFIG_SENSORS_LM75=m
+ CONFIG_SENSORS_SHT21=m
+ CONFIG_SENSORS_SHTC1=m
++CONFIG_SENSORS_INA2XX=m
+ CONFIG_THERMAL=y
+ CONFIG_THERMAL_BCM2835=y
+ CONFIG_WATCHDOG=y
+--- a/arch/arm/configs/bcmrpi_defconfig
++++ b/arch/arm/configs/bcmrpi_defconfig
+@@ -641,6 +641,7 @@ CONFIG_HWMON=m
+ CONFIG_SENSORS_LM75=m
+ CONFIG_SENSORS_SHT21=m
+ CONFIG_SENSORS_SHTC1=m
++CONFIG_SENSORS_INA2XX=m
+ CONFIG_THERMAL=y
+ CONFIG_THERMAL_BCM2835=y
+ CONFIG_WATCHDOG=y