]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
Merge tag 'v4.6' into master
authorMichal Simek <michal.simek@xilinx.com>
Thu, 21 Jul 2016 14:49:27 +0000 (16:49 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 27 Jul 2016 12:24:50 +0000 (14:24 +0200)
Fix issues in spi-nor driver.

Fix xilinx_phy compilation:
net: phy: xilinx_phy: Fix compilation errors in the driver

This commit e5a03bfd873c ("phy: Add an mdio_device structure")
modifies the phydev strcture fields.

This patch updates for the same in the driver

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
Apply revert of:
"kbuild: Add option to turn incompatible pointer check into error"
(sha1: ea8daa7b97842aab8507b5b5b1e3226cf2d514a6).
because some drivers are causing compilation warnings.
Apply this patch when compilations warnings are fixed.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
76 files changed:
1  2 
Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
Documentation/devicetree/bindings/net/macb.txt
Makefile
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/zynq-zybo.dts
arch/arm/configs/xilinx_zynq_defconfig
arch/arm/include/asm/memory.h
arch/arm/kernel/machine_kexec.c
arch/arm/kernel/smp.c
arch/arm64/boot/dts/xilinx/zynqmp.dtsi
arch/arm64/configs/xilinx_zynqmp_defconfig
arch/arm64/include/asm/processor.h
arch/arm64/mm/fault.c
arch/microblaze/pci/pci-common.c
arch/powerpc/kernel/fpu.S
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/traps.c
drivers/char/Kconfig
drivers/clk/zynq/clkc.c
drivers/dma/Kconfig
drivers/dma/xilinx/zynqmp_dma.c
drivers/edac/Kconfig
drivers/edac/Makefile
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/iio/adc/Kconfig
drivers/irqchip/Kconfig
drivers/irqchip/Makefile
drivers/irqchip/irq-gic.c
drivers/media/i2c/adv7511.c
drivers/media/media-entity.c
drivers/media/platform/Kconfig
drivers/media/platform/Makefile
drivers/media/v4l2-core/v4l2-ioctl.c
drivers/memory/Kconfig
drivers/memory/Makefile
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h
drivers/mtd/nand/Kconfig
drivers/mtd/nand/Makefile
drivers/mtd/nand/nand_base.c
drivers/mtd/spi-nor/spi-nor.c
drivers/net/phy/Kconfig
drivers/net/phy/Makefile
drivers/net/phy/marvell.c
drivers/net/phy/xilinx_phy.c
drivers/pci/host/Kconfig
drivers/phy/Kconfig
drivers/phy/Makefile
drivers/remoteproc/Kconfig
drivers/remoteproc/Makefile
drivers/remoteproc/remoteproc_core.c
drivers/reset/Makefile
drivers/soc/Kconfig
drivers/soc/Makefile
drivers/spi/Kconfig
drivers/spi/Makefile
drivers/staging/Kconfig
drivers/staging/Makefile
drivers/tty/hvc/hvc_xen.c
drivers/usb/chipidea/otg_fsm.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h
drivers/video/fbdev/Kconfig
drivers/virtio/virtio_ring.c
include/linux/mtd/mtd.h
include/linux/mtd/nand.h
include/linux/mtd/spi-nor.h
include/linux/spi/spi.h
include/linux/virtio.h
include/media/media-entity.h
include/media/v4l2-subdev.h
include/uapi/linux/Kbuild
sound/soc/Kconfig

index 07a771cfe249853e7ab27ca975484dcf62e0674a,31b35c3a5e478191cb5faa427b5aaec57ec87fff..5de930f73d707cf8f20313fc154672b1f2b457f9
@@@ -17,12 -18,10 +18,16 @@@ Required Properties
    - interrupt-parent: Phandle for the interrupt controller that services
                      interrupts for this device.
  
+ Required Properties for "arasan,sdhci-5.1":
+   - phys: From PHY bindings: Phandle for the Generic PHY for arasan.
+   - phy-names:  MUST be "phy_arasan".
 +Optional Properties:
 +  - broken-tuning: Indicates tuning broken in Silicon 1.0 of
 +                        Zynq Ultrascale+ MPSoC.
 +  - broken-mmc-highspeed: Indicates to force
 +                              the controller to use in standard speed.
 +
  Example:
        sdhci@e0100000 {
                compatible = "arasan,sdhci-8.9a";
index f8b893fcb575df5dbba1bb4768239f93aa92e035,b5a42df4c9281d20c27cb726b0fac57ff58187c3..5505ad730d84bdeda3c56459974e0511d09ac7d2
@@@ -25,13 -25,9 +25,15 @@@ Required properties
  
  Optional properties for PHY child node:
  - reset-gpios : Should specify the gpio for phy reset
+ - magic-packet : If present, indicates that the hardware supports waking
+   up via magic packet.
  
 +Optional properties:
 +- tsu-clk: Time stamp unit clock frequency used.
 +- phy-reset-gpio: GPIO number for phy reset.
 +- phy-reset-duration: Reset duration in milliseconds.
 +- phy-reset-active-low: Boolean flag to indicate if phy reset is active low.
 +
  Examples:
  
        macb0: ethernet@fffc4000 {
diff --cc Makefile
Simple merge
Simple merge
Simple merge
index ff76025bbac0ce3b57c63b0ed2190a1f88bc729d,0000000000000000000000000000000000000000..2eef0b74ca8cd8bd31b7ca2f4789d8f9870da66f
mode 100644,000000..100644
--- /dev/null
@@@ -1,243 -1,0 +1,239 @@@
- CONFIG_FHANDLE=y
 +CONFIG_LOCALVERSION="-xilinx"
 +CONFIG_SYSVIPC=y
- CONFIG_XILINX_AXIDMA=y
- CONFIG_XILINX_AXICDMA=y
- CONFIG_XILINX_VDMA=y
 +CONFIG_NO_HZ=y
 +CONFIG_HIGH_RES_TIMERS=y
 +CONFIG_IKCONFIG=y
 +CONFIG_IKCONFIG_PROC=y
 +CONFIG_LOG_BUF_SHIFT=14
 +CONFIG_CGROUPS=y
 +CONFIG_BLK_DEV_INITRD=y
 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 +CONFIG_SYSCTL_SYSCALL=y
 +# CONFIG_BUG is not set
 +CONFIG_EMBEDDED=y
 +CONFIG_PERF_EVENTS=y
 +CONFIG_SLAB=y
 +CONFIG_MODULES=y
 +CONFIG_MODULE_UNLOAD=y
 +CONFIG_MODULE_FORCE_UNLOAD=y
 +CONFIG_MODVERSIONS=y
 +# CONFIG_BLK_DEV_BSG is not set
 +CONFIG_ARCH_VEXPRESS=y
 +CONFIG_ARCH_ZYNQ=y
 +CONFIG_PL310_ERRATA_588369=y
 +CONFIG_PL310_ERRATA_727915=y
 +CONFIG_PL310_ERRATA_769419=y
 +CONFIG_ARM_ERRATA_754322=y
 +CONFIG_ARM_ERRATA_754327=y
 +CONFIG_ARM_ERRATA_764369=y
 +CONFIG_ARM_ERRATA_775420=y
 +CONFIG_PCI=y
 +CONFIG_PCI_MSI=y
 +CONFIG_PCI_REALLOC_ENABLE_AUTO=y
 +CONFIG_PCIE_XILINX=y
 +CONFIG_SMP=y
 +CONFIG_SCHED_MC=y
 +CONFIG_SCHED_SMT=y
 +CONFIG_PREEMPT=y
 +CONFIG_AEABI=y
 +CONFIG_HIGHMEM=y
 +# CONFIG_COMPACTION is not set
 +CONFIG_CMA=y
 +CONFIG_ZBOOT_ROM_TEXT=0x0
 +CONFIG_ZBOOT_ROM_BSS=0x0
 +CONFIG_CPU_FREQ=y
 +CONFIG_CPU_FREQ_STAT_DETAILS=y
 +CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
 +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
 +CONFIG_CPU_FREQ_GOV_POWERSAVE=y
 +CONFIG_CPU_FREQ_GOV_ONDEMAND=y
 +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
 +CONFIG_CPU_IDLE=y
 +CONFIG_ARM_ZYNQ_CPUIDLE=y
 +CONFIG_VFP=y
 +CONFIG_NEON=y
 +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
 +CONFIG_NET=y
 +CONFIG_PACKET=y
 +CONFIG_UNIX=y
 +CONFIG_INET=y
 +CONFIG_IP_MULTICAST=y
 +CONFIG_IP_PNP=y
 +CONFIG_IP_PNP_DHCP=y
 +CONFIG_IP_PNP_BOOTP=y
 +CONFIG_IP_PNP_RARP=y
 +CONFIG_NET_IPIP=m
 +CONFIG_VLAN_8021Q=m
 +CONFIG_CAN=y
 +CONFIG_CAN_XILINXCAN=y
 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 +CONFIG_DEVTMPFS=y
 +CONFIG_DEVTMPFS_MOUNT=y
 +CONFIG_DMA_CMA=y
 +CONFIG_CONNECTOR=y
 +CONFIG_MTD=y
 +CONFIG_MTD_CMDLINE_PARTS=y
 +CONFIG_MTD_BLOCK=y
 +CONFIG_MTD_CFI=y
 +CONFIG_MTD_CFI_AMDSTD=y
 +CONFIG_MTD_PHYSMAP=y
 +CONFIG_MTD_PHYSMAP_OF=y
 +CONFIG_MTD_M25P80=y
 +CONFIG_MTD_NAND=y
 +CONFIG_MTD_NAND_PL35X=y
 +CONFIG_MTD_SPI_NOR=y
 +CONFIG_BLK_DEV_LOOP=y
 +CONFIG_BLK_DEV_RAM=y
 +CONFIG_BLK_DEV_RAM_SIZE=16384
 +CONFIG_SRAM=y
 +CONFIG_XILINX_TRAFGEN=y
 +CONFIG_EEPROM_AT24=y
 +CONFIG_EEPROM_AT25=y
 +CONFIG_SCSI=y
 +CONFIG_BLK_DEV_SD=y
 +CONFIG_CHR_DEV_SG=y
 +CONFIG_NETDEVICES=y
 +CONFIG_MACB=y
 +# CONFIG_NET_VENDOR_CIRRUS is not set
 +# CONFIG_NET_VENDOR_FARADAY is not set
 +CONFIG_E1000E=y
 +# CONFIG_NET_VENDOR_MARVELL is not set
 +# CONFIG_NET_VENDOR_MICREL is not set
 +# CONFIG_NET_VENDOR_MICROCHIP is not set
 +# CONFIG_NET_VENDOR_NATSEMI is not set
 +CONFIG_R8169=y
 +# CONFIG_NET_VENDOR_SEEQ is not set
 +# CONFIG_NET_VENDOR_SMSC is not set
 +# CONFIG_NET_VENDOR_STMICRO is not set
 +# CONFIG_NET_VENDOR_VIA is not set
 +# CONFIG_NET_VENDOR_WIZNET is not set
 +CONFIG_XILINX_EMACLITE=y
 +CONFIG_XILINX_AXI_EMAC=y
 +CONFIG_XILINX_PS_EMAC=y
 +CONFIG_MARVELL_PHY=y
 +CONFIG_VITESSE_PHY=y
 +CONFIG_REALTEK_PHY=y
 +CONFIG_MDIO_BITBANG=y
 +CONFIG_INPUT_SPARSEKMAP=y
 +CONFIG_INPUT_EVDEV=y
 +CONFIG_KEYBOARD_GPIO=y
 +CONFIG_KEYBOARD_GPIO_POLLED=y
 +# CONFIG_LEGACY_PTYS is not set
 +# CONFIG_DEVKMEM is not set
 +CONFIG_SERIAL_XILINX_PS_UART=y
 +CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
 +# CONFIG_HW_RANDOM is not set
 +CONFIG_XILINX_DEVCFG=y
 +CONFIG_I2C_CHARDEV=y
 +CONFIG_I2C_MUX=y
 +CONFIG_I2C_MUX_PCA954x=y
 +CONFIG_I2C_CADENCE=y
 +CONFIG_SPI=y
 +CONFIG_SPI_CADENCE=y
 +CONFIG_SPI_XILINX=y
 +CONFIG_SPI_ZYNQ_QSPI=y
 +CONFIG_GPIO_SYSFS=y
 +CONFIG_GPIO_ZYNQ=y
 +CONFIG_PMBUS=y
 +CONFIG_SENSORS_UCD9000=y
 +CONFIG_SENSORS_UCD9200=y
 +CONFIG_THERMAL=y
 +CONFIG_CPU_THERMAL=y
 +CONFIG_WATCHDOG=y
 +CONFIG_XILINX_WATCHDOG=y
 +CONFIG_CADENCE_WATCHDOG=y
 +CONFIG_REGULATOR=y
 +CONFIG_MEDIA_SUPPORT=y
 +CONFIG_MEDIA_CAMERA_SUPPORT=y
 +CONFIG_MEDIA_CONTROLLER=y
 +CONFIG_VIDEO_V4L2_SUBDEV_API=y
 +CONFIG_V4L_PLATFORM_DRIVERS=y
 +CONFIG_VIDEO_XILINX=y
 +CONFIG_VIDEO_XILINX_CFA=y
 +CONFIG_VIDEO_XILINX_CRESAMPLE=y
 +CONFIG_VIDEO_XILINX_REMAPPER=y
 +CONFIG_VIDEO_XILINX_RGB2YUV=y
 +CONFIG_VIDEO_XILINX_SCALER=y
 +CONFIG_VIDEO_XILINX_SWITCH=y
 +CONFIG_VIDEO_XILINX_TPG=y
 +# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
 +CONFIG_VIDEO_ADV7604=y
 +# CONFIG_DVB_TUNER_DIB0070 is not set
 +# CONFIG_DVB_TUNER_DIB0090 is not set
 +CONFIG_DRM=y
 +CONFIG_DRM_XILINX=y
 +CONFIG_FRAMEBUFFER_CONSOLE=y
 +CONFIG_SOUND=y
 +CONFIG_SND=y
 +CONFIG_SND_SOC=y
 +CONFIG_SND_SOC_ADI=y
 +CONFIG_SND_SOC_ADI_AXI_I2S=y
 +CONFIG_SND_SOC_ADI_AXI_SPDIF=y
 +CONFIG_HID_MICROSOFT=y
 +CONFIG_USB=y
 +CONFIG_USB_EHCI_HCD=y
 +# CONFIG_USB_EHCI_TT_NEWSCHED is not set
 +CONFIG_USB_STORAGE=y
 +CONFIG_USB_CHIPIDEA=y
 +CONFIG_USB_CHIPIDEA_UDC=y
 +CONFIG_USB_CHIPIDEA_HOST=y
 +CONFIG_NOP_USB_XCEIV=y
 +CONFIG_USB_ULPI=y
 +CONFIG_USB_GADGET=y
 +CONFIG_USB_GADGET_XILINX=y
 +CONFIG_USB_CONFIGFS=m
 +CONFIG_USB_CONFIGFS_MASS_STORAGE=y
 +CONFIG_USB_ZERO=m
 +CONFIG_MMC=y
 +CONFIG_MMC_SDHCI=y
 +CONFIG_MMC_SDHCI_PLTFM=y
 +CONFIG_MMC_SDHCI_OF_ARASAN=y
 +CONFIG_NEW_LEDS=y
 +CONFIG_LEDS_CLASS=y
 +CONFIG_LEDS_GPIO=y
 +CONFIG_LEDS_TRIGGERS=y
 +CONFIG_LEDS_TRIGGER_TIMER=y
 +CONFIG_LEDS_TRIGGER_ONESHOT=y
 +CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 +CONFIG_LEDS_TRIGGER_BACKLIGHT=y
 +CONFIG_LEDS_TRIGGER_CPU=y
 +CONFIG_LEDS_TRIGGER_GPIO=y
 +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
 +CONFIG_LEDS_TRIGGER_TRANSIENT=y
 +CONFIG_LEDS_TRIGGER_CAMERA=y
 +CONFIG_EDAC=y
 +CONFIG_EDAC_MM_EDAC=y
 +CONFIG_EDAC_SYNOPSYS=y
 +CONFIG_RTC_CLASS=y
 +CONFIG_RTC_DRV_PCF8563=y
 +CONFIG_DMADEVICES=y
 +CONFIG_PL330_DMA=y
 +CONFIG_XILINX_DMA_ENGINES=y
 +CONFIG_UIO=y
 +CONFIG_UIO_PDRV_GENIRQ=y
 +CONFIG_UIO_XILINX_APM=y
 +CONFIG_COMMON_CLK_SI570=y
 +CONFIG_MEMORY=y
 +CONFIG_IIO=y
 +CONFIG_XILINX_XADC=y
 +CONFIG_EXT2_FS=y
 +CONFIG_EXT3_FS=y
 +# CONFIG_DNOTIFY is not set
 +CONFIG_MSDOS_FS=y
 +CONFIG_VFAT_FS=y
 +CONFIG_TMPFS=y
 +CONFIG_JFFS2_FS=y
 +CONFIG_JFFS2_SUMMARY=y
 +CONFIG_NFS_FS=y
 +CONFIG_ROOT_NFS=y
 +CONFIG_NLS_CODEPAGE_437=y
 +CONFIG_NLS_ASCII=y
 +CONFIG_NLS_ISO8859_1=y
 +# CONFIG_SCHED_DEBUG is not set
 +CONFIG_TIMER_STATS=y
 +# CONFIG_DEBUG_PREEMPT is not set
 +CONFIG_RCU_CPU_STALL_TIMEOUT=60
 +# CONFIG_FTRACE is not set
 +CONFIG_FONTS=y
 +CONFIG_FONT_8x8=y
 +CONFIG_FONT_8x16=y
Simple merge
Simple merge
Simple merge
index 03489a866e5d3738e836d4bd734ef10ba3b46c9c,e595f22e7e4b67521c5e1720ea0fafeb7273a1c0..8b89d91b7112cbbd95b10664ae3ce3a242512071
                        compatible = "xlnx,zynqmp-gpio-1.0";
                        status = "disabled";
                        #gpio-cells = <0x2>;
-                       #interrupt-cells = <2>;
-                       interrupt-controller;
                        interrupt-parent = <&gic>;
                        interrupts = <0 16 4>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
                        reg = <0x0 0xff0a0000 0x1000>;
 +                      power-domains = <&pd_gpio>;
                };
  
                i2c0: i2c@ff020000 {
index 0305d715b8a8ee634076e26b4228cc6a99f33707,0000000000000000000000000000000000000000..974ee3946fd497b2750e88e9393b595637d941ca
mode 100644,000000..100644
--- /dev/null
@@@ -1,284 -1,0 +1,274 @@@
- CONFIG_FHANDLE=y
 +CONFIG_SYSVIPC=y
 +CONFIG_POSIX_MQUEUE=y
- CONFIG_AUDITSYSCALL=y
 +CONFIG_AUDIT=y
- CONFIG_PCI_XILINX_NWL=y
 +CONFIG_NO_HZ=y
 +CONFIG_HIGH_RES_TIMERS=y
 +CONFIG_BSD_PROCESS_ACCT=y
 +CONFIG_TASKSTATS=y
 +CONFIG_TASK_DELAY_ACCT=y
 +CONFIG_TASK_XACCT=y
 +CONFIG_TASK_IO_ACCOUNTING=y
 +CONFIG_IKCONFIG=y
 +CONFIG_IKCONFIG_PROC=y
 +CONFIG_LOG_BUF_SHIFT=16
 +CONFIG_CGROUPS=y
 +CONFIG_BLK_DEV_INITRD=y
 +CONFIG_EMBEDDED=y
 +# CONFIG_COMPAT_BRK is not set
 +CONFIG_SLAB=y
 +CONFIG_PROFILING=y
 +CONFIG_MODULES=y
 +CONFIG_MODULE_UNLOAD=y
 +CONFIG_ARCH_ZYNQMP=y
 +CONFIG_PCI=y
 +CONFIG_PCI_MSI=y
- # CONFIG_INET_LRO is not set
++CONFIG_PCIE_XILINX_NWL=y
 +CONFIG_NR_CPUS=8
 +CONFIG_HOTPLUG_CPU=y
 +CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
 +CONFIG_TRANSPARENT_HUGEPAGE=y
 +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
 +CONFIG_CMA=y
 +CONFIG_COMPAT=y
 +# CONFIG_SUSPEND is not set
 +CONFIG_NET=y
 +CONFIG_PACKET=y
 +CONFIG_UNIX=y
 +CONFIG_XFRM_USER=y
 +CONFIG_NET_KEY=y
 +CONFIG_NET_KEY_MIGRATE=y
 +CONFIG_INET=y
 +CONFIG_IP_MULTICAST=y
 +CONFIG_IP_PNP=y
 +CONFIG_IP_PNP_DHCP=y
 +CONFIG_IP_PNP_BOOTP=y
 +CONFIG_IP_PNP_RARP=y
 +CONFIG_SYN_COOKIES=y
- CONFIG_XILINX_AXIDMA=y
- CONFIG_XILINX_DMATEST=y
- CONFIG_XILINX_VDMATEST=y
- CONFIG_XILINX_AXICDMA=y
- CONFIG_XILINX_CDMATEST=y
 +CONFIG_NETWORK_SECMARK=y
 +CONFIG_NETFILTER=y
 +CONFIG_NETFILTER_NETLINK_LOG=m
 +CONFIG_NF_CONNTRACK=m
 +CONFIG_NF_CT_NETLINK=m
 +CONFIG_NETFILTER_XT_MARK=m
 +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
 +CONFIG_NETFILTER_XT_TARGET_LOG=m
 +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m
 +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
 +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
 +CONFIG_NETFILTER_XT_MATCH_LIMIT=m
 +CONFIG_NETFILTER_XT_MATCH_MAC=m
 +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
 +CONFIG_NETFILTER_XT_MATCH_STATE=m
 +CONFIG_NF_CONNTRACK_IPV4=m
 +CONFIG_NF_NAT_IPV4=m
 +CONFIG_IP_NF_IPTABLES=m
 +CONFIG_IP_NF_FILTER=m
 +CONFIG_IP_NF_TARGET_REJECT=m
 +CONFIG_IP_NF_MANGLE=m
 +CONFIG_NF_CONNTRACK_IPV6=m
 +CONFIG_NF_NAT_IPV6=m
 +CONFIG_IP6_NF_IPTABLES=m
 +CONFIG_IP6_NF_FILTER=m
 +CONFIG_IP6_NF_TARGET_REJECT=m
 +CONFIG_IP6_NF_MANGLE=m
 +CONFIG_BRIDGE_NF_EBTABLES=m
 +CONFIG_BRIDGE_EBT_T_FILTER=m
 +CONFIG_BRIDGE_EBT_T_NAT=m
 +CONFIG_BRIDGE_EBT_MARK_T=m
 +CONFIG_BRIDGE=m
 +CONFIG_NET_PKTGEN=y
 +CONFIG_CAN=y
 +CONFIG_CAN_XILINXCAN=y
 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 +CONFIG_DEVTMPFS=y
 +CONFIG_DEVTMPFS_MOUNT=y
 +CONFIG_DMA_CMA=y
 +CONFIG_CMA_SIZE_MBYTES=128
 +CONFIG_ARM_CCI400_PMU=y
 +CONFIG_CONNECTOR=y
 +CONFIG_MTD=y
 +CONFIG_MTD_TESTS=m
 +CONFIG_MTD_CMDLINE_PARTS=y
 +CONFIG_MTD_BLOCK=y
 +CONFIG_MTD_OOPS=y
 +CONFIG_MTD_CFI=y
 +CONFIG_MTD_CFI_INTELEXT=y
 +CONFIG_MTD_M25P80=y
 +CONFIG_MTD_NAND=y
 +CONFIG_MTD_NAND_ARASAN=y
 +CONFIG_MTD_SPI_NOR=y
 +CONFIG_BLK_DEV_LOOP=y
 +CONFIG_BLK_DEV_RAM=y
 +CONFIG_BLK_DEV_RAM_SIZE=65536
 +CONFIG_XILINX_JESD204B=y
 +CONFIG_XILINX_JESD204B_PHY=y
 +CONFIG_EEPROM_AT24=y
 +CONFIG_EEPROM_AT25=y
 +CONFIG_BLK_DEV_SD=y
 +CONFIG_ATA=y
 +CONFIG_SATA_AHCI_PLATFORM=y
 +CONFIG_AHCI_CEVA=y
 +# CONFIG_ATA_SFF is not set
 +CONFIG_NETDEVICES=y
 +CONFIG_MACB=y
 +CONFIG_MACB_EXT_BD=y
 +CONFIG_XILINX_EMACLITE=y
 +CONFIG_XILINX_AXI_EMAC=y
 +CONFIG_AT803X_PHY=y
 +CONFIG_AMD_PHY=y
 +CONFIG_MARVELL_PHY=y
 +CONFIG_DAVICOM_PHY=y
 +CONFIG_QSEMI_PHY=y
 +CONFIG_LXT_PHY=y
 +CONFIG_CICADA_PHY=y
 +CONFIG_VITESSE_PHY=y
 +CONFIG_SMSC_PHY=y
 +CONFIG_BROADCOM_PHY=y
 +CONFIG_BCM7XXX_PHY=y
 +CONFIG_BCM87XX_PHY=y
 +CONFIG_ICPLUS_PHY=y
 +CONFIG_REALTEK_PHY=y
 +CONFIG_NATIONAL_PHY=y
 +CONFIG_STE10XP=y
 +CONFIG_LSI_ET1011C_PHY=y
 +CONFIG_MICREL_PHY=y
 +CONFIG_DP83867_PHY=y
 +CONFIG_FIXED_PHY=y
 +CONFIG_INPUT_EVDEV=y
 +# CONFIG_DEVKMEM is not set
 +CONFIG_SERIAL_8250=y
 +CONFIG_SERIAL_8250_CONSOLE=y
 +CONFIG_SERIAL_UARTLITE=y
 +CONFIG_SERIAL_UARTLITE_CONSOLE=y
 +CONFIG_SERIAL_XILINX_PS_UART=y
 +CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
 +# CONFIG_HW_RANDOM is not set
 +CONFIG_I2C_MUX_PCA9541=y
 +CONFIG_I2C_MUX_PCA954x=y
 +CONFIG_I2C_CADENCE=y
 +CONFIG_I2C_XILINX=y
 +CONFIG_SPI=y
 +CONFIG_SPI_CADENCE=y
 +CONFIG_SPI_XILINX=y
 +CONFIG_SPI_ZYNQMP_GQSPI=y
 +CONFIG_GPIOLIB=y
 +CONFIG_GPIO_SYSFS=y
 +CONFIG_GPIO_XILINX=y
 +CONFIG_GPIO_ZYNQ=y
 +CONFIG_GPIO_PCA953X=y
 +CONFIG_PMBUS=y
 +CONFIG_SENSORS_MAX20751=y
 +CONFIG_SENSORS_INA2XX=y
 +CONFIG_WATCHDOG=y
 +CONFIG_XILINX_WATCHDOG=y
 +CONFIG_CADENCE_WATCHDOG=y
 +CONFIG_MEDIA_SUPPORT=y
 +CONFIG_MEDIA_CAMERA_SUPPORT=y
 +CONFIG_MEDIA_CONTROLLER=y
 +CONFIG_VIDEO_V4L2_SUBDEV_API=y
 +CONFIG_V4L_PLATFORM_DRIVERS=y
 +CONFIG_VIDEO_XILINX=y
 +CONFIG_VIDEO_XILINX_CFA=y
 +CONFIG_VIDEO_XILINX_CRESAMPLE=y
 +CONFIG_VIDEO_XILINX_HLS=y
 +CONFIG_VIDEO_XILINX_REMAPPER=y
 +CONFIG_VIDEO_XILINX_RGB2YUV=y
 +CONFIG_VIDEO_XILINX_SCALER=y
 +CONFIG_VIDEO_XILINX_SWITCH=y
 +CONFIG_VIDEO_XILINX_TPG=y
 +# CONFIG_VGA_ARB is not set
 +CONFIG_DRM=y
 +CONFIG_DRM_XILINX=y
 +CONFIG_FB_XILINX=y
 +CONFIG_FRAMEBUFFER_CONSOLE=y
 +CONFIG_SOUND=y
 +CONFIG_SND=y
 +# CONFIG_SND_DRIVERS is not set
 +# CONFIG_SND_PCI is not set
 +CONFIG_SND_SOC=y
 +CONFIG_SND_SOC_XILINX_DP=y
 +CONFIG_USB=y
 +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
 +# CONFIG_USB_DEFAULT_PERSIST is not set
 +CONFIG_USB_XHCI_HCD=y
 +CONFIG_USB_STORAGE=y
 +CONFIG_USB_UAS=y
 +CONFIG_USB_DWC3=y
 +CONFIG_USB_GADGET=y
 +CONFIG_USB_GADGET_XILINX=y
 +CONFIG_USB_CONFIGFS=m
 +CONFIG_USB_MASS_STORAGE=m
 +CONFIG_MMC=y
 +CONFIG_MMC_SDHCI=y
 +CONFIG_MMC_SDHCI_PLTFM=y
 +CONFIG_MMC_SDHCI_OF_ARASAN=y
 +CONFIG_NEW_LEDS=y
 +CONFIG_LEDS_CLASS=y
 +CONFIG_LEDS_GPIO=y
 +CONFIG_LEDS_TRIGGERS=y
 +CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 +CONFIG_LEDS_TRIGGER_GPIO=y
 +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
 +CONFIG_EDAC=y
 +CONFIG_EDAC_MM_EDAC=y
 +CONFIG_EDAC_SYNOPSYS=y
 +CONFIG_EDAC_ZYNQMP_OCM=y
 +CONFIG_EDAC_CORTEX_ARM64=y
 +CONFIG_RTC_CLASS=y
 +CONFIG_RTC_DRV_ZYNQMP=y
 +CONFIG_DMADEVICES=y
 +CONFIG_XILINX_DMA_ENGINES=y
- CONFIG_XILINX_ZYNQMP_DMATEST=y
- CONFIG_XILINX_VDMA=y
 +CONFIG_XILINX_DPDMA=y
 +CONFIG_XILINX_ZYNQMP_DMA=y
 +CONFIG_DMATEST=y
 +CONFIG_UIO=y
 +CONFIG_UIO_PDRV_GENIRQ=m
 +CONFIG_UIO_DMEM_GENIRQ=m
 +CONFIG_UIO_XILINX_APM=y
 +CONFIG_STAGING=y
 +CONFIG_COMMON_CLK_SI570=y
 +# CONFIG_COMMON_CLK_XGENE is not set
 +CONFIG_ARM_SMMU=y
 +CONFIG_SOC_XILINX_ZYNQMP=y
 +CONFIG_ZYNQMP_PM_API=y
 +CONFIG_IIO=y
 +CONFIG_XILINX_XADC=y
 +CONFIG_XILINX_INTC=y
 +CONFIG_PHY_XILINX_ZYNQMP=y
 +CONFIG_EXT2_FS=y
 +CONFIG_EXT3_FS=y
 +CONFIG_EXT4_FS_POSIX_ACL=y
 +CONFIG_EXT4_FS_SECURITY=y
 +CONFIG_BTRFS_FS=y
 +CONFIG_QUOTA=y
 +CONFIG_QFMT_V2=y
 +CONFIG_AUTOFS4_FS=y
 +CONFIG_MSDOS_FS=y
 +CONFIG_VFAT_FS=y
 +CONFIG_TMPFS=y
 +CONFIG_TMPFS_POSIX_ACL=y
 +CONFIG_HUGETLBFS=y
 +CONFIG_ECRYPT_FS=y
 +CONFIG_JFFS2_FS=y
 +CONFIG_JFFS2_SUMMARY=y
 +CONFIG_JFFS2_FS_XATTR=y
 +CONFIG_JFFS2_COMPRESSION_OPTIONS=y
 +CONFIG_JFFS2_LZO=y
 +CONFIG_JFFS2_RUBIN=y
 +CONFIG_CRAMFS=y
 +CONFIG_NFS_FS=y
 +CONFIG_NFS_V3_ACL=y
 +CONFIG_NFS_V4=y
 +CONFIG_NFS_V4_1=y
 +CONFIG_NFS_V4_2=y
 +CONFIG_ROOT_NFS=y
 +CONFIG_NLS_CODEPAGE_437=y
 +CONFIG_NLS_ISO8859_1=y
 +CONFIG_PRINTK_TIME=y
 +CONFIG_DEBUG_INFO=y
 +CONFIG_MAGIC_SYSRQ=y
 +# CONFIG_SCHED_DEBUG is not set
 +# CONFIG_FTRACE is not set
 +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
 +CONFIG_CRYPTO_CRCT10DIF=y
 +# CONFIG_CRYPTO_HW is not set
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index c5eff87e75a1fae660cd2d74c778a62a8c52b5e3,0000000000000000000000000000000000000000..b18d51f7f38ceec7f5cb79ed89d666189c4bb6d8
mode 100644,000000..100644
--- /dev/null
@@@ -1,1151 -1,0 +1,1150 @@@
 +/*
 + * DMA driver for Xilinx ZynqMP DMA Engine
 + *
 + * Copyright (C) 2016 Xilinx, Inc. All rights reserved.
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 2 of the License, or
 + * (at your option) any later version.
 + */
 +
 +#include <linux/bitops.h>
 +#include <linux/dmapool.h>
 +#include <linux/dma/xilinx_dma.h>
 +#include <linux/init.h>
 +#include <linux/interrupt.h>
 +#include <linux/io.h>
 +#include <linux/module.h>
 +#include <linux/of_address.h>
 +#include <linux/of_dma.h>
 +#include <linux/of_irq.h>
 +#include <linux/of_platform.h>
 +#include <linux/slab.h>
 +#include <linux/clk.h>
 +#include <linux/io-64-nonatomic-lo-hi.h>
 +
 +#include "../dmaengine.h"
 +
 +/* Register Offsets */
 +#define ZYNQMP_DMA_ISR                        0x100
 +#define ZYNQMP_DMA_IMR                        0x104
 +#define ZYNQMP_DMA_IER                        0x108
 +#define ZYNQMP_DMA_IDS                        0x10C
 +#define ZYNQMP_DMA_CTRL0              0x110
 +#define ZYNQMP_DMA_CTRL1              0x114
 +#define ZYNQMP_DMA_DATA_ATTR          0x120
 +#define ZYNQMP_DMA_DSCR_ATTR          0x124
 +#define ZYNQMP_DMA_SRC_DSCR_WRD0      0x128
 +#define ZYNQMP_DMA_SRC_DSCR_WRD1      0x12C
 +#define ZYNQMP_DMA_SRC_DSCR_WRD2      0x130
 +#define ZYNQMP_DMA_SRC_DSCR_WRD3      0x134
 +#define ZYNQMP_DMA_DST_DSCR_WRD0      0x138
 +#define ZYNQMP_DMA_DST_DSCR_WRD1      0x13C
 +#define ZYNQMP_DMA_DST_DSCR_WRD2      0x140
 +#define ZYNQMP_DMA_DST_DSCR_WRD3      0x144
 +#define ZYNQMP_DMA_SRC_START_LSB      0x158
 +#define ZYNQMP_DMA_SRC_START_MSB      0x15C
 +#define ZYNQMP_DMA_DST_START_LSB      0x160
 +#define ZYNQMP_DMA_DST_START_MSB      0x164
 +#define ZYNQMP_DMA_RATE_CTRL          0x18C
 +#define ZYNQMP_DMA_IRQ_SRC_ACCT               0x190
 +#define ZYNQMP_DMA_IRQ_DST_ACCT               0x194
 +#define ZYNQMP_DMA_CTRL2              0x200
 +
 +/* Interrupt registers bit field definitions */
 +#define ZYNQMP_DMA_DONE                       BIT(10)
 +#define ZYNQMP_DMA_AXI_WR_DATA                BIT(9)
 +#define ZYNQMP_DMA_AXI_RD_DATA                BIT(8)
 +#define ZYNQMP_DMA_AXI_RD_DST_DSCR    BIT(7)
 +#define ZYNQMP_DMA_AXI_RD_SRC_DSCR    BIT(6)
 +#define ZYNQMP_DMA_IRQ_DST_ACCT_ERR   BIT(5)
 +#define ZYNQMP_DMA_IRQ_SRC_ACCT_ERR   BIT(4)
 +#define ZYNQMP_DMA_BYTE_CNT_OVRFL     BIT(3)
 +#define ZYNQMP_DMA_DST_DSCR_DONE      BIT(2)
 +#define ZYNQMP_DMA_INV_APB            BIT(0)
 +
 +/* Control 0 register bit field definitions */
 +#define ZYNQMP_DMA_OVR_FETCH          BIT(7)
 +#define ZYNQMP_DMA_POINT_TYPE_SG      BIT(6)
 +#define ZYNQMP_DMA_RATE_CTRL_EN               BIT(3)
 +
 +/* Control 1 register bit field definitions */
 +#define ZYNQMP_DMA_SRC_ISSUE          GENMASK(4, 0)
 +
 +/* Data Attribute register bit field definitions */
 +#define ZYNQMP_DMA_ARBURST            GENMASK(27, 26)
 +#define ZYNQMP_DMA_ARCACHE            GENMASK(25, 22)
 +#define ZYNQMP_DMA_ARCACHE_OFST               22
 +#define ZYNQMP_DMA_ARQOS              GENMASK(21, 18)
 +#define ZYNQMP_DMA_ARQOS_OFST         18
 +#define ZYNQMP_DMA_ARLEN              GENMASK(17, 14)
 +#define ZYNQMP_DMA_ARLEN_OFST         14
 +#define ZYNQMP_DMA_AWBURST            GENMASK(13, 12)
 +#define ZYNQMP_DMA_AWCACHE            GENMASK(11, 8)
 +#define ZYNQMP_DMA_AWCACHE_OFST               8
 +#define ZYNQMP_DMA_AWQOS              GENMASK(7, 4)
 +#define ZYNQMP_DMA_AWQOS_OFST         4
 +#define ZYNQMP_DMA_AWLEN              GENMASK(3, 0)
 +#define ZYNQMP_DMA_AWLEN_OFST         0
 +
 +/* Descriptor Attribute register bit field definitions */
 +#define ZYNQMP_DMA_AXCOHRNT           BIT(8)
 +#define ZYNQMP_DMA_AXCACHE            GENMASK(7, 4)
 +#define ZYNQMP_DMA_AXCACHE_OFST               4
 +#define ZYNQMP_DMA_AXQOS              GENMASK(3, 0)
 +#define ZYNQMP_DMA_AXQOS_OFST         0
 +
 +/* Control register 2 bit field definitions */
 +#define ZYNQMP_DMA_ENABLE             BIT(0)
 +
 +/* Buffer Descriptor definitions */
 +#define ZYNQMP_DMA_DESC_CTRL_STOP     0x10
 +#define ZYNQMP_DMA_DESC_CTRL_COMP_INT 0x4
 +#define ZYNQMP_DMA_DESC_CTRL_SIZE_256 0x2
 +#define ZYNQMP_DMA_DESC_CTRL_COHRNT   0x1
 +
 +/* Interrupt Mask specific definitions */
 +#define ZYNQMP_DMA_INT_ERR    (ZYNQMP_DMA_AXI_RD_DATA | \
 +                              ZYNQMP_DMA_AXI_WR_DATA | \
 +                              ZYNQMP_DMA_AXI_RD_DST_DSCR | \
 +                              ZYNQMP_DMA_AXI_RD_SRC_DSCR | \
 +                              ZYNQMP_DMA_INV_APB)
 +#define ZYNQMP_DMA_INT_OVRFL  (ZYNQMP_DMA_BYTE_CNT_OVRFL | \
 +                              ZYNQMP_DMA_IRQ_SRC_ACCT_ERR | \
 +                              ZYNQMP_DMA_IRQ_DST_ACCT_ERR)
 +#define ZYNQMP_DMA_INT_DONE   (ZYNQMP_DMA_DONE | ZYNQMP_DMA_DST_DSCR_DONE)
 +#define ZYNQMP_DMA_INT_EN_DEFAULT_MASK        (ZYNQMP_DMA_INT_DONE | \
 +                                      ZYNQMP_DMA_INT_ERR | \
 +                                      ZYNQMP_DMA_INT_OVRFL | \
 +                                      ZYNQMP_DMA_DST_DSCR_DONE)
 +
 +/* Max number of descriptors per channel */
 +#define ZYNQMP_DMA_NUM_DESCS  32
 +
 +/* Max transfer size per descriptor */
 +#define ZYNQMP_DMA_MAX_TRANS_LEN      0x40000000
 +
 +/* Reset values for data attributes */
 +#define ZYNQMP_DMA_AXCACHE_VAL                0xF
 +#define ZYNQMP_DMA_ARLEN_RST_VAL      0xF
 +#define ZYNQMP_DMA_AWLEN_RST_VAL      0xF
 +
 +#define ZYNQMP_DMA_SRC_ISSUE_RST_VAL  0x1F
 +
 +#define ZYNQMP_DMA_IDS_DEFAULT_MASK   0xFFF
 +
 +/* Bus width in bits */
 +#define ZYNQMP_DMA_BUS_WIDTH_64               64
 +#define ZYNQMP_DMA_BUS_WIDTH_128      128
 +
 +#define ZYNQMP_DMA_DESC_SIZE(chan)    (chan->desc_size)
 +
 +#define to_chan(chan)         container_of(chan, struct zynqmp_dma_chan, \
 +                                           common)
 +#define tx_to_desc(tx)                container_of(tx, struct zynqmp_dma_desc_sw, \
 +                                           async_tx)
 +
 +/**
 + * struct zynqmp_dma_desc_ll - Hw linked list descriptor
 + * @addr: Buffer address
 + * @size: Size of the buffer
 + * @ctrl: Control word
 + * @nxtdscraddr: Next descriptor base address
 + * @rsvd: Reserved field and for Hw internal use.
 + */
 +struct zynqmp_dma_desc_ll {
 +      u64 addr;
 +      u32 size;
 +      u32 ctrl;
 +      u64 nxtdscraddr;
 +      u64 rsvd;
 +}; __aligned(64)
 +
 +/**
 + * struct zynqmp_dma_desc_sw - Per Transaction structure
 + * @src: Source address for simple mode dma
 + * @dst: Destination address for simple mode dma
 + * @len: Transfer length for simple mode dma
 + * @node: Node in the channel descriptor list
 + * @tx_list: List head for the current transfer
 + * @async_tx: Async transaction descriptor
 + * @src_v: Virtual address of the src descriptor
 + * @src_p: Physical address of the src descriptor
 + * @dst_v: Virtual address of the dst descriptor
 + * @dst_p: Physical address of the dst descriptor
 + */
 +struct zynqmp_dma_desc_sw {
 +      u64 src;
 +      u64 dst;
 +      u32 len;
 +      struct list_head node;
 +      struct list_head tx_list;
 +      struct dma_async_tx_descriptor async_tx;
 +      struct zynqmp_dma_desc_ll *src_v;
 +      dma_addr_t src_p;
 +      struct zynqmp_dma_desc_ll *dst_v;
 +      dma_addr_t dst_p;
 +};
 +
 +/**
 + * struct zynqmp_dma_chan - Driver specific DMA channel structure
 + * @zdev: Driver specific device structure
 + * @regs: Control registers offset
 + * @lock: Descriptor operation lock
 + * @pending_list: Descriptors waiting
 + * @free_list: Descriptors free
 + * @active_list: Descriptors active
 + * @sw_desc_pool: SW descriptor pool
 + * @done_list: Complete descriptors
 + * @common: DMA common channel
 + * @desc_pool_v: Statically allocated descriptor base
 + * @desc_pool_p: Physical allocated descriptor base
 + * @desc_free_cnt: Descriptor available count
 + * @dev: The dma device
 + * @irq: Channel IRQ
 + * @is_dmacoherent: Tells whether dma operations are coherent or not
 + * @tasklet: Cleanup work after irq
 + * @idle : Channel status;
 + * @desc_size: Size of the low level descriptor
 + * @err: Channel has errors
 + * @bus_width: Bus width
 + * @src_burst_len: Source burst length
 + * @dst_burst_len: Dest burst length
 + * @clk_main: Pointer to main clock
 + * @clk_apb: Pointer to apb clock
 + */
 +struct zynqmp_dma_chan {
 +      struct zynqmp_dma_device *zdev;
 +      void __iomem *regs;
 +      spinlock_t lock;
 +      struct list_head pending_list;
 +      struct list_head free_list;
 +      struct list_head active_list;
 +      struct zynqmp_dma_desc_sw *sw_desc_pool;
 +      struct list_head done_list;
 +      struct dma_chan common;
 +      void *desc_pool_v;
 +      dma_addr_t desc_pool_p;
 +      u32 desc_free_cnt;
 +      struct device *dev;
 +      int irq;
 +      bool is_dmacoherent;
 +      struct tasklet_struct tasklet;
 +      bool idle;
 +      u32 desc_size;
 +      bool err;
 +      u32 bus_width;
 +      u32 src_burst_len;
 +      u32 dst_burst_len;
 +      struct clk *clk_main;
 +      struct clk *clk_apb;
 +};
 +
 +/**
 + * struct zynqmp_dma_device - DMA device structure
 + * @dev: Device Structure
 + * @common: DMA device structure
 + * @chan: Driver specific DMA channel
 + */
 +struct zynqmp_dma_device {
 +      struct device *dev;
 +      struct dma_device common;
 +      struct zynqmp_dma_chan *chan;
 +};
 +
 +static inline void zynqmp_dma_writeq(struct zynqmp_dma_chan *chan, u32 reg,
 +                                   u64 value)
 +{
 +      lo_hi_writeq(value, chan->regs + reg);
 +}
 +
 +/**
 + * zynqmp_dma_update_desc_to_ctrlr - Updates descriptor to the controller
 + * @chan: ZynqMP DMA DMA channel pointer
 + * @desc: Transaction descriptor pointer
 + */
 +static void zynqmp_dma_update_desc_to_ctrlr(struct zynqmp_dma_chan *chan,
 +                                    struct zynqmp_dma_desc_sw *desc)
 +{
 +      dma_addr_t addr;
 +
 +      addr = desc->src_p;
 +      zynqmp_dma_writeq(chan, ZYNQMP_DMA_SRC_START_LSB, addr);
 +      addr = desc->dst_p;
 +      zynqmp_dma_writeq(chan, ZYNQMP_DMA_DST_START_LSB, addr);
 +}
 +
 +/**
 + * zynqmp_dma_desc_config_eod - Mark the descriptor as end descriptor
 + * @chan: ZynqMP DMA channel pointer
 + * @desc: Hw descriptor pointer
 + */
 +static void zynqmp_dma_desc_config_eod(struct zynqmp_dma_chan *chan,
 +                                     void *desc)
 +{
 +      struct zynqmp_dma_desc_ll *hw = (struct zynqmp_dma_desc_ll *)desc;
 +
 +      hw->ctrl |= ZYNQMP_DMA_DESC_CTRL_STOP;
 +      hw++;
 +      hw->ctrl |= ZYNQMP_DMA_DESC_CTRL_COMP_INT | ZYNQMP_DMA_DESC_CTRL_STOP;
 +}
 +
 +/**
 + * zynqmp_dma_config_sg_ll_desc - Configure the linked list descriptor
 + * @chan: ZynqMP DMA channel pointer
 + * @sdesc: Hw descriptor pointer
 + * @src: Source buffer address
 + * @dst: Destination buffer address
 + * @len: Transfer length
 + * @prev: Previous hw descriptor pointer
 + */
 +static void zynqmp_dma_config_sg_ll_desc(struct zynqmp_dma_chan *chan,
 +                                 struct zynqmp_dma_desc_ll *sdesc,
 +                                 dma_addr_t src, dma_addr_t dst, size_t len,
 +                                 struct zynqmp_dma_desc_ll *prev)
 +{
 +      struct zynqmp_dma_desc_ll *ddesc = sdesc + 1;
 +
 +      sdesc->size = ddesc->size = len;
 +      sdesc->addr = src;
 +      ddesc->addr = dst;
 +
 +      sdesc->ctrl = ddesc->ctrl = ZYNQMP_DMA_DESC_CTRL_SIZE_256;
 +      if (chan->is_dmacoherent) {
 +              sdesc->ctrl |= ZYNQMP_DMA_DESC_CTRL_COHRNT;
 +              ddesc->ctrl |= ZYNQMP_DMA_DESC_CTRL_COHRNT;
 +      }
 +
 +      if (prev) {
 +              dma_addr_t addr = chan->desc_pool_p +
 +                          ((uintptr_t)sdesc - (uintptr_t)chan->desc_pool_v);
 +              ddesc = prev + 1;
 +              prev->nxtdscraddr = addr;
 +              ddesc->nxtdscraddr = addr + ZYNQMP_DMA_DESC_SIZE(chan);
 +      }
 +}
 +
 +/**
 + * zynqmp_dma_init - Initialize the channel
 + * @chan: ZynqMP DMA channel pointer
 + */
 +static void zynqmp_dma_init(struct zynqmp_dma_chan *chan)
 +{
 +      u32 val;
 +
 +      writel(ZYNQMP_DMA_IDS_DEFAULT_MASK, chan->regs + ZYNQMP_DMA_IDS);
 +      val = readl(chan->regs + ZYNQMP_DMA_ISR);
 +      writel(val, chan->regs + ZYNQMP_DMA_ISR);
 +
 +      if (chan->is_dmacoherent) {
 +              val = ZYNQMP_DMA_AXCOHRNT;
 +              val = (val & ~ZYNQMP_DMA_AXCACHE) |
 +                      (ZYNQMP_DMA_AXCACHE_VAL << ZYNQMP_DMA_AXCACHE_OFST);
 +              writel(val, chan->regs + ZYNQMP_DMA_DSCR_ATTR);
 +      }
 +
 +      val = readl(chan->regs + ZYNQMP_DMA_DATA_ATTR);
 +      if (chan->is_dmacoherent) {
 +              val = (val & ~ZYNQMP_DMA_ARCACHE) |
 +                      (ZYNQMP_DMA_AXCACHE_VAL << ZYNQMP_DMA_ARCACHE_OFST);
 +              val = (val & ~ZYNQMP_DMA_AWCACHE) |
 +                      (ZYNQMP_DMA_AXCACHE_VAL << ZYNQMP_DMA_AWCACHE_OFST);
 +      }
 +      writel(val, chan->regs + ZYNQMP_DMA_DATA_ATTR);
 +
 +      /* Clearing the interrupt account rgisters */
 +      val = readl(chan->regs + ZYNQMP_DMA_IRQ_SRC_ACCT);
 +      val = readl(chan->regs + ZYNQMP_DMA_IRQ_DST_ACCT);
 +
 +      chan->idle = true;
 +}
 +
 +/**
 + * zynqmp_dma_tx_submit - Submit DMA transaction
 + * @tx: Async transaction descriptor pointer
 + *
 + * Return: cookie value
 + */
 +static dma_cookie_t zynqmp_dma_tx_submit(struct dma_async_tx_descriptor *tx)
 +{
 +      struct zynqmp_dma_chan *chan = to_chan(tx->chan);
 +      struct zynqmp_dma_desc_sw *desc, *new;
 +      dma_cookie_t cookie;
 +
 +      new = tx_to_desc(tx);
 +      spin_lock_bh(&chan->lock);
 +      cookie = dma_cookie_assign(tx);
 +
 +      if (!list_empty(&chan->pending_list)) {
 +              desc = list_last_entry(&chan->pending_list,
 +                                   struct zynqmp_dma_desc_sw, node);
 +              if (!list_empty(&desc->tx_list))
 +                      desc = list_last_entry(&desc->tx_list,
 +                                             struct zynqmp_dma_desc_sw, node);
 +              desc->src_v->nxtdscraddr = new->src_p;
 +              desc->src_v->ctrl &= ~ZYNQMP_DMA_DESC_CTRL_STOP;
 +              desc->dst_v->nxtdscraddr = new->dst_p;
 +              desc->dst_v->ctrl &= ~ZYNQMP_DMA_DESC_CTRL_STOP;
 +      }
 +
 +      list_add_tail(&new->node, &chan->pending_list);
 +      spin_unlock_bh(&chan->lock);
 +
 +      return cookie;
 +}
 +
 +/**
 + * zynqmp_dma_get_descriptor - Get the sw descriptor from the pool
 + * @chan: ZynqMP DMA channel pointer
 + *
 + * Return: The sw descriptor
 + */
 +static struct zynqmp_dma_desc_sw *
 +zynqmp_dma_get_descriptor(struct zynqmp_dma_chan *chan)
 +{
 +      struct zynqmp_dma_desc_sw *desc;
 +
 +      spin_lock_bh(&chan->lock);
 +      desc = list_first_entry(&chan->free_list,
 +                              struct zynqmp_dma_desc_sw, node);
 +      list_del(&desc->node);
 +      spin_unlock_bh(&chan->lock);
 +
 +      INIT_LIST_HEAD(&desc->tx_list);
 +      /* Clear the src and dst descriptor memory */
 +      memset((void *)desc->src_v, 0, ZYNQMP_DMA_DESC_SIZE(chan));
 +      memset((void *)desc->dst_v, 0, ZYNQMP_DMA_DESC_SIZE(chan));
 +
 +      return desc;
 +}
 +
 +/**
 + * zynqmp_dma_free_descriptor - Issue pending transactions
 + * @chan: ZynqMP DMA channel pointer
 + * @sdesc: Transaction descriptor pointer
 + */
 +static void zynqmp_dma_free_descriptor(struct zynqmp_dma_chan *chan,
 +                               struct zynqmp_dma_desc_sw *sdesc)
 +{
 +      struct zynqmp_dma_desc_sw *child, *next;
 +
 +      chan->desc_free_cnt++;
 +      list_add_tail(&sdesc->node, &chan->free_list);
 +      list_for_each_entry_safe(child, next, &sdesc->tx_list, node) {
 +              chan->desc_free_cnt++;
 +              list_move_tail(&child->node, &chan->free_list);
 +      }
 +}
 +
 +/**
 + * zynqmp_dma_free_desc_list - Free descriptors list
 + * @chan: ZynqMP DMA channel pointer
 + * @list: List to parse and delete the descriptor
 + */
 +static void zynqmp_dma_free_desc_list(struct zynqmp_dma_chan *chan,
 +                                    struct list_head *list)
 +{
 +      struct zynqmp_dma_desc_sw *desc, *next;
 +
 +      list_for_each_entry_safe(desc, next, list, node)
 +              zynqmp_dma_free_descriptor(chan, desc);
 +}
 +
 +/**
 + * zynqmp_dma_alloc_chan_resources - Allocate channel resources
 + * @dchan: DMA channel
 + *
 + * Return: Number of descriptors on success and failure value on error
 + */
 +static int zynqmp_dma_alloc_chan_resources(struct dma_chan *dchan)
 +{
 +      struct zynqmp_dma_chan *chan = to_chan(dchan);
 +      struct zynqmp_dma_desc_sw *desc;
 +      int i;
 +
 +      chan->sw_desc_pool = kzalloc(sizeof(*desc) * ZYNQMP_DMA_NUM_DESCS,
 +                                   GFP_KERNEL);
 +      if (!chan->sw_desc_pool)
 +              return -ENOMEM;
 +
 +      chan->idle = true;
 +      chan->desc_free_cnt = ZYNQMP_DMA_NUM_DESCS;
 +
 +      INIT_LIST_HEAD(&chan->free_list);
 +
 +      for (i = 0; i < ZYNQMP_DMA_NUM_DESCS; i++) {
 +              desc = chan->sw_desc_pool + i;
 +              dma_async_tx_descriptor_init(&desc->async_tx, &chan->common);
 +              desc->async_tx.tx_submit = zynqmp_dma_tx_submit;
 +              list_add_tail(&desc->node, &chan->free_list);
 +      }
 +
 +      chan->desc_pool_v = dma_zalloc_coherent(chan->dev,
 +                              (2 * chan->desc_size * ZYNQMP_DMA_NUM_DESCS),
 +                              &chan->desc_pool_p, GFP_KERNEL);
 +      if (!chan->desc_pool_v)
 +              return -ENOMEM;
 +
 +      for (i = 0; i < ZYNQMP_DMA_NUM_DESCS; i++) {
 +              desc = chan->sw_desc_pool + i;
 +              desc->src_v = (struct zynqmp_dma_desc_ll *) (chan->desc_pool_v +
 +                                      (i * ZYNQMP_DMA_DESC_SIZE(chan) * 2));
 +              desc->dst_v = (struct zynqmp_dma_desc_ll *) (desc->src_v + 1);
 +              desc->src_p = chan->desc_pool_p +
 +                              (i * ZYNQMP_DMA_DESC_SIZE(chan) * 2);
 +              desc->dst_p = desc->src_p + ZYNQMP_DMA_DESC_SIZE(chan);
 +      }
 +
 +      return ZYNQMP_DMA_NUM_DESCS;
 +}
 +
 +/**
 + * zynqmp_dma_start - Start DMA channel
 + * @chan: ZynqMP DMA channel pointer
 + */
 +static void zynqmp_dma_start(struct zynqmp_dma_chan *chan)
 +{
 +      writel(ZYNQMP_DMA_INT_EN_DEFAULT_MASK, chan->regs + ZYNQMP_DMA_IER);
 +      chan->idle = false;
 +      writel(ZYNQMP_DMA_ENABLE, chan->regs + ZYNQMP_DMA_CTRL2);
 +}
 +
 +/**
 + * zynqmp_dma_handle_ovfl_int - Process the overflow interrupt
 + * @chan: ZynqMP DMA channel pointer
 + * @status: Interrupt status value
 + */
 +static void zynqmp_dma_handle_ovfl_int(struct zynqmp_dma_chan *chan, u32 status)
 +{
 +      u32 val;
 +
 +      if (status & ZYNQMP_DMA_IRQ_DST_ACCT_ERR)
 +              val = readl(chan->regs + ZYNQMP_DMA_IRQ_DST_ACCT);
 +      if (status & ZYNQMP_DMA_IRQ_SRC_ACCT_ERR)
 +              val = readl(chan->regs + ZYNQMP_DMA_IRQ_SRC_ACCT);
 +}
 +
 +static void zynqmp_dma_config(struct zynqmp_dma_chan *chan)
 +{
 +      u32 val;
 +
 +      val = readl(chan->regs + ZYNQMP_DMA_CTRL0);
 +      val |= ZYNQMP_DMA_POINT_TYPE_SG;
 +      writel(val, chan->regs + ZYNQMP_DMA_CTRL0);
 +
 +      val = readl(chan->regs + ZYNQMP_DMA_DATA_ATTR);
 +      val = (val & ~ZYNQMP_DMA_ARLEN) |
 +              (chan->src_burst_len << ZYNQMP_DMA_ARLEN_OFST);
 +      val = (val & ~ZYNQMP_DMA_AWLEN) |
 +              (chan->dst_burst_len << ZYNQMP_DMA_AWLEN_OFST);
 +      writel(val, chan->regs + ZYNQMP_DMA_DATA_ATTR);
 +}
 +
 +/**
 + * zynqmp_dma_device_config - Zynqmp dma device configuration
 + * @dchan: DMA channel
 + * @config: DMA device config
 + */
 +static int zynqmp_dma_device_config(struct dma_chan *dchan,
 +                                  struct dma_slave_config *config)
 +{
 +      struct zynqmp_dma_chan *chan = to_chan(dchan);
 +
 +      chan->src_burst_len = config->src_maxburst;
 +      chan->dst_burst_len = config->dst_maxburst;
 +
 +      return 0;
 +}
 +
 +/**
 + * zynqmp_dma_start_transfer - Initiate the new transfer
 + * @chan: ZynqMP DMA channel pointer
 + */
 +static void zynqmp_dma_start_transfer(struct zynqmp_dma_chan *chan)
 +{
 +      struct zynqmp_dma_desc_sw *desc;
 +
 +      if (!chan->idle)
 +              return;
 +
 +      zynqmp_dma_config(chan);
 +
 +      desc = list_first_entry_or_null(&chan->pending_list,
 +                                      struct zynqmp_dma_desc_sw, node);
 +      if (!desc)
 +              return;
 +
 +      list_splice_tail_init(&chan->pending_list, &chan->active_list);
 +      zynqmp_dma_update_desc_to_ctrlr(chan, desc);
 +      zynqmp_dma_start(chan);
 +}
 +
 +
 +/**
 + * zynqmp_dma_chan_desc_cleanup - Cleanup the completed descriptors
 + * @chan: ZynqMP DMA channel
 + */
 +static void zynqmp_dma_chan_desc_cleanup(struct zynqmp_dma_chan *chan)
 +{
 +      struct zynqmp_dma_desc_sw *desc, *next;
 +
 +      list_for_each_entry_safe(desc, next, &chan->done_list, node) {
 +              dma_async_tx_callback callback;
 +              void *callback_param;
 +
 +              list_del(&desc->node);
 +
 +              callback = desc->async_tx.callback;
 +              callback_param = desc->async_tx.callback_param;
 +              if (callback) {
 +                      spin_unlock(&chan->lock);
 +                      callback(callback_param);
 +                      spin_lock(&chan->lock);
 +              }
 +
 +              /* Run any dependencies, then free the descriptor */
 +              zynqmp_dma_free_descriptor(chan, desc);
 +      }
 +}
 +
 +/**
 + * zynqmp_dma_complete_descriptor - Mark the active descriptor as complete
 + * @chan: ZynqMP DMA channel pointer
 + */
 +static void zynqmp_dma_complete_descriptor(struct zynqmp_dma_chan *chan)
 +{
 +      struct zynqmp_dma_desc_sw *desc;
 +
 +      desc = list_first_entry_or_null(&chan->active_list,
 +                                      struct zynqmp_dma_desc_sw, node);
 +      if (!desc)
 +              return;
 +      list_del(&desc->node);
 +      dma_cookie_complete(&desc->async_tx);
 +      list_add_tail(&desc->node, &chan->done_list);
 +}
 +
 +/**
 + * zynqmp_dma_issue_pending - Issue pending transactions
 + * @dchan: DMA channel pointer
 + */
 +static void zynqmp_dma_issue_pending(struct dma_chan *dchan)
 +{
 +      struct zynqmp_dma_chan *chan = to_chan(dchan);
 +
 +      spin_lock_bh(&chan->lock);
 +      zynqmp_dma_start_transfer(chan);
 +      spin_unlock_bh(&chan->lock);
 +}
 +
 +/**
 + * zynqmp_dma_free_descriptors - Free channel descriptors
 + * @dchan: DMA channel pointer
 + */
 +static void zynqmp_dma_free_descriptors(struct zynqmp_dma_chan *chan)
 +{
 +      zynqmp_dma_free_desc_list(chan, &chan->active_list);
 +      zynqmp_dma_free_desc_list(chan, &chan->pending_list);
 +      zynqmp_dma_free_desc_list(chan, &chan->done_list);
 +}
 +
 +/**
 + * zynqmp_dma_free_chan_resources - Free channel resources
 + * @dchan: DMA channel pointer
 + */
 +static void zynqmp_dma_free_chan_resources(struct dma_chan *dchan)
 +{
 +      struct zynqmp_dma_chan *chan = to_chan(dchan);
 +
 +      spin_lock_bh(&chan->lock);
 +      zynqmp_dma_free_descriptors(chan);
 +      spin_unlock_bh(&chan->lock);
 +      dma_free_coherent(chan->dev,
 +              (2 * ZYNQMP_DMA_DESC_SIZE(chan) * ZYNQMP_DMA_NUM_DESCS),
 +              chan->desc_pool_v, chan->desc_pool_p);
 +      kfree(chan->sw_desc_pool);
 +}
 +
 +/**
 + * zynqmp_dma_reset - Reset the channel
 + * @chan: ZynqMP DMA channel pointer
 + */
 +static void zynqmp_dma_reset(struct zynqmp_dma_chan *chan)
 +{
 +      writel(ZYNQMP_DMA_IDS_DEFAULT_MASK, chan->regs + ZYNQMP_DMA_IDS);
 +
 +      zynqmp_dma_complete_descriptor(chan);
 +      zynqmp_dma_chan_desc_cleanup(chan);
 +      zynqmp_dma_free_descriptors(chan);
 +      zynqmp_dma_init(chan);
 +}
 +
 +/**
 + * zynqmp_dma_irq_handler - ZynqMP DMA Interrupt handler
 + * @irq: IRQ number
 + * @data: Pointer to the ZynqMP DMA channel structure
 + *
 + * Return: IRQ_HANDLED/IRQ_NONE
 + */
 +static irqreturn_t zynqmp_dma_irq_handler(int irq, void *data)
 +{
 +      struct zynqmp_dma_chan *chan = (struct zynqmp_dma_chan *)data;
 +      u32 isr, imr, status;
 +      irqreturn_t ret = IRQ_NONE;
 +
 +      isr = readl(chan->regs + ZYNQMP_DMA_ISR);
 +      imr = readl(chan->regs + ZYNQMP_DMA_IMR);
 +      status = isr & ~imr;
 +
 +      writel(isr, chan->regs + ZYNQMP_DMA_ISR);
 +      if (status & ZYNQMP_DMA_INT_DONE) {
 +              tasklet_schedule(&chan->tasklet);
 +              ret = IRQ_HANDLED;
 +      }
 +
 +      if (status & ZYNQMP_DMA_DONE)
 +              chan->idle = true;
 +
 +      if (status & ZYNQMP_DMA_INT_ERR) {
 +              chan->err = true;
 +              tasklet_schedule(&chan->tasklet);
 +              dev_err(chan->dev, "Channel %p has errors\n", chan);
 +              ret = IRQ_HANDLED;
 +      }
 +
 +      if (status & ZYNQMP_DMA_INT_OVRFL) {
 +              zynqmp_dma_handle_ovfl_int(chan, status);
 +              dev_info(chan->dev, "Channel %p overflow interrupt\n", chan);
 +              ret = IRQ_HANDLED;
 +      }
 +
 +      return ret;
 +}
 +
 +/**
 + * zynqmp_dma_do_tasklet - Schedule completion tasklet
 + * @data: Pointer to the ZynqMP DMA channel structure
 + */
 +static void zynqmp_dma_do_tasklet(unsigned long data)
 +{
 +      struct zynqmp_dma_chan *chan = (struct zynqmp_dma_chan *)data;
 +      u32 count;
 +
 +      spin_lock(&chan->lock);
 +
 +      if (chan->err) {
 +              zynqmp_dma_reset(chan);
 +              chan->err = false;
 +              goto unlock;
 +      }
 +
 +      count = readl(chan->regs + ZYNQMP_DMA_IRQ_DST_ACCT);
 +
 +      while (count) {
 +              zynqmp_dma_complete_descriptor(chan);
 +              zynqmp_dma_chan_desc_cleanup(chan);
 +              count--;
 +      }
 +
 +      if (chan->idle)
 +              zynqmp_dma_start_transfer(chan);
 +
 +unlock:
 +      spin_unlock(&chan->lock);
 +}
 +
 +/**
 + * zynqmp_dma_device_terminate_all - Aborts all transfers on a channel
 + * @dchan: DMA channel pointer
 + *
 + * Return: Always '0'
 + */
 +static int zynqmp_dma_device_terminate_all(struct dma_chan *dchan)
 +{
 +      struct zynqmp_dma_chan *chan = to_chan(dchan);
 +
 +      spin_lock_bh(&chan->lock);
 +      writel(ZYNQMP_DMA_IDS_DEFAULT_MASK, chan->regs + ZYNQMP_DMA_IDS);
 +      zynqmp_dma_free_descriptors(chan);
 +      spin_unlock_bh(&chan->lock);
 +
 +      return 0;
 +}
 +
 +/**
 + * zynqmp_dma_prep_memcpy - prepare descriptors for memcpy transaction
 + * @dchan: DMA channel
 + * @dma_dst: Destination buffer address
 + * @dma_src: Source buffer address
 + * @len: Transfer length
 + * @flags: transfer ack flags
 + *
 + * Return: Async transaction descriptor on success and NULL on failure
 + */
 +static struct dma_async_tx_descriptor *zynqmp_dma_prep_memcpy(
 +                              struct dma_chan *dchan, dma_addr_t dma_dst,
 +                              dma_addr_t dma_src, size_t len, ulong flags)
 +{
 +      struct zynqmp_dma_chan *chan;
 +      struct zynqmp_dma_desc_sw *new, *first = NULL;
 +      void *desc = NULL, *prev = NULL;
 +      size_t copy;
 +      u32 desc_cnt;
 +
 +      chan = to_chan(dchan);
 +
 +      if (len > ZYNQMP_DMA_MAX_TRANS_LEN)
 +              return NULL;
 +
 +      desc_cnt = DIV_ROUND_UP(len, ZYNQMP_DMA_MAX_TRANS_LEN);
 +
 +      spin_lock_bh(&chan->lock);
 +      if (desc_cnt > chan->desc_free_cnt) {
 +              spin_unlock_bh(&chan->lock);
 +              dev_dbg(chan->dev, "chan %p descs are not available\n", chan);
 +              return NULL;
 +      }
 +      chan->desc_free_cnt = chan->desc_free_cnt - desc_cnt;
 +      spin_unlock_bh(&chan->lock);
 +
 +      do {
 +              /* Allocate and populate the descriptor */
 +              new = zynqmp_dma_get_descriptor(chan);
 +
 +              copy = min_t(size_t, len, ZYNQMP_DMA_MAX_TRANS_LEN);
 +              desc = (struct zynqmp_dma_desc_ll *)new->src_v;
 +              zynqmp_dma_config_sg_ll_desc(chan, desc, dma_src,
 +                                           dma_dst, copy, prev);
 +              prev = desc;
 +              len -= copy;
 +              dma_src += copy;
 +              dma_dst += copy;
 +              if (!first)
 +                      first = new;
 +              else
 +                      list_add_tail(&new->node, &first->tx_list);
 +      } while (len);
 +
 +      zynqmp_dma_desc_config_eod(chan, desc);
 +      async_tx_ack(&first->async_tx);
 +      first->async_tx.flags = flags;
 +      return &first->async_tx;
 +}
 +
 +/**
 + * zynqmp_dma_prep_slave_sg - prepare descriptors for a memory sg transaction
 + * @dchan: DMA channel
 + * @dst_sg: Destination scatter list
 + * @dst_sg_len: Number of entries in destination scatter list
 + * @src_sg: Source scatter list
 + * @src_sg_len: Number of entries in source scatter list
 + * @flags: transfer ack flags
 + *
 + * Return: Async transaction descriptor on success and NULL on failure
 + */
 +static struct dma_async_tx_descriptor *zynqmp_dma_prep_sg(
 +                      struct dma_chan *dchan, struct scatterlist *dst_sg,
 +                      unsigned int dst_sg_len, struct scatterlist *src_sg,
 +                      unsigned int src_sg_len, unsigned long flags)
 +{
 +      struct zynqmp_dma_desc_sw *new, *first = NULL;
 +      struct zynqmp_dma_chan *chan = to_chan(dchan);
 +      void *desc = NULL, *prev = NULL;
 +      size_t len, dst_avail, src_avail;
 +      dma_addr_t dma_dst, dma_src;
 +      u32 desc_cnt = 0, i;
 +      struct scatterlist *sg;
 +
 +      for_each_sg(src_sg, sg, src_sg_len, i)
 +              desc_cnt += DIV_ROUND_UP(sg_dma_len(sg),
 +                                       ZYNQMP_DMA_MAX_TRANS_LEN);
 +
 +      spin_lock_bh(&chan->lock);
 +      if (desc_cnt > chan->desc_free_cnt) {
 +              spin_unlock_bh(&chan->lock);
 +              dev_dbg(chan->dev, "chan %p descs are not available\n", chan);
 +              return NULL;
 +      }
 +      chan->desc_free_cnt = chan->desc_free_cnt - desc_cnt;
 +      spin_unlock_bh(&chan->lock);
 +
 +      dst_avail = sg_dma_len(dst_sg);
 +      src_avail = sg_dma_len(src_sg);
 +
 +      /* Run until we are out of scatterlist entries */
 +      while (true) {
 +              /* Allocate and populate the descriptor */
 +              new = zynqmp_dma_get_descriptor(chan);
 +              desc = (struct zynqmp_dma_desc_ll *)new->src_v;
 +              len = min_t(size_t, src_avail, dst_avail);
 +              len = min_t(size_t, len, ZYNQMP_DMA_MAX_TRANS_LEN);
 +              if (len == 0)
 +                      goto fetch;
 +              dma_dst = sg_dma_address(dst_sg) + sg_dma_len(dst_sg) -
 +                      dst_avail;
 +              dma_src = sg_dma_address(src_sg) + sg_dma_len(src_sg) -
 +                      src_avail;
 +
 +              zynqmp_dma_config_sg_ll_desc(chan, desc, dma_src, dma_dst,
 +                                           len, prev);
 +              prev = desc;
 +              dst_avail -= len;
 +              src_avail -= len;
 +
 +              if (!first)
 +                      first = new;
 +              else
 +                      list_add_tail(&new->node, &first->tx_list);
 +fetch:
 +              /* Fetch the next dst scatterlist entry */
 +              if (dst_avail == 0) {
 +                      if (dst_sg_len == 0)
 +                              break;
 +                      dst_sg = sg_next(dst_sg);
 +                      if (dst_sg == NULL)
 +                              break;
 +                      dst_sg_len--;
 +                      dst_avail = sg_dma_len(dst_sg);
 +              }
 +              /* Fetch the next src scatterlist entry */
 +              if (src_avail == 0) {
 +                      if (src_sg_len == 0)
 +                              break;
 +                      src_sg = sg_next(src_sg);
 +                      if (src_sg == NULL)
 +                              break;
 +                      src_sg_len--;
 +                      src_avail = sg_dma_len(src_sg);
 +              }
 +      }
 +
 +      zynqmp_dma_desc_config_eod(chan, desc);
 +      first->async_tx.flags = flags;
 +      return &first->async_tx;
 +}
 +
 +/**
 + * zynqmp_dma_chan_remove - Channel remove function
 + * @chan: ZynqMP DMA channel pointer
 + */
 +static void zynqmp_dma_chan_remove(struct zynqmp_dma_chan *chan)
 +{
 +      if (!chan)
 +              return;
 +
 +      devm_free_irq(chan->zdev->dev, chan->irq, chan);
 +      tasklet_kill(&chan->tasklet);
 +      list_del(&chan->common.device_node);
 +      clk_disable_unprepare(chan->clk_apb);
 +      clk_disable_unprepare(chan->clk_main);
 +}
 +
 +/**
 + * zynqmp_dma_chan_probe - Per Channel Probing
 + * @zdev: Driver specific device structure
 + * @pdev: Pointer to the platform_device structure
 + *
 + * Return: '0' on success and failure value on error
 + */
 +static int zynqmp_dma_chan_probe(struct zynqmp_dma_device *zdev,
 +                         struct platform_device *pdev)
 +{
 +      struct zynqmp_dma_chan *chan;
 +      struct resource *res;
 +      struct device_node *node = pdev->dev.of_node;
 +      int err;
 +
 +      chan = devm_kzalloc(zdev->dev, sizeof(*chan), GFP_KERNEL);
 +      if (!chan)
 +              return -ENOMEM;
 +      chan->dev = zdev->dev;
 +      chan->zdev = zdev;
 +
 +      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 +      chan->regs = devm_ioremap_resource(&pdev->dev, res);
 +      if (IS_ERR(chan->regs))
 +              return PTR_ERR(chan->regs);
 +
 +      chan->bus_width = ZYNQMP_DMA_BUS_WIDTH_64;
 +      chan->dst_burst_len = ZYNQMP_DMA_AWLEN_RST_VAL;
 +      chan->src_burst_len = ZYNQMP_DMA_ARLEN_RST_VAL;
 +      err = of_property_read_u32(node, "xlnx,bus-width", &chan->bus_width);
 +      if (err < 0) {
 +              dev_err(&pdev->dev, "missing xlnx,bus-width property\n");
 +              return err;
 +      }
 +
 +      if (chan->bus_width != ZYNQMP_DMA_BUS_WIDTH_64 &&
 +          chan->bus_width != ZYNQMP_DMA_BUS_WIDTH_128) {
 +              dev_err(zdev->dev, "invalid bus-width value");
 +              return -EINVAL;
 +      }
 +
 +      chan->is_dmacoherent =  of_property_read_bool(node, "dma-coherent");
 +      zdev->chan = chan;
 +      tasklet_init(&chan->tasklet, zynqmp_dma_do_tasklet, (ulong)chan);
 +      spin_lock_init(&chan->lock);
 +      INIT_LIST_HEAD(&chan->active_list);
 +      INIT_LIST_HEAD(&chan->pending_list);
 +      INIT_LIST_HEAD(&chan->done_list);
 +      INIT_LIST_HEAD(&chan->free_list);
 +
 +      dma_cookie_init(&chan->common);
 +      chan->common.device = &zdev->common;
 +      list_add_tail(&chan->common.device_node, &zdev->common.channels);
 +
 +      zynqmp_dma_init(chan);
 +      chan->irq = platform_get_irq(pdev, 0);
 +      if (chan->irq < 0)
 +              return -ENXIO;
 +      err = devm_request_irq(&pdev->dev, chan->irq, zynqmp_dma_irq_handler, 0,
 +                             "zynqmp-dma", chan);
 +      if (err)
 +              return err;
 +      chan->clk_main = devm_clk_get(&pdev->dev, "clk_main");
 +      if (IS_ERR(chan->clk_main)) {
 +              dev_err(&pdev->dev, "main clock not found.\n");
 +              return PTR_ERR(chan->clk_main);
 +      }
 +
 +      chan->clk_apb = devm_clk_get(&pdev->dev, "clk_apb");
 +      if (IS_ERR(chan->clk_apb)) {
 +              dev_err(&pdev->dev, "apb clock not found.\n");
 +              return PTR_ERR(chan->clk_apb);
 +      }
 +
 +      err = clk_prepare_enable(chan->clk_main);
 +      if (err) {
 +              dev_err(&pdev->dev, "Unable to enable main clock.\n");
 +              return err;
 +      }
 +
 +      err = clk_prepare_enable(chan->clk_apb);
 +      if (err) {
 +              clk_disable_unprepare(chan->clk_main);
 +              dev_err(&pdev->dev, "Unable to enable apb clock.\n");
 +              return err;
 +      }
 +
 +      chan->desc_size = sizeof(struct zynqmp_dma_desc_ll);
 +      chan->idle = true;
 +      return 0;
 +}
 +
 +/**
 + * of_zynqmp_dma_xlate - Translation function
 + * @dma_spec: Pointer to DMA specifier as found in the device tree
 + * @ofdma: Pointer to DMA controller data
 + *
 + * Return: DMA channel pointer on success and NULL on error
 + */
 +static struct dma_chan *of_zynqmp_dma_xlate(struct of_phandle_args *dma_spec,
 +                                          struct of_dma *ofdma)
 +{
 +      struct zynqmp_dma_device *zdev = ofdma->of_dma_data;
 +
 +      return dma_get_slave_channel(&zdev->chan->common);
 +}
 +
 +/**
 + * zynqmp_dma_probe - Driver probe function
 + * @pdev: Pointer to the platform_device structure
 + *
 + * Return: '0' on success and failure value on error
 + */
 +static int zynqmp_dma_probe(struct platform_device *pdev)
 +{
 +      struct zynqmp_dma_device *zdev;
 +      struct dma_device *p;
 +      int ret;
 +
 +      zdev = devm_kzalloc(&pdev->dev, sizeof(*zdev), GFP_KERNEL);
 +      if (!zdev)
 +              return -ENOMEM;
 +
 +      zdev->dev = &pdev->dev;
 +      INIT_LIST_HEAD(&zdev->common.channels);
 +
 +      dma_set_mask(&pdev->dev, DMA_BIT_MASK(44));
 +      dma_cap_set(DMA_SG, zdev->common.cap_mask);
 +      dma_cap_set(DMA_MEMCPY, zdev->common.cap_mask);
 +
 +      p = &zdev->common;
 +      p->device_prep_dma_sg = zynqmp_dma_prep_sg;
 +      p->device_prep_dma_memcpy = zynqmp_dma_prep_memcpy;
 +      p->device_terminate_all = zynqmp_dma_device_terminate_all;
 +      p->device_issue_pending = zynqmp_dma_issue_pending;
 +      p->device_alloc_chan_resources = zynqmp_dma_alloc_chan_resources;
 +      p->device_free_chan_resources = zynqmp_dma_free_chan_resources;
 +      p->device_tx_status = dma_cookie_status;
 +      p->device_config = zynqmp_dma_device_config;
 +      p->dev = &pdev->dev;
 +
 +      platform_set_drvdata(pdev, zdev);
 +
 +      ret = zynqmp_dma_chan_probe(zdev, pdev);
 +      if (ret) {
 +              dev_err(&pdev->dev, "Probing channel failed\n");
 +              goto free_chan_resources;
 +      }
 +
 +      p->dst_addr_widths = BIT(zdev->chan->bus_width / 8);
 +      p->src_addr_widths = BIT(zdev->chan->bus_width / 8);
 +
 +      dma_async_device_register(&zdev->common);
 +
 +      ret = of_dma_controller_register(pdev->dev.of_node,
 +                                       of_zynqmp_dma_xlate, zdev);
 +      if (ret) {
 +              dev_err(&pdev->dev, "Unable to register DMA to DT\n");
 +              dma_async_device_unregister(&zdev->common);
 +              goto free_chan_resources;
 +      }
 +
 +      dev_info(&pdev->dev, "ZynqMP DMA driver Probe success\n");
 +
 +      return 0;
 +
 +free_chan_resources:
 +      zynqmp_dma_chan_remove(zdev->chan);
 +      return ret;
 +}
 +
 +/**
 + * zynqmp_dma_remove - Driver remove function
 + * @pdev: Pointer to the platform_device structure
 + *
 + * Return: Always '0'
 + */
 +static int zynqmp_dma_remove(struct platform_device *pdev)
 +{
 +      struct zynqmp_dma_device *zdev = platform_get_drvdata(pdev);
 +
 +      of_dma_controller_free(pdev->dev.of_node);
 +      dma_async_device_unregister(&zdev->common);
 +
 +      zynqmp_dma_chan_remove(zdev->chan);
 +
 +      return 0;
 +}
 +
 +static const struct of_device_id zynqmp_dma_of_match[] = {
 +      { .compatible = "xlnx,zynqmp-dma-1.0", },
 +      {}
 +};
 +MODULE_DEVICE_TABLE(of, zynqmp_dma_of_match);
 +
 +static struct platform_driver zynqmp_dma_driver = {
 +      .driver = {
 +              .name = "xilinx-zynqmp-dma",
 +              .of_match_table = zynqmp_dma_of_match,
 +      },
 +      .probe = zynqmp_dma_probe,
 +      .remove = zynqmp_dma_remove,
 +};
 +
 +module_platform_driver(zynqmp_dma_driver);
 +
 +MODULE_AUTHOR("Xilinx, Inc.");
 +MODULE_DESCRIPTION("Xilinx ZynqMP DMA driver");
Simple merge
index 908f804c7500e41c563d3b6b7d0f2ef4454c17c9,f9e4a3e0e6e915d1b5b6217e76e4f7f52323656c..7984221959e57641c06f8d4166b246c263b5db3b
@@@ -67,9 -67,6 +67,9 @@@ obj-$(CONFIG_EDAC_OCTEON_L2C)         += octeo
  obj-$(CONFIG_EDAC_OCTEON_LMC)         += octeon_edac-lmc.o
  obj-$(CONFIG_EDAC_OCTEON_PCI)         += octeon_edac-pci.o
  
- obj-$(CONFIG_EDAC_ALTERA_MC)          += altera_edac.o
+ obj-$(CONFIG_EDAC_ALTERA)             += altera_edac.o
 +obj-$(CONFIG_EDAC_PL310_L2)           += pl310_edac_l2.o
  obj-$(CONFIG_EDAC_SYNOPSYS)           += synopsys_edac.o
  obj-$(CONFIG_EDAC_XGENE)              += xgene_edac.o
 +obj-$(CONFIG_EDAC_CORTEX_ARM64)               += cortex_arm64_edac.o
 +obj-$(CONFIG_EDAC_ZYNQMP_OCM)         += zynqmp_ocm_edac.o
Simple merge
Simple merge
Simple merge
Simple merge
index 0b48bb79a7bea5bf4a9e5e2788d7ea680b710e77,b03cfcbbac6b949b69c8b2f96ac7d307dd5b54e8..9020028fd78b9302c8f6a6cd1961d708b987ae27
@@@ -40,9 -43,9 +43,10 @@@ obj-$(CONFIG_VERSATILE_FPGA_IRQ)     += irq
  obj-$(CONFIG_ARCH_NSPIRE)             += irq-zevio.o
  obj-$(CONFIG_ARCH_VT8500)             += irq-vt8500.o
  obj-$(CONFIG_ST_IRQCHIP)              += irq-st.o
+ obj-$(CONFIG_TANGO_IRQ)                       += irq-tango.o
  obj-$(CONFIG_TB10X_IRQC)              += irq-tb10x.o
  obj-$(CONFIG_TS4800_IRQ)              += irq-ts4800.o
 +obj-$(CONFIG_XILINX_INTC)             += irq-xilinx-intc.o
  obj-$(CONFIG_XTENSA)                  += irq-xtensa-pic.o
  obj-$(CONFIG_XTENSA_MX)                       += irq-xtensa-mx.o
  obj-$(CONFIG_IRQ_CROSSBAR)            += irq-crossbar.o
index 4eed66dd5e46d82b1094ad32b3b1cb4b75ed37ef,282344b95ec2b41c5e081c9d73199bb0a66b21d9..28efe8219f0452c588078c978d200214edf22826
@@@ -319,19 -319,8 +319,19 @@@ static int gic_set_affinity(struct irq_
        writel_relaxed(val | bit, reg);
        raw_spin_unlock_irqrestore(&irq_controller_lock, flags);
  
-       return IRQ_SET_MASK_OK;
+       return IRQ_SET_MASK_OK_DONE;
  }
 +
 +void gic_set_cpu(unsigned int cpu, unsigned int irq)
 +{
 +      struct irq_data *d = irq_get_irq_data(irq);
 +      struct cpumask mask;
 +
 +      cpumask_clear(&mask);
 +      cpumask_set_cpu(cpu, &mask);
 +      gic_set_affinity(d, &mask, true);
 +}
 +EXPORT_SYMBOL(gic_set_cpu);
  #endif
  
  static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 3f16b4c757421e81c49b64d477c777f3570e11b7,890bdf4024497bf581c6705d192d4d5779692d61..12c515f60ce87f461ba1cc908f447f2d24e3a2e2
@@@ -14,7 -14,7 +14,8 @@@ obj-$(CONFIG_FSL_CORENET_CF)  += fsl-cor
  obj-$(CONFIG_FSL_IFC)         += fsl_ifc.o
  obj-$(CONFIG_MVEBU_DEVBUS)    += mvebu-devbus.o
  obj-$(CONFIG_TEGRA20_MC)      += tegra20-mc.o
 +obj-$(CONFIG_PL35X_SMC)               += pl35x-smc.o
  obj-$(CONFIG_JZ4780_NEMC)     += jz4780-nemc.o
+ obj-$(CONFIG_MTK_SMI)         += mtk-smi.o
  
  obj-$(CONFIG_TEGRA_MC)                += tegra/
index 93267743c934f92635065b50b8c380fe7739a1ca,a216b46677429402168c587c638cc1d710632960..b84d4ed650a79f00cc89d973b412fcf8599084f7
@@@ -525,20 -525,285 +525,298 @@@ config VEXPRESS_SYSCF
          ARM Ltd. Versatile Express uses specialised platform configuration
          bus. System Configuration interface is one of the possible means
          of generating transactions on this bus.
+ config PANEL
+       tristate "Parallel port LCD/Keypad Panel support"
+       depends on PARPORT
+       ---help---
+         Say Y here if you have an HD44780 or KS-0074 LCD connected to your
+         parallel port. This driver also features 4 and 6-key keypads. The LCD
+         is accessible through the /dev/lcd char device (10, 156), and the
+         keypad through /dev/keypad (10, 185). Both require misc device to be
+         enabled. This code can either be compiled as a module, or linked into
+         the kernel and started at boot. If you don't understand what all this
+         is about, say N.
+ config PANEL_PARPORT
+       int "Default parallel port number (0=LPT1)"
+       depends on PANEL
+       range 0 255
+       default "0"
+       ---help---
+         This is the index of the parallel port the panel is connected to. One
+         driver instance only supports one parallel port, so if your keypad
+         and LCD are connected to two separate ports, you have to start two
+         modules with different arguments. Numbering starts with '0' for LPT1,
+         and so on.
+ config PANEL_PROFILE
+       int "Default panel profile (0-5, 0=custom)"
+       depends on PANEL
+       range 0 5
+       default "5"
+       ---help---
+         To ease configuration, the driver supports different configuration
+         profiles for past and recent wirings. These profiles can also be
+         used to define an approximative configuration, completed by a few
+         other options. Here are the profiles :
+           0 = custom (see further)
+           1 = 2x16 parallel LCD, old keypad
+           2 = 2x16 serial LCD (KS-0074), new keypad
+           3 = 2x16 parallel LCD (Hantronix), no keypad
+           4 = 2x16 parallel LCD (Nexcom NSA1045) with Nexcom's keypad
+           5 = 2x40 parallel LCD (old one), with old keypad
+         Custom configurations allow you to define how your display is
+         wired to the parallel port, and how it works. This is only intended
+         for experts.
+ config PANEL_KEYPAD
+       depends on PANEL && PANEL_PROFILE="0"
+       int "Keypad type (0=none, 1=old 6 keys, 2=new 6 keys, 3=Nexcom 4 keys)"
+       range 0 3
+       default 0
+       ---help---
+         This enables and configures a keypad connected to the parallel port.
+         The keys will be read from character device 10,185. Valid values are :
+           0 : do not enable this driver
+           1 : old 6 keys keypad
+           2 : new 6 keys keypad, as used on the server at www.ant-computing.com
+           3 : Nexcom NSA1045's 4 keys keypad
+         New profiles can be described in the driver source. The driver also
+         supports simultaneous keys pressed when the keypad supports them.
+ config PANEL_LCD
+       depends on PANEL && PANEL_PROFILE="0"
+       int "LCD type (0=none, 1=custom, 2=old //, 3=ks0074, 4=hantronix, 5=Nexcom)"
+       range 0 5
+       default 0
+       ---help---
+          This enables and configures an LCD connected to the parallel port.
+          The driver includes an interpreter for escape codes starting with
+          '\e[L' which are specific to the LCD, and a few ANSI codes. The
+          driver will be registered as character device 10,156, usually
+          under the name '/dev/lcd'. There are a total of 6 supported types :
+            0 : do not enable the driver
+            1 : custom configuration and wiring (see further)
+            2 : 2x16 & 2x40 parallel LCD (old wiring)
+            3 : 2x16 serial LCD (KS-0074 based)
+            4 : 2x16 parallel LCD (Hantronix wiring)
+            5 : 2x16 parallel LCD (Nexcom wiring)
+          When type '1' is specified, other options will appear to configure
+          more precise aspects (wiring, dimensions, protocol, ...). Please note
+          that those values changed from the 2.4 driver for better consistency.
+ config PANEL_LCD_HEIGHT
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+       int "Number of lines on the LCD (1-2)"
+       range 1 2
+       default 2
+       ---help---
+         This is the number of visible character lines on the LCD in custom profile.
+         It can either be 1 or 2.
+ config PANEL_LCD_WIDTH
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+       int "Number of characters per line on the LCD (1-40)"
+       range 1 40
+       default 40
+       ---help---
+         This is the number of characters per line on the LCD in custom profile.
+         Common values are 16,20,24,40.
+ config PANEL_LCD_BWIDTH
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+       int "Internal LCD line width (1-40, 40 by default)"
+       range 1 40
+       default 40
+       ---help---
+         Most LCDs use a standard controller which supports hardware lines of 40
+         characters, although sometimes only 16, 20 or 24 of them are really wired
+         to the terminal. This results in some non-visible but addressable characters,
+         and is the case for most parallel LCDs. Other LCDs, and some serial ones,
+         however, use the same line width internally as what is visible. The KS0074
+         for example, uses 16 characters per line for 16 visible characters per line.
+         This option lets you configure the value used by your LCD in 'custom' profile.
+         If you don't know, put '40' here.
+ config PANEL_LCD_HWIDTH
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+       int "Hardware LCD line width (1-64, 64 by default)"
+       range 1 64
+       default 64
+       ---help---
+         Most LCDs use a single address bit to differentiate line 0 and line 1. Since
+         some of them need to be able to address 40 chars with the lower bits, they
+         often use the immediately superior power of 2, which is 64, to address the
+         next line.
+         If you don't know what your LCD uses, in doubt let 16 here for a 2x16, and
+         64 here for a 2x40.
+ config PANEL_LCD_CHARSET
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+       int "LCD character set (0=normal, 1=KS0074)"
+       range 0 1
+       default 0
+       ---help---
+         Some controllers such as the KS0074 use a somewhat strange character set
+         where many symbols are at unusual places. The driver knows how to map
+         'standard' ASCII characters to the character sets used by these controllers.
+         Valid values are :
+            0 : normal (untranslated) character set
+            1 : KS0074 character set
+         If you don't know, use the normal one (0).
+ config PANEL_LCD_PROTO
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+       int "LCD communication mode (0=parallel 8 bits, 1=serial)"
+       range 0 1
+       default 0
+       ---help---
+         This driver now supports any serial or parallel LCD wired to a parallel
+         port. But before assigning signals, the driver needs to know if it will
+         be driving a serial LCD or a parallel one. Serial LCDs only use 2 wires
+         (SDA/SCL), while parallel ones use 2 or 3 wires for the control signals
+         (E, RS, sometimes RW), and 4 or 8 for the data. Use 0 here for a 8 bits
+         parallel LCD, and 1 for a serial LCD.
+ config PANEL_LCD_PIN_E
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0"
+         int "Parallel port pin number & polarity connected to the LCD E signal (-17...17) "
+       range -17 17
+       default 14
+       ---help---
+         This describes the number of the parallel port pin to which the LCD 'E'
+         signal has been connected. It can be :
+                 0 : no connection (eg: connected to ground)
+             1..17 : directly connected to any of these pins on the DB25 plug
+           -1..-17 : connected to the same pin through an inverter (eg: transistor).
+         Default for the 'E' pin in custom profile is '14' (AUTOFEED).
+ config PANEL_LCD_PIN_RS
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0"
+         int "Parallel port pin number & polarity connected to the LCD RS signal (-17...17) "
+       range -17 17
+       default 17
+       ---help---
+         This describes the number of the parallel port pin to which the LCD 'RS'
+         signal has been connected. It can be :
+                 0 : no connection (eg: connected to ground)
+             1..17 : directly connected to any of these pins on the DB25 plug
+           -1..-17 : connected to the same pin through an inverter (eg: transistor).
+         Default for the 'RS' pin in custom profile is '17' (SELECT IN).
+ config PANEL_LCD_PIN_RW
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0"
+         int "Parallel port pin number & polarity connected to the LCD RW signal (-17...17) "
+       range -17 17
+       default 16
+       ---help---
+         This describes the number of the parallel port pin to which the LCD 'RW'
+         signal has been connected. It can be :
+                 0 : no connection (eg: connected to ground)
+             1..17 : directly connected to any of these pins on the DB25 plug
+           -1..-17 : connected to the same pin through an inverter (eg: transistor).
+         Default for the 'RW' pin in custom profile is '16' (INIT).
+ config PANEL_LCD_PIN_SCL
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0"
+         int "Parallel port pin number & polarity connected to the LCD SCL signal (-17...17) "
+       range -17 17
+       default 1
+       ---help---
+         This describes the number of the parallel port pin to which the serial
+         LCD 'SCL' signal has been connected. It can be :
+                 0 : no connection (eg: connected to ground)
+             1..17 : directly connected to any of these pins on the DB25 plug
+           -1..-17 : connected to the same pin through an inverter (eg: transistor).
+         Default for the 'SCL' pin in custom profile is '1' (STROBE).
+ config PANEL_LCD_PIN_SDA
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0"
+         int "Parallel port pin number & polarity connected to the LCD SDA signal (-17...17) "
+       range -17 17
+       default 2
+       ---help---
+         This describes the number of the parallel port pin to which the serial
+         LCD 'SDA' signal has been connected. It can be :
+                 0 : no connection (eg: connected to ground)
+             1..17 : directly connected to any of these pins on the DB25 plug
+           -1..-17 : connected to the same pin through an inverter (eg: transistor).
+         Default for the 'SDA' pin in custom profile is '2' (D0).
+ config PANEL_LCD_PIN_BL
+       depends on PANEL && PANEL_PROFILE="0" && PANEL_LCD="1"
+         int "Parallel port pin number & polarity connected to the LCD backlight signal (-17...17) "
+       range -17 17
+       default 0
+       ---help---
+         This describes the number of the parallel port pin to which the LCD 'BL' signal
+           has been connected. It can be :
+                 0 : no connection (eg: connected to ground)
+             1..17 : directly connected to any of these pins on the DB25 plug
+           -1..-17 : connected to the same pin through an inverter (eg: transistor).
+         Default for the 'BL' pin in custom profile is '0' (uncontrolled).
+ config PANEL_CHANGE_MESSAGE
+       depends on PANEL
+       bool "Change LCD initialization message ?"
+       default "n"
+       ---help---
+         This allows you to replace the boot message indicating the kernel version
+         and the driver version with a custom message. This is useful on appliances
+         where a simple 'Starting system' message can be enough to stop a customer
+         from worrying.
+         If you say 'Y' here, you'll be able to choose a message yourself. Otherwise,
+         say 'N' and keep the default message with the version.
+ config PANEL_BOOT_MESSAGE
+       depends on PANEL && PANEL_CHANGE_MESSAGE="y"
+       string "New initialization message"
+       default ""
+       ---help---
+         This allows you to replace the boot message indicating the kernel version
+         and the driver version with a custom message. This is useful on appliances
+         where a simple 'Starting system' message can be enough to stop a customer
+         from worrying.
+         An empty message will only clear the display at driver init time. Any other
+         printf()-formatted message is valid with newline and escape codes.
  
 +config XILINX_TRAFGEN
 +      tristate "Xilinx Traffic Generator"
 +      help
 +        This option enables support for the Xilinx Traffic Generator driver.
 +        It is designed to generate AXI4 traffic which can be used to stress
 +        different modules/interconnect connected in the system. Different
 +        configurable options which are provided through sysfs entries allow
 +        allow the user to generate a wide variety of traffic based on their
 +        their requirements.
 +
 +        If unsure, say N
 +
 +source "drivers/misc/jesd204b/Kconfig"
  source "drivers/misc/c2port/Kconfig"
  source "drivers/misc/eeprom/Kconfig"
  source "drivers/misc/cb710/Kconfig"
Simple merge
Simple merge
Simple merge
Simple merge
index 8b6beb54ae6b19ab489cff7cc2185594a84ee74c,f55335373f7c5b755c4363574ed7abc211ec89c7..3f1f4aa66329ed503be80c376da25295c7b330ce
@@@ -54,9 -54,8 +54,10 @@@ obj-$(CONFIG_MTD_NAND_GPMI_NAND)     += gpm
  obj-$(CONFIG_MTD_NAND_XWAY)           += xway_nand.o
  obj-$(CONFIG_MTD_NAND_BCM47XXNFLASH)  += bcm47xxnflash/
  obj-$(CONFIG_MTD_NAND_SUNXI)          += sunxi_nand.o
 +obj-$(CONFIG_MTD_NAND_PL35X)          += pl35x_nand.o
 +obj-$(CONFIG_MTD_NAND_ARASAN)         += arasan_nfc.o
  obj-$(CONFIG_MTD_NAND_HISI504)                += hisi504_nand.o
  obj-$(CONFIG_MTD_NAND_BRCMNAND)               += brcmnand/
+ obj-$(CONFIG_MTD_NAND_QCOM)           += qcom_nandc.o
  
  nand-objs := nand_base.o nand_bbt.o nand_timings.o
Simple merge
index 1516900c75800815f3db0fdce2451af52fe7585d,157841dc3e99e87826639f6418d3701f84632968..ad7d5b8365288d3d25722cb1858688df8a8c4893
@@@ -62,18 -61,20 +62,23 @@@ struct flash_info 
        u16             addr_width;
  
        u16             flags;
- #define       SECT_4K                 0x01    /* SPINOR_OP_BE_4K works uniformly */
- #define       SPI_NOR_NO_ERASE        0x02    /* No erase command needed */
- #define       SST_WRITE               0x04    /* use SST byte programming */
- #define       SPI_NOR_NO_FR           0x08    /* Can't do fastread */
- #define       SECT_4K_PMC             0x10    /* SPINOR_OP_BE_4K_PMC works uniformly */
- #define       SPI_NOR_DUAL_READ       0x20    /* Flash supports Dual Read */
- #define       SPI_NOR_QUAD_READ       0x40    /* Flash supports Quad Read */
- #define       USE_FSR                 0x80    /* use flag status register */
- #define       SPI_NOR_FLASH_LOCK      0x100   /* Flash protection support */
- #define       SPI_NOR_QUAD_IO_READ    0x200   /* Flash supports Quad IO read */
+ #define SECT_4K                       BIT(0)  /* SPINOR_OP_BE_4K works uniformly */
+ #define SPI_NOR_NO_ERASE      BIT(1)  /* No erase command needed */
+ #define SST_WRITE             BIT(2)  /* use SST byte programming */
+ #define SPI_NOR_NO_FR         BIT(3)  /* Can't do fastread */
+ #define SECT_4K_PMC           BIT(4)  /* SPINOR_OP_BE_4K_PMC works uniformly */
+ #define SPI_NOR_DUAL_READ     BIT(5)  /* Flash supports Dual Read */
+ #define SPI_NOR_QUAD_READ     BIT(6)  /* Flash supports Quad Read */
+ #define USE_FSR                       BIT(7)  /* use flag status register */
+ #define SPI_NOR_HAS_LOCK      BIT(8)  /* Flash supports lock/unlock via SR */
+ #define SPI_NOR_HAS_TB                BIT(9)  /*
+                                        * Flash SR has Top/Bottom (TB) protect
+                                        * bit. Must be used with
+                                        * SPI_NOR_HAS_LOCK.
+                                        */
++#define       SPI_NOR_QUAD_IO_READ    BIT(10) /* Flash supports Quad IO read */
 +/* Unlock the Global protection for sst flashes */
- #define       SST_GLOBAL_PROT_UNLK    0x400
++#define       SST_GLOBAL_PROT_UNLK    BIT(11)
  };
  
  #define JEDEC_MFR(info)       ((info)->id[0])
@@@ -1124,15 -864,12 +1225,15 @@@ static const struct flash_info spi_nor_
        { "n25q032a",    INFO(0x20bb16, 0, 64 * 1024,   64, SPI_NOR_QUAD_READ) },
        { "n25q064",     INFO(0x20ba17, 0, 64 * 1024,  128, SECT_4K | SPI_NOR_QUAD_READ) },
        { "n25q064a",    INFO(0x20bb17, 0, 64 * 1024,  128, SECT_4K | SPI_NOR_QUAD_READ) },
-       { "n25q128a11",  INFO(0x20bb18, 0, 64 * 1024,  256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_FLASH_LOCK) },
-       { "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024,  256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_FLASH_LOCK) },
-       { "n25q256a",    INFO(0x20bb19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_FLASH_LOCK) },
-       { "n25q256a13",  INFO(0x20ba19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_FLASH_LOCK) },
-       { "n25q512a",    INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_FLASH_LOCK) },
-       { "n25q512a13",  INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_FLASH_LOCK) },
-       { "n25q512ax3",  INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_FLASH_LOCK) },
-       { "n25q00",      INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_FLASH_LOCK) },
-       { "n25q00a",     INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_FLASH_LOCK) },
 -      { "n25q128a11",  INFO(0x20bb18, 0, 64 * 1024,  256, SECT_4K | SPI_NOR_QUAD_READ) },
 -      { "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024,  256, SECT_4K | SPI_NOR_QUAD_READ) },
 -      { "n25q256a",    INFO(0x20ba19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_QUAD_READ) },
 -      { "n25q512a",    INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
 -      { "n25q512ax3",  INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
 -      { "n25q00",      INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
++      { "n25q128a11",  INFO(0x20bb18, 0, 64 * 1024,  256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) },
++      { "n25q128a13",  INFO(0x20ba18, 0, 64 * 1024,  256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) },
++      { "n25q256a",    INFO(0x20bb19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_HAS_LOCK) },
++      { "n25q256a13",  INFO(0x20ba19, 0, 64 * 1024,  512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_HAS_LOCK) },
++      { "n25q512a",    INFO(0x20bb20, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_HAS_LOCK) },
++      { "n25q512a13",  INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_HAS_LOCK) },
++      { "n25q512ax3",  INFO(0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) },
++      { "n25q00",      INFO(0x20ba21, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_HAS_LOCK) },
++      { "n25q00a",     INFO(0x20bb21, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR | SPI_NOR_HAS_LOCK) },
  
        /* PMC */
        { "pm25lv512",   INFO(0,        0, 32 * 1024,    2, SECT_4K_PMC) },
         */
        { "s25sl032p",  INFO(0x010215, 0x4d00,  64 * 1024,  64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
        { "s25sl064p",  INFO(0x010216, 0x4d00,  64 * 1024, 128, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-       { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_FLASH_LOCK) },
 -      { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, 0) },
++      { "s25fl256s0", INFO(0x010219, 0x4d00, 256 * 1024, 128, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) },
        { "s25fl256s1", INFO(0x010219, 0x4d01,  64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
        { "s25fl512s",  INFO(0x010220, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 -      { "s70fl01gs",  INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
 -      { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
 -      { "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
 -      { "s25fl128s",  INFO6(0x012018, 0x4d0180, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) },
 -      { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 -      { "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 +      { "s70fl01gs",  INFO(0x010221, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-       { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, SPI_NOR_FLASH_LOCK) },
-       { "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, SPI_NOR_FLASH_LOCK) },
++      { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, SPI_NOR_HAS_LOCK) },
++      { "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, SPI_NOR_HAS_LOCK) },
 +      { "s25fl128s",  INFO6(0x012018, 0x4d0180, 64 * 1024, 256, SPI_NOR_QUAD_READ) },
-       { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_FLASH_LOCK) },
-       { "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_FLASH_LOCK) },
++      { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) },
++      { "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) },
        { "s25sl004a",  INFO(0x010212,      0,  64 * 1024,   8, 0) },
        { "s25sl008a",  INFO(0x010213,      0,  64 * 1024,  16, 0) },
        { "s25sl016a",  INFO(0x010214,      0,  64 * 1024,  32, 0) },
        { "w25x16", INFO(0xef3015, 0, 64 * 1024,  32, SECT_4K) },
        { "w25x32", INFO(0xef3016, 0, 64 * 1024,  64, SECT_4K) },
        { "w25q32", INFO(0xef4016, 0, 64 * 1024,  64, SECT_4K) },
-       { "w25q32dw", INFO(0xef6016, 0, 64 * 1024,  64, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+       {
+               "w25q32dw", INFO(0xef6016, 0, 64 * 1024,  64,
+                       SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+                       SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+       },
        { "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
        { "w25q64", INFO(0xef4017, 0, 64 * 1024, 128, SECT_4K) },
-       { "w25q64dw", INFO(0xef6017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-       { "w25q128fw", INFO(0xef6018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
+       {
+               "w25q64dw", INFO(0xef6017, 0, 64 * 1024, 128,
+                       SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+                       SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+       },
+       {
+               "w25q128fw", INFO(0xef6018, 0, 64 * 1024, 256,
+                       SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
+                       SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
+       },
        { "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) },
        { "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) },
 -      { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
 -      { "w25q256", INFO(0xef4019, 0, 64 * 1024, 512, SECT_4K) },
 +      { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
 +      { "w25q256", INFO(0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
  
        /* Catalyst / On Semiconductor -- non-JEDEC */
        { "cat25c11", CAT25_INFO(  16, 8, 16, 1, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
@@@ -1670,17 -1228,8 +1784,19 @@@ static int set_quad_mode(struct spi_no
                }
                return status;
        case SNOR_MFR_MICRON:
 +              if (!(nor->spi->mode & SPI_TX_QUAD)) {
 +                      dev_info(nor->dev, "Controller not in SPI_TX_QUAD mode, just use extended SPI mode\n");
 +                      return 0;
 +              }
 +              status = micron_quad_enable(nor);
 +              if (status) {
 +                      dev_err(nor->dev, "Micron quad-read not enabled\n");
 +                      return -EINVAL;
 +              }
 +              return status;
 +      case SNOR_MFR_SPANSION:
+               return 0;
+       default:
                status = spansion_quad_enable(nor);
                if (status) {
                        dev_err(nor->dev, "Spansion quad-read not enabled\n");
@@@ -1759,15 -1304,11 +1873,17 @@@ int spi_nor_scan(struct spi_nor *nor, c
  
        if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
            JEDEC_MFR(info) == SNOR_MFR_INTEL ||
-           JEDEC_MFR(info) == SNOR_MFR_SST) {
+           JEDEC_MFR(info) == SNOR_MFR_SST ||
+           info->flags & SPI_NOR_HAS_LOCK) {
                write_enable(nor);
                write_sr(nor, 0);
 +
 +              if (info->flags & SST_GLOBAL_PROT_UNLK) {
 +                      write_enable(nor);
 +                      /* Unlock global write protection bits */
 +                      nor->write_reg(nor, GLOBAL_BLKPROT_UNLK, NULL, 0);
 +              }
+               spi_nor_wait_till_ready(nor);
        }
  
        if (!mtd->name)
        mtd->flags = MTD_CAP_NORFLASH;
        mtd->size = info->sector_size * info->n_sectors;
        mtd->_erase = spi_nor_erase;
 -      mtd->_read = spi_nor_read;
 +      mtd->_read = spi_nor_read_ext;
 +      actual_size = mtd->size;
 +
 +      {
 +#ifdef CONFIG_OF
 +              u32 is_dual;
 +
 +              np_spi = of_get_next_parent(np);
 +              if ((of_property_match_string(np_spi, "compatible",
 +                  "xlnx,zynq-qspi-1.0") >= 0) ||
 +                      (of_property_match_string(np_spi, "compatible",
 +                                      "xlnx,zynqmp-qspi-1.0") >= 0)) {
 +                      if (of_property_read_u32(np_spi, "is-dual",
 +                                               &is_dual) < 0) {
 +                              /* Default to single if prop not defined */
 +                              nor->shift = 0;
 +                              nor->isstacked = 0;
 +                              nor->isparallel = 0;
 +                      } else {
 +                              if (is_dual == 1) {
 +                                      /* dual parallel */
 +                                      nor->shift = 1;
 +                                      info->sector_size <<= nor->shift;
 +                                      info->page_size <<= nor->shift;
 +                                      mtd->size <<= nor->shift;
 +                                      nor->isparallel = 1;
 +                                      nor->isstacked = 0;
 +                                      nor->spi->master->flags |=
 +                                                      SPI_BOTH_FLASH;
 +                              } else {
 +#ifdef CONFIG_SPI_ZYNQ_QSPI_DUAL_STACKED
 +                                      /* dual stacked */
 +                                      nor->shift = 0;
 +                                      mtd->size <<= 1;
 +                                      info->n_sectors <<= 1;
 +                                      nor->isstacked = 1;
 +                                      nor->isparallel = 0;
 +#else
 +                                      u32 is_stacked;
 +                                      if (of_property_read_u32(np_spi,
 +                                                      "is-stacked",
 +                                                      &is_stacked) < 0) {
 +                                              is_stacked = 0;
 +                                      }
 +                                      if (is_stacked) {
 +                                              /* dual stacked */
 +                                              nor->shift = 0;
 +                                              mtd->size <<= 1;
 +                                              info->n_sectors <<= 1;
 +                                              nor->isstacked = 1;
 +                                              nor->isparallel = 0;
 +                                      } else {
 +                                              /* single */
 +                                              nor->shift = 0;
 +                                              nor->isstacked = 0;
 +                                              nor->isparallel = 0;
 +                                      }
 +#endif
 +                              }
 +                      }
 +              }
 +#else
 +              /* Default to single */
 +              nor->shift = 0;
 +              nor->isstacked = 0;
 +              nor->isparallel = 0;
 +#endif
 +      }
  
 -      if (nor->flash_lock && nor->flash_unlock && nor->flash_is_locked) {
+       /* NOR protection support for STmicro/Micron chips and similar */
+       if (JEDEC_MFR(info) == SNOR_MFR_MICRON ||
+                       info->flags & SPI_NOR_HAS_LOCK) {
+               nor->flash_lock = stm_lock;
+               nor->flash_unlock = stm_unlock;
+               nor->flash_is_locked = stm_is_locked;
+       }
-       if (info->flags & SPI_NOR_FLASH_LOCK) {
 +      nor->n_sectors = info->n_sectors;
 +      nor->sector_size = info->sector_size;
 +
 +      /* NOR protection support for STmicro/Micron chips and similar */
++      if (info->flags & SPI_NOR_HAS_LOCK) {
                mtd->_lock = spi_nor_lock;
                mtd->_unlock = spi_nor_unlock;
                mtd->_is_locked = spi_nor_is_locked;
Simple merge
Simple merge
Simple merge
index 1985949d039d38c23624d16ece104fb3f33cac68,0000000000000000000000000000000000000000..36abb51503ec657d8434f3322c507079d3518610
mode 100644,000000..100644
--- /dev/null
@@@ -1,150 -1,0 +1,150 @@@
-       struct device *dev = &phydev->dev;
 +/* Xilinx PCS/PMA Core phy driver
 + *
 + * Copyright (C) 2015 Xilinx, Inc.
 + *
 + * Description:
 + * This driver is developed for PCS/PMA Core.
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + */
 +
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +#include <linux/mii.h>
 +#include <linux/phy.h>
 +#include <linux/of.h>
 +#include <linux/xilinx_phy.h>
 +
 +#define MII_PHY_STATUS_SPD_MASK               0x0C00
 +#define MII_PHY_STATUS_FULLDUPLEX     0x1000
 +#define MII_PHY_STATUS_1000           0x0800
 +#define MII_PHY_STATUS_100            0x0400
 +#define XPCSPMA_PHY_CTRL_ISOLATE_DISABLE 0xFBFF
 +
 +static int xilinxphy_read_status(struct phy_device *phydev)
 +{
 +      int err;
 +      int status = 0;
 +
 +      /* Update the link, but return if there
 +       * was an error
 +       */
 +      err = genphy_update_link(phydev);
 +      if (err)
 +              return err;
 +
 +      if (AUTONEG_ENABLE == phydev->autoneg) {
 +              status = phy_read(phydev, MII_LPA);
 +
 +              if (status & MII_PHY_STATUS_FULLDUPLEX)
 +                      phydev->duplex = DUPLEX_FULL;
 +              else
 +                      phydev->duplex = DUPLEX_HALF;
 +
 +              switch (status & MII_PHY_STATUS_SPD_MASK) {
 +              case MII_PHY_STATUS_1000:
 +                      phydev->speed = SPEED_1000;
 +                      break;
 +
 +              case MII_PHY_STATUS_100:
 +                      phydev->speed = SPEED_100;
 +                      break;
 +
 +              default:
 +                      phydev->speed = SPEED_10;
 +                      break;
 +              }
 +      } else {
 +              int bmcr = phy_read(phydev, MII_BMCR);
 +
 +              if (bmcr < 0)
 +                      return bmcr;
 +
 +              if (bmcr & BMCR_FULLDPLX)
 +                      phydev->duplex = DUPLEX_FULL;
 +              else
 +                      phydev->duplex = DUPLEX_HALF;
 +
 +              if (bmcr & BMCR_SPEED1000)
 +                      phydev->speed = SPEED_1000;
 +              else if (bmcr & BMCR_SPEED100)
 +                      phydev->speed = SPEED_100;
 +              else
 +                      phydev->speed = SPEED_10;
 +      }
 +
 +      /* For 1000BASE-X Phy Mode the speed/duplex will always be
 +       * 1000Mbps/fullduplex
 +       */
 +      if (phydev->dev_flags == XAE_PHY_TYPE_1000BASE_X) {
 +              phydev->duplex = DUPLEX_FULL;
 +              phydev->speed = SPEED_1000;
 +      }
 +
 +      return 0;
 +}
 +
 +static int xilinxphy_of_init(struct phy_device *phydev)
 +{
++      struct device *dev = &phydev->mdio.dev;
 +      struct device_node *of_node = dev->of_node;
 +      u32 phytype;
 +
 +      if (!IS_ENABLED(CONFIG_OF_MDIO))
 +              return 0;
 +
 +      if (!of_node)
 +              return -ENODEV;
 +
 +      if (!of_property_read_u32(of_node, "xlnx,phy-type", &phytype))
 +              if (phytype == XAE_PHY_TYPE_1000BASE_X)
 +                      phydev->dev_flags |= XAE_PHY_TYPE_1000BASE_X;
 +
 +      return 0;
 +}
 +
 +static int xilinxphy_config_init(struct phy_device *phydev)
 +{
 +      int temp;
 +
 +      xilinxphy_of_init(phydev);
 +      temp = phy_read(phydev, MII_BMCR);
 +      temp &= XPCSPMA_PHY_CTRL_ISOLATE_DISABLE;
 +      phy_write(phydev, MII_BMCR, temp);
 +
 +      return 0;
 +}
 +
 +static struct phy_driver xilinx_drivers[] = {
 +      {
 +              .phy_id = XILINX_PHY_ID,
 +              .phy_id_mask = XILINX_PHY_ID_MASK,
 +              .name = "Xilinx PCS/PMA PHY",
 +              .features = PHY_GBIT_FEATURES,
 +              .config_init = &xilinxphy_config_init,
 +              .config_aneg = &genphy_config_aneg,
 +              .read_status = &xilinxphy_read_status,
 +              .resume = &genphy_resume,
 +              .suspend = &genphy_suspend,
 +              .driver = { .owner = THIS_MODULE },
 +      },
 +};
 +
 +module_phy_driver(xilinx_drivers);
 +
 +static struct mdio_device_id __maybe_unused xilinx_tbl[] = {
 +      { XILINX_PHY_ID, XILINX_PHY_ID_MASK },
 +      { }
 +};
 +
 +MODULE_DEVICE_TABLE(mdio, xilinx_tbl);
 +MODULE_DESCRIPTION("Xilinx PCS/PMA PHY driver");
 +MODULE_LICENSE("GPL");
index 7c276aa4d67c8376d5821a71e5a07a0c352a6669,7a0780d56d2dc28f1f64e7c7a49a048b060e6b87..e961e80a68553edd34c6bed3528bc59de4a6f288
@@@ -17,15 -16,28 +16,27 @@@ config PCI_MVEB
        depends on ARM
        depends on OF
  
- config PCI_XILINX_NWL
 -
+ config PCIE_XILINX_NWL
        bool "NWL PCIe Core"
        depends on ARCH_ZYNQMP
+       select PCI_MSI_IRQ_DOMAIN if PCI_MSI
        help
-        Say 'Y' here if you want kernel to support for Xilinx
-        NWL PCIe controller.The controller can act as Root Port
-        or End Point.The current option selection will only
+        Say 'Y' here if you want kernel support for Xilinx
+        NWL PCIe controller. The controller can act as Root Port
+        or End Point. The current option selection will only
         support root port enabling.
  
+ config PCIE_DW_PLAT
+       bool "Platform bus based DesignWare PCIe Controller"
+       select PCIE_DW
+       ---help---
+        This selects the DesignWare PCIe controller support. Select this if
+        you have a PCIe controller on Platform bus.
+        If you have a controller with this interface, say Y or M here.
+        If unsure, say N.
  config PCIE_DW
        bool
  
Simple merge
Simple merge
index b09982c5a0254d71f6fa0b579f8712a1ed8b54ea,72e97d7a520912693e31f2334aba46c0ea8175fa..39e011465d7716108803d039de9bcce8d4573fb1
@@@ -77,34 -77,13 +77,43 @@@ config DA8XX_REMOTEPRO
          It's safe to say n here if you're not interested in multimedia
          offloading.
  
+ config ST_REMOTEPROC
+       tristate "ST remoteproc support"
+       depends on ARCH_STI
+       select REMOTEPROC
+       help
+         Say y here to support ST's adjunct processors via the remote
+         processor framework.
+         This can be either built-in or a loadable module.
 +config ZYNQ_REMOTEPROC
 +      tristate "Support ZYNQ remoteproc"
 +      depends on ARCH_ZYNQ && SMP && !DEBUG_SG
 +      select REMOTEPROC
 +      select RPMSG
 +      select HOTPLUG_CPU
 +      default m
 +      help
 +        Say y here to support Xilinx ZynQ remote processors (the second
 +        ARM CORTEX-A9 cpu) via the remote processor framework.
 +
 +config MB_REMOTEPROC
 +      tristate "Support Microblaze remoteproc"
 +      depends on ARCH_ZYNQ && !DEBUG_SG
 +      select REMOTEPROC
 +      select RPMSG
 +      default m
 +      help
 +        Say y here to support Xilinx Microblaze remote processors
 +        on the Xilinx Zynq.
 +
 +config ZYNQMP_R5_REMOTEPROC
 +      tristate "ZynqMP_r5 remoteproc support"
 +      depends on ARM64
 +      select REMOTEPROC
 +      select RPMSG
 +      help
 +        Say y here to support ZynqMP R5 remote processors via the remote
 +        processor framework.
 +
  endmenu
index 344499b72d265e380c08386ae6e25a40501a6ca3,279cb2edc880939d5745ffd65de77e21fc1d323c..cf01fdc5ce612fb2718c86960323022d372c9b87
@@@ -11,6 -11,4 +11,7 @@@ obj-$(CONFIG_OMAP_REMOTEPROC)         += omap_
  obj-$(CONFIG_STE_MODEM_RPROC)         += ste_modem_rproc.o
  obj-$(CONFIG_WKUP_M3_RPROC)           += wkup_m3_rproc.o
  obj-$(CONFIG_DA8XX_REMOTEPROC)                += da8xx_remoteproc.o
- obj-$(CONFIG_ZYNQMP_R5_REMOTEPROC)     += zynqmp_r5_remoteproc.o
+ obj-$(CONFIG_ST_REMOTEPROC)           += st_remoteproc.o
 +obj-$(CONFIG_ZYNQ_REMOTEPROC)         += zynq_remoteproc.o
 +obj-$(CONFIG_MB_REMOTEPROC)           += mb_remoteproc.o
++obj-$(CONFIG_ZYNQMP_R5_REMOTEPROC)    += zynqmp_r5_remoteproc.o
Simple merge
Simple merge
Simple merge
index c9b28e588df2cbc5e73f45eca3a9264447901067,5ade71306ee10d080414aaf2168fc93fbcd6fe4b..224f27ce2b0f369a1f0e20c916192cbc996dfa34
@@@ -10,8 -10,8 +10,9 @@@ obj-y                         += fsl
  obj-$(CONFIG_ARCH_MEDIATEK)   += mediatek/
  obj-$(CONFIG_ARCH_QCOM)               += qcom/
  obj-$(CONFIG_ARCH_ROCKCHIP)           += rockchip/
+ obj-$(CONFIG_SOC_SAMSUNG)     += samsung/
  obj-$(CONFIG_ARCH_SUNXI)      += sunxi/
  obj-$(CONFIG_ARCH_TEGRA)      += tegra/
 +obj-$(CONFIG_ARCH_ZYNQMP)     += xilinx/zynqmp/
  obj-$(CONFIG_SOC_TI)          += ti/
  obj-$(CONFIG_PLAT_VERSATILE)  += versatile/
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 26ce75b847d22bcfff9642a72ddc25ade64bd9dd,34277ced26bd27e6b66c3ffda544054383d6b0ef..5abf96ef9ff8daac3ef7fbdef09f159e52e445d6
@@@ -974,13 -948,8 +962,9 @@@ static int dwc3_probe(struct platform_d
  
                dwc->hsphy_interface = pdata->hsphy_interface;
                fladj = pdata->fladj_value;
 +              refclk_fladj = pdata->refclk_fladj;
        }
  
-       /* default to superspeed if no maximum_speed passed */
-       if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
-               dwc->maximum_speed = USB_SPEED_SUPER;
        dwc->lpm_nyet_threshold = lpm_nyet_threshold;
        dwc->tx_de_emphasis = tx_de_emphasis;
  
                goto err1;
        }
  
+       /* Check the maximum_speed parameter */
+       switch (dwc->maximum_speed) {
+       case USB_SPEED_LOW:
+       case USB_SPEED_FULL:
+       case USB_SPEED_HIGH:
+       case USB_SPEED_SUPER:
+       case USB_SPEED_SUPER_PLUS:
+               break;
+       default:
+               dev_err(dev, "invalid maximum_speed parameter %d\n",
+                       dwc->maximum_speed);
+               /* fall through */
+       case USB_SPEED_UNKNOWN:
+               /* default to superspeed */
+               dwc->maximum_speed = USB_SPEED_SUPER;
+               /*
+                * default to superspeed plus if we are capable.
+                */
+               if (dwc3_is_usb31(dwc) &&
+                   (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
+                    DWC3_GHWPARAMS3_SSPHY_IFC_GEN2))
+                       dwc->maximum_speed = USB_SPEED_SUPER_PLUS;
+               break;
+       }
        /* Adjust Frame Length */
 -      dwc3_frame_length_adjustment(dwc, fladj);
 +      dwc3_frame_length_adjustment(dwc, fladj, refclk_fladj);
  
        usb_phy_set_suspend(dwc->usb2_phy, 0);
        usb_phy_set_suspend(dwc->usb3_phy, 0);
Simple merge
Simple merge
index b6bfa43d44056510c83896b9cf7fa10e08fa8b43,ca6bfddaacad2beeb1897a0e397bd5300ccff30d..b0b9bc371f9b15676e9f04b3143a3b672477e88b
@@@ -219,13 -320,15 +333,10 @@@ static inline int virtqueue_add(struct 
                return -ENOSPC;
        }
  
-       /* We're about to use some buffers from the free list. */
-       vq->vq.num_free -= descs_used;
        for (n = 0; n < out_sgs; n++) {
                for (sg = sgs[n]; sg; sg = sg_next(sg)) {
 -                      dma_addr_t addr = vring_map_one_sg(vq, sg, DMA_TO_DEVICE);
 -                      if (vring_mapping_error(vq, addr))
 -                              goto unmap_release;
 -
 -                      desc[i].flags = cpu_to_virtio16(_vq->vdev, VRING_DESC_F_NEXT);
 -                      desc[i].addr = cpu_to_virtio64(_vq->vdev, addr);
 -                      desc[i].len = cpu_to_virtio32(_vq->vdev, sg->length);
 +                      vring_desc_set(_vq->vdev, desc + i, sg,
 +                                     VRING_DESC_F_NEXT, dma);
                        prev = i;
                        i = virtio16_to_cpu(_vq->vdev, desc[i].next);
                }
Simple merge
Simple merge
index 92f04025c64f0f32163805ea18518e397f33fae8,3c36113a88e1d8e57f4a27032bb17130b3df3f7a..a84e217b970d8ca9eb025d23354fbecd657a3dcd
  #define SR_BP0                        BIT(2)  /* Block protect 0 */
  #define SR_BP1                        BIT(3)  /* Block protect 1 */
  #define SR_BP2                        BIT(4)  /* Block protect 2 */
+ #define SR_TB                 BIT(5)  /* Top/Bottom protect */
 +/* SR_BP3 only used on some Micron chip; must NOT be in SR_BP_BIT_MASK */
 +#define SR_BP3                        BIT(6)  /* Block protect 3 */
 +#define       SR_BP_BIT_OFFSET        2       /* Offset to Block protect 0 */
 +#define       SR_BP_BIT_MASK          (SR_BP2 | SR_BP1 | SR_BP0)
  #define SR_SRWD                       BIT(7)  /* SR write protect */
 +/* Bit to determine whether protection starts from top or bottom */
 +#define SR_BP_TB              BIT(5)
 +
 +/* Highest resolution of sector locking */
 +#define M25P_MAX_LOCKABLE_SECTORS     64
  
  #define SR_QUAD_EN_MX         BIT(6)  /* Macronix Quad I/O */
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge